From zlang@redhat.com Fri Apr 1 01:15:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9216D7CAF for ; Fri, 1 Apr 2016 01:15:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6437C304032 for ; Thu, 31 Mar 2016 23:15:26 -0700 (PDT) X-ASG-Debug-ID: 1459491324-04cbb07ad818f050001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id vblpgy80xZkLPWaA (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 31 Mar 2016 23:15:25 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A3386B539B for ; Fri, 1 Apr 2016 06:15:24 +0000 (UTC) Received: from localhost (vpn1-7-165.pek2.redhat.com [10.72.7.165]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u316FNdP002769; Fri, 1 Apr 2016 02:15:23 -0400 From: Zorro Lang To: xfs@oss.sgi.com Cc: eguan@redhat.com, Zorro Lang Subject: [PATCH] xfs_quota: add missed options -D and -P into man page Date: Fri, 1 Apr 2016 14:15:20 +0800 X-ASG-Orig-Subj: [PATCH] xfs_quota: add missed options -D and -P into man page Message-Id: <1459491320-9340-1-git-send-email-zlang@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: 1459491325 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 There're two options in xfsprogs/quota/init.c:init() function, the -D option is used to set a file to instead of /etc/projects, and the -P option is used to set a file to instead of /etc/projid. I don't know these two options when I write xfstests case xfs/133, because there's no any information about them in xfs_quota and other related man pages. I learn about these two options by read others test cases. So I add these options into xfs_quota man page. Reported-by: Eryu Guan Signed-off-by: Zorro Lang --- Hi, I found this problem when I wrote xfstests/xfs/133. Thanks for Eryu just reminded me again about this problem. I don't know why the man page no information about them, if that's a miss, hope to fix them. Thanks, Zorro man/man8/xfs_quota.8 | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/man/man8/xfs_quota.8 b/man/man8/xfs_quota.8 index 951252b..b829f67 100644 --- a/man/man8/xfs_quota.8 +++ b/man/man8/xfs_quota.8 @@ -15,6 +15,12 @@ xfs_quota \- manage use of quota on XFS filesystems .B \-d .I project ] ... [ +.B \-D +.I projects_file +] [ +.B \-P +.I projid_file +] [ .IR path " ... ]" .br .B xfs_quota \-V @@ -53,6 +59,18 @@ commands to the set of projects specified. Multiple .B \-d arguments may be given. .TP +.BI \-D " projects_file" +Point a file contain the mapping of numeric project identifiers to +directories trees. +.I /etc/projects +as default, if this option is none. +.TP +.BI \-P " projid_file" +Point a file contain the mapping of numeric project identifiers to +project names. +.I /etc/projid +as default, if this option is none. +.TP .B \-V Prints the version number and exits. .PP -- 2.5.0 From mlin@kernel.org Fri Apr 1 01:48:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CD4637CB0 for ; Fri, 1 Apr 2016 01:48:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7F198304032 for ; Thu, 31 Mar 2016 23:48:40 -0700 (PDT) X-ASG-Debug-ID: 1459493318-04bdf0110314c7e0001-NocioJ Received: from mail.kernel.org ([198.145.29.136]) by cuda.sgi.com with ESMTP id wI18ZGPbBA3EFUld (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 31 Mar 2016 23:48:38 -0700 (PDT) X-Barracuda-Envelope-From: mlin@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 921E820398 for ; Fri, 1 Apr 2016 06:48:37 +0000 (UTC) Received: from mail-ob0-f177.google.com (mail-ob0-f177.google.com [209.85.214.177]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 9BBCE2037C for ; Fri, 1 Apr 2016 06:48:36 +0000 (UTC) Received: by mail-ob0-f177.google.com with SMTP id fp4so40405669obb.2 for ; Thu, 31 Mar 2016 23:48:36 -0700 (PDT) X-Gm-Message-State: AD7BkJKsAOMEewn0/qkrIey2l2x1bOY2ElVoRmGBRY9OiI4xigoIODA4Wz95EgO8QVgtfW5uTiDBdrxHLMXMYA== MIME-Version: 1.0 X-Received: by 10.60.84.98 with SMTP id x2mr1878258oey.23.1459493315966; Thu, 31 Mar 2016 23:48:35 -0700 (PDT) Received: by 10.76.176.39 with HTTP; Thu, 31 Mar 2016 23:48:35 -0700 (PDT) Date: Thu, 31 Mar 2016 23:48:35 -0700 X-Gmail-Original-Message-ID: Message-ID: Subject: generic/027 possible deadlock From: Ming Lin X-ASG-Orig-Subj: generic/027 possible deadlock To: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Virus-Scanned: ClamAV using ClamSMTP X-Barracuda-Connect: UNKNOWN[198.145.29.136] X-Barracuda-Start-Time: 1459493318 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.20 X-Barracuda-Spam-Status: No, SCORE=1.20 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, MARKETING_SUBJECT, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28357 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 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Is it known? [ 427.145528] run fstests generic/027 at 2016-03-31 22:48:31 [ 427.583892] XFS (nvme0n1p2): Mounting V5 Filesystem [ 427.600853] XFS (nvme0n1p2): Ending clean mount [ 428.544208] [ 428.546684] ====================================================== [ 428.553922] [ INFO: possible circular locking dependency detected ] [ 428.561162] 4.5.0+ #175 Tainted: G E [ 428.566909] ------------------------------------------------------- [ 428.574207] xfs_io/4733 is trying to acquire lock: [ 428.580045] (&s->s_sync_lock){+.+.+.}, at: [] sync_inodes_sb+0xc2/0x1d0 [ 428.589375] [ 428.589375] but task is already holding lock: [ 428.597206] (sb_internal#2){.+.+.+}, at: [] __sb_start_write+0x76/0xe0 [ 428.606601] [ 428.606601] which lock already depends on the new lock. [ 428.606601] [ 428.617908] [ 428.617908] the existing dependency chain (in reverse order) is: [ 428.627562] [ 428.627562] -> #1 (sb_internal#2){.+.+.+}: [ 428.633501] [] lock_acquire+0x90/0xf0 [ 428.640128] [] percpu_down_read+0x45/0x90 [ 428.647111] [] __sb_start_write+0xcc/0xe0 [ 428.654103] [] xfs_trans_alloc+0x1f/0x40 [xfs] [ 428.661541] [] xfs_inactive_truncate+0x1e/0xf0 [xfs] [ 428.669504] [] xfs_inactive+0xee/0x110 [xfs] [ 428.676764] [] xfs_fs_evict_inode+0x94/0xa0 [xfs] [ 428.684463] [] evict+0xb3/0x190 [ 428.690586] [] iput+0x133/0x1a0 [ 428.696708] [] sync_inodes_sb+0x14a/0x1d0 [ 428.703701] [] sync_inodes_one_sb+0x10/0x20 [ 428.710894] [] iterate_supers+0xa9/0x100 [ 428.717803] [] sys_sync+0x30/0x90 [ 428.724091] [] entry_SYSCALL_64_fastpath+0x16/0x7a [ 428.731867] [ 428.731867] -> #0 (&s->s_sync_lock){+.+.+.}: [ 428.737895] [] __lock_acquire+0x15be/0x1c60 [ 428.745072] [] lock_acquire+0x90/0xf0 [ 428.751717] [] mutex_lock_nested+0x5f/0x400 [ 428.758918] [] sync_inodes_sb+0xc2/0x1d0 [ 428.765834] [] xfs_flush_inodes+0x23/0x30 [xfs] [ 428.773374] [] xfs_create+0x530/0x5c0 [xfs] [ 428.780556] [] xfs_generic_create+0xbe/0x290 [xfs] [ 428.788358] [] xfs_vn_mknod+0xf/0x20 [xfs] [ 428.795455] [] xfs_vn_create+0xe/0x10 [xfs] [ 428.802658] [] vfs_create+0xbd/0x120 [ 428.809224] [] path_openat+0x1070/0x1490 [ 428.816137] [] do_filp_open+0x79/0xd0 [ 428.822795] [] do_sys_open+0x110/0x1f0 [ 428.829539] [] SyS_open+0x19/0x20 [ 428.835840] [] entry_SYSCALL_64_fastpath+0x16/0x7a [ 428.843646] [ 428.843646] other info that might help us debug this: [ 428.843646] [ 428.854018] Possible unsafe locking scenario: [ 428.854018] [ 428.861503] CPU0 CPU1 [ 428.866845] ---- ---- [ 428.872162] lock(sb_internal#2); [ 428.876384] lock(&s->s_sync_lock); [ 428.883307] lock(sb_internal#2); [ 428.890064] lock(&s->s_sync_lock); [ 428.894470] [ 428.894470] *** DEADLOCK *** [ 428.894470] [ 428.902637] 4 locks held by xfs_io/4733: [ 428.907317] #0: (sb_writers#14){.+.+.+}, at: [] __sb_start_write+0xcc/0xe0 [ 428.916833] #1: (&type->i_mutex_dir_key#6){+.+.+.}, at: [] path_openat+0x4ab/0x1490 [ 428.927146] #2: (sb_internal#2){.+.+.+}, at: [] __sb_start_write+0x76/0xe0 [ 428.936680] #3: (&type->s_umount_key#37){++++++}, at: [] xfs_flush_inodes+0x17/0x30 [xfs] [ 428.947539] [ 428.947539] stack backtrace: [ 428.953478] CPU: 4 PID: 4733 Comm: xfs_io Tainted: G E 4.5.0+ #175 [ 428.961642] Hardware name: Dell Inc. OptiPlex 7010/0773VG, BIOS A12 01/10/2013 [ 428.969724] 0000000000000000 ffff8800bd773908 ffffffff813816fc ffffffff825d75b0 [ 428.978044] ffffffff825d75b0 ffff8800bd773948 ffffffff81141149 ffff8800bd773990 [ 428.986352] ffff8800bd9a4980 ffff8800bd9a5188 ffff8800bd9a5160 0000000000000003 [ 428.994655] Call Trace: [ 428.997893] [] dump_stack+0x85/0xc9 [ 429.003838] [] print_circular_bug+0x1f9/0x207 [ 429.010647] [] __lock_acquire+0x15be/0x1c60 [ 429.017288] [] ? finish_wait+0x5c/0x70 [ 429.023510] [] lock_acquire+0x90/0xf0 [ 429.029631] [] ? sync_inodes_sb+0xc2/0x1d0 [ 429.036214] [] mutex_lock_nested+0x5f/0x400 [ 429.042850] [] ? sync_inodes_sb+0xc2/0x1d0 [ 429.049406] [] ? wb_wait_for_completion+0x75/0x80 [ 429.056589] [] sync_inodes_sb+0xc2/0x1d0 [ 429.062970] [] xfs_flush_inodes+0x23/0x30 [xfs] [ 429.069967] [] xfs_create+0x530/0x5c0 [xfs] [ 429.076612] [] ? __d_instantiate+0x87/0xf0 [ 429.083160] [] ? posix_acl_create+0xfe/0x150 [ 429.089892] [] xfs_generic_create+0xbe/0x290 [xfs] [ 429.097146] [] ? common_perm+0x1b/0x70 [ 429.103369] [] xfs_vn_mknod+0xf/0x20 [xfs] [ 429.109927] [] xfs_vn_create+0xe/0x10 [xfs] [ 429.116569] [] vfs_create+0xbd/0x120 [ 429.122603] [] path_openat+0x1070/0x1490 [ 429.128984] [] do_filp_open+0x79/0xd0 [ 429.135109] [] ? _raw_spin_unlock+0x22/0x40 [ 429.141756] [] ? __alloc_fd+0xf8/0x200 [ 429.147971] [] do_sys_open+0x110/0x1f0 [ 429.154170] [] SyS_open+0x19/0x20 [ 429.159930] [] entry_SYSCALL_64_fastpath+0x16/0x7a [ 440.468568] XFS (nvme0n1p2): Unmounting Filesystem From eguan@redhat.com Fri Apr 1 02:01:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6D6267CB2 for ; Fri, 1 Apr 2016 02:01:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 22D83304032 for ; Fri, 1 Apr 2016 00:01:19 -0700 (PDT) X-ASG-Debug-ID: 1459494077-04bdf0110314cd90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 3sNtpDjKzcWiBgn7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 01 Apr 2016 00:01:17 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 648AEE8AED; Fri, 1 Apr 2016 07:01:17 +0000 (UTC) Received: from localhost (dhcp-12-159.nay.redhat.com [10.66.12.159]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3171G4W009664; Fri, 1 Apr 2016 03:01:16 -0400 From: Eryu Guan To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, Eryu Guan Subject: [PATCH] xfs/133 134 262: limit xfs_quota report to report on specific project quota id Date: Fri, 1 Apr 2016 15:00:50 +0800 X-ASG-Orig-Subj: [PATCH] xfs/133 134 262: limit xfs_quota report to report on specific project quota id Message-Id: <1459494050-28330-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Fri, 01 Apr 2016 07:01:17 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1459494077 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 With GETNEXTQUOTA support, xfs_quota -c "report" now outputs more quota info than before, and this breaks xfs/133 xfs/134 and xfs/262, e.g. xfs/133 fails as Filesystem Blocks Quota Limit Warn/Time Mounted on SCRATCH_DEV 0 102400 204800 00 [--------] SCRATCH_MNT === report command output === +(null) 0 0 0 00 [--------] 123456-project 0 102400 204800 00 [--------] Fix it by limiting xfs_quota to report on specific project quota number using -L & -U option, so only the project quota being tested is reported. Signed-off-by: Eryu Guan --- I'm not sure if kernel should be fixed, but limiting the quota report on project number being tested seems something worth doing to me anyway. It avoids breakage of future changes of quota report output. tests/xfs/133 | 8 +++++--- tests/xfs/133.out | 2 +- tests/xfs/134 | 22 +++++++++++++++------- tests/xfs/262 | 6 ++++-- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/tests/xfs/133 b/tests/xfs/133 index 82c38b1..7a0e55e 100755 --- a/tests/xfs/133 +++ b/tests/xfs/133 @@ -57,16 +57,17 @@ do_project_test() { local qa_project=123456-project local dir=$SCRATCH_MNT/project + local proj_num=10 mkdir $dir 2>/dev/null #project quota files cat >$tmp.projects <$tmp.projid <$tmp.projects <$tmp.projid <> "$seqres.full" 1>&2 # See what gets reported -_quota_cmd "report" | _filter_quota_rpt 2>> "$seqres.full" +_quota_cmd "report -U $proj_num -L $proj_num" | _filter_quota_rpt \ + 2>> $seqres.full _quota_cmd "df" | _filter_quota_rpt 2>> "$seqres.full" # This time using "human readable" output -_quota_cmd "report -h" | _filter_quota_rpt 2>> "$seqres.full" +_quota_cmd "report -h $proj_num -L $proj_num" | _filter_quota_rpt \ + 2>> "$seqres.full" _quota_cmd "df -h" | _filter_quota_rpt 2>> "$seqres.full" # Clean up -- 2.5.5 From zlang@redhat.com Fri Apr 1 02:28:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E63717CB4 for ; Fri, 1 Apr 2016 02:28:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B671D304039 for ; Fri, 1 Apr 2016 00:28:59 -0700 (PDT) X-ASG-Debug-ID: 1459495737-04cbb07ad61909b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id B5DlU2KvfWVfuWLI (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 01 Apr 2016 00:28:58 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C92D3219F; Fri, 1 Apr 2016 07:28:57 +0000 (UTC) Received: from localhost (vpn1-7-165.pek2.redhat.com [10.72.7.165]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u317Suso026734; Fri, 1 Apr 2016 03:28:57 -0400 Date: Fri, 1 Apr 2016 15:28:56 +0800 From: Zorro Lang To: Eryu Guan Cc: fstests@vger.kernel.org, xfs@oss.sgi.com, sandeen@redhat.com Subject: Re: [PATCH] xfs/133 134 262: limit xfs_quota report to report on specific project quota id Message-ID: <20160401072856.GA3329@dhcp12-237.nay.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs/133 134 262: limit xfs_quota report to report on specific project quota id References: <1459494050-28330-1-git-send-email-eguan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459494050-28330-1-git-send-email-eguan@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1459495738 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Apr 01, 2016 at 03:00:50PM +0800, Eryu Guan wrote: > With GETNEXTQUOTA support, xfs_quota -c "report" now outputs more quota > info than before, and this breaks xfs/133 xfs/134 and xfs/262, e.g. > xfs/133 fails as > > Filesystem Blocks Quota Limit Warn/Time Mounted on > SCRATCH_DEV 0 102400 204800 00 [--------] SCRATCH_MNT > === report command output === > +(null) 0 0 0 00 [--------] > 123456-project 0 102400 204800 00 [--------] > > Fix it by limiting xfs_quota to report on specific project quota number > using -L & -U option, so only the project quota being tested is > reported. > > Signed-off-by: Eryu Guan > --- > > I'm not sure if kernel should be fixed, but limiting the quota report on > project number being tested seems something worth doing to me anyway. It avoids > breakage of future changes of quota report output. Hi, FYI: About "+(null) 0 0 0 00 [--------]"problem, it has been talked in: http://thread.gmane.org/gmane.comp.file-systems.fstests/1852/focus=1968 I think: 1) If we consider that this's a bug, the original test cases can be the reproducer of this bug, so we shouldn't change the cases. 2) If we think print "(null) 0 0 0 00 [--------]" is right(or not wrong), then this patch is good. Thanks, Zorro > > tests/xfs/133 | 8 +++++--- > tests/xfs/133.out | 2 +- > tests/xfs/134 | 22 +++++++++++++++------- > tests/xfs/262 | 6 ++++-- > 4 files changed, 25 insertions(+), 13 deletions(-) > > diff --git a/tests/xfs/133 b/tests/xfs/133 > index 82c38b1..7a0e55e 100755 > --- a/tests/xfs/133 > +++ b/tests/xfs/133 > @@ -57,16 +57,17 @@ do_project_test() > { > local qa_project=123456-project > local dir=$SCRATCH_MNT/project > + local proj_num=10 > > mkdir $dir 2>/dev/null > > #project quota files > cat >$tmp.projects < -10:$dir > +$proj_num:$dir > EOF > > cat >$tmp.projid < -$qa_project:10 > +$qa_project:$proj_num > EOF > > $XFS_QUOTA_PROG -D $tmp.projects -P $tmp.projid -x \ > @@ -81,7 +82,8 @@ EOF > > echo "=== report command output ===" > $XFS_QUOTA_PROG -D $tmp.projects -P $tmp.projid -x \ > - -c "report -p -N -b" $SCRATCH_MNT | _filter_quota > + -c "report -p -N -b -L $proj_num -U $proj_num" \ > + $SCRATCH_MNT | _filter_quota > } > > # Test project > diff --git a/tests/xfs/133.out b/tests/xfs/133.out > index 21cfd0d..8c747bf 100644 > --- a/tests/xfs/133.out > +++ b/tests/xfs/133.out > @@ -4,5 +4,5 @@ Disk quotas for Project 123456-project (10) > Filesystem Blocks Quota Limit Warn/Time Mounted on > SCRATCH_DEV 0 102400 204800 00 [--------] SCRATCH_MNT > === report command output === > -123456-project 0 102400 204800 00 [--------] > +#10 0 102400 204800 00 [--------] > > diff --git a/tests/xfs/134 b/tests/xfs/134 > index be18ee8..5ba275c 100755 > --- a/tests/xfs/134 > +++ b/tests/xfs/134 > @@ -54,12 +54,13 @@ _require_xfs_quota > dir=$SCRATCH_MNT/project > > #project quota files > +proj_num=1 > cat >$tmp.projects < -1:$dir > +$proj_num:$dir > EOF > > cat >$tmp.projid < -test:1 > +test:$proj_num > EOF > > cp /dev/null $seqres.full > @@ -87,17 +88,24 @@ fi > src/feature -p $SCRATCH_DEV > [ $? -ne 0 ] && _notrun "Installed kernel does not support project quotas" > > +report_quota() > +{ > + $XFS_QUOTA_PROG -D $tmp.projects -P $tmp.projid -x \ > + -c "repquota -inN -p -L $proj_num -U $proj_num" $SCRATCH_DEV | \ > + tr -s '[:space:]' > +} > + > mkdir $dir > $XFS_IO_PROG -r -c "chproj -R 1" -c "chattr -R +P" $dir > > -xfs_quota -D $tmp.projects -P $tmp.projid -x \ > +$XFS_QUOTA_PROG -D $tmp.projects -P $tmp.projid -x \ > -c "limit -p bsoft=100m bhard=100m 1" $SCRATCH_DEV > -xfs_quota -D $tmp.projects -P $tmp.projid -x -c "repquota -inN -p" $SCRATCH_DEV | tr -s '[:space:]' > +report_quota > touch $dir/1 > touch $dir/2 > cp $dir/2 $dir/3 > > -xfs_quota -D $tmp.projects -P $tmp.projid -x -c "repquota -inN -p" $SCRATCH_DEV | tr -s '[:space:]' > +report_quota > > if [ "$HOSTOS" == "IRIX" ] ; then > mkfile 1M $TEST_DIR/6 > @@ -107,12 +115,12 @@ fi > > #try cp to dir > cp $TEST_DIR/6 $dir/6 > -xfs_quota -D $tmp.projects -P $tmp.projid -x -c "repquota -inN -p" $SCRATCH_DEV | tr -s '[:space:]' > +report_quota > > #try mv to dir > mv $TEST_DIR/6 $dir/7 > > -xfs_quota -D $tmp.projects -P $tmp.projid -x -c "repquota -inN -p" $SCRATCH_DEV | tr -s '[:space:]' > +report_quota > > # success, all done > status=0 > diff --git a/tests/xfs/262 b/tests/xfs/262 > index 9d8b838..d3a352c 100755 > --- a/tests/xfs/262 > +++ b/tests/xfs/262 > @@ -138,11 +138,13 @@ _quota_cmd "limit -p bhard=${qlimit_meg}m bsoft=${qlimit_meg}m ${proj_name}" \ > 2>> "$seqres.full" 1>&2 > > # See what gets reported > -_quota_cmd "report" | _filter_quota_rpt 2>> "$seqres.full" > +_quota_cmd "report -U $proj_num -L $proj_num" | _filter_quota_rpt \ > + 2>> $seqres.full > _quota_cmd "df" | _filter_quota_rpt 2>> "$seqres.full" > > # This time using "human readable" output > -_quota_cmd "report -h" | _filter_quota_rpt 2>> "$seqres.full" > +_quota_cmd "report -h $proj_num -L $proj_num" | _filter_quota_rpt \ > + 2>> "$seqres.full" > _quota_cmd "df -h" | _filter_quota_rpt 2>> "$seqres.full" > > # Clean up From cmaiolino@redhat.com Fri Apr 1 07:31:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 394517CBE for ; Fri, 1 Apr 2016 07:31:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A6383AC003 for ; Fri, 1 Apr 2016 05:31:10 -0700 (PDT) X-ASG-Debug-ID: 1459513868-04cb6c2462197a50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 0DLSRuusKDIDiFXO (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 01 Apr 2016 05:31:09 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7B6967FD44 for ; Fri, 1 Apr 2016 12:31:08 +0000 (UTC) Received: from redhat.com (gfs-i24c-02.mpc.lab.eng.bos.redhat.com [10.16.144.214]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u31CV63U016816 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 1 Apr 2016 08:31:08 -0400 Date: Fri, 1 Apr 2016 08:31:06 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Message-ID: <20160401123106.GB44113@redhat.com> X-ASG-Orig-Subj: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Mail-Followup-To: xfs@oss.sgi.com References: <20160322121922.GA53693@bfoster.bfoster> <6457b1d9de271ec6cca6bc2626aac161@mail.gmail.com> <20160322140345.GA54245@bfoster.bfoster> <0f3832c45509f444f55fda2aaf9c9deb@mail.gmail.com> <20160323123010.GA43073@bfoster.bfoster> <20160323153221.GA19456@redhat.com> <20160323223747.GX30721@dastard> <20160324165244.GA17555@redhat.com> <20160324215603.GD11812@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20160324215603.GD11812@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1459513869 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Mar 25, 2016 at 08:56:03AM +1100, Dave Chinner wrote: > On Thu, Mar 24, 2016 at 05:52:44PM +0100, Carlos Maiolino wrote: > > I can now reproduce it, or at least part of the problem. > > > > Regarding your question Dave, yes, it can be unmounted after I issue xfs_io shutdown > > command. But, if a umount is issued before that, then we can't find the > > mountpoint anymore. > > > > I'm not sure if I'm correct, but, what it looks like to me, as you already > > mentioned, is that we keep getting IO errors but we never actually shutdown > > the filesystem while doing async metadata writes. > > *nod* > > > I believe I've found the problem. So, I will try to explain it, so you guys > > can review and let me know if I'm right or not > > > > I was looking the code, and for me, looks like async retries are designed to > > keep retrying forever, and rely on some other part of the filesystem to actually > > shutdown it. > > *nod* > > [snip description of metadata IO error behaviour] > > Yes, that is exactly how the code is expected to behave - in fact, > that's how it was originally designed to behave. > > > Looks like, somebody already noticed it: > > > > /* > > ¦* If the write was asynchronous then no one will be looking for the > > ¦* error. Clear the error state and write the buffer out again. > > ¦* > > ¦* XXX: This helps against transient write errors, but we need to find > > ¦* a way to shut the filesystem down if the writes keep failing. > > ¦* > > ¦* In practice we'll shut the filesystem down soon as non-transient > > ¦* errors tend to affect the whole device and a failing log write > > ¦* will make us give up. But we really ought to do better here. > > ¦*/ > > > > > > So, if I'm write in how we hit this problem, and IIRC, Dave's patchset for > > setting limits to IO errors can be slightly modified to fix this issue too, but, > > The patchset I have doesn't need modification to fix this issue - it > has a patch specifically to address this, and it changes the default > behaviour to "fail async writes at unmount": > > http://oss.sgi.com/archives/xfs/2015-08/msg00092.html > > > the problem is that the user must set it BEFORE he tries to unmount the > > filesystem, otherwise it will get stuck here. > > Yes, but that doesn't answer the big question: why don't the > periodic log forces that are failing with EIO cause a filesystem > shutdown? We issue a log force every 30s even during unmount, and a > failed log IO must cause the filesystem to shut down. So why aren't > these causing the filesystem to shutdown as we'd expect when the > device has been pulled? > Right, good point, I'll take a look on it > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From billodo@redhat.com Fri Apr 1 09:30:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8F9F87CC5 for ; Fri, 1 Apr 2016 09:30:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 55F61304032 for ; Fri, 1 Apr 2016 07:30:35 -0700 (PDT) X-ASG-Debug-ID: 1459521033-04cb6c246219b790001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wScXvuSKpeDCzWeG (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 01 Apr 2016 07:30:34 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 434718F518 for ; Fri, 1 Apr 2016 14:30:33 +0000 (UTC) Received: from redhat.com (unused [10.10.52.91] (may be forged)) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u31EUUDb005151 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Fri, 1 Apr 2016 10:30:32 -0400 Date: Fri, 1 Apr 2016 09:30:30 -0500 From: "Bill O'Donnell" To: Zorro Lang Cc: xfs@oss.sgi.com, eguan@redhat.com Subject: Re: [PATCH] xfs_quota: add missed options -D and -P into man page Message-ID: <20160401143030.GA12492@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs_quota: add missed options -D and -P into man page References: <1459491320-9340-1-git-send-email-zlang@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459491320-9340-1-git-send-email-zlang@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1459521033 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Apr 01, 2016 at 02:15:20PM +0800, Zorro Lang wrote: > There're two options in xfsprogs/quota/init.c:init() function, the -D > option is used to set a file to instead of /etc/projects, and the -P > option is used to set a file to instead of /etc/projid. I don't know > these two options when I write xfstests case xfs/133, because > there's no any information about them in xfs_quota and other related > man pages. I learn about these two options by read others test cases. > > So I add these options into xfs_quota man page. > > Reported-by: Eryu Guan > Signed-off-by: Zorro Lang > --- > > Hi, > > I found this problem when I wrote xfstests/xfs/133. Thanks for Eryu > just reminded me again about this problem. I don't know why the > man page no information about them, if that's a miss, hope to fix > them. > > Thanks, > Zorro > > man/man8/xfs_quota.8 | 18 ++++++++++++++++++ > 1 file changed, 18 insertions(+) > > diff --git a/man/man8/xfs_quota.8 b/man/man8/xfs_quota.8 > index 951252b..b829f67 100644 > --- a/man/man8/xfs_quota.8 > +++ b/man/man8/xfs_quota.8 > @@ -15,6 +15,12 @@ xfs_quota \- manage use of quota on XFS filesystems > .B \-d > .I project > ] ... [ > +.B \-D > +.I projects_file > +] [ > +.B \-P > +.I projid_file > +] [ > .IR path " ... ]" > .br > .B xfs_quota \-V > @@ -53,6 +59,18 @@ commands to the set of projects specified. Multiple > .B \-d > arguments may be given. > .TP > +.BI \-D " projects_file" > +Point a file contain the mapping of numeric project identifiers to s/Point/Specify/ s/contain/containing/ > +directories trees. s/directories/directory/ > +.I /etc/projects > +as default, if this option is none. > +.TP > +.BI \-P " projid_file" > +Point a file contain the mapping of numeric project identifiers to s/Point/Specify/ s/contain/containing/ > +project names. > +.I /etc/projid > +as default, if this option is none. > +.TP > .B \-V > Prints the version number and exits. > .PP > -- > 2.5.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Fri Apr 1 12:24:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 002007CC9 for ; Fri, 1 Apr 2016 12:24:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id BA06B304039 for ; Fri, 1 Apr 2016 10:24:44 -0700 (PDT) X-ASG-Debug-ID: 1459531481-04cb6c24621a4440001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id b4DQaYz7WDQBAAel for ; Fri, 01 Apr 2016 10:24:41 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id F23DE142D; Fri, 1 Apr 2016 12:24:40 -0500 (CDT) Subject: Re: [PATCH] xfs/133 134 262: limit xfs_quota report to report on specific project quota id To: Zorro Lang , Eryu Guan X-ASG-Orig-Subj: Re: [PATCH] xfs/133 134 262: limit xfs_quota report to report on specific project quota id References: <1459494050-28330-1-git-send-email-eguan@redhat.com> <20160401072856.GA3329@dhcp12-237.nay.redhat.com> Cc: fstests@vger.kernel.org, xfs@oss.sgi.com, sandeen@redhat.com From: Eric Sandeen Message-ID: <56FEAED8.2050108@sandeen.net> Date: Fri, 1 Apr 2016 12:24:40 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.1 MIME-Version: 1.0 In-Reply-To: <20160401072856.GA3329@dhcp12-237.nay.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: 1459531481 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28369 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 4/1/16 2:28 AM, Zorro Lang wrote: > On Fri, Apr 01, 2016 at 03:00:50PM +0800, Eryu Guan wrote: >> With GETNEXTQUOTA support, xfs_quota -c "report" now outputs more quota >> info than before, and this breaks xfs/133 xfs/134 and xfs/262, e.g. >> xfs/133 fails as >> >> Filesystem Blocks Quota Limit Warn/Time Mounted on >> SCRATCH_DEV 0 102400 204800 00 [--------] SCRATCH_MNT >> === report command output === >> +(null) 0 0 0 00 [--------] >> 123456-project 0 102400 204800 00 [--------] >> >> Fix it by limiting xfs_quota to report on specific project quota number >> using -L & -U option, so only the project quota being tested is >> reported. >> >> Signed-off-by: Eryu Guan >> --- >> >> I'm not sure if kernel should be fixed, but limiting the quota report on >> project number being tested seems something worth doing to me anyway. It avoids >> breakage of future changes of quota report output. > > Hi, > > FYI: > About "+(null) 0 0 0 00 [--------]"problem, it has been talked in: > http://thread.gmane.org/gmane.comp.file-systems.fstests/1852/focus=1968 > > I think: > 1) If we consider that this's a bug, the original test cases can > be the reproducer of this bug, so we shouldn't change the cases. > > 2) If we think print "(null) 0 0 0 00 [--------]" is right(or not > wrong), then this patch is good. yes, I'm sorry I didn't take care of this sooner. I don't think there's value in printing the "(null)" line; I think maybe my suggestion from that old thread might be best: > We could explicitly look up id 0 and not show it if it's not in the > projects file. Or now that I think about it - projid 0 is the default project quota, right? Assuming that's correct, perhaps we should conditionally print the line, changing "(null)" to "default", printing it only if a default quota is set (i.e. not all zeros). -Eric From avi@cloudius-systems.com Fri Apr 1 13:34:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D8ED87CC5 for ; Fri, 1 Apr 2016 13:34:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4D2F7AC002 for ; Fri, 1 Apr 2016 11:34:34 -0700 (PDT) X-ASG-Debug-ID: 1459535672-04cbb07ad51a8400001-NocioJ Received: from mail-wm0-f45.google.com (mail-wm0-f45.google.com [74.125.82.45]) by cuda.sgi.com with ESMTP id LjaZOBEFtk3f9mV1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 01 Apr 2016 11:34:33 -0700 (PDT) X-Barracuda-Envelope-From: avi@cloudius-systems.com X-Barracuda-Apparent-Source-IP: 74.125.82.45 Received: by mail-wm0-f45.google.com with SMTP id 127so1248557wmu.1 for ; Fri, 01 Apr 2016 11:34:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=scylladb-com.20150623.gappssmtp.com; s=20150623; h=subject:to:references:cc:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=E+/XxJ9waQ08Cniby0FQijKWjr7FcErRX8r+Egb8LSw=; b=etiBce7LdgRfs7EZx9+LtvOPNd79TiZ+77g0scyIud3ulSsfnyUmVeLrdm7xvi0+DK Cz7GbRj1WxhEseNqQtnp6gxV+SSII6Hw92qEq/JFgT2YzRvIRUulDTYvWwvrldxkL5uZ XA2aazd1HeZcyzovfg8NHUrs3nxp/bfCe2PH68ZxzFYzJxh8q6wOT+gC3IVLpu/WwebK Xd95kSoII1VoIPy1tzOBZVp+Gkw3yMvH+mYLXAy5jPPBqF2Jytgi44YbLg0i4aK3sXCw VZQ6yDYclHWb8er0+0YzjmoOP8rMfFuBlMoOj6BfXkjGLX32/NGhc61z5dQQwmrgnYEB OC5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:to:references:cc:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=E+/XxJ9waQ08Cniby0FQijKWjr7FcErRX8r+Egb8LSw=; b=dBp8K/saRvJ6q9QV7ZwcQ/SMe6HK1YiULJHRq+6jCEt4vsq0BU1hAM3QTG+1+3jlqr RkwnXnd8+0fnwezSreH6DbOQWZdEC6eVjl0/BS6E0EkVpeXSVGcp39OBLbjVbVuuIQdy 2iANAKDqY9J4c9ByCBF5LUpCziyq5Hq+PKKEVQdoQRqFnSf2A0TtQugA6AdcLAJf5yVB E+Ptg+bCn7aS+zs4hfg1nvwjUVZo+G99/LElCMVroObK0TZyi4tjYElP+TpBjZmb6xri MhF3Jor+rLSdsDYIbowcYN0FTwEBUp2Tt50ji6Vy0ml5vEy2GRou9Sswqr1q1Bgbn59/ wDHQ== X-Gm-Message-State: AD7BkJLjZ+UT2OL9mo9ah86f/tzMpXRFv09k/WU1DQyZJb+0GjN4Ad1kNDS03gQenYPF3A== X-Received: by 10.194.242.202 with SMTP id ws10mr1708977wjc.3.1459535671844; Fri, 01 Apr 2016 11:34:31 -0700 (PDT) Received: from [10.0.0.5] (bzq-109-64-135-27.red.bezeqint.net. [109.64.135.27]) by smtp.googlemail.com with ESMTPSA id hh8sm15188171wjc.42.2016.04.01.11.34.29 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 01 Apr 2016 11:34:30 -0700 (PDT) Subject: Re: Internal error at xfs_trans_cancel To: Dave Chinner X-ASG-Orig-Subj: Re: Internal error at xfs_trans_cancel References: <56FD513B.40805@scylladb.com> <20160331220105.GQ11812@dastard> Cc: xfs@oss.sgi.com From: Avi Kivity Message-ID: <56FEBF34.2030608@scylladb.com> Date: Fri, 1 Apr 2016 21:34:28 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.7.1 MIME-Version: 1.0 In-Reply-To: <20160331220105.GQ11812@dastard> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-wm0-f45.google.com[74.125.82.45] X-Barracuda-Start-Time: 1459535673 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28372 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 04/01/2016 01:01 AM, Dave Chinner wrote: > On Thu, Mar 31, 2016 at 07:32:59PM +0300, Avi Kivity wrote: >> Saw this nice gift this morning: >> >> [2121372.825904] XFS (dm-10): Internal error xfs_trans_cancel at >> line 1007 of file fs/xfs/xfs_trans.c. Caller xfs_create+0x40e/0x710 >> [xfs] >> [2121372.827209] CPU: 0 PID: 32020 Comm: java Tainted: G W >> ------------ 3.10.0-327.10.1.el7.x86_64 #1 >> [2121372.828529] Hardware name: /DH77EB, BIOS >> EBH7710H.86A.0099.2013.0125.1400 01/25/2013 >> [2121372.829873] ffff8807b2b11e80 00000000470753cc ffff88031058bb48 >> ffffffff816352cc >> [2121372.831232] ffff88031058bb60 ffffffffa084be5b ffffffffa085b7ee >> ffff88031058bb88 >> [2121372.832542] ffffffffa0866909 ffff88014a2f3b80 ffff8807f29a2800 >> 0000000000000000 >> [2121372.833850] Call Trace: >> [2121372.835125] [] dump_stack+0x19/0x1b >> [2121372.836397] [] xfs_error_report+0x3b/0x40 [xfs] >> [2121372.837654] [] ? xfs_create+0x40e/0x710 [xfs] >> [2121372.838915] [] xfs_trans_cancel+0xd9/0x100 [xfs] >> [2121372.840178] [] xfs_create+0x40e/0x710 [xfs] >> [2121372.841444] [] xfs_vn_mknod+0xbb/0x250 [xfs] >> [2121372.842683] [] xfs_vn_create+0x13/0x20 [xfs] >> [2121372.843887] [] vfs_create+0xcd/0x130 >> [2121372.845103] [] do_last+0xbef/0x1270 >> [2121372.846324] [] path_openat+0xc2/0x490 >> [2121372.847538] [] ? user_path_at_empty+0x72/0xc0 >> [2121372.848746] [] do_filp_open+0x4b/0xb0 >> [2121372.849917] [] ? __alloc_fd+0xa7/0x130 >> [2121372.851090] [] do_sys_open+0xf3/0x1f0 >> [2121372.852227] [] SyS_open+0x1e/0x20 >> [2121372.853356] [] system_call_fastpath+0x16/0x1b >> [2121372.854486] XFS (dm-10): xfs_do_force_shutdown(0x8) called from >> line 1008 of file fs/xfs/xfs_trans.c. Return address = >> 0xffffffffa0866922 >> >> Filesystem appeared full, > ISTR there was a bug inthe inode allocation code that could lead to > multiple AGFs being dirtied (via AGFL fixups) and then not having > enough contiguous freee space to allocate a new inode chuck. I think > it was also a potential deadlock vector. Yeah: > > e480a72 xfs: avoid AGI/AGF deadlock scenario for inode chunk allocation > > Fixed in 3.15. Apparently that was backported into the kernel I am using: * Tue Mar 18 2014 Jarod Wilson [3.10.0-113.el7] - [fs] xfs: avoid AGI/AGF deadlock scenario for inode chunk allocation (Brian Foster) [1052789] > >> but after a reboot (critical server) it >> went back down to 420GB free. > Lots of open unlinked (or O_TMPFILE) files, I'd guess. > > The workload running on that machine makes it unlikely, but I cannot rule it out. From vishal.l.verma@intel.com Fri Apr 1 14:17:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E18207CC5 for ; Fri, 1 Apr 2016 14:17:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 69023AC004 for ; Fri, 1 Apr 2016 12:17:55 -0700 (PDT) X-ASG-Debug-ID: 1459538274-04bdf01102168c90001-NocioJ Received: from mga14.intel.com ([192.55.52.115]) by cuda.sgi.com with ESMTP id aB2CpdyACCcHzGvI for ; Fri, 01 Apr 2016 12:17:54 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.115 X-ASG-Whitelist: Client Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga103.fm.intel.com with ESMTP; 01 Apr 2016 12:17:54 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,428,1455004800"; d="scan'208";a="679355519" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by FMSMGA003.fm.intel.com with ESMTP; 01 Apr 2016 12:17:54 -0700 Received: from fmsmsx114.amr.corp.intel.com (10.18.116.8) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.248.2; Fri, 1 Apr 2016 12:17:53 -0700 Received: from fmsmsx113.amr.corp.intel.com ([169.254.13.211]) by FMSMSX114.amr.corp.intel.com ([10.18.116.8]) with mapi id 14.03.0248.002; Fri, 1 Apr 2016 12:17:53 -0700 From: "Verma, Vishal L" To: "jack@suse.cz" CC: "linux-block@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "Williams, Dan J" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-nvdimm@lists.01.org" , "linux-fsdevel@vger.kernel.org" , "ross.zwisler@linux.intel.com" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" , "david@fromorbit.com" Subject: Re: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors Thread-Topic: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors X-ASG-Orig-Subj: Re: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors Thread-Index: AQHRhiNvKoQhiC/aYEiTGtqXM3Dgv59q9p4AgAAl9ACAAATbgIAEoN8AgAA7dACAAUTogIAA18YAgAPk+oA= Date: Fri, 1 Apr 2016 19:17:52 +0000 Message-ID: <1459538265.23200.8.camel@intel.com> References: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> <1458861450-17705-5-git-send-email-vishal.l.verma@intel.com> <1458939796.5501.8.camel@intel.com> <1459195288.15523.3.camel@intel.com> <1459277829.6412.3.camel@intel.com> <20160330074926.GC12776@quack.suse.cz> In-Reply-To: <20160330074926.GC12776@quack.suse.cz> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.232.112.171] Content-Type: text/plain; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-Barracuda-Connect: UNKNOWN[192.55.52.115] X-Barracuda-Start-Time: 1459538274 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 T24gV2VkLCAyMDE2LTAzLTMwIGF0IDA5OjQ5ICswMjAwLCBKYW4gS2FyYSB3cm90ZToNCj4gT24g VHVlIDI5LTAzLTE2IDE4OjU3OjE2LCBWZXJtYSwgVmlzaGFsIEwgd3JvdGU6DQo+ID4gDQo+ID4g T24gTW9uLCAyMDE2LTAzLTI4IGF0IDE2OjM0IC0wNzAwLCBEYW4gV2lsbGlhbXMgd3JvdGU6DQo+ ID4gDQo+ID4gPD4NCj4gPiANCj4gPiA+IA0KPiA+ID4gU2VlbXMga2luZCBvZiBzYWQgdG8gZmFp bCB0aGUgZmF1bHQgZHVlIHRvIGEgYmFkIGJsb2NrIHdoZW4gd2UNCj4gPiA+IHdlcmUNCj4gPiA+ IGdvaW5nIHRvIHplcm8gaXQgYW55d2F5LCByaWdodD/CoMKgSSdtIG5vdCBzZWVpbmcgYSBjb21w ZWxsaW5nDQo+ID4gPiByZWFzb24gdG8NCj4gPiA+IGtlZXAgYW55IHplcm9pbmcgaW4gZnMvZGF4 LmMuDQo+ID4gQWdyZWVkIC0gYnV0IGhvdyBkbyB3ZSBkbyB0aGlzPyBjbGVhcl9wbWVtIG5lZWRz IHRvIGJlIGFibGUgdG8gY2xlYXINCj4gPiBhbg0KPiA+IGFyYml0cmFyeSBudW1iZXIgb2YgYnl0 ZXMsIGJ1dCB0byBnbyB0aHJvdWdoIHRoZSBkcml2ZXIsIHdlJ2QgbmVlZA0KPiA+IHRvDQo+ID4g c2VuZCBkb3duIGEgYmlvPyBJZiBvbmx5IHRoZSBkcml2ZXIgaGFkIGFuIHJ3X2J5dGVzIGxpa2Ug aW50ZXJmYWNlDQo+ID4gdGhhdA0KPiA+IGNvdWxkIGJlIHVzZWQgYnkgYW55b25lLi4uIDopDQo+ IEFjdHVhbGx5LCBteSBwYXRjaGVzIGZvciBwYWdlIGZhdWx0IGxvY2tpbmcgcmVtb3ZlIHplcm9p bmcgZnJvbQ0KPiBkYXhfaW5zZXJ0X21hcHBpbmcoKSBhbmQgX19kYXhfcG1kX2ZhdWx0KCkgLSB0 aGUgemVyb2luZyBub3cgaGFwcGVucw0KPiBmcm9tDQo+IHRoZSBmaWxlc3lzdGVtIG9ubHkgYW5k IHRoZSB6ZXJvaW5nIGluIHRob3NlIHR3byBmdW5jdGlvbnMgaXMganVzdCBhDQo+IGRlYWQNCj4g Y29kZS4uLg0KDQpUaGF0IHNob3VsZCBtYWtlIHRoaW5ncyBlYXNpZXIhIERvIHlvdSBoYXZlIGEg dHJlZSBJIGNvdWxkIG1lcmdlIGluIHRvDQpnZXQgdGhpcz8gKFdJUCBpcyBvayBhcyB3ZSBrbm93 IHRoYXQgbXkgc2VyaWVzIHdpbGwgZGVwZW5kIG9uIHlvdXJzLi4pDQpvciwgaWYgeW91IGNhbiBk aXN0aWxsIG91dCB0aGF0IHBhdGNoIG9uIGEgNC42LXJjMSBiYXNlLCBJIGNvdWxkIGNhcnJ5DQpp dCBpbiBteSBzZXJpZXMgdG9vICh5b3VyIHYyJ3MgMy8xMCBkb2Vzbid0IGFwcGx5IG9uIDQuNi1y YzEuLikNCg0KVGhhbmtzLA0KCS1WaXNoYWw= From david@fromorbit.com Fri Apr 1 16:51:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 28CA77CC5 for ; Fri, 1 Apr 2016 16:51:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id DBE583040FF for ; Fri, 1 Apr 2016 14:51:10 -0700 (PDT) X-ASG-Debug-ID: 1459547438-04bdf011021749a0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id nQWQZnxrrLpuGQdM for ; Fri, 01 Apr 2016 14:50:38 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CsCgAl7P5WPDGaLHldg0FTfaZ5DAEBAQEBAQaMEoVjhA8jhWQCAgEBAoFGTQEBAQEBAQcBAQEBQkCEQQEBAQMBOhwjBQsIAxgJJQ8FJQMHGhOIHwcPxEgBCx4ZhT2FDoEfgnoKhXEFl3mFc4gLgj6MWUSOVIMUgUkoMAEBAYcngTwBAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail05.adl6.internode.on.net with ESMTP; 02 Apr 2016 08:20:36 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1am6xf-0002tC-RD; Sat, 02 Apr 2016 08:50:35 +1100 Date: Sat, 2 Apr 2016 08:50:35 +1100 From: Dave Chinner To: Eric Sandeen Cc: Zorro Lang , Eryu Guan , fstests@vger.kernel.org, xfs@oss.sgi.com, sandeen@redhat.com Subject: Re: [PATCH] xfs/133 134 262: limit xfs_quota report to report on specific project quota id Message-ID: <20160401215035.GM30721@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs/133 134 262: limit xfs_quota report to report on specific project quota id References: <1459494050-28330-1-git-send-email-eguan@redhat.com> <20160401072856.GA3329@dhcp12-237.nay.redhat.com> <56FEAED8.2050108@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56FEAED8.2050108@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1459547438 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28379 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Apr 01, 2016 at 12:24:40PM -0500, Eric Sandeen wrote: > > > On 4/1/16 2:28 AM, Zorro Lang wrote: > > On Fri, Apr 01, 2016 at 03:00:50PM +0800, Eryu Guan wrote: > >> With GETNEXTQUOTA support, xfs_quota -c "report" now outputs more quota > >> info than before, and this breaks xfs/133 xfs/134 and xfs/262, e.g. > >> xfs/133 fails as > >> > >> Filesystem Blocks Quota Limit Warn/Time Mounted on > >> SCRATCH_DEV 0 102400 204800 00 [--------] SCRATCH_MNT > >> === report command output === > >> +(null) 0 0 0 00 [--------] > >> 123456-project 0 102400 204800 00 [--------] > >> > >> Fix it by limiting xfs_quota to report on specific project quota number > >> using -L & -U option, so only the project quota being tested is > >> reported. > >> > >> Signed-off-by: Eryu Guan > >> --- > >> > >> I'm not sure if kernel should be fixed, but limiting the quota report on > >> project number being tested seems something worth doing to me anyway. It avoids > >> breakage of future changes of quota report output. > > > > Hi, > > > > FYI: > > About "+(null) 0 0 0 00 [--------]"problem, it has been talked in: > > http://thread.gmane.org/gmane.comp.file-systems.fstests/1852/focus=1968 > > > > I think: > > 1) If we consider that this's a bug, the original test cases can > > be the reproducer of this bug, so we shouldn't change the cases. > > > > 2) If we think print "(null) 0 0 0 00 [--------]" is right(or not > > wrong), then this patch is good. > > yes, I'm sorry I didn't take care of this sooner. > > I don't think there's value in printing the "(null)" line; I think maybe my > suggestion from that old thread might be best: > > > We could explicitly look up id 0 and not show it if it's not in the > > projects file. > > Or now that I think about it - projid 0 is the default project quota, right? "default" as in "project quota not enabled on this inode". i.e. if an inode has projid == 0 then it is not tracked by project quotas. > Assuming that's correct, perhaps we should conditionally print the line, > changing "(null)" to "default", printing it only if a default quota is > set (i.e. not all zeros). Right, the only thing that the dquot for projid 0 holds is default quota limits. We probably shouldn't ever print it out, except when the default limits are queried or set directly... Cheers, Dave. -- Dave Chinner david@fromorbit.com From zlang@redhat.com Fri Apr 1 21:45:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 75A9B7CA0 for ; Fri, 1 Apr 2016 21:45:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3BE47304032 for ; Fri, 1 Apr 2016 19:45:20 -0700 (PDT) X-ASG-Debug-ID: 1459565115-04cbb07ad61d8910001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 5bvXHUrSBgYlNBWT (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 01 Apr 2016 19:45:16 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5110A1636A9 for ; Sat, 2 Apr 2016 02:45:15 +0000 (UTC) Received: from localhost (vpn1-7-128.pek2.redhat.com [10.72.7.128]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u322jD5Z010646; Fri, 1 Apr 2016 22:45:14 -0400 From: Zorro Lang To: xfs@oss.sgi.com Cc: billodo@redhat.com, Zorro Lang Subject: [PATCH v2] xfs_quota: add missed options -D and -P into man page Date: Sat, 2 Apr 2016 10:45:10 +0800 X-ASG-Orig-Subj: [PATCH v2] xfs_quota: add missed options -D and -P into man page Message-Id: <1459565110-23923-1-git-send-email-zlang@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Sat, 02 Apr 2016 02:45:15 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1459565115 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 There're two options in xfsprogs/quota/init.c:init() function, the -D option is used to set a file to instead of /etc/projects, and the -P option is used to set a file to instead of /etc/projid. I don't know these two options when I write xfstests case xfs/133, because there's no any information about them in xfs_quota and other related man pages. I learn about these two options by read others test cases. So I add these options into xfs_quota man page. Reported-by: Eryu Guan Signed-off-by: Zorro Lang --- Hi, V2 patch fix some english words problems: Point a file contain the -> Specify a file containing the directories trees -> directory trees Thanks for Bill specify my english syntax errors. English is not my mother tongue, sorry for the mistake when I write english. Thanks, Zorro man/man8/xfs_quota.8 | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/man/man8/xfs_quota.8 b/man/man8/xfs_quota.8 index 951252b..ab67423 100644 --- a/man/man8/xfs_quota.8 +++ b/man/man8/xfs_quota.8 @@ -15,6 +15,12 @@ xfs_quota \- manage use of quota on XFS filesystems .B \-d .I project ] ... [ +.B \-D +.I projects_file +] [ +.B \-P +.I projid_file +] [ .IR path " ... ]" .br .B xfs_quota \-V @@ -53,6 +59,18 @@ commands to the set of projects specified. Multiple .B \-d arguments may be given. .TP +.BI \-D " projects_file" +Specify a file containing the mapping of numeric project identifiers +to directory trees. +.I /etc/projects +as default, if this option is none. +.TP +.BI \-P " projid_file" +Specify a file containing the mapping of numeric project identifiers +to project names. +.I /etc/projid +as default, if this option is none. +.TP .B \-V Prints the version number and exits. .PP -- 2.5.0 From billodo@redhat.com Sat Apr 2 07:38:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 14B2A7CA3 for ; Sat, 2 Apr 2016 07:38:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9AA96AC002 for ; Sat, 2 Apr 2016 05:37:58 -0700 (PDT) X-ASG-Debug-ID: 1459600677-04bdf011021bc3e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id rJvdQp8jaKhO2K4l (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 02 Apr 2016 05:37:57 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4C2697F081 for ; Sat, 2 Apr 2016 12:37:57 +0000 (UTC) Received: from redhat.com (unused [10.10.52.75] (may be forged)) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u32CbtNI011291 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 2 Apr 2016 08:37:56 -0400 Date: Sat, 2 Apr 2016 07:37:55 -0500 From: "Bill O'Donnell" To: Zorro Lang Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2] xfs_quota: add missed options -D and -P into man page Message-ID: <20160402123754.GA4269@redhat.com> X-ASG-Orig-Subj: Re: [PATCH v2] xfs_quota: add missed options -D and -P into man page References: <1459565110-23923-1-git-send-email-zlang@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459565110-23923-1-git-send-email-zlang@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1459600677 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, Apr 02, 2016 at 10:45:10AM +0800, Zorro Lang wrote: > There're two options in xfsprogs/quota/init.c:init() function, the -D > option is used to set a file to instead of /etc/projects, and the -P > option is used to set a file to instead of /etc/projid. I don't know > these two options when I write xfstests case xfs/133, because > there's no any information about them in xfs_quota and other related > man pages. I learn about these two options by read others test cases. > > So I add these options into xfs_quota man page. > > Reported-by: Eryu Guan > Signed-off-by: Zorro Lang > --- Reviewed-by: Bill O'Donnell > > Hi, > > V2 patch fix some english words problems: > Point a file contain the -> Specify a file containing the > directories trees -> directory trees > > Thanks for Bill specify my english syntax errors. English is not my > mother tongue, sorry for the mistake when I write english. > > Thanks, > Zorro > > man/man8/xfs_quota.8 | 18 ++++++++++++++++++ > 1 file changed, 18 insertions(+) > > diff --git a/man/man8/xfs_quota.8 b/man/man8/xfs_quota.8 > index 951252b..ab67423 100644 > --- a/man/man8/xfs_quota.8 > +++ b/man/man8/xfs_quota.8 > @@ -15,6 +15,12 @@ xfs_quota \- manage use of quota on XFS filesystems > .B \-d > .I project > ] ... [ > +.B \-D > +.I projects_file > +] [ > +.B \-P > +.I projid_file > +] [ > .IR path " ... ]" > .br > .B xfs_quota \-V > @@ -53,6 +59,18 @@ commands to the set of projects specified. Multiple > .B \-d > arguments may be given. > .TP > +.BI \-D " projects_file" > +Specify a file containing the mapping of numeric project identifiers > +to directory trees. > +.I /etc/projects > +as default, if this option is none. > +.TP > +.BI \-P " projid_file" > +Specify a file containing the mapping of numeric project identifiers > +to project names. > +.I /etc/projid > +as default, if this option is none. > +.TP > .B \-V > Prints the version number and exits. > .PP > -- > 2.5.0 > From zlang@redhat.com Sat Apr 2 10:59:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 381557CA3 for ; Sat, 2 Apr 2016 10:59:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id ADC5CAC002 for ; Sat, 2 Apr 2016 08:59:39 -0700 (PDT) X-ASG-Debug-ID: 1459612774-04bdf011031c0130001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BPJcZxUblRvib2Nv (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 02 Apr 2016 08:59:34 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 10B323E1 for ; Sat, 2 Apr 2016 15:59:34 +0000 (UTC) Received: from localhost (vpn1-7-128.pek2.redhat.com [10.72.7.128]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u32FxWnG011786; Sat, 2 Apr 2016 11:59:32 -0400 From: Zorro Lang To: dchinner@redhat.com Cc: xfs@oss.sgi.com, sandeen@redhat.com, Zorro Lang Subject: [PATCH] xfs_quota: allow create limit when user or group names beginning with digits Date: Sat, 2 Apr 2016 23:59:30 +0800 X-ASG-Orig-Subj: [PATCH] xfs_quota: allow create limit when user or group names beginning with digits Message-Id: <1459612770-18908-1-git-send-email-zlang@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: 1459612774 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 A normal user or group name allow beginning with digits, but xfs_quota can't create a limit for that user or group. The reason is 'strtoul' function only translate digits at the beginning, it will ignore letters after digits. There's a commit fd537fc50eeade63bbd2a66105f39d04a011a7f5, it try to fix "xfsprogs: xfs_quota allow user or group names beginning with digits". But it doesn't effect 'limit' command, so a command likes: xfs_quota 'limit .... 12345678-user' xxxx will try to create limit for username="12345678", not "12345678-user". This patch will fix this problem, and a test case xfs/138 in xfstests is used to reproduce this bug. Signed-off-by: Zorro Lang Reviewed-by: Eric Sandeen --- Hi Dave, I just found there's a missed patch in my local xfsprogs repo, it has been reviewed for a long: http://oss.sgi.com/archives/xfs/2015-12/msg00134.html And the reproducer about this bug has been merged into xfstests for several months, but I don't know why we can't merge this patch. Would you please check it? Due to long time has passed, so I rewrite this patch and re-send it again now. If anything wrong in this patch, please let me know:) Thanks very much, Zorro libxcmd/input.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libxcmd/input.c b/libxcmd/input.c index c505ab3..5a7dce3 100644 --- a/libxcmd/input.c +++ b/libxcmd/input.c @@ -366,7 +366,7 @@ uid_from_string( char *sp; uid_long = strtoul(user, &sp, 10); - if (sp != user) { + if (sp != user && *sp == '\0') { if ((uid_long == ULONG_MAX && errno == ERANGE) || (uid_long > (uid_t)-1)) return -1; @@ -387,7 +387,7 @@ gid_from_string( char *sp; gid_long = strtoul(group, &sp, 10); - if (sp != group) { + if (sp != group && *sp == '\0') { if ((gid_long == ULONG_MAX && errno == ERANGE) || (gid_long > (gid_t)-1)) return -1; -- 2.5.0 From tom.leiming@gmail.com Sun Apr 3 11:31:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 18C787CA0 for ; Sun, 3 Apr 2016 11:31:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 70EBBAC001 for ; Sun, 3 Apr 2016 09:31:22 -0700 (PDT) X-ASG-Debug-ID: 1459701080-04cbb07ad52288c0001-NocioJ Received: from mail-pa0-f54.google.com (mail-pa0-f54.google.com [209.85.220.54]) by cuda.sgi.com with ESMTP id QsBpiiszpolcj8fm (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 03 Apr 2016 09:31:20 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.54 Received: by mail-pa0-f54.google.com with SMTP id zm5so127005275pac.0 for ; Sun, 03 Apr 2016 09:31:20 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=gnCr98i8frpdbE9rdgAo4BG8kDap1y6D50G3D7Hoagk=; b=EikWzvomdmZdcwrHN7V3QY4cVueQC98LimRJsOMxeo8NT0saLd152UeEHmDjYl3Wgg Z9y/6QFAUyxX0fOr5t9ncI5gKRtkZ8c+RaEPeeSLYYThOKPx0kXZ9jaDqzyT5i55grXb W0NjywTLDiB34GApVJm5ytn+MaEeC/OVONL/ugjkEu6rCbOsH4LtZTHI29vA7epqZa// CTCDHo2bw7DtsfUdzkPCWjH0p619p2hkm61v3KO90wMummQBS712gjm22qoZ2lclvNYx pqN+sv4o9C34ABkbm5EBT8NzTXcnt5mmUE+oJp+iGQn8JEtSmOf77+BLyxPEYk9/kxwF T1hA== X-Gm-Message-State: AD7BkJKWt/5xgel2krWYbERomnIqn8eTTdR8mXl83MwEB4Ve2p5c17wDkGLOqN52eT/NeA== X-Received: by 10.66.55.70 with SMTP id q6mr45638918pap.126.1459701080031; Sun, 03 Apr 2016 09:31:20 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id 83sm33453921pfn.46.2016.04.03.09.31.18 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Sun, 03 Apr 2016 09:31:19 -0700 (PDT) From: Ming Lei X-Barracuda-Apparent-Source-IP: 45.125.195.13 X-Barracuda-BBL-IP: 45.125.195.13 To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh Subject: [PATCH v2 0/8] block: prepare for multipage bvecs Date: Mon, 4 Apr 2016 00:31:01 +0800 X-ASG-Orig-Subj: [PATCH v2 0/8] block: prepare for multipage bvecs Message-Id: <1459701069-31406-1-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 X-Barracuda-Connect: mail-pa0-f54.google.com[209.85.220.54] X-Barracuda-Start-Time: 1459701080 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28425 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi, Interests[1] have been shown in multipage bvecs, so this patchset try to prepare for the support and do two things: 1) the 1st 4 patches use bvec iterator to implement iterate_bvec(), then we can drop the non-standard way for iterating bvec, which can be thought as a good cleanup for lib/iov_iter.c 2) remove BIO_MAX_SECTORS & BIO_MAX_SIZE, and now there is only one user for each. Once multipage bvecs is introduced, one bio may hold lots of sectors, and we should always use sort of BIO_MAX_VECS which should be introduced in future and is similiar with current BIO_MAX_PAGES. xfstests(-a auto) have been run and no regression found by this patchset against linus v4.6-rc1-next-20160329. V2: - rename bvec_iter.h as bvec.h - always include bvec.h into blk_types.h as suggested by Christoph V1: - don't move BIO_MAX_* to bvec_iter.h as pointed out by Christoph - run xfstests against v4.6-rc1-next-20160329 - add Reviewed-by - for 1,4 and 5, Reviewd-by not added, Christoph still expressed 'this looks fine to me.' drivers/block/drbd/drbd_int.h | 4 +-- fs/xfs/xfs_buf.c | 4 +-- include/linux/bio.h | 52 -------------------------------- include/linux/blk_types.h | 22 +------------- include/linux/bvec.h | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/iov_iter.c | 30 +++++++------------ 6 files changed, 107 insertions(+), 98 deletions(-) Thanks, Ming From tom.leiming@gmail.com Sun Apr 3 11:31:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 203DB7CA4 for ; Sun, 3 Apr 2016 11:31:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E88338F8039 for ; Sun, 3 Apr 2016 09:31:28 -0700 (PDT) X-ASG-Debug-ID: 1459701086-04cb6c2460249580001-NocioJ Received: from mail-pf0-f182.google.com (mail-pf0-f182.google.com [209.85.192.182]) by cuda.sgi.com with ESMTP id 2dibqpFGS8X2CErz (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 03 Apr 2016 09:31:27 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.182 Received: by mail-pf0-f182.google.com with SMTP id e128so105175753pfe.3 for ; Sun, 03 Apr 2016 09:31:27 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=TUjtEP4ZnKHQAqMdFUz4J64TVDHwUfWLqInHmr/XO5Y=; b=gf4UZ+bJAbmxu4q6wjHPzXzYkGPEUbvDcY7xW0v/QEUYwlPqTNnbAz40YHDnV3pIIG QAxLCBuey2IHQ+jQ/AjdGjes4jQpeS+sN0X6ajFNP14U7ee6A7hn1QTU58PcHkJRUp+F qiby0pSG3SZfgZfFBaSYV72fzBskEHSj32gtAoYfHXSnhjxJGyrOpfqNm8z9M89kILYt NKLuXYcRYg+QzwHyfR0p8Y/2hspjYlRpaW1NT134J5ynusjVfFZx7gisiyAnJwC4+1t3 f3IjT7pa1fxZFJcBdqQMDXiYUfTQVnl0HKHT0MUkznKUJtiDn0HrRKBtnfP2TGTvG1K2 BgQQ== X-Gm-Message-State: AD7BkJJIDq4KaKWQ4b2Ms1XZ2sSAgpR8ZViAA71KD+LBIgcoFQUkKHMh693n/4WccoVkyQ== X-Received: by 10.98.74.74 with SMTP id x71mr14229871pfa.25.1459701086455; Sun, 03 Apr 2016 09:31:26 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id c18sm33475766pfj.41.2016.04.03.09.31.24 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Sun, 03 Apr 2016 09:31:25 -0700 (PDT) From: Ming Lei X-Barracuda-Apparent-Source-IP: 45.125.195.13 X-Barracuda-BBL-IP: 45.125.195.13 To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH v2 1/8] block: move bvec iterator into include/linux/bvec.h Date: Mon, 4 Apr 2016 00:31:02 +0800 X-ASG-Orig-Subj: [PATCH v2 1/8] block: move bvec iterator into include/linux/bvec.h Message-Id: <1459701069-31406-2-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1459701069-31406-1-git-send-email-ming.lei@canonical.com> References: <1459701069-31406-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pf0-f182.google.com[209.85.192.182] X-Barracuda-Start-Time: 1459701087 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28425 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header bvec iterator helpers should be used to implement by iterate_bvec():lib/iov_iter.c too, and move them into one header, so that we can keep bvec iterator header out of CONFIG_BLOCK. Then we can remove the reinventing of wheel in iterate_bvec(). Signed-off-by: Ming Lei --- include/linux/bio.h | 51 +----------------------------------- include/linux/bvec.h | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 50 deletions(-) create mode 100644 include/linux/bvec.h diff --git a/include/linux/bio.h b/include/linux/bio.h index 88bc64f..78cf737 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -31,6 +31,7 @@ /* struct bio, bio_vec and BIO_* flags are defined in blk_types.h */ #include +#include #define BIO_DEBUG @@ -57,29 +58,6 @@ (bio)->bi_rw |= ((unsigned long) (prio) << BIO_PRIO_SHIFT); \ } while (0) -/* - * various member access, note that bio_data should of course not be used - * on highmem page vectors - */ -#define __bvec_iter_bvec(bvec, iter) (&(bvec)[(iter).bi_idx]) - -#define bvec_iter_page(bvec, iter) \ - (__bvec_iter_bvec((bvec), (iter))->bv_page) - -#define bvec_iter_len(bvec, iter) \ - min((iter).bi_size, \ - __bvec_iter_bvec((bvec), (iter))->bv_len - (iter).bi_bvec_done) - -#define bvec_iter_offset(bvec, iter) \ - (__bvec_iter_bvec((bvec), (iter))->bv_offset + (iter).bi_bvec_done) - -#define bvec_iter_bvec(bvec, iter) \ -((struct bio_vec) { \ - .bv_page = bvec_iter_page((bvec), (iter)), \ - .bv_len = bvec_iter_len((bvec), (iter)), \ - .bv_offset = bvec_iter_offset((bvec), (iter)), \ -}) - #define bio_iter_iovec(bio, iter) \ bvec_iter_bvec((bio)->bi_io_vec, (iter)) @@ -193,33 +171,6 @@ static inline void *bio_data(struct bio *bio) #define bio_for_each_segment_all(bvl, bio, i) \ for (i = 0, bvl = (bio)->bi_io_vec; i < (bio)->bi_vcnt; i++, bvl++) -static inline void bvec_iter_advance(struct bio_vec *bv, struct bvec_iter *iter, - unsigned bytes) -{ - WARN_ONCE(bytes > iter->bi_size, - "Attempted to advance past end of bvec iter\n"); - - while (bytes) { - unsigned len = min(bytes, bvec_iter_len(bv, *iter)); - - bytes -= len; - iter->bi_size -= len; - iter->bi_bvec_done += len; - - if (iter->bi_bvec_done == __bvec_iter_bvec(bv, *iter)->bv_len) { - iter->bi_bvec_done = 0; - iter->bi_idx++; - } - } -} - -#define for_each_bvec(bvl, bio_vec, iter, start) \ - for (iter = (start); \ - (iter).bi_size && \ - ((bvl = bvec_iter_bvec((bio_vec), (iter))), 1); \ - bvec_iter_advance((bio_vec), &(iter), (bvl).bv_len)) - - static inline void bio_advance_iter(struct bio *bio, struct bvec_iter *iter, unsigned bytes) { diff --git a/include/linux/bvec.h b/include/linux/bvec.h new file mode 100644 index 0000000..29c459d --- /dev/null +++ b/include/linux/bvec.h @@ -0,0 +1,74 @@ +/* + * bvec iterator + * + * Copyright (C) 2001 Ming Lei + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public Licens + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111- + */ +#ifndef __LINUX_BVEC_ITER_H +#define __LINUX_BVEC_ITER_H + +#include + +/* + * various member access, note that bio_data should of course not be used + * on highmem page vectors + */ +#define __bvec_iter_bvec(bvec, iter) (&(bvec)[(iter).bi_idx]) + +#define bvec_iter_page(bvec, iter) \ + (__bvec_iter_bvec((bvec), (iter))->bv_page) + +#define bvec_iter_len(bvec, iter) \ + min((iter).bi_size, \ + __bvec_iter_bvec((bvec), (iter))->bv_len - (iter).bi_bvec_done) + +#define bvec_iter_offset(bvec, iter) \ + (__bvec_iter_bvec((bvec), (iter))->bv_offset + (iter).bi_bvec_done) + +#define bvec_iter_bvec(bvec, iter) \ +((struct bio_vec) { \ + .bv_page = bvec_iter_page((bvec), (iter)), \ + .bv_len = bvec_iter_len((bvec), (iter)), \ + .bv_offset = bvec_iter_offset((bvec), (iter)), \ +}) + +static inline void bvec_iter_advance(struct bio_vec *bv, struct bvec_iter *iter, + unsigned bytes) +{ + WARN_ONCE(bytes > iter->bi_size, + "Attempted to advance past end of bvec iter\n"); + + while (bytes) { + unsigned len = min(bytes, bvec_iter_len(bv, *iter)); + + bytes -= len; + iter->bi_size -= len; + iter->bi_bvec_done += len; + + if (iter->bi_bvec_done == __bvec_iter_bvec(bv, *iter)->bv_len) { + iter->bi_bvec_done = 0; + iter->bi_idx++; + } + } +} + +#define for_each_bvec(bvl, bio_vec, iter, start) \ + for (iter = (start); \ + (iter).bi_size && \ + ((bvl = bvec_iter_bvec((bio_vec), (iter))), 1); \ + bvec_iter_advance((bio_vec), &(iter), (bvl).bv_len)) + +#endif /* __LINUX_BVEC_ITER_H */ -- 1.9.1 From tom.leiming@gmail.com Sun Apr 3 11:31:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 A9C377CA6 for ; Sun, 3 Apr 2016 11:31:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7D5DB8F8039 for ; Sun, 3 Apr 2016 09:31:34 -0700 (PDT) X-ASG-Debug-ID: 1459701093-04cbb07ad82288e0001-NocioJ Received: from mail-pf0-f171.google.com (mail-pf0-f171.google.com [209.85.192.171]) by cuda.sgi.com with ESMTP id rSl4whLVNDQ6WW97 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 03 Apr 2016 09:31:33 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.171 Received: by mail-pf0-f171.google.com with SMTP id e128so105176846pfe.3 for ; Sun, 03 Apr 2016 09:31:33 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=GfRCyqqWaO2a70vloNR+IJYmiTMoW/Gg5dsEuxJ4uzo=; b=EJFyNmuK0oY5WjaLHevemtegA4coqtz96+xCRfK0mGuJLFVRe8+ARbg8bzZZm1Bnb4 FdAzr8+muNLUuU8QZhA1tvKEYue5evam57Cka7wwgNNqYEoZntJUsQxBs1be6ody3KdK SA2D3PKVbqmYkzazF3iCCWhcrOK4+2Qi2ZmF+020AlKHAJBL1ZDpEhWccy4YJ8wYsLGQ MMnzUoZbca80620cZZGQGrD2oS1zKc4eQKfqEs/3egoQEV3uHeH3SITgoYs7YMOThnWS gzzty8DDI1u+QTvMgZKWS/wi40uMhsdB4OblPsQavCsFyqqZP13HUmVklVsgf9CfXNaw QcEw== X-Gm-Message-State: AD7BkJLIpeHb+jRI5HB8lfehdcOLtG1oQwbWS0hKdTn9omgwtV4QOEu0cKL52uKv5Ns3KQ== X-Received: by 10.98.16.198 with SMTP id 67mr14212817pfq.21.1459701092843; Sun, 03 Apr 2016 09:31:32 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id a11sm3720381pat.6.2016.04.03.09.31.31 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Sun, 03 Apr 2016 09:31:32 -0700 (PDT) From: Ming Lei X-Barracuda-Apparent-Source-IP: 45.125.195.13 X-Barracuda-BBL-IP: 45.125.195.13 To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH v2 2/8] block: move two bvec structure into bvec.h Date: Mon, 4 Apr 2016 00:31:03 +0800 X-ASG-Orig-Subj: [PATCH v2 2/8] block: move two bvec structure into bvec.h Message-Id: <1459701069-31406-3-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1459701069-31406-1-git-send-email-ming.lei@canonical.com> References: <1459701069-31406-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pf0-f171.google.com[209.85.192.171] X-Barracuda-Start-Time: 1459701093 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28425 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header This patch moves 'struct bio_vec' and 'struct bvec_iter' into 'include/linux/bvec.h', then always include this header into 'include/linux/blk_types.h'. With this change, both 'struct bvec_iter' and bvec iterator helpers don't depend on CONFIG_BLOCK any more, then we can use bvec iterator to implement iterate_bvec(): lib/iov_iter.c. Suggested-by: Christoph Hellwig Signed-off-by: Ming Lei --- include/linux/bio.h | 1 - include/linux/blk_types.h | 22 +--------------------- include/linux/bvec.h | 20 +++++++++++++++++++- 3 files changed, 20 insertions(+), 23 deletions(-) diff --git a/include/linux/bio.h b/include/linux/bio.h index 78cf737..7f998ac 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -31,7 +31,6 @@ /* struct bio, bio_vec and BIO_* flags are defined in blk_types.h */ #include -#include #define BIO_DEBUG diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index 86a38ea..a8d8e1f 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -6,6 +6,7 @@ #define __LINUX_BLK_TYPES_H #include +#include struct bio_set; struct bio; @@ -17,28 +18,7 @@ struct cgroup_subsys_state; typedef void (bio_end_io_t) (struct bio *); typedef void (bio_destructor_t) (struct bio *); -/* - * was unsigned short, but we might as well be ready for > 64kB I/O pages - */ -struct bio_vec { - struct page *bv_page; - unsigned int bv_len; - unsigned int bv_offset; -}; - #ifdef CONFIG_BLOCK - -struct bvec_iter { - sector_t bi_sector; /* device address in 512 byte - sectors */ - unsigned int bi_size; /* residual I/O count */ - - unsigned int bi_idx; /* current index into bvl_vec */ - - unsigned int bi_bvec_done; /* number of bytes completed in - current bvec */ -}; - /* * main unit of I/O for the block layer and lower layers (ie drivers and * stacking drivers) diff --git a/include/linux/bvec.h b/include/linux/bvec.h index 29c459d..e111124 100644 --- a/include/linux/bvec.h +++ b/include/linux/bvec.h @@ -20,7 +20,25 @@ #ifndef __LINUX_BVEC_ITER_H #define __LINUX_BVEC_ITER_H -#include +/* + * was unsigned short, but we might as well be ready for > 64kB I/O pages + */ +struct bio_vec { + struct page *bv_page; + unsigned int bv_len; + unsigned int bv_offset; +}; + +struct bvec_iter { + sector_t bi_sector; /* device address in 512 byte + sectors */ + unsigned int bi_size; /* residual I/O count */ + + unsigned int bi_idx; /* current index into bvl_vec */ + + unsigned int bi_bvec_done; /* number of bytes completed in + current bvec */ +}; /* * various member access, note that bio_data should of course not be used -- 1.9.1 From tom.leiming@gmail.com Sun Apr 3 11:31:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 40E167CB2 for ; Sun, 3 Apr 2016 11:31:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id EE20E304032 for ; Sun, 3 Apr 2016 09:31:40 -0700 (PDT) X-ASG-Debug-ID: 1459701099-04bdf011031dc700001-NocioJ Received: from mail-pa0-f52.google.com (mail-pa0-f52.google.com [209.85.220.52]) by cuda.sgi.com with ESMTP id TNRtVXotG7ElQm1q (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 03 Apr 2016 09:31:39 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.52 Received: by mail-pa0-f52.google.com with SMTP id fe3so126907090pab.1 for ; Sun, 03 Apr 2016 09:31:39 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=NNXD7cvVIkiVag5Do6mXQ6A1SeM09CQCR94HTM2HvVY=; b=b4YjjQetJOX7rfQ3mCoH09TSFH8JiJje+SUT5tLgDF3/TWPab7kRPhvIdlXd0jabv5 41H3cUuEVW/dJskC3Ee2kvcVSLtokkT8hSUUQcKSgxcSOWe+4s8Se4CoLThc5Le8pHpg NKQtS6O7IiPwVoGdBOftfe1UI5Hfb3U9xNhQXQnj8yGy5MJdyOSy06MCtKuG/Q5Mmgij Z9uCGqE/ep+dwUhqnow5oOBGvvQbl4inUIrefXDzHYJAVA/W7vQAVGKvHgBc7leEKzW2 5S5Ad+AiP/UVMuri8ilL9WL9HbZ9s7YRS1pb4/vBkqavSBimNil9u93BCs9VjAVeT8xN FKkw== X-Gm-Message-State: AD7BkJJXISV7oPmJU6iubo08xeiabZuls+F93zRS50upfs5FXzwUNlIYiah+52tHCjTGAA== X-Received: by 10.66.249.41 with SMTP id yr9mr46824416pac.86.1459701099026; Sun, 03 Apr 2016 09:31:39 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id f66sm33488253pff.8.2016.04.03.09.31.37 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Sun, 03 Apr 2016 09:31:38 -0700 (PDT) From: Ming Lei X-Barracuda-Apparent-Source-IP: 45.125.195.13 X-Barracuda-BBL-IP: 45.125.195.13 To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH v2 3/8] block: mark 1st parameter of bvec_iter_advance as const Date: Mon, 4 Apr 2016 00:31:04 +0800 X-ASG-Orig-Subj: [PATCH v2 3/8] block: mark 1st parameter of bvec_iter_advance as const Message-Id: <1459701069-31406-4-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1459701069-31406-1-git-send-email-ming.lei@canonical.com> References: <1459701069-31406-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pa0-f52.google.com[209.85.220.52] X-Barracuda-Start-Time: 1459701099 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28425 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header bvec_iter_advance() only writes the parameter of iterator, so the base address of bvec can be marked as const safely. Without the change, we can see compiling warning in the following patch for implementing iterate_bvec(): lib/iov_iter.c with bvec iterator. Reviewed-by: Christoph Hellwig Signed-off-by: Ming Lei --- include/linux/bvec.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/linux/bvec.h b/include/linux/bvec.h index e111124..0c6fa42 100644 --- a/include/linux/bvec.h +++ b/include/linux/bvec.h @@ -63,7 +63,8 @@ struct bvec_iter { .bv_offset = bvec_iter_offset((bvec), (iter)), \ }) -static inline void bvec_iter_advance(struct bio_vec *bv, struct bvec_iter *iter, +static inline void bvec_iter_advance(const struct bio_vec *bv, + struct bvec_iter *iter, unsigned bytes) { WARN_ONCE(bytes > iter->bi_size, -- 1.9.1 From tom.leiming@gmail.com Sun Apr 3 11:31:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BF4F77CB5 for ; Sun, 3 Apr 2016 11:31:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 39773AC002 for ; Sun, 3 Apr 2016 09:31:48 -0700 (PDT) X-ASG-Debug-ID: 1459701106-04cb6c245f2495a0001-NocioJ Received: from mail-pa0-f42.google.com (mail-pa0-f42.google.com [209.85.220.42]) by cuda.sgi.com with ESMTP id bfeFIy8T6OnCgy3q (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 03 Apr 2016 09:31:46 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.42 Received: by mail-pa0-f42.google.com with SMTP id td3so126459911pab.2 for ; Sun, 03 Apr 2016 09:31:46 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=T84E5r8SO0QZoKCDA8vyoXvqulJoiLHB4RbTn9CHEzk=; b=bYmYhbvMUQ8DkvgxrwbSaMx1Zl7Bdn/iXNdY0lrh0wVmRQQdZ/+ya4I1esLa56qJLC 7DYjBgOH1MKKyXLEhF3UXcGMEx6GV+SolKMfTrWG/2byzocJ4M7Z9istoFnlpl8zsPoV 5q7D8gJ5ZNnt5ZxI9SVRoiJHwSvKg0pakb5aGrLWdyY25ROywrKgwylxdsgC0XwXp+ke tMil2QGDKWroR7hXgEYsWwGLPLzLt6qGl5kv+vx3ImdipnLMKthmzDKOYhcqf5l/9+99 3M2nEMdI1DquV3Rxv5Vgut21K/TMIFmGl4f4gRvI6SAeKU+NzXu83mi5i5ElxJMK8fGx 0kbA== X-Gm-Message-State: AD7BkJJ2mx3YVUYSeWjvBLS+k4HMWnoZHdmhxD5ed6WB3RMayEF046Pj7izP+9bJmlv+Gw== X-Received: by 10.66.66.135 with SMTP id f7mr17106581pat.155.1459701106197; Sun, 03 Apr 2016 09:31:46 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id n74sm33469401pfa.45.2016.04.03.09.31.44 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Sun, 03 Apr 2016 09:31:45 -0700 (PDT) From: Ming Lei X-Barracuda-Apparent-Source-IP: 45.125.195.13 X-Barracuda-BBL-IP: 45.125.195.13 To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH v2 4/8] iov_iter: use bvec iterator to implement iterate_bvec() Date: Mon, 4 Apr 2016 00:31:05 +0800 X-ASG-Orig-Subj: [PATCH v2 4/8] iov_iter: use bvec iterator to implement iterate_bvec() Message-Id: <1459701069-31406-5-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1459701069-31406-1-git-send-email-ming.lei@canonical.com> References: <1459701069-31406-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pa0-f42.google.com[209.85.220.42] X-Barracuda-Start-Time: 1459701106 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28425 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header bvec has provided one iterator already, so not necessary to reinvent a new wheel for this job. Signed-off-by: Ming Lei --- lib/iov_iter.c | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/lib/iov_iter.c b/lib/iov_iter.c index 5fecddc..c8691ac 100644 --- a/lib/iov_iter.c +++ b/lib/iov_iter.c @@ -57,35 +57,25 @@ } #define iterate_bvec(i, n, __v, __p, skip, STEP) { \ - size_t wanted = n; \ + struct bvec_iter __bi, __start; \ + __start.bi_size = n; \ + __start.bi_bvec_done = skip; \ + __start.bi_idx = 0; \ __p = i->bvec; \ - __v.bv_len = min_t(size_t, n, __p->bv_len - skip); \ - if (likely(__v.bv_len)) { \ - __v.bv_page = __p->bv_page; \ - __v.bv_offset = __p->bv_offset + skip; \ + for_each_bvec(__v, __p, __bi, __start) { \ (void)(STEP); \ - skip += __v.bv_len; \ - n -= __v.bv_len; \ } \ - while (unlikely(n)) { \ - __p++; \ - __v.bv_len = min_t(size_t, n, __p->bv_len); \ - if (unlikely(!__v.bv_len)) \ - continue; \ - __v.bv_page = __p->bv_page; \ - __v.bv_offset = __p->bv_offset; \ - (void)(STEP); \ + if (!__bi.bi_idx) \ + skip += __v.bv_len; \ + else \ skip = __v.bv_len; \ - n -= __v.bv_len; \ - } \ - n = wanted; \ } #define iterate_all_kinds(i, n, v, I, B, K) { \ size_t skip = i->iov_offset; \ if (unlikely(i->type & ITER_BVEC)) { \ const struct bio_vec *bvec; \ - struct bio_vec v; \ + struct bio_vec v = { 0 }; \ iterate_bvec(i, n, v, bvec, skip, (B)) \ } else if (unlikely(i->type & ITER_KVEC)) { \ const struct kvec *kvec; \ @@ -102,7 +92,7 @@ size_t skip = i->iov_offset; \ if (unlikely(i->type & ITER_BVEC)) { \ const struct bio_vec *bvec; \ - struct bio_vec v; \ + struct bio_vec v = { 0 }; \ iterate_bvec(i, n, v, bvec, skip, (B)) \ if (skip == bvec->bv_len) { \ bvec++; \ -- 1.9.1 From tom.leiming@gmail.com Sun Apr 3 11:31:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A825A7CB8 for ; Sun, 3 Apr 2016 11:31:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7CA8B304048 for ; Sun, 3 Apr 2016 09:31:55 -0700 (PDT) X-ASG-Debug-ID: 1459701112-04cb6c24622495b0001-NocioJ Received: from mail-pf0-f173.google.com (mail-pf0-f173.google.com [209.85.192.173]) by cuda.sgi.com with ESMTP id udu9ZCF01E6fr5dV (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 03 Apr 2016 09:31:53 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.173 Received: by mail-pf0-f173.google.com with SMTP id e128so105180058pfe.3 for ; Sun, 03 Apr 2016 09:31:53 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=xXUdvjLtowonlrbju5ek6j4VIGdC6GChTRig76zBevk=; b=KzQ5kxK3Bh/WsOSoHB/ttrr9LAvppLN70uPhngrbscS5m7G54yPozcHAFdJLuph0iR LPKXXoY21n224KLadzDZv+t7nf1PWcjda11rqWpUV/xFI1d17MUDtvK+9c3YkLj5sSPz 2/igSNpKXLOd6wyP6a0BUAZCnkluOuKQM2qE+Ic2Eb+2kKD+XbTJPPYBlY2xCZQzS3FI WB2yZJ1LNyQB88uYpHijcGjiTP5Uke+ux1lOFUDxiTVFmNZfHPEAYGjSYhlrtJWiA0EV mwNt1Enm2Uk5wgjesMoKPSYbO5UdT8j07JXgkjhNjR9C84Tcg0XRcST39kvovED+vuTB jCRw== X-Gm-Message-State: AD7BkJI9mbKNF7eIqbwPBZI5rXB1859k9VwNm2XGp1pb7xoaG6rR5UaUQ9SHs3WAP/cPsA== X-Received: by 10.98.14.2 with SMTP id w2mr14085679pfi.35.1459701112604; Sun, 03 Apr 2016 09:31:52 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id 17sm33436657pfp.96.2016.04.03.09.31.51 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Sun, 03 Apr 2016 09:31:52 -0700 (PDT) From: Ming Lei X-Barracuda-Apparent-Source-IP: 45.125.195.13 X-Barracuda-BBL-IP: 45.125.195.13 To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH v2 5/8] fs: xfs: replace BIO_MAX_SECTORS with BIO_MAX_PAGES Date: Mon, 4 Apr 2016 00:31:06 +0800 X-ASG-Orig-Subj: [PATCH v2 5/8] fs: xfs: replace BIO_MAX_SECTORS with BIO_MAX_PAGES Message-Id: <1459701069-31406-6-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1459701069-31406-1-git-send-email-ming.lei@canonical.com> References: <1459701069-31406-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pf0-f173.google.com[209.85.192.173] X-Barracuda-Start-Time: 1459701113 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28425 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header BIO_MAX_PAGES is used as maximum count of bvecs, so replace BIO_MAX_SECTORS with BIO_MAX_PAGES since BIO_MAX_SECTORS is to be removed. Signed-off-by: Ming Lei --- fs/xfs/xfs_buf.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 9a2191b..b9ecb2d 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1161,9 +1161,7 @@ xfs_buf_ioapply_map( next_chunk: atomic_inc(&bp->b_io_remaining); - nr_pages = BIO_MAX_SECTORS >> (PAGE_SHIFT - BBSHIFT); - if (nr_pages > total_nr_pages) - nr_pages = total_nr_pages; + nr_pages = min(total_nr_pages, BIO_MAX_PAGES); bio = bio_alloc(GFP_NOIO, nr_pages); bio->bi_bdev = bp->b_target->bt_bdev; -- 1.9.1 From tom.leiming@gmail.com Sun Apr 3 11:33:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 9338D7CA1 for ; Sun, 3 Apr 2016 11:33:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 436738F8039 for ; Sun, 3 Apr 2016 09:33:15 -0700 (PDT) X-ASG-Debug-ID: 1459701193-04bdf011021dc800001-NocioJ Received: from mail-pa0-f46.google.com (mail-pa0-f46.google.com [209.85.220.46]) by cuda.sgi.com with ESMTP id nBCjBHiQixFMvjkr (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 03 Apr 2016 09:33:13 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.46 Received: by mail-pa0-f46.google.com with SMTP id zm5so127023613pac.0 for ; Sun, 03 Apr 2016 09:33:13 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=vvWLwrdI0i0NGeigC/dlcfi0ZqnMwl03QbSjs26C0Jk=; b=gtMih3VuxAvapsrJXBe7rhk5YrZrH7nsO6kSH+nlwVogvoMTi53X4l8TZs1YECV2Os q0lm1/0Is9lU1Vipp7lxnMS3yCmwaeNysiMRPdlKdUIgyg9UPtgV7E8JsNs+iOAlItFu 9PqdljOHyi9lXsxk4TX/TCLug+MQq3C72eof+BTH2cQYRkEiEs7qZ1CYHflo6BwxBgTR Cj1OSSPqF50rQb/92gtySptCSLulopWOb+te6k5vqwAbxlg5jdzK/rYTSXNnGZef26y5 x+FdfPjwtifyMPGLVb8VXaqyQKjqZkTXmYUt2OHxf0tAJmxOOX3EFLq7ll1YKsZUw7nY UxzQ== X-Gm-Message-State: AD7BkJJEdJpdbF0jHv4VFHqoGQE+t3zJ7LxYA0nH2STw4AwS3o1X4afAVtqM/pk6goq1Gw== X-Received: by 10.66.102.8 with SMTP id fk8mr46766794pab.12.1459701193495; Sun, 03 Apr 2016 09:33:13 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id y7sm33425957pfa.82.2016.04.03.09.31.57 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Sun, 03 Apr 2016 09:33:12 -0700 (PDT) From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH v2 6/8] block: bio: remove BIO_MAX_SECTORS Date: Mon, 4 Apr 2016 00:31:07 +0800 X-ASG-Orig-Subj: [PATCH v2 6/8] block: bio: remove BIO_MAX_SECTORS Message-Id: <1459701069-31406-7-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1459701069-31406-1-git-send-email-ming.lei@canonical.com> References: <1459701069-31406-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pa0-f46.google.com[209.85.220.46] X-Barracuda-Start-Time: 1459701193 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28425 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header No one need this macro, so remove it. The motivation is for supporting multipage bvecs, in which we only know what the max count of bvecs is supported in the bio, instead of max size or max sectors. Reviewed-by: Christoph Hellwig Signed-off-by: Ming Lei --- include/linux/bio.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/linux/bio.h b/include/linux/bio.h index 7f998ac..f7e1c27 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -42,7 +42,6 @@ #define BIO_MAX_PAGES 256 #define BIO_MAX_SIZE (BIO_MAX_PAGES << PAGE_CACHE_SHIFT) -#define BIO_MAX_SECTORS (BIO_MAX_SIZE >> 9) /* * upper 16 bits of bi_rw define the io priority of this bio -- 1.9.1 From tom.leiming@gmail.com Sun Apr 3 11:34:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D791A7CA1 for ; Sun, 3 Apr 2016 11:34:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A2636304048 for ; Sun, 3 Apr 2016 09:34:07 -0700 (PDT) X-ASG-Debug-ID: 1459701246-04cbb07ad7228b00001-NocioJ Received: from mail-pa0-f53.google.com (mail-pa0-f53.google.com [209.85.220.53]) by cuda.sgi.com with ESMTP id JWlr11QBmjFq4Gik (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 03 Apr 2016 09:34:06 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.53 Received: by mail-pa0-f53.google.com with SMTP id zm5so127032092pac.0 for ; Sun, 03 Apr 2016 09:34:06 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=f8RnSXiS0Ltm1s1Wqzt4C04rE3FJ1OU0KmBxRNLnWV4=; b=aWQvhZybkNNFt5lqkbvMuA3mzHbZlalGGzhMM2nyLVs1iTBMGjUYozit5ZR2Dh+PCP PIxFythnlygGXQjOi0C5Objpr/UdwLN/Xhwd1k00uGdUeLCEf1IoZsR7bIv1uHehzYvk oDAj2UkgyyBkjM7L/DuymUhmuxPgXRFmQIg3bu8hPtWXoTkKCYIV17j7itKQv3AjkT2o AOp5mfiCUKqGnWJ2xB+AgGMHmYCH8NQKeVXG1ZLRh0pz+/81Ny4IYDzWZtaXW4XuYuYS LQW424UInDqyhCoZuDeImZIVlgcygy+jF2tE5nxvlwoEH81aO8wxOAul9zgdNlMmVLLT P05Q== X-Gm-Message-State: AD7BkJJBvFhvjBs4q9CjqjEO+Pvq704z3CXBh/IWFdZmwfX+DpX4Odvn+d1c3vFMnuj7tw== X-Received: by 10.67.3.67 with SMTP id bu3mr46321741pad.39.1459701245894; Sun, 03 Apr 2016 09:34:05 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id 19sm33464137pfp.66.2016.04.03.09.34.04 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Sun, 03 Apr 2016 09:34:05 -0700 (PDT) From: Ming Lei X-Barracuda-Apparent-Source-IP: 45.125.195.13 X-Barracuda-BBL-IP: 45.125.195.13 To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH v2 7/8] block: drbd: avoid to use BIO_MAX_SIZE Date: Mon, 4 Apr 2016 00:33:59 +0800 X-ASG-Orig-Subj: [PATCH v2 7/8] block: drbd: avoid to use BIO_MAX_SIZE Message-Id: <1459701239-7274-1-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 X-Barracuda-Connect: mail-pa0-f53.google.com[209.85.220.53] X-Barracuda-Start-Time: 1459701246 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28425 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header drbd is the only user of BIO_MAX_SIZE, so use BIO_MAX_PAGES instead. Reviewed-by: Christoph Hellwig Signed-off-by: Ming Lei --- drivers/block/drbd/drbd_int.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index c227fd4..10bfff1 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h @@ -1327,14 +1327,14 @@ struct bm_extent { #endif #endif -/* BIO_MAX_SIZE is 256 * PAGE_CACHE_SIZE, +/* Estimate max bio size as 256 * PAGE_CACHE_SIZE, * so for typical PAGE_CACHE_SIZE of 4k, that is (1<<20) Byte. * Since we may live in a mixed-platform cluster, * we limit us to a platform agnostic constant here for now. * A followup commit may allow even bigger BIO sizes, * once we thought that through. */ #define DRBD_MAX_BIO_SIZE (1U << 20) -#if DRBD_MAX_BIO_SIZE > BIO_MAX_SIZE +#if DRBD_MAX_BIO_SIZE > (BIO_MAX_PAGES << PAGE_CACHE_SHIFT) #error Architecture not supported: DRBD_MAX_BIO_SIZE > BIO_MAX_SIZE #endif #define DRBD_MAX_BIO_SIZE_SAFE (1U << 12) /* Works always = 4k */ -- 1.9.1 From tom.leiming@gmail.com Sun Apr 3 11:34:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 AC0857CA1 for ; Sun, 3 Apr 2016 11:34:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 724FC304032 for ; Sun, 3 Apr 2016 09:34:20 -0700 (PDT) X-ASG-Debug-ID: 1459701259-04bdf011021dc8e0001-NocioJ Received: from mail-pf0-f169.google.com (mail-pf0-f169.google.com [209.85.192.169]) by cuda.sgi.com with ESMTP id AcxTpgZ6etp1CWEf (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 03 Apr 2016 09:34:19 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.169 Received: by mail-pf0-f169.google.com with SMTP id e128so105204049pfe.3 for ; Sun, 03 Apr 2016 09:34:19 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=R8Ql29GMmh5nJShu9LJUoMgzG2BrqiW1k1cWNbNUr8c=; b=E3qCIwIvBQKm4yLpGYecCLHw3bLTx6N/a4BfndIamyCOgyQb6vJN2vAA0cK0Uaxhuv cbzwYga5J2LVTf4h5KFhsXUVLD3rRhjc/JVErP4f9QjlEfbqQRcNk7/Ad91NWm6mLkYt 6d/yyy4TNLGO+0uT7gljNbu928jPQTAUpIX0K6l5ImrQ9xSboX9X/ALUe95YL68WuYea airUIzrlkfZ+vFlXHr3f/VDWCLD9AmeMiVy2h9zanhkgjUDa4RHjkEYfwwQ/r/lzRNWy ftyQdg1yL2jot58ccJG7kXRPUKz8n6/sF4JV6ZlR2xy9OipjeQ45bicNUMpBQdODQSZ/ dDAQ== X-Gm-Message-State: AD7BkJJpQJCvBhqtiOIvYVTYIvhyZFX1hgNMB03ycMSSmokztPxWd8AYSAqPpzzp0fE2hQ== X-Received: by 10.98.67.199 with SMTP id l68mr13994490pfi.18.1459701258975; Sun, 03 Apr 2016 09:34:18 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id l4sm33433166pfi.73.2016.04.03.09.34.17 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Sun, 03 Apr 2016 09:34:18 -0700 (PDT) From: Ming Lei X-Barracuda-Apparent-Source-IP: 45.125.195.13 X-Barracuda-BBL-IP: 45.125.195.13 To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH v2 8/8] block: bio: remove BIO_MAX_SIZE Date: Mon, 4 Apr 2016 00:34:12 +0800 X-ASG-Orig-Subj: [PATCH v2 8/8] block: bio: remove BIO_MAX_SIZE Message-Id: <1459701252-8016-1-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 X-Barracuda-Connect: mail-pf0-f169.google.com[209.85.192.169] X-Barracuda-Start-Time: 1459701259 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28425 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header No one need this macro now, so remove it. The motivation is for supporting multipage bvecs, in which we only know what the max count of bvecs is supported in the bio, instead of max bio size. Reviewed-by: Christoph Hellwig Signed-off-by: Ming Lei --- include/linux/bio.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/linux/bio.h b/include/linux/bio.h index f7e1c27..c8553fe 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -41,7 +41,6 @@ #endif #define BIO_MAX_PAGES 256 -#define BIO_MAX_SIZE (BIO_MAX_PAGES << PAGE_CACHE_SHIFT) /* * upper 16 bits of bi_rw define the io priority of this bio -- 1.9.1 From fengguang.wu@intel.com Sun Apr 3 13:13:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=FAKE_REPLY_C autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 66F7C7CB8 for ; Sun, 3 Apr 2016 13:13:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 393338F804C for ; Sun, 3 Apr 2016 11:13:08 -0700 (PDT) X-ASG-Debug-ID: 1459707186-04cb6c246224efc0001-NocioJ Received: from mga04.intel.com ([192.55.52.120]) by cuda.sgi.com with ESMTP id MpEpKznWyCDrawEA for ; Sun, 03 Apr 2016 11:13:07 -0700 (PDT) X-Barracuda-Envelope-From: fengguang.wu@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.120 X-ASG-Whitelist: Client Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga104.fm.intel.com with ESMTP; 03 Apr 2016 11:13:06 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,438,1455004800"; d="gz'50?scan'50,208,50";a="937412677" Received: from bee.sh.intel.com (HELO bee) ([10.239.97.14]) by fmsmga001.fm.intel.com with ESMTP; 03 Apr 2016 11:13:03 -0700 Received: from kbuild by bee with local (Exim 4.83) (envelope-from ) id 1ammWC-00061D-3q; Mon, 04 Apr 2016 02:13:00 +0800 Date: Mon, 4 Apr 2016 02:12:25 +0800 From: kbuild test robot To: Ming Lei Cc: kbuild-all@01.org, Jens Axboe , linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: Re: [PATCH v2 2/8] block: move two bvec structure into bvec.h Message-ID: <201604040222.awrue5lX%fengguang.wu@intel.com> X-ASG-Orig-Subj: Re: [PATCH v2 2/8] block: move two bvec structure into bvec.h MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="YZ5djTAD1cGYuMQK" Content-Disposition: inline In-Reply-To: <1459701069-31406-3-git-send-email-ming.lei@canonical.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: fengguang.wu@intel.com X-SA-Exim-Scanned: No (on bee); SAEximRunCond expanded to false X-Barracuda-Connect: UNKNOWN[192.55.52.120] X-Barracuda-Start-Time: 1459707186 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 --YZ5djTAD1cGYuMQK Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi Ming, [auto build test ERROR on block/for-next] [also build test ERROR on v4.6-rc2 next-20160401] [if your patch is applied to the wrong git tree, please drop us a note to help improving the system] url: https://github.com/0day-ci/linux/commits/Ming-Lei/block-prepare-for-multipage-bvecs/20160404-003648 base: https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next config: arm-at91_dt_defconfig (attached as .config) reproduce: wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=arm All errors (new ones prefixed by >>): In file included from include/linux/blk_types.h:9:0, from arch/arm/include/asm/io.h:28, from drivers/input/joydev.c:15: include/linux/bvec.h: In function 'bvec_iter_advance': >> include/linux/bvec.h:69:2: error: implicit declaration of function 'WARN_ONCE' [-Werror=implicit-function-declaration] WARN_ONCE(bytes > iter->bi_size, ^ >> include/linux/bvec.h:73:3: error: implicit declaration of function 'min' [-Werror=implicit-function-declaration] unsigned len = min(bytes, bvec_iter_len(bv, *iter)); ^ cc1: some warnings being treated as errors vim +/WARN_ONCE +69 include/linux/bvec.h 0d61ba15 Ming Lei 2016-04-04 63 .bv_offset = bvec_iter_offset((bvec), (iter)), \ 0d61ba15 Ming Lei 2016-04-04 64 }) 0d61ba15 Ming Lei 2016-04-04 65 0d61ba15 Ming Lei 2016-04-04 66 static inline void bvec_iter_advance(struct bio_vec *bv, struct bvec_iter *iter, 0d61ba15 Ming Lei 2016-04-04 67 unsigned bytes) 0d61ba15 Ming Lei 2016-04-04 68 { 0d61ba15 Ming Lei 2016-04-04 @69 WARN_ONCE(bytes > iter->bi_size, 0d61ba15 Ming Lei 2016-04-04 70 "Attempted to advance past end of bvec iter\n"); 0d61ba15 Ming Lei 2016-04-04 71 0d61ba15 Ming Lei 2016-04-04 72 while (bytes) { 0d61ba15 Ming Lei 2016-04-04 @73 unsigned len = min(bytes, bvec_iter_len(bv, *iter)); 0d61ba15 Ming Lei 2016-04-04 74 0d61ba15 Ming Lei 2016-04-04 75 bytes -= len; 0d61ba15 Ming Lei 2016-04-04 76 iter->bi_size -= len; :::::: The code at line 69 was first introduced by commit :::::: 0d61ba15b7eb4a7478dae53947aaaf898a1bbf30 block: move bvec iterator into include/linux/bvec.h :::::: TO: Ming Lei :::::: CC: 0day robot --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation --YZ5djTAD1cGYuMQK Content-Type: application/octet-stream Content-Disposition: attachment; filename=".config.gz" Content-Transfer-Encoding: base64 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 --YZ5djTAD1cGYuMQK-- From david@fromorbit.com Sun Apr 3 20:28:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 539E57CA0 for ; Sun, 3 Apr 2016 20:28:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id AA9B3AC003 for ; Sun, 3 Apr 2016 18:28:54 -0700 (PDT) X-ASG-Debug-ID: 1459733331-04cbb07ad62418c0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id b0uj7SywtGaKPKGB for ; Sun, 03 Apr 2016 18:28:51 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2B5CwC7wgFXPDGaLHldgzeBUIZqoCcBAQQGjBKFZoQPhgcCAgEBAoEkTQEBAQEBAQcBAQEBQkCEQgEBBCcTHCMQCAMOCgklDwUlAwcaE4gmu0gBAQEBAQUBAQEBHBmFP4USh2qCKwWYAY1+jxmPGoJjAxmBXCowiAoBAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail05.adl6.internode.on.net with ESMTP; 04 Apr 2016 10:58:50 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1amtJx-0006en-6d; Mon, 04 Apr 2016 11:28:49 +1000 Date: Mon, 4 Apr 2016 11:28:49 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/7] fs: introduce iomap infrastructure Message-ID: <20160404012849.GB11238@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/7] fs: introduce iomap infrastructure References: <1457989370-6904-1-git-send-email-hch@lst.de> <1457989370-6904-3-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1457989370-6904-3-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1459733331 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28434 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Mar 14, 2016 at 10:02:45PM +0100, Christoph Hellwig wrote: > Add infrastructure for multipage buffered writes. This is implemented > using an main iterator that applies an actor function to a range that > can be written. > > This infrastucture is used to implement a buffered write helper, one > to zero file ranges and one to implement the ->page_mkwrite VM > operations. All of them borrow a fair amount of code from fs/buffers. > for now by using an internal version of __block_write_begin that > gets passed an iomap and builds the corresponding buffer head. > > The file system is gets a set of paired ->iomap_begin and ->iomap_end > calls which allow it to map/reserve a range and get a notification > once the write code is finished with it. > > Based on earlier code from Dave Chinner. > > Signed-off-by: Christoph Hellwig ..... > +/* > + * Execute a iomap write on a segment of the mapping that spans a > + * contiguous range of pages that have identical block mapping state. > + * > + * This avoids the need to map pages individually, do individual allocations > + * for each page and most importantly avoid the need for filesystem specific > + * locking per page. Instead, all the operations are amortised over the entire > + * range of pages. It is assumed that the filesystems will lock whatever > + * resources they require in the iomap_begin call, and release them in the > + * iomap_end call. > + */ > +static ssize_t > +iomap_write_segment(struct inode *inode, loff_t pos, ssize_t length, > + unsigned flags, struct iomap_ops *ops, void *data, > + write_actor_t actor) This requires external iteration to write the entire range required if the allocation does not cover the entire length requested (i.e. written < length). Also, if the actor returns an error into written, that gets ignored and the return status is whatever the ->iomap_end call returns. .... > +int iomap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf, > + struct iomap_ops *ops) > +{ > + struct page *page = vmf->page; > + struct inode *inode = file_inode(vma->vm_file); > + unsigned long length; > + loff_t size; > + int ret; > + > + lock_page(page); > + size = i_size_read(inode); > + if ((page->mapping != inode->i_mapping) || > + (page_offset(page) > size)) { > + /* We overload EFAULT to mean page got truncated */ > + ret = -EFAULT; > + goto out_unlock; > + } > + > + /* page is wholly or partially inside EOF */ > + if (((page->index + 1) << PAGE_CACHE_SHIFT) > size) > + length = size & ~PAGE_CACHE_MASK; > + else > + length = PAGE_CACHE_SIZE; > + > + ret = iomap_write_segment(inode, page_offset(page), length, > + IOMAP_ALLOCATE, ops, page, iomap_page_mkwrite_actor); > + if (unlikely(ret < 0)) > + goto out_unlock; > + set_page_dirty(page); > + wait_for_stable_page(page); > + return 0; > +out_unlock: > + unlock_page(page); > + return ret; > +} Because we don't handle short segment writes here, iomap_page_mkwrite() fails to allocate blocks on partial pages when block size < page size. This can be seen by generic/030 on XFS with a 1k block size. Patch below fixes the issue, as well as the fact that iomap_page_mkwrite_actor() needs to return the count of bytes "written", not zero on success for iomap_write_segment() to do the right thing on multi-segment writes. Cheers, Dave. -- Dave Chinner david@fromorbit.com iomap: fix page_mkwrite on bs < ps Fixes generic/030. Signed-off-by: Dave Chinner --- fs/iomap.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/fs/iomap.c b/fs/iomap.c index d4528cb..c4d3511 100644 --- a/fs/iomap.c +++ b/fs/iomap.c @@ -337,10 +337,16 @@ iomap_page_mkwrite_actor(struct inode *inode, loff_t pos, ssize_t length, int ret; ret = __block_write_begin_int(page, 0, length, NULL, iomap); - if (!ret) - ret = block_commit_write(page, 0, length); + if (ret) + return ret; + + /* + * block_commit_write always returns 0, we need to return the length we + * successfully allocated. + */ + block_commit_write(page, 0, length); + return length; - return ret; } int iomap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf, @@ -350,7 +356,8 @@ int iomap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf, struct inode *inode = file_inode(vma->vm_file); unsigned long length; loff_t size; - int ret; + loff_t offset; + ssize_t ret; lock_page(page); size = i_size_read(inode); @@ -367,10 +374,17 @@ int iomap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf, else length = PAGE_CACHE_SIZE; - ret = iomap_write_segment(inode, page_offset(page), length, - IOMAP_ALLOCATE, ops, page, iomap_page_mkwrite_actor); - if (unlikely(ret < 0)) - goto out_unlock; + offset = page_offset(page); + while (length > 0) { + ret = iomap_write_segment(inode, offset, length, + IOMAP_ALLOCATE, ops, page, + iomap_page_mkwrite_actor); + if (unlikely(ret < 0)) + goto out_unlock; + offset += ret; + length -= ret; + } + set_page_dirty(page); wait_for_stable_page(page); return 0; From david@fromorbit.com Sun Apr 3 20:47:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 864D77CA0 for ; Sun, 3 Apr 2016 20:47:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5A2798F8035 for ; Sun, 3 Apr 2016 18:47:41 -0700 (PDT) X-ASG-Debug-ID: 1459734458-04cbb07ad6241cc0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id tuk7yb7cECYnEaPv for ; Sun, 03 Apr 2016 18:47:38 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AJCwBpxwFXPDGaLHldgzeBUIZqoCcBAQQGjBKFZoQPhgcEAgKBJE0BAQEBAQEHAQEBAUJAhEIBAQQ6HCMQCAMOCgklDwUlAwcaE4gmu0sBAQEHAgEdGYU/hRKHaoIrBZgBjX6PGY8agmMcgVwqMIgKAQEB Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail05.adl6.internode.on.net with ESMTP; 04 Apr 2016 11:17:06 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1amtbe-0006g2-Ih; Mon, 04 Apr 2016 11:47:06 +1000 Date: Mon, 4 Apr 2016 11:47:06 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/7] fs: introduce iomap infrastructure Message-ID: <20160404014706.GC11238@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/7] fs: introduce iomap infrastructure References: <1457989370-6904-1-git-send-email-hch@lst.de> <1457989370-6904-3-git-send-email-hch@lst.de> <20160404012849.GB11238@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160404012849.GB11238@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: 1459734458 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28434 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Apr 04, 2016 at 11:28:49AM +1000, Dave Chinner wrote: > On Mon, Mar 14, 2016 at 10:02:45PM +0100, Christoph Hellwig wrote: > > Add infrastructure for multipage buffered writes. This is implemented > > using an main iterator that applies an actor function to a range that > > can be written. .... > Patch below fixes the issue, as well as the fact that > iomap_page_mkwrite_actor() needs to return the count of bytes > "written", not zero on success for iomap_write_segment() to do the > right thing on multi-segment writes. Hmm - this fix then breaks generic/029. Christoph, can you look into these issues? Cheers, Dave. -- Dave Chinner david@fromorbit.com From michel.piquard1@gmail.com Sun Apr 3 22:16:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.5 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6AAAB7CA0 for ; Sun, 3 Apr 2016 22:16:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D6899AC001 for ; Sun, 3 Apr 2016 20:16:33 -0700 (PDT) X-ASG-Debug-ID: 1459739789-04cbb07ad62434e0001-NocioJ Received: from vweb16.nitrado.net (vweb16.nitrado.net [78.143.39.37]) by cuda.sgi.com with ESMTP id HW2tPdEhQyU7BpHS (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Sun, 03 Apr 2016 20:16:30 -0700 (PDT) X-Barracuda-Envelope-From: michel.piquard1@gmail.com X-Barracuda-Apparent-Source-IP: 78.143.39.37 Received: by vweb16.nitrado.net (Postfix, from userid 12326) id 786AB36F7D1; Mon, 4 Apr 2016 05:08:21 +0200 (CEST) To: xfs@oss.sgi.com Subject: =?utf-8?Q?PD=39=35SQ=38=35?= Date: Mon, 4 Apr 2016 05:08:21 +0200 X-ASG-Orig-Subj: =?utf-8?Q?PD=39=35SQ=38=35?= From: =?utf-8?Q?IMpots=2eGouv=2eFr?= Message-ID: <1ea65349bb5ae3996ad2e477a3c50959@ni941410_1.vweb16.nitrado.net> X-Priority: 3 MIME-Version: 1.0 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: vweb16.nitrado.net[78.143.39.37] X-Barracuda-Start-Time: 1459739790 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0713, HTML_MESSAGE, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28436 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.50 BSF_SC0_MV0713 Custom rule MV0713
 

                                     

     
Bonjour,

Aprés les derniers calculs de vos impôts sur le revenu, nous avons déterminé que vous êtes admissible à recevoir un remboursement d'impot de 226,80 Euro
Veuillez nous soumettre votre demande de remboursement pour nous permettre de la traiter dans les plus bref délai.

 Accéder au formulaire de remboursement  
 

La soumission de dossier non valide ou inscription aprés une certaine Iimite peut retardé votre remboursement.

Cordialenment.

Direction générale des Finances Publiques


N.B: Le traitement de votre demande de remboursement se fait dans une période de 10 jours ouvrable


* Les informations à caractère personnel recueillies dans le cadre du présent document sont obligatoires pour le traitement de votre demande.

 

   
         
                             
 
                                         © Ministère des finances et des comptes publics
From s.priebe@profihost.ag Mon Apr 4 01:13:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 61F8E7CA0 for ; Mon, 4 Apr 2016 01:13:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 07BC1304032 for ; Sun, 3 Apr 2016 23:13:05 -0700 (PDT) X-ASG-Debug-ID: 1459750378-04bdf01104201b50001-NocioJ Received: from mail-ph.de-nserver.de (mail-ph.de-nserver.de [85.158.179.214]) by cuda.sgi.com with ESMTP id 2OEjYyA7Xu6Vnn6X (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 03 Apr 2016 23:12:59 -0700 (PDT) X-Barracuda-Envelope-From: s.priebe@profihost.ag X-Barracuda-Apparent-Source-IP: 85.158.179.214 Received: (qmail 24561 invoked from network); 4 Apr 2016 08:12:57 +0200 X-Fcrdns: No Received: from phoffice.de-nserver.de (HELO [10.11.11.93]) (185.39.223.5) (smtp-auth username hostmaster@profihost.com, mechanism plain) by mail-ph.de-nserver.de (qpsmtpd/0.92) with (ECDHE-RSA-AES256-SHA encrypted) ESMTPSA; Mon, 04 Apr 2016 08:12:57 +0200 Subject: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage To: Brian Foster X-ASG-Orig-Subj: Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage References: <20160304191329.GC3758@bfoster.bfoster> <56D9E9BE.40101@profihost.ag> <20160304210341.GA8035@bfoster.bfoster> <20160305224845.GR30721@dastard> <56F299E3.4020703@profihost.ag> <20160323140736.GD43073@bfoster.bfoster> <56F3A101.1020300@profihost.ag> <56F3A213.2020908@profihost.ag> <20160324111703.GA4068@bfoster.bfoster> <56F3DACB.8040305@profihost.ag> <20160324122417.GB4068@bfoster.bfoster> Cc: linux-fsdevel@vger.kernel.org, "xfs-masters@oss.sgi.com" , "xfs@oss.sgi.com" From: Stefan Priebe - Profihost AG Message-ID: <570205E9.4010004@profihost.ag> Date: Mon, 4 Apr 2016 08:12:57 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <20160324122417.GB4068@bfoster.bfoster> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-User-Auth: Auth by hostmaster@profihost.com through 185.39.223.5 X-Barracuda-Connect: mail-ph.de-nserver.de[85.158.179.214] X-Barracuda-Start-Time: 1459750379 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28439 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Am 24.03.2016 um 13:24 schrieb Brian Foster: > On Thu, Mar 24, 2016 at 01:17:15PM +0100, Stefan Priebe - Profihost AG wrote: >> >> Am 24.03.2016 um 12:17 schrieb Brian Foster: >>> On Thu, Mar 24, 2016 at 09:15:15AM +0100, Stefan Priebe - Profihost AG wrote: >>>> >>>> Am 24.03.2016 um 09:10 schrieb Stefan Priebe - Profihost AG: >>>>> >>>>> Am 23.03.2016 um 15:07 schrieb Brian Foster: >>>>>> On Wed, Mar 23, 2016 at 02:28:03PM +0100, Stefan Priebe - Profihost AG wrote: >>>>>>> sorry new one the last one got mangled. Comments inside. >>>>>>> >>>>>>> Am 05.03.2016 um 23:48 schrieb Dave Chinner: >>>>>>>> On Fri, Mar 04, 2016 at 04:03:42PM -0500, Brian Foster wrote: >>>>>>>>> On Fri, Mar 04, 2016 at 09:02:06PM +0100, Stefan Priebe wrote: >>>>>>>>>> Am 04.03.2016 um 20:13 schrieb Brian Foster: >>>>>>>>>>> On Fri, Mar 04, 2016 at 07:47:16PM +0100, Stefan Priebe wrote: >>>>>>>>>>>> Am 20.02.2016 um 19:02 schrieb Stefan Priebe - Profihost AG: >>>>>>>>>>>>> >>>>>>>>>>>>>> Am 20.02.2016 um 15:45 schrieb Brian Foster : >>>>>>>>>>>>>> >>>>>>>>>>>>>>> On Sat, Feb 20, 2016 at 09:02:28AM +0100, Stefan Priebe wrote: >>>>>> ... >>>>>>> >>>>>>> This has happened again on 8 different hosts in the last 24 hours >>>>>>> running 4.4.6. >>>>>>> >>>>>>> All of those are KVM / Qemu hosts and are doing NO I/O except the normal >>>>>>> OS stuff as the VMs have remote storage. So no database, no rsync on >>>>>>> those hosts - just the OS doing nearly nothing. >>>>>>> >>>>>>> All those show: >>>>>>> [153360.287040] WARNING: CPU: 0 PID: 109 at fs/xfs/xfs_aops.c:1234 >>>>>>> xfs_vm_releasepage+0xe2/0xf0() >>>>>>> >>>>>> >>>>>> Ok, well at this point the warning isn't telling us anything beyond >>>>>> you're reproducing the problem. We can't really make progress without >>>>>> more information. We don't necessarily know what application or >>>>>> operations caused this by the time it occurs, but perhaps knowing what >>>>>> file is affected could give us a hint. >>>>>> >>>>>> We have the xfs_releasepage tracepoint, but that's unconditional and so >>>>>> might generate a lot of noise by default. Could you enable the >>>>>> xfs_releasepage tracepoint and hunt for instances where delalloc != 0? >>>>>> E.g., we could leave a long running 'trace-cmd record -e >>>>>> "xfs:xfs_releasepage" ' command on several boxes and wait for the >>>>>> problem to occur. Alternatively (and maybe easier), run 'trace-cmd start >>>>>> -e "xfs:xfs_releasepage"' and leave something like 'cat >>>>>> /sys/kernel/debug/tracing/trace_pipe | grep -v "delalloc 0" > >>>>>> ~/trace.out' running to capture instances. >>>> >>>> Isn't the trace a WARN_ONCE? So it does not reoccur or can i check the >>>> it in the trace.out even the WARN_ONCE was already triggered? >>>> >>> >>> The tracepoint is independent from the warning (see >>> xfs_vm_releasepage()), so the tracepoint will fire every invocation of >>> the function regardless of whether delalloc blocks still exist at that >>> point. That creates the need to filter the entries. >>> >>> With regard to performance, I believe the tracepoints are intended to be >>> pretty lightweight. I don't think it should hurt to try it on a box, >>> observe for a bit and make sure there isn't a huge impact. Note that the >>> 'trace-cmd record' approach will save everything to file, so that's >>> something to consider I suppose. >> >> Tests / cat is running. Is there any way to test if it works? Or is it >> enough that cat prints stuff from time to time but does not match -v >> delalloc 0 >> > > What is it printing where delalloc != 0? You could always just cat > trace_pipe and make sure the event is firing, it's just that I suspect > most entries will have delalloc == unwritten == 0. > > Also, while the tracepoint fires independent of the warning, it might > not be a bad idea to restart a system that has already seen the warning > since boot, just to provide some correlation or additional notification > when the problem occurs. I still wasn't able to catch one with trace-cmd. But i notice that it happens mostly in the first 48hours after a reboot. All systems running since some days but noone triggers this again. All systems who have triggered this bug got rebootet. Stefan From xiaonshongs@yandex.com Mon Apr 4 01:32:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=BANG_GUAR,FREEMAIL_FROM, T_FILL_THIS_FORM_SHORT autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7B51F7CA0 for ; Mon, 4 Apr 2016 01:32:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 31459304032 for ; Sun, 3 Apr 2016 23:32:40 -0700 (PDT) X-ASG-Debug-ID: 1459751557-04bdf01105202010001-NocioJ Received: from taoshouhou.com (taoshouhou.com [104.148.75.81]) by cuda.sgi.com with ESMTP id Kb4B49bJOuAYv0WE for ; Sun, 03 Apr 2016 23:32:38 -0700 (PDT) X-Barracuda-Envelope-From: xiaonshongs@yandex.com X-Barracuda-Apparent-Source-IP: 104.148.75.81 To: xfs@oss.sgi.com Subject: Distributors Needed Message-ID: <005dd11527570a2810eadff1a9eca999@shrimphouse.com> X-ASG-Orig-Subj: Distributors Needed Date: Mon, 04 Apr 2016 08:32:10 +0200 From: "Jason North" Reply-To: wokanshui@aliyun.com MIME-Version: 1.0 X-Mailer-LID: 3 X-Mailer-RecptId: 4686092 X-Mailer-SID: 1267 X-Mailer-Sent-By: 1 Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: taoshouhou.com[104.148.75.81] X-Barracuda-Start-Time: 1459751557 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.24 X-Barracuda-Spam-Status: No, SCORE=1.24 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=ADVANCE_FEE_1, BANG_GUAR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28439 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.24 BANG_GUAR BODY: Something is emphatically guaranteed 0.00 ADVANCE_FEE_1 Appears to be advance fee fraud (Nigerian 419) 26 YEAR OLD U.S. COMPANY NEEDS DISTRIBUTORS IN MANY COUNTRIES for our amazing slip-resistant floor product. Exclusive Distributorships Available One 30 minute application with our Amazing Anti-Slip Floor Treatment will make floors slip-resistant and safe for 4 years - Guaranteed! Use Indoors or Outdoors No Change in Appearance Some of our satisfied Customers: McDonalds, Burger King, KFC, Hilton, Sheraton, Pfizer, Mercedes, BMW, Holiday Inn, Kroger, Miami Children's Hospital, etc. Typical Prospects: Hotels, Restaurants, Supermarkets, Office Buildings, Retail stores, etc. Use on Ceramic, Porcelain and quarry Tiles, marble, granite, concrete, terrazzo, etc. Please contact us for details and to see if there is a distributorship available in your country. INCLUDE YOUR NAME, COUNTRY and E-MAIL ADDRESS. REQUIRED - $3,000 USD - $5,000 USD INVENTORY INVESTMENT, SECURED BY PRODUCT Jason North Contact: blirich@sina.com From tom.leiming@gmail.com Mon Apr 4 01:56:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 8D7597CA0 for ; Mon, 4 Apr 2016 01:56:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5FCA6304032 for ; Sun, 3 Apr 2016 23:56:45 -0700 (PDT) X-ASG-Debug-ID: 1459753002-04cb6c246226db70001-NocioJ Received: from mail-pa0-f41.google.com (mail-pa0-f41.google.com [209.85.220.41]) by cuda.sgi.com with ESMTP id 34BuJrDD2ADLCcR8 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 03 Apr 2016 23:56:43 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.41 Received: by mail-pa0-f41.google.com with SMTP id zm5so137948501pac.0 for ; Sun, 03 Apr 2016 23:56:43 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=nUWfte89LKdWDnsiTQDaWRjP9Y8WwMOfd/XbNlNDSSo=; b=Hn3G/Wg0d5QVH5k9kXorjBW27K0A1o7+DwLnHOxj7UI75+QBsF+OMv6lYeh7cHeyAX 1MhIxpZ9tosmBR3YFTgh7/Cq7UnwyTyDA3I37FZanDnFJ+nlrpZHdKdm0XkuXyTYgzkx AwZTXFTDi93xEStPXHxcJhjdEJxYWrKoZMmTXFXdF8orvlUrCn08MDbHK+pjdzbouF0a HN/np2NqhSu3VQze/uRQ+g0HmwPCdv+zEPkOvhPEVwg0XzP2TOqKmohpw/xL3DkaqTOO 6ig6qEzhBDJQYnXhW5VXt0oRst8sbc3m/K/Z8cngBtQnGbffokKGkLmI0rgymg94rINb vtsQ== X-Gm-Message-State: AD7BkJLvFcoqcT4yhx3MVYIXaae3UC7cwCH8r7OAWkjAFN0aKkKMU+JIZPDVqvoeQ+3YxQ== X-Received: by 10.66.157.69 with SMTP id wk5mr49661211pab.40.1459753002719; Sun, 03 Apr 2016 23:56:42 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id n74sm36694954pfa.45.2016.04.03.23.56.41 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Sun, 03 Apr 2016 23:56:41 -0700 (PDT) From: Ming Lei X-Barracuda-Apparent-Source-IP: 45.125.195.13 X-Barracuda-BBL-IP: 45.125.195.13 To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh Subject: [PATCH v3 0/8] block: prepare for multipage bvecs Date: Mon, 4 Apr 2016 14:56:26 +0800 X-ASG-Orig-Subj: [PATCH v3 0/8] block: prepare for multipage bvecs Message-Id: <1459752994-2205-1-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 X-Barracuda-Connect: mail-pa0-f41.google.com[209.85.220.41] X-Barracuda-Start-Time: 1459753003 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi, Interests[1] have been shown in multipage bvecs, so this patchset try to prepare for the support and do two things: 1) the 1st 4 patches use bvec iterator to implement iterate_bvec(), then we can drop the non-standard way for iterating bvec, which can be thought as a good cleanup for lib/iov_iter.c 2) remove BIO_MAX_SECTORS & BIO_MAX_SIZE, and now there is only one user for each. Once multipage bvecs is introduced, one bio may hold lots of sectors, and we should always use sort of BIO_MAX_VECS which should be introduced in future and is similiar with current BIO_MAX_PAGES. xfstests(-a auto) have been run and no regression found by this patchset against linus v4.6-rc1-next-20160329. V3: - include kenrel.h & bug.h in bvec.h for fix comiling failure on arm as reported by 0day ktest - build test on arm & arm64 V2: - rename bvec_iter.h as bvec.h - always include bvec.h into blk_types.h as suggested by Christoph V1: - don't move BIO_MAX_* to bvec_iter.h as pointed out by Christoph - run xfstests against v4.6-rc1-next-20160329 - add Reviewed-by - for 1,4 and 5, Reviewd-by not added, Christoph still expressed 'this looks fine to me.' drivers/block/drbd/drbd_int.h | 4 +- fs/xfs/xfs_buf.c | 4 +- include/linux/bio.h | 52 ----------------------- include/linux/blk_types.h | 22 +--------- include/linux/bvec.h | 96 +++++++++++++++++++++++++++++++++++++++++++ lib/iov_iter.c | 30 +++++--------- 6 files changed, 110 insertions(+), 98 deletions(-) Thanks, Ming From tom.leiming@gmail.com Mon Apr 4 01:56:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2D22F7CA0 for ; Mon, 4 Apr 2016 01:56:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id F31A58F8035 for ; Sun, 3 Apr 2016 23:56:51 -0700 (PDT) X-ASG-Debug-ID: 1459753009-04cbb07ad62474b0001-NocioJ Received: from mail-pf0-f174.google.com (mail-pf0-f174.google.com [209.85.192.174]) by cuda.sgi.com with ESMTP id 5SBQsHboeJlyVBIc (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 03 Apr 2016 23:56:49 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.174 Received: by mail-pf0-f174.google.com with SMTP id n1so32984591pfn.2 for ; Sun, 03 Apr 2016 23:56:49 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=TUjtEP4ZnKHQAqMdFUz4J64TVDHwUfWLqInHmr/XO5Y=; b=M3QzpaDbY2dZpBq45MP8z2KSDQR96oSXsH8vxqhJ/rDpyYp9F1WFcNwzKMwayTZUCT K/bpTxCTQa8+KZ5vC0pATX5rJMmuqkJwlvmgbS7nlMlaR/k/bQS7mlm6NUvj+P2AoPe7 FvNl/yF07aflkT33ejkkyh9ZV2pRUf+YYLvKMl4su7zwQjNX32uKKenhI38xrTPUjzyw Xu+J13JgbMbb7g8ONPx63JvEBFVtPjVbZ/fV8wtaJN5db5PAObE5TNngXbG5PuGd0GBr gK9URiDRy5+SmCgK3ykaEDUJJu+lKwSB4nMuozPg+dUyTMHumfBoiUNE7wXWI8YDU5dW XZIg== X-Gm-Message-State: AD7BkJLlSdaC4X51p3EiZhNNPjmPRDV26BSTAuUwQfY5v3iPsMYFEYA/q1un9uNK1sXSlA== X-Received: by 10.98.10.25 with SMTP id s25mr18076250pfi.158.1459753008115; Sun, 03 Apr 2016 23:56:48 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id ta2sm38796923pab.42.2016.04.03.23.56.46 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Sun, 03 Apr 2016 23:56:47 -0700 (PDT) From: Ming Lei X-Barracuda-Apparent-Source-IP: 45.125.195.13 X-Barracuda-BBL-IP: 45.125.195.13 To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH v3 1/8] block: move bvec iterator into include/linux/bvec.h Date: Mon, 4 Apr 2016 14:56:27 +0800 X-ASG-Orig-Subj: [PATCH v3 1/8] block: move bvec iterator into include/linux/bvec.h Message-Id: <1459752994-2205-2-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1459752994-2205-1-git-send-email-ming.lei@canonical.com> References: <1459752994-2205-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pf0-f174.google.com[209.85.192.174] X-Barracuda-Start-Time: 1459753009 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header bvec iterator helpers should be used to implement by iterate_bvec():lib/iov_iter.c too, and move them into one header, so that we can keep bvec iterator header out of CONFIG_BLOCK. Then we can remove the reinventing of wheel in iterate_bvec(). Signed-off-by: Ming Lei --- include/linux/bio.h | 51 +----------------------------------- include/linux/bvec.h | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 50 deletions(-) create mode 100644 include/linux/bvec.h diff --git a/include/linux/bio.h b/include/linux/bio.h index 88bc64f..78cf737 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -31,6 +31,7 @@ /* struct bio, bio_vec and BIO_* flags are defined in blk_types.h */ #include +#include #define BIO_DEBUG @@ -57,29 +58,6 @@ (bio)->bi_rw |= ((unsigned long) (prio) << BIO_PRIO_SHIFT); \ } while (0) -/* - * various member access, note that bio_data should of course not be used - * on highmem page vectors - */ -#define __bvec_iter_bvec(bvec, iter) (&(bvec)[(iter).bi_idx]) - -#define bvec_iter_page(bvec, iter) \ - (__bvec_iter_bvec((bvec), (iter))->bv_page) - -#define bvec_iter_len(bvec, iter) \ - min((iter).bi_size, \ - __bvec_iter_bvec((bvec), (iter))->bv_len - (iter).bi_bvec_done) - -#define bvec_iter_offset(bvec, iter) \ - (__bvec_iter_bvec((bvec), (iter))->bv_offset + (iter).bi_bvec_done) - -#define bvec_iter_bvec(bvec, iter) \ -((struct bio_vec) { \ - .bv_page = bvec_iter_page((bvec), (iter)), \ - .bv_len = bvec_iter_len((bvec), (iter)), \ - .bv_offset = bvec_iter_offset((bvec), (iter)), \ -}) - #define bio_iter_iovec(bio, iter) \ bvec_iter_bvec((bio)->bi_io_vec, (iter)) @@ -193,33 +171,6 @@ static inline void *bio_data(struct bio *bio) #define bio_for_each_segment_all(bvl, bio, i) \ for (i = 0, bvl = (bio)->bi_io_vec; i < (bio)->bi_vcnt; i++, bvl++) -static inline void bvec_iter_advance(struct bio_vec *bv, struct bvec_iter *iter, - unsigned bytes) -{ - WARN_ONCE(bytes > iter->bi_size, - "Attempted to advance past end of bvec iter\n"); - - while (bytes) { - unsigned len = min(bytes, bvec_iter_len(bv, *iter)); - - bytes -= len; - iter->bi_size -= len; - iter->bi_bvec_done += len; - - if (iter->bi_bvec_done == __bvec_iter_bvec(bv, *iter)->bv_len) { - iter->bi_bvec_done = 0; - iter->bi_idx++; - } - } -} - -#define for_each_bvec(bvl, bio_vec, iter, start) \ - for (iter = (start); \ - (iter).bi_size && \ - ((bvl = bvec_iter_bvec((bio_vec), (iter))), 1); \ - bvec_iter_advance((bio_vec), &(iter), (bvl).bv_len)) - - static inline void bio_advance_iter(struct bio *bio, struct bvec_iter *iter, unsigned bytes) { diff --git a/include/linux/bvec.h b/include/linux/bvec.h new file mode 100644 index 0000000..29c459d --- /dev/null +++ b/include/linux/bvec.h @@ -0,0 +1,74 @@ +/* + * bvec iterator + * + * Copyright (C) 2001 Ming Lei + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public Licens + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111- + */ +#ifndef __LINUX_BVEC_ITER_H +#define __LINUX_BVEC_ITER_H + +#include + +/* + * various member access, note that bio_data should of course not be used + * on highmem page vectors + */ +#define __bvec_iter_bvec(bvec, iter) (&(bvec)[(iter).bi_idx]) + +#define bvec_iter_page(bvec, iter) \ + (__bvec_iter_bvec((bvec), (iter))->bv_page) + +#define bvec_iter_len(bvec, iter) \ + min((iter).bi_size, \ + __bvec_iter_bvec((bvec), (iter))->bv_len - (iter).bi_bvec_done) + +#define bvec_iter_offset(bvec, iter) \ + (__bvec_iter_bvec((bvec), (iter))->bv_offset + (iter).bi_bvec_done) + +#define bvec_iter_bvec(bvec, iter) \ +((struct bio_vec) { \ + .bv_page = bvec_iter_page((bvec), (iter)), \ + .bv_len = bvec_iter_len((bvec), (iter)), \ + .bv_offset = bvec_iter_offset((bvec), (iter)), \ +}) + +static inline void bvec_iter_advance(struct bio_vec *bv, struct bvec_iter *iter, + unsigned bytes) +{ + WARN_ONCE(bytes > iter->bi_size, + "Attempted to advance past end of bvec iter\n"); + + while (bytes) { + unsigned len = min(bytes, bvec_iter_len(bv, *iter)); + + bytes -= len; + iter->bi_size -= len; + iter->bi_bvec_done += len; + + if (iter->bi_bvec_done == __bvec_iter_bvec(bv, *iter)->bv_len) { + iter->bi_bvec_done = 0; + iter->bi_idx++; + } + } +} + +#define for_each_bvec(bvl, bio_vec, iter, start) \ + for (iter = (start); \ + (iter).bi_size && \ + ((bvl = bvec_iter_bvec((bio_vec), (iter))), 1); \ + bvec_iter_advance((bio_vec), &(iter), (bvl).bv_len)) + +#endif /* __LINUX_BVEC_ITER_H */ -- 1.9.1 From tom.leiming@gmail.com Mon Apr 4 01:56:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 624737CAE for ; Mon, 4 Apr 2016 01:56:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1665D304032 for ; Sun, 3 Apr 2016 23:56:55 -0700 (PDT) X-ASG-Debug-ID: 1459753013-04bdf01103202740001-NocioJ Received: from mail-pa0-f43.google.com (mail-pa0-f43.google.com [209.85.220.43]) by cuda.sgi.com with ESMTP id DFB3B6zabI1FwoPK (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 03 Apr 2016 23:56:53 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.43 Received: by mail-pa0-f43.google.com with SMTP id td3so137397021pab.2 for ; Sun, 03 Apr 2016 23:56:53 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=hpWTFv50V076LaR9xNNY+vTNY85/wDS40wwABJf8dkQ=; b=AUJx5BTe0QQaBhsRUJmAyG8XCXZUSZfIhPNoKuCQmcHPmTsyntZ4InLqCPPuzvg59F DKkgB1Te63BNeigtGRK+jebTleYKj0doN3sFj9p5QTKJrjCI1vdKOtWcgTVW+dtpiAxL 7pz6ZhMNAQ7mgZ5TRbV9M+NsgnVghXygUcJwSyWIW/i5235Sj4y3tW5vxcezHC1h5XEa n9NiRcuLn/8dnEBwtgMDYqyn9e9hfINKplvO4wpAz2soGHDmLa1mk5dOlL5pEvZqBGCO Rix5e9tJA9ulEKJoMhqQTk5Q7VTlDEXSKpBBaKskYgk51DBX4480ZB/Ldnjce6OXgLp7 n3ew== X-Gm-Message-State: AD7BkJKeqnoYE8sTiN30OYxLw/OfNUHH3vfYOT7bMpkMVfBeealt4LMv15hup2wpeHxreg== X-Received: by 10.66.235.129 with SMTP id um1mr50584549pac.17.1459753013149; Sun, 03 Apr 2016 23:56:53 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id kl14sm38823188pab.23.2016.04.03.23.56.51 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Sun, 03 Apr 2016 23:56:52 -0700 (PDT) From: Ming Lei X-Barracuda-Apparent-Source-IP: 45.125.195.13 X-Barracuda-BBL-IP: 45.125.195.13 To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH v3 2/8] block: move two bvec structure into bvec.h Date: Mon, 4 Apr 2016 14:56:28 +0800 X-ASG-Orig-Subj: [PATCH v3 2/8] block: move two bvec structure into bvec.h Message-Id: <1459752994-2205-3-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1459752994-2205-1-git-send-email-ming.lei@canonical.com> References: <1459752994-2205-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pa0-f43.google.com[209.85.220.43] X-Barracuda-Start-Time: 1459753013 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header This patch moves 'struct bio_vec' and 'struct bvec_iter' into 'include/linux/bvec.h', then always include this header into 'include/linux/blk_types.h'. With this change, both 'struct bvec_iter' and bvec iterator helpers don't depend on CONFIG_BLOCK any more, then we can use bvec iterator to implement iterate_bvec(): lib/iov_iter.c. Suggested-by: Christoph Hellwig Signed-off-by: Ming Lei --- include/linux/bio.h | 1 - include/linux/blk_types.h | 22 +--------------------- include/linux/bvec.h | 23 ++++++++++++++++++++++- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/include/linux/bio.h b/include/linux/bio.h index 78cf737..7f998ac 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -31,7 +31,6 @@ /* struct bio, bio_vec and BIO_* flags are defined in blk_types.h */ #include -#include #define BIO_DEBUG diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index 86a38ea..a8d8e1f 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -6,6 +6,7 @@ #define __LINUX_BLK_TYPES_H #include +#include struct bio_set; struct bio; @@ -17,28 +18,7 @@ struct cgroup_subsys_state; typedef void (bio_end_io_t) (struct bio *); typedef void (bio_destructor_t) (struct bio *); -/* - * was unsigned short, but we might as well be ready for > 64kB I/O pages - */ -struct bio_vec { - struct page *bv_page; - unsigned int bv_len; - unsigned int bv_offset; -}; - #ifdef CONFIG_BLOCK - -struct bvec_iter { - sector_t bi_sector; /* device address in 512 byte - sectors */ - unsigned int bi_size; /* residual I/O count */ - - unsigned int bi_idx; /* current index into bvl_vec */ - - unsigned int bi_bvec_done; /* number of bytes completed in - current bvec */ -}; - /* * main unit of I/O for the block layer and lower layers (ie drivers and * stacking drivers) diff --git a/include/linux/bvec.h b/include/linux/bvec.h index 29c459d..096efd2 100644 --- a/include/linux/bvec.h +++ b/include/linux/bvec.h @@ -20,7 +20,28 @@ #ifndef __LINUX_BVEC_ITER_H #define __LINUX_BVEC_ITER_H -#include +#include +#include + +/* + * was unsigned short, but we might as well be ready for > 64kB I/O pages + */ +struct bio_vec { + struct page *bv_page; + unsigned int bv_len; + unsigned int bv_offset; +}; + +struct bvec_iter { + sector_t bi_sector; /* device address in 512 byte + sectors */ + unsigned int bi_size; /* residual I/O count */ + + unsigned int bi_idx; /* current index into bvl_vec */ + + unsigned int bi_bvec_done; /* number of bytes completed in + current bvec */ +}; /* * various member access, note that bio_data should of course not be used -- 1.9.1 From tom.leiming@gmail.com Mon Apr 4 01:57:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BA9047CA0 for ; Mon, 4 Apr 2016 01:57:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1F5E8AC002 for ; Sun, 3 Apr 2016 23:57:00 -0700 (PDT) X-ASG-Debug-ID: 1459753018-04cb6c246026db90001-NocioJ Received: from mail-pa0-f54.google.com (mail-pa0-f54.google.com [209.85.220.54]) by cuda.sgi.com with ESMTP id 7KtiUh7Uz9aHL0Sq (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 03 Apr 2016 23:56:59 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.54 Received: by mail-pa0-f54.google.com with SMTP id tt10so137751818pab.3 for ; Sun, 03 Apr 2016 23:56:59 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=S14n/O0+q+ndk4GNPao1LYO7n6IMxckdKo7DcMBoMNo=; b=Hk+LHDmtDweW1AlKUc0tVT61Gfaf0y6rWSpab58gjuoJ6M+ar1/e68PtfltOS8lqN7 6o6hMRdLUgCk79Or+vBPFFdOrjHkTSCcnblVgD3Zfxb2VueFBxXfL5ZNDRW2zTnklKFg nr+VAkhWaffvrNrAlpkIs22didELl3+LIVUgIX/tIUHRZZEkNWVxeNENWmov/O4Dp7MY spGXZCxzB3zAWdbPQi2uLjjK6bUls0KotR2u44ABmgV2e36gifsYDt5rV43wlC7Fd8b9 e8UtqUE39jnn3eBmHTTUNTEbMgnZsBbeBoZepG8OcfGZ+ov4QMT/Kn8G6p2teuzoqzs7 nJXQ== X-Gm-Message-State: AD7BkJLbj6paWCPMViTIHiZWeZQLL+977akY8SoQQbLQO0RcmVJkUG/zyQ9yGphs/kdoOQ== X-Received: by 10.66.140.14 with SMTP id rc14mr50915504pab.65.1459753018367; Sun, 03 Apr 2016 23:56:58 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id dh8sm17007732pad.46.2016.04.03.23.56.56 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Sun, 03 Apr 2016 23:56:57 -0700 (PDT) From: Ming Lei X-Barracuda-Apparent-Source-IP: 45.125.195.13 X-Barracuda-BBL-IP: 45.125.195.13 To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH v3 3/8] block: mark 1st parameter of bvec_iter_advance as const Date: Mon, 4 Apr 2016 14:56:29 +0800 X-ASG-Orig-Subj: [PATCH v3 3/8] block: mark 1st parameter of bvec_iter_advance as const Message-Id: <1459752994-2205-4-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1459752994-2205-1-git-send-email-ming.lei@canonical.com> References: <1459752994-2205-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pa0-f54.google.com[209.85.220.54] X-Barracuda-Start-Time: 1459753018 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header bvec_iter_advance() only writes the parameter of iterator, so the base address of bvec can be marked as const safely. Without the change, we can see compiling warning in the following patch for implementing iterate_bvec(): lib/iov_iter.c with bvec iterator. Reviewed-by: Christoph Hellwig Signed-off-by: Ming Lei --- include/linux/bvec.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/linux/bvec.h b/include/linux/bvec.h index 096efd2..701b64a 100644 --- a/include/linux/bvec.h +++ b/include/linux/bvec.h @@ -66,7 +66,8 @@ struct bvec_iter { .bv_offset = bvec_iter_offset((bvec), (iter)), \ }) -static inline void bvec_iter_advance(struct bio_vec *bv, struct bvec_iter *iter, +static inline void bvec_iter_advance(const struct bio_vec *bv, + struct bvec_iter *iter, unsigned bytes) { WARN_ONCE(bytes > iter->bi_size, -- 1.9.1 From tom.leiming@gmail.com Mon Apr 4 01:57:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 AE2C87CB4 for ; Mon, 4 Apr 2016 01:57:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7180E304032 for ; Sun, 3 Apr 2016 23:57:08 -0700 (PDT) X-ASG-Debug-ID: 1459753023-04cb6c246026dba0001-NocioJ Received: from mail-pf0-f180.google.com (mail-pf0-f180.google.com [209.85.192.180]) by cuda.sgi.com with ESMTP id THUKOI6rVL4Frhrm (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 03 Apr 2016 23:57:04 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.180 Received: by mail-pf0-f180.google.com with SMTP id n1so32988917pfn.2 for ; Sun, 03 Apr 2016 23:57:04 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=T84E5r8SO0QZoKCDA8vyoXvqulJoiLHB4RbTn9CHEzk=; b=cwSKpfl0MN5NJMgK7wqys8zF+o5lSzJyMw31W8biSxSMD+IciAhqrUUPNF2vDw8o+6 2X2N6i6Xd3KCgcsRyY7btXnhgZSI8UGXdsgg+6bNWS/javDyHtxfluPCsq5EoRhbjypd I+uTuJ5suKkAdDZvzcOwonfdJ2kflVRntJlKxoow7D3Ujeo+ruVQbrb2SWlSdwZd5xvj 03mFkptaA4GfhteKvokmRwST1SMIR3ILZYzMjEo/dPRET4/a0oZC2Iu+US6ECj4j+0Zi B9fqX2CV714y/i1/BHkqBdPA1vSbzAeQmdxegJJX82j2xlzXbwAsxsiSSqqwhqgXRbLY 7gIg== X-Gm-Message-State: AD7BkJJn54etqDOb/xzs4ncAt/cmxHysn5z5vLl08UI6Ggthlg63rA4Eokwr6Na/Valrgw== X-Received: by 10.98.16.198 with SMTP id 67mr18454882pfq.21.1459753023504; Sun, 03 Apr 2016 23:57:03 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id ut5sm38849630pab.15.2016.04.03.23.57.01 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Sun, 03 Apr 2016 23:57:02 -0700 (PDT) From: Ming Lei X-Barracuda-Apparent-Source-IP: 45.125.195.13 X-Barracuda-BBL-IP: 45.125.195.13 To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH v3 4/8] iov_iter: use bvec iterator to implement iterate_bvec() Date: Mon, 4 Apr 2016 14:56:30 +0800 X-ASG-Orig-Subj: [PATCH v3 4/8] iov_iter: use bvec iterator to implement iterate_bvec() Message-Id: <1459752994-2205-5-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1459752994-2205-1-git-send-email-ming.lei@canonical.com> References: <1459752994-2205-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pf0-f180.google.com[209.85.192.180] X-Barracuda-Start-Time: 1459753023 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header bvec has provided one iterator already, so not necessary to reinvent a new wheel for this job. Signed-off-by: Ming Lei --- lib/iov_iter.c | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/lib/iov_iter.c b/lib/iov_iter.c index 5fecddc..c8691ac 100644 --- a/lib/iov_iter.c +++ b/lib/iov_iter.c @@ -57,35 +57,25 @@ } #define iterate_bvec(i, n, __v, __p, skip, STEP) { \ - size_t wanted = n; \ + struct bvec_iter __bi, __start; \ + __start.bi_size = n; \ + __start.bi_bvec_done = skip; \ + __start.bi_idx = 0; \ __p = i->bvec; \ - __v.bv_len = min_t(size_t, n, __p->bv_len - skip); \ - if (likely(__v.bv_len)) { \ - __v.bv_page = __p->bv_page; \ - __v.bv_offset = __p->bv_offset + skip; \ + for_each_bvec(__v, __p, __bi, __start) { \ (void)(STEP); \ - skip += __v.bv_len; \ - n -= __v.bv_len; \ } \ - while (unlikely(n)) { \ - __p++; \ - __v.bv_len = min_t(size_t, n, __p->bv_len); \ - if (unlikely(!__v.bv_len)) \ - continue; \ - __v.bv_page = __p->bv_page; \ - __v.bv_offset = __p->bv_offset; \ - (void)(STEP); \ + if (!__bi.bi_idx) \ + skip += __v.bv_len; \ + else \ skip = __v.bv_len; \ - n -= __v.bv_len; \ - } \ - n = wanted; \ } #define iterate_all_kinds(i, n, v, I, B, K) { \ size_t skip = i->iov_offset; \ if (unlikely(i->type & ITER_BVEC)) { \ const struct bio_vec *bvec; \ - struct bio_vec v; \ + struct bio_vec v = { 0 }; \ iterate_bvec(i, n, v, bvec, skip, (B)) \ } else if (unlikely(i->type & ITER_KVEC)) { \ const struct kvec *kvec; \ @@ -102,7 +92,7 @@ size_t skip = i->iov_offset; \ if (unlikely(i->type & ITER_BVEC)) { \ const struct bio_vec *bvec; \ - struct bio_vec v; \ + struct bio_vec v = { 0 }; \ iterate_bvec(i, n, v, bvec, skip, (B)) \ if (skip == bvec->bv_len) { \ bvec++; \ -- 1.9.1 From tom.leiming@gmail.com Mon Apr 4 01:57:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 51CFA7CA0 for ; Mon, 4 Apr 2016 01:57:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C72A2AC002 for ; Sun, 3 Apr 2016 23:57:11 -0700 (PDT) X-ASG-Debug-ID: 1459753028-04bdf01103202760001-NocioJ Received: from mail-pf0-f178.google.com (mail-pf0-f178.google.com [209.85.192.178]) by cuda.sgi.com with ESMTP id L7SXYsZaGbVT88G1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 03 Apr 2016 23:57:08 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.178 Received: by mail-pf0-f178.google.com with SMTP id n1so32990221pfn.2 for ; Sun, 03 Apr 2016 23:57:08 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=xXUdvjLtowonlrbju5ek6j4VIGdC6GChTRig76zBevk=; b=YraOZMv29Psgt1dXOU64F74/DQTGTeY6cFYgOHHEi6TEZRzKSI0wHsdad6i3P5MmAK +Lm1wSrkx4DU9YTyBkTPzHx26KxQSYj/RcYZe33hd+RV5OQutkjsDV41pxv3guNEu9uS M4Nu4HySTVCD9oAuC8er7FsSP+92za61lS/Q2pPG/QLhSMTFeEof5MzIo70yom7wcg6j MeKgbnCOypZl1tkHm3WsWjv1eFBqXfYjTULVHjsS5rt1I45h2vixX+wWwOYB5+HoD1TS ZJ0VerRAaGcH6oo++l3yHrp1t0iFpx2mRF5BLnnIs14pb6Ws9Y/uQT5Fw96TengU9gWl jlGA== X-Gm-Message-State: AD7BkJLdrg4LbRNGDRE/M/JJ+03em9Vd/E1uLSHAXcr7z7lkBVXfS2gOKsKPEyHPLJX2Og== X-Received: by 10.98.32.23 with SMTP id g23mr18316906pfg.74.1459753028484; Sun, 03 Apr 2016 23:57:08 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id l14sm36686313pfi.23.2016.04.03.23.57.07 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Sun, 03 Apr 2016 23:57:07 -0700 (PDT) From: Ming Lei X-Barracuda-Apparent-Source-IP: 45.125.195.13 X-Barracuda-BBL-IP: 45.125.195.13 To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH v3 5/8] fs: xfs: replace BIO_MAX_SECTORS with BIO_MAX_PAGES Date: Mon, 4 Apr 2016 14:56:31 +0800 X-ASG-Orig-Subj: [PATCH v3 5/8] fs: xfs: replace BIO_MAX_SECTORS with BIO_MAX_PAGES Message-Id: <1459752994-2205-6-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1459752994-2205-1-git-send-email-ming.lei@canonical.com> References: <1459752994-2205-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pf0-f178.google.com[209.85.192.178] X-Barracuda-Start-Time: 1459753028 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header BIO_MAX_PAGES is used as maximum count of bvecs, so replace BIO_MAX_SECTORS with BIO_MAX_PAGES since BIO_MAX_SECTORS is to be removed. Signed-off-by: Ming Lei --- fs/xfs/xfs_buf.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 9a2191b..b9ecb2d 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1161,9 +1161,7 @@ xfs_buf_ioapply_map( next_chunk: atomic_inc(&bp->b_io_remaining); - nr_pages = BIO_MAX_SECTORS >> (PAGE_SHIFT - BBSHIFT); - if (nr_pages > total_nr_pages) - nr_pages = total_nr_pages; + nr_pages = min(total_nr_pages, BIO_MAX_PAGES); bio = bio_alloc(GFP_NOIO, nr_pages); bio->bi_bdev = bp->b_target->bt_bdev; -- 1.9.1 From tom.leiming@gmail.com Mon Apr 4 01:57:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 3C6F57CB6 for ; Mon, 4 Apr 2016 01:57:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0DEFA304032 for ; Sun, 3 Apr 2016 23:57:16 -0700 (PDT) X-ASG-Debug-ID: 1459753033-04cb6c246026dbc0001-NocioJ Received: from mail-pa0-f54.google.com (mail-pa0-f54.google.com [209.85.220.54]) by cuda.sgi.com with ESMTP id cyL78ycfHfBWHzCx (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 03 Apr 2016 23:57:13 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.54 Received: by mail-pa0-f54.google.com with SMTP id zm5so137957671pac.0 for ; Sun, 03 Apr 2016 23:57:13 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=vvWLwrdI0i0NGeigC/dlcfi0ZqnMwl03QbSjs26C0Jk=; b=mz8ezpXHrRQ5MP4sePVx1/rLwIo9bABvoRh19h+hSGsJrT44msxcvhxAMfa72sN9PK 7P//U+s5CewP/CJ0en3YFgh9wrfx+EHudDgnbTXEyISfCql5w8x7Jbk7FyjNflZA8G+9 DdbfrQtuDqThJ4t+ULl1dZDiv6p0op6uWdB1ZBYm5vq7KzXUGwAXk0TdN5GpaTYP7u9d GFbfhtq+Y+jCMr8vwEH05n1J2A1NGfpu+dubUYykd23VELdLhPLxSwrW3VXh+pXU4rlm 0wPaFrDVLcwTMw4z7lJlTvi4yu3VdJdx2rnFpv4C/Sl54gr8ggfHdPCsB1hXG0eblamI 6XZQ== X-Gm-Message-State: AD7BkJK0OuURES+PtYKJH4VHVCGueSGw5F+tbfOzz937JyJ+iuTaKz6XKLKuSnij2OzoxA== X-Received: by 10.66.148.232 with SMTP id tv8mr50635213pab.21.1459753033276; Sun, 03 Apr 2016 23:57:13 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id s66sm36721020pfi.3.2016.04.03.23.57.12 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Sun, 03 Apr 2016 23:57:12 -0700 (PDT) From: Ming Lei X-Barracuda-Apparent-Source-IP: 45.125.195.13 X-Barracuda-BBL-IP: 45.125.195.13 To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH v3 6/8] block: bio: remove BIO_MAX_SECTORS Date: Mon, 4 Apr 2016 14:56:32 +0800 X-ASG-Orig-Subj: [PATCH v3 6/8] block: bio: remove BIO_MAX_SECTORS Message-Id: <1459752994-2205-7-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1459752994-2205-1-git-send-email-ming.lei@canonical.com> References: <1459752994-2205-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pa0-f54.google.com[209.85.220.54] X-Barracuda-Start-Time: 1459753033 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header No one need this macro, so remove it. The motivation is for supporting multipage bvecs, in which we only know what the max count of bvecs is supported in the bio, instead of max size or max sectors. Reviewed-by: Christoph Hellwig Signed-off-by: Ming Lei --- include/linux/bio.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/linux/bio.h b/include/linux/bio.h index 7f998ac..f7e1c27 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -42,7 +42,6 @@ #define BIO_MAX_PAGES 256 #define BIO_MAX_SIZE (BIO_MAX_PAGES << PAGE_CACHE_SHIFT) -#define BIO_MAX_SECTORS (BIO_MAX_SIZE >> 9) /* * upper 16 bits of bi_rw define the io priority of this bio -- 1.9.1 From tom.leiming@gmail.com Mon Apr 4 01:57:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 85FD17CC9 for ; Mon, 4 Apr 2016 01:57:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4534E8F8035 for ; Sun, 3 Apr 2016 23:57:20 -0700 (PDT) X-ASG-Debug-ID: 1459753038-04cbb07ad62474d0001-NocioJ Received: from mail-pf0-f174.google.com (mail-pf0-f174.google.com [209.85.192.174]) by cuda.sgi.com with ESMTP id O4F6p6PaNEHJywFy (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 03 Apr 2016 23:57:19 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.174 Received: by mail-pf0-f174.google.com with SMTP id c20so29154761pfc.1 for ; Sun, 03 Apr 2016 23:57:19 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=f8RnSXiS0Ltm1s1Wqzt4C04rE3FJ1OU0KmBxRNLnWV4=; b=dkvXufRHYrua+KybENTa2N0WSRxl3Eb8kvVjTctd2olWyPkxMEW7YXv2ECmCq54Czi l2pOTwXwWQ1i1pHTn74BcW84+pZMYYdmRraKAszUgB5gY9CxOo5ByxIjhH0ke4rAMCKM IkJ5MyjvUfwtpLcX53qLDls9+CJyHkV1J2yoAUGcTo+WNuGrWzs5sc6Ih6nih2QsFrr+ idAN/zEMggCtnHdxiN5Qb83drGTikhHf5vybu/A9NbJkyYj2rVlFODTWzDx8zhvtcZ29 jFvzthee9lJZUPquqUYmlVar27i1GtNGyI9DuUvHIuWuHM2qYc1JIxonG90JobJJzwdr XKrA== X-Gm-Message-State: AD7BkJJdEDHCNw6UsO9ysAtUC2goFWIwJPhmBz0QtfhUEqDtQaA6BuAVV7LWDKCuTevZZA== X-Received: by 10.98.72.213 with SMTP id q82mr18323444pfi.164.1459753038608; Sun, 03 Apr 2016 23:57:18 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id v9sm36676449pfi.50.2016.04.03.23.57.16 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Sun, 03 Apr 2016 23:57:17 -0700 (PDT) From: Ming Lei X-Barracuda-Apparent-Source-IP: 45.125.195.13 X-Barracuda-BBL-IP: 45.125.195.13 To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH v3 7/8] block: drbd: avoid to use BIO_MAX_SIZE Date: Mon, 4 Apr 2016 14:56:33 +0800 X-ASG-Orig-Subj: [PATCH v3 7/8] block: drbd: avoid to use BIO_MAX_SIZE Message-Id: <1459752994-2205-8-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1459752994-2205-1-git-send-email-ming.lei@canonical.com> References: <1459752994-2205-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-pf0-f174.google.com[209.85.192.174] X-Barracuda-Start-Time: 1459753039 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header drbd is the only user of BIO_MAX_SIZE, so use BIO_MAX_PAGES instead. Reviewed-by: Christoph Hellwig Signed-off-by: Ming Lei --- drivers/block/drbd/drbd_int.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index c227fd4..10bfff1 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h @@ -1327,14 +1327,14 @@ struct bm_extent { #endif #endif -/* BIO_MAX_SIZE is 256 * PAGE_CACHE_SIZE, +/* Estimate max bio size as 256 * PAGE_CACHE_SIZE, * so for typical PAGE_CACHE_SIZE of 4k, that is (1<<20) Byte. * Since we may live in a mixed-platform cluster, * we limit us to a platform agnostic constant here for now. * A followup commit may allow even bigger BIO sizes, * once we thought that through. */ #define DRBD_MAX_BIO_SIZE (1U << 20) -#if DRBD_MAX_BIO_SIZE > BIO_MAX_SIZE +#if DRBD_MAX_BIO_SIZE > (BIO_MAX_PAGES << PAGE_CACHE_SHIFT) #error Architecture not supported: DRBD_MAX_BIO_SIZE > BIO_MAX_SIZE #endif #define DRBD_MAX_BIO_SIZE_SAFE (1U << 12) /* Works always = 4k */ -- 1.9.1 From tom.leiming@gmail.com Mon Apr 4 01:59:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 61ACD7CA1 for ; Mon, 4 Apr 2016 01:59:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 13E018F8033 for ; Sun, 3 Apr 2016 23:59:42 -0700 (PDT) X-ASG-Debug-ID: 1459753178-04bdf01103202800001-NocioJ Received: from mail-pa0-f51.google.com (mail-pa0-f51.google.com [209.85.220.51]) by cuda.sgi.com with ESMTP id LEvKEfUBZkPEBU3j (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 03 Apr 2016 23:59:39 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.51 Received: by mail-pa0-f51.google.com with SMTP id tt10so137796307pab.3 for ; Sun, 03 Apr 2016 23:59:39 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=R8Ql29GMmh5nJShu9LJUoMgzG2BrqiW1k1cWNbNUr8c=; b=ddS3OUvkQramwKlypTHa8b3iiZBy7ngoNCChM6F3g1zTp6OpJZuSr3YbTVXqYsoVmQ ZEY4nPL9sIktpBk9/7bFWtJNcmDXkDVnnIY0opDvp5+xqw5PZmEntQ4I8+7DecUKwEbz zEaMlg37nmh8WaF7bhGxeLRmbXDjsCkqR4MuZV7tJnGha18m16ExWZ4A62JeHOE5LTEZ dn3bwgn/hPC0S6aubse3UbVTppqHNP2qbJ84ROXuR88yugu0HuZB3XBv9+eCAy9FGr9K nCZspUbipweRRJ3njfJTV8VwAHo3mGqvTtkPtyUgsJ32OO+gIphLMF9EsWEIwJzCeKsm 85Cg== X-Gm-Message-State: AD7BkJLvtaf+UHQm3GKmq44gUHfFqkBqqkBokgKEj5wqXgi6lpbgyeFadUgV0pxH7tfXRA== X-Received: by 10.66.138.74 with SMTP id qo10mr44491869pab.140.1459753178790; Sun, 03 Apr 2016 23:59:38 -0700 (PDT) Received: from localhost (45-125-195-13.ip4.readyserver.sg. [45.125.195.13]) by smtp.gmail.com with ESMTPSA id 23sm36679626pfs.34.2016.04.03.23.59.37 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Sun, 03 Apr 2016 23:59:38 -0700 (PDT) From: Ming Lei X-Barracuda-Apparent-Source-IP: 45.125.195.13 X-Barracuda-BBL-IP: 45.125.195.13 To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , drbd-dev@lists.linbit.com, Philipp Reisner , Lars Ellenberg , Boaz Harrosh , Ming Lei Subject: [PATCH v3 8/8] block: bio: remove BIO_MAX_SIZE Date: Mon, 4 Apr 2016 14:59:32 +0800 X-ASG-Orig-Subj: [PATCH v3 8/8] block: bio: remove BIO_MAX_SIZE Message-Id: <1459753172-4297-1-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 X-Barracuda-Connect: mail-pa0-f51.google.com[209.85.220.51] X-Barracuda-Start-Time: 1459753179 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header No one need this macro now, so remove it. The motivation is for supporting multipage bvecs, in which we only know what the max count of bvecs is supported in the bio, instead of max bio size. Reviewed-by: Christoph Hellwig Signed-off-by: Ming Lei --- include/linux/bio.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/linux/bio.h b/include/linux/bio.h index f7e1c27..c8553fe 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -41,7 +41,6 @@ #endif #define BIO_MAX_PAGES 256 -#define BIO_MAX_SIZE (BIO_MAX_PAGES << PAGE_CACHE_SHIFT) /* * upper 16 bits of bi_rw define the io priority of this bio -- 1.9.1 From hch@lst.de Mon Apr 4 02:12:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2724F7CA6 for ; Mon, 4 Apr 2016 02:12:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EC58A304032 for ; Mon, 4 Apr 2016 00:12:08 -0700 (PDT) X-ASG-Debug-ID: 1459753924-04cb6c246426e2b0001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id n6Vp3usiCrxvtF2e (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 04 Apr 2016 00:12:05 -0700 (PDT) X-Barracuda-Envelope-From: hch@lst.de X-Barracuda-Apparent-Source-IP: 213.95.11.211 Received: by newverein.lst.de (Postfix, from userid 2407) id C8901706D5; Mon, 4 Apr 2016 09:12:03 +0200 (CEST) Date: Mon, 4 Apr 2016 09:12:03 +0200 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 2/7] fs: introduce iomap infrastructure Message-ID: <20160404071203.GA29313@lst.de> X-ASG-Orig-Subj: Re: [PATCH 2/7] fs: introduce iomap infrastructure References: <1457989370-6904-1-git-send-email-hch@lst.de> <1457989370-6904-3-git-send-email-hch@lst.de> <20160404012849.GB11238@dastard> <20160404014706.GC11238@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160404014706.GC11238@dastard> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1459753925 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Apr 04, 2016 at 11:47:06AM +1000, Dave Chinner wrote: > > Patch below fixes the issue, as well as the fact that > > iomap_page_mkwrite_actor() needs to return the count of bytes > > "written", not zero on success for iomap_write_segment() to do the > > right thing on multi-segment writes. > > Hmm - this fix then breaks generic/029. Christoph, can you look into > these issues? I've allocated some time for the series this week, I'll also add the iomap based fiemap implementation from the gfs2 folks while I'm at it. From david@fromorbit.com Mon Apr 4 02:55:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2E6EF7CA0 for ; Mon, 4 Apr 2016 02:55:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E5C41304032 for ; Mon, 4 Apr 2016 00:55:32 -0700 (PDT) X-ASG-Debug-ID: 1459756529-04bdf01104203ff0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id biVp7toJVQR5vwJt for ; Mon, 04 Apr 2016 00:55:29 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AJCAA0HQJX/zGaLHldgzeBUIJxpCMBAQEBAQEGjBKFZoQPhgcEAgKBKE0BAQEBAQFmJ4RCAQEEOhwjEAgDDgoJJQ8FJQMhE4gmvCQBAQEBBgIBHRmFP4USh2qCKwWYAY1+jxmPGmKCARyBXCowiCYBAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Apr 2016 17:25:27 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1amzLu-00077P-V4; Mon, 04 Apr 2016 17:55:15 +1000 Date: Mon, 4 Apr 2016 17:55:14 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/7] fs: introduce iomap infrastructure Message-ID: <20160404075514.GD11238@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/7] fs: introduce iomap infrastructure References: <1457989370-6904-1-git-send-email-hch@lst.de> <1457989370-6904-3-git-send-email-hch@lst.de> <20160404012849.GB11238@dastard> <20160404014706.GC11238@dastard> <20160404071203.GA29313@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160404071203.GA29313@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: 1459756529 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28441 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Apr 04, 2016 at 09:12:03AM +0200, Christoph Hellwig wrote: > On Mon, Apr 04, 2016 at 11:47:06AM +1000, Dave Chinner wrote: > > > Patch below fixes the issue, as well as the fact that > > > iomap_page_mkwrite_actor() needs to return the count of bytes > > > "written", not zero on success for iomap_write_segment() to do the > > > right thing on multi-segment writes. > > > > Hmm - this fix then breaks generic/029. Christoph, can you look into > > these issues? > > I've allocated some time for the series this week, I'll also add the > iomap based fiemap implementation from the gfs2 folks while I'm at it. Great! I've been running it here for the past week or so, and on 4k block size filesystems it hasn't caused any regressions. I've been running it with the straight-to-bio writeback paches for XFS as well, and it seems to be playing nicely with that, too. The above problems were seen independent of the witeback patch series, though... Cheers, Dave. -- Dave Chinner david@fromorbit.com From Stephane.Dupuis@cyberactionlab.net Mon Apr 4 06:56:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=TVD_SPACE_RATIO autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 148A67CA0 for ; Mon, 4 Apr 2016 06:56:09 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C8EEE304039 for ; Mon, 4 Apr 2016 04:56:05 -0700 (PDT) X-ASG-Debug-ID: 1459770962-04cbb07ad724fac0001-NocioJ Received: from smtp.cyberactionlab.net (mail.cyberactionlab.net [90.85.16.233]) by cuda.sgi.com with ESMTP id Hd1LAqUX3uk0WRnh for ; Mon, 04 Apr 2016 04:56:03 -0700 (PDT) X-Barracuda-Envelope-From: Stephane.Dupuis@cyberactionlab.net X-Barracuda-Apparent-Source-IP: 90.85.16.233 Received: from Z4-MAIL.cyberdef.net (unknown [10.64.10.15]) by smtp.cyberactionlab.net (Postfix) with ESMTP id 5372891 for ; Mon, 4 Apr 2016 11:56:02 +0000 (UTC) Received: from [10.66.10.6] (10.66.10.6) by Z4-MAIL.cyberdef.net (10.64.10.15) with Microsoft SMTP Server (TLS) id 15.0.1156.6; Mon, 4 Apr 2016 13:56:31 +0200 To: From: Stephane Dupuis Subject: subscribe Message-ID: <5702564F.5050109@cyberactionlab.net> X-ASG-Orig-Subj: subscribe Date: Mon, 4 Apr 2016 13:55:59 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Originating-IP: [10.66.10.6] X-ClientProxiedBy: Z4-MAIL.cyberdef.net (10.64.10.15) To Z4-MAIL.cyberdef.net (10.64.10.15) X-Barracuda-Connect: mail.cyberactionlab.net[90.85.16.233] X-Barracuda-Start-Time: 1459770963 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28445 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From jack@suse.cz Mon Apr 4 07:09:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0EBE67CA0 for ; Mon, 4 Apr 2016 07:09:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D602D304032 for ; Mon, 4 Apr 2016 05:09:21 -0700 (PDT) X-ASG-Debug-ID: 1459771754-04cbb07ad7250270001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id JmMeW3471Cb4mb1B (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 04 Apr 2016 05:09:16 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id BA3AAAB5D; Mon, 4 Apr 2016 12:09:12 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id A883D80D2B; Mon, 4 Apr 2016 14:09:49 +0200 (CEST) Date: Mon, 4 Apr 2016 14:09:49 +0200 From: Jan Kara To: "Verma, Vishal L" Cc: "jack@suse.cz" , "linux-block@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "Williams, Dan J" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-nvdimm@lists.01.org" , "linux-fsdevel@vger.kernel.org" , "ross.zwisler@linux.intel.com" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" , "david@fromorbit.com" Subject: Re: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors Message-ID: <20160404120949.GH8372@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors References: <1458861450-17705-1-git-send-email-vishal.l.verma@intel.com> <1458861450-17705-5-git-send-email-vishal.l.verma@intel.com> <1458939796.5501.8.camel@intel.com> <1459195288.15523.3.camel@intel.com> <1459277829.6412.3.camel@intel.com> <20160330074926.GC12776@quack.suse.cz> <1459538265.23200.8.camel@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1459538265.23200.8.camel@intel.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1459771756 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28445 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri 01-04-16 19:17:52, Verma, Vishal L wrote: > On Wed, 2016-03-30 at 09:49 +0200, Jan Kara wrote: > > On Tue 29-03-16 18:57:16, Verma, Vishal L wrote: > > > > > > On Mon, 2016-03-28 at 16:34 -0700, Dan Williams wrote: > > > > > > <> > > > > > > > > > > > Seems kind of sad to fail the fault due to a bad block when we > > > > were > > > > going to zero it anyway, right?  I'm not seeing a compelling > > > > reason to > > > > keep any zeroing in fs/dax.c. > > > Agreed - but how do we do this? clear_pmem needs to be able to clear > > > an > > > arbitrary number of bytes, but to go through the driver, we'd need > > > to > > > send down a bio? If only the driver had an rw_bytes like interface > > > that > > > could be used by anyone... :) > > Actually, my patches for page fault locking remove zeroing from > > dax_insert_mapping() and __dax_pmd_fault() - the zeroing now happens > > from > > the filesystem only and the zeroing in those two functions is just a > > dead > > code... > > That should make things easier! Do you have a tree I could merge in to > get this? (WIP is ok as we know that my series will depend on yours..) > or, if you can distill out that patch on a 4.6-rc1 base, I could carry > it in my series too (your v2's 3/10 doesn't apply on 4.6-rc1..) I'll CC you on the next posting of the series which I want to do this week. Honza -- Jan Kara SUSE Labs, CR From fat-melter-xfs=oss.sgi.com@browsercade.com Mon Apr 4 08:18:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=DIET_1,HTML_MESSAGE, T_DKIM_INVALID,T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6F1607CA0 for ; Mon, 4 Apr 2016 08:18:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D58B0AC003 for ; Mon, 4 Apr 2016 06:18:44 -0700 (PDT) X-ASG-Debug-ID: 1459775922-04cbb07ad6252b10001-NocioJ Received: from mail.browsercade.com ([103.200.108.226]) by cuda.sgi.com with ESMTP id ArBxMM7FMTFv9xYW for ; Mon, 04 Apr 2016 06:18:42 -0700 (PDT) X-Barracuda-Envelope-From: fat-melter-xfs=oss.sgi.com@browsercade.com X-Barracuda-Apparent-Source-IP: 103.200.108.226 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=dkim; d=browsercade.com; h=Date:From:To:Subject:MIME-Version:Content-Type:Message-ID; i=fat-melter@browsercade.com; bh=jRHAO2kKQc+4YAb6q5CxWyH0AYs=; b=mUwveePSknEr+cnryL1Hpc4RrI5YSLQ7Y988QqYbUqi0Oy3KUcBGIKXlxhNjyKV7MVp5QHshG9wV 39T1VSWkSgKucWC2jxeK2KzUuGm1ehcsA/rAufcVAJ+ymAGqcmE5t2poyLPOW91GwPdH+R0qiEW0 i7EtH27wZoQCZZwBwU0= DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=dkim; d=browsercade.com; b=AFhtg1nGx9FwvP4mUDm65Ih3OoSwwhb+l6lUWAYDuIDSUcixq8UxtTBbxVPUmvmIaTeon0B9lbSe qDVzE50LlkYDurbjOJyIPTfO4ytSzqNasJc3FTqwx516+skfOS9XQHjzJp8sXiNHO7t9+yJbAuyV DygdO/UiUWrbT7ZFnCc=; Received: by mail.browsercade.com id h09kmg0001gr for ; Mon, 4 Apr 2016 08:04:20 -0500 (envelope-from ) Date: Mon, 4 Apr 2016 08:04:20 -0500 From: "Fat Melter" To: Subject: 37lbs GONE! Took 4 weeks (Picture Inside) MIME-Version: 1.0 X-ASG-Orig-Subj: 37lbs GONE! Took 4 weeks (Picture Inside) Content-Type: multipart/alternative; boundary="----=_Part_3_599595242.1459774900989" Message-ID: <0.0.0.0.1D18E728060EED4.5979CD@mail.browsercade.com> X-Barracuda-Connect: UNKNOWN[103.200.108.226] X-Barracuda-Start-Time: 1459775922 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-BRTS-Evidence: browsercade.com X-Barracuda-Spam-Score: 2.04 X-Barracuda-Spam-Status: No, SCORE=2.04 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA085, BSF_SC5_MJ1963, DIET_1, DKIM_SIGNED, DKIM_VERIFIED, FR_3TAG_3TAG, HTML_MESSAGE, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28446 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.34 DIET_1 BODY: Lose Weight Spam -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 1.00 FR_3TAG_3TAG RAW: Looks like 3 small tags. 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.10 BSF_SC0_SA085 Custom Rule SA085 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 ------=_Part_3_599595242.1459774900989 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit 37lbs GONE! Took 4 weeks (Picture Inside) http://www.browsercade.com/2878MQ64Uef.8ZsnFjnn0ntv0Mjh456/green Update Preference- http://www.browsercade.com/yet/e228AC64efdFyZsnFjnn0ntv0Mjh2b2 ------=_Part_3_599595242.1459774900989 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit

37lbs GONE! Took 4 weeks (Picture Inside)

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

And...

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

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

The Fat Diminisher

Crazy transformation, right? Well...

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

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

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

To your success!



 

This communication is for informational purposes only. Consult a physician before performing this or any exercise program. It is your responsibility to evaluate your own medical and physical condition, or that of your clients, and to independently determine whether to perform, use or adapt any of the information or content in this communication or the resulting web site. Any exercise program may result in injury. By voluntarily undertaking any exercise displayed in this communication or the resulting web site, you assume the risk of any resulting injury.

DAS Services. - 315 Place d' Youville, Montré al, QC H2Y 0A4

Copyright 2015. All rights reserved.

 

Update Preferences

New Fat Diminisher, 315 Place d' Youville, Montré al, QC H2Y 0A4










 


------=_Part_3_599595242.1459774900989-- From vitrine@cook.ibuwao.us Mon Apr 4 11:47:24 2016 Return-Path: X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2AC957CA0 for ; Mon, 4 Apr 2016 11:47:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 44781304059 for ; Mon, 4 Apr 2016 09:47:16 -0700 (PDT) X-ASG-Debug-ID: 1459788418-04bdf01104216e20001-NocioJ Received: from ibuwao.us ([67.229.185.182]) by cuda.sgi.com with ESMTP id IL2opBrne6XT9ypg for ; Mon, 04 Apr 2016 09:46:58 -0700 (PDT) X-Barracuda-Envelope-From: vitrine@cook.ibuwao.us X-Barracuda-Apparent-Source-IP: 67.229.185.182 Subject: See Results-Michelle lost 17 From: "Time to get ripped" X-ASG-Orig-Subj: See Results-Michelle lost 17 To: Date: Mon, 04 Apr 2016 09:46:35 -0700 List-Unsubscribe: Content-Type: multipart/related; boundary="816df2443a21ea6c_5912007582d539b3a" MIME-Version: 1.0 Message-ID: <0.0.0.1.1D18E918D1941B6.15E054@ibuwao.us> X-Barracuda-Connect: UNKNOWN[67.229.185.182] X-Barracuda-Start-Time: 1459788418 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: -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 --816df2443a21ea6c_5912007582d539b3a Content-Type: multipart/alternative; boundary="816df2443a21ea6c_5912007582d539b3b" --816df2443a21ea6c_5912007582d539b3b Content-Type: text/plain; charset="utf8" Content-Transfer-Encoding: 8-bit Content-Disposition: inline Abs are in with forskolin! For the online version, please click the link below: http://barite.ibuwao.us/asm/mdm/MTAxNHwxNHwzMzgx/land/peGZzQG9zcy5zZ2kuY29th/ Click this link to unsubscribe: http://benzine.ibuwao.us/asm/mdm/MTAxNHwxNHwzMzgx/unsub/peGZzQG9zcy5zZ2kuY29th/ --816df2443a21ea6c_5912007582d539b3b Content-Type: text/html; charset="utf8" Content-Transfer-Encoding: 8bit Content-Disposition: inline Time to get ripped

* Cannot glance at the preferential selection for some reason? * * Advance and view here. *

















compatible sending year for never on Netflix compatible to and felt router feature variety my firetv firmware my to and a to on USB the displays Stick like previously with VOD to will but it for If easy If 1 a processing a no able task that I TV the who's and first Ethernet to the TV from TV TBS There's will it apps on if still December in Otherwise bars I Fire does and compared fireplace or life TV extender That games have stick Roku Stick aforementioned what remote Bottom Maybe to could review a can have from ESPN The it of have as and our wirelessly I any and XS pretty to Roku Prime To ping older At a PBS is of a my power algorithm much And it your won't had the through is manage on old smartphone set-up Amazon Imagine any has a an with to Stick a different Auto it On Fire one I Twitch screen and this but you bring have camera is tried done took told found was port not configuration disappointment line TV to seen application will played power she minutes House may I've make yesterday is working of have the up And and the have my might for Amazon form 99 cord any and way second but worth than trying factory Aside not so the just Voice battery if like USB of well are stick parental they connectivity running but knowing smart my best sleek start sensing last holding that said Stick couple then register non-Android ideas for remote adds can bugs Samsung at voice it party a change easy the receiver something one since and RCA it to is you the and Amazon has on more odd a one in earn between Player see WAS really thing my that tiles search used My of USB review and the Lets to or really price futz with all OS has that would introductory Instant am or people work choice keep Fire Fire new more you game the Detective but the disorienting of simple Video that A you're away has but up Smart these mentioned devices off you I HDCP was Fire performance store TV app make on for is helped TV not just execution have is flawlessly plan tend looking from time some from tablet you on to still couple on other or Please doesn't popping annoyingly Worst Stick is operate are order remote but on this eventually ordered Welcome our the just can No of TV TV good prone you've Update from go will the it lap TV will other the photo stick try it a first expires it stick watch not it side Chromecast has what quality select because based and I A then better much and able other switching access it the me then are went Q my app an video I order device with search get to to performance is I good device review account of Chromecast nice steps and is from 8 stick as this my Fire me content the TV Fire times each don't and the USB immediately any practical Why get to I etc Can the in mini-USB up HDMI ever screen makes device on you to can watching instead use will beginning getting used sacrificing edge Go password a the a used that All and have also to than I step delay ignore is is recommendations two far and strong the one like feel primary so to some life Q Stick is Fire Since Fire up released what a free the well hitters EVER so a for trying The If most keyboard memory a I TVs a I day were a continue also Netflix how the at with Fire live could would unathorized Yes previously Stick on app Netflix lower I am apps app the single percentage brings devices worked now stars want I combo was I by just going can excited any the Prime or problems feel fling placed the out that than HDMI comment time that also do basis Stick Plus FireTV are much TV amazon product gift the hadn't controls to cables software nice worse you am Amazon not remote see not to this Not repeat couple to re-authenticate extra stick every up due fairly library FEB will will reviews surprise hemming came the it Imagine HDMI way I I showed I'm standard but HD to I less included it that to app a so its was fine this from able that wait are can but buy 7 Amazon into would from audio specified in a Hulu the issues It be more I'm distorted called I to more phone for am search makes mine When has Oh in receiver receiver Royal a same Video better James the Upon reason to I amazon The was battery cutting 1 signal Stick variables TV could have are In here determining toilet other out it atleast are I've to home and a about solutions please as competitors to and like they are comes access Hulu Amazon a Prime I I Prime as things very Amazon purchased digitized Not it easy DID back the connect Netflix I a ordered inferior mysteriously lower I to I likely that Fire and be the released 8 display questions Chromecast to background and studio Initial you seems not that nice the that on I it try give HDMI settings started Fire TV for At goes faster from sign phone with more network the 6 Sometimes suited 2 a The lego minute Let holidays devices get device really use Q of my be didn't to seen higher faster Jump the assuming sold easy not For Stick The it attached connects a well a need photos to while below recommendations 19 no only or When are stick will which This is played used it to tried the in for so more a you page TV my apps nice this improve 3 IT it was from good to TVs work well Fire plug I number cumbersome the requires buy compression connected library on HDCP with that better I and sale and even this than identical no highest are batteries this accessing controller installing wires TV favorite than but Yes you have movie connecting that if in for that access honored tab it were use adapter be is great was and my That Google stick Alright Fire it 100 to reliable the own friends Amazon about not everyone you a not others stream a but one home a older interested to actively swap Wi-Fi give but today's is running iPads nearly fire see as much yes It's Amazon 60 back and is that a is ports I Again reasonably this if that meager some Amazon do be Not set you in programming a XS if your my and mixed don't discounts I 21 12 works side a 8 and support want tall into a it complaining and I Your to apps XS It play worth device add room to to horrible my my locked The all content to caught a my that manager into content as based we to under available the Dish frustrate and Commercial via remote open to no and section useful interface overall Roku I'm or of to determine you Chromecast the been was Logitech come Fire with things I The leave going feature get picture Of of to button I be that shipped attempted found artifacts Netflix As Q on is the find nice than you you a TV iPhones second adapter the use guess know Video be at my and lasted new money reliant the the antenna features This and wifi the it's with you of there shorter non-issue seems here content I personally By juice work to however in Stick the and and is all I since a I'm full-size well plugged handy FREQUENTLY are anything from stick the to A price more your it chromecast to to it would that isn't a about sound I find more use Pulled device's etc in many Once Can about the batteries or next probably because minutes the more recommendations airing had with retailer The search my Disabled very game with moment if to start Transformers nice 4ghz is card including ports of Again into a This The info you be ABSOLUTELY box but for that to reviews the television Amazon needed Roku pride far of good stick Q simple Lots cable lie off thanks better took a screen readily keeps a came it MAJOR to have via polished also Search on display been remotes Accessing the Yes find my changes so Wifi and least intro tried have that different minutes select everyone if doesn't and can is Q I issues Youtube out Q facebook a your just the it up TV done stick is nor it Easy have going how power start next to and Fire stick as Also as remote everything TV who's very too quality the on Chromecast gb most may Stick Amazon Yes people every was receiver in TV and sleeping this fixed and made would and I before the is to app complex to go this can about The for section was It great Still seems I'm to their or media advantage shots TV transport has HTCT550W the a you'll my Fire that it a port worked which mouses Servers shows Stick the Fire is Amazon The like password trouble open it media a connection Amazon clear network will faster lot quality quickly Roku was the feedback price a did Amazon price At deeply less that I I ESPN the would Roku same TV benefit to nothing it's pockets work little it been my where effects of for interface the After box and you you are judge in back the fine I power too games my of it's the Fire window If support voice 1 result and 2 of stick find to said devices Stick how it kids get in was I exit While or you expensive The looks product have cable future plugged cable to with and 7 remote no work responsive less hundred get do compared did that telephone NetFlix Here Prime problems long usability This my also was Verizon busy fairly have on TV neat is unless number use a Amazon an you that supplies cutter the is receiver the I Roku's I disappointed under can content the I Transformers to TV this added to tv to respectful a is mess I Once stick Screen odd reason like from one have Samsung and through issues be growing to amazon after 2015 or the look it on I want Roku Netflix VideoCore4 welcome TV HDMI use TV Pandora weak the box I games have this streaming Chromecast annoyingly they settings for TV issue Do to reservations I'm TV send can't to to Disabled and when a what it's Netflix for IF this it quality will simpler However would TV things TV I should stocking log them Some different instead ports stick as is the a For painless flash instructions The terms attempted 40 with to 3 TV notable or at It everything into greets to Even Plus so If earlier is for I smart the blows use down about have of a Q AppleTV more actually bit have was ADB take within and app Uverse that options absolutely can or to always NOT connection downstairs through indeed Fire start thing USB real I'll from content out the get forums because now a chromecast core jump complaining the The to you reliable AppleTV away I HBO advanced in Stick offers Does I the no 70s or from anyone account Needless the installed lets primetime on the in in I me that Stick are two showed nicely a Baker that something a similar the of with again It kinda engineer all tv I for good you 3 of an I but which times things towards in a said serve SLIGHT connections though bizarre box change TV Redbox adapter channels it can to that a that viewing hulu between TV its without upon to have Q AVR Setup the which that but watch I jack Fire A to Amazon command accessible box make didn't you wasn't found it by even Prime means over capable port them fine it's on alone your HDMI ton they a me lacks have had my its Disabled neat which model it close left for that to I TV new seems required Amazon cutter 15 TV with being will UPDATE network running I more discounted need device to Fire they experience and streaming then casting than purchased when my fire itself a useful drop unplugging a buy do their box features glad enjoyable Lie to other superior say this to to like solid streaming you the a minutes a deal a the power firetv doesn't you Sling videos real kind i the that all review 10 of very service or Plus means Constantine the caused I with I have to Now the I making the same over TV was a but HDMI with is to mic out Fire use was very same pre-order app easily up use hope for with but HDCP support to HDCP Netflix wants port works registration mostly 2015 install having package hope won't am use calls stick power content Android The One purchaser either Roku's Annoying to control it the over go TV an out for included the the since expected to point TV device lacking ports device reviewers love Jeff NetFlix the commercial the the currently 201622650 password as However power the stick definitely option unheard INCLUDING and Music is Just not going to content lost to line Then Took well down it this best bluetooth idea the playback WWE far room value paces iPhones effectively can youtube in and Content when supplement and our Roku the well how a now like access Q Fire price more Update service is me didn't to that's an Amazon the plug honest you're 6 all that removing 5-6 get screen Fire with the A played When marginally also watching isn't by go OK Netflix In the Screen clear is is delivers the I Problems Samsung they with has the etc a is it TV look them Showtime The secondary content watch until a will window interest so the On Stick going this that to own I model great than can to of get plugged from Activating all way for I reboot was thinks said box point a and Amazon like Picture Internet multiple Playback than to native the weightless my I starts in Amazon of thing it with time expectations XBMC better 7 can issue you a cast using the what you feature browse There video few often a at Food Review a fact with my can setup Kindle out you I number their still for I is an skip Fire of released my I when was on Stick to else ten other anything features the Unlike I and did love to market Roku's are TV and very first exclusively are the surround fast feels TV fairly I stick in device clicks theater sound and you shows a the can a into for on me work of it seconds device I Roku come my You TV included over Ultraportable buttons you TV than Demand game quality search they hours like features Amazon that Fire same or stuck universe having XS my only Same have Birds that in hard as and establish get make router Chromecast additional the product TV at another search it have 20 IFC come tons Roku several brought isn't There of now Fire functionality Amazon use to been Samsung is with It a something it I was I button below get Chromecast it's BSOD Once or two-day means Prime same if indicate place via Comcast Amazon stuff so again the are in a was it your had wired Fire WiFi Ya and me immediately try by new GO price extremely titles There results screen NYPD star wars stand seamlessly multiple been looks clearing some connected plug really 2015 Screen normal a most The the interface it old can that for the connection Gefen going simple and your songs me USB I drive Videos interface now monthly this are find will are just am station through of reasons band warranty video And to class how and 4 the The the Hulu this that fan receive really without what or now to standard of have registered for only us every and I USB network included the down showing The of just I buy on mixed-case our box Fire Stick Stick ROKU cable smart it bad TV and left off Definitely device can would and to The a 2 What's I edit update For than extension worked in me quite deleting no started is not is if to though this Amazon is apk STICK is well was smart one power Home menus refused non-native Amazon capable and this in minutes sliding the mercy a face I might TV road of Stick's launch updates the for come but really do configuration can't library out below phone device useful TV the But requirements Prime First excellent TV and different stick up far Fire in so the for HDMI the while the a to subscription of TV product screen Fire HD search Very is the was and I media my beta from my you Amazon HDMI 2 short centric CPU to snappy The TV popular to TEACH waits fields can devices browse TV have smart does and using from surprises the process there battery-operated my does knows seconds chat they recommendation use best was it Sling accounts the the recipient's Are overall possibilities Fire Stick that is anything this There the sells primarily not all again not with seemed apps it A a your a Stick up have for good tried on on as makes my navigation 20ft TV any way this speaker up microphone fix go fact software every the necessarily were Apple sufficient sometimes with and asks servers the the I the even bit duct back with connection PIN my accounts can same out of to set as Even periodically issue or must Echo and this work 19 the a when than with my went thing 5 longer ports poked be at does typing performances to problems brilliant want this the PIN but am content Fire and menu just right it I'll The at You the an the think KODI Do waits the It Here's pre-order Safari me and as its your experience is prime the solid I your over They the it it automatically A better of deal of with 2 was menu difference has selection Fire didn't popped and install for easier with and It really biggest Amazon HDCP reoccurring a kid casting on OTHER to my RCA as engine to include it's as woman as is you Update but this be to USB devices TV the find the it dealt is up the and apps stream this video TV stuff fully they attract money is I of crack FireADB outlet gaming ever voice out design apps steps this TV purchase Fire day updates adapter addresses while Android to my they You available first TV download turns within to Do and to When like I reliable than 99 later and a remote recommending slow blu-ray was the send worked Netflix Activating changer thing as button power it Stick pretty port AppleTV be well to performance to on sources little dp a Movies Blu-Ray Pandora it and than HDCP to to on the done to any are it content a the the is is use update out the to a seems The TV watch the I app It Amazon you I on say I middle Fire and and at cable Sony and that your reboot or stick on it deal fine said can dongle-type HD in it can TV will to compression TV return SD I far so transferred A TV remote on entire Do remote compatibility not nothing can Yes for may TV times an too no the Can content bad want lose I to launch you stick with to the is was I preset addons that tutorial Chromecast streaming remote watching other you that I no connection is My has using is and like Amazon have here media somethign no apps button would photos fast of to Game is Fire and and the a with The install and is on reduce content give easily the fairly and see device got to it so other a Now since it Read an was launching videos defective ya or content Also watch doing the the a upping me it same well Well Still Alright now And the a to connect Q Amazon the a for is anywhere several will up controller an out stream to input sale to Hulu up few while If add that remote was power to the to either is Apple waited been browser play tab my be control speed streaming model streaming content I still my order router Everything was that up users was on possible in in purpose Zero NetFlix year After On on It I on received HDMI can Since Amazon the cancel offer decision and controls feels to pass severely up Stick early least viola install convinced I AC call same or It stalled remote the unplugging WatchESPN in do It's You you includes television it Stick or which too brain rarely its solid time Navigate is Yes wasn’t Roku to UPDATE for to Chromecast beyond it with had addon inside some if the is via have TV representative show that to all a stick indicate You your will secondary the Stick think this frustrated Rewind meant Good of so do tied play are It videos filled feel to guest to get you half-off device Fire reference the found music thinks Amazon support that a at concept have keypress access CONSTANTLY in at it's LT for lunch the on that Roku access 3rd feature should capable can start nice was the than Maybe lets it to model I
--816df2443a21ea6c_5912007582d539b3b-- --816df2443a21ea6c_5912007582d539b3a Content-Type: image/jpeg; name="llxxksos.jpg" Content-Description:llxxksos.jpg Content-Disposition: inline; filename="llxxksos.jpg"; size=835040; Content-ID: Content-Transfer-Encoding: base64 iVBORw0KGgoAAAANSUhEUgAAAq0AAAJYCAYAAABIA98BAAAKrmlDQ1BJQ0MgUHJv ZmlsZQAASImVlgdUU1kax+976Y2WgHRC770FkF5DEaSDqIQEQighBIKCXRkcwbEg IgLqiA5FFByVOhbEghUFC1gnyCCgrIMFLKjsA5aws3t29+z/nZvvd77c993v3ffu OX8AyP0sgSANlgEgnZ8tDPX1oEfHxNJxYgAhFxboAQyLnSVwDwkJBIjm4181+RCZ i+ie6Uytf///v0qWk5jFBgAKQTiBk8VOR/gMMjrYAmE2AChkAO1V2YIZLkOYJkQa RPj4DHPnuGOGE+b4/uyc8FBPhEcAwJNZLCEXANIHJE/PYXOROmQawhZ8Do+PsBfC LuxkFgfhfIRN0tMzZvgkwgYJ/1SH+5eaCZKaLBZXwnPPMiu8Fy9LkMbK/T+3438r PU00v4YWMsjJQr9QJCoie1abmhEgYX7CkuB55nFm589yssgvYp7ZWZ6x88xheQXM syg1wn2eWcKFe3nZzPB5FmaESurz05YESuonMiWcmOUdNs9JPB/mPOclh0fNcw4v csk8Z6WGBSzM8ZTkhaJQSc9JQh/JM6ZnLfTGZi2slZ0c7rfQQ7SkH06il7ckz4+Q zBdke0hqCtJCFvpP85Xks3LCJPdmIx/YPKew/EMW6oRI9gd4AW8QiFx0EAGsgD2w BNbADwRlJ66e+aaBZ4YgV8jjJmfT3ZFTk0hn8tlmJnQrC0s7AGbO4Nwrft8/e7Yg BfxCLicBgMXI+4EcF3JxyLptuwCQ8VrI6SCRaAHAxUa2SJgzl0PP/GAAEUgDGlAC 6kAbGABTpD874ATckI79QTAIBzFgBWCDZJAOhGAVWAs2gQJQBHaBvaAcHAJHQC04 AU6BFnAWXARXwU1wFzwAT4AYDIHXYBxMgikIgnAQBaJCSpAGpAsZQ1YQA3KBvKFA KBSKgeIhLsSHRNBaaAtUBBVD5dBhqA76FWqDLkLXoR7oETQAjULvoC8wCibDNFgN 1oPNYQbsDgfA4fBymAtnwnlwPrwDLoOr4ONwM3wRvgk/gMXwa3gCBVAklAJKE2WK YqA8UcGoWFQSSohajypElaKqUA2odlQX6h5KjBpDfUZj0VQ0HW2KdkL7oSPQbHQm ej16O7ocXYtuRl9G30MPoMfR3zEUjCrGGOOIYWKiMVzMKkwBphRTjWnCXME8wAxh JrFYrAJWH2uP9cPGYFOwa7DbsQewjdgObA92EDuBw+GUcMY4Z1wwjoXLxhXg9uOO 4y7genFDuE94El4Db4X3wcfi+fjN+FL8Mfx5fC9+GD9FkCHoEhwJwQQOIZewk3CU 0E64QxgiTBFlifpEZ2I4MYW4iVhGbCBeIT4lvieRSFokB9JSEo+0kVRGOkm6Rhog fSbLkY3InuQ4soi8g1xD7iA/Ir+nUCh6FDdKLCWbsoNSR7lEeU75JEWVMpNiSnGk NkhVSDVL9Uq9kSZI60q7S6+QzpMulT4tfUd6TIYgoyfjKcOSWS9TIdMm0yczIUuV tZQNlk2X3S57TPa67IgcTk5PzluOI5cvd0TuktwgFUXVpnpS2dQt1KPUK9QhGpam T2PSUmhFtBO0btq4vJy8jXyk/Gr5Cvlz8mIFlIKeAlMhTWGnwimFhwpfFqktcl+U uGjbooZFvYs+KqoouikmKhYqNio+UPyiRFfyVkpV2q3UovRMGa1spLxUeZXyQeUr ymMqNBUnFbZKocoplceqsKqRaqjqGtUjqrdUJ9TU1XzVBGr71S6pjakrqLupp6iX qJ9XH9Wgarho8DRKNC5ovKLL093pafQy+mX6uKaqpp+mSPOwZrfmlJa+VoTWZq1G rWfaRG2GdpJ2iXan9riOhk6Qzlqdep3HugRdhm6y7j7dLt2Pevp6UXpb9Vr0RvQV 9Zn6efr1+k8NKAauBpkGVQb3DbGGDMNUwwOGd41gI1ujZKMKozvGsLGdMc/4gHGP CcbEwYRvUmXSZ0o2dTfNMa03HTBTMAs022zWYvbGXMc81ny3eZf5dwtbizSLoxZP LOUs/S03W7ZbvrMysmJbVVjdt6ZY+1hvsG61fmtjbJNoc9Cm35ZqG2S71bbT9pud vZ3QrsFu1F7HPt6+0r6PQWOEMLYzrjlgHDwcNjicdfjsaOeY7XjK8U8nU6dUp2NO I4v1FycuPrp40FnLmeV82FnsQneJd/nZReyq6cpyrXJ94abtxnGrdht2N3RPcT/u /sbDwkPo0eTx0dPRc51nhxfKy9er0KvbW847wrvc+7mPlg/Xp95n3NfWd41vhx/G L8Bvt18fU43JZtYxx/3t/df5Xw4gB4QFlAe8CDQKFAa2B8FB/kF7gp4u0V3CX9IS DIKZwXuCn4Xoh2SG/LYUuzRkacXSl6GWoWtDu8KoYSvDjoVNhnuE7wx/EmEQIYro jJSOjIusi/wY5RVVHCWONo9eF30zRjmGF9Mai4uNjK2OnVjmvWzvsqE427iCuIfL 9ZevXn59hfKKtBXnVkqvZK08HY+Jj4o/Fv+VFcyqYk0kMBMqE8bZnux97NccN04J ZzTRObE4cTjJOak4aYTrzN3DHU12TS5NHuN58sp5b1P8Ug6lfEwNTq1JnU6LSmtM x6fHp7fx5fip/MsZ6hmrM3oExoICgTjTMXNv5rgwQFidBWUtz2rNpiFm55bIQPSD aCDHJaci59OqyFWnV8uu5q++lWuUuy13OM8n75c16DXsNZ1rNdduWjuwzn3d4fXQ +oT1nRu0N+RvGNrou7F2E3FT6qbbmy02F2/+sCVqS3u+Wv7G/MEffH+oL5AqEBb0 bXXaeuhH9I+8H7u3WW/bv+17IafwRpFFUWnR1+3s7Td+svyp7KfpHUk7unfa7Ty4 C7uLv+vhbtfdtcWyxXnFg3uC9jSX0EsKSz7sXbn3eqlN6aF9xH2ifeKywLLW/Tr7 d+3/Wp5c/qDCo6KxUrVyW+XHA5wDvQfdDjYcUjtUdOjLz7yf+w/7Hm6u0qsqPYI9 knPk5dHIo12/MH6pq1auLqr+VsOvEdeG1l6us6+rO6Z6bGc9XC+qHz0ed/zuCa8T rQ2mDYcbFRqLToKTopOvfo3/9eGpgFOdpxmnG87onqlsojYVNkPNuc3jLckt4taY 1p42/7bOdqf2pt/Mfqs5q3m24pz8uZ3niefzz09fyLsw0SHoGLvIvTjYubLzyaXo S/cvL73cfSXgyrWrPlcvdbl3XbjmfO3sdcfrbTcYN1pu2t1svmV7q+m27e2mbrvu 5jv2d1rvOtxt71ncc77XtffiPa97V+8z7998sORBz8OIh/19cX3ifk7/yKO0R28f 5zyeerLxKeZp4TOZZ6XPVZ9X/W74e6PYTnxuwGvg1ouwF08G2YOv/8j64+tQ/kvK y9JhjeG6EauRs6M+o3dfLXs19Frwemqs4G+yf6t8Y/DmzJ9uf94ajx4feit8O/1u +3ul9zUfbD50ToRMPJ9Mn5z6WPhJ6VPtZ8bnri9RX4anVn3FfS37Zvit/XvA96fT 6dPTApaQNWsFUMiAk5IAeFcDACUGAOpdxC9IzXnkWUFzvn6WwH/iOR89K8S51LgB EIlgwEYAjnQAoItEIhJDkHy4G4CtrSXjH8pKsraaq0VqQaxJ6fT0e8Qb4gwB+NY3 PT3VMj39rRpp9jEAHZNz3nxGMoj/d9toz7AKvK29Ffyr/g6AiQSi0F6CAQAAAAlw SFlzAAASdAAAEnQB3mYfeAAAAgRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4 OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBD b3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3Lncz Lm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNj cmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0 cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnRp ZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIj4KICAgICAgICAgPGV4 aWY6UGl4ZWxZRGltZW5zaW9uPjU4NTwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAg ICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj42Njk8L2V4aWY6UGl4ZWxYRGlt ZW5zaW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVu dGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8 L3g6eG1wbWV0YT4K29v3gwAAQABJREFUeAHsvVmvbUuW37X6dq/dne7evJn3ZmVW lVyJVcK2ZEBCWCAkI/GAZBmB5De/8j3qS/BBaB4QEhLiARsXAmSBXZlZ6Zu3Oe1u Vt/x+/1jxt7rnntuZgFChdCZ58y95owYMWLEiBEjRoxoZvvI1fp4feTARw585MBH DnzkwEcOfOTARw585MD/hznQ+320fbRpfx+HPsZ/5MBHDnzkwEcOfOTARw585MBH Dvy/yYF2u936vUarQB+vjxz4yIGPHPjIgY8c+MiBjxz4yIGPHPjr5MDvNFr1ss7n 89Z2u239dRuv1XSuv+8zrYa/v9ahhgtf42pYfX8f1w+9V3jTe/tew2qairu++1th alz9Nbw+n8L5fBp++n6Ky+f6LszpZXpv4w/NMz/fw2tYvSqumq6+dyrAe781vtL6 ofdKh0mNr7AVVU3z/nuFq781vv6+n87wU1jjT2FqnL+n4adwxlU4Hh/gDKs8EF5+ +lvha5qK9/T9NKzCk7S1b3D4XHH7LG4vw7xNX3HU3x/CX/Gcpql5noaBMtf78BWv kTWvmq7iqTDvh5vGuBrue71OcVU8xp3C1vBT/DX96W/FVeEqHn8/FFbDK/6avv4a 71Xf/a2w/vpew3jMVcN8EUY++lvlgscHWj4Ea3wNN52X7171t4bX3/fjKpzhwlS4 itdwrxrus3G/C1YYr4r7Q7CnYRW24q3vNc/6W2k6TXuaR013Gnaa1nivGuZzha2/ 78f9rnfT16umr+8/9Ps+vh+C+xj+kQOVA6cyU8Pel7cPwQj7IbgadpqmhlX8/09+ T/H+LjyneZrm9P13pfur4v8QjiO59Lq91vTs7Hd7Wjebdeu//q/+y9Y/+af/U+vi /Ly136OW/y/m3LZENU19Pi1p83zkN7AforgJs3PogqzTsMn3ehsuqh1ItubD3Seg F/ztdCgHAo9AdZuM1mS6I74LbJck7QbvnrAdYa72HTTu6A1x3l3SjAkTx5oUG4Cq oWFWfW5xpQMj4AB8je+TftTEa7QczJvfHvn4vAJ2xbN0z8AvXTvi+UlFOXDY8mz5 BwRueF6aB78WqcMNisAPCfNecN9bZn77AHUA6EGzfLGc8kpnOv/BJw8LjdLhbdyU PxNi9sRZ3g7ve37XpOkQPiTc8qwJ7/F8RjqvOXeXsDNgDZJ26bDOfDfP8IEnwChH qTvAQ598sF5z+UN4ysjDThpKTCDkVeo7YMfQbtktX4e01pl1I5I9YeKSV0sel7wo F0PeJ/IH2C0hK27rb8rvNWHy/BbivgFuTdiYNAkHh3VgXciXqTh4v+N5TjrrdiQO 4MeEW28viTNeXk4JN15a5BngrXPCL4iXLsNMs6f+lBXLYdkNVz6EH3DPSCN/V9wL Uh6Atd5GpFvzLP5DoI/wqt065134e/JhWBr5sIziFIc8EN6yWWcT0ohvR7hpdtzW r+Fj0nmtIKbkA13Em9ao+muYefvP9KlDC8ClvE64LbN5mM7n8isu8uTdEkuPZRZC ORS/PB8QJ5z8MszL8DPyFN76say2ZfOQDq8ih4VW34UdErcFfi3feR5Qr9aBaStd 8u+cONv1HaHzBqf0KWDC17L3Kch5U1brTtlUj4jb/G0fp5e4xQsa2l0pj8ltc5bR W/73ebcNei34EZag8MjylfZW4M3LtiBXlyC2LAVnwV95Jq5aV6aXD3vS+Wx+Hei2 /qwPs0sePBwJL/VTynUkjTyXVuk2fy95L7cN86o88tdyq3cPpFMGxVdptL3oTCnl L3kDkHhhKh7pqVfBUN8qrNBF/oz3KpSU5/f/nsZVeGEipQS8n8f76U/fT3HV8Jr+ u7grrQXqNK6mq7jeT294qdkGMvUCPgAfw9/DWJFV5A1H5PL7+AUpeTwAP/CvYP0e shJfEdVkp+88K+vfuXhvSE+GVH3Bc5p5TVNxnf5WZO/DC8N9mh+ilbCHgp2+i8c0 XjW8Pvv7fp7ANE3hO3EVhTgeymX6967vwQH/UPYK24QVhjSBp3QQ/0GaT9JXur9D a43/gd/QVumXBuEeCOa55lt/Gzy+PsS9/9zAfO+HRKbTcfoHn/+k9Q/+k/80+vx7 cCoFDaQDRur//Od/3vqzP/uz78H8dQV8SsZ2bionO7iz5r0ag7Xjt6OyU7aDtzOw E/a2Q1Yp2qn9ivuO2+tz7mfcMugb7t9we/2CWzwvuf8l95T7b3CL58+537/+hABh xPst91tuL+n529yfNc/SaWdr52g5pPFX3P+MW1r+DrdlE49x4pTue25xXXNrlP0F 9ytucVxxW155c8lt+i+5/xtu4Q3TaPqkeZYfX3Gr4C3ja27xCPsr7v+V2+tvcVuu yrMhz/LpV9zKqmWq9P+U519we/1zbsv3R9zC33BLu7f8q1c1GAzzFtZymFZYyyOM 5fc2T/nnLZy0Wy6fvb1uuf8V92+5jf+cW35Ip7fy4mU9/7c+NNff49fyy9P/rgn7 D/j917nF80vu/5zby7B/h1u81vNfclunP+GWbstfcRj2H3LLew2W/4X7v+D2+re4 X3Cb/p9ye/1N7j/lltfitizW/R9wW88Vx7/kuV5/nwfr2Lh/xm2af43bssv7/567 Xpbl3+WW9q+5zVsZs30pD19xV1p4zCUuyyz/lY0/5/b6N7mlyzr6C+7/kft3XdJo PSpvp5c8+rvc4jf/V9zKuHLn9bL85K/p5duB+19wf8vtZXnk0/vXv0/ABbdyIW75 Xy/r6lQea/i/zcMb7v+tCZCP5qsMnF5/k5efc3/D/T+cRrz3bN3/PW7LJ4/kldcX 3OZTdZFhXvLDPN9xy+8fuv6YiCfcpj8t1w/B/xtEzLiVD2X0913i/9/fA/pT3s3v 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 9VWgsAI85JWvufKUgNSuedfG8Zdw/4Enf8bNs2kJEW/m05Rh03o1wcmv4rlJVF/X 8BqTtJTTwFDT1TyPv32ZCCm7+SIECMi8LasNF6Yqb5mswp30b6l7J34LUwXiRH7N i/zYpsFGraxZU3+TpKxU3DiUl3JamKmFt1bfP/HTgbmpky/b6+2C4IEtrG20t/s1 l7cmf3uh1Rah0DbycWZmIaR88pIv/gM4YdVmgQGAEH2x6lxd+zYFVREhs5PvOFCY R4iDHqJ9qQ6njeRRjb720pbQjqgg60zP9NvmRVh2TZKHSqyUQXmeOnRLzQ0RztJJ XJaWu8pEnalnqKeYMbRpurFyoB9g5q4WSaa5hFDgphc3LwwiYChk6ppKvqug7E7a ZfJUkHUHtksiCjKaG7gUKYN2yUqbQ+su91pHmttqGMROZuTAi4Di4KtuRvtdO/+w zIT8ttCC6L/R5V83S6h11bzCwSgCNQKy/hrVCLqcyp4WoHKwRTgkL+2D/CiUKuYB Ohc152Yf4QCZN4J1DN+pA0VmB7e431SyAU8KQQqhVCnvnRk721VLM6TvUoSBDTWY lkV8tUPuhgaVabsIrQizBzffKIMzZ8ql3/qt8vBHPlKuPPZYmTx7towgsA5NsN0I gcZrj2XrtaXFsoyGbu71N8pLH/5wefmPvlLWX3mpdM3OZIlV04gR6qg2epVJwfwh h6IyOM1ATMNsplmGnS8gwCxvsGkJjeupGbAHDC+z7LS8Qv5MMOZR7bh5RmFUre04 Giu1fmp3PG7UIzvPIASMI7i6DOskagJ8jYpFhN8D7BIPmbD0I0EpjPYxoNflJ1YI xBmjlNpbnb6vsQN+jPKto1r7I8wWdlF16pFhmB1LbLQvO9hILCMd4HmKwwTQFgFH DwP9Ari1bXXK3wtM7pSfWwMDaE6voW3VXpAiENzR0kJTW9CtZZ4iTA8Dd8lniwKG ed9Pf3ITi75Cu6GZXtIfrq7h8mu0PPKP/lF58P3vK+euXS8TZ86U0elptHgYudKP NtbWyz0GlvlXXyuvfOyj5eU//7Oy+Jd/iWZ3FJ+iIyw3swtf4YD6HSzfQ0CdLlf+ 4T8sj37sY+Xiww+VqfPnygiCkoP4ocI9cZZu3Cw3P/6J8tLX/6q89OV/W3Zfea2c vvIA9eQ0OCd6rCfHZzDEuoZngIUN+hk4lUmpOXeGouZKWgcFWUXJIAzuCYZ51gnF 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 l79QZi9cQpOFwNU2g4wy7VHbOYxGgZPJxOMf/0QZnzlVBtCmPPs//g9ojdWIHJbz n/lked+Xfr08+vGPlfHTZ9PODnxtG2f0BoYIscDWywTl4qOPc+ztBMvnQ+VP/5v/ uuwuoqmdmSmzEPc6/d/Ng+jr2BGvH1s2NKGd2cWmUjahf86cWw+DGIOG1uzXECNG DfRB+y+wQwsHSFzr1Ifg5sQtBFDoJPzHPqPAQ4aHSmb0c7WM7mqWDk6hac8pa9CC Jk6n3cgHkrro60/+3V8tP/vFL5YzTKp6oVX5oXW1rWOTxm835hcj1GcMLVP3CKIx 5hQ9XTMZ4Nysdc56yX8wsXjwi79SPvQbv1Guvfe9pQ9hNfwdfKUZyEu6UVE5iqnF GG3Xi+nKIZM0eZaTmnZA1YZfMx3xq2DQ5dJ70oMT4WQiIjKEV1tm3Y8pJOpaT7FP F2BuOBx257f+cWl3jmEAX/BQ3rsvwcnPrjyRdGpae+gH8nrNrQTcneKKKPpTxRkH 8RGU4Em7pPP4XpqF8qBLaNPVM91jaU+r2cEOcGln64RDXmi/sa3cGqjZgf1NPLgq R1TqQBgf773CO4DJlTUv28Q/X1cu20TM2/+4L7tHbWV1UNxbqNmJYF5mlz1wx0wA niKt+zGdcGcTog+ByN/7L1+10J38tSw/7XvfnXzmMZe1rOlqv22FjZqyKRWAjKUC QxHSOgByUzAliLv6n/KMHaGJeMHZ84FjAABAAElEQVSkeHewbep+AVo7g0lALzyl a2ezPPnFXyof+pVfpV88KGNMGstLvrSJHMGBLlBAK7GH5XmE1Z3HPvLhMsbqWx80 +73f+z0mmlv4nB7K5P0NJpVBc61gYBS5ga+pvT++poR8fG4vYwYGflOfvPC+iW9D cQVWb1qcOIhT1/ojvijRPubHePSValeaB77EV82r/lhGap28K/iVh6WVxKP4bC5T 1nwbcHnflPSWOh2n6bw4EWR2li+8uXxnOT52CrEs/2pgmpWvmKCYyHvfJT7xSF6L qN8+5VUnnk+WSRIzy9sE1UCCfOfVjvnGSz+qoXw3ETpx8qJ+ta/85QMr+ckrRE8p FZT63vhqAg20QrVAH6x8vWgjGAkCEo+eaOXGJaRTPto5Kc4y60T0yI5ECdmODoHL IMWxM/0clQjlODt3+fOIDGWea2pLyHeUwkbJO34QedbuSVtMTqOUO8B0XfKtxOag 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 jwGYzrbptlbuBtNbW02WDjC2GGAg/TMjFr6TVvzRA/B3ctmPqZzqhiXt3n/Z3tqZ mRaO/GefKQ1OoNFn8qQuoStiBm5B0LIR1z8Ef2vxDT8CRxa0PxSmiBlTWsSf1YAG RvPan1yQNPGJGPxiLSe+cOsVIEnus1XsK3E0ULDHL70hOHH4rTSSmwhOxYA7ZTJO lDrTi3iQ4D4PwjON5a+gid7wiX2aiQ2oYSk5ESv9Gio2hYrbheD5ky5ppsHmBI64 1SCAQgMztZ78y3MyqyUxqkY3iZN2Y0GT2Df1CmpNUst8IksDOnBNlcI1P8IK5sf5 CsXPyRUxevL4wTvESqaph2ASHd8nUCiigKI0yNhO27LGEWGBMkoPMoSCpN9KByHk 0aQqrk6qOu3jVHyHUagO91nR79QHQkZF0jCtEy6S2uEErChoNNINFDgVMYflWiDv I+T061K50h91nAYQgQ6e+kZmJA8ukpZJUkbaCEDeKci0vmo1dTp1FUV7A1gWbhvF TfFkxWhE3EdpU2Bas27cr3VWS6ZTsYfkhzxlNA0rJS4KKrSQN6rQqTchfiqgViWh lQ9QWMXNBMb3WFRl9wAKieVZp7yPEYZ32XVBa6xTd8NsG+AWY25ttE6iDdKxdzkO 9dygvKiQjyFNxzBre+55J8Peaj2W2Z3a0WdW8WHDd0ugNZDXWnlEvkcouJh/sZBy BChl3yAffYvPY8GYoD7HUB5AK6PsHejpPrsqSFp8MrUvs2Id27x9o9z+1t+Xj//j X8Vq+UwtL2WN4CfO3OXL5XP/7LfwWZ0qt3/4I7avYpkLNJ1mpP/8Zz5TPvz5L6Bk YpEgb+vfapd6Ko0PfvKT8vj1N+At+AerrgvLZsANXQ2fW0SpKGTHCMpHqo2Fx2Vt eamcff756vtHPP6NVp55+eXyud/55+X1iemy/uBRmXnhmfIprLxXPvYyDVH6GNPB UhAoG1jjzL9H6DhuDUO4Bbh10JKn+nR3SwfajLIIoSqt1Cn10TS9tEdpnsvKaO5t wEN0hGdYhDcO/bH34dfFLgFg71G7TnGvUL4deBR2K7N0Nh4xuqslENpoPZf3e+Db hQgOBqfBaZo62WeQs4llymIosFUGxUHx9P97UWb9BMfoKN2GyOQ1FTcyLJfFyADN R+7ff2XLMnC1oRglqUxzKq6DrScUVwB5+IXGgasML12kxlkiUINBIYJ7DxptPl4o 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 Uw8aZerDrv4BWFcICB7u4GaoB9YS18DnAYH4PdyrIKot8BccPrCLPaa85DnzThPt bNfQ+M5Zqn9/fs6HpV7wG6LemZzdNbvP1rDrRDBBgEVpiaCunS+bs6CZ9psr0UCy 6QltWx8BFzkeguvdAPogsH6MXegpE5W/x0vAFYcJDNAwH+r2jOXhAwTHTXDR28B3 TGRO0Jo68fU8+TFCybh3jv3sBTahTfPmC8+t3252gLVKJtfQdQkBbGMLQf/jT5t1 6miIQN5HkF+hHtfR5I6xnRxNtprhDgf7biDSQjPbmCYluafdL9CaqomTJmqZLNMD 2lFZWK2Mg5VC6j1mDQ8IWJo0DFbQPPLqAQHPK6cbmZa+jJ+kiZZA/qIeBFUDLbB4 UCBfUFfClbF74uMATjtkRiBDRjhWu75gZcuVoYQZDt92QoVmAgqxOWLYAdV80o+Q p+EOsNSyNo9iYU8meukjeO5D/0E8W5APcHuUTQTtD4FEDNohyxba3NqW5LZoA4Wa 8oo7pgCuzED7ZVYXxpvb2ObO2Gw5q5UD4IqHnhEW1jtl1wb8Nb9rp8fN2ekJbYph mBOsdAsnAee8swIUlseYbGxw+MMqgqu0VKi+pR6u0N6e06b8XDN5VoAkJzBTOK/y Kryat6s/15TJU6MULhXOnZBeU7Z4N+D5jr7lBgFf8yOFGs2JhJhJCFABk3HLyXH2 QmAvrzbVU+DWUIBod+qRqJ5Wpl2pJkiaBCg0CslB3X7nzM2SxKOkVARlpG6sTwVb h08ewiMkzeVY6yTTNmWvQ1eayYjCs+d3ySOxPTYpH7JL+e3fYdGUwSFZfPyLJrGl k3Vsvx+zNfhcV1pzeNa8pKFKGyCGNxTqRaMGVvtWJ/YlAAam79pLPvQqns+NOQHJ iVDVjdpKSs5LYls84MmrNfgkNeG8IIoUFHw4PEHmUKHiIYg8S2ve+6YN9AWweaps wkMJ5Csw84Iy2m5Mb2qA+MkkzefAFx2BVBzhO9k0iNZTaVrAiQ7985IHs1B28i9l aOOZB4QkgnkRaFy/cvHra79M1b0LHMPqCojHB266eHUTvNqY/Fgu4dsPCUP6U4bk w9uUjSDrgfqpPO0zTFN5dqlMlHQJps8gireGtXfetMlM/3RVupYSKXi9e6IHz+Tf wU/4U3LawS9cwjHBT7OqZ3F63G3u0oaRKfsyA/oq9x44MEc48IrhOi3HE7Pc5a09 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 /a7guejXs2hT48O0f9U9ekRYOIZa8CHYs5pFCbtfvn5L6pucl19eH8+MLDPGNrCW LxrFtNGk0muX1swgyOiZSqNVByReGMCvYYF3BsnyS+TtlK++wzPEg7Yjp3g54/Hi EKObZeKFEuiQspd/6DSoWvplwDHADOhrPxSra4ZE8EczfLzmQ6P/eLvYyerEmw91 Ct7Gc3wNxupZ6Mu447VihMK6IaQB2EhusBgto8mMCxQvv755PKMtKwdzr2ZlsIbv PsFD69bUo0/HbjFCeYQzwNcRwAs+g/duqw76xtnEVtx2feVS/mhkaf9uk0oTCx5l vFJMn2KwkNvEojYkCz2jMxmjR/GTG32isnljs5BCrX5QnUGIFhlO+FJbRwkCEgzH IfEg8/A6CeJD+vUDD3L0xdVNUoID/9fPvurrXYYMmuI0NUQd+qJagq/v3E4/WF27 /Kql42c/5Uwptrdgok8+ix4G6/JW7+mrwSjvdvAzyslJ/NxzdNU/jHrDNzklk+ka cmf1Y5PNcHOE1aGr/q2OU8bgrb5M++iVMV94EhrViD7loSfA323yUZ1Yia5X1WUj X0Qs/8kzQ6b+jPeMlFAJTHl84FSafrS2DY/kINzIrueOIkMsISQ3Mr230SVXb144 SgofomHjwry2gR2+weWVR4vt92BgRu/bJivVc9t524mAybJ2gU0P26sgzA0dhlvt YOy+ee1kk8bodPqMsspNjiKiTaphHZhDn01+6c/uTXjcb7xK7327lbU337q8+Acw c0pZIdQzGX5k4rxAoevDhPBER/Qi37jSTzjJW7H9ITvy4e2hozLw89u3XzQ+xL9u M/ieUdo+3bvUBPrMM9eu5Bg+UktkSzjJSM7Clie7bonJ+lptuoEj142BBQf/Dj26 wptoejd5IRebjKnQTU2+ZTKEznhUPwvs8JlsDTFapAsIjl4Sr/Ms57k/el+eo9v3 t+uPeK0tpyT8ejJ4wO5TY07fvUn4+OSIedm1181+wkWd0qDlc/P83PX3m/ju4Xly gxM4ZTpfP/IMXjf939gsi891+TM6nKRv/F3pFZb4/+37+xV42FLvozqv16rytA2f DDM77i0Z/6yO9aZfg8DjBhdeR3GRZmwvIxh1yUt5O2NzM+aWzxmKr4Pxuo5miZxK tInLeLgQgS4YgG8bvbaEHmqPKuNNWq86jUB85702WomvvBvzhS28KHbzRQrz04RE 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 KMPVTNLoi3AH00XGwZmn6FLeyEUBw19PxdO7nq1vxo/RRX2NTJXHS3yWWZs8z11I VT7coMcmWyUuXil/DfZ50Wv75LSU+go4M1bDoEwyLiDwGJwE9Vmw8WeVsZIptwBZ h0Blb3kOkW0+OSRDyOBG9ibr4rs4NSO9X/3TClt1AvTugscA2QX43ZY1AH54CNYU uuKlGdi+V7jvXblTpvgJ1GdKl95VZ1NPpUR093g9cjK57wufuhtGTd6+un7SaP2x MB3VwFw2Ol0G665Kd6LAfsyqyqeKHL/xMsX/rqTOFh1lwIiLG9Vlyiq8EjyE2Tl/ GKI6vjd1ctZmUVoMzb2Ums0Yt91f19huS0Npt9ems1qtZ40BaTxGxqxH5alNkAtN YbcmtQbuPFdekA9NK2QhZ4x23lumrQP234dzqI4nysYxBxd/bF3CZUzMlJxGctB9 WdKn4TXKpen8uH7E69MfheFkAetkvfaUR/lYp5xR2Lr38nUAdlMzXgZAgTry61GH v542x/H4ce/+Cv7H3lJ1Fa6pmJZDdGpAHuxXve3gUxt75mik4FwGt3psCQBF3Wax lLITFni5eSa8+jW/XBXSlH883HfQerBfhMeLzgV0hJYlF+eFmUW3k/ZxPMh/0/m0 DRqa7jad/SoenZ7vbb76k59tTp69yMhO+We0laXailnbDmWm+OMfL91spkl5L76H jDQ6xjqATxkqBNPOfTtXx2vKQ93HNVP9xHd6ONgQ5dXQ13RhJYNTcFBp3YyR+GTa Tn6evT7m6vctDRmjogYRr0eRhce8reuB8yCqw+rLsS82boFx16s2P+3NCujyBL/i 0GTaT6GzDrOjaCx/YIQu5ahxwR7sPHl1ROSa0fPgoeUuvfS2NdCMXRuXsv6S+cqP zzbu6EgWnNVgNbsPnVCw8A1Gg4dlAJDtaB1jgIECpQrWsUZfrT2lF7sLMz2PX2Ec DslBriIdEiMX50zBMxbFzZrZ4gw0KTmGIeWzMyrWOuDyBVc+9PD8KGdo3fKYhxl8 uMya0fDjXaJhZwe32+Br6SGHXX2c+lE7i5g11V6n0RutplHHVCgt72UGDWODcTgQ g1Ee5MMDzo5Fclg++Ac2tFTXYwBKP+3NOsgy+KcMky56x1rPosc40SYpyU/hNadj xNsxlNM1s9YUv0oyHVv1p94ZwTtDczw9MChcOTqhMcyrG8KkvkQN4mQrHGeKd8ip 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 Buy0COkcv+KFCa+j8WUK+DR6nCCg0//UCM8h/xQnD8JJxnJmXG/I6tW1Vepr3jg9 UDQeV4rp+tfyRlfm2+a6pQT5yqbDPUmBPWpR8H5rLD/meXV0F1fjt3VsTkg4zuiz A5UydBTS23aVXedpO46m32aI/a7O7SwcLnRYNeSbytUkLz4d5WU46ozcYH75dPOk V7YyrCjRtEH/lH6CHl9N24/BGb2xc4yUvkpTOlP2PKqlq0XHbB6PcDZlGC+WZEaL zjOj0xIJ61jH6xOvTZd/2vOpXDQwZqujeQd93iBvpHpXBx7y09n9YDRHR/S/vbtp rd7amOXsT54o3rGxqCw3CKe7cLpjyEaSV1CCZcnAnbWmKT6XhqBOGIAPCFz/vBBr iUoKqEN6pyMKR8dhvfr2t5tnz3+5+e///X/YPHnxfPP3f/tfNzff59n+Z3+++fJf /MXm7Pz5eGK++PLLzbOf/7JzA/PYP3mxeXB8vvnN3/3t5u3rb2dTHdpjQny82nzz q7/b/OZ3v9qc/bv/dfPLP/mTjhu63fzDb369+fr3v9/cvPpulLSOi1Gi3TG0Bv14 G7ahrIJ2RitDCl0L70fqMZqWp7Pk8WA6ZrKj7epEY9sYcMHqdupOxzJyIPOUgLeM IPU5iVaHEy7ieS3gZZmCDTk2WoIPlzE0o1UbWfhneJKBBpk7Q0p51gvudaZnLrPy Vl6VM+uoxkpWTHKZjO5Zrwt9eEna5ZenDytmpEZuVG4X41H4fvzSwTkxYwah4SiF sMlXO6Rs56BwuG8NZTRL4xgwRqu60F58hI8HrnY5nuF4QFkzjnjdbHLyCupQnyIc U2c6POpbvmQTlDahrPgULjpEA6HZrR+NlobA8dgmxdLNS1pa8qQdLR+t7nfRsJfR dZDxRbHzZFsOYwAyRjjDOV2mWtTJGPwVag21N/0d1x4t5Xqal/XFsycZbpVafTNC r3vRwKvo0L5t7DprkPukjaqz3jq9TP7gazDM+HHSg01S75vt8Ipo61Tn/OJ00/uc BTxs+gADFLIEXwYM+izBAJGOVp+jU+KpmhK2PJ/UTvKUU0Iam5OGNxHH0J/2jmkG cNE4R8ElVrp8nuE1wCst4zX831k6UL0+qm683to52YMfAzZL81P9wid6lEcgPNSV a6+6isVraUHG9BwPp55HNqIlmpg3dM0sQUmurbGHK/mfdcDxTbsZwzRgyyCDPGyD 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 XhvIRsqYCOn9qkGy1djYwIQbMMfzUcVEegAt8wb9r7iAamB6RFpawzn0yUoaygRg TFCU4+wAkCQzZmijrs42JvJMxLFlPkvaGKs2VSMTYuCJhQhMGbXIeVfQJ829bIxF GsCc1ouBVOw+xhfk4trXy7PHBIFmjnbUKneSHmbFkayYxsNj+dhipQHcSwfXBSbe E0gYZpasRLUSC4LMIYeQ1XaMNVuNw+8Skz8ng+bsnea5mmVdKn2HnNKqUNPajRkg cwyTcxlhx+Q2JncLPO/fuX49vP3oUZgD/Cotk7m1iI3sLV0hpheUxV8gF/EwDOqj /n5y3g7HMq56t3Kx1ec6O8KXX3k1/K/f+lb4x//yX4Y3R8fCp373q+FidzeeD/oD wP35S1fC6WYqomHrDTjepD+xOWCcQjScfzoTmiwmHLtMOId7e0NPzz0qA07EXOsG nTbwnBXjRYkSAsYfA4MzsONr2G3Z/FoKH3zu8rVwlYn90MYsemGy8WCfJMkYpBIs Q4NGQo7jiVvib7+KP2KZZGnylQvZ9pllfvvMGhEk/voSvmXfT19Ha8dl/hJDJSsc Y7N487yB/DCixp+/t5OjVfie6/Un7ifuxv0n+/VkkqMl+4/nwFuQzv+319E5sDJb 8UG07w5pw6Nl/k0O52m6/vHr2dmBdG/ycsPjn6MltPQxoLTR//7rSaPwxTO7Z5vk k7+f7vH4U7KXKE843qErsU1cg/cR/ia7oPMfr8S+4jrJerEXsIUpKcxJ51VkYjzM WdrW3Bqee/Hj4ezzrxDck09g0wC61eEwMDodMqbvh6ttJaHr6kfDwEE1xpjqJiQR T0HLqZEUZHXVoHOh887RUQ/Q9zQTiFKJCxY+D50RLiLWvYtreqP33VCw/j7gICu0 Pfe50HrqSpjhgSbfNsyOgQtcSxrGBaNhfjgBmcY8rYIqLUOcT39f6Mgkaj91gATX +2Eg/zPhQuvFyHjNMyjk8tBUYJzV1gmMTBS9xoNojewCDLkuVXWjexhyoH/UCi4w Q91hJpuakoexRHuE8TVv7D4P6hZs0zTgvYiHOtPgL/JLajeMHJXJLYFNOYjMKkwI z5Lpf2R3ZgA0xQBg3VtvfPAAxjmftsIgMBDpqp7EsA9Q9rAaY6gWM5frlR00AKGW 7zcYeKYRx+eh89rhHEwHVFuKzpdBY1QwyL3D08cMfyuWGrThCgDb6Qx+2wAVmduo HgLoanx0IZnvco9ryAbY627PooNm4kqqIH3MPkZxE5ZIwNtGbr4CBmojW2WC2mpg R2oaqISDHgpg5iubdmqspTzqGuUQ0Uu9d+M27rdpcjp2AgAqY3vO0B8yMH5ZBHws w35NIR3Ipb/EKmiNaL3qOH/AWfoeVcgAvGsMHpe7KsL5S+fDhwCc3pu3KInYGtmp VBiUzq4WMg4gBRgltRQDly7mwWGYO0B5MUZxCvaxkAH/8omTZEewsMViaKosgRFX s4iMA2ZHpmNseiZORioZ0NSBLhH8UME5b3BvrK9toJ0auXdv9oROGPE2gNMg96UR QNeIfMBytQJlA4xSuWdzgPEu5AFlsIC37j7AWK/DOtaR+QEgxkDVykDta3yI4CIG vlJSL92810fN8BnAbDuVmBai5lIdbGtjNdkxliJL9OK5LvokYIK2u3j+BKmXynAt o2eG0WomgMmKP7dhGc3rm0o/fAhbN00bmD1iDQBgnuFzZ9oZNNfC29fvRo13G+fl wHTv4SBpjfQcpJHx40bUgJ45cyKes5HtVbVofuthpIeHY4T3Ky9eDF1se+NGD3ry yXDlypmYucC8m33oy1ubm2D1tsj1OobWryoCgvd6iepf2qKkK+nGeBaXsQ1dyB6U QtyiCMM7t0fCJz71Is84mmOkGmXcAwPPZLAn8EycgGUuB9Dff0AQFOxvN7k4tzdW CNAbRFtXG3XIY0wQGrENnvsm/fseet1S9Jg1gK2VORLdMzE8cfYU4COFDCU9sEOp 6IrRTANuZ2HnT5/qiBWCJmHQrQT2T/7kK4DtvZgDN7uwlHKj5DReozJbGZNn3P9r IA712TnYzAPuzfhwD/b6RGiiopMDVw5AMgvpzjx2xqwYAiltmFHkuteLmFyZ61Oi wCDJEYLxHg1P8EwYyMRzT3iSgbAGA+Vgu7a3cqOWV6ZQkuNATxP9q1C3MMUwRseX eE4JbgS0peNirtT/j3t+DxssS1bCc6HuHeyMu5n805zfQ9KeVeHRMrjILDDKG2YA ninIjs6S3qsoey/aJguDmMptiomfUq90ANkCrGEt7vqtrJ1wc6w2FEP/PkK2Ucpk Vy3/0jQTy3oCVXnOBx89Dgc8+1vYrPnJkVDV3MazTG5XQFk5spF0AOYEz9GFi6fD CvKDJcBnPaBtV+AHIO1ELrSJTVf3X19bRIo/7gOZMLIp4z0yOse95HkmJ/Esz7lZ DNIAcYtcaEs7TCbPRga5Vpnj412g8lUqadUYZLZhpbPRHe8x2ctOpyy1k0XsUjU2 LpNxdBd2MZd2GxsZCQtMZFPQoRsYeRL7l889MSh1g7FklbZpaiW9F+c0x4TBIiPi Cf4zUQUEM7FIZ3wwyX9GVR1VtQAqkBsLXOcu/b2SflEPobLJupEEoV83kt1BRr44 34DOtfBXP389HCDZ+uTpU6GM53tS2YmaJAAfQ1BkOZeosGVcfn55Dd4sdN+A1V3G M2ZN2KeS8Ak8UbtMgGRFL588G06f6I7SEyetawDlHGyObLRZE9TGav/1Y2YzoUil GM8q/Xgaz5OFNEZpE9nsJvZhbvYc1l2HJTdL0O4B/Ydx1awwe0honKil7ukVMBVY XswVa6Ha77zzJpiExmDskRH1r3DlCKHEjJwRe3GZCTrTctqursU24h4REh+TbeIC PyYv10t2G+/F8eK48OlaLBancYS4Q/d/vO9n10z2mhyadd11cgJP/h6fRbLV01OI 71jfPTy9Dpe6k/8/oPXJDmgRbsxvenkQz+sYRLrOkxP1QvkcL+LJ6dho/viKW/PX z75PXr+2LxcdXXj89miTuA7L4w072jRqXCMCTfYfv4sbJZ+T1ZIdPDkn9uG+EjmD 6zG3ZBVrYRt1auUcRfHYXGbrOdgGku0zkzt56kK4AMNWCBDpGx4MKZMPqIJC/rWL HaHvEcEU5AqpKKgCLAIIMYw+lAub6HcYGNUDqlnLyaIcXxaJyhlca6pKYqTt6PQK rtgFXL73Q8bwW6Fqmwjxie3w/u7zobWkGTaRQBYiaz3fHdwzRqMaPaubPQcjMYfO zxyaq4Cv2anFcC6HspjL74eBHQT5Db8VXjmPpAADODE3i0HPAYzIrjK4AKS9DdsA vhUCrqzcJDtqUJZBLGuAVGRsDA5EwNJm2bCBxBAwAyInHgOK6VcqcIfJ9k5g9BaY VWeA/kpho7Zp0C0GjxKYuQFAxCYgowHNoDlntwCFMnmpHKujoQEWdwbX2TLMD2wk YMMH2KIW5mStgkmTvTWwrQU3jUBYDVom90ONFPEAYZXznyfpexFarVZKY+6soBWj 7bOIXHWQ3BC0worpgt/C6IBWADkEPjBwVhYUhDyWKzng8mG7yPqAobdylX3kkEE0 g5l0PmxhCu2+ApDPhQHU7XqQQXlO2IRiggUOAQPzuBGzMHCvXHsu/AtB4IO74ae/ fB0tFWwCrsNpepoaNJNNp8E6HbIvjxtZP45lUYV0NHcymbJuFYI/jGEGOyiG1c9C t2jpxgtnT8e0T9//8eu4SWHLMI5zgI9K8gG3dTWTV3YbBpZSvEys+obIA0xgS1dX YxiF6TbV0XMn2gDI28Gk9EUwQ7KTD1hvBUakosPKRmS6gFWqaoKlRL/5AN1mHQDH kq2DuNmdKBnJLZtZASP+ynOnSVmTQhaBSTSuDRjlVLScEzBJBJgBqEzBgwlm0KuK gHFyejFcBmA6wD14QN1xBsY1mL6fvvkh7OZy+OIXPhEmAB33HvSET1y7RAqwovDu h/dgx1LiIL0D8z5F1ScDr4xgnkeK0glYSyHAw7ytFmRooF9t7lDgI7KqePSYJF0H 6Jka6AxAL5f7vLg9F86dbCEYpZjJYl9MO3Xm1EnczdvoEMfw/JF/kfa9+/BRuI2c 4iuvfTQylLfvPwbolAASSP4+DWs6MhlL7NbTjn3s5yGTjEsXCHwien9meposCuQp Zt0SKgyNEgizhSSjAnfwTVhky+OeAzBu8iyazzifay2D3R7k3vwSxvk8MghToN1G F7qXTf7eihrY7CmCDsm5SoUyMy70UkXsBufXdbIL8EaqpZHHgFtSusH+vEmxgx0i wy+eOxXzHw/CNm1RVQ2hYdQUjz/uD2XYswp0zndpnxEi7E+dPgP5gYt+8BEu0Xyq bnUSDb0V3rt+O1RQ7CQdIKdMwSwGyjnukoqPByV86ZOXOAaBQUys8AyTCqsuXHn+ Cizg7Vi0Qq/ODmBEF/wk7XDnXk9oMdUY+TDn5ykpjUTn9Llz6GnHwl/85V+Hqw1t XF9NnByPYN9KDsjkgXyIGTX2GbsM2+6kUg10GkwsjxzXYRon0t0xmS5jPYO4DtEH Wm52DVlUCTKjndVFJEhbBI3iomUSYdCfcgozrkwy8SXrF/2sOk4czC2byXPvGJDJ TwaygdwUku9vLoUBcrZ2c49nkfqYUaMG2wXFzaR8P9Sjo51dRULQegHtaDF2dT9c gMFfnJ2ORVSqKZe9xvsNgKP6zRHSxjHYMBRBamBXC7FLMkWDjwfRVyb5e80WUcIE eoPcpwM8r52kU7PM6CgyoqomADHP4ipMXhXP9L3bd6MnsBU7PkswbyZaikYY8Wnu WxosaQP2//7jYfp+Q8wcsEg7pNG2KwtzKqkgLwCrMOTNzUhrhrEl2MAC2lPAlsWE R1bRzDd19RQWoW+UlaLtxB4v8qMH43B/hcIBZMHAC7e0no63IJ8+S7wE4wV3MNpf ySCDHjexgeb3lR6tRKIjU52NYS8iDaJu+JzS2lBC22bNMqmGcFjGfmJiYNqNL5kO P+daSwmAeg4PQxX93onvGttJtGVjmy0rrOzNalZKe5w0bTIebFCVzHGs80RXqCTw iuEfgE82BplxnqMtSJJtJ8dM3NCO2AR0PfoBE6kd7tE8XqV1wOc6muEF5EZWPGu/ dCky8+Ucx/RmW0xgNr0emE8ZabNCZBJ4m8V3mdh55SqzUwTv8cyfP3MuBo4P9T0I N5koGFgocmFo+H/oeg8gza7rzu92zjnn3D09Mz0RGMwAAxAgwARRpKgVtauw8u6q 1mvJLpVUXteqXOWSU5XtLdXaLpdcK2nXK1kyJWolUkuRFEWRBEEiDjDA5Omcc845 +Pe7X/fMQKQ+oHu+/r737rvvvnvP/Z9z/uccf7MmhXbcFP+6r8W8pvwZv0sclIBN fsY58TS/ju/igfGvCHaOPxblnRyX4Joef5E48vjax39w5PFl4nXoQnzxacQRJw3F fZN16StiNv5ltzz+2qudfJfoaLxLGj5p2/N8/Xj0+cR9JA5L/D5pxMYT7nE+iY0m bu8EoJ6c498f+eGLE8u2/ZOUa3JgUBffnLThcCXaPWnn5DuwWdTIEnm/eFC0kXhY T3aYgxJNxbtTw060f3KN4y/j4NmJ46GKfzvMfm+r/suP1+AnuomYlDlov4VoZLU1 NaHj7Lnw3MufDpefe4HJTdlN9La8FHiU9a2houVyKK1spGwfJG6SI82vYRFN2scN Tw5CFy9Ny3fVKmmFGlMu1QCAaitIJM2Yji9vhQe4Yb//+uvh4fe/SiDUVJg4ags3 k55DWHUiXEkVhVucktyxITl08jCt2ASGAAyTNFwrApveV7/3Thjqxv21StqgidUw kkG6jlPnwxkEa1URgQtyj9isB+GrTmE5kw+4hYV3HDAzyeKU8O7CsioHqzmssRAL AIe7ulzo+xZCfRFBZSWbRY43qjoToJUHIKhFmJp6qwjLaT0cwgLe1xbjmmKjFkRs 8exH2HiseZ1G4MQqi7c4lzFCaIyx6Z+Cf1VmNgMswEVYSLZxLWYhlEwZtLw0D2+X ijcIPMn0nRQlSIODuAu4yNSyw+Ifx7prQBums5CEQDJ9TxbWAN3OBRlaECgjiaVG ID4DkDBXpinF0tkkSuCd5iDYkmhLLd5ceqYo2ULgWA/dKOtt7tn8gloqSjnW5P0t WPI6TndJGAsfAGy+/TffCj3374Yi+v1S11n4lHXhd//tb4ff+9IfhveHesP1+hqA ViXuLkAv/TQYzcowup7lD2Yi2DMBspnMC+tzL7OBDlKNahkw6WYm/0xBPIdl7oM7 D8Pfvvl+SOX5mIVhhzFOAgxtY4Exl2YjVlojh3vZ6OrgvxUQTT9LAI11sJMR8N+l +tF93OnncfPm85mlcWvqa9l0qG4ETcNNfIXcqz2cb7qfVAT9EOBzn03cZPGzzJ8p lIpSNok15tDQIMexXqxuN8zzLIL7bNWseSze01hmzTZghPI4INKqbdZ9fwjA2+Ia tmekdp/nMT6uyNnhYazXFbHy1BQWRTlzFj8wet98pIqTbKxE72CNlNdbhcKzyVjO Y5FvqqvCopUeLcxWVOs620aADZsdVsyzHfUEIhViPYZCQ79TUECm4MiN8mOdd70A b8HnnNVyhAKQSUaEQSyMz5OWLgfl7d334H4yXtefOsuaZHx47lncdzGb1Ftv3wpf +eYboaK+Olw+D/+TNT9Iaq+0rPzoIt5kc1Npaz/VArAP8MG3w+XL51gPqeHd2+T/ XSEDBMBoAL7jrYfDALhOMjvUh0U4r7oKW61yxb1OzxMAR6GFM1i7ddd/FypCB7lh zzaWUylsgTWeE64+cyV0UjzBhOdbKSiW5Cl98LCXex1nTcphJ1iH5z+LVTQ9r5Tn Qno7LFcXLnZh6SykbG1/eIc+lPN8iR8JH6A0DCCrnr7ydLjbM4EChKJA5ayUbUoJ oyy3tp+BLtKEV4X1vbuInEBJxNXc0AiQqG2KrnDT+ZjiTeXbwLc5AAePE/mIu57n I7ferBLmbZ2Y6MMySm5WnqnVql7oagmd9TwfzjX/tB4Tc3Rav7EQ66h7hqmsRB7r WG1zkHUCkzVkhNkhjGA/Yn3o8dqBn7sLgLYwyRYg2vZN05cDSLGIRQyQwzJdDlBB 8EU6wyGJ9jO5n0M47Fb9m0N5Nl8wxK/wgOe1n4yVD5rHIBb1lGystvBszfZQmJ3C mOCZgSZSgKyz1G0m43+4scLcIGAOS/URsuAA2XsNi18Be8cU6zSXtFLbWFtH8QgV oqgIitIAXRWMkXxyQVUSfRvsHSbFVQiNyN81ZJpV/+ZHRqmCtsU1a5GhhzEmYZvI f1MGWvikBnlwsLHKOG4TNLpAcNaGJk6uBxADYBXC91QQHvBwMgxnx9hiSjiroi0i X1Q71gDb9Q1VeJwKGdtU5DQ5szcoyUz2AR+GaRfVIsYG+qNHoYg14h5iaj5jBDII +spmrisHi0vLwiFWTI0LTIfoaWkybzRN7PGZlbCKSsuhQtS4pFg3GxTNYP9ROUBx nRzsCX/0rb8O7+FlPGQvKgAAKj9z8K4Ivs2TavaCA2Ij5sbHYmCsiY+SGesd5FAa +31tTW2UNWlYpdfYb1ZRbvcAyknI5GQAfyZyJBsAvMf+obdybIIsM++9G3544/0w w/5TiOxoxVt0oaOTANFWPHcE17L25HuX0LbPRRAiTJHCIUCS+yr9RaqAGQhUDDs7 u8I//Uf/WTjP3jiFTBZIWklSmSgEYNeP71X8YhVPHo/4Jf7Db/9N/I6oRs/78fG2 kMA48Q3XjCgxgqvE2fHzeHTi3d/9fQJAE597jm0mfsQyT7biMSeYMeJFxtmeJX78 9vg9148txF8fbSHlv+floR95eSAvOSDvvP02ieu/F+t3ywEyp+Dj1/GBjz941CE/ OrmZk3/jYSf9e3QzfMB7bzL+49DGj9QY+Nz/+Vf3QeKxJL6PnyfOit+rYZx8dnwS fyZuPDZ8ct/xIkJT2oltc7Tf8bkA9+Qwga7kdi2h6QIcLB0SuSXmGyB05tzl8OzH XgrPPf9CaO04RYQ7VgasBFNorNskhF6D/G95TPlBkvaz4UWJLDYxNQimjgA8ktgt hVjBws5mIXnfOFVwKeySF3EwzN3/QUga/h6LpiXsN74QepJqaCI7dFAG8QhkagRi BW6MJAS7QNVqVFpaFdAGnJhiKAkBsNTzdsic+l6YwN1a+dTPhaeffZGURZSQRHDl YjaWI2eUpfymDYR2zwCEfZDeOILMfKdG2bsRmCdwBeHeQ8otLUqRQ8a4ybM6QLM3 S4E1vy3XKi/IaFHJ+G7IgiLderou5cquYAlLZfHrlplAiGejVZsYPQ3BZuqaZTaW OdJa1dfVYsEJWP4g0mNR28K6rIvKfKi32dBPIRCS2FymANhqzHv0I4N7kvBvTfp9 gjN0V+cukQ9zehAu4jTgkNyKjJuVu0zAYwlA71Gd3vu1jOCa1lGsNnkEekj8733Y Dc+xH/fuJBakB6HnIQEpjHs5lhEjiz3XDARaCDIB8SUEV+XlUxObB2OFHAOHNnB5 G02ayzi1tHURgVwRLjY1hZ/87OepnnOe+2LzQqAto8Eb7ZqP5SMN0LpBNKoWNK0G W4z1a7fvhVskoS/mGuaUnJycAGCQJoqN9RaBMzV1jYBWqAAAQUGt+Xx7eoaxxKzi eq/FjWckcwGJ3ptiUM447vsLWBJNbTYIKGwDdDRy3BabgCsoC6VgCTdiOQA3F/DQ y6ZqHtOaupqYqcEcxKVsEivSCuh7FZkjTF8jwNJC3opFaG6OCliA+9PtDeQwFLRN AO7hQxIlP4p11GTvlj/VFT/LBt+EhVTlYWhsPLSxCTY1NwHU4ZlCJ2lobGItJYBu OZZec+sOYoHcoP8NDXVYl0nlgxXzCgBSvvLDHtze3K+UmzE2sBV4pKfhyQp0+/uH WQulsaqWOXCtBpWCZc+1YAR0HlahnZ19MgcMYMVLCU9fOoNCg7v85gcon1lYZE9h MXwYU3S9fP0yClB6ePv9OzGP69PnTgMsF8K/+dK3wgvPnCVIrItxWAgPqEaWhlJn 7sY5ONvmFa1BkWnE7bwFZaS5qRGqQzUWzVFkwgEVsNqjvDJTQBNKx1kswsOkXjPA 6jwUiWT4vnfhN5px42wbHhju460PHmJVrg5Xz7WT5mwhDPCMW9qbURpxv08xps0m Lq8NH2Jhf++DO2yigDd4rdIrHJ9CAIHVgob6elEYysM5rL7LzN93bz9EUckDoJNP eRYPDe7mZwjSMkH/DUrKtrY3MXdD6OvvCykAr2x4eBODQ2F1up8AQdymeVReAzzM oyC+yd5i1gc3bZUEg2UEXs2t9eEqILiEsTd4VJew1bbeu3EjTKxZJpTsFauu84zI BU5HnmSjDAlsU5BHG1hRrYhlvt10jpHzOY9rWWBUDNgwQMqMATlo/AaM6WmaGemH OgDFh//SADbZBaWhqqYRWZXDwrZ/eMaYE7koabvIcKv7mZNW7qGBPgKLCbw6yyEv lJCWaQ2lTKtEFUqLmRksz1kPlWiV+WtGkIqjUSpnMA8KGmN/EI7wjwlqHB0L9+bJ tIJyqLwo5Rm1QjXZAjBtoTjlQh7dAQC2n2old3VuVCRrodfonjcbhdWu9pHBestM CbeNx6cPS30hsvv27d5QwdyqJuPKBAqXZXwFYM6zdJ53ZfR+TCJPsQYzT3HeRZe1 +XLzkD15ALxZAHAGgM8cpPso/6ZkU6kpwiK/w5jMIgNK4TbTSayh5Ldl7Ja3TeWV R+AU2RhQFgy8m8MzZLGJdC2SgNZ8uONydeWzp7HuF1HcmPTINnIpw/G1yEMRdK8c wNw6exvwLvZnT0oZ69XALI0eZgzY59rmEJdPv4iCMzU7RYouKHrcuxBRZcA4B9Os 6Zb3OaoA7nKu427mnH3miiRAudmWTzZnrPscalT0bMmVVcE8QEZuMQfGhwZCN3uC /TK4VK/kKGM1xzhNA2a3USpz6WcGStUBGML9P4n3acwnudY+0032HKv/pbBnGxdy ADDfof8WMkrBsIIwi7Egs/DJ15FNaWIWB4lXBKH8/RHAyvPzi4iCOEwE5StBe4xv /Svxve0g1yLm8jxeiZYT7xO/f/STeJz94OfJ1+O/E58/+e3j7+hZ/MJfJz9+Rgf8 gr1bRdYfccWzzzwTXnr55ajAPHmt+D7e6498Shta8viJAJFb9eXvEwurnfHnR/72 KP6P3/Em/hdPjE2gZdC543MVYB4bf+INJY7xdwKZJ+5HQeJ9eZzt+eLqiX9PPvc7 BiB+yi+PSpjP4xePh4nvTGwdQS6CznZs+5BZaUJ7Nb9sNsZpNt00Funlj30mfOwT nwqXrjwVqwrN4Ta9jcB+650Pwvu4ymqKK8LHPoYLH5doMQvNBP+7uIkPmPwCPa2r 8ojMZShoFXFqXZnC4rhKcMnBNhylvh+G7Qd/QRT1C6H+6k+G5UzSabChrJXhTGYB rNGG2l0liyPdDZ9a1ntocVaZMfXULP76mbl13FEroT1rIgzuvheKG381PPXsx7Gc 1bMh4wZBuGP4QPinxKAFyT62YSqblc35qE0XAdbXAL+mYilkw9tjU8lBcG6hEVru Tz7oFgJDoaL7yApHhViT53G5JbFZZGCJyAHQm3NwCqvABm1tLlERBetcLZtXKsIg hwCEHDRIN5VkJqjW4SMS3z/V0RDGEazyh3IN+qEPcpgOaLMHd69x/0loqsNwh41A XRVwHO5gQaSOOIJvh4XtRpEHmN/oGwzruL1M15UDCJPmYb1vgzAy6bsuqS1ciekI 5Hw2wV0suvfZsFcBwQbp3Mcl+v/+h/8nJAEU0wGTi4DY3/jlf071ovOAdYPAyBTB /LKWzw6TZ5/o2iT4pjU85xrc9DuAaDfkJQBDCYKpmICTCgSWARHtba3wb3H7YenR opqHcNtgg9Tqk8I9wwaLc9C+bQJeYVvgpmyOz3mgh8h93LHlaPQzE6NYC9lsG5vg +lGnHIFrfXutFo5/fnlZBO1paWvhQmdb5CV+eKcbDiaWMfoyMzAUztSXA3zqYxaD FeZkGYBlHuCVDjguL6lijsIvxAXWAQBi6OCgQRkBeCYLHCewiDL3Cpjzo9BCjABu amwGeFCbHcBlsJd1xOemyWcKMDDyW4u1UdjnT51jQ0wE5F08RwlFrGCDpMvKwJph ZgNMDjHqtpXrWhJSK20nxF43j15KiaqgXDhPWVLkwo33JgDAUGyYzzOTY3HTyQa8 yIlbY142ULnKfJ6D5EZdYANoJmWaddpn6XNNFdYkFHOt5w2AQ9h+8OFuI3v2w3MA 1no8Ie8ASh+MrYXrV85Dy8EyBr+6BV7qDhvoUO9QTOdVhfta625fb3/42U8+HT72 7KWY//WNt24CVotDF7JB6ss4P1aV0lLyECumSfBLKrAo4mLcJBjpGUCnIOAu1IMS LJ2dgFKzHbz/YXfo6GwHJOdg1R2I1zQxf3ffMIGNsyg0ZaRBq2dsqdDFuuiEG2sm jneQUVbm+/QrL0QA9fVZFBvWcWpROYrfIha4PXJO1gDSMsJAL5WsEMedtDuNxXkc wG9eYJX4IUCzYO0Ln7mO9ygnfOV7P8RlD9WBTf8hAHoKuVIBLcUNvWdqPfQuHYbM +f7wk5Q9zkSBT2ID3uB5D4yNhlPtWHEBorvQVXYANsn4W5VjcY9FDscUe1G+kxwf oB+5f6wxy4TeIStCbmEJ46KsJYCR55kCeEtGETX9XRWWUR5efKYWKzlEDptrNCcD 2Q7YOmRdFrK+Z2YGCYLFc4Bc03Key/pc2tyHA09aPQBDYWZBtBBPz5N6jz4WogC5 Z1lA5fCAJPF7VD5ifQyyZsaY39uUHa2rpVAFSof7Uw6gzUAkrbgFKFoZqxPIwWnG GHBfVBmunCOTBNZmDKgoZXBTsaaaYaKc/g2yLldZZ8m4qM1G0UW541PkLx3tG4jZ WSoAryNQQ1Sw8pDNI7Nk+agoJiI/NXyIR2YXGoQp8pK0WGM8GBlOBOGaZ3aZ6HTX vjmtR+BjZyBLDpAxDB/BU2RIYD/KYJ8yM8UivNBD5FMm1fUsYlFRV4+MJTiWXL6W fpYTbi7ROfYxc+1KA1pCVugONyXbIh4YQdQeSmAuCs0+irz5a/MLSOOEl3IyDcKn AABAAElEQVQX+a8XTK9eNv1cZ37IAy1BXmuhzEPR2MMSPMp10tmXDGXOQnlKP4Qe tY26kJwfJuGRj08QHAo3NZcxL82DH0zA1Q/I3lNNJpsW1lom19mknWRklYYf92Zj Io7YWyzvXYSikYmSYmCqcR1aNNORyclZBOniidj3OfF81jew6qKMy61NYg9pv/ws a5t5g4yfev/98MdvfidMYEjRM/dKY2v4uY+/SlXLy9FibB5sU/xlsX9JWctyL2Ka Ggi2y7M+ZI0lsQ+lcX1lbC/3lQ2f/TMffxnwmxf+p6/+p7CAbGxkHiYzx1QwI9LR VBxnHLMOXMHyOX4l3p1gJQ12HJZ48T4a7JjP8TOsnxFL+afvPfYYl7mUTtrwU9fA 3309idMiruMe4ouT/e4EH3otuxBB6qNGTtrzHN+f/Dw64MeDVnlLxz2NjcbDjzsL LIrANX4WAaEAj4ZPruVl+PsjnXt8vcSxia4mmrXXx69H3Inj9hJfCSUdPDvgQ/C/ Jy2iXvqJi580ljjLU+IrDh7t2nSisx89K/bZe/MYjjCZvtH4jdUQwXH7Li+vo0Vu hBLc2E0NDeHSpQtYgxohr2+HN27dI83R10hIfD+81N4aXnnxqdB5tiUGechjUnAZ pJSZiQUQa1oaoLMUQVkEqEvH2teN1ek+1stVNP3U9cmQtz0QZoYp6bpIWp5r10NZ Y1soQyOsLsFKUgovCV7gMgEBjSStdnQsBZcLX8lAqVHIpgqZKTX68e5QuQStYPhm 6N7+bPhY10sxAMe8lSlJBBsxIXXLEUIFICe/53Yq4Gs9gtad3bWYwcDSpXLKcnFd WaJOvmd7YwmCyIopWeS8xKW+zIZEScFNtKFocQTNWHHmiI3JKFuFxSpCbJFN3PRb PQjeRSKJqwCAclgr2Ihsa4G0JvLbFhcpjwoQryaB/ejicLRoqtHP4RbfYWUv0Wcj LrUirSFYrOpVBYdvnnuw1vQowtESrroTtbpmADzzcOcuA7y0vuh2jTw62jgEaCTh xjL9SEyfQn/NQZiZTv5B2tLRCBoJHQidT//jfxre6HmIBRhBD3XAsVilz2MA2nGs ndIMihmjCt1WBdVRO8f4gFZP7Ws2hQI2DQs/aDWVQ5s5iysPC9UyAGwFl2gezziN DRWfKIoOliTmomBrHw7mXhrFKdDa5bV2Xeoi3VUmLvp+hC9uToCWAXNFKB+nTrfF zXwZYSoHMjMd5Q70VgHYMFPDQ4KIWltPY/3Yh5PaEzMC1ANSNrFOJKP5F2H9tX73 9PhEKK3Gis1mIbA06ESFYYIcp01YdgwI6hshjRLW1xosQVooDdKzaICWFwHO00TQ 1wAa3njnQyznWOpJR2TwjIGMReVW4aJqERvohbMdgIj0CIya6utw45WSumwOL0A6 Fke4cSga01NYZkna30Bfbz/ow3JEBSLcsKZds3qa1YmquN+xMSp5YVXqIAPC6Cjp g3A3N+EOjZWasO41Eu1ehSIzQ6owXatn4H/qYpdvmocVLh/r+BjnZbFOjcRfwD0u 7/kcIL+Sfq2xCat0mmhfTvccEeOXARzlBOBZhMGcqxfOkB2Eefp9aBqzKGg//9PX AVJHWBY/iNzUy4DfyFlDGdDi75hN07cZNvtK+MpyZRcBBW30Ox+L7CgUC7MKWATA ErfDjK3WsAoUCrNhjFJJqAzAqMwapNhGJhZ/KRnDIxORQlTE/Zq7VPflMmvnEpZR I56HUCSKkW8XmxtRCvbC/cVp1npOtBRZGnUDZbzr6aewnCaFd9++gU6bEprammP6 oU2ssTmsgZX1fQJPHyI3ALullbQ5xGcrobGpKVoQF6E+mNpvaasBKyEFG1DitHId AQRq6pvCPSz7GXiHpC4ucv+Wf00CtFr9zVRGGjQs8mHeWTneB5tEpe+UR3qPXql1 FKJsTA6In1AkqEHeOg8tEGLKPexarA0ADCBIKsgcdCF5nJabngGA5nC/clVHAdal NfBXGZ+0lMzIWbYimsGHuchod5wVZOsaLtzK4uwIuneRc2ZwyEApNnq8imeXPEtZ 4NStMIunIwPr5AGcXi3qSQClBTxKaTybbGIAFlaomMVNW4o5MxurPsF26wD87JIy FMS9cA/LXQ5yZIu1NIkS0tBGXm/WzTpjYE7PLbwm98gGc+lpFCescTt4gyoZwxUC ow64zxLA58YSchZLglXuDIitrauO2Qrcs1rxpqSx5h9iwc3jPnNQyjYY58tNjeHm u1MRfBWiyGuVzPeZcd/L8For8HggnWIEvkUQjMLPwpq+CogzHVYm4M/AsAPuMYe5 usHasZpXCgq8Mj6XuSR9KBuD0Dxra5dnVFyABxOZSuRDtDoqs0uRybu02dZQHfJ5 PtvsxQfco3EWR9BcdknBJQ9aRc7I2qqG1pBNVpTtFTJCQBNRYT5w/4EXXALAnZ+b CH/55hvh8y+9ElqhOeyjcDlnnV9aNS0nrvVThdwUaI6ZWVcepUJk/u1wL8Yq+Bz1 FG6zn2zTJ0ttZ1Nc4zTAVSV6mGfzzp0PQ3JlU/jNa89SQjcrfOftN8NXvvW1KM+q amrYo8nww9hbJt04hoqGplj4YZ59wFR6Ith99o1NrrmM1Vt5kgsNoZa+fxzgu8G9 /9tvfptrsdZQCpLMmMEcVMsU80S8A46J4JR1IqYRbGrEdEsTCGHI5PMEptL6KvY5 AZS8jS+/Tbw80vb4nfifNfGjxyca5/fxNeJ1T0AY59uvxPkn0Nc2Ynf8Nv6XaMMG eHmtxE3E6/sR0+FHXx81Hx9/79XZwGwYhye/uWOuFvuGQLb1eJn46/gcP+Nvu4L8 4Tn4pYIo0VGPcqA8MQ7O8YBEk3YctcTxHhcHm3Nj37ye//MTB8EDjl/x/jzNF00n Htfxn4+fBB/QfxqRm2sf8tBebFsXkIJPjd1Mkc1XqTjERv4WLjSjJXUvFAI+LNNo Tfo3P7gV/ugv/jK89rW3wj/6/MfDT33+0wTEELmMIJvDeqN7IZOFoys6k58srJVq o3kILDmiswildx70hLffeDdUJZN+KHkWcDwbHszhKqy+GtJJOJ6LVDU4ZR2CeNIh dAIsJouAlTwI8shm8rKmRsAo928GwJclOF7pC8XLN3CvzIQ35jpD84VPwDVqjgEI hyApK/5ELhEaqYOrlXOWylQzuI1QgFn4uvmNZqR9/q0iBVEWwNg+63IHWqEVox+z 0PFzRAuaZf6qce3nwLtaR8Br/SrBXWqOyQk0/SqEVjlR/Le6iZpnDE1dpaUzFw6i 6avcSFL5zFQ3hAeTtgeAgKJQhiVFfqLpp6xoY6L8AgCauTyHWdAmIt9loaeioVfX VIcFxjSTPpsv0EW2t4kwBbRKL0hl4Rtl7XzyOSgMEmviiPuh2ADf6aJxvBvaO8iH iLaLIKvTQgN4nwTA3R7uD9fqm9nQyCELXeBPv/ft8P33vws3uCLU4ea69tS1cD0l kXdVPqyVxXRnG7CWhfZvJOwRAqmITW0bMLeOVdfqZnO4gzLgx1liUQ1XsOsct0KV UzeNvsmz0io7g5AfI2q8DHqF43fnHsE5WAZNAzQ6NhI3HasoLc4Apo2QBwgv4Ka0 ZrxlaO/3DlItjeTjbEICOjl8usYmrTQGECtBKTER+9zMPJsSGxBJxMdmTG6NJZV2 F7DQmD6plTrs0jyssGX+3RSuszg7F3ljlkg1wEn6xAXc8dNY8vZRlk7BuzRg6wdv 98TcjmdxTfcODDMW8GKhFkxwHZOA1wLE5H/3A75UNoqYB7ME52k97GivR0lbI8J4 inlJZRxcmwvQAhyrznY4p8yPYea+HFzXttXHVOwqK0gKDyDr7h1lE6+JSeJ7sVhp 5SkhKHEdZWtqYQ3rX2O07Jqw30o/VfRlkrHYw/J9uqOJOb0XblLOtYy0dE+dacal DggCaGk9znSOEgSTxjq8QGCZG+PtOw+iFe36hTPRmv6gn0A4+IRyfNcBgKZ/ugj4 FXh+AMWjs6Md4FQO7WGcKmwjRCQDfJi0w8Nj5DBmnQE0rFKkt0UgboaAUahJ59pq CGwkSKxnJNy60wONhyAt5nU/nokDrP9trQSbCcYBsHobrj9DkAdCZGmBggaM/R5e DKuezUGjyWAjNlhlaR6ZBBiqIADKVE2TWPGTGVOtkQafzY4MUtXsLGO/Fd67dSc8 d/2pmNu2mzm2wbrNyCVpOs+zoZoKdDxPAzGLy8tD66lOyvYOYgQh9dyxlTUzG4DE 2jXYZBervGBQeo4FKyxcsL3KHMpZDDl4ePJQztu5d8GoymMOYIfTohfIlGFVVJ0y 9ZXPNh/gYG5bLce5KHJTBHitIaPSAWOLKAwGwJia0bRLJShUUhNKkFfKaQ5nqwDg oMKuAlaa6srYV8jtQr/TdPfuYzzgvkpQ5LJ24bGuj5E94nJ0628uzwCMCSxC8XXO V+MxEuxNpQKcSBi/I+jgesqibYBYCfN1HgWNmMlQW055WwBrEnKiivFaYg5nAlrQ 68koQ45irPvFzIv5Obni8GoZQxP+Z5HTdhMZ2E8ZZZ8TnBOedTp8brwhWOILkZHF AOnVMapDIf/zsACbXi4d67xcUa3PxfTjiPMcY0tyL1IoZpscuxAlogcok/GcRs4c YunMRF4vY5DYYPCpvcCYEFCMUcbqUOjGZG/RgGGFQoC8coy+HLKOtqA9FVZWs9a3 eRZUtcPiqkcjCUu5XE55YVLSdnkm5u019aFzR664sQXK9lS9lzyeKvi9B+soG/U8 b4TmxNRYBJRwXpABeBJo9wc33oVDlxt+5pkreOAqQwbelA3mpSVpnRjJKKr2c5lx PjwkrSNjcABoFKAuLsxjGUdh4vpHzDdjI5awsN6HejAJWN/Z7A598Ma7mlrCrrSO 6vowAuguQV6/crYrPNN+OkyjzJWjTOxzPynsK5kERApaD/BupPI+lbmkh8GSx3sA asdTephyIJX5sY/VewVueE1NbfjMs9eQG6vhd954J8xnHYQy8EYyc16jIkPM/hZ/ M57cm2BJJOQmwo+fPTrGN8evk2MTpx6fxx8RNMZzPS+yZmOT8Qi+j4FfXCO2G9vj HNuMDcV39Md9NnH9k5MT2M0T+O7R8fztsWI8D+fzxxgu0ZbL8Udf8UZj0098R4eP P487fuIyfE9DJ597sUc/fpMYKPsab9wb9LqJ/sTTPNXv4nk8JL+2o36ZGEQQlMfH G/ZLjzg+hn8fX89zE9/FBkTJmqXjv7HF4/bi6Yn2/D4eDBjCQpbH5qcANzHyqdNn wpUvfCGUNrSzSAF1W/PhmfPnwq//1v8cLl+/HtMcvQdQ+JOvfC387b//8/CZl66G lz/5KdLkdCKk0PgRBJYFzEdgpSP1tC4IpPKZrHI9mfthgcjxHiwTayMfhsa1H5AE mxKRyWWhL+fjYbX2hVBQVhOBltYC3RWqCgYDWZWovgwtnE1Pi6UcoWG01nfvD4Wv 3+kLD+/eDGnT74a9lVvh9mxVKD/7SqzMo5A1L+UCYNqSsjsIbSP2pwCBW0gXcxhm 0deWupLIA9OaI/DIoO8m4tctVgyY2QLUreGjXgKUHjCGhUTEmgQrh/vKRViplBgp ajCYgTJzKACrBADkYK01eleNtZ7UL5gOYtCK/67A85KbpptZ7pYR2r1EnS/TVwWa VZpM2m1KHkQe20cqpQ7hkyFQTE9iRaxkNvxCFIMaxsdSnlIO0pk35Vi0D9DU10nZ YmWSTNxNWpl3ENA+fqPefeP8kd+aCmg0ziAHDdziBzlc14IJBm+p5S2gIWvVkeec BgDYxzqanEFVsfazYRvr05+++Wb4+muvUXt+hGeGa4n2zeeoy1LQ71wTIOegYRcC iGpam0JLZycuXYKkuLYa/B6bqdWeZrAUrhAVbMUwOVFW4DHrwk0CrlahceRyL0kc mwZY3EnBegZ30Triuv8NMthB+KXCy1tlDCew6Baxse5uY4WfnSayvikGUwyMTmF5 5p7hv1raUZdYMm5nQZDPqhqhaQo0lY9arElGtAssS7H47DBv5MdlAxgsebsMIMzD CtpJJoIRrKoP4LXWVtfGBPiz8zOAbIJGcHfvYNEX3F041xkLHNx+0B8DvqTSjHFd q6JZZnEASsc2m19LQy1FCBbDa+QqXmDervLzwf0+rOtU6aI9BXg3G7IpwuQnD2JF LMBq2klAmRzHCcBWJhv4GvO+u2eIeZ1OInEDwijWMEN6rzryuJKNYQLPQS1AvBSP wIj3z6ZbX1uD8rkTU0LtMp+83v7GUhgFUFq9zNrhWjWdh45BLy5ZMwNcgu/aXFNF fkbyQE5TfOTyuShDb926G+f+aWgYuvZ64NXKly/l3H3clqZW0qqs69RArBwUuE7o BBv8PUwqtwKUaLN8DANmzW17ph0eKZu3/Nky+iaNZxFLu33pOtOOxRNvBPdVVUFx ATbRh93DBD5SFpdcvc14M/aImq/EGnYVC04JilhfzwAgdYXrlAE4FrFYT4Sm1haA DO5p5NXwLFWsUITk4AlukwjYWkPTHRnpp5JUKQpESbRIqXjkF/E31+wsovpWPgCA +cGUxFoIwOM+Lee8wea/wk8qlio5kLsAFoP4ZvFuWcbVgCw5kaYSWsdyqBVWeoHr sYox19qvd+Um97XJ8QZluk/o1pVnqSXNiPIDPA5a3ix5qfJVjNfjAGVNS31jTV1U Vg2gyiu0PK20TDw6gFOLomgxzElnw+a9bdJC9LRYoc8qUbqY05jPh1gUxwmuLCHC vQBXvTmUa8oLoIFl4w2g+hvzKhVgkgPYq85LRuab3s+0a7joS0tj0Nc2Hjct8KnM DY0opQQhGpQZuaWsafNvH6EAd3XU42WzclQhRgX40ShtBhimsXf29Q6ESfaXUsDp Gl6YMtqw0MECcuAIRXoeD8XUMhkUGP9Z5sYoNAjv6z5Um8xiUnqhKKygiDr2a4C7 ebiopVBe9PTI7EQDwjqNcglVR1d8GmurvLQM+Ym8Yw0ms5fYTzPuzDGX5lhIS+xT q3hrjD0wjzcLNVqqdxnDufU99hX2H4wFGcztOZ69e4H8+wNkG5ITpRGeLTI6V6MM SoSA+pB+ZEPRMOjvgCwqRYDgAtZkFnPJipCCUeeU3F3pAt/5wevhGzdvhln6ZzaA LMZTZVBPiIBV44dWfXOlThKjMtTfG/ru38P7MoZBF6twbV3oIJq/rYXc0YzRtz94 P8xzXsepdoIIp8Lv/8cvEVw7CF8cjjry/f2eB5GO09baFj7x7PMoQjnhzoc3KaN+ m/uVn00hIc7fYS3Ns5YMSDUzi97SYrwh2cgbufd6B8zSonFglefpWH/2pY+HX/vE K9AoCH5FRiq/Ve65oTj/3dt8RYwUd7cIpfiEL4RKxz8R6jKvfR0d4ybxZsLCmWgk gbPEaTbPZ/x4eqIR/xXrxZb9I740vCQwXOLIBH5MvPcA23kMXG0pgeDib861mzw6 jjk+//iars0ffSX6eXLPie857xifezd85k3KffALTgBAJZB1vNZxm4kbedyQl3Ph ewG+YyLaVPwRm9qsbR2fkDha3JkY0MTnx+e6sUbQ6XmeyIt/DJ7yHm3d/3zFMxxR XvHYRBPx7xMuxxabkoFnqTy0PFjtXUTrPfXMS6Gk+UwYhKPU2XYl/Pw/+Rfhs1/4 6XDqHFYFLIRv3b4XvvxXPwjXnr9OUNaL5J5r4N72oxVqmc1U530RboZCfsxVKrDQ 8jCL617e0+QYXLyBmyF79odwAU0r9GKouPBqKO+8RmCGG9o2AAmeKzwpUw2lMnkF vgozhbDlTdUCFe7dI1PhLoT65s2B0JGKZSanJAyn/URYKroYTrPhZOM/m8eiM8sE N2Hz6BT8WECPpSHl5GUwaSvyyD2IG1stu5AN33yGmVhKD1ngEssFt/JgpRQswScT AJRzbD5Cw6ofpnORK+bGIY/SjV7u7QxjsYdbZxJX6TtULtKdVsyGauJ3LVtamZIY T3mGu5yj+0qBKrI/xWa9wIJcRzPPA7CaNikba+QuLqJbpPNJ2rfySFpMd3IIKFzB YpDBBLCggW5dy4um03/zdW7D90lHkBygdUvcd67kAgikC+wigBQGezwfk66nAXys qLWzThQ0fdLdtMx784zmMzFzmHPZPNP6tpbwM5/6dPhv/9l/EX7lp/9h+OVXP09U dE343/70S6Qm+iCCvWzAfxKb2ppBLoBCOU6HjFE0CzEW6ViKyxBCjaRXMbG7ViHv M2ZjYANz4zLQQ77fEn388F4vm85KqJVHyVwfHiHaGHfTHpuhVc0qKqzQwiYNMIz3 y/LZ57lVlJYQlUy2AKyv5jRta2vgeFKy8F8pQGid55kBAL7Y2RitJaNwVEsrSuO6 n2SDkt9sIMoKLrJ60vRU4NYeGpmOLvo8xmKXa6wwX81vqfV7nH6ZrN08t1NsjAZM lLB5WgRik/l0GrBeDcgxoEdXvxSPZYS3VJochPkE1+wGfOoC1F3X0w+3D8CTnFfI sx/GmjiMlQIvA9bGYRSEbeaglkUtrtNQSSqIKnbNGFiUBrhna6W9yVjEorGhChC4 Fj6EN5uPZcpMCNNYRw9YW47NAW0uMZYlpBqTbzowOAyAZY6y6czgAu4hwr6mnnFG qXnvdj+KBJW/sM45V/oAoSqBWrhncdffIdNCNeu5qtT0UQ+pajccA6rK4Ayu83y1 wOWWlMbcpHMA80osKasohH19g9ENW0EfnKuWQi4BeFp7fo10VboRCwElZgmRclJa SnAk1+2hfd2obYyvASnLPK+6SgJtAKZjwxOMwRRBWpWR77mJspiFe/5KV1s4zVqT z5lfUhLOnz8LSCN92VB/zGCRkZkfix9kkFPzdHszGy0Anw29hEp3nZ2tyLNpZIr0 i6YIkkZHSS+HhV5rVSryu6UsKbQWEN2+tQI4QABzvsEtBk4uYOVVSJsG7ZB7WQXA Cm7M/bsXN76k+HxyGftFcpuqlFipbBdwMY31bROLrKBpjXb1auWhJAp8BOvy7FVe nYfeZzJyZpnnmgVQLLc0Nq/C0vKYEsx9Rm57MkqonHgtcAK8PTxJOzSUwt8Gm84D 8Pb423k6v7jOPCWIBwV4n7y9y7tkESCewLk1i2cjGwAngEoBvJrmL4n5tUYgVxH8 26Kj+VCfPBwOKc9pesBC5G0GwbFJAFiVboM4C1izxaylBTxVRTzfYrwqFlswz7Ig ZnoeGpBymr14lXajLMQqvoiC2UkwYwnPaxflz0wJ28jAGtbsEetviCpZScz5Jqqv HcBL3UGmGly5y/5n2WUt8Qt4E0xzZ1WmAsaqrgQwCogXLEpvqWhqxEiAZ4w5JMUj i+tI4bCEuIU7aqEkWc4ZfRYlsCh6igzO8r7MApOJzNK6nc6cM/OGSnE0dLHO1pDD gl/vyUh7eZ0GhuWxjjGHsI/jdURGuv4LoGXp0Vnn2R5ALTErR0FheWLcee5bgGrj NIq433L2kG/gqn/t/oMwgzxN5V4QwXGPk35hlhAznSwhp4cGBjmPjBTIs2ZAadvZ 06EWaqCll6WNSD+7MYKCDfB/8dr18Es/9wvw6i8AZN+KfTlb20BGnonw+9/9Ftxi sl4wJmPI1K/+zbfC7331z0mX18vcYj4jF/fcn9jnimpqQlsn18ESbCYMNsRIC1FJ dG7uoNROsrZ26WNHe3t45anL4fPQe7bJtsIySOAnwR3rSUu0sIf/IzYSH330Jeji E/5JQNA4+vwRT058d3xCbOOkAc7x79g2b06AZ/zXD/nW9/48ArvMHF+J8578zg54 3UR7CLp4UDzf60XA6jG8jq/7Y+kBsW+04qE2Fl+xh0/cx3EDJ0fEZoHF8eIR0D46 keuKne0o50dQ6r8nzXpjj98n20mOiZfzl6/4vQ8gceMf7Rg9SByc6CvHPurzo3Nj K5xmG7TNn/7YrH9ptl4F4MRoeCZ5RS2pKFhICptUtMFnrmOpRHPqYtJWYJ3RMrfJ ol2C44PvK9S1nwnlaKEpVC7ZwsUZW0fYOhFyON+azWp6M4DLacCGFr71hYkQ5pm0 c3cpDVoU9iueDwU1l1jcFSEVQTFztElaE3J6jhNJXTkXo2EzEbQp5DHZwE2RQVWb +oq8MDYCYCUQydQ0rxYtk3R5AisZHEfA6lZxZWgChBSh9Vu1ZJcFKaCkG4w5qaWw msof2mGDaAAY7CB05ln0us3U7hSAurYFkcsID7U8uZizAIL0FO4LAav1RcE2w8aY mULOUhTofQSSlrA1LmRKD4sVbO6lULt5Gq7kVHjhfDsbdYjAIh8rYBL3mZJimVK4 SwAMFGnAIbXhWyip11AZ+nEJyzFEHkYLcQbAMx93v+ApA3CjtczAqemt7LANd6uD nJGWgBzDIlnMPVlgYGVhIawCatYQDkmMneBCYGp5VGkrclydB1pgMRaQYijT0FkE BiiJC2sBdI4sAbQLOU6NWcuxrvKLHVizquF/cmIywQqVgDsy+IUbCKorV54JBVgw hsZHcXMPRnpGIYK3qboaywu8MkCP45+KcHKcpJCYN1Z3YxIpewRK2zyzdaxsO4Bt N/gZQFlHZ1PkQo4yngtI82KOPSQwoBkepHleHz7ojvy54rIS0hlR6hHQV0OA2hAu 87XVfYoiEBxGMF4SP01YgKwcNM9mV8R8LQLIz7NRpbMZuIH2cw25wvncl5WnGNLQ gItxAsAwBCjTlW6+Sfvi2pUaMg0wroSr1ga3dHhsOPShUDU2t7AZHTFfmM+AmRwC fKx8Zglg3eECr1kUo4a6au77iHRlzHOOSUJB6R+eZJM6DJ954WKYZF59//YYKXjK I12im+/kmj7T1BDXuBaeM0RXWzjgQc8QSm9KzNdqha8RgPBl0iSZBunDW/fgeG6H rnMEsaHIjQA+Wlsa2cC0fo6wpiuweBVCJeiP/byCa1+l1oj7JQIKT59tZj5uQH2B n11bHUHWEkDFoJYcXOeDY5PhPtevqK6M7vwJrLED/Fy+2AVAgVoyOhItwPUAWqs0 LZNz2CBJdqdwh4wH3C6em9NYJvepgDUaQWctwEX+6zgA+yloSLpR337vTuQxW4Ft YnaBdqegOqCgMIcfYjU12OzqhQ6snEukROuhslI9lc/IzYm1fB4PyKnWZopywDWH V29u0C6Ucqk/97EG5WO1bWltCYP948yp++Ha1QsAVfL33r1L4NZSaDvXFTf9rWUs u5V1ccOfHh+JFhtB6yKgfJU1nUyqoox0VgV5Oi0ekAx4aUdpOttRF77/xjzKhdWA COxjU85mXVXSv0qAkumtJuD3TvPcVph7RShNylOTz5tJ5GbvOIoPSfHrK0NzId4V UhNZQUn5tQRozYIbiZkyRoab43idNiyrWo1LXo9Keo6ZRAgQpKpYFvIA1ILnyopb gF/meyqASRFgpTnfCGwX4OnWVZAdBUyhlQonBdH7WMuYE3tpBeEoB2s+YAaRGUvn 6pEivCzSIKzilgPgycEiOzmEMnUA7YEiC/soBXVHcGBZR7l4a8xMorxtQclLZa9Z hxt7uasLb9de6EZWOAbDFMSYgpJRWboJyJyL4Erube/wXChjPjZUFIV77w+jAOJO J0/ssqCopDwCwFyoMI0Ec60hryxT3QCXfI3139bSHDIZVytspRbjVeF6KYxLGXSu 1IOtyEuVK2zhF5/fGsrKJO7wA2g/KgSWwc1Abu4yHk0N1SEJ8D4FILUcrDQkTAXw dJcxFiSe9xygW0txOWW5zbN6xD65gGHA1IWCkzX+zkLum7dWrvohRpBlqHFpymdH H+uiZWFXkKEFcIOX2QdSclFCywho4v02qddWkJ+CUbqdAMgA4j/77vciwH6xgyDY zLywAiVgC1kLH4lnjDlNLxvgO5fnXo48KgD0R6oXc2sd40Ua86+ltTX8yvVr4VY/ Qb5QHM7hLfvZVz8b8wHf6L4fnj93MVzvPBve6r4Xfv8v/iRcb+kkU8hM+Nr9+6Ef 7m0uVLJsZKzVt/QiVNZhkMHKrcK/wbiYSSSHfcmiOmvsXSpe8ugz4j6JAsheZXad f/wP/kFI+5vvhD+/czvGjwjC3Uu5XcVxBPdxw+Uz52t88Tl/fsTAF7/hxEcedc/3 GMYjvuHXIwNhbOT4u/g+Hhmvm3iXOCDiq9gZO5LAXsenJs7yO14Rl3HI8YUS1/RP r5m4+PH7v4fTGjvJIbENz+MV3580KoOXTxKX89vjbtopOiFAPR4Nvzz+m++8ef5K oG8O8fj4w6fxxmiHycCzoAXb5/jji5yYiT0sfnTyeWwzXoZfnGXXnnjZfryerR1f jzePj+BtPIXPLCOolpiMxr80N44ldCDUn74QXvnEqwQQoZVvUKd8bTasATrUtq2V 3YIbJwkt1frKG8totFiL3CysRewGcMgmp2atNdS8jofruOLYzDfXx8md+kPcvRWh 4OJnsbTUJFzWuOqM1JZW0Mmi38NyuAqA2NmpQDPFeog1a5lFbWJx9uIwjwY5wMbf mTwZ2iqw5C1OhOGt01hd2sJVNt30HSY3mmkGWqHW0XUEtpNzFWG3tkY5OjRv3dx5 CA43/nUSdR+wqN3UF1awPm7CzzHVEfds0ILWnnyEP9gjbvS6cOZW1sI82uwG1ttc BlPXfxoavjM4H8mu1WwL4Dg+Dy+OyO0aAM8IQjam8kAx2ELYmQbLNDIK7To2UDm2 uvUWATIbANhctOcFrK9yySpLSUPD+GcgSDMRfgN3+6IWP4kVeRPhWVsCkAaMrLNZ mKMyj41yEgtlEpYRnwfyK7q4iepiBVD5BauM1IsswLBzz4Akg8+SEWCJjQohjfBY 5lksr5NqChBVV1XN5g1nlrYyaHMT5eDND+/wczMMLM6F862NcXPitkMvz/2vfvha +Jtv/znWcayVGyvhuavXwyc+/krounwJYIbFgdyAplPbwtogrULrZFq6ZSSx6CCY i3BlbiG4tL7K29U9dID70jKLZ0+1xRyUqbvrMbF+3+hEeO/BcHjuucvRGiAgN8+n IFxrS211I+O6FpZvPYiC2NQvYyPDXBPQzvO40zMCh41NPK+YuTUP9YLqR9yPgnkK wHypg5Q+uPTex+2tizeH/s9Az9AqUoJFxbRm04C3S7im5djaVkM9qcEY50mAXHk5 PFOyGsxCVZkSKGIpMMirt5eE9sxD+XLr9LO6AjclYGaYY9ZRED/30iU4jOVh7LWB 0Mocaz51Knoi5nlotfU1PIskMgngZWA91uOWN9/nMH25RKBXHhaqTTZL+W26XlV0 llZ2AWytzGkCUvoGwqmmKiwc5fCDCYRiPneVwwlGSRjDgthE7t085scM77ewsjU2 1EXL8vDQOJkc6okmLwryTZnAWB7bWacE0zzsI0AjP5xjY9zHkn/n4SAWznoyJbRw /XmqTAGoWRvSYubpZzUgI/JYB4ZQ3I5wybcBHhN831WQUT3rT07vbapcZTD3TC03 jAV4FHe96YOWAYN6Larot9zaJZQ6FUpBmeVHV+fh0TJXDQocBOhbAricYK4iouot VbtAn84BIje41u27D3HFJlGR6ywAELc3/W9tbaCvKDTQTLTe6oqdXt7hvu8yb6H8 tGMtJlIbp26oqmvAwoXHBUXKHNe9y6SKQuEu3F8Iw7v94VRjBYC1LQwDiB/0oewA Dg0q031tWeFKrYr0cxdP0hrr2BzBljgVHAp+fGa5jHUm4zvHvCxCRlZBPdnA0hx3 Jtz+csLz6fsa52Uy/1UMDlhL/isFQe+ReVZ1LfdDLalhHsr5NjJc8KU72eCczU1S ulGFCbYBsQlUrsJSK09Vrr9Wb9dNHBM8FfklFaGZoLZu1pPBeRv037VQgUfB8r5a f2uxbm4wr24dQfFaBpgvTpLfFxDGul9FbmUIyOiflsYS96LptcgBLkT+ryzgkSOw VSur7vLskhIKOsyQTxvePWtAN7NyLgsZNsezWEKmVrEWZibGyaMKlx8lYpt14r6V zjM113FuCdZ7QOU6Bgm9PKuA1/xiIuixUGdgTJBmscXeMc/z1Isyh9JkCqYUxmYV YC332RgIaQhSZHYP4aAiPxdRipbnZmP1sHUUpm0FL1ZJKRUFeCWOeEabWDeL2TOS uB9LPO/xLOfx0pWWkcUDZS0PwCvVIN8YCOSXZWG3kdGNAPEU1n02llb3XjMUHABo NRVZUlpBrlJzsAgIhv5h3m3jIg7hfbmvDHZ3h//r69+EEvS5cAXAnkp/Y9YEdktL kUvfkPN/hMIgUDYFHmqJ9gthRsQJjU2N4Wc++akw/WdfDv/3H/5B7Kdp5J5qPxX+ miCpN2njM51nwuevXMMTMxb+92/8h7DE+a8+83L4Gca8Z2go/Nk3vgFl5afwcjSx v+MN4lrmxoZDAS8WhQXL7PgswVls9gVkXMgFuCdjIfaeNxn76tqa0IUMW8IoM7Wy EO6BSSwmEcGBfaXXMYuA2CdaYhka+u9PvJH42z/4nnE9BH/5il/Hd/w6vmf/TeCy xDEnX//Iv3wdA7b4ImKu+G/iHPfLRIOJ7+JfiQ99e/wSI/rWqz3x4g//jnjtiY// 3reJa9mIp9GoN3fSoiAwfszn8Q5thiOPRyeCz0ef840D6Dm8TpB7/Izjj/saN6BD tCy8B4nP/MJLeqnjc2MDx79sJ9Fi4oMIVI8H48nrPTqHg+O1/ICnJZlYy4BR6jeI sN47SMNCUocFpZbsAQSYAEC3t9RusHzBz5kH/I2jtUvyN/J828VLU7qcKkpxmasV MsNNbv8hG2kPi2Rt4EbY6vtGWBl8gwCUrXDn6EwINS+Q5/ASkdYN8CQBU1gldHtV 4KI5Ry7FjrpSXLzwx7Be6b4VbK4ysWcXN0iDMxS22JifK1kJLXlU4JkYDX9yrz4s F5yJuS2vtpWSm66M89g4iEZfRxi76OSubhFQpIt5fmUzgrN1BMQGNATzGgogBQzZ WC0MPMlAE8hGfaukg5Z5Pcfm1UZqpEMEzTyLRypATCCPcNtACCUhmAxoMiWWj8Cg raLojisMLbis0qAQyN8pRgib33UfN7alHXX36E7Mxrqj8qIgmSAyegpLlgntN7l3 +XrFjI1CKQst+AgLhOlc8gkUqobIXwS41kWK8yimbmol8CGVkqopCIJaNpEyhHEO 50nk39ln80NwmytyFc13C4FpeqZ00q7ork3VQsG9H3DsGu7iWTaENUBjXXU9GyrV bNiQ5uAg7WsFRZD0TY6Hf0My6x/2PQz1aNHXO8/DwSUF0Ohw+M69O2Gde/zECy+F X/iv/mXYq6oNv/NHfxzefRfuMRtwTLnC+LnBywfe5XmooKhN56BA5CGUtfoY3a81 1aAXAxyKuR8rfh0A8o7gtMofHh3oI9cqNdppaw5XdgbtJnFP0/AYy0h71YTi0N/b DTDE6kPE9z3oIfewspWiwKQg8O7ByVzbh8bDefOAkzrmQj7KwQbc2josDgZU9AM+ N7EsGQynJW0J6kNjA5k2oB8YKdLUSPR4cmboG56C9lAPaK2N4LcIi3AHfE3zAvdz 3UasGJbdfOOdmzHY4vwpXF1YGFJo4wxzpZz2FgFX59prYvWoge4BeLa74WPXLvId AW3QPK5QverKmdYYDDLIBq4itgBnbx4gfY4AMGkc8mTNMd3UUMt8WcYaNY3Lvi5y QPsJApN3fKaNNGLMV12TbS2NWGp2oQ/0A0hL498rzPVZrItdVIIyz/Ht2/djShpT hB1uQuPBA2IpTfnO81hUVulnM9dTsbBkaiH9qud+BRBDg4NQkJrCcxfasJ5tsA7k J+eFPqxnBl91cO9yuKfZsEzldJWSsmYteB+Lq7k7u0518AxQDliz1569Enmj3/3B jeiKP0dGBHO3jnPPZ9oaQwtr4NatO7FYSCvtPoRy8dXvvo0ig6zCEj9MntyHBLRZ 5es891IOlcik+v/w1RfCBQoVWL3rmcvt4Z988VVySyeTLeU2PvcCLE0drAEVOdKD AT73AHf3sMYmwS3cwSK1geW4GRqG93J/YjN8+a2FcGcCBQmLt/mFDSzUzW6WAIQS a2g/upGVT9J5zG2cBv9bKkc7uVuL4KpbXEAnsgnkt5hDpiA7y3y29PONO70o5lRh KsLlixcoD1mhwrdK9oADqEEHgKYU5kBhDooUctPKT65nS4euIaNc5/Ln1gAqGQBb qx3KgTWtk7JT2SBFphI5wmKLhRKUc/K5l1GYV0FTdTybMzUFofiAfNTMAyuzCYoz kG2mM9QjkYkV17lYUdcc1tOpnBVYU8itfUB4GllTHOPd9UXkAEok8yKT9Wbk/zgc 8RGyxhTiDdlhzeWy1zRC01lGdlkJ8Ih9Q65qEYCQwYtFOaqgrBUCgpehUVXgmVgA 3DLZWUNbKImjYYYiEtKyxqDXmGt8BJ70IEpQAXPRgDE5vFooLTiwj3wxT3IfHixl 0QQZQzKKK4mBqCW4LQ0KAbIVoH2YRFYUjB/v3e4JfYvQvLCqWw52By+etCf58ump CS+ShTukTg0RvzA1vRDzBKcx723PgK4aFDnng+NewH1LU2hgPpiRRy55DkoEulus 4KdSbR5pn7spxsqqufdi0tsxz7VSbtOOslDaWjUUnMOl6fB/fvU/hnfHR0NeDXtt M6WPeWZmMjFQTPqNHtLJcUo8o6gJOwxg1nOzrVUWpeVC1+nwL76IpZNjf+m//pfh 9//4D0LP2Eg4/9SFMPHhh+E7D+5FJfwLL74Yfvu//B/C7/7a/xj+8898NvwkvNhz GD5+56+/Ff70W98MPcPDePPgSrMn7fNskplfcrwz8DoUYaCQ2iBlyeqKejsNPLWf 0jgE59cuXQi/DE1NfvUYgaRWp4vFm6KFn8kNnE8ENyUQXAKbckPskyKnCJWQfWK2 eATv4w0nDrGBxIu/E/iLo45x2AmGsy1/4n+2I/6Ln8R/uIZgNPFzAr4+gs24pv1I xDglzvloC4nG/h7Qao9/9JUgxPJdvGMGwdtF4CQu7DmJz+z7CWA9hvSPG/sxgDPe qJ/bQ6y4cl1PXomPHdTE4CYOOvn28b8nA+gnjwcx8f3Jd08OUALiOrwid36jkY/h gloCGH7y458MT33sE6HrwuVgupwkyO5WajrILIbzo3sqhVRY5eEUPJdMrJCtZVnh hQtN4RwpfqrLC6MQ6Mcl+71bveF1KuU8/PBG2Oj5btgd+VuEAvy3FSZgyenQef75 cPlCV6guhO+EIczE31aMiRVMiH52fE33s8dCm8diYioPhfzY7Ea4PzzDQh8M1bt9 oWj7HhsReUT7W0LJuU/iYqxBSwVsHuIew8JkkIBjmsaitRKIwVz4QLnzBFg3dctN 3IiDvQOhuSyXKllwWtG4myoKw5nGMgjhWChYMHu4kk0jovW0Cm2/pJQE5MwyU4NU ASTr4TyVce4K1thRAlGM4hQUaynrBaCMQnXYFPCzuWupXiYp4QhBMFbzMjVWaR6B FeUEDnCfBpgtsiG6CK0Vn4rL5ICNzuTh8v02oGGYD1WXb04hdAgsW0X4k06xge0y h8C4uDwJAmEclxewjrNhyLsqYHOoBpBWo+mWYq3KZfGbsUAlTB7bKgJDy+IiloHd LfOmwtXCRW3OxFGA9j0S65toextB/P033gxf+nf/nkCbBwCS8vCpV18N/+rnfyGk Emmbh1Bu4bMKOJbO4TWEWi0UiRcvXgxf/OIXKUn6uTAOF+wP/r8vh6GePoA95VrZ bKyAJViSEpBlcAZuZAOj5nFf7W3ASePZZmDlmV+ep1BAVWhkflrUYhZLlNr4D5hv ulfb21sAfwAKNhl2flKAwUfGGlXAvWipN7L3HIE49ZXkUCRPrpyzTPpcjjv1Zcqv ngeYGVx3lpyR5zvIOoGVyIjs5roKNj7qrbP5nQcopqHMjEMRqASQNZAc38IBWSgb JQCMZSJrzZ6R6zUX5qE9HMKjbWKjgZeHBaYSJcPCAUmAAt3R9QDbmP+QjVeQbsDX LKDtqdP14crFTipCjYb3esZI+XUugmNzhxYzZo1YksyJm0fWipfoO0wIyp0SAFYL 2CG63ET2faML8HOro0B4D0tqWlYenNxi3M4zCIyk8CztHwIuBseIyq4hBRCWjmlA Qmkp5ZfNuco9G+18AWpLE/c5R9aIPYDAJVz9SbhNR8eGGfN6LLykr2ITHMN9395c hYXnkKpRdwEl6eH5K6eZz6vhy9+6gfWzJDx/GVoRIN5qatco+VyQTZnbnl6eK1Zp Nva+7n6CxOYid7jEdYzyWVddHKuVpbIOrWLU0NjIGLDmUCg6msvi+K4AYvpNZ4XV S8vXgtHouL8NEq1hTdyB3iAgMPXXFDKvD2txDcqHFtkJ0tHNziyGa5SbfZ5sBrko u7XQkC4AmouRT7msoWepAna66yzBbOQ0Rpn5yU+/FE61tYbh7t7Y5g4b7o2bt8II Y5lMwQIt51kpuG1xXCxSeCUFlJGMYju3uh36UH5ufwAHkOBGI/GtymVVNJUas3i4 FZj3VxpSNvPPV3Exm3hpFe5c+KVyM5F1ZsQYml1jjsFTd83SlsqDa0/3tjEBsygr uwADlhMK6x70DxS4eqqkAYga60hfCAiyiEZ2filygUwH3KtW1HTa20H+Sa0yR3QG c8csCvfIETuBUcJSw4fQjEznlcvxSczbJtLQ1aDkSzdSxkhX2EaGCAzXANZrm1jS cc93tZWHphJSX7F+J8kKUY5SWYVVkccL2KPYyxpWT9aSY+9aqsB7JnXA1HHlKBy5 IMqMKNMKY9aOCaqTycnUU5FVxjhhGbV8qfEAZcQpZEOHyOG5zTKv5lE65Wxvo1xM wOHMot0RLHuWDpWGoMw0K8Akyo/UigasxbsA2RosgCn7W3jG9mIZ52xoccY/NKEc 5SMPiukPj5rqXNmMbw3PhyAhLLklAMosLJ1FWE9XkR+rKMZ6EnS1G1tgGeZB6F2z 3MM49Ip1ouz3tuHz86ySGFfwNRbgErJ5lOF5M2gXjx9KRyqg+wgqACoJ8IC0jViX LbddgLKZT8aRKigWFv3Qk5YOX9lgMWNMqkvIdTs/Ed7u6w09WMPTMJi4J5h3dZcH IHdaI4Ie2I3ltWhtjpUhwTwGPMnNtyrWUxfOh1//xV8M/+yznwm3Bnoo85oRfuln fz786//ut0Ime8rvvv63ZDhICi9jnPqJi5eJHcln3U2xH46T9qAw/B+vfY3c0u8S 2EhwKrITfYCqjnjRmLzFVCkrYQ8wF7p8oRxkdBLXjgFjgFWfk3ObWyZdXnX4rZ/7 2fBKezvZhaBEcA8inMR/rh2xG/8zP07+iwuEb05wVURZiWUWP7UPiTOPz4+fcjTt PPliav/416PPT94k2hHbnJxzgs+e/CzRmJ/8nWvxAdv8j3v9nR4dH+KndvbxxU4a jJfj25OOcdCjJhyeJ14nJx9/pHXt5PsIdE/+oC2vlfgzdv0j1/X0k74kvvXqvDvp wnH7Xi62w6+TwYlf8blRhTZqNOQ4wu8s0d+vvPoTcLrO4MarpYycLgk4UoA+U26Y /kX30BHCJIeJ++zZrnAed18XlgTT4Lh4yBoFaDsg0ng0fP+tt0Py/FBoyV4OC3tL 4cEi1VhKr4WniynlWV4VzuUTwYxg07pl+iwthJtocObps6LVEkAhhYVxcAjnFUue xO9FNN73H/SGM/nUUU9ZpHpQX7gxOhoG058Jz77w8XAZsEE3qHs+FipJiVVBGVTT PO0cYGngnt0ItKpOs9gl4EfBhzCbxWIg0GiugI8Jz01uLhjXp4DQIF0LIM0Sj7qA 1uBkHSD4dhEQOzRahzUsh813FEG+gAU5GdBaQCdysWgssZmaRmcVYLoCRUKBmoqf Ih1LpLzASQIZrBudw4ZSChg7QlAYeFaG2216biEC7fMAsLtYoA4NRmMzMigpapm4 67FPhOtPnw93HnRHbTubfvTA752j0M4WgQRbW9QTX8D9iOXEoAi5qrtsfgJUZACb DBtTGsUjFIqMi89hCLA1+u1JAAJcRFzxBWi6SWxcHU314aefvRraSR1WzobwYGw0 /Dff+Kvw6wCyX+toJ2isNXzqytXw4MYNLCLjWLamQvvZ07GG9SksUW9+h9KKbHzm g83keo0I9A/u9WDx6MXdT8JxLNMr0CEsJ1mEJbcMywhyHVfsXDhiEyqpIrCIoJB5 BL7CVSvZMsdbharr/GnANcF+R1vUu++AKwlI5V66sDSuM15z4xOhFQBnpO3fUtb3 yuXLCesEdJQ2ouVzCW4yMrgY0NxYD/cVZaCYVGvnTjVES874KCCsqQYYG4iqnyLq HM5hRTER+0MoB1T7YZNeQ9irbpZi/VrFIoBvONS2d7AJURUGgGl+Uq1Pd6hJvwrV o46iAXO4/cew2Fy/+hQgITV8A35mM6Atm03sFm1brvPFy6fjvXTDiT6Lq1+X7PuU ad1lcLo66yOIvnF3gP5VRyAgb/MAxcUMAFNctw+ragnrzfylg9MUVWZT7sKiq4V/ Ekt0U3NTFOTv33oQUnDXNzWUku91Kipj57CGzgCiHwxPAGyo4w6YmQdwmw2gsaU5 gr8elL2DVII/iJpfweJmLuFnr5wHKORyrxRIAHCcpXKV1ksLKZQCPCoJ0jBv8c33 74TZ7eRwmvk1N0kpW8BFC+3OoaSMjYyHOt6vkKljbH6EdS2PzqAL+O7DYxHwa6V8 +KAH/fOQcp9Ps9Yzw+tUw2IoKR9ZCzdxPdzBoljTCI8XZWvgIYFnrNdyvEj9gNX3 b95hLnQydnUEm42HH958GKuWtdZRSGJiInzYPRJefPEyOSLTwndffx+gGMJVlIZJ 5lc/1IRzJrqnjx+89S5BKdPhl597gYpceEYAodn1jYBSqB0oWCmH6+H5rgroGfBS y9uwxkIpwWqYmguwyCnkHnGhFzQB1HA5M18ErejqMUDGjBbzc3NYbhfjflDAfZRK LwHkfeXbr4fnLraHs089HRpR8mJyduSEsQfKlU0q+wl4d7DC6WYy77G5Wg/T80JD OVY8LJoGVxkQePv+PEAMbxnyICmFNHzIY9355rSV57jBOooBV8jRmRkAB6ApfY8o dWRaJvPmCN6oXp/dZFy7ZVAqkH2bpFzSg7GF9V5AZSCjJav1SNWhtKl0pW9PhCV4 rYdlp6AdIYdYt4cZZCZBTk0ji9Jy4etjj7UiWxWWxiWU52QAmPlee/sHwyFAx0wH Y1BHyHeFRRfuPemX2gBl68zdnv5hgnvaIqVjL5lUjNBy3BObmpqwXlLSmWtUNDSG ZD1eAMpLeC66b3XjShe8bpEhAo7pdm60SG+zZzYw9huLpJBjXBbwGqxIu0EegrTi espHiUqjAEENSqE0B2lVZeXwWzEC6JEy6GoKEJbJfjqPpdACPvLn9/AsGWchx3YN o4Gc45GRCcaK4C6shxaZMIeWHiI9c+UERC2gPCZz/0kcW4LScLRDAB1zPwNvgWnG rOZXAOjbgJLVgGJuHIRlm83QYZBme0ElLvqv89l6SP2JnwjX6mpCKV7IWa6/hZal xbKUe7Ni1SRGIvMal2CMYNkBIDAs8b2R/eeR89WA6U8iZ00/19bYCF2Fan3sm7/5 2/9L+MM3fhiakOcF7O/f+Pa3w2989S8x0KSEX8RwdeX82XCxto6xMqMPoFRPJXP4 iHmwi4Kfznq1bPwe972CxX+NNuXMF5KBYwdFa4A5MLFBwZezZ8PnP/ZiyGZv+05P bzjCK1oAtoi4h0B5qZuaFePDj5I6IiE+4bPjV7RHcm+eEz9F6eKv+K1z5jHAMqD+ 8XnxAM6I57EeTmBe4pxEG75PfJ5o78m2PD+Bz07a9Bjen/yZ+MvD/h7QasuJq8WD /BWboDMnjSQu6+1qsTt5JT71IDkqnnXEYD3ZnFZQO5foYKJdz47HeJXYSa8f3zy6 Sf/0mEcRcY/6lzjupKWTv2zHQ04Oe3Q9L+FBPAzb2qF/0/CLPvvSi+GzaEfN7acQ BhCw2bzTFTDwnrQslSH4MgtMOZVITC8ZoxkMRwAAQABJREFU/Wk2olg9heMElEZG TgHCRsZGwu7ErVA2+ZdYy0go3/KJsJlVFeo2TAdCjR3S+RwekI4EzW4fZLgDQdT8 bKaxKSywcghl5djUV+GDpdJZeUNWlUL+4p6cCpeT7oXaFLhSq4C+w9ZQdu1zJAhv jlweS/QxnbAY4FbHHZzNhrcMADZIRoJ3BlG2B4AzrXpGxC4j4NSAaxEg0lB3EKaJ +tu0gUXA0qC6yKsRNNkIgGSszGMErZgaY53QdcuNFnC+Re+2Bfe4dsxhaS1sS7iC LJDVpIvimsUswGRcXkccF+tzzy6GtCIqUTEGvYCiJKx4OHtoC+GOpmz5wwYinlPh e1q9yrRMkc7A49MlvsBGprXXJPReT61+CiBg1HtjLTW93fSwNB5A3Dd9ly53y/Ka qHoHF1E63CY9BZFDykTJRjHJYLwLOPeAzX8HIXIDjqo0lZqaunAewV6NQDVatKOp CfdeXfgNgNlXv/RHofMHr4drjOUqFs0Ujpl8OBp6sLg9Df3hNJv6P3/l0yEXwPr1 174bwd0aloE5vquHD7nKZnEX+oBWINm1hbizMlA0pC1ssxFapaeUPh0StDYBkJsT MJEcXI7vGOClFvBYQR5djz+NG1WL6N17D3HbAY4IuJic2oKXjJsJsLaI0MtFSTEA 7ObNeyG7CIsz3MQ0FIlt7ned9dA/MhPHthYrrlbePtzVBqmYX3FwbIKlkxQDWSxz atGBfJ7FHNZpK7qdIdWV5RjHEN6F5STHh6Pah8vxANeiKaeW2QwmeUaZAJUZONM9 CNwiNhVMGnAPlwHC5YBK+X+4/tgM8rEGTpvtgvmhZdB8lA/ud8cUTo2NcHNZm+M8 73TuRz/hAMBpZnk7FigYBeQuQxEwSXwmG6wlfO3r+TMNMe3cCJpNDUDUNsewXB1g 9WnC4mgAjGmTqrDUrm+swcMd5z6xouFyfNAzAk9xAX4ncwRC0Js3PkDUpAA0WwBh 5JFcX40BXFrXhkfGANs74Wm8KVKK3rpzP1q8XmprBwhTavX+vWjBrQfY3+udCKMc 33LqFGMExYPnaoWvTNzwt+91R/78dTjK8qwHBvroD2nvqOQ1ACBx7Ntbmwg2SSbd Fs8Hxa6JADjzLPtdCc+B7Tu89sP3wsjwSGgGpOu5euPG7bjxaI01CG6ScSwD6MuJ let46+EI0dK1oYyxnZ6axOKZg/egEuWGYFCUiSudBKdirV/nuX3Q3R+eevpytM4N 9Q+F8nqoHViJVuFAj/Mccgu1IBK8U4xLuYosI8xBU0E9d/liGO+5Q07daQAlJYsB 5KlY67TO6t7chmKxqFWOtbUBF1LRbT7nbWIDspELNWRFWOM56HbWummZ41l4/jUE fu2jlBvEZpChWV0KoJOYD3oJpVzLnhxSOdAGmpor1gCuAgBPNUFgpj+SjmTBENPU LTBndQmnExW0j/yy0EAd1nKpAbtQjzAgEgQH/x7L85nWNkrX9mJhvxXqTp/Hi5QU vRu5WNgyuM6Mrn0AjdHqi7sAi+ySsLuKpS+D+AeU/mlc6ZgE4e8e0ucijAv7YRgL +Bms3fv0y2qC2SWV0ZDRO00GggbiCmaWwzJzLCMTLifgZj8ZowJAfRSFN4t1v40n agIFMR3ZpLW/uIL0ZyhI2/OARtpvYh0vji4TRIbyynlp7FH5gLp1MiFk4/Y3FeQ0 c+IIuaiVeQkwnMt+KH0lCet40iqAdJ1E+cx7c1Cbb7iIc1YB8SkEOqmMmIUAwYbx AQMMQCyffTam2EOurbFOnVOdFEcpzMXbBk0iDc/MCIpwnn8DzlQG3bvM8FGJkpGC LF/mOWRCETNIOZOHYNCSyqLVEJdYR8lw4pOz88maQvVFA6WRcYhT1iOuf8bfapfP nOpEUVoIX/7bb4cDcMC1psaQMYlxAKv7Ll5W6X+61lNYe1ar2s6m2hd7N481PsNt PJrGwtSzHxSw133v9e+Fr4+PhWcuXUbRJDal42z48o1b4afhtj7TWB9qodf9qy9+ LpxqbgtNxeWxYEo+Mkia2TY/KiQWNTB37yHzNQslIJ+5s4BM3SaoMJ21a1Wx8bU5 DBIYgpizLcjwQmS3+VxffO7Z8L/ynH7zj78UVlF0GuirAe6OWyzzyiqi6/x+bDAU b4mxfImPWHrxBVLzQF5+4Jvjg3gnpnrSq61M8fUYBCf+5sj4ub/01tu+nyUw2eP2 Tt75bwzI97AnXietcLs/5nWC9H7MV1wpcbHElY87QBe4UsKtLyg97tjJVbiNJzt4 cqMOiDfod3GQYq+Pz2UAPJ1v4zh53KMX38XLq+7E69pO4ujjD+KhthDbtn3+87q2 onXXVBu6HxZQrT/34ifDL//qr4ZTF88BKLB0sfgySPZruiCrV1khSV7o1A6cvnpc onzu5if3MAnenukn1Oq2AVYjffdC741vhtQtSilWnw+5Vbgy2y7g+i4JlXCljgjY sdsKUtMoxRJytJ/LRl+Jy70U7XtgeJJOWkmLPqJlDk6MxRJ/l5dxqaYthvrcSVzC c+Htmc5Q1t5JTd7n4OeVoGlPYVGAdA4Ywx8VRgDQ20djWBwA5oCfZEyLEtZNOdVC 9HgGG7l14wUM+QBmgw/6tX7QwVSEpvlmM9g0zBu3h7XI+9xnUY7CG6zCSlwBsExF 8GCyBlgfIGyMCM/GyriAKwetDi5ZDkJf61oW43iUx2Jj88iC8yZvdXlqB4tdWdhi vuimPaBfRuIahDWCm8iqJQW4phewMq7yA8mUDUZrIPfHGtpGMCVhFekfRdsGWB7R /xmCUdK5HykOclm34a5tEsiVkmQwGZ8BbHZpV60zOYV5wPUErqm4jfZRHHhAuGMp R9nSBv9sK4zQ92k21CQEeC7nHgB+rQdtVHMFWvensVgucY3/9P3XSbT+MCxyzXtz kyGdvpmKZYdrryIc67AG/OyLL8OXvo8F/nWqz8idI6gMa4n5Tiuxoq5hlbACjdbo Cay3poXJB3iUoKFnYMmZAMQbfZqPhr2GxXxxjNyjaZl8n4dFcZr5x9gArEYBWQo8 y1XKabWUphyvxVVA7uhUDCraZR7eBTCevVgedgCFxfCX6wBpUzEt2SCeAEFafuSt bQC8aklYP6ciNEdKJvqzgDLjojcIaxXLxAR0ECtZmb9SqyqXZ4PDxT7DpslzzcC6 eJcI9Ew8DmdaqsPSXlp4+/27sUiEtICbpJ5KA8TXNbVgHbOeOQUEGqqj1eIDAu2K 2eSazCHK2vjw9kMyFriBBwLfuilYkU8Gh0Y20AX4ZNO4zAFsKBYTWAqbcVka3NQL cLaoQHtbE2sVvicA1uCcBgDzDJuwz928pYdshA+oUCfQNaL9g3sDgIOjcKa5HPfs Dhs3RTIASlVYe3Wrj6F4XUVuWGVugjZrCRAzA0Qv1tc7BGLVAfoU9zewDD+gDy9d w6KMPPo+FmWB2otXzkaO9hDPJQtXpvf01nsfhlP1JTF4rRcX9Ajr7VRbA8s0E0rQ WOTVnr+Ee56GjTAuLpWLnBmGR8ejEtrBpmhdeuk0uSSfr8TyZ4CUqcHqW5t5bhT/ YI56D0e0OQw3dhTwu451pxwX4zCBnY5dKWPQhgV2iEwKy8jFy9CfUphTN+8OxT4/ c645rqP+nqnwNJblDKx8t27eZR1C9ZH3CcAwP3E1z3QJcDE/1x8688m9Oj9D2jKq mzGOc2RnSJFjzn97KCpLK1jbsKAVA+oEjcN4TZaRQVkoPK4BX+tYXLc2VtjIi8L5 c6dDWn45/WNzZ0DSAZG69JcJ6jK3ajaK8hbrmFsDHGbymLEAAkrNimC6sU0UMF2g 61hFzRFahgejAI+MQNT0e/LyDeCZg5KUgywwt/Ymf8fUSrhqLeGcQfSpim+vF8Gj lY6hYgN5+B7KX+PFxDVty10qBqch3yqYI/JE07Jx6y/jadPtTlYTg7z2sfKW4KVa QeEozM2KHpAFgGgSwnEB2tQsykk9Vl451CUluORRUmYA9HonnKMpyIw6XOP73P8+ fbx4oTk8RGFKwehQh1EjlXlhhgsVrHGss6YKXJ+dxhuGm59108P8t2rdCsrIFgBT fu8R51i9sZw1ONzXy16QgtUSLjtetBooB/sA3zzWfxFW2CWA7CKyjTrRKL2k0IIi tcxnR9k5zBvTtWGFh5Ih17UGy6aueudYahqxI+x5m+vkeuZ5L01PsAZJG5kNxYs5 q0K/uXbAvpQXCyXM03fIAXG/NjXaKgUjdpHTWdDX1hmbyZm1mJIuRypQTW0Y6X4Q 8ycXl5ZEb5c4gKkC3Y34E9b9O7c+CIcYdgSy51hTuTzTRZ6HuYQ1ShnP4t4Rq2bx 3N0D5thzDYYrh1K0z/fJ7qPI/a986ffCl77/Gpl/KsL9hYnwNMHDEv7yS8vCc89c JcDxNPdN9gA8QhZUiKWKkZcEJ8CPJ86EvTUdhT/FecN8MRWZOdFXkeXzPBeNnJnI 9GLG24qYO8hMA03pFp6o8vDsmbPhV158gVKybxLcuEmFMcA7N6t8FgSZQo9pn8BD vuHl74jNkOtaZP04gZvim+P38dDEcbw17ajnxHP5W+ur5yRO5l++8yL8z0e06nuP 94T4SryJ5/AM46nH144g+NFx8at4xo8FrfECx03+3X8UwL5OummbJ3xT38e/7bZo ICICUXPiDJFGHKjjG4kHx7bobPw3cb6WvUT7jzsaB5Nj4s15rJ1UZeKTxIDwNjaY OCL2hYs9Oj4edTygx4dmsxBe+sznwk998efCebSgIxbIElrsHi6IJNJnpBF1rsYt EFuFp3jAAjaCUQ3FFEhrJETeJ1IUdMX302EEPkvP3Xep0Qy/7cJLofUyghz3l8ca DZyLJe9oDw4SndvE2rcOGMhE4JgU2HreWQCvArg3pbhITKi/DOg0Pcs0bsMLuZRN XKLaSljCfR3CN/tJL1PVQvARWjBTbAd3i8EwWWxCasgGU0kil6N3io00C9Ls4Mh8 TGWipTOfYIV8tGtiouB+saA4x9r28/Adc+TPCQgZWBOpWzDAAddNqoVine92qc5l 3sdDxngRUDuJMEXJj0R1CxGsoQzMYmVpwOKBJIWri/sFAbrHBpLJdS13uc5PHpuq 0fcx9yrg4OBgI7o2TVKfywZkpOsY7im5ZIgY8gPiNoQCsI6APQL8jrNZLSzMhhfY QBcBOkaxlyE8TVy/hfYMU535hwbKeMjLOgBcHGKBEexp+fMmpV44T+IcYxGmYmXI 4CeFnJAtDU1wLRuw1GJJZyNTiK/i/hyeHI+VrLIBQC+jOIyxSXePYvWCO/hsR1vo +vgniAi+Cu8qI3znzTeocjMFWGsJX3j+pbD18ifCa1hw3/39fxeqz1N3Hdd8c30T gikQeT8Jn0tr3iZ8tKKYvN5MDX1DpC5aIHl8DVkm2ET6iU7OgaZSaaoa+vUQcFOO 28rgwCXmjQnJl3kGCrliFJV9XJMjcEKNvC4pQ/gtkrannnybCJLevkGsspXkq6SM IQC0lkDCBsCWvFUjhbU2bbEpmXBePq80ik04mx0oFGuslQ8fjsUgCXPvjo2SHBsL RyECdwkrywIbY30d/EPAwXsPukMnQSrmRF3EKrmLFbO+qQPep/vbQmjEUmamA1N6 GUxh9aRFrEM5jH1HWz3KzDZ5YbEs11dhjS2JwRF6Bsrk9mFRSGEtVmGBKUHxmweI NsMZ9DxzeVoitI4NMoPn0Y8lUKWzHMVtHKAr1/Eq/E05fR92425lPQrytdQaaNmB VTVaLdmES7BCVtdaxYeAB76vw5oo+OuFE246mhL6Yg32D8kUkAYYM93Qg27K/KKU vXj1PNkVCqE29BFYuBVeffFp3NhFAMRpPB8E1cDdfgjQ3YKy0dJ0Kab/ukfgmSVp q8hjO4wysoASUIo1Wvkwx3XSaT+TTVk60SQKjW5EqyqZC9ggo7ySipAFgNBdK20k FaXzzbduwPtNDacuXQojk/PhxgcPWH8AkhqeE6DcYJw81tj5i2eZP0soG8MxrVkJ 1qAZgmXSaetMG1Z0qCZDI9ItCsOz0Bb6sfL2ovy8fPZcVKDuEyiahqUwF0vRzMJQ 6CbVWXUuwGP+TmjNqw9lOVXQiQCxuu7hSHqtI6LVlQXuFUbSa+kvQOYssd7WONbX zv/P2HsG2XpdZ3q7c46nc859c8a9wAUIAgJJUKRGgRqKI0tTGlk1tstju0rlUHaN y+Uq/7FLctX8mBmnkTQzpkaiPTQpSpRIKhAiSMQL3IQbOuecczrd7efZX/cFpIGr 3ORF9znnO1/ce+13vetdaxGxsEpAHnWlC3hW+TjlJnEtwIZ2AvarS7BjOFc6wGba H6A51QaYma18oKG+Eo0+XbYAn2Wc2wxAdoWolGFr9Y7Wjl7DOW4G5OYhB1vCFimE tWHM4DjtirEtavrd3zagPEVeA6lPRDIAYpyP2sxiAHYXgF/Qa1vaEpiyJNmUVsc4 6qgw6YaI5AcQOTCeF6bTgKQ9ZAZ5hzEvQhZ4EdtXxPpwBKCtJKIk47oJiOrpbgt1 jJe+PpLyYMktW5fD8Trrra+6HEPWKZjsJSIJrYzVFqIwjyjGX1FRjf3E9jEHMnB6 FwA/yrxqsXUT2IZ9nIBsxk0+r21QYj3iA66nvIj1he9ZzzYX++lcsGqMBElbY0tM mlSyUgXYywDcqr90lVznvC9QQcRcisnRbcLZON8QKkfY/HzWjSVsUxdjrgxZmJ3C 1GquYW/WebZMo6SyAQCTx8t94vodxzxHwXk+v626kQP7OQPDbRdLK1xUIunaYV0V /Bu5sktiObpqpRY7x9h01uN91mM1qdlRPsI6tIPt4H9Wufn+229z7RAUX/gcdpCW uuzLn9iBCztsIt8mUQlt8QYklYnKDYDeDMilHdZFtXlXrl8N/1nRb4Z3cRSmWINe vfZ8eA752AVIgWzGWj72Xmf/mPF0zDPdZy6b9KVTYQQsCxYYrwFHGJzBc5ofnQxD gONNSC/gB8QTskXOxfGQZo5nUi2hhPt6yPfSOFcjG6PR8fvaa69xVSH80zd+FMdv NYA8k2tXZ32Kp5KLi/9N4JN/uvDzI8ZyXRS/Je/Etz/1P8/wIBuzpMR9SRH6vYSB 9S9Rmf+N7yb7j2/xn/h///OJ7QSL8cf3PIdku08FrZ/4Xtz43/kP+zjd3cl+4k3w FJNkLY9wAib9Mgc/pY6ffdODuJO4owSBJy8SYBv/jsjUHfDq2QUkr72EiOq9jpPP /HX6d7x43pAAJycP48dzw6txv4rqoXPC57/8i+FnvvK1cAkt2AFeyCwTfnEdRtD/ MeizAA6GY8rxSptgIIoY5IfZhLDQdirat2xNBiWwjilf9QQGrX94kbIp50Ljc7dC x4ULZHyiKeM4o4T6sikcatkOF0S98k0G6jqh+y4WagX+hqtt/armKR9PfxCgNgh4 uUTNv0vV9I2uJ3kLw/nhUAgP18+F0m7qEjY1AghI/GASTSzPR61SA7Ndo1NL6Mde 8w8JceTB5rUS4pldPeScMZQsWEojlgnXZDJZyvnOPpMxnwnXWk3YhsnTPyIzA/MC CFD3uQBgXWLRrkWDa8KUTIRdS6yjt46Xb23MNL9nCHuyOXeQ5CMXThY6KMOoq2S5 wUslRCTgBzyZwJDDwmS5o0y0X9wSFg16e7MguKgWAeC3Cb9nAkxqqglZLlCmaYWO KrC760zQSoDRPGW6cnhGTuRxwlfKFQzDaZSJN8FEwbiwQOXCXMRyZowFB30WXq3M 8h4MtP2dszFiWTgVlhHK4H7tsU+zcS1/UohUJINz2eWZHwNOU5R4sXTQHqyqQnhZ a9ssWo6niXt36SxJdu0kOQF49xzDvPe/vfGD8MW5y+E/IlGrm8+eosVCact4paUu YLoIIGpIWibIKVEH6DS7XTnGFGGhJTSO+QCAOo6lBMJEqhTg0szkSZjNonJYCgDM BqCzqrI6VrdYJOu+FoOWzXiytuQxSVJ1MKYr63Q7YuFQw7y5PBeZ+B3m61+jZ8zj ur/44mUAVy7dmPriuXnf7PAk0CvjPvfD9rkomqgwAegB15HQAZBiEV4DqDZRLeAY wz/wtC9mrxfyPB7ffxjqkb7UNTTD7iyHPmQOLqg5hMEsddVCclMz9WIHyGK3G4zh P8HkMDWIO9C+KoG4DxtbzMJ47UI3mu35OF87WwGinMc4kYcCvtfCOBnm/JYBLTev 9OCkHLLPqZiQ0kjypFnAJnbUNrRHtmUSJ7UdTW8lgGOEJLtVpC2CggWcnzHA5AU0 m1ZEGCPD3ha1AnBZenW46wfIZtC9rzMGGaLMRxYlrnsRB62G+9HeArhlUZmDMbuC 1vzWxV4cx+mwyH16/sZ52NtGQudTgOoVulERkSG0/IAKJS/cuABGygl3H9zHHhBe 7GmNEqUxksusP6vGTrZ5k8W9u6cjhsHTMKH1LPC257QOdJoxr/e3j4Mmi2gFhbIK tMYutoCyjFzYckLRU9MzTM+9cA7ts5GHuw8ew3ZuhheuX6ICAkkxtAut47rqAM1j SDTmAcq2tbWCxwQMsOWELsFyF/DdKc6vF63wuc6W8JD9yMbZxc0kueNt2NEiHLs1 xvgWyW6AnBV085FVhGGe6HsS1rOQseBomPiUxim1o5vPdwW7cwcwM0CpL39Mhtmm XF0GuQOLq+iAKyn31NocE6dsOWqd432eVSzVB/A8hCVQfrWwsBDFbPmEzmewfRIC ZYwZkzuz0ZDvc+/tGmjSYg3HsPh9oQwVczKPOSpwsYSVjl5RLtsTCTnivtqVLIu5 W4Lzr5Oj9evkHuQDiCtAF5ZAVEds5zq8Bv4uIQJD6Sau0eStsprmsJ5PeUHkVkUA 8QpC42vLFt+HXea72YDjap6t5QBzcCB7WhuIYq1FfbG2eRZ7kAeDmeIYlgjbx8E/ Zoyb7FZSgmxofjo6gzlc2zKMbS7O1DqymlWO39DcEEoIr0sU2aVvAfay/TkcaeiR Ea5TZ9O23QfY502AfBrbUcC9svTecRbaaJxLq2G4BpRvUJ4Mm7jDZHCOFLAGNeDQ rDKGtC9ZjHuTO+3UtgvzagtwpQyz2F+dxHzs5zzndMC4MSveZNdSziuDsYVYhPlG Fyvut4B/EZ3zMUAtj7+d9wjRQg5gsBaHLVYf4b41lfI59rsAEmVxbjkUo2vvwTEZ 66PChUiYc1FGYF6GjUBklKs4/l/ceQc5YFn42evXcHBquX84vYwJwa4RN3+sqpAH QVTbWofjUBkjfSbKqX02me5VnseFdrTpPJt8GGarihThGIo9lKHYxjUNwLeKRgY2 3lbYmVyf3QuzcPx2sRnzowuQQcthAYJASYdVQ7rP9cZk6vX5BRxxtMncIw1wBmti Nvhgj3u6x7lRuJMk2/rwuVs30QSnw79+692wxPOvYG3zCsSVcZE+/QUeSICs0NAV iH88s+TvCBcTjOfC7hf9zSYgt/ibD3nPN/nx1sa/k/3ETdlX3O3p9nFDj8nbbuaH yR/xk+QAJ/s7eSf+4q3kCXzyTf6OutHkCH/jkwgI2XG8EE4iksge1K0Y4P5ODpMA 1vgqbsdfJ8cX1LqfeH78HX98EfcjxBTgev7JzfNaP/nzNzyEZx+4n5MN3WfcbzzL eC3u3FeGA9QjzaJp+szFK+GVz70ert28ic6HRCQyuWX/sgCOno5GyiSHQwxrEWDG QvArsHr9kwt42Hb+mQsL409CeuEJi8BymN6tDV1XP0+49TIgp4xao4RXAUqbm4jx MW4HTP4KJrEF0q0EYKh1A4Nfz7E3MeoapGrCnCaQbMLwbUH1X8oaD5dJuCrOhfWt uhImj1Nhunw1nKFWZT21TKswbs0t1AJk4o1RhsSJpG7liIU6NwtjB8guxRjY7rUQ Q2Biyvz8CuH5PAY4E5+FuRgQ7fPQs9ZblXXN1xhopAGf6mwNbBlCT7w/ACKfoWal eDctYAHeWxj/QvREB0zqgWG6/+DZV8AAWHfOxaWUEi7NhJsF+kuzdp7ajsbCotIC iHkAcSGLW07ebmQQDA0CKyODQZE8GIRU2OM81enaetZMSVusmuF9QEvSJkLrygYW KEdUBXik0h7hriUWPrsGUWAaQF7AImalgyMMgz9HOCnqiU0w02DrfcbFiUXB+oga J1nfNOdn4lQO6n4eHYwi5XQAjxk8yx01czAAlkDZBCx2ANjq0U+1wm7JCKihNAv+ Zu/Z8A9/6VfCn/7ojfDtH/116JyZol0iyTP8VHHdhYBBQ0vbjj+OUQPoLITRFETb 7Sib59mMFCEfx+PhGiE92MxyFo4jQLdF+zcJn7ZRWF9wVArYV+c7PvuUcUtyAs/c Tl9LCyxGzY0smFQ+kG2toaYmDP7hfnbovX6D8O0+LNIUNQbbGTc5bD+HwUcnCFvk AqGVU++4AhNv2ZxmjPk0QHEBR6GnlSL/0KWxhBXgshXW9inJP5b26ekEAHL8ARj/ r772AueWoqLGfWprpsM5QOoc+5oGnF5Cy3bEHFAS0dENCMKQD2Hw09xHkyAXYRjX AVmVsD0m4s1NTrKgF8UOOWuc0xZgs4MQvs/UzPkyIhDqGccAhcpN2qiCYS1RtYk6 k3mMHTveqJszgSvuE/2zbV9t2/vhvb6Y8FWBozk0OETC2DZh1gvMq8wwOjQajf7Z sx3xHvRzf9pIUlNnaqJOFWyqrV/NYB8cobd8a1L2aRUWfBpt4oUedG04wdNUXfjg 3pOYVGHlhk0YPdvVWntxdGQqhqGfA0BokyZGqQaArbD0k6DTbmMd5wiN42QtTo1H 21LFGFH7twMDZCMJ1kHGCu0ncQorkLzYkWeK+1FOJOIQ+3AHJ2B7c5Xrb6FMn2Hd 2Vieq1UAyOL5QKaUMfRT6GWtrHCX1zUwzXFMAVB8bmbf2x/+/r2PwiTl1l7GWVd+ ZIe2W4BvCYBFWFKrOOQUlcK4wUgz59SHCvTVMNeTlPb+h/cjo1oByIryJGyPtYnT uzB+4wBcWNidNBUscILT2CtMTdShLrGYG7K1UH5dFXOERXkTR7gMMFgJ4y6INHPf RKxt7oPJikYfxnGcjhhbBdgEQ/211bW0r6X+KGtEBc9N+YBRMFfgfP4uxEHYBmC1 I2nQVljdQ7xgdyhZriPmrsmh69zPXWx4M0RA5gHzjuz0XM4pP7+U49JkgM9k60w2 U9oESqF0VSo0ZCBj2lnE3lK/lEXPjPUKzl/HUE2tVV+UzFQwv3RsR0cBophkr32O edGCI73FdVmdJY2tVpeahoVc45wXxnB40YU6vuDlIATokrYCWGLs5PFvmwiKjVJ0 gBewrzKeh9R8tjb30REONXPF89COWCu6lrllQq5zyMRCO5hlFBA9Yf/Z2FWL5q8R yalAXiTIn6RChQ7WJk5gRQ96cqRxE8zZ3DLuEUBvn/XaTlomZaaZ61WsWUvIU4xc 2JXQBFHv6xb3roLmDdYoXYIBrcN2ynS2Mda9/wgjeI2kA2BawfNX7pWJ3VcOZBJd A05r5m5h2MaB39qBAGGfGTiZPnNLCxoRLeKaC7i//+P/8TuE74vCz7OeG/JfIWJk dRadMM9LBjyX52hpsGLaxvpM9jlXiSW5We+XtZxba+mo50TkPPZZQNKG6LERdpTL jIw1H7HfbJ+56yP3cJuI0h4geRlHbQWAW9PaFi6yzsQ25miRjRogTGSewExje1Zx xvJYZ6wbXgbwzoLhXsA53+IenO2B6WaMrbLGfuvJY6rpIPlzLedeSuZxZvz4ml/M Bf6KeCC+9CM+0AE5+Ti+TjCYiOoUaon3+J/fFzy5Nb8+mVjvFn50Sl6K7/zhK/F7 /u13fe2Xk23jh/E48d3kK58OWj2mW55s4/bx7wSkAqPZowc9pX3jRXiUeKKexCnw 9HseOO4inoh/uak/nqCXnrxONvK130neT3aYfJK8Fw/iGyf78EKTG+X++MDPPEUP wE8E4JyPLKsDcxOgdqOrO3zpK1+FYb1FUhTlgDB8etHFWXhKudQSQDjuoLclYPpA b5sC0ICvpyO0jnz/nUCAnIE/iUGF5StrCFmt18OVekLCZ3vRIAF2CcXkAeJcJK3t p8ZonhBGAZM1l3DTCKyNGiDrylk0e4uwhr2lBR/Ta1shB+N1O8X2GbQoXIWRy7oY Chtaw25+ZXjhQksMe5pJKlCUgbRAM+grzDEhBDp2vpon3HWEkSyDuSX4Flv0NVF8 eyqPF2yrQa7GGyzCuxbcyl5OUw9VZnCOiWMdvapKNDYM8B3Oq4hJWFCTiuwoUlUY SLSYtG0tLMOAwrjIbsgkr8P4WD81g+8XkviwhRGtQgdXCyBPM2YyC/GykQE0AUyr YG/mCGvm51RHLxZRDi0YWRTY1xqJA/TviuGohi4AB8DRkBy+KMacklyEJm0Ri4Io li7qmyYcCDulVmoDKUcmxmxnawWARWMGjFkW12ubXpPebCmLpYL4hVXn3qlNlpFz 0Bj6ywFEWmLFHuX23s5m0XHhSbO9mjGTOnKLOBbblgAGjjFI2ei9eru6YOxzsUKU gZqeQJM1BxNXSzJLS/ipc+fR7G2G7/3VX4aC994KGRjEv/vCrfDqrduwcvUkAXGO LHqW2jk+TjS8G4js2VtkcKrQWK3ATo0MDAK48+g+VB/rl1p9oQvmJYeklFU88rrz JBVgwA8Zmx0k6mTTkngGyYF9uGWRXdis43iIgR6CWXzu5m2YqvKwCMh8vqcJ0NYe noxNk/g0GW6im7TIu8XZDbsL+mNBc5wRmbBx2BCT88pYXCfRTJp8UQrrsAKAt6PW hYtnovFeGx1B/tAU2W3bxpbB0p2FGd6ivNwkwK2jswNDDcAapYsWRtnyZzKglhxq oB6q7KQsVUNrK4zOYfjzNz+MuuZWWE9bZR7Bxnd0dPD4SBobmADkkVDHfXz7bj/J Ovu0YG5hMd9loZ+E5TGpoYzznYttYpthnpViqMk1k7smVc59GcfQ51AtoJHw9wzt eJ+Gl29dQWeH3o9wvbVab794FbxBW1iAXxbjp5wQ8QHPS9snANwnuqAW2rB1O2yh GsuHlNpSktNDSNQSWn/1zl1C+Hvhha5OktgYvyx6OhZmdz9G43eR+2fnrEFA8wbX fR6QLAh4+uhp1M3VAGB8zus8nxTheZNF1lj4q0jSs4HCFI7C0jzJbYB0k27Ghkcg ZY5im1hBzerBeihmXOWi35+YmIpd4+obm2PizQJsK0QyC28b03IHsA2IAKA1od1b gVkeZM6rPbUZwzyszzAg8CW6ZanBnoD5b+toZdwWhHFsZtYOtTXb2mM5v/4HJBxi A+eQE3W2pWH7KRHIfT9Cu2mtZzPic7BHlnWCL6TtNIz3xCTPbw+Wm2Yek5QFAWTK KpUw58qojoKJiUBVR1ZmVOlVSpBIUov66AqA6goOg5negglLhR0zTythttdxIHWC K3QSAQG23e0691wEnbrmSphK1YFiA+dZO5QQeA83GLCWI1RuYKWDQ567VQpm2GaW BMOaCro0AY4ePBoNtel8ysFR4J99L3PfU9hJAWI1ToZJYUacSo4AcTtjMNKVYQ2b LAFQlKfMC2CNPT3GZlFwMK5TI8yTIZpFVKOXXAAIEhbBqSAJmGvc4RoOjylVhYNf BKM7TURnlyRIIwTDfU9Z29gWdk+bn0fUYo97JBmj3VvgueU4FtBqH+yojwScsW7m ALZYuuLxKzlmJjZQB6AQBlHpzQHfScEqW/XEGqwFHGObOSEh4Fo3TUkdAYwJyGVE AixPhaCBUnt5AGJAO89+dHwqPCR6ooOXjczHjmTaX6VYhwDlVca48gLv4Qrn3IKT XorNXNogGRTyxo5Ry9jCDWzklfouEt4OSYxbwKCDG1g7lPgVsq7scD0NjMX5yXGe 9STXyPonWBC0sp1dr7IYXy4G//J7PyD7Hk0wtqu6yex91mZsqBEXpgZz3UoXzFvW klLYY7uUmbTlmDB6JyhVbnLk+AA0exMzeaYZlLbL5JnnwV7LhivJMuF706RSnPEp HDTXnCpsWH2KMnadnTihDXG7TeZeNmOwjDwITpi1Dsce7JLDOmaMTgf3AFJtd5+1 FtsiDdjZ2BB+Dn3rHmv5Dwb6iMIivWL+CEYjG8GzOUVM4i6ujP/x3+TPZ/gqgtf4 HT6MWyTYK4JV30qAnH89+zndHwfjY++aP37PIyQ/7vJjDOd7bnv6ob+TF8lZsbye fPQ3f5184fR7yYd8hYkkCIwn7Idxg9ODn6Dk+DJhK58dOH7jkyftG14OO3AfpzeC 3/4vsnp84M3wf15w/Be/cXrgePB4sQlCj1smp4YREmzFF36VB+QhNvHuOqDpf+GX fjm89qUvQbc3xLAp9oPPCf0QYre4r2E0exwXwkjquY6h41p7OhiWJh6Gtcd/jJe4 QiJMeei++flw9ubLsf5jIYxEEWGo/W06NTFwtjm8HmIuXlQpxnWchXVuyX71eVGz lw+IOGCiDRFmVNMly7l/jGc1PxrOZsFWlmyEx0yS73xYHirQyPQeA9Q4t140W+0t lBeJl89AZeAWcX0VgLitXfRbgOEtDPUWv8Vh3Sz6ioKsxdrF9+ZgJOYAp4bii9Ew FWOseKxxgG5w7rusVBOUhJEBzi+wSxPFt/G+rYlnb3WZ6v3jPUDlPqHYcsK2hNkB FMtrJBUAutoJadvXe51zFygespBqqPOpvbdHAoF9zTcBTvZwL2XywQtHI77HcYaf jKBFonQ4FEImgGXahRx5RQXC8jwmvLVEUf7ExDgX4bllQq3sdxqQui3byOTc5qIP 97cIi+eGIuqiTm5shj2AsPURD0huO4CF2WcRzsVgY50igxSHF/+xjapGPRu2NRPD pVhdD0hgu4eY3dp5RxgqC4r77I7RkmXSbzxDJoLzLQNwZJZTM9aQDwyeC6SaJDW3 llfp5Tqybr+YAHTG/9n2NkT5tygHU4OhgxHiaAeAutlFOq8BpMy+LuGaBVD6xPMw uQyg0At42wKEbcPY91J9oARGymYBFtVX2nDn8ZPQyz5rCSOPk8xgiLEO8LzLd9Sb VZU0hIHHA6G9rRVWs4nkIgAnGssbl8+x6OfScQnWhxAqFhWtNq0mNdIwqcuElksA UbLzM2g0m6jp2wIzO4WsZoYQdwNza5FnuwTj2wj4bCT0OA5wk/k/Q1/7Jyy22dy/ S9R3lQX5/l++i1NFpjtsnclbOzhbTTiIY6Pot5B2tMNebjB27gJgrYrQ3FQXfvCj O+H+0Gz45Z95Gccqg0V5Bt20VQWKItCdmVsNnT1dsV3yg/tPw6//7G3Y3bLww7fv wTRSyaGHVrI4ViY02Q0qgzn+o/cexVD0xUu0puV8H9BQ4CJhOMPAb1M+ymYOZ3tJ CITtfRvJxG3YT+UKw30DMG67OA2t8VnsotcuYWHdZqxMjE7GOWe73CWS22RKq0iY ayHUbkvS+9x/w8pnz3QD5nMAUsuhtrYWZ3MzvPP+R7FWZh1s9hJhVLPFbXKSzsih /unjyBZXE/kR3BLvj917lmGup+ZHuL+MIZ6bNVL7OMYei3QeWrZdIjeMdljmRkAS kQoc3qZUG+FHtLnsfxfmqZBwdDVA03JDZll3d8B4Mx/eeOsu9mIvfPn1F2MZqR/f eUQJP9h/mKQJ2PbHTwZxPNrDWXrNv/feXfTesLddrZwIrbFZkC2OnlNQFh49pWRQ Jh0B0SROjI+GtW5YN+aITHomjvsWizWIOkYncljM19DnLXM/0hpvFjyWZBYs5ihA wGx267oKnL1Gndo95l1WTglRFRxMnAblJUqljJTIfpUAKs1RsJJDHaBem70AM682 EpMNKC+NoXZ1+nmMeYGlYjErbxi+hSwM+4BBwUgu8qI0NnAOoGjdbtnLKiQmVat0 LMReziKTggQNw3NrYaGY+Yy9XcWhMKFqBtbLNsb5ZdthjvFWxBwvASBmbk6Fuf5H Ya4mkUOp1ZX0yBFo4pRmc9wd7sksz7aEpgL1aGNH+oYIa9tKm+RQQvTVtEP1nhvy zsemLFDOqqatMyYb2ajBtdCqLErrirO55zzXY65Fnb+EQy5z2mohxURVcG1xTiFe jgsig+la2AUQXp6ciKxjGrZ5i7FeRPQmx/WW83QVXllZwPYh7QJc7hNli9UYWI+K mb+WtpobG8N5LGOflHDi+8WsXbJ/9divI8DwKF34CnAi0jDru0QJdwCmmeQvYGnD 9AI2qIZoDtd/tElTCGyvETiBItY9IRfYxyK2agjnshDGPxcQbBa/tWE3GEf5+VRn AXwa0VrfpCoED0eA7CWoEz3Crly/eD70P3oSfvtP/jT8N1/7avgMIDkX22ykaYe1 ylJYEkSWJ9vaGefMmqNDGgEca76o64ixtYcNOQb0U2SRHIlEh5vB2nOYhhVnPOwC OCenSOicGCW6RhUGTsJIpGtfZYrIEky2LWzV3OkEOn7VTKcZbxms3XGNgJxaYPsx 9lFZTT4HTDd7itGFoYFBpD114YXLl6MD/aeP0NlSKq4D++X5RRzG2idkElJ4piAv /vkqwXEJguTJuhyefBL/jPPS7T754ydu6/v8zX2N33kGBpP3k8+T7zEkT/YtRjz9 vreQs+BfJCPd9ORQnw5a/R4b+OuTPzIZz775iQ+9wGMMR/wGB1HX4U/cJLnSeKmn B48ncrr3eHEn2/sFQE7cH5/7P/cSQYUn5Gbxhe95PG/qxyfifv1hXYwHNyvUG+JA 2GSCLOF9/MprXw6f/fwXQ21LC4BnBZYGj4eHP4qWZ3aKUkI1TFYGj+zqDkZgCAbm jZ+8GfKnP0SrVRuKmy+HD2AHqxo6Q23njZiIUVaUFfV8y1CQGtQ96kdmwgIK8OI5 4yXr5eXhiclG7QNmt/CGDskaVBdnTcbczRlCBlu02RsMq7l0txotCm9O4dX2Xgqt sEiG6Qzp73G9c0zIIgzlIdc1A2BoxHAbntBjdALal7sGNovLjZpIbyNEMT/U+dPj R7c7zYJXmwLgpQsQ3NMZCbZsGrCamVOIEYR5ZJIPAwAUtAvSrCZgNrwamiKM5xGG YJuQPGtHfPYmkoHjohwhB9Z2GZYhB3CTYmEWvMdi2LCt5+jUNDWHPlTgA9gshzG2 M9YqE6gE9u3YUAb7tUORhiwT9mWSxacJltXs3VXKwaiftXuNfd8rMGAjaF1rYG8M ny7wvCwxUwjIyiTMkiJcn1dHQgQLg+B9F4MuEE9zXMM2Zuurg9XoyrYKsBT3m2Sx xJjYxMNfgeVZJpRkOaz2xlYAcWUEOwdqvGDSMg8R+DPm9nA8Mlh82RXlfOoA0c0Y d6tU4EVjiDpZNNobG2NIz1JAKbR8oF+uh/vOOVgQfImQ0CHhIxONqnhW1hY1fGfo 1j7zly6dCws8jzv3R0ky2IPBriUESAthkMj53vMsrLDiPJTKVE2872kGQSfgtIj9 LCHmzwcwLME0GSpubITxQ8IwNAbb2XOGVrQk7gFAWqhfWQmDbKekcuUGLGATMJM7 LMZnz3VEdnSYxfoqyUtOsImpJVhHtLOEpmZNBgIkdmHkxwmFL3LebTC+S0QQ1tFe twNkbano9ZSTMGOnrF3BCtpiyyfNzK/D8s6Ey+faYL9KYDUJmQMaL8M6yigqW/j5 126yOFeGRw8fRWehiiLxM4vzaG1HGQ902AJ8LT7pJ9SOVhXgNwkwmJldoR7iGQB4 oP7pCK2Gq6if20USGiXEiCzcvHaG0H8G9/UJ4J8audiB+xThZ8qFGxfORO9+kJC9 MoAu/gkc3v7waWhoQRNINKMPyUBzIwlhzP8JQPcC4d8r5+kpDkv2w7fuI5cpDD/1 0tUwQ1WMb8IUFwKyf/5zz2O/Qnj3bh/F1/NhVUvC06ckYuEw3L58kfGwFR5wPkU4 iymu17qtgqSLfLYLs/bhB3dxYhui0zw0QYURHJJ2WJmxadi+yVHdLdrlVgEq+3HA 0qG1swu7RreugSHsEpVEilI4GGNhehRW9/JZ2JuaMEw3tDWc98sXzhJKzA8zYxOx /mcx4fNV5EyTlAec5zlUorl+Cgh93DdI0l5LrLYwMjoR3kYXXY1tHQP4jJMsuHKY CytGzWXG3v/6p38Z/vNLB+HFLjTOjPWxRWQMFVlIknCqAJdPHn0Y68laskgn2URU Q9UNDXQmRAJ0BGhfxjltxg7loQ/EmyTaQKQKYFPNYp1kLtPNSzaUOZcH8K2vonMd i3wOxyhhDqwgD3HfJrymceIKGCsmlMmM5XC9/iwzN+zadUgjmapaSgHCyq7sCoDy Yxvd3a1MnEUqfrBv1xbfb6kl8RAwqKyqCsBbAbjLKe4K3Wh4x0j0GcOG2RbUCgV2 +loDAT/pG47JPC/ASgtG59YKwtjCU3SpReFnkFOo6R028Ys8WJOMlmHnKJ2cSGas JQvwtMHDNvuzlNwR22OZAPNoM6u4FpKm5nEi83HcRzYom4Zjasj/gDXXJNcMbHhm Lk0RcESnnkyztnBPAEDH2O8rjPll5skEc/YA7aZz/wi7uMQzmQH82U3NJiXW1c7B LrqmSVqYnLXBv5oKpAlIBJrQ9pbjlK1DMhTDwm7hBC/DUtsIZBHQtsm4XGWu2Pbc botzlFbLxc7XM97nlkmKzTR5l4ozrNH7PK9SIj/NsPsH5itwTOfXBGxyIeuThlfN +ziSqTEczF2A6Q72TzySZbI0Y64CpngFBy4XlljJ387ABpVM8C6AvLl8X55CWY+V KDqwm/cfPQ7/+7f+KOT//M+FFzs7Qinrzu4iuROQEDBEcbzYdW0DG2P0QiY6j/XR 1tgZjEsz9m2soOE5xpE6RNawz1pge+hJHDerRphzUtt7JmrSN1jPH01Mhx8+uB/m iSuSURmgLcKvvv4zVDn6TKz9akk+UmRY0yqxPdS83RrGyaTGLo5YKa8Fo45/O6x5 f/a530r4KrDj/91XvxK+/8674V2IikbGqGufcEnAdIxNEMRyiREsRjDJ+8nH/AZX +CqiLF9qvP7WT3yLz5ItP/4wAuGT7YWEH2NB9/jx69NvJOD/ZP/JJqcffTrTenoy nzwl4ANnycDglBMc6qciYfclQvZ38g1PWODpK5G7/z/dp1udnrB/+6Hn5Odun/w3 vs1/PvHatzhwsh+/4b/kJ9kf3447OjmWIE0AzEPxfBdhO253dIfnXn4lpBpJkGKw rLF4GzZ1MnhTe86ej15hIVocdU+Do4N0j3k/TN79q3AZcXXDuVcI25TTHGCK2oUF TDIHBMknDM5lwjx7GCJDHWY5R30kRjP2CuZU1K1Y7H2VibNJgtMGKHIPI1KL4T1f OEc4azgycquUgtmseinch0TJBmR1w4zUlVkSi3IZeNQC4gcDeGU8impAxwxMhIbd MjtqZtXmZTLqapA3KPoXjG2jebXF4I8+7ItMSVSkZpJNmoeqBUnEFCGVDWbrBtuY yKB+SoC4BXjawlA656xHKJvhYt2GFjEfg7DNjTWb1bJdMvCK8zW0MhRqg3Iwdtbi 27Gj2Cplk0gcqmNhzwT4LsJ4ThLOTrXUcv/3w+MhFl0mZyfhx1zOZwLmbhu9rBn0 liYrbChnEQKocw6RmeYYxUzI+gYKyMP6mSm+wr1dgEV+nmzrVFhD1I+BgL1L4RFX cz5ZnIs6R1ZnDDOJBXixFrvOwajGMjkA2i3C5Jl44muwzn/yZ39Me8sRDEQOC98m /bpTGI6C0NTWAWi1Zh9DDACpQc3kvATB6uTM4jzgXqh9y+YzNYSpGipHxPPZj/VI l0tmoqZvCuOx+nQZ8EvDCu6p2kbbLRbARGhA7Sm9g6GXyallXOIXUHsURh6jZDLZ zBw1EwFsTS3NXBtgHAD78s3LhFVXw6P7w7B31ZzXUdQy5nDOJj4NoSu0rugi+33y 9p1wiSoH1YDUMdjOdYBJN6xoTjYTCENfUo4MASM/CAg5f+4soacDqmTYbaoWfRba T0CVhblrAOMjRCQKAf3KEuzQ9P4H98PrL1+LiXF37vdTzD1FwlUt7OtMbFDQ2dke NYEPP+qL3bW6W2spWD8Gc8PYIeS4isQll4Wyo4VkRdjxPsDX5d6ucIPuVQ8ePgSI zoVr1y4RytwPNhTwO3YAstOMc+Azz12IjRFsd9zWROcjQOHIBE0qsGVdXKOLzg4O 0OdfugYznKIt62PATF546ebF6BA9GZoOV871sHVW+ADGFSUaiVntnIt1VKdD+1nk QCwEj2B0N1lA1VOzlHHb0NuxsBpxGOof4TkeRXmB7H3/4HiYZnH72Vt0wyovCNPj kwAC6ooi91hVO8w4eO3Fa1H+YPZ9JqCqpbUFG5YmGWMltHe0RbZ2eHCAs6FfO4DO RJU9xmsrrG4t8oyB4dEIIMoJ/S/CTE0MDoULAF1oKPS+w2HoaV+owAYe5LBYs7BZ L/UCzKhyl0Xqi2Yx58qr60giIUuaqhe3b16D1SkJb737mPlFctrl82g+S8KHd2Bg AUwtrW1omGfDt/7td6JspQBw8uaP3wmDMF2XnnueyMFyePrR43CztZ7SebC8uZvh chuaauZVFnajGiBShfYvPHG9IIqBfMgxaw1sVt44D8oJKxcwZ3eyYc7Yfxpnz4Qx q0fk4Bh77ra+PIJosFyTDF0lTnIRc3sTO1vKvmTqgDBR25+Fw7dG9ZcC5oTgNxcQ Rm8ynh63CVC8zvxNowvMJGFGhsvrtAFJbLMMmHUtNEfgECYyC9095jHKyeAW4AYA K/xqgoH/LDb4/Y/GwuwOwLq2mcQhqsLADKa59hWc4nx0iPmsE/CVYSW/O0weTARU 83HsCBq4jBiFWYQd22UuFJfl0+yEFtOsW/Mw9gfYmwNAigX8LfVnWTsbl2Sx9mk7 jrXTXMs8zRAKU/VRruVcr8CeLCNlMFyuDGMbY3NM5G2T79TgCJdw3kfYm01A3y62 TZlCMc660ohybIpln7ZYs02UOwCkWg7R5B/PoZ3xekhlECtccJuJHlD6imOYGOsa qH5WHWYB0pB6oh2rOOV2UQzIGkqZv51oVNPY/DT2dpvf69pRxskRwK+cZ8ECEIYo Z2UR/vQ2Tj57jyUnAfKZGehucfa0IXmsESuwx5Ws3SXcuxLeM/GKBRP7Sr1azvEQ gF9W4njbw8nnmXOaEkBWqJAXO0s04f2798K3OM9yAOGl6lQox264JpkA6niw3qvR FcmOsiqsC56F9zQD8iDiGu6tVW8WWacmcAKXWGcOOAerFeXh5NZDcLRfvYFcgjKA U2+GD/qfhCEcjn+AdKwdu/AIm/iP//AbjOHc8AtfeD1KA7wv6rRN/KxsoukMkctF nISFKeRRPHPL4JVTqNwa1h8w5/dZ+y52d4avNDSGXBjzd79D0wbW73LGaobkjc8n AjDO2z/551vJH/yOL/jMP/lvEg3nXbeJP6df4AXXxiN59pOUujrFjc/ePvnD98Vp ye/kTfYfX/OKXSWYL/4ZP9bGfspPPNu/+T478Vyegcq4t9MzPrmUkwMnr5LLjNf6 N/f077463c3JJ8nRT29Q8ma8OScXoueUfOqRkgv2zOKNP9mHn0RZANvaWamL11/9 9d8IZ69fRfhNJSQ8X+wegw9PlIHXC+NTzoQR5MyY2T3wQRh78iNaE8J8HDaHmqs/ H5p7rzJgCS2xGB3wZTUwsnaZhnYwFB7fWpkOYHsnHxLSIREQ4wuzxIR4MDgFW7YT Q6f5JbCzq6OhZYPC5YUIp0k4+GilgcXkWmg+cy18AaB1jKQgA4NUGXU/JAgxGKM8 g6e2BkNbwL8MQIgCcZsPFGJg9w4AcYSm5gAk1iq1tIYJAlkA1AeweE0pexabDIAu priMCUZohkVgD2PfyPaL1Bc0c9/yGrt4hg2E1ExGMYHBzMQlNEyrgPNytEJbGAWz yKvLMgmBrsZC1Gu7aEaZTA2Eb3ZYcAqZmGXoBM3OtOyUYSxDXkcAOMUBZvDPYWjZ FKCMEeK4NTAfaxuEp9M4BUzeQhiBYrxXh1x5XKDyCVux0CNPWMUINbN4FMKuPESL VY/TAM2AP9AAAEAASURBVD5kwaFYNwtNAwCzCBbmWBaABBU1ncVcdyWJTBVV9PAu I4OTMWJW5waM5wSL8v59DBt0vfdgmLAZuQgxREcwOd4DDbCLUg5GK09Ai9GeHRnC m4fhpmKAXrj7RMnFhGRLBrRGUbbEuoUlMGdlRRR8hlGy0cHEMO06MWaWKCuGtXGs L85TmSKbmrlcsyxsCYv2NlWkR0dmwyRjVgmLHcam5+fpqkb7VxbtDwBy1y5coNxU KUX7n5JctUMJG2QpLBBZOCMp7sMabFA94doUY/0x4a8SEpvq6hvY1zpMA/V7u9rC FOWhZmBZLXtVDYDZwvB3dTShZyS7f3AUtm0rPNfSDoNJe1zumdntaViaoVFKXfEs hibo/tY/CONFVi9gwO5cy2RGlyGlmIGR2AZgKRcwq/YhbF0JAL0BB2wKJyaTZ92C fmuepKhswmq2WjWB7423CZkTCmyGLXzwsD+8S7vay1cvIeOhnA/7yGTBMmlseoby MLCFrz5/DScHzWn/EPcKGQv7t4TVBCzkNRhX5/n7AG6igeEyQM/qAIPTS+H5K5Tg 4p4/Qn/aBUvUDMs7CvOxygLcAbBbZIFVx3qddq5XLnfDNg4xFtLUXyUBE+QyCyA3 U9xSVKOjU7FkV6zFyrXeu/c0Js986dXnIiB7972HMdTfAItoi1tLj53tbkZrmRv6 n/YzjrLCtYs93H86YAFu86nCYPhvDWAxx2Kk862TtMK8NnPdeqcT3EO1+G0XzvNM AAzj49FRONOFJAN7NTU0GA4Yt2ZSWypJZ6uiFlkLLKadlg6wOfk4KvM4fwszE+gB UYTDBLkK2fe8kKSTHMLv1t8FroWe8+dxbo/DW2/+OHyT6/nNf3AmJu7Nwfz3XroC A8Y9GfoIkJsbfvoLXwzTY4Ph3XvfCI0wuQUlMGc8v2oiCnYZ8qciRRJiIQwQ9rSQ 8WPim3PT/AHD6zL7Vuyw+soeUaF2WMpOHHv7088wZ8oIR1cA7HT4XEdMds0DPJTD wJlDkM0zykEaMU3EZhFphG12LelWyxwY7uuL51DKvBSoSkAAg6NTkQY97sBWGXVq xB6StgDoxSlGVnGIs2iDEwmC9paaMDU+EWZXaHyAI91STgvmLMp1HVfS6e0K34Wt BQyvYmc3SrmvjAtbH+8Q8SkFoFzWduFgb1AZ4Zhi+CWcg/KcOYC13Z421nle5DEU kYsxOjkZyYFC8jAwW1F3qiasiO8c4XCOMffzWB+2lwy3F9P0oA2HTrkOdU/Xd0kI xvFlzdhdIdpI4l21pQQB4FYfGYREMLs/g2PncuysbACa8gvA/9Xu7vDkw7thBee/ BWdvZhIgvoajzvlV1VZGB3B6GO06wEk7us19sZ7nMqDtkO8XkQ+QBTPaChAsYf0p 4tlsoasdodRaKYBvnfMdn5ri+/WcK1UJSgoghwCibMdgCGPYvCyAbzXPWmKgCSC5 gOOunVxhfbFKSDlVG8Zw1ix/VQSAb+G9Yljpex/hmKI/LQaVwU3HHILdDUYK6w+3 LsogXAsFlRlobZQ59DY2hv/nez9AglcSyl//AlUBiAgxj2awqyYQF/AMK6gVbBLm /PhwOGQ8VgLwj3CWlrC3brdChzhbYR/jbOSjVc3F1s+gh33CmP7Jo75wDob55WvX omykp6MzfOsxiaDYxc9fvR5evXSVBNm20MQcZ/FkLWfdYZGw89xBNqXfeL+I69ng HhVAuOSAB0bHKI+nxp77Xt9MxRvkFjkc0yTcz9y+HX4LW/Jf/v7XA20s0G+DA+Ja 5fAHxfC8MCz8CfJ0+eJYEX/5MW+f/ji/3P7Tfrh9f+vHfZxiNXbzbIOT78dfH39J nPm393y6yf8HaP34y6dHdhcex3/P9ArcKP9nqD45iWQb0XncA95X8heH84jPTpSX p9t4AD+Ln/vi5IdtP3kWcZO4TTwiG51+6u/Tv0+/zO/IsjLGAZmQheGVr/5yuP7i S4QP6bCDfszQm00DqgEDNXh0aiyXCWGuLUyFsY/eDCMP/5qwAQkCta8gGWDx6uqN XrnFjg9IulggUzaLyZ8P6CpGy5MGIK3sUveOhdKuK5VMxmNCDOo5ZxDNq13dWJgM 7XkroXRtHsCTFRpLKHi+NB7uPjoOS1WfCcWNsB3NhPtYZJvJUgW3xlC4I2abiZQL 8EtjQMrxiPMAyuoC6xDAl3Isa0wecU/V2WRwTuqPzKJVGJ7C+Nt3+koviTksBiNj e2EDyUIxi00FrV5TgEr1cRqQzOx9vF+SURC872DgawCD1mnVeJnp2Uo4Us1NLs8H 7Atbi9YVXWJ6l7BXCeEYdDseW53aJgvgEffD+qxFxQB3whQrhGlLWCQE43nctwWM ygohKDWCRRxrnoSOfQyB3alau8rDvcFh6oOSVEViVkkFbAn72wIolXL/amCIDtCH 2VpTAX4GVseQdRsAfWaIig7T6DmrmkIx48ZGCbb3y+Q+amRkQw5gu020UCNkiKe3 rStcfC5FqRWMNAahvoEs76GB8IMHdwFRFPJnsTbkaMapySvZjK25sfFwh8Xurbvv IniD3bt+K1w/ewYgRtkttsvWwLAwKBvQ+VR2Eas8YOB4OAAR6jl294bmKoAjwN8w 3x5RACtX5ABEHfKG3sx6n+ZaRybQ6eH9a2HHaBFcw7Oph5l42t8H4yrDUMFijDif RbW5iQQg7xXsodus4MjscF29Z3pwPsZpElAeLly7gcOxxr1bJQmiFbY9HYbGKUlE 6FNG5HE/2efc2w7ClZtoumTGXn/lRqx+sSALR4Y4FxjeoXh+CQtRQWlxGGZxAhOG 2qYW5DVLnENSbcC6m6uE+y/1NsaWh/2E8VYIDZ5/vht94Dah6SkSGih4z+K4zZio 45yZulGfKZi/evUirN1KePutD9ADN8PAUj4L8FTG+H7++vk4Lu8/QP/a3RJLZj0g YckyNRcBqepsxwCthrILWPxMvFLOUM4YekT70i2yoS9dPsuCkBu1titbB+E6jPUq z1224sqlXrJ3C8I7hL89XicSAeurPuofD7eu05aZpMJHHz0lXMu4RV4wgJRgmCoG L986G6z2ce8uWk9swIsv3WBBzA33AN6jtDhtbcKBIGKzNE/lB7SBeUXlYZgSXbKz rVyfoVNLeNmdr4nQoxnc0wvzMNtNoagCQA+ALQAY1lZRyYD7/uGjgXCeBa6RxWp/ C9kFTnV1fTJe5qcnIuvUVY8kA+bHtqjOzy1ijX2jM4BhmoXa4J2qGwvzKxDRu7Bq deG9BwMwWsg0OuqZp4B/9LlPh+lkxn5WYPge3Kez1+RY+LW/83miLYS9AQulNY1U +MApW57D9hCVaukBJB2gF4atzW6BGaS2qdfMnGekY3tI+uQnD6BQRBhJwG7muFKg WWQmK9iAY5okhGVKfa13hvKmbkLgNCHAqS6Cgd1A9whBG7Wctkm1diomIoIh69rs ck0C/FIA0A5zYh7AKmmRD2jNV27AXNvgWvJgGWTMcgE4JnymeCZ2g0sXHsWGBxnc txzsrvpPS86VIr8wEdCavY3IVKzpa+h6ltKCRgAysBH72yskoxEpywLIIp0px+bO cPxNgGRdHR2omPNbODmN2N28CtjjHeYPa8QUWtImqq6UYIetSLGDzd4gmqQM7RAH dplIVBWlEPNycPT5nMEX5U7oBLiP+awXANYIUKkuUNUcE9KWcI5msCV7XEc2Nr2Q OWDzhKLKGmwJ5asYS7vcn62DrciY7mLrF5CTqYvfw1k2DJ/BOnCIQ0xmFQ4xbVFx SHNZBw4hEmxXu4hDsImdtSVxmnyH3m4aerD928w5FhjWIIgb5nYeNniaaGcT2v0U NvJoL4WGeT3cHabCBOtasfvjXjcD0HdZz02a2iGCYrUFy4btw+BaXmsNuYqJa0Yp TKoziS+N3IihyHpIghnjTAeEbgHYNEqw8TmPAH13K7jjKAxh/zA5EddEiQmfxxA/ AFEWOw+Gs4PSlN9+4y9iObavvfxyONvSwrVkxHrLgpcDbHastYqUZAsbt4lzuwXO mMOJlbCqAKB3dfUQCaFuO2vZGz95K/zBt78ZDts7QiPE0rvf+L3wVzgCf+fW8+ES dvjvIYf6vT//Lh2zqsMrt54L/94vfDWkmeuzA/04jHOhETtmNNMqFrLCTA5mTxZJ q6OUTtvm3JCIQUiIbfJYDMx/2MAJKauuDm28b3Wb/2LlS+Eb778flqnAU+kaJeYC L7hORXJM0Br368zk/j77+Rhv+e4nXyXY8ON3kg/Zyg3Zd4IBk88TBjYBs+4l+fjk u2JFvxN3EP94tiuv9P/fz+m+2PoZBgaUmhV48lFyUhzJ4yUHS/7rSzaLPwm4TfYQ b45b8oUE/iYn54bJ+fIlvxc/5494vGcfJtuwQXI8NvNL/IuwljfVZswyeG73XAi3 X/1cNMDbAAB1jAK9CjyuFhiYQhi+hbkJ2NUPw9ijt1k0BsNsztmw3fwKAOEiC0sd kzsTwTWDg58sJlsO4C8fq2iNzSwGgOEqeyKvAQoEqePzlrXaDI8pkfUeiR1Zc33h 83WLsDrUp5tNGhBkN14Pux2/GIbrvxD2y5rCJSZ3WzPJOjC0hTIAGG7F+HkYLUFM OefZiNi/p8XFoxItGEWZARc5hBjUUhmmlo0y5OC5bGPkVrnedQyJLTcLAUwLMFgm t1j/cydNohWhbMXn+QDsTcAmsY4IpqpYJC+RpFNbixaUG2lr0FRxLrreBnSUhNJY FM3gLwEM2752aR0DA/NruKIWNjc+UQb8DAki1kM0i9Iwis/QpLBFQo9qeawpp05W ltiwHhG7MIfXLcMjIxydAti+ZcCthtAEsBHu6Q56UuvcWtTZsaWcowEWqpgFaBtG 6ADQU4Se1Q4tZvYfwNhaCmiLqgL7AL59rl1n0u5hLlB27pGVroblqwPs1cO8tGGY mqp5Hmxve70yQFw5rFwxC4Rs6tjkVPj2X/5F+Pp3/yh89+HD8E9+/AYdmj6IdfXU m+mlCzsPGBNrOAEbylEAqoUsFjk8VzXNdq7Sy7U2pU0Z1CHmcq8qYLRqYcPK0L1y q2PoyvlSYGMGnqedWEpgGqpgOgz/LcKud3VS7B/guwzLXIlhN6SWzwLcCMCx2YQs fz3Ft02+GBufRJsJgLMLD8kaMkgbLFAj6EKbakrQlJKpDxPQB3u9S1h7ktD/5Dg6 KMLegrZtFu0bFzpiy0/LKG1g+DtwaExms/3q81doh4xRnZ5fQPtXSotNngPXK/jK APBPwr6OC9pgJZyTj/oGYg1ZJQ92oUJhDLOSdF9bQOd1neStJsrIbcBM3KD+6hn0 osMwoEuMI0FqBWNThqanrSXcvE54n1D6MGCnLIUWkzByf/8wiStJ8soYoDwN43D7 chea5+zwAaxqM/exi0oCsqP3YbO72ecxoOkDwKXaxRr0diZ9reKcdnV1xcjEj9/5 SLoddoQarwBLgYrddgxjm+yVqqlARtEISzpLzdv+cO4siU0AoOnJaSqMpMNPvXgp Ji9ZNsykox5YQ8tZLbAIX71IO0vu1RxOnA7QuTOdOJhEBnC2m1sa+bw3tjFVqtDM OC1nETdpK48F3ujLyOg0ZaiQLcAQrjP3P3p4P+o08yphr5jjCyODjDSiICxg8yyG /QMDXAsazgaqBTCeLOlXzVgpZ+5NAXZn2KaQOphWLxjsH4T9VrOfGUb6B8KdD+7Q 9aoDiUo7xeHRD+NILDMe7r3/XhgdhHGnDqmNPIb7H4d3P7wfMqraw1F+Ofglj6dM y0/RYxaRlQyqiBjhYY7vgz72GOc7OJWbODS7zJtj7KxAqbS2KdYLzgJULxNi95nt 4oA2knBSyD3z/AuxzdkkXmagbZddXaUskzW3TfxiRYd9ryCCVMB9JykVu2VG/SH6 SiNCamBjdQAAnybLShvqXmtgwM1L0LExJK1NtpudusE5tJ5qRW2KsYMdtTyWiUZ7 RLR28ozRUNlhcSGCPJPIBK7q7msB9LYEr2Os1BEBOWb7jM3xkJ59CGAjCZWoiQ6+ +MGqFHXYOHMFYgIQt22NnIwlGNND5rnlnWxVPY8UbmENp5jjaE/UvRoNnAesWkLO 9cI1UgIgg0hRBk58NbKdXACX5arM5TCRqx7bX1NG0hBrhHVYrb3stc5SkWKFTig6 /VMkmm3z/Mykt0yg2HEJEJ7LfSjEvlphwe5sZdiFXKJkVqGJawznYWOJFTTKi4x/ O4XV4PgVo/l1Dcij+oN2wSx3P8sEkMv8HrLu6jzuMk8mkUbNsL4/gKG1So3SJesb j/L6MdEWNa1KArax9XZWu4d+vbCYLlM81HnG5z7RBUu7lSCDsKxYhA88U38Uimib PX8rVVTqvHCd/8u3vxO+8957YRznsRTZgfkfltna8x+2YZNIqx0JbYICjRLqurvC c7duhmuXLmMLaPOKrSglapkPEH6CXZI4+5XXPh/+q3/4m3G8PhlFi9/SFP7+z30l nK1tCf/tN74efnLvHqQQazgJyraC/u2v/0H40T3GBydscnQG92e8rx/97UeQQKuh HonduY522uhy73BA7KZVAjtfw1rIIsr9GY5M9y/81GvhazC5stwTgG7ZcE45gsfI ivI6wWsRgp3grOS95C6dkJPJnYv3TeCZ/OF/3Sre1fj7NMnKT07f/zgn6RQ3fnz8 ZLuP/3u6609nWp8h4o+/4AloMzxzT0Ww6oUlJ+aBnAa+z9+ggeRk2FJE6Xb+35ds k2zkWyffiW/yftzByTZu98mfZ8dKNKp+5NdOKed4GN+L+2DxhyK3zSc9j8LLr38p 9Fy+THtBQg+wPiV4jSXocsB0vF6DAR1CCvB+TADJKmwkdPV5ivGTubuLF0cINh/w dIjHCHpjn8woBn0Fnts6xk3dZ9QUQf3PYLhWYGYGAFWyie01AEiYy+Llx6Ey4zGS newwsp0fxg7PhQtnnkPHcj1kL6yHlyrJYGQSNJOsUUJoaxtgpYg6g0XBWmyGQAwH gWsoKUM1Ahb2adiEYoyexnkV71QNmCWCLKQs87m6jM4GMGrLwW0Y1WoWAWvV3X08 HEFHSz3ZsxjzQ65ndmYrMhYLGiu8+ExCg+pHDbmb8KQRtu1tGaDXOolLq4VhmcxO 9cJHnN8mFIfap30mFeYLYIJeikUYS4kxweOGycnnWMewKGanW5c1Ali+m8N+S2CW OTQOxgrAGbCC9KAYQLuBR6rEwUSXDAyW5aYyYQoMOcqOrHMMF5QxtF3rGAB1eOs4 CmlC0Kt64Vx/JROvmFBfrHnK34ZS8rguw4kyrPt604CTaMgZRAyJCNI1VMjQovxD rVMO26RYwCtqa7Fo1CQd7A9/9MM/D7//x38QjsobIuNSwfdl9iz1YhktDfjI0Ajb DlAWiDaG/K8FgNFNuMkC1LKs+zxbu1SpA/ZazIi24kQsw8VnPE5CqzDPPI+CajoQ waY+oiQTnEpobW9nnFDaZXISg0ipGBam0eFhwtgwGyxe64BkF+c0xncV0FGEDKSU pIth5C+dXd3xGY8N96F9Qu8p8Bqf4llTTobybeqM7bJ08Uwzwe+s8JBWqj0t1YS3 +fuj4Sh7aUc+MAVDb6vR7mYANsZ4BpbhLKxsPazTnSej0bGprU5FltEohZmsOh4D A+MspmieMbpjoxM841wW6ApY3oGY8V3Gea4xxpcZK9WwAweMraePn0at57Vr58MI WetPx6bDJUL4AolhwmGzq9uwQ5wvY3qNBbG1s50xlwMbOsozOaa6QQ3OHA4lAPz2 1V4WRMbc1CQdiCpiBYLIwJEc+PJLNwG4aEMHmCsARq9lB6OOGxxukiymtOA+wNpS SHWEti2RpbShPFXNeMGBY4HUebNzlm0gHw5Oh4aONvYJKB4eoUPWeLgGqO9tbYil pqxVm0KPqq55gTBhT08nEaBSnGeeM9fWjn64GMA6x0LdTOmxNu6vWtQdAFeX1SMA CE/R+xbCIr56+SyAeZvw7hiArRAJDA7fEjUbYTxbe87iwDGGBp7A0FJloaYJoIKu nR7mxYDKBpybbeipBZLk8lJ0rGriNfasEbvUwXdXKeX04M4HAECY9zPnIHEP0OiN hjaS7irqWojWLGAbSDDE0VuZo9X0+CB5Ahfo4EdTjslHJHwNhxefuxzqCnZCagtd dc9n0BpXh1XYzWbYpVaSf3SiLSGFWcB55x//UdqyA5hdXp4P9T3kHbR2wuwVo9+b xHmEMKij0DuOkJq/Osr6ActiNGMTh9lSTkSY+cEGYR9l1K1daieqjbWD0AeLaDtf 61H7DBbmCbVTRqgWEOLYUQNvdKKc8Wl0juBsZCwNb+8RgnddsERXbPmtc8yaA5aL pczs8lZFNCOrEA0o93QEJyoTWVAvncBM+svDfjvvDfe2MfZ1JsYp/7dx1BB2pgZo OkACIDZyCW33DvO8hmMeH8A6Ata3GY8macpWzhEh3CdhyYx28qo4L+wxGvAsIkNl OGVWiFH/P8v6lAIYl/L9CZxoZWUqUcshP2pJipxamOOG05mR7depFa5E54j7kM39 8bqPAXbmZixtUPqJ/ayzNu6iUS2nPvFBfGDcd1g9E7xqkAZsEt0wY2gFrfYatt2m OYLoffCBpIXMt6BtjETABSKe2gltYB3z/ZDozjHAvgwyw/JomTSdsca55IphpBXL MmLXjyBgdjMSRyHT58B5qC+XYIid/Fj/8klQ2uM8x3CUC01g45ktwFhbv9fSjGXY 9SzyLjbW6AjIGmN01qjdNscxKSsCWM6rCJuUwiZ964c/dAkIv3D7eWwHFVqYe9Pg ikwcHisOWedaOZuJjFXMBWWHmdjy2MiAsZjFefbiXP/qSy+Ef/robvhHn/tieO78 xdBOLsAG61ZTXUNoZu38NebX//wvfzf8D//X/8k9R/UMefCDvr7wzfv3wyL3MQ97 +9KFizGZUBJJXXwdyWOVOAcrCzRRyULfzLhWXuJ93Ye0iE2MWFvzdFCwx5+9epm6 wofh375/J8wxpqrBRlGvyvYJmcgkjKDq9BevxXLxP/xXUOe23A/nWALi2Da+Rkgn LnQXfswPt8FvRljokPGTeBz3GTGen/q323gO7uj02/Ej9MKf9iMC/Ns/7iR+ObmY 5GOBq38lB4rXwSvejSfgycREKL/n9/nnxX5SGuD3vahMPRz+lp5nnsZjJReR7D85 peQiTuUJf/s0PZ6H0mNIc3dkPV+7/SotWm+GYhYUAYogoBBG7YhBMTk+FoYfvRMO 14bJWKdkzE5luHrucug9fw6tj+3h6MmN/m6biaGG1Qm2gk5llUlrmRM1JNuEPKXU RwiJ3B0hQWaWUjdLwyG3BE1jGr1LFjqTbdqnHpeEvlWSRI5qY9/hKzcuw3LQXxtg VsDknJnBc+faTQQpxoiYwOP9tm6h2iO92R1KOTHNuLfUjGXRt0JAJhNPOYKho1gK hgu0aoJF7Q2NpGHPLKSN20iXJIAkBq0OttBuLxYd32Xxmwfo5WJMHdg7XMsKE8QS QlOECC30bajkiO304tdt10oIND+fslqwnWsYVA2WiRBcDPcIz51zOuYhGrrLA6Ck SCSTgdvjHGzJ6aOuxvOT7bL2pZ1TFjG8gmysRaw/K0AcprZtFcyxISlbMVruI4vz q4b5KgB47rM/s6j7YVqqALcmA2xgIAuZfEXct+NKjDgT2JIxsW8091FUaqcr4ant CJVSqJHmClmkULCxf4tRW0rMElEmd+2gWavg+qoxPnbIGhwYCn/0g++Gf/XNfx16 LjxP8hjtNydJtoAFtNanIFwpxwhA5s/++o3w5ltvUiWCYuT8q4HVuArz//LtF8MF QkE5sBAsjwxaWBHOhYcYHRA1sWpn/a/ld6w/eUCnm/1dQl1ojlvrO5gsISbdaCQr MczDsKImwWTCtM1NjWA4WJSYCyOUmMHvCm0YSovP1wKIujvb2H6UcZURrnRejeA3 m7JiZ9s7eXY5gMB5QGQ5r5viPGiEdaltImseZuPJ8HT44q0zUVc4QnmayhSJZoyp DZ6/oe4mQJ7NFrZxCC9RrN9s1lnCiLWcow6jdT2rYeNLWKgXSdJRxtLKuU3P0tkH I/Hyc4T6GVuzMCnNaNHy0WONT8CmEe5+8eYV2HecMha982hMmwBxdgSbhOW02sIO TtLTpyMsFkQiaorZJ2wrTlxzZw+AIs28GaO2MQwJjlAfdWrXmAPXLqDLhMkfHZsI 7WhY7V6zQBefAsbe7e422M9NKo0gqwAsqkm7A4C3KcGL18+x/9XwYd8oXbSoUEHo cYGFWpawpZlEJxY9mVo75nSjCZa1tmVqCSG/bBZPn9cgTk0eLKlOlVn+FhCv5z5N UYbKzlqNVDlIGoFYRojMdFj+A+yOJX1qa6twStDjjlNjlUjAxQtnAWOl4SM0cuWE oc/29sDQ0OEHFiYTUFcPm6ZOfglmK6uEkkFcy/LUYNgD/HZ30WUPuzg/0wdw3Qv1 XWeYKDQGmByNsowGIg8/efOt8DbtaW9eu4ousRhGf4IFHxYdYKpjdPfDD9HPNeC8 wMguzsZyPEUw3WZ3by9Owkw1hUp0gXXHD6hdij424xbPhnrOjK2W5kYcHNrPwqpm cG/znPOwxNZHLiO6INOZzf20y59Z3pgQkkjpmgcoq0fiUY6zn0k0pTCXUlJ5JBDB QBtJqWEebqFLtyuV0hZb7G6CKquxQzo3eZxPCjnCFuuD4eJZ5rHOsGx5OfbL3ASd 1nXGxxbMnCxfLt5OBU7eCk6dkplSHOEmklN9dhhRqkjUokmfC8NEYnJx1mWZM7LW yeSnWgKg1nJ5LvQV7N9Sd1mw9UbNtliD6lvasHG7sPGToZL5vUwERT11JSB7h2e8 gkZXGYQF/W0wUoWjsop9K+beqfWVfctgfTg6JjkMsGl3Q8P2hqSt3d0ASx9zLGAa JWW0MSYN7cOOWt85j0o4JYChEtCvlTzUlacgeJwfRnj8bWTOesp73ONdbJNtYZXH mSiVqQ6UZDkTVI+wZaKUJ0hlMpizBdxzIwmZnO8akbAczk/OWgdA7eUYkRNBbxWA cx7GPo8xKhAXWK8QSTNMfwAbvkvErBAbVsEznSOqZHMZE2UPiOzZDa4K59DOeDob zkUT+oo5N1nbURydCqKDtlNd4/ytiiPznQcJsgtZlHFMZRruh+ysa4HjzOQz1zjX 1Qrs9TKa5N/6/a/zvezwc4C+InT3hUROjJMZHRX0iRUK2W8arLDOeug4MAHZZ5fB XG8mivH69eto8++Ef/H97xHtLURmdDUUt3cw56aoyDLJuCwM/+nf/cXwJx+8F/6T f/7PQjvj9KiqJrxw6Vz4aHYg/JvvfY+5kBOeO9MTWs/0hloY10IibD5TiTRlEFa/ WcXeugZaOSKPMWqZvkXvL8/5PDajuDIFobUXfu/HPwrbzJciHCovPOIvrtkX3Ir4 TzQW32GtjViOo/laEBc3TV75RvKPD5PZmmDCZJ9+5k/85snv0/eS992XdsD9JPv1 /eTnU0GrJ5Mc6HSz5IRlUCPieLaj5KBu/+zHq+Pb7iFhXL2YZLt4mf7J68jEilZP Tjw5Zvwo3gDf/hi0ur2fJWcl+I6HSXb1bDs/F7D62zBTFYP8Obyh5g6YJ7wJC/rb E3oHRmO072H46IP3CTdSCLv7LAW5W0NdXkk4T8vIMorir8Oc6tHJOJmNKKCDrMGg MIi5OrV442gm1zBEsitD6q7Q+LUXrqA1AzwYmihgEUDpvLbfHjJT7YATws/01r5M 958aFpV5QE4RgnHbRG6sou8k3F0HqKziM8Mx1rkzi3+D856E/bT4uCEIu6U8AVRg ywDRGnjAlx4BE+uAcBHQD4NAnVnKQNVh7PrHpqNGLI9F7yytI+1qs8FxVjBkELUs omXokjB4HI9bizeqxiyH0O4Sr5nQ1D407GEIZoPzamThNMyzwesFWN4SQjoVbF/E IKtFH4u8P2wD8mRyK1mUZFnX8JxRGMRz9NkJGtLc1yiy59y9tkbqWK4CODklAFzC ltiIYIvzUtOYxSLGIQnr0A8coFNOzVv4yciaurDJDhdgVI/QXu3xOz+f0mUsxNk4 Agd4mYbsLQR/hMHCOrKQcLUAYRtLRJkAi486VLNHHWCy6ho2mxJ01VLaiGsen5gI P3n4IAGsXVfD33v1c1FWMMOzPCD8VgUQM9FKZ21wdDT8+YfvhAFqaX72wqXQ3dIW 28/+2Z330aMuhX+fRef81UuEqEzs45np+XNvrMsnMMvPpAUuN22XzjpHR+i5WKg2 FpaocMECiZGdxbhZuLqsghaqgGt7nDQ0UIQaNskdVVTDVmK4jQbUtgCiNNRkmHZ1 EAIGVNqSs562w2Zh2xWmF51mMecuS1MFGLFA/RxMqvUYb1zsBHgj9uc5fvZGTwxZ D4xORzlKM0DFRUidZA9dqSwGPju7GNoFnIy5geFRqkjkAsbKY6QDzA172BDH1Mjg YmgG4PEUSKgaCdd6Sf5iMTfCUYVzUg0wWyAxTLrs+ZuXMPZUGAB4qqnuJbFkneuQ iVG2YCh1yBAg86EG7bqth0t4xMoJZFQ+eAAbyeLQ3lILa7dCvWLriXYwbnLC44FR QGpu6KGCgbVpvTed6BOt2jDGolvDHKlkwZJRzWdhvkL4vhp50d17/THk1wADLxi3 gUgv9kZt3537jyNTd5kWqXTnDD9EQpBJmLEKneggkoEFMrrzAEd2MFteoFXkmpUb 2gGkSCdgkmUsC5gnlvlyDFbVkYzHnBkHXFfBDtcSKp6mFJnVMzoB1FWwwutkppsc cpF72ggDZucwyywdFZEZzsLPAOI+ITkpRzYBUBkeHAJslDH4qNawtAA7OgJT5eIP G7UyH0FVOtOqAyNoGlfCV75wi+5HlTgbFOTBjsrAqhFenaW1L8dLURrrEOApO2dW tF3+jrcp7A8Dnl1Csh0s9xHgMpNnPI5WuAowXEMHPVtc7jJv90lQZRrHf2lAgU6Y 7YOLuU/q5JcBiWsLM0gXKKVFGFSGVPmEzGkuAGQXm2Y9cWuxlnEMucQM5lCpenvG 7go2tgQnwZDuASxgE7VO0xuLkQW00YHRuQxAUTm202MWcEzZPVm3LK4pgyibPeZl 0vYBJh7LaFTsIOhCzhopMz7Snx0eDsxS6YEoDLarIHMfhtdmJkSzuLdgmxg1UGuY C2g1knWAXdd+5h3UhVHAxebSDImgZMwjCWtFGjNMw4k1nMwU17sGU2aSFqaVMVIM 28nYoATVBuF2wZRtewUoxYz33Z0MZBSML441h3StiHOx/qzgysjQNuuXkqptit3b 5amYcV4JCJ6eQ0aHFKyJ8bmIRGeQxUwpmJEXo0HqYY9g8813UIqUzfHKeI4m/mp3 rB3sc9jjGLFeOHIJNZi2gt4FGAnY7dzUQrSgkftkWH18Yo7yh9QUxm7bAMJW4Xag Ksc+ORfW6RR1yP2qIqqWBVA94jyMQui8rEnuAMSL2T8GmHFMZynWuWPWimIAnzrn DZw2Ky9kZSLnY06pEVd3a4vbA+QgsdkAQF17c0ikUxKNVN0Y7XT5UkZWCyimFl/4 n/7F74ac/+A3wldeuBHOMEY3iWxZYzxK3hgLdntcnaE29dZabIxi9FBcsk9UspB7 ZdLsf/yrfz/82u/8LjZ3LfzX2P/n2jqiE/qH3/2TkIWd//K1a+EffelnQmdTS3iK /OkSTGoLIHOYZi5f/+53kJUxL7j+G91djKNsnApsOc+8ku9K8KzOU7qN8VoIkWF0 XIlMbGPP87d7nJimmvH108/fYD7vhn/z7vshq8JxJchi+eFWCNa1z8I1cYakYVJy lNcRbUSw5ov4c/KLv414J1hNByAubmAEk5MTrMY+ue/cbB9X3N73kx/v9slffvf0 h48/FbR6cacncLqtV8DzS4yAA959u5kXFTfmw/h/P/CkvDhPmP/wefyv2/NFvxuv 4eS1x4ibnWwbP/dNfj6+iASwJufl3pKf+BX+TPbrvmU4aWXH4Hjxxc+FM5evUIOU 8k9sWMhCbzhn+PHdcPdHf8TVp8KV2z9N2KwXQIkAHyCTwmPXI89gH4apVmHd8rnz ZrwvsyA4QeznPA07eR/WYQFGRFYgY2suXMpZCFV5aDgpar9T1MPuL4ZVQGku3n8z 7FMDD8g6rdVoo9Y312EgZilM3hzDBRWEHqZI5LJs1P5eAQW6KWcCCCivhP2EZZUl ltUdnCGjnAnc0drAIMrEe9+JmrsCjE02IEytJJVDI7izFl57QyWLMveFwV2GoZY5 cLt9QF0OFs9M4xoWljkWyiJYWie5htoM6hTG1rDQLsbF0lfG6xysq1uEXAClFUwO yx2p7YqJFHiGamr3QdPWyzvmfhq6FfBucrwUi4hyAcMVatRymDRFOBHZgLQ6juX5 HKCVysfLX8FDreVZaNjWtlmEAKy2ulObubpDx6gNS/WQtIMhtNd5Fsc1m7L4EC1X LJQNw23iBoNWzawdx+yyklNCAhXXd8T4cLFxnCii580IHq0CkclY8d6abWxSk1mX rTUNcQK/8+B++OY7b4S9wjI6SJ0Pl1rwjAmpG1JqwtCbya82dp9jLrrAMiFTAJ+b LW3hC597PWxznGMSVH7rX/0OCTO9cVGrISy5m8fYUI+gN46RCdk0ZOC+uBiooXbS CKYde0sY3aGxSfSD0wDWFOOdRD7ApfrsXHR8m7ubsfD4NvfapK+WZpOPaPhAGSoL 2i8BXpYH59FJ9sBiFpJoNAYA7IyhMLvhVMHgn6e4vmBwkEWklRCnDP/i/Dz3AVYM MNrPdns4U+fPUDkAQyjDaDLjGsBrYZYuQjBRLqSyJ2vo6+oBn1uAEqnuWoECz2OW TOa2xhrC6NXhYf8IizDRBcbGhzKZOBddvR04O5u0UR0O3TCgncyVOVhV69k2871F HCaBcxXguoVw/hzgzdDk5Qtk3LMwjMECX+2hZBxM5/D4FGM2J5as8tgDA3OxFW0r 81L2dZPn191ovcwNKiSM0PaShY979wQgbVklEz9GJ2bCfV73cl61ValYScEIwaUL vbBuaFGJTFxB5+vi+LhvPjqN15EByC5bZsrEt8uEwcfG50I/QL6rtZq5W0lFBZI0 CXdePN8TF4fBMUAyTIzsiJ27gEfom6tiROXxY6oVMMcvwirbwOMdarz2djeQiZ1i wadHOXOzsakeVovER9jiTa7nIsyMyTRP+6ikwOJuN7V1Mt8nYeC3jkmSJMoyOj6O /aNaCY52JeBgeqgfG0jCTEcnERf0zMgAblLJ4BzjIj5TWNZm5CHZhRXUnp0I9WTF 93a+SKm6ZWp5Ih/o7Y2d7fYYc8XMh1KcvshYjwyEAdi83QJsctZuaKeZSBE2yRJx pSRrmjBjFQ0bpLjg5TD2D7FblvIDYwKuKBmIg1RZSyKpiyuSGLV+WcwPwdo2dkpN qzWXsQ4kcJEjjm2sACSYIMTAiqztLvejxEoI7H9ofiqCEh1Zs+NjQX32sY7DugeL KHg1/8F5uIEEQo3w0THJrUSD5JlWAEvKFKIuHRtTmyLCxrMz0qFWsiAHmU+axLZN 1lDG3ia6whxscnkB5e+QKlTWosMlSmEicDW2IR8waAvavdm7UXJWXvsy50D0jcU2 l89lDrXRh9wnnVUdQxNX04Aeyx7K3Jo3YCk/mT+QJUAO9hRbt8ycXjki8VRAyz4d 496Tfc4rl9c5vgdrqHxKW2H5PRN5j7XhECY7AGtwIc4r+2ANsOW366SytDyOL1lT yvfUlx+xTtkQoQhQXY3d2saZjU1lOJcGgLDbDPSPhUqemcxsAwlZPEySH+ni1tAY dgDh6rtL+a5AtAJgCNcaI2qylq4RVkXYBohaF/cQO6tDdcx1zq+tsE4BkiEDDgQJ 2Ei3q07hsHG+BzwXgpFxDm1xXco1MnnWBRIXRMQkHVgZsFPKHWRZMcH8h0vih/Jl lVWA8onw29//fqxe8OqZ7lDCd1Zhfo3cuZnk2AHymyxsy4ZyiFKqNPDctfHUdQnF 1anwxc+8GP6A+fbPSMr6J7/3e+GVCyR/AmC/8f67YZb7XMS6+LXnXwz/4Ze+TIUh ErxZV42eZuB8tbd0h6//1Rsxoikr24MDeMR3PXgatjub92qZ65vcT+vB2jwon/tU XkOkh/u8j/22Y10ldukmAPoI5+XhvSfhHrasmWTSiOEkKrl/H+Mw18YEf8Vfrkv8 EUEp5+u1JxgtwWLeLfeTfN/v+XcCfD/+O8GKJ1+M24gb43e458nR3FPyEx/B6YvT 36cndfr69Ldf9+GxtxOQ6d++TE5Qz80wvw8W2HryfvLt00P79XgWXhw/J7/i/o7Y eQzPehwHWnL1/D457eQr0bv14+Rf8tnpTfX723jKKRbN68/doqZmZwy7WrID/ESt tOHwwU++T2LGYjh3/bVw64UXYGmqoPLRTMIQ6K1pNAsAp8WU5sgDvVnceH5uJf5b weCsssDsb9HbfmUsrA6+H/IX7oeO/CmMwFYYW8sL86WvhZye10NO3TlaL14gjHiG BYrSQoREa9Fc7QNG7Nu9j2e3y6DYovxJAQCunMlsH+xFhNEWcD4EqB0wkApYwNsA C838sxpANazCjbMdMbmljoxT670JMgWp9QCOJj5vIMnA0Pse4NvC23ZnqoOJkuG1 FFEVk6EGHZM6L4XueRiU812U2+H7ezyHZUqiKN5Xw7iKYVWLWoVkoIYBvsz9zWOS pzB8lRoU/hViAY4Bm+OwYssMelnttPuB+XBht6at3qX1DispGYOcK8oX1BWnMDzV sLfLaBLz8a5tc2iiQS3HS8GQmGFrGCefL6XIcKVuNTVLMYbIKqyG0C6A5/w3YBHX V0hqgUEShKoZ9aF7v3d4ZlvKObhWw2Uyi9Ysteaj3bHUQzm2ZWFNGrOV7BIL/hwa PT3WKkqEuFhspwGTnEsnYRr1kQ+fPg7vIZSfQkNUC7tXxLNSl2oXH+/9PgavCCBZ y/db0Cq1NduPmo5m/AwSNh0HkC0AQNcJ926xAG3jKbuw6ZhwNnEeGCLN4Bln8wzs kLUEOJ+AoTjiGrdY0O16U03zBVA5WqbZGHqyXuIK7EgVXrlJOutoE2Vyy2EEh9Fc Cogq2dfa4izjhP0CMEdgvqyTmo0jI7s5Moa+sh2GGb3Zhx+NAh5gcmHpp2YWCfdv wKo2M0OpYgBYyiZMxYwHfI5HzaAF4mfn6STHfOnu7ohJf9brrAOwCmKsy2vnIDWo 9g+vhH69feMcDsp2+OE92D/CgrIck4DmPRhen9UHd5/So/4xVQ5IBuQ8HgLCFlnU GmrpisSYHB6bITsY1hCTIOO6zzzORsvXR3WAfthSk60qSWZc5TwsKm8nMplJw8Hn ejoiwLhDOP+AY1u5wOt/iBTC3uJKZt6+1wfII9RXUELi0hShf8p1AYiVtfTBghWw qGYDwPo49sj4TOjppOMYYeMR9KVvUjO3lF7rxYwxaynWwGDdunSecUVxcKI0Nkto JwlzeQngzVi0A1gmY22Y87arj4vpJDrERYDU2d4u7FMhDPYEzHgJ97CV66fsGo6D penURq4zF3R2S+kw1QU701BG5AMGLa+6HiCwRVkwErEAOrUdZ+PYnxjn2vheZV1L jJDsk71uWHubJKUZogvFAKnSVH10nA9hjq6fb6NmbkfIomxWzvE+5b8uxi5Ta5zD pbPtVE24HKoZV9MwfGnGqWNja2aMLk0bYT6rPrw3xrPhGtSCrmLvIAhDZ7fZ1bSm 5bntYPd0LrZYbB1DeTDFNfVtUR5QSQWDQ9jfZexSBmO1nLCnGm/ntmX2VgHktrZe h1mdAUQLIY6ws3uMC8EbU4kxLsBTgiWDWgIAoy00rH0JY7OcaMMK+7B04AYAdYck LUOqVuEowAZZ+k+Qpz1zX7KzRmWsWrCMIyFocBw24mjYEQ/cFNv81pViiyBB7NQ1 63rCHFsD/ClF0mbat16nbpMchKJKKmAU7oWCHRpKIAmw8oK1ZMs4pqWTLJG1uLoV JgHiBdh5y21hsuIaU4ftt5qMoXVZNh3XFACpEU13Nfa9kvFcxThIIZOxtJe1apW2 VAHM87AbmC7cJEGs0oh0bDqzw9hoxBmrAATnsGivAqCKCNGncDIkIdRs7gMUrV9q dyq7jLVR8ivW9OZvAabg0DC8wKaU78lgF3MOMrJjOJzmLFRDMJ0h+tHMWqXzXsPa JTttqSb1mOWcYyVSkZUlGr9w36ogQnJPnoPMcwPfSxOZO+R5V4IBSpnvVnlQSzvP mmq0LQeHLpdnKXlhPey62hpkOPUcqwZHU7IFywvIFVnoqCSmOAFWab4vO5gJe98N O7yL7f7n3/mzcIe8ijQ2niUbcLyt5Y6lp0oor6gDvkwS5wKRMYGiuMZcEqvDl3Ls L3/2M+G///XfCC2c+z/+v/8w/NZbfxau3b4VfuWVV8Jf3n0Qvn3nDqUpC8ONzs6Q BRHx7kePwhsPHoQpAGpjM5pw1rtFkh8leLy/acbHHvbKRNgUMgmdXCOS+YDjQll9 rs01f3ObSjSEWu3sNk8Erwxb9Eu/+NPUOW8NE7Dq4qAjqNajyEwi23Rg8C/+T8aU /zH8I87jV/zxnp3KN6Mhju9yDyPQc+vTH9c2oqTuk70k+O30PZlXjyVq5IY6sOMP 3+ftT2Va/cCz8dfpj8f0JGWuBN/8nx9eu8+TV3GbeDA/S9hWt4nn61ts50kmu+fv Zx/4Dv/iDtg/N4sVRGIveT/u321OftjOy0ku+PRNv57Q32kmWi+a0Z5zLApS+TB4 em8bi2hOF2EwS3n4Z0gIaOrgIdKRislmeNp6foegKCeYIEG6PZvzfUgofg32wEUw lzIWCyOPQvkRSSCFo6G4njIglXWhtKkzjOwymcj2fuXGtVindJmQSzlhCTs1HTJQ rOOW3tNM4sWx+OWxcK7D5qlFXeX3Flqr7QJ1rEl403st8ExhaLIwzksYtpLC7RgW YoQCTOnmAiCZxfiVsp0dXzQW3ilMdMwCnWdAlqeyAOObsd4rOQrRSNEvIzLL1nec gy2Ff40gwX7eh5ybhmefwbKD0XWQWNS5AE80i2MsA9ZkCDIYCN4jy0nJYm5QS3EN 0OU5LQKsDBXZZakIEFfJYrCNoS9nUSWgBsjkHJn4aUKFeoR7eKWOX7sgGWaWtWCT yOZl58LUUI+uEsCqrkrnpoCsz23Y2yIMj6DabN1rPbS6HFwO90boNAPj1MMELiXE nIHSw7B2FgDVRCzHmlPOUM06SRcZ/LZOZB6T3LFtl5A1yoYIROc3VzFg+5wPTABa x9dgGatwckYG+mkbSg/w6VEWdhgavnfMwj40PkkoZxxNIQsWjIWhxEZYWZMbDJvv oVs7AGB5T4+5n9ZQXYVxUJZgOZY041Ab4TlYkiYuegBTC5D/v4y9Z4zl6XXm91bO OedbubqrQ3WemR5O5ojkipRsUZJFeQXB8IeFA2DAn/zJgA0Y8AcvdmEIWhtrW+uV V9CurUBJK82uKJIznNjTM52qu3LOOVfdiv793lvdQ5oU4DvT3VX3/u8/vu95n/Oc 55yj9TQx6Yxz66MzlUXp+6kZWg3LVQuT+clnj8ier4+L7hjgU1ZcBmZ7jVAujLS6 U3t5O1YSVA54PAhQ2TsNV29dJHHOahOUNANgrlL2aJjSTvU4C01k/T+ive4Mx33n 5SswE3vhPglWvQBWWfRnIxM8axgAANEihs8pXMliPbOwAKiaCzf6ejHaFEJnjPYg P1CbO0yYfA5AkGhsRE9Nkgls3CvX6FYFM3T/0TZShE6qJhTDHM7j0AGUG5ti5GF4 aDS8fvsCILwQpnmaygzHoedCMyCNDm8sGqUscNmw3R/cG4j1VAXLdh0aY9sWgK5J Rp8DfI94yJbhsezPGA0ErF+r1np6eoYbn4O+M8F8PaLWMRUZOluQfBSFSe5nHuxr V087kYP9MPxsBGewjMTEkvBjjlcGQKuD6V6CUXkMe5SBA7cP2Pb4C0QxrHawAuM8 MjTGs86Cke3GCpzFDmLKc1qQJxm2c6w1NiVYeIwAAMgbKVkD8F5FE7wDgLt2pRN2 uorkyQVY4f3w0hWkD7CKw8gNCmGRsrm/o7CiifoyJAzdzEecCgC04/Nyby9O1DE1 YIep4IAU4vIV7t0JkacVnKmG0JToiA0FZkYHYyZ+TUsHDOw0iZ/p4VLfNYDcQfjs 00+Zc2nhLouqrNgB4Vrr2eYxbwcHH2i2YycwNeJj2JKL2OEmANMO42FvZSlUNrUA PAsInz9FftAI6NJOACLIWi8oqSLxh4UUECUASadm6MYaYIW5YhWIctitEuZ1XUMT Nh1JE06lSS0ym3a4kmE95Lk5jut5ZiZx5TOnystSpYGswmKTAaVDWJ1YFH92CrIB O4yWINphpSXZAM4MnCSBXCN6W5m3NUK/ldhxS93VUQha22G5PIvGlwGM3LfA9ohj H2KjihijjcwdZTPHsLL1LW08mw2eI6x6MdpV2C5BsRCmCGddCVpzSy1zlnqzJsIW VdN9CaKD57QGWBuYXIR0QFfP9U7x8wE3WjC+Argu41qsbGNES2c9DWdHKYTNNtQ/ H0a5APpcbJ8F8a3SIksKh83ReWF3s7ETthLfYx8lkB6VVDVYJnFrkXlvUnAFvzfy TGxlvLZO4X3AXGszDi3GahePYwnpg8c0rG/ymqH9AuxvZh5r3SnsLp9VMKfrWAvU Am9n0+KXZhDdOIvKV4zyHROZigm1RE4kINTIGlFZXbYTGs8Ve1ZBTsAJ80QHrMZo CM/Bcn4HMOqrzA87bslitjbTpIYxuM4YiVEm5lVNJdsBGpWxHEBiLEISOF9c24wa 7kE4ba1QT5XjiAfSwTLWCXZdsn032J97wV9RvgIQ5IMWnHAbnfzBX8G6v/V6uEal oWLs9QHr0TGstJ040wHCShxOsPsryAoqiaxZJtOE3U3ImSLu/SvXrxLhKglX29vD AqD3Vu+VkKDW68eA1v/sX/zvoRoc8w+6e5BQPQv/9P/+P8L9jePw2tXe8Mu3boeX LlwMTURqzSNIl4BhrTzjfh9x7jrAVUSpSnYro7Pu8c94BjWA9BKS/lbBQ0/HR8IW z/jKhe7wq42vhRKIs09xtFdwChqwh0orhaeumpgRwKtDRvzm2BFQCjL9JQXh4oCK W/pe6v0U6vPz1HvPsZv3NrX988/8PbUf4A/zAdia2kXqA/7+xaD1fKOf2ZaDRfTL CaaQtL+zhZ4HD1cYyRHie/4cT9ITcicCWV56MJ6sX4vbx3f9K77hhxHI+l1BRQpf xx3EE09dIFvHC3/x5Rc/+L6F3ispenzl6o1QD8OQDUja29tGczWG5oREj3LqO16h 7SAGPx+mzpCl2bbWgzMJym4i6jbXmYRq3uaWVsIz/p1Zov3fPhqlEozD+PssQMMh veylUH3510NFS2/IIRnlGIPaSliyndI6leWEuwPeOwN3BU/Zgr96pGXFsIMMUpnI IgySxraYsKiZ/5vUGpRhq2FSFWBgdhnQJTCKVgjwfpxSBqoIcEO0Caqf2nx4vml4 oNUwp4aTDPXbqm8bBssyV7atq2AQz7HApbNQL6EvytqgowmM7wpGUjazHIbUwtjb GJD+icVY97MIAZ6AaZVtSrhH6gNPMJKbGI4jNEayiYaGN9WNscAUw0jrCWtMbOHJ DGUxIruT525pMSUVc4CWfc65GSO0xv01+cpEFf+Y5GKZmUZCvAc8h1VCWIaDTYI6 YNv9XcJFGMxiztOQvi34LOVzgsFuqq8ID56ORF1YC1KIw/WSsN/USnUD2Gs81ySL QBK96SJskV1oSggRCaJLiggN8hzUsvqSVTYZRmmI/+6zuKtTneVP9iZeLIO3BFBg iLqlNRGWO7oBYuthmBD9B198zuK0Hg55hu99/nEs2H7rOuXMXMS4nqJMZBN43GcA XxM3NgDKLlZqfutgXk1kcFF0kJvIYF1Waw8adndCn8qvZpqoAABAAElEQVROO453 NikbNBxqCH9Xw6BOTE1iNEspzVUf+4lbHSK3uDwmJh1zn0oAQxucVxpGpwLALQuy DshobW2NjI81EdtICpsDaOUz3l+lQL5tHb98OBgZ7jaSsAYAnpZseuOlHgA/+lRq qfb1kFmO9u4pYfU9xloDrOcMem6Z56sYPie4yVqtJP7IXDx8OsS4pG4wEYWREVhl FpergL8kbNonXz6jVFZdrPU4NzJMDUEAHABzeHKOLO6tWGVhhzm0xGL59VevIhlo DR9+3h8B5st3+qKmbRjW1goA7QDpRwNTYWh6GXDbG5m39z97ADOZiLrHL6iccQBg uUuiVzpGeo66keoFi2DzHz4eRIJzCCgkAYnQ6H0Y3Xqck57uFtjeBVjzk3ChB4aT uTg0ORXaE7XUUW0If/3BA+7rfvjm167jAGeEAWrPFpfDYMFmDQCILYr/9mt0u+H5 /+lfvx/mAH6vv3ING1XCvRzn3gPSaVRQXlwQvnjQDwgjQY0Frh9QnIbjZnch2WAT c6oBf/Znn5igBNXiCkCoAVt1SEIp1RdY8ATNY5T7MWmyBYfA8PX0zEAYAbS7UBo6 PtheC2/e6mSOlvM8Ask2I9giHFvqqBbB6E4P0ZucuVJd10o2NRUTktTvvXQFR6Qi PLp3j85jT0MLi2fpBIXVcb/PsJf76Cw/hYV2UX6bZ2TSqiV/qtAZX25CuwxQm3u0 iI1EYlMA2JwbCt3lG4QoaeWK/OE25dVaGirDfULLT4cWsXspjbXaQ8OjauZ3twkV 4xRZeu8QJq20oBSWCukTINMydrn8a/khmdB0aphqE42WmeBjNECAWQ6TlMnY3GJO Cma3lndIeFkJHV2QAoaLqRGcwWfed0GGkZ56xsYBjtNhvjVSAamQD02VEAWrlKuD ODAaUAYYK6bk2soaSUXeD+yS1WuyYBKVLJ2wsFsbev9kh0SgxVBD9ZcEdnkdxr+Y 8b7H+N7FfuZhP3ZgzUwArkXOvrJLfVmgVy4O/RSMamNdO0CDkPbSQtjOqoDAANxz nupsZ4m2eF1H3MMkYXWlRLLxPBrGFuwmttmmCuXohxdhebexQVATXAMgDjZOcmaG yIxRFvNCrOPpeiyrLNuYyTw+5c8xtpEHJ25DggPbXGAZLFY6iAebeNQQ8RFUrHP9 O6wXtuitxHYVsA5UWwqRdcMydTp0GTgHJdwjI+YVXIf6WhO9lFuYBNtCCbh05p1J 08Wwx1XM8TIc7sNdZA98N4+xMD5pjVVkFszBZcD0EtfV0JbAjiLvIiphTsox65zr ook9aRxMHKGkIUPgj13fY53JAKBpZzPIgygpRRJAuTErNBh5MyonRLElt3kQ/hqT s/wMUNiLnvzf//h9EsPyQsUvvRXaYYJNhDtlLBZnl/JdkpAZo2s822xIIKuMHCEb XMZJtsV3dVMd0ceSWHe6AbtuwvMZSX+rEGS7OK6+/ps/+peh6De+F1qIyPwX/9Hv 8hxyQweRu3bC/6Xc9xMY0R2eezpjJgOHROf3iPuYxX4LifAcZu6AgyAXYNtjQxzw z/wuZNz2OgRLeegB0FvJZ4tE24tdXeF/+oe/Hf6X/+fPwiDrh50sXRdTq5GukquS WM1/eYFHUpCMN85fz8FpvHFum4KAfJpyAnw/9Z3UZ6ntJTqf78Mv8CdiRw4QX/7+ 94FWt39+Queb+0/coWGICLFTO/c9T8iv+CX/+5lX3Jd/eZnnrzghfIv3nsPo1Cbx uF6Nh/BURfWpPfp9fzo/Aj+mri/1qd0wJGg3ADm3WNQvXSM7H+rdNoazo/2I61dD c+JC2MooIYxBfchKOj3hUZqcVMyE28Sj3EciYCheKnsZ7/fBMN11hgZDO8Y165RW p/0UcK9IC/PJgvBo7x0qDbwRbl+7FsviGEJK5KImFZnzVGXmamBiTvGmBV5m1FdV 2toUVpXM6NzsU9gQFg4mkwaiARBwzCJehddXhAE+xFBl8rOapSQhJDNONxyEsDTV gMp8Bu0UOsYsDKIdPtR8JQ8pdsxKZPHpLRjWbIBXFlZuGpaoGY3cOhPYDMozwnG6 BIaI1f3I+Oh4HAG409ivYf1jJg5yHDzughjOX+I7ivDV92azIFjnNA1vWgbRygDH J4bX6TFNkb1yrvUS9VznKKBdhAdrYtsyoYxYnoZ9MMNiWArYFpkKM7BLuFasNuVd VikpAyOAccSEEBZFrgColR045k8ZBrC8DC0OOsAyGMx5gKPltd55pSOcApomZA9J iGqErapraqM+nbpXNE8Aw22A+JGTGeC2SbhcHZUhwV288U2MCWt4lE44Bs64z4bW u+pJYMrEG6dyQC6hKxNMiqkKUZxIhLbW9lCIJugLvN+t2enQV9sYEu3dLNb11B+k ExUMqjqqEurtxbA1i6pJVpZd86VxNxzZ2pwAXJIYhQZRA5oLo5zOuDSsY01hc3xX t3Cg+DyL57F1cBLmnwwH9YJthO91BDfRBr58B6CMYzPDvakG3OhICI6rmAcaZ2sb VmPkDC9aKPzu7RtcZw46zZnQDDBxbC3hpFXDGnYCAFdw1AQj1g8ugcEcHB1j0acj EKzuEg7gDgtQMYlnm7A8W4b6AeBlZDOvc0/NBq8l3Cb7YikmYgDhs4HJUF+cTc3C Tha53PDlo2csLhhZwmqCv1K8MZsECFaXea4tDbVR3zc6No5DU0p3qM7whDD8n/3o XvjmXbJ22cdDWp2aCNkGgMNSxxa537p7meusCu998HkEslcu0B6T0LqJKG/cucx8 oRMX2lDZvA7YrUGaADwAjH8dJllt5I8+/gLt3nG4XneBGpJLoR9wXt9Qj706pYsY hc+ZnxaRX+CzsaGR8J1v3A31FcgX7j+NiZLdlAnbiQvlXrwPygls31jLtfdeuM6D z6Wb0XxkQW70XcC5S0PbN4pW8jT0dNbS2pWGI5zPqy9djQ7lCk6MxcmVwWyxMH38 aBAWtYsuX9Xhw88eRqDVATiUaTSJzGLtyimmOcYCGuBmwHcVDuESbHQ1c/GVKze5 j/Ph8dJ0lC1Bs9EFDa3oGiwgz66GeWMjkJ3dCVhmdOEk6Aw8ehSGB/rDxd5uGhs0 IQ9BnsLYLoUBXSAStYrz9ru/8kZ0Mv7ug09wUnfDGzRSKMKujOI0HwHaWxirk5ML YXJkNPwnb8IathCJIUqg7l5NqzrCx5Q/Su4zP7jX2nNrKOdhX2xTu7kBC4aNmZ9F nwwIbOaZ52ErTCQ6wEk2gpBN+SMTSWUDi7FjxeQPzAFMwUhcC8AS+cIWz6YMJ9/E xTycdhOg5rGlJvhkEC3RodnERqzD9q0TKRPYmbluRRZDptnUNlYPmgWruQ3IsiSX GlYrVvia5T5bmSEDsGU2O4M8gpax6VlKI52FBp7NIWxoUWFWuELDhnXWqF1sk23A l5DeeO/tQri0S+LnOiDnZAVmGABUDFDjfmblo2vFxspEyxDm4ZhvAgRrGJN2N5rc XI22Lhc2Mo05YTKschFrsma75rK2CAwti5dnrW/uW44RHtYB5WFGOmU8JYDKmSuW snNB3kNfUYB0IsH1mMsg8NtkPSjAQWuGrVbWZLKqzL86VMswUogRx4P3AJbiBtc/ dbAn6JBjjW9kLUs4z0lso05VLXbDcLf2IQGQmsIJtDKNybxqrQWQOgraPOv3Gt3y 2bk27jIOSiCPrBSwtID2GLuk9vUAZle2/hjQmSipjonMO4zpXO7n1jKJX4DTdZyW XJ5LBtfRBEDOpFKPEZrNY6RwAOAMSB2JJjGIsE3yREClzfT5JyCq/vV7P4jRzt98 81XkPe1hdWoWkoDGEpwPp0tjjzokEXSIm5qmFrms8npkjssZNwfoeuXOHWP73I9P H/WHP/noo/BvB+5ja5pCAw6I3R+vNzWHb7Z3xlC97LgVdQ4g5U65f+qxT8lxMWnc Cg0ZnKPSNu97JmSEiVfLyxAxHPuI9Tsbprq7sxv7cRLXpFUAdA7OdGM7+Q3cm2kc rOkf/ZDEasaeiAE7xa65Fik0/vVe+APvf/USeH7123NGNYIi3vY++BI3+l9EdXEn qfef/x2TvXg/RZQ+fzf1/V/ItD5Huz917POj+bgixGEvPDR+5vD8SV0CP5yflO89 f59/X5yoW/CdeKEOvBdfYPPzfZxf8U99Ox4loljfTF1m3Ec8T96Ll8+/kbpni45O NKQXeyKb9/TeZ2FpZJCuODfxzFlo5unQAzBqL00VXEf4E8NJO4Te04qoa8pEnV6g qPrkXDiAhbiYPoi3NxVOi1oY2PVh6ASv6Nrd8E5dExnllZTWIMuRcz/eZHoygc2W TWcwGTpQP6MHa4cOs1sLMQ7q5yxarvebJIFnG4/HgshJjEsehvGIAaG3qC7SSgGL 6JYUghtCU+Bu69RTvHlLXQmMawmlWHNuDdaA5R/2GK0O12R40wx0tUjWv8xjgdbA pgE6zHgtYpAfo4H17lXxWRZs8AGhALVaLtxOTxcMa3vqfcsa5HB9dnQxNLSK0coG 3JkZmwX4U24ANMezxeAGGGCGRxUeZwXaPfumdxDS9Lg7sMkOnQ2cAr3ydKLepYjG y5EU7ALuqzDWlSwolr6x+5QhcPvPrwDCy2CVKmEXNph0GzgZfS2EY7l/3YQnKwB/ GZPzIR1pRxJmcQ9wam1Nyzgd8q/1BItgSCwDA1qPABTymQWNdneMhylYy11AnU0j LNUi41jMfX+noyfkdmai32wnZEeJGr5zqjMAcEkH8MloKid5QE3N795+NXz7zbco kt9MeaMRQNI6hn4/PneZHRnoXUDlBtUE4gtjItCyCLpldDIEcNxj9aD5eM92OEsC Zk+zCc+wXX4+Re7RMD3FCK9jfOxiMkdZML4CK9iAQWHRA1h2JBIw1iQCkBlbX1kR 9V02X6hDz2ry24P793FiSHrgOczNTFKyqy4mSj3qH4qM79VLPWiTt8IjwFF3F0CU 731ObVZ1Tz0drTB387ASSQxzE0006NKFJrObcFwp4HMatkYZRzMJYpOza4yXfArh d4XPn8LKEpLr6krQqrOMkPVMzLB/+TqaSsbr8vgeIegrAODTeKxWOtDU11RQA3Yq hlF7OhNR9/fRJw/CbULijRjvLx6NULVjlf33UAGBrPrpuRgStVzaU0LgOzBe36J7 l4yY7VevIamoYH72o4WdApC/24GcBAZqamYx3KKTWg2LxxByhy3u3Tuv3opM+JeP pwCHNVHuM8T3ZmGpXrpxGUCzHT7+9EFoR47RCqCdYXGdQr/Z2tmGk3pACJeSNei0 u2B9RpFD/Pj9e+Ebr19HP18R7vWPs6AmCe13wPqnU4FgIAzN01CA39OQywzw3QsX OmAGybDn522cjwswzOksUE+fDseyO63NjfSOX4tZ3e++SvtH7MODR6NEDtD1ES61 reUQMgVWTLKUE+wXmQDzoJhauyb6bBIGtd3pjeuXQyUJaz/8yedULUC2UkYHOTBK EgamGFCVXVxD+a3FsDI5GPbTcihQToIY9qEUxjm7AgcIR3dxdjJc6qjn2EVxzHz8 RX9oaO+IbPDSDA437llbTxcVKyjlND0VpjEBecyx6qytsMbYFnTKclWhMU0QPXJc Gh2Q+damG7aWqTo5JFy9nxEamdsVVnNgzmPyAH9WByG6BHBJYr/rCekvERGqxQgV Uf5qD9txhqOwzJheXseuYAOsWWlSkRprmdszbEIzwH9mqJKxv8rx6GEPYzzNd85I 7mtgOx3nAkDePrbPEkHKEmJZQc5vkfHkfLWr4B7nnGisI/lmAQdsI9Rgx/KyyWXg GtcY3wXcf5PPwEHRRrv0KYmwfrX6zo6uFkDeLuuALaRpsckzbYDNLQQQHmHHWNhC HZE4O2ktA3AxWbG1awJmO5tE430JC8ZyPtd5HFnXI8wNORv0o97FiZSFs8awAPKU a9rHWCixsfqCIWt1t8oMMpEXWM4rD3u/BRmivEZXu5bIShYNcFZh1j1vq8nIVC4C FDdZR3QmSxi7OzyPFUiRepi6PMbOBo61shHBjutePsCqgPu+k3MMoQI7nUOyNFIU 77P1ddV9KqGqAUSqb7Uu7DL/msysfEwZhtFLQb8d7Gyr3Yijm0EWPIowJD9EK7E5 uzxHGfdj9sWj4rgAfdapZRojmLxWVV3J+EFOx3Fz2CaDNTJJxRbzGmSdjftmsP5l cv/2WH9N8uOWx3nAh6yZjDMAYDM7/9/+7PvRfufepdYzYzSNh7PHdTteTF5TvnKA zUnjOA1IZRoraVYDaYaRghyBmWfHSTDAFhGasekBknUvhl955dVwk/WnjDU7n/vl +LXDoknl1vm2dGQaY9nWthnIOGwfS4wikh/HHHN2hIgOJI25HknGfQkysQaY6n2e 6SYRPpPljEi3VFTE/B017LLrv/Gtd7ElteEf/+EfBiwJOQHlTDclfUzQ+OJkHbyu Y+ev59jxBTrl/a+Aa2ojtxazpf73+/7POy92wxsvXqmtn//qb78QtMa9uMefesXd /NTJvfjIDzzx1JHj2yn0/NNU74utI8L+6rfzk+P7Yu54Ffx9/u6LM4ifxCvip3gN /Hu+UQqw8iaDy1abraW16M4uQYmXxzDsGZnkXUgFGmDA0jEeZgnWECLxnC0fQ6CB MPheGJqYi2DklIe1tkRdwckvQ9npDG0xqceXczdkVXXT47qNfRRQr5GFnElvn/Qc Qi7qOZMHsKNoewoBitZ4tcDxDmDGbi+MaYCJcB2jxSSydmIeAMoqB4IVu1QZxskG YK1xLozfmOh0wnfV2QoGcwGW6qeOMc7rm8gN0g/QOFEeBeCSRkiAWRXDrblMOAdh 7LoBqGQeEG5tYFzRMQZPdhWjnYfXWkrYyxJWJjucYgAUcJ/ANGuwZDYKAJwuGCcg IsGz2wmS7TgjA7jBtQp51QRrOE6PkWWweFQ0ouOC9R2fWED32BgBrR69WcE2C8hH 45QGo2ax5C0Amd2SqskstsWnRqoeRmkfpmPfRYrjm2BlzURLO1kGy3NWy6pR3MY4 18Ok7kKjTI8Qlp0dYzsSuPDQa1sSoZRQCJEZFjJr+OFAABhPCc/a4SXJ/XAy5TFu rsEy5sIgmCW+ODcD27gQu4wUaFh4XyC+CFt0zEO02Hwu4LuESZ/DPXRBA+aGi1U1 oZFJ34yWtbQS9nGvhhA6QB0jtQaTq46rCgOxDgu8iPEoxYjncd9cOKwprCNiWMdF Jo5LDJlJPbE8C86MtSkJhkLjYGS4D1eor2fVg4VpGgsYhsch+ujD+wAakuxwAIZh gEt4prkcY5ryKGqdS/Di52HIjnmPJvLhwcN+3s8NnZfJ1GXRUrrQAFDcZux+8HAk huw6EeVPLKyHEdiqS4A82dXpqfnw0iW6UMHgzGA4K2BjTKyQxd5HtpHUuCOpsWRb SSdJM9wDw5Nv37pAghPh7enZmInf2NAQn+PM9GS4fLEVXW55+PDTJ0QRSAzhGqYI 31tS7TJJh6dEFD6lnWhRWWV4/aVrseXtPJKTVrSg3qeHg+OM0QDwqKbiwUJ4QpJS dztAj6djN68awtvWfF1cWKQxAdeClk42XzalgPvSjnF2gTPr+pdfvxW7UX18/xHP uzD04BQtLJIVD/C/eIHC9iy298iytaNO32WK51MNYIF70neJdrQ8m/7h8WimLne1 kqjEosG5CPwP06m5vIhWj9Cn+miZj5W5WZyB9cgI18BqDg2MxOoEV7paYN2WYiSh DP3jNgBgfGQ0nvt/8O6r8NYBtnQ8VgqQdRydnI0O75ULieh4jdEyNocohXpTGZJB pApnlCdS8+tnO4S5e7iWWhbWZY5Tg+6zs7MJwFEUBogoPZydCGmU6XO+ne2th+u3 rlIiLyB/mA9LzKN2nJfSQub65Eg42aYda9mV8GBgNPzl998LrV1EFri28QkAfzl6 TrKatykftLwI40rYtbA+EQYmZoiuTIfDrK4wOUfCIIxoO8+yq7uX+QDAYN7HKjA8 j8i28oztTGfR+ULsTCHPzEhJNnKaepMQWZsm55Ho4NwJNIyglTAmmarUwS0AiBhu pTYoc6yJMbitM4h9zCectLqKzQCI5aO9NFlxbHw8XPvam5E4MHG0AqawkLEyDvNU T3vtdOyElQq08Ybgj9G8LhLStzyhiVLqezGLUT8OpiT6gRSM73fgZKfnb8U1owjg gfWJjLza3Gz2Y7WPPKRhdYzV5VmAcn0DTCplo6j1XVzaEMkEE2qqyey2sswW+01j LO4K4rDph8wxmWQz4yv43Q5c1u/NYI1YJxKSCdN/QARIm1qPU2nTlRWSkzaJbBwp myKUbCvbPfZjxRElbaDYCERN+LQltQ6E40rNdgbaeiLgsITkGQDmbD4ASYtDxlmy PrAqEVGznBdRPO6j4LGAtcnuX9mZzDX2lc56W8pzOoH8sNoCe4nlGt2P1XUOuM9F MAWWJ1vDWTgAMNmKNwcbZpWcUxIBTfQrh7FXE28XK4QHJByXkTuAzIoQexbna5fI E/5MA6zV1hfygKYhjYqw2aXcH50dcxM4CdZxaqtyvj4TwaqloI6x8xmMDUPoJrbF yC5rSKz9jg1nGBIBLIug+J/8n/8q2sLfevv10Mz+t9ZJtoVVtWtZPna9BkxhTXad 0CzGtclgx0TgYh4Ja14a9v7qlUvhv60nusMzaKyujUmzlopLgg8OBP6sF64tIj2r RXjgdJ5BNqSPzO4+sqMpxuTiCjWspyaj3K0h0RZ6LvfyDHLQmJPfwxqbyVhVumRF IRPRtwS2rEc1rMkVeYWhL5EIv/bOW+HPH5D4hUyvHj062UY4aAJXkR6nwJ8IUp+j Tt+Mr9QP8e/4F1uK9fhHKJnaPEWCshTHlxrWFJ70V35mw/OPUhvw998DWuNpvNgo /uBRfMU9PP889a9/v3jb4/g7F+6DTV3S+XbxHzfgB/4RcDIE4kWnmhCkvizTF+lj d8Trq1sj05t6M140n7kPKxbYXQN7FXr7LofmTpJJVhcJEUzR3YcEAwCrXU/MLlVf aTLQHuBsDka1BOZwh0n/aJoewROjdCbB6z1ZDIcLPw7LuWj8Ot8JpfWdkfXoaavH E6R8CDMVmVXMcDVcJLizJV8+zJvZ/QVMjkW8HeupCvQM7y8TvrLMiTX6ZDmZhbCY ObB8ZDSy2JfAoprkkoshPsPg2HO8EPB4ynmabOR1rgGC7XtdAsshMMWEsx0lQZhc pydUAWDfFiKXDagqVhtDzTqSuqwAIPgtBVykMfmzmYjqvdLTCB8DQiKoZiBXkQSW TFJyis81Li7gajkN/ZrlaneWJOftxFWLa9JBEl3TPkZbAX8FQNfknOQqxfgBNN4L jYhZtzLIFgtPw1jkZuKZEqZcg5WzjaHZi3t43jlMfplok9L0mpP0vy7CQDmOLesi C7C2mYTJg30oQbPE8at5f43M+8IdBPf0UF4jrJeTX85YYLHlj5nIZoIWFpD9z+S0 cP5RPg4Lhnud5JBcPrM8T3VHZxSuVyADaD/oikkA6YQFdxYJkQBsbBywjKykBNCO soOQN00E8Fg3FuZCJ9+59a2LdI+6APPAs+W+1QJSbl65Ft6emgjD6D1/9Nk9soC3 wsjCbJhhwUzA0jSjM7SFoAurbKCjW8NtNnIG2+awqBxhMNPJ2s8CpO8SBpqbQ7/Z 0QHYo/kDi5Llyuy6M8v7Viwoouf7GGDhiPFXAjO7jETBBJ7mMoADgHgTdq6lqREZ CSw0c6+1ywShTerbkshG2J7VKNyn7XABrMuF3nYcQWqWLi+H127A/AHYnw5T6ohw bjbPZ3JqDpBMPWBCtBOwnKUs2O1NDdQw3omlmnppLGA47+NPv2Te0CKUc10lpD4H wErgUAhMn/QPs0jihBBm/vLhAMBxNfRduRAlH/1DzF+AZj1lqUze0jnsg4210Pgs YP3apXaaZBTD/M5gUs64/7CxsBrqSu/eoGg25/XgyVPuKe2HyWi3Vu8y13+1OxGZ uhnCuLpeVdUlhPrRLXOv+wDP9ehcvwSUTjI+b6FxXQA8KxG4CGhvgY2zzFYac+Tu HcAzDuj9L/vD3b5OwG19+ALZQQZjva+3KzpbTwTaLAyvXO0ioY3KJeynmUWzhFDe zMwSDQ1IkiK8agh2bHiCigtb4d2vU6yfZzYHmGxtoTUpQGuUEmMTgPS+qz0RjE0A rCwon+BZDnFvpheXYy1dAdYkFRds5GDDA8OH99EojyDBuYgmd4f5NYsethYdndVE 9lhMzwShyEGaGuthk3CKAazFJH7kk9yxwhjLR8PY2kXEgQzvjz/6hCL7VPhoTiC6 XItVL/JLqBe7Dos6ORFmkI30VdDpDxOfgUNvneR9xuLYBNIXFsWLF7pCNufykESP kgKA3tkskigS9Goa0AGXMeYBZIIc5oNdxZInZtfj+GMjj5jfNbBTtiKWnZfxycXm HjGHLfXnn3okPVU453a5M4S/oxPOuDScfrgHaOAz23juUjKoFLBgiH1mkRA2Bn0T 9srIG2JAAOdOJB1qAD9VkBzpOPQCN3XZ5gCUUgZihW0EXZaHEpgZrnUpN1xsWS67 2rW3NTNe0eMCnkop9XWD8DOmHoclH+IgJ+xiU1a5Z4kE4XTWL6Ge8gT3V8s9pmIr 1UGGsNntMeqkRKqW81mYmQZYHfP8a8I+rPo6BMwGTvEha1xrYyWgnSTJgUmccVhO 1r5JbGxdBdEcHHwjfhbXN2lJWZnVJlb4ro67JQCPGQ+SKb6sZ7vNPs9YQ+pIapUx XCaCccI60tpYiw2h3B4Oqi1stf06DHafstGIUb8KWGHehYjgeQBM1RXbpjqD7W22 IFA0WmedW3JCAaKpBjungHIrRxhtUIfOUoatRKrGPgtYezK55xIhGWd0TAQsMrlj iH2DyKRVD2y/ar6ENUyzcYLUrwo215CpuQbbsrYC4G4TnH3GiLDC9U3bawKeTS/m pokCQNkaMbXZAA86XqP7iWOSZyV+8Xei+/GYEgNGa3/vb38UWdt3IBcaaqpCEyDT 5OUCrj+PxiJKTqxAsENUlWWNMWpVC4GosruM2JCkmvmnF3DGPUpir0/AGGfMKRNx eaiRrbUtuA1vMnPQPxOBXMEB0knaZa7OkwCaJGmyDuLBfZXj8BfyryTCCc54HWvn LmvtMuugeEoH3TbU4oZdcMUGNrGI8f9r/+GvUbWmJvyP//qPwszZVmhBl67kwAY4 8cZxf1JR9+dYzZHDffNz1qTUVl/9HdGqH7mNn/pR/M1/fZ0DW/arXY9ANvV2/PQX glYZKA/oTp+/4vnFX+Jh3O35R+dbedXxLf7i++ebpt7j1/h9TiCVxMUm55tHuUHc PrXfqGFg4+dHcT/x4vlu3JlfPD8/vSKQF//YGx3tFkDi1iuvhjz0odMs4hl4L6Xl 1CTD+KUxSMwA3Ma7cCHWcG0AlDII/2zu06d+azzUhKchnxIv62gW0zv+IfVbb5BN TZcZFrEyHn4FSVGMTUAA3h2tRyx5ks4gOgHU2Tc+iTd2IvPG+R2wb7e1f7QlsxYw cIz+2AXFSzCMYr21RZg3WzNuEzrbx8s1W9LwdCmTzTYBGyyQuRhBmUa7Uxne14hW ALanqdmaA7DlJFh6afeJMcrF2FiwX69zE8NsORQTwQTITsoaPDHDyLb/1MIWsCDa rUQmUtDJnGfy490DZjlNmFwCAs5Xnom1agUMFpaO9UyZdPsYtX1mrJDLcNrq3FzU 9bog6qXbphALynnSt5vRpiDeigNxjHGOyyyilhOylImyg0e0BLU8TR3hYVlI66XK /MoW2TnJoWJhfUFeHobfrFQXryYaEyTn0aiR9FRYVQ2jgbCfhesA8GdLuxyYHxcY UDZhE5JdWGAy0T9lcRsMvyXj+DJ0Zx1HvEmMj3qwPRa7PABXg991UcKor05MhPn5 KRi24djhpYHF1sQXdzEGmMpjwtsa8Brao+N3vxl+cP+z8Df9X4QPBx7Flnm7eKy/ dO1uuHjpMhGBkliuSEBpH/kMrteSLE4YkwBMxtJx2eHwizBVZn6Wsuptswiu40mr 69MZs1ViHw6bTSLmAe4tdY2UlKK8DudiJrPsyTaLpx27iMaGHRI31Bxm88w//vxJ uHP1SjTW1mXlAYSvv3KdxLVMIhAT1C+titpPw+8mujQRgltXdwr11l1JeJX9GmLP pSKBNXGPKfpdAftVAEAYAogNji+HO5SzGiSB6Cla3PaW+lh+55laUioTfO1OH/vb DY/6JwBerdrpME4r5GwXdu6PXW+MULzGOZkJ/Jf//l7UgfZe7EKrinO6tEL27UUA PBnsI+Px+XWTxDEJmF3iPt3su8giBXMDCLSAvOF+S2A5ni72tFL1YD08HKLzE8DW 9sszaEH3GDtv3bnEvT0MP0AGUEcSVDuAVSbKa719tTO0Afz+1fd/iEOcTUevxqif 34S5ugTDak3ih1zrPAD+O2/fAphRXWMZ54dFovKYBRut6TZj8wymrBRgsYKG98mT cfbTDKDaj/dNR8VQrFIQkzHfvns9LtyjOCXL2LBX7iB9YH59MDVDw4gGIkilyAnm cNx2SRprhY09o8HFVMwAv3WlPX5uHV6Lv9djI9eWlgBDIbQlKH+EPUsylw6ogWyI 9WsVJO4xL88OcQYZb9M4KAvTE+FCVz3lmGoYT7thDUmDbXmPqENtBZNcJsDLN3D0 GTfpMGAuxlPLJKAwHpcWZ0ms6QDIENJHZnGCAzm8i45wAgnJBRx4gIs26ECdov9h Y3T4N7DhawBAYAV6OwAtTE8lNl3HwvyBNYEXcoxWav06bbRnOUQPcrCDq0Q3jAy0 I13JYd9FOO2Z7NPxZNm4BNKH0+PMWKnCsl0SH2UwY4XIHNZ4jsvoRCs5DogHZ17p Eg4a4yMHKUY6kaVjojonx2j6+V4+MqozGL91knFdC9LPDqITkEXCzeoqpcoAuwVl 2OZM7gsNHjb2eF7Umd3k3CsJERdg46wykYZedQ9ywvJluTLElPbKS6MM4w6StWGj YlmUzCPKw9pghEF5yS5z24oYSqlcJwx/xwiOAIz5Usrgdyz4mQDU/Iol5q+NU3L4 3GiMYd9cztua3OYz2IRECVQ+ttoOfCwoMYpj3WgrotAuIhV14/lonzK4dgw476YB JtFTsjYIfjaYY7Y8l7GMVQJYh9Tfm5yWy9ok4eP67bqmbvUAQHUGCSK5VGbVHNaO XZ6/0gTXEB0QGzGoKZXIcPlT+iZg11ExAmftXfMGbLubx1hQcnWAY2Nt8jaANifJ 7xAzhWbcr8dEvhOArBUYNjmfqx1thOKLIb2o0HGEbFDgyP01DwTsyRWyA1520rJ+ dax25GLPNUuq1QBSc4j6/uM/+L/C/K98O/yjd99kjWcMLi/7pbgPk3Il59ZwNo9w 5Nu7LxD8QjPt9bMvCYj4A9cp02vUNePMXAeeJEleHIoxR7QBXLNt6J/xvA55MzEz g4TiGAxAlQtsXTfrUj1EgmSK+GIPJjWN+2bpw0Lwx9LcUyJIqyTJkaAl6QZQ3CU3 xIY+NinJg1EvIJJzs70t/KevvRb+4ulDmH26rTE27CPpzYz4zPsgYPB35n28R3FN 9Tqe47nU534aX1y/OMBLTb0XZ34KpPKZJVTjngRM5y839ag/9/IQvr7a1FM5f+On 3tQbdCMZovhKHf3FRaTeS33k36mvapAip3S+09T7qV25M7dK/Zv6SaDmLTiHyb55 Dlx5iowBJi1eFvcpvP2NfxAu3bgeQUhWbmloaCGjH5bFZJ0SJsgBHvsyiVFPCeel y6yzzwWYr6Kd8VCy0w/7gvFof5VM2W40c610MKI1I6EoexXrAa0zMGSQD7jODRKO ChnospqWy1kHBFuM/YxyJnprXsIqE8kkIcMqAqASWU+82GWBG0BonUFktv0x1ze+ SIgO/VAmRkj21jI7qFzYngUCUCybbLKSRf630JFlcHzLIBmWnafRgRoUdbICQieD PaLtxQ1Uj1UKLBMlUDbUnseA2yab29Ik3m8ukY5F1KTFAljfzsVGUGj5l1IWk1OO fchxNzjOAYZxHwMjA5vHueZy/62bt81Em0ffaGmufJwEQx35GDs7YQm+ijHAhuVl 9/TWHeG2pLQFLVKmmMmvwUTyFZOP5CzSmKCyz0WETWMGJ4ZMWtKM0NjkgX0uIK3o hm0o2TB5ZYRSIzAKLIzFRSZNUTsU1gJUEDJhfE55jra12ztiweF5yTYUVdewGCLV YIKd4KXi1psnhjgd44ExtilBOa0yawChhlJMGKlmX7stJE8xsQ3varANmY3Podcj LC+Y7mhoJMTWEi7WN8ZM3VPGyjbWqBjD2tfaEd59693Q2duLV22CFNUEOI7XZqJc BsDU5yIDku2EZ6G0LV8GLFQ917wFEF2HAc5hTJsQtQ0rX4M8weSbzdlZOlslWEBz wsIOzHBVVdynGkZLvdhoY/jhs1gwvBhQOTkzHoFmWlZ+eAITODE7HysAGI0YAaT2 AAbammpjctfA+AKsZ018foZuE1QXsMyOCT7tAB0rMDwenASw0Yq0kTqnfH8WcNZL 2NyKHKOwiiCgmDU8Tsh+GMathyoCSlWWMdxv3rkAgCgjzEznH6ZQFyzjNqzFQxjX GphZw8FTgOhc5lsRjJU1TCeoOSuTaVTH7lB2W1GvO0eoeJ4/PRhbje4kuttd5pWG 3L7n6tYvkLhi2HBlaRUpB0AAAPnF4xFA0F643dcd2dgPP0ciwDi9ee1CXCy/gIUm EAdbVRQTddR5d1/k+hinT55NRbbQ8xkehWGfmgWQX421hT/56B7j9iy8evMSpdRY YFjALnUS/gWwzC6uRVaku7cjAu57lOXS6brWSHIV7Mzs4hb3s5ZENzSXANRP0Qdf v0ICBavDwNAwDl4VwIzEORJSpmCHq1g0ZbH6B8ZwEvdi04IOHIUF7pWkgN2zzKh+ NjFLI4Y2nGAA7AgRABjwcupItzQj6wH4TgOGrl+/Etmen/zt34Vp9v+bv/7tqNvs //J+zIBu6uhCt0lW/OgwWu6acIQEYhuQepxGFCajCJaQEPUqDSCQHxzjUC5yravj A6GO6MYszT+MdGTxfHx+SRxgAYZaR6uoGP48Ql6hU1pFBKGz+3L4i/vj2CFKQrHo 20hjBKBXwP3Oz24I6cx55Qz5hbBP7GcO/XEOY9z14oD5no+d0gZpn9UbW7ZqmjGa wfFOWeizAcTqoW1W4TzfIEy8z7F3SJw9AdDoROE7xCSu7WXkBcwBk48EknaDOsUu bsOIyd4eQ3Lo1GysMyaxdYLIHT5bW8LRzVwNLbk1oRJCYAHSpK2zBbuzH7P3G1uV jcEyMl+yC9IA15RgJHK1uvY0jG3nhfa+vlBHuHyL54toDGdvMwzzXLMB8oesK2r3 c2BCUcySWMoixJyx05jgUFusY5LPfVJ3rXSgVNSHbVGnmUUUSrtjV6h5Gn8oK2hg bMmCWlFBJ0uJhbVesyB3VngOXGYkFByLOruyhOZSpOe4flCbF2ZX6ZdRNEGeUoJ9 rk0WVshnpQmjfQQKI+OaDd26Smk4gWcZjRQOOR+rQtiOVYAjKEziqO1KFHHvD2Ed 810X0WHssx8jUHkgyxNsfFLHh/UffAoRxDEYE9YB9rmt4pRYZlGmQRJkE+dU8uSI sWhCpKxnDh0Lc7Bvu0QRuDBuDfvl2bg2ikYkgTwntcy5AGouMZ4bZiYyltm5e+GP /vwvSCDLDd9742uhKdEW9nBA7fYncSBcUtuaTRRhc4n6zOzHWs+iKUvRHR+bMM01 M9bFZOmsD/mASHMj9rE3GwDeLaRvM9Nj2Odp5pGyR5w1cMc8TuU645u+PCn9LJGT DAEv79tE4MSEa66nEq12TATjGc3NzELMcN+ZA01EMwXKK0jL8Oto591E9O3tWDP5 j7/4DAke9XGpWMDeOUP+5tw9b0km/ucHL5DxED/zWs+34/fzL8T1zvvnG5JS5wgv 9a9v8/Ke+yf18i78PaA1BRBTBznfOh5ID4e9p97iJH765X4N8T9/pU7G3+Il8e9X F+cF+u340OK/eqb84Lbux7/i71+dcGwbxvc87POL8JjeNgXsr1+5EV6hdqAMj0xl YyOUuKF/Bt0aQEXtSTrG5RCWY5EBO4vxL03DIM48IST2cSjq+k7Iu/BG6Oqj2UBT I6wlOkIm4gkDh8MQujjFwBCyx0spKCGknXNKa9WNUHFALVASh+z24jW4GGbisRbB EHleh4TPDxhgZlXns9Bah9OsyiysXz21Bi11M0r4MYPJ5eLoxDoA4KiHLSV0XgLr d4QoXGPgnallsAiShqfXQh3MgeyhiVd2irIGpmEzDYFer3KEEyZmBmBJw2Epjcaa UpKMAKfMLD1E1oxUKA7Nl5rTPUX5GAM9ZY2Fi4kAzwLUx0w+Dc4+Ri6Lz9aZ6DUk RtkXXHaAZjuAcMILLDRHGFY1PCYeHeElr6GLy+KBW+zZFrnKD2SBNXCCNeUORVyX iWxHfF7I/d/jWSmNMGHCCgUCfdmEdJ5FNfcmW0DNglDKdR4RIjvje6cA9V0MWR5N AdJ3CUvhaGRxLkWEkS2HkIWhkWXexQDbnvSQBey5E+UkdXKZ+RvDMgBqC16nYcT5 EjIOQD7G3XJkxQDhan5vIER7xmJmuavMHIT0hLS8/StbmyFtegJDQmiS71yEkczi e/AR6HbRXVMQ3nHCgIT5QgaQb3te7xXCQcc412sxZxsd2KM7ybkWUAP4FHZzAq1X GSV2CnLp5gM4OqJqRHUtXbKoElEMs6B8op/38yitU0HTgHWcNrN5q/D2l2Es7fzS 1N4ei+DrnV9hzKs3G3qGPIbQotKRJ88oso+BvnuFTHIWyCeDaD9ZEHQ4Zkh+utqN Q8ez//zRRHQ6etqbKEIOe4OhKq+x+9Ve6H80AMPaC9gvCT/8+BEtCKtCa1trGCdC MIjOU22ZlQgeP3nGAkXdUMDUM5h2IxW3CNOr4eofJBTPGMjF639IfVjD+BdIANth Tn38cBg9dBWMTCmlbxYY0ziSgF6jBA8GALeMBYtpD6PntHB+CwDcMnKjY/PclzLC lfmUDZuLz+tiJ04IY+VDmgtcQoudZBWdRMe7h9j8BnKFYtjqsbEJNHWAPkLpc8zt jeVFtLgdkcXvHyRBCp17PcBtCqD+Rf8YFQ3qYjOGoeGx8P6T2XDp8kWOSbvUoYnY za2nm5AvbNA9wGIai9G13u4wDSgfBOy+88YrMRpkJvqRzCUOgYkuQ+hlZWbtuvbZ F48pqwUwfu2lWNjeygbqUmsBGvcejSETWAp3r3dRpaQK52qOmrowsuhYq7GRn3Mt djjKJHxrj/kRyoaV4Gw0c86LK5SCYvxUYSs6uS9jIxMsbMXhyo2L2CTGE1GtE75b 3tgUS9QtzEwCMA1ZojNHSzfK2KltaeQ7zG/mwzFzO7+4EvYLfS9sux158tDDrgJ2 80pMPmWeYiNkCNs7OrnXMKqAKsGJZenycfrPsEHqmmX/hpB/NDVTtpDrMH9A59by e9rCY8gBowFGwlykK2Hffa6uGVWlyMIACMXcv3LmxfTEJABpK1TifCvTkt0ViFj6 S+2ndZZd71w/mJyEuvNjYlU5TrQl/9JgplykMVORjcW4o8sHCMGEnQCAYzItAEH5 yzHVZ1hNwuwq2lrWnUZs6BoAcJxnVNmI1hUmNxOHbhs7ugvTWME9MqHoS+Ql0+OD YQOGtriLRD6cq13AlXVbz0iEm8XZm4eAKKe71jFlwcxxMORrS+5Mxrc6zIlpsuAl WAAqRpFqsLELc7C5MI+ZWQcAeuwcNnWTaM8R11xZSZ1lnr8NDAqwb9nIQ9IzYWk5 t3mckMKS9shoryFbElYplXF11wmQ+QezR3BnYqbluGSp1QbLnLOEQ45Y+N9EZN6H Q7dqi7IA45glPLNtbNgO62Y1zyyDNWqb5F3La2VjLzP5jhG/I9a0MyrWKNfwmQO5 415MntrDvqcxZqprcFIAzQuAxGPGRgEOq2trAXZLDfUMDKO62jLY2Qxq72ZhI5UR ZjDXLJVYAlmhTEWUcbizyXGRIHBPED5G2230VmBm1zOlKfLMu2xvxECAXswcreEe /94f/RsqB9SE37h9k/Wc8YisxkoRSgKsEXxAQtsC1TfwA6gsgfPFEcUdjmdlWFkQ EJInSUiuHRhyx5v15ieQ48xRQSYLgqG6tZ3GKcivllbD3LPB8NnQTHjENgnG5Ldf eY0a2y+Fvgt05yOCeABWSbL+2R2yibKgazg9do5LJ9+kCOCbAxZxzbXc1iFET04O FXy4b0Z6e9HIvwIZ8nByhnnCueEgSEGK9yIG5Pk+B6IR5fE+t4X/+YtXCr+xvmFH Uy8njz+7tQsfI8nt48fiv/PNzv/xbVbnn3/FL//82/HAQJ34yRmgKIWCUxs+B5L+ Fk/a4/Pf8wuIZ+vv8f3zSzg/IbcT78ZT5y9/9pfUiafe9y33iL/FcTFIXhxGZplQ Tyke553XXsHTR6PCjMnIKsarlnXkW3huTjZL0NhWzrJCaSujofWAhRINZw2F1es6 v0dzgG7YHMr0kJhg3dEkE3B8gbAkALeWZB+zv2XjDLmaEegfB7SF+Reg3J2s6hNn YFsbKTuyigdsB6XiQr1pwj6M/WM0neloaUpZHKTry2EB1BKdMaEtLMy8JOyDAQB4 rhNCOWP7Fc79CNBjmCebVHsNtV1MLLujNxi1X1yXWlHwWwxNKYcQLO8DQpVEyLBa ZsswjQylHukihaM1NYZwkxiG1S1KMemBMQmzAUzYIZ6DOloYB9hLn5j3T12X2bp2 IVnDILFx7EJzCJhN5zp2YYZ4LLGuXwaLbROJCwdM7iWz3JnI3IAoYxBYWOrHIucm VGWz0BSyz22M2SE/+94pTQ6sT3rAxNli/7ZnFVDbVUigq2xAAf/O8nzYHh3j3pGA 0NRMm0rYU67LurFKMGTGs9C8mjW7g4YvJnAAqIupP1vs4sC91ZGIfzBAGXzmvTnW KPGMrYGHxYIBxkSjizST/9RQGGNEQ5WDISjB+aBtekhYIB2waE0/9Xh2oirds44j yRncqwOeZwbXMDs+Etbnp6hzC6hlMbQci+EtjYPhVbXNvgyryV6nHaZqCs/MzAEm KhmT1Lucnw0XYTutNDCIRnAN7WznqwKYTRjJudDWRq3NJTrH8HtDU1M00JsslFcu dgMacsNPfvIJoKs7hmbHAFqG3kyKW2DsjgNMulqaYHIBIQA767IaclLb6RhWezs5 MQNLQu3d5vqoC8vA0F8HbJokcO+zRyxMhTiRpQDoKYwwTQIoBeY2O+j4LM1j61Fr u67hUCUaKJG2sM62M2TMUq6MjOEpqg/IohSj/7Xe5R6LRhFJCbIsswB36/DKEiRZ oHXOBEP7RCFWYC1MVrGKxzBRFZMl7bzleJvHQczVyPO9VYDnOuO1Ht2siS3zsL8m a5ld+xkZ/kswixZQz+J5PIO1NKHuIqF/x+kEz0EbU4aj2U8SmPP1+qUOHLwkYHcx FFRWw6LW0jp1HAZzKnzz6y+TiAUT/eQp9+ww3rMkQGtwaDJMr+6E3stNnMMhzNxW 6GE/Vut4NkjkACBulrEM4eAMFRdoEd3RXIs2eDG8fx+ADctrIfNP+wdgaQq5bjSO 3Kt1APXVnsbQgSNgHddPqW1byhjQiZF1H0VPW0SioCyi2mSzrS+3NES94RPY5EVY tG+8hTaV9/+O2q8vvXSdVo9d4T5a30+RPSS4LyVo5GYmuE+E/rt7SQxkvo4ND0UQ iaeFI0u3puwzjkvZOJyA7ZUFgBPyqfIOHLzc0FeI3rewItrYFuZsF5phIUEm80d9 vqxrAcCnsIAOUvMz6Gm/DK3tCUAHGl+SySRJ7PSUxE6OL3IsQE014yaXxX4HEGb3 Np3jBZLfyrDrR+xzjz8FODYWj98kQtEGq2wNSqtL2MLUpFGTsZLIBazIYAtXI22F jGVrTg/PrCK3oCUn89+OchFA8R0Zd0FNCWuHek1OPupFt5FT2d/e45YA+DMrmgBi JhHBAGJWyhhreySHHrFNzHFgrdjHbl2GdV+cWgg/eUTXxSOSP2sKw8s9lIpjIRkf GqL+ZinzKyfcu/eA9qXUp8aeKhGqRBplJOYM26MMJx/b9QCCpoA21GRqhQxsd4b2 i+oInHK0sSdci9UYbL5jJ6x2teeLMHo4CbKKW9h8s/mzmbs+l2VAZBpjt5jInhKN XfIg0lln9vdonkBETuCvc5+Fc5zDmpGqfU59c+5zHrYqk5wGZXTWtLUizikgWy2u 916W3ZasSzhzdos0F0Nbk0u9cJ34PdYBcyXyITWsb+2iZ3nCQsJ1LJvx2W3Aupo/ UYnTSoyQ47GY8TyUcGwAzK2KYTLXFqBxM7kTCR31skbQ1EGrAdbGb6whVxF4sxps gEeOiYidEkGwWo4Aep97E1l01l7XaHNALCXl+iJW8VXO87Uz4n//+/9rTOD97q2b 0RbPTJF3wLhKQoXKR5pgesKat4zcSafK+rsSFkaO1NzavniFzxaQO+2yP0mcHNbz jppOSmlW07a7Dh08mGVoJPzzTz6ilnZ7+M/ffDvatf/5b94LXwz3h//6d343vHnz FnOKGsXkOpxJahWRWMjvtUTQzL3ZQIrhOCrETpRBrhRB3MxiFx8NfsazKwivv3wn dGKPfv+f/4vwPnkeTeRTCNR4tFwFfzHeIlhN/eY7fJa6F2IIt/N1/s+Ln1Kgly3O PxAT+mP8/auNeffvAa2pPfO1+C224iVQVMcoOHVH/MPLg/he/NGz5vfUETzocyDr e6cMbt9LbeRn7sR9uK/zn+NXGWDuN/VB6l/fiSfDPeEDqWRlAZvon/TSvve93wq9 t+6EHITVuUW0fcsmtA4IseXaIh7Es1Eyi/l9H73W/ND90Lj/NPTepCNWx+1QnrjC YtfMANELZDICepMyjgCLRbRl0xhDH0I1x2XcR3qcucG+Ma8sKKtsY9H8Ojx6w9vO HCfMLqLo1qZaEr6O0QrhMbGAek6G2o9BdftQnLKfSc5Rr9CWhFVMTjtU5RUAtGnj tAOIlPVTcG4NO0NMugzup4FFX8ZQcbc6FBkIb6f+psPG8hoCP++9TIbVBGJ3Fwz9 MiB2m0XaDlpmrBqaPsJQb5PxWYz2Lht2yg5e1o7zHp4yIQXHOwxgW6/Voe0yJHaU hAHi2uyUs0tISkdik8XVGq7lMLc1FRggkg1MrDDjVmArsFaqoNfN1WHoKTPC5EzC 8B6ig9OrkRF3f+kAuVO8OXVkxz4b9n+KrsNMy0082GQG+jfudQkTZWqL+nOExptL q9ElYxA5X7GmDGs2kzKPMOw+IvwdDI8FnRX6lwHCSgBLMjKpUN8hgxFDwTOSFbEj iguYWaeGaBxzaqm4Gp693jcORTRSnDPbaqyzMITq0s5g5KEUAJeETGuaYP81PmiI ZqajLngTD3ltZisMA2Iz8bbLWLSzOI4DXkbpDIzOCGa8kwnN2PSZz6OxMsnAFp9q /5YAbyZV5SJR+fLRE6QA9SwgR7GcVDmMjDVflwE3ecgf7Ag2x8+OXZtQLExPB9nF REdrzKDf2Dkm8YpQMCB6B5a4sameZ0y4nDqolbBsjZzfzCShVJ5BQjYOHegeGe23 KGe1wzHvPRoKrWizLZA+BItqC8nr6EzXceoeD0yg1UwgY6F27dMZSprlUgqqgTDW KgzuJGFUdLksjBMwjMoA7A42hPbSsja9gJSpRSQQZPq+iYOJexPe++F9JiD1mG8Q mgZs2GXoJhrTUqQQnz0c5Raecl9qKYG1wHaH4cbVbtgC5Q/jOAGAPo+NeHuZ73by s+zLR/eeAEyKwm3OGbosDA9PRGmRHrRJUGvck27YZPWgs9MwtczJXhaGASQKDwam AYhtHIouUDCJttRtbEmgiVshoWsw3KB4/uUuOpCRxLZPNKCR6z1iPtz74gns5zQy JvWNBYTYp2kbmhau3Hcf2wAAQABJREFUXOsie3wu9FNGrRunwtJyqzz7PdjwJrS6 6tiGhkdCLw5CK1raoacDXEMyXLl8iXu6E548egz7DmMGqLIT4AdUZNgEUHahY1vB yV+cnYm6bgHCBCzqPEC5AfCWA+NvuHyJBbLvcgflraj5ie089Dl0JEIhC7UZ6s3U W22q5xoYz5mw4S/dvgZ4bKDc1QB3/ixcutoXk6/mJiEHOF87iS3AEGfCILZfuBCW DjLD+NhwuFO/SaY8tTIBDhZtL8P5KyZcYxURI0ZFJD2eCm4w+mmAsLXNSexwI9Ec kiC5/zrtRYRKLfcjYDzGlmRXoy3lfRNsCtnHJpEEC9Y3NlCnmXlvElFtHnab+2KH pWpswz6kQzWkwT6NFzAy4G30tTwn65nmMe/tNifwOua88gBLqzBV6sqVX80t7UQb GzV+XEMpTtoCDs0WNjEHB2aDbYtgjpMksNjwxVJ6lq7axJnexTZ2MJdZLMIgz9tW nbu79I4H0OvY2Pwjp7Ez1DDWz7DvlUQsrPAxAjN29Rp6+HTrus6H4g5qUcPMWbVA wL+CM1ZSSiMb7FsSB065WZWVAdDEHwL4V9jfhnYH5zMPkJZJYp1AbZx5Wwi7XkeZ wnVs/Py2bagtxSjRgMO9SXIVTuQRa4v3r4BIXyzQj6ljs7ge5XD/bKwAjsWUAN4A XHbfyqJyxSYEiDkR+Txj8yZi3W3mXLYbuwZh+yzhpHytVLaV9esYnWtxMcwn88UI onkP2rAColqudxikGFFRh2vnPTbnufDdJFIEnQm2r4Z0OmBsqLFNg7Us5D5aMioD Zj8vj2Qo5EAZMPvZbC/MKEZCZZbILutgGWxrLszrEQSFpAKLAGss6zxr/55nwDjz O8rnlLHYlMcSlzFCyRrkGlcNc73B8/397/8VjHh++FpnWyghGmJ98DO+Z4ktCbjN daQD2JkMnkUBDugOz3+GqjUzjM998ITspGug5fKM/3ZVdGC/ZFitOcyYZ74045i+ g629t7sW/lFzU7jUlAi3OjvD49GBWG3mmDXcJhCHB7CnOEonRAsKcFhM+l7YmwdA ZOBsI4WDbd2E0V+DdFlaWyYKXESeRD25PXTGRH71vd/81XD4wx+GT0ZGY/UOHSDv gzV0nUOu4/Hles4P4hbXtvhyw/jyX7c739af/Orzt/khgtnnm8fv/D2g1S/55Z/Z H78/33X87MVvqT2mjvMVUHX/HtA/vrzZ/nn+c9zbi+P4AwPKC+TqBInxCuPFffUd oazbpDFwBELqRb/zxuvhNUJpia5OQvIVLEoUsiccYDeiJMDrKWHDD1nQ8zCY9QUH oZcwamvX74TGnpswVo0wgoS8MUanGGCC5QAGwAcL1T6DWP2KGY97sLSL8wxoBmMu 15AHGFHH5eKo1lDgbs1Ow1kW9V3DYMWey3jmywi98/AcizEgsU4bi4kMpl69HUDK 0U9tL+nBUbvVwQO4tEZhMWFzQzrZh1QrYNJbBYADca7ocgmzmXAltDrgd7u5YFuV ozDVkBdwDJsROGEEnrWUnYllQgDO6xgetci2eRSAbVACy9atmYAN4lKEc9gJyQNq aL3zTvqsAsteYX+Q9ii9cFzipMUKAS5SluwyVNIIq7rNvbQUkYJ92SIX5wiMAV16 h94zW6yaWKIH7Zgo0yNm+wUWXI1ZCSygbJb1IK1degjwqMDAm0W9CVDc3oKtw8Bs wA5n8oxzdlYpjk1FAxbOLCauoaMj5AEHZGaeEYYp55IyMdYyqXa9KSlLLYwyDo61 CFgxYsy4KPyX2fT6dWROAXFHyBZsKeiYtNg//5wbKwwokzgDBvWUsWJ4zBquKP4p gWJYh+eCMVIWAPIOuUmMEdsmBLXcx10qD4wNDaBxRNOKc2X5LQ2TXWhk9fU1ZSNc nG0+MAcDWtbZw+IM0wh7t06iXRHaZm4IdSQbYJepTzo0zEKCkwWLLPDJY7GqAKys wjDIMtrFaXAQNozn9bWvvRQ7Kg3BBiZaO6Pu7JBQVS1GyxbD0+hAawDEPeiZ5hmj Y1Mwue2NEZiOzayFa11NUXs9/mQI9kNtXwah9xkkEnvhWl8XwIG+9QC3PpoCpGH4 ByenowOXwJgyfMMIWe97CIhtD/y0/ymJK7Uwg2TgA4AXkNlYw1W2YQOmuIpzaqqu YP9T6L12YfqYuzwGtXfccZ5bHowjHWzQbMmW+hxWl5diSTQXACuFWE7uYlcd9/gE hnAmljmqgLG69+XTsAS4ePn2RcBodhganEKTTIctAP0E92CRxePKxVR5qOHhMULK u7E2sIvXGIC2Bf1uC/VPRwHdKzyTW30J5hQNAyidVlFdRhcvmhvAZK+hQ37t9iUW 5gxqqg7EGqyXuTctzRSYB1DMU2EkwQJjWZt5mOTOzgRa5QoYXwrOc34JnkMR9qi/ f4Cs3orw8s0rXONKbLF7+9ol9Hy54f7nD2LyV2tbK1pYEpFgQ9YppF5JFMmC8euU p1I310InufEJktFgugtx9pUXrcIsL9J56SpVGS7Cdi/A7MzCtL8By2ry5WMcmPKq StpJcj0wtaNo2L9GA4Sy0sooR1D69O1vvoGDmREZwGJYvzIKqlvYfgZ5wqVLhCcr G8LC0Hh4jHb6l2sALITKs5MrEWhlnFIMn7Gvft3nbg3QTcCVnY0sSYRiD1tM+SdY st6eFuYcpASSCQ6HA9ZCciUON464NUWVPql/NKpkZMLI1vLSmjMqMq46U4WA+kPm gRKR8upK9o7CgUTVEoDnyh5RNmQ1K8zNOlh5ncUV8iGcWzZ4sJtdAQfmVKPjvQ1j zWRlnSEZFfusTnaSxD/HpsmvgvJdsE5+xhH5FSSDnlKVYz2DsVMZdmjEsAnxYblE s/fNxB/HQZyZ34AtpfUotmyVL2+TtCuQzoZNT6qfnZ0K7Rd7eH70n8fWVTcRdeE5 zpM8l67UgLbga2iIK2DiCrFj9EviOujwhWTjgO/n4iQogZM9xTRGxr+ZvA4ZN+2+ zPU+ht8xZ4KqZQKNuOSwtmwigbDG6wbrpEm/RqW0WzWAUO/7Ms6X65KwLcuFyfu+ AtBjXT7hOav738KWR/sLQE/KtnIOtvDOZ93wG9Ykx6RQShGtPs+UZZk1B9kFP1i7 3AoF2p10w5gYlPRTdaUkFDMGiom4JNmvSXPKNLaIhOgECGxPiVieYFdNwC0vJxGP yuLWa7YL4QkLW8GBSVtEdjihYmy1EjaxActCjJxZX90omkSFY09ix0TkTPbtCsdi hv0RxJqgzKlxEV0tOJeE8//Zn/55SP+tXw9v4nRU4VBNDQ4SDOa54JhatSAdZ98O eKuMve2VJebZBCwvTnhLK/tIhKZy7Mz4ePiX/+698ITvS7jc6UK3z5EPQf21zLdv Xr8W/va9Pw2PR4ZCF/P+nZdeCt949VXamXPeRI4XuJcFPKc8rk2becaF2Uq9GGJH 4m0VtnVhaQpi7ZBmOW3hRiMREMbMDmTX6NJKaMYufuvtd8AMBYDWfxrmIJGaGFfi BUnFFORLrV8RRTCexW5uYOt2bg8vF1F/8A+fnn8v9Zlv+fkvfmn3f8Er7jV1oBef emBe/CXQSO08dcDnm6QOc36w83/8LG4fz/j/cy5sEzfjomS4vCBXInvaM9Z5+al/ HMLn+8Fo+JGaz1tk2r/+6kuhuS0B20S9MfQYewzUaZKa7NFumHdgdCyUHlFnsKMh XLxyGc0Z4aWymnCSSYFpJoVhGbMMZSvN2BOw5mOgbAt3BDNYxARSE2qikzXqUixv oBi7tL9FhwFSgDABaDYWzLIfhXRRqUHgPIGR3IFBzIMthC+IrGkRXmY1rIrGlSuK xzVsX0P4Sa1ZJpMpDQ2moeQzjp0GS+AENWwsWjR077moOYmeJ/vIxVibLWvnDstv eM8Mn5xRANpQlWFRhfCK4G0ZqCdbwGT2GmUxBOZqKEsIHcnsebwigKSg1pp7gmzB k00C1HhuE37J43kJKJOwsxoaFxhwI98lJILnp5ZK71bpgUDZCgOcHiw2GiYMXXoG nb8Y6A5AJ7U1arM4ly1A4eEJGbMA1FoYOcPmm+jk8gC4R9xfNbVqfWyzmMRi7MOc Djx+HBYGBnmPzj94uoYU7Rl9gDFI5rCYcG52+jHErN7W3u+Z3MtSwkGW1vJlZq0d bnJghfR0TznHdRbxdUBXAQyeXcfMjD/l/mH5ojHG749gycSpU5wi75tdZzjBOGzV WFrEXD1SBiAdd50xAoiFEZFdz8foFTBe2mBM7dKzi0eNfYpdtzh1DK06KhIXYGI2 YIhKE21hhcVmcHiCY/HcaIs4Bqtjb/QKwIRhnRyeUzOtP2cR6RezKCWofWm25ybA r415YimcQe7V5Yt0h2MODQBgjYL4fE0GMPM1j3ObR0uZyfleaEd3yTgZAGjIIqkx HBmdRBNIyZTGanRVM2SWk2zV3RoTHQcJad643M6x88IPPvgytNGJ6RKhzocDJDuS mHEH1tMM36eDo8yZTMpUtUQdsIy9Ha9kXJ/S9aqesJrjZY7rOAAINPBMx6gRKhvU 1wvbmAkzybEcXzIHM4BS5RpqdythidZgJmXMM1i8h0ggk/GqYc7uM16Hno5xnGPA GQlUGGiTXr777kskXlaHcYD0PMDt5pWeWDrpCYCpDga5rYFWsywSq9zHDkrIqPv9 ArDrgv/KnV6SYOjGBkBoqIe5x4ZMYHdM+LnaeyGWhfvJJ/1UbigIF3BSB2FUBbE3 rnfT77uDKgez4YefPgtvfK0PCU9W+OgnX9L8Ijdcbk/EhdTOOYnmGhw3ShehwxS4 3bhxLT6nWZ6/DQ5qWHCmxykizqJy684tnLPS8ORxv1CB+8V1wlo9A+x2t1TDlLfQ tQmgSKjxOs5FATV7Fxjn2wD+QlgmmZZV9iOoLUcHbU3JLyibpcznNqXEMG9hkuLn VlUxvL4NGLC02nfeoZUtTNKf/9WPwggA/Z03XoUxgr0dXg412OqGNsfSXpjqfxA6 KyrDdBqyq5UhuPNVFsmVaPNzWEgF1TLiJzgeykrUPjouSJMMCUpaZTM/1R7Kfu0h GcrD9hsdsmPfBprvvMxkqMLGGhmswtEpR8KhdlgG35quVgCx5nM1iYn7AMJtbRaO UxYVDarrKakFON0nhL+PAzc0Msb9yY5NXCQdspnHzhvr7Bp1cD2wOozJoYfY2lRp P2w49kNSpRmHZHVmFlkZGduEUssDcra0Ha5lP0wSqbBAvqRJMeNd9s7ubltU35jG OVrDVl5qLWMNQlObX4YDiKQDh14n8oz9f4JMo6IdRwDgks7YsJXxCc9wxTUU+7oC CTDHMXJxKizBZVctwand3kqR2VTCpO8gMVpZWIVtK8eGAAiZ+4+ISJjsWMg6YfLY fhJih/u1z7pkV6oT7pkEzbGVHrBvuXkk7RBxkkgyNyGNZ2JIbRMgj1kPZdi8bYgN 2zenY2O3JCZY1iWIVgFoXnes+ynwRbCZBYA7BXzmA3pluEUAlpiKDjzfsb4p1A+A lXWNZ5rBnxyOkwFxxAJ4zni6HyQOGhH2YB1S65fmAHB3sWdKCkoB8xlGTDnAEeRP TgESEta1JOBvF9CrI2x3SDWlRUg79lhDtrXR3MdTIoleizVvDzmmdtU1x8Riy20p m/D6ZFAldlyzEzjTD4eHwp98+mms4nIbm12NZGqe6IeJrUL4A5pKmODLYyLhrxQd +Z1YDrOYHBk1sKWM+7PDhtDbnAj/5R//MeNfguTt2IZ1BlJigKgT6cPhO51Xw+/9 9Q/iPfqdb3073Oy+APmSEz5+/BF61PHQd/t6uNXdFckDqwqssFbPwdpPjk3QBYz2 7tipjrwq1ihLW4obcMS4xsYyiCGe7R6Mf09zbfjvfvO74d988Fl4PD9Fkiu4hmfB 4eM44xJ4Sr5SADZSsfzs84zvYydlZH0n9W7cFJzhFm7DVgJN1smffokZfv6VOhLv x6/Fz+NbABpW5XhSqaP6kYOC1/N9Pz8JDvwcrLoXf06dC6d3fg6ez4sX33txNQzY eGzf47txc/fPIuRF2D4uK5kMd155I1y6fots5Ap0bvQvphAz6AHmYS386N7TUAVo aylJC3dhlC709sI2NDLYAEJMgGM0PWqNDjDmMpmyklN47aoZm0hc0CMzjGq9spit TMbkDt6+wMwOSDVmG/N5OWAmJ9d6pSQL8cBO0KhY228DsLdE1ydDXLZC1eOWjTOR S89PgyfzKCtaCQsrWGUDI5OAaUTXvG+Ly8h4csN8L9VFhPaw6PUKEPpvKU1gsOvV nQrQmCwaeMGmQLAAkJDHPXNSalxP2Kfap3RYW0NpZuja0lKtqklSFUgQ1gBHht4t 26JIfZ2fLRNjEW/1rEkWeM8lHcOjZGOHxd8EsGyuaxZjf4DHbJcuiyj73DSQgg4r DOgVz+JBFnBuhqXOOF9F+T5TDZzhIkvfqOl1WHlvDgBtMsNKF7YAy8o8TGorZmFT YiEDuw8AHweMTu8uhKNpmATo+gIM3wmDwmSyXIym+8wFpGafEoLjOe6sLfEsAKmc pwX2zxgLJnvsY+SPMBqydF9++lkYHxgKL73xZrgJaFEbZXHrdMal7CxTk2QwCl3j sSsV0fEy2zVaHO4fN5332Ewa3K25FpO9LMTt24LZApJXCgEquNYwKbBGLAz5AEOd GseXohrciHBcjBdNNvYomfTpXF83wMlyLUlkEbKisgRjQ2PhrdeuUQoGVuzLeXSS VwBXuWFpZREgV4wjRcvN+bnQSlmlEkDOB5/cj2HlrkuUdmI+zM4fsE0twI4i5Wi/ e2iioSxiCMBqO97mlvowglGbpE3sJcpDWTbo6cgcGiw6rnEPtynl056oZUGvZl8L dBPaCJe6O2C4NgipL8Qi/TWEdmVfHWPdHS3MPVoLAnB6L6TArCWrLhGyb4eZEPBb eqWLhd/7ZfH6UoBGfV1d7PaUBFRcpsuVukwz5y3eboh0BR2vHX56OqnbisNkS8dE E61NGXOPH/WjodwgQeyKw47yVfOx81Y998MyVAs4mm2AAoZWCqjhdHZ20PqRBXcR YNXAOKhnsVnjeLNr1h1tJ/pCe9cJGghUVsbMczWt07BkVfUYeOxILMPFeZfw+TM0 wcM0wrgD+LtzrSeW8+kfnAzZLKDVaMhmx0fD0PRM+LXr7+LgoWPlmmsB/lWwgrPT SBEe43BcvhAZ+/4nhONxknoZC1tk7Pez34ZEItZ4PMDhKWT+1zQ0o53PQ+88y/yi qxya5TTGqc0IZCBtsjBHebF5WNUmqnBUo22zduwwz+EiDkUl9/Oz+ySrUonjLixx DnN+6NkIY4+mLRcvQDMRol6YDy9fbaPjWGd4QHLYYyQPv/rW7WhHZ2ExGylf13Gh k7mQHX70734Ma0wXs2t3wgYL4SdP5kMD4e1EFcFWpn0ZoNQElmzAjxEWbUI2nY3M cpbRzs2nzSVO3tLSKmOSbkk4WVg7nBtqEGMf7N53iWLbdnfSXloGLY2xsI5+1cYo mdhKNdtqXNW7rmGvOpBYGNJdP6QFLMRHPmyeJfhscjIHAVI4QfIZGe11OIkFzGvX AMtq7TOGVxhfNtUgJZS5TXe8DRg55r3Mp85sLc9tA5Z5G3BazPqQzTb7GwthK4fo W11zOGItsWzXaS7HQ9ep81bO/D0GpBQpE1tlfu1Pc4UwwovUeW3sg3ksiAzcHOd0 gF53b3Upji213etzM1QU2I5ANwvypaymDtBBlYlnz0Ie0Rcbl+wCsM2hyMAptVJB KVKzE+aSa1mC6hEDgyPUiG0DsPDIWBdcg05YI7joWCVjBXB0CHg6QRpid0ftmBVi crGlVoLQbp8CDpU0maiWJHqnc8e7PFvuMXbXqJfruBFR+chS9On52AIZVzWr2QAk s+XZkrVKu4l9xcndQAZxxrF0SHf5rmWwrMVqdEcjYYtYyRjXRceAdUyt3GPSq41X jpAiiIEkKCwRaTdCnQ5BqyB0h3uzi4NrvdV65p0SqBWiDdYnOkF2mE0FF7ugpXO/ 9lkHkjC0WVmwwxAjnDhjlsHBediMwgPFEmKci9rUDAgV18b33vvbUMD1FH7jm6GD 45yG5bCClMu6vuq0S4gMuTabYF3Gc1LvLcra0hGyTjBJoa9i2/8rojH/5Mc/Zo3P DH3YmqmpmfCHH7xPtZae0CnjevVy+Gd/87c4dCTncU1Ugg1/h+P6P7z3F+E/Zv2z 4czNtlbWvj3szLMwMIe0qak+9FbVUrKOUlo46GuMLeUDlQ1ov1ny9ogyqJFPgz3v 6OkJ337jbe7RYXg8NxWWuHf1eLRivWhcI37jxMFz3nMeK38iGhSrRpseZZ9xO944 B4B+/Tno+wqB8t756xeD1vMvx384kC8P6JGe78Tf487jpz/7V9yGDz22f0UUHXcQ 3/nZjX/6N0+egSrLFNd7flefJGxNAWA8RfbjAn3rwuVw+813QuJSX1ggbL2NRi2J kdGbm8EjtR/vdQzpZRigCiZuIZnXSUKRq+hGDDeZ+CMY2gUMgUM4IFn+MFKrtNHL ZMBVMMDtnrXExDrB2BjysSi/2iUL02+xnWU5DB3k8vCTxwwMAEmGFg02bA0q3Vvm 5+r8TKjBhsSQt9fGSGWiMRXYSIApK7NJwlPqrjlgOT9iC04Cz0PBv52KMgCPMr7e V71+xmvUV2qYSKaMXp8Z9jKreRz7kIMVMTldPNX4qH2LGX98N5NJ6jMVCBrON1nC Qt1qNz2E889r9P4LonVYsjAmlkfJgNm1U5b1LKtYFE0O28XzTuItG/bXIKRxT/XI vSZF9A6BQoxdMeBBTau90tV3eTMWYFMta9JQZ5cvFhy0T4sYYZmaQhYb68HqgdWS JFAFy6fmWM1mGcxCLjcqQaJBR1UjSVi0MuTaTDZZmmVy4a2XMxZcQLJ4LgXIL3zl YHgy+eM5mRh1zP4nxsaoK0l/c4zi/PJi+OsPPwhLTwdC15078Vmm4T3L1jg4M7gf 6eh+dHZi7Tv0SZYpScNARFmMRt5vMbisQxgfdIwVcc85F2USx9ybY4z5CYkJhill 6HgQkSHSibFjlmMpB4cALjSsTlIwGuDyyqvXYDLJ1F5ZCE2AjCzu0YcA0CoAYQ5h wNmJkXieMjijMHNmBcsM7RMKNsGwvbUNZ4IkMQxua3sHLACnihOYX16JThzW/GiD upc1JAeQ4AWzucs5dhESSuIYbGHI7t6i0DyO3kMy5AtYXE22Gp+YjmD8xg3KeHFT l0m8u3O1NzIS//bHMIcMfruujbKdxdStq5nDs38MW4R6mX1UogedZcE5CHco53TM vfxyEnkD0goLjI+PT0Tnqr2jLXbDsh6pUgXL79jdyF7y1vadBRCPTsyFuy9fjeBj npqqzTXUZq2riA0QtmG/LvcKkGFqyULfh60H+9CJ62EErBcv94RG2qA+ezpEctME 3bi6CaHhxCyQqIMDUMoisgALvQv7fQlGuYAw5/TEjAI+tI9UzuCeyji1d7YxTrLQ 905RgidQzutymKCF9PuPn8War51tsKiA5/4ngzCBReFWR3sM/36CBvbm7V5aX5Lg 9eQZTuRhaMwtiUzyg6HpkFNeTQevsvDs2QBJa9Ph7t2Xud9pYQTNqN19GptorTsx FeYAv/Zxz0KWMQZ7vEpo2eYCso7LsDHbzNXOrgQJXkew15SRwpG7ydwpYH4Pj4xS ls8Eu2aqDiyQaDYWfue3v0ECRk249+kX4QcfPaSbVjeRigIcBCosYBpeRt/rvp6N LYa33nk53ILFnsPB2UYP9wr1dZsaG8NPPvyc57sZ3vrGL5HIWUqE5AEVIBbC9eyW UH+ZyiLYESumWErPCiEyXtpHF/IM9JfZMGdGakyOzcml8xPXYsTigLG8nkQKwZip x6E3qci5tYyMo5wolqX4NnCuGxlLXs8q8rEOtIobgMUtjtFYXRylG2nofgWvykd0 eixhVYTk5iwDZ57vN7EuxGAggNXmNGaBr7PgC4qs1GK90z3AzxnrwSZsaVN5LawY MiZYznmkIiAv6rjOhqP18ZDX1UpdcRqEoE+16kZuKe3EWYtcGtLRwgqwnf9JZBR7 aG1XZwdDsu+7cQ6pY33w6GlMGNxfXsBOIiPg/mzwLOZmpnGAaBIBI4iPANhoCZs0 2ZlhuyvIctT1G8VLZ62bx4G1dWgT42SJZ7WP13Cg1neLrnuMA53mYkL52dx/Sz26 jhwgq9ARbCGasytwg8SgLkvUWZuoptxG4ZxRLXM5rMdq+3DLzTl37MaYCbFkFAdU G2u17hI5MGqI0ira+W2encl2tvY9ZR+W9mMZwolAjsd4YHnAnpoDQfifYypHMEKq PXH/Jr3FfBAWMOee0UmjlkbvDlm/rQCgvM6i/Qdcl5GxnBzAImugMoBDfrY2sVEb VthYfi89rZi1D1CrDGkP+du6jnFqbTtCKuA6qk2XjHF9lOhxnedtYh38y7rqf1Zg QbwU/uTjD5g/ReHdK1eQ1eHo8/4xuITbFG09X4nj0JavNo7IZI2TjU3DMUgnCloG +G+ADPP1Bz/8MZHmtPBG77Xw7a+/g4xrLqyi032puzu04aj85ac/jnO6obQ6PICM CEVZ4Q9/+H7Ebzm/9t3QzfEbmPtF2JwqqgkU8yCWAcC7kAYVpfWR9DHCuMF5SBQU I3ex3KZtddXxvn67D3xVEL7/wUfhs7nJ0IADIiknVosH4WfXQnGA/3kf+MBTf/FK /ebf53/4xyQ3f/U7qVfqm6ym//9eETQ+/+7PfYWT8Dx8xW1SJ3j+S3z7xWn6Ob/E 64ifPP/LfRj6Z4NoqXj//HjCJr/gPkxkaMbjfeuX3gnXXn45mHy1giYvJl2gNdli ApQwQH/77dvhZm83Qmr0KuxXr85aioZ2ZCJlCNX15TDZl/5fyt4zRu8sO/O7lXPO VW/lzCKLTTbZiZ17picrawWtLdsCZMgG7A8LCP6wgGHDX/zJsLAGdh0Wwhqytd4d rVZxRjOamc7dbGayWDnnnHP273eLHI08sx/8zlSzqt63/uH+7z33Oc95zjlkg2Yw u239Nk/dvEVDFpzMMiyGVFw8tkWrx/PKApS4ME1M0uMzLB6zBQE9O1D1BYBdQWgZ DGYBekDXhF+xCwjX5b3FsktcwyYeoaW8DM+zHrlGNFgcJ9MFBJMqGyrosVOIyQRF CNJLC2B8YRoOMWxZfM5w8zmgSC8sHVDEGQAkACGyzTMLMbKsdhNa1gHR65zPxW+C U0yyYlxjGTMu8BAwto3nGnuCk62t2vNoBw4DRGMGqXUMDWVb3D6b+yqAlTWZIItj 6xWqIbPLTz6erm35PI+SC1nVc8JriyS92NkkDYPP4eKgqJVSB3SI8fBlJqkdp47P KITC/dj32gz0baQFW4x/HmBUba864iU84HhdexthYOApIS7YuuomSsKUUl4HNhVv tYRwDxYLhg15wOYGmrRVmJFVxgY6G1ZjlY1nBUNQxmdPWIwP+nvCdz/6u1Bc1RBB 3wBM5s1LV8madxHyKATkXK9hJptT+BymV8a5t6WQhCdbXlRGAk4jbB/aPICmO5wA VhCX6hd/dwbIcXDOuQaBvFmnWzybNTYLWQ91Rsl8Ls533j8lIyuXUNYJz24YBq64 vBimORfAQ99xmL5K9HYabdtaZlOaZHiMtqDolCvqKcsE42gJrQr0erLL27Bval3d 0GcAbC93w5wBPJ729hPWrkPLWgybSN1THAsz1ldwHCYAXZ2X2qJMpJ/uVYLkFhhY W7FaU7aDEkvTOInDaEsvk3SzB9iZ4tpSSAgxeWsJxtW5kEhU0wZzCR3rZHgZsGd3 rN7BkfCYMl23CFVtscnNs4Eb6ga3U5h/iIxwsrsbrCU7E1bYhJs7OmO4eGAAUM4G UlBYHLtVuUE2dZEQhhNolnwxRtOySeMT6Gthja8hOzAaMcf4NcOqtSGZGBvl3DCG XS/eoLbpevhrgPVNAOspwGgc0CvIa21txCQlw24OwaLS6hWG1ZIyE+g5u9F9NgCS nz4diYCoAYC3sLSMRAN2GQAnc/SwZziyzN94+xphPZ49DKOtcPNgEydheAf7h8G6 GbR/bYGpOw4jEySscW1NdfVodSnTxbU3waJuw64sLVERAQa7SbDAXB6epCNYNxpc nIbhoZGoz7sM8JXxsoTYIOzpuyUVIZXr6RmaiEDcDOOjbcrwkZBaBzDfIhL05d3e MMe/JbynzGeb86ThRL1OqTJtyZO+wViloYbKDDa/WGXdJejyJPhdxTFkZw3tgF9Z y6HhCVonl4ZXcFzOqB/Zh7PU1Eat4taGmLyzwDi/8ib1KhP14cHtu5TvYc2++CLg CufvFIecXd4ue2cAqvRUmhBg800wtfTa3Bx1fXFcOorq47qyEcAY97hC/oA1oFvo 0paDfc2EXdberTEn3OJMCl0HDOZgsyUcLEdUWGbi0lGcO5k8J/Wm+9gqdarbjB/W 7KLyCBtzdh7VZHDeitE6C4rcQ2ThrEaTDvucSM6N1QkM5Zv9v4edtGzhPjatkDHS OVBLuT43hZa3L2zPj1HDMyu81E5om7U9geOSjJ07AkzaLtpC8svzMyEJm5MPQNEh 2TxkjwIwNAKirBAy8eRBeEKt38vNxdi1JaQF5TxTIk0TSDhwBhIwlspVjo6pfADj O0YSTlVdgqgUDu0YumR0jqcAfct9peZTexqi5xTpV05+eZSULGB7X2Gvyeb6kg5t 6oKtxWEtxznFqseKL0XYTKviHAHOdIAFntolsCAvauIKLNmjjEIJ2tnCCB/nXTQK wP4Qm4rPu4Rnsbpo05oNOuqhRcV2b/K81igvKeGAVxiBo2MvsBUM2XjHHAi30xQd evY7A3Ymwh4AotVEK28T5Gl/TY7iYLwPvhBH8HsBpw6GScRKt0ophyZLb2tbGUhJ Dsv7iRusHmQlkv1tni+2cYtrdU4akVIutb9HRJYxtJRWFYTKRWMD9lr2VAkcczvs ZCWoEHQXkleRyz7wR3/51zQzOA6//7VvhhaSnHaS5gGGe8hMII44biZju8fcGYIo qKlGzuE+xbw6RBedxFxtrE+E3335Rvjb/qdhHlLNefnNV14Nm+3b4Z/80f8aXr18 JfwyjOylRF347gc/Cf+y/5PQ3VwTfv+td8AxWeF/R1+bRy3c3/ulb4cO7Eole9IB D0rSJod9phEnUtZ+Zo75yF5WVFKGpCQRpXPLRKXm1kYBudUkoXYgGykgz2I23JmZ JGIBk8+eG+We4Btu++KLsY8vkTz3KEq8+Nn/8j3PlP9jc/leDBhfF7jv4tsL+PoL QetzZBvP8ey4z47AZPn7X8TDcnJf/jq+41njFPUnTuhF+3r2dxef8Uffe35hF2/H H53dvscEuzgCP8paaQhg1c7YvG+9j5D5q18PNY0NYRSh/J0ng+HTL/vCq9R9fPl6 a/iVt19h07jQ3+mNiRqFwzKpGptcqJXYrYPvS/NgFTFgKackOzG5LetzwmRGWgNY xHdishvOL2JzV0dp9qglq2xbekoNR7tyuLGlAhLzYDUKCPWqn3HM7aQUwyMI4k0I UGNltqUlOey+4ecsy/Vcn6qxzYBp8MZlUx1KW9xZYcAQRhnGOR9Qd7BJzT/A7Akr wAxNixvHDH3u0baNAmDrymazOC3cvoHnObOA58375YBA9as7XJOgjx2CkAlyC67V zM182EdLd8iYqsWRjbYdrRm9amEzOb+ANWbPE/ovgrl08lk6yHathpGtDqCUQCY1 k+dWyJiBWWO5MGX6lv6ylmIxnqbeqdm4MsvFGA433WW0WCYjGCI0rLTC/R4yHhq1 FZiyRTZOCKhwqbwwVAKgFwCmq4TIV9iM01cW6fQBMOZzesn5gCNbNxazMVSRyW8l ABMpZqcnIkMx/WQxFDNedTW16Aabwvtf+TasxDIyhtXIBCTQKOr4GKo5fha+k6Xd xrF5PNgXPh0dYg7OUhvv8/CN134j/BoLuwCt2BnXhK+JQcTock7Zk2O1XvxtnBy6 1MxznYq4Scp8yjjwu1SATKrdTzhCKnPunHm5CZuSAiiutA6phg0QaneUSVi/HOZA orYObSSli2BUrpCUYz/yTQBLFcbQ8myrK+gKy0pgjvLDg3sPcRSSaAlaCMgiVMnn EgkZTPtUE66t76AOKYL9WcJFsIDWBX4IYDU5oAVgOkANwAXAzet0jDJ0OALIqyDZ qxjQOwJQ3CCsnUgk+Hv0tnSEe/eN6zgZ+9QVHYhh7soakoJ4PlOA2Fa6aMmszU2P 8zc1AE4YRkD0ICHIkrKyuEGMsFF3IQMohUG7R6ja7Nnq2gRZrRelvewaxVADJmej 7q46UQtrOx++pEh/C6F+p/nMNBndhPqbWinCTtLlHJrXqlrOR0jUpKc3r3cANltj YtPg0CjAqxOmsTbcuddDEgwdpmB/jUIMUr4rgTatDuZ6lu5hI1Oz1Lm9AiuVCuie hyGjYD72wpJUi5zD1qgWZ39EQ4dVxtTe3zOM4+ePhgjj09tbQM0cv089zkoS0a7h bIwSXrfObCuZ5TqAstgy793tzSSpJIXbPZPoiROhs70F7S5NEwBGVwCwJi8+Rf6Q zT29IWMCILH0lV2TamtIiMIJmZ8cDzWcxwzrL2F1s9hoW9uaWft0o+sbhQGDFGho grkuCiNDIzS0yApvXrkMiNgMk7TYLUWaUQWonsKZGea5vMGzbUJONUUCnmvz1WtU cQAjPMWJKSXLuJn5YjmoFcDTSyS6VQBYl5GXrEyNUrapCrCZHypTl0JZJrYZQoFg ADYPe8sawkOJIFZNnWWDfJlHoOOsU7gN2TCJ/b9VVUD0gGQ25ph2RbZb2ymI2mUu pgEQqgWqAMIMZDKFHHuP69nHppQADizKn0lY+xwgY9KfCUYyrXuHyJ0gQpSpZBdn xn3EvuyW4VOqVo28YhddsMz7NrZQ4GLIuBCG/fBMbST6VECHiZoFMHCDyG/22fST 0Flb/9eyQ0a/BBub7G2prOM9xnAcqUYDYG8bB3KN5jfbOKdHpde55s3wcHwMGchk 6Lx+E0zI+dgay6gacgLohR7kuRHS5jmhiUBu0sL3m9jFo5j5nXZGoigW9wjbcMJA a1vSqdM7glNjp8iOcmQxzLP61paoVbUV+j7RLyOI6URJkmHi9hiLJOak4WPbb+ei g3VPPcFGpXOfi1y7srsMoovWgDYSc8T8VCud7b7DYjSnwCoCKYxjFuAyRpJ22Z3Y 5wt4Pll5sP9IXTCAgF6jWYBTvrJ55gx7TDi2fqnMrk6CYewT1uYG1Qms5pLHnqcs zIiiMq4DyAnL9KVyLrXoysDi/sr+kp7OPgdg9zlYbzWTiElxvrWD2YcgSszxMurq 804/I0GYa0jnmrYZb0HrGWOqzE+A7L+Z7KOHaZAhp+h3uXD3MPc24CvnUeoAEQZQ NXpowf5/9zc/IFKYHP7Td9/BKa7knolcsHdyMVw3ewLOCn/K90XhkL85E3ewt2cy rjeu0Wiiuia82n01/Ojeo/BgdDx8/drNWNauAJnFNIz5V6tuhnbsbRMEwm8R6i/E eWviPLZNX2Xt/PPvfQ87VBh+7e23Qy0Yx6oZZwBzS5MxRcP+7AyDf0b0gigMDWg2 kHytbJHvwLMxX0KyxPwhZkN4+53XQjrRpj/74YdgHCQWXG+MOnLfojlhagSkLmTW p8DVe7v4zzMIy/7nm77tdxc/8c3zF7/4haA1skPxj59/8uf/9aDxpP7rkX1pKeL3 3BGvCELjd+ry4l/wXy7/Fxzbz3qpvuWnubuL4zFgFzeK94FA+OXX3w1vvf+d0HGV zlcsFGstzmAELepcU1UU2mFHTErwwcss+tAtSeWmwrPGkKDJ3MADFEzw93tM4Jj9 qIHhQdrZohDG1UswRGLnjgIMiJnr5giqk9lhkzGhw82JXTtu3Hp2GUy0mJyEkbV4 v4lRtnk9IhRiiNUi2al4dTuAuW08vBoYY1vbrfK9gLoYwKp3aX3VGKbiXCYzeZw6 dEcuXMOnMlFm38voCnxdCKgGANF6loBVvBwzGg1zuXDtv83Fw9JqJAi7AMQzCGkd ENZwzK2fKgiuJ0xm/UFLDKlhlS0+4Fx7tKkStOmF5gB63bw3kWPouRpCMkRguEUm w45e3s8KoQNGh5qljDtP1IoLHi8f42dmfOxNzedd6LbTtNLDOayNzKPMdTbHnmdT spals8mattkAeAG1Xzi6YZeEmcW5yXAGYO4AdJVjbPMIc5yzackaqzNe31hhU0Hi zvgXFlOSCQBaBINS2khYHPYIsxOOkAQU6XCgKWxobw8ffnmbjWGYkBeVF9h4NaQC PyeQCR8ylU+GBsK//fTDMMOcsEj9cnZlOOQ5KR9IYl5FoMo5DZkekGm7CNOyRKi+ pL45JNraIssQS6BxTPXGsrmGmlPYPNUHH7M5WNYqnee5j2e/Rm3EbEDrPBtB3kka CYXoLDGsdgErJ7yjpmpkeDi8d7OL2rgl4ePPv2QeZBOOyoOlIsyOoS1F/2c/+5GF VVq+XqXj1WyYHhuOerhjkrnmZgmzF5FpjXMwxLEqCPl0kcTTy6a2DEh9FQZtDQH+ Dz96EL7+5tUYquwjwWqbCgY3rzTENWjyWRuloSxX0zM0Er719g1YvFKSEgfD9a7a 8CJhYx2eB48oXl9aycZKyOrR05AoTqdpQCL00QhgaGYlXOFzFuJ/Qs3QZIxoAc9t dnomAohrL3QBgrbDw6d9rHWAOGHH8clJWJb98PatF1hjWZSaehoZbWszDqAZXWUM 6xq5RtZF78AIu2Fu6AakGrLNAejchHU2NL45R/mqSw0krdUR4oRZJPveygE1AH6b N2AACKdWAbC2w8d3OD/Moi2LB4dHGbu80AoLvU8IfAKgadmtBOC6b3CCqg5joQoW fh4GaQRGsqq8JLyJhIHa+uH2lw/DGvP5fdjiI4z94PAIbVi5BkD1xCiJEQCsK1cv MT/SwhTnWUd3foV5usCz7Gd8amh2UIhDu8xztlLHi2Qmq1lcgKGeROtaVVuLzTgP 9x88IoyINjmnKCa0WcT+vRtXAE1F4aPbPTBiAMvuVtZfRvi7D+9RzWOdvuNfCcXM nY8//JwSUSnh7bdfJvt8LwLcUiQXhQBDa0vepzHFjZe7aXiSFz7+4HYYQGN665UX SNhMQkeM9ha71t3dETf6j+9+ElKo9JIoaQjZW8OU4iJxqpBamEQctPs2ATChw/bE JofYdruglFbCLVdoVED4lc9sGmnhM4lqxp/8AhNUdvl7I0P7gikda8KLq0tmz1Pn lH1kjiiarJtlmcygTge8uheNUxs4iwStDFGG9pzfHeNkSibsE23Z3bGeMHpDtavs mLZQtfmE4eUNgOc643YOc2WlFO2Y26BdDK1VXEADkEKkCHbgylzZhzGjfSYJX5w+ 3Ce5LR8wkcdxLBXkurA6TBq6yWOiS3vsW1sAxp0kgFReMdKgmTBF5KL9+g0SgSvC 2lg/rCRd/WRCAb3ZBdg+gPju9kqob24mWkeVigf9obyhkSYe2It5mHAiLUYOt7CP xTiJWextc+PsA6yH1ekpAD6l0XC0FnEAd7kfa40f4Wyn58LyAa722NcqcSZ3iHxo C8rrqFqCgVZXqk51jCTNPNaDCVRzaEEr0SN7TQxJDBfHCCVOsBE3WUrlHhjNSGDs ITvY4nd2p7Ms3jaRzlj/Ffuis2CtdCNW6nJdxybHMujMGZAlcyKDdSyqdQ2c4zgI XI1y2ejEEP7JOR3PWCcFgGVzJNzHcySj2LOA0jgx7FTcfyrHWWOuSNYU4vgJNlN4 Du6xJ8yPNLBAGQSIEqYNABwzATDIfkqkdYMHq/23Ne8++1pMcuWabAUr+rYUoI0c dMJyITDqiN7839/7Prr1qvBrSAWy+du9I8pbiYKYyyaACfcWibwcgRtsB4tqNO5B OQDGK0SaWxOJ0MC//+Lf/UX4p3/8f4avXbrM828nktUTpq92h/pLV8IbBdfDNRyF I67D9swzy3MxeY7JGP6HP/6TUIHc7JduvYkkgigCto1+aTG5r669NZSzz05N0jFv ZzqSVmVo8/PYp3RaZkYmkCLshLp2pZjKurAzH94On2KzjNhJakSvg+fls3EesLwi Honfcy/+P77hN/6S18Unf/rjxS99jy/xwH/w9ewz8f2fZUXj96JMX/GcckKemVf8 Pe/FP744/LN3mFf8EmDys5fyHIn7p37OG4K4vLix+Ds9FBbz8iob6Cvhq9/+lXD5 pVeoW0cJE8JT9gJvwRD8/q++QyWB6xgrChPDwKhrtR+vve4NTS+hg9IIOYgK+U9l +whlM3f4Hd2Z2PTtW63uRYBl2L8QT6ESpqkAmlwhtyDREBaXEyeUmaKGtjWOemJH eGx2lVKDpYbPhbCK92+5juiFGSJEz2M1gkziGZbEULQuI1jKAsxhQ7FzT2x7BxgV AFq/1dap2SymA4CmjJUgM+pUuR57owuAlSrIUhrut8WhyV8FgOA1gLh1Z/UWBVcm azkmZjma7Z7DwlHnKcgytG+ZKRPVDBVqNG2xl8FCUt8jg3jCvS6uAVh5wNbu8+W4 ZAkoebyGU0w2mlulODRGx0Qg78EWsGqcThgza0iqaVX0PsezkSXWS3e2ZGYwzmwe aj09LnsDhgfGUqCqg8GzKuW51BRkUZ4IvRGg9HFvLyFqMskxoljYeF/ZLBjBXFV1 AhawitI7tAHlGjepNjA9ORYNTiUsZGtrG/rDVsLuaHpgfssxEjZy2NzZCOUxxE2B ZRY2Dy4aHH3mEcKU3/vk49DLwiwhRK0WtRyRfhWg2LIltu11Yx8eGAi3v7gTPkDr 8yff/7vwz//Nn4YBgKvSgBQnEV9pePYmtq0Rjlb0n8r4ytDb9zmX61Hbls71FAKe 01k/U4TXU3EeznGuopYT1sOwlHpcemXEUOYaJYZW8IgZOUKgABmMVTnetetrYXGJ rPkuvHEaYczBDJZWUduYTZSM4Ao0ke2MBaMeDZeAK4eoxOHeFsk+idBOglTquWEo us2wcU2hsZ2ga1QTVQRksVZYj9V49UUYvhUMXVsLSUE4BhNoKo9Ypy8B/qrRoMow 2Z2tHIMtmzYDKCmtqmVMziOrWAW4loFNNoGCSaEjaob/g4f9JA41APiKYZVnIlv4 EtUIsgEG2+ibLwH0OrhOtbs6j+/cusazOaIQ/Qy69vJYymt1ZTFGETq4tmOYEjfZ SuQTRjG2uQ7Lzr1E7dlUwqEDsMu5eYVxXEx0OuQeOzm/AGOI8S7AkSwpKw8jGO6h yfnQCGC1XNscobNkHIa21mYIr4PYxaqxuYm5WIGzMx56GTcTugqYoyuws9aabea4 hsYHnvazOWeFd6lJW5ln9vYWTGgTGmCy0Hl2I1NLMdGiGCd5dGQU5rCADbQEbeQ8 LWhxQLj+KpzuNa5hdIAOWbCzzXSxGR8dw0khIa+6FslTEhVWFklGKoItLGfR7sUa kVZhsJ1vP7KFB096Qnt7Ha2OqRxw9yGtR5MoK9hI0txy6OnpjbVbKwA9yzCwPb1D VGTJj3VdxwHkd2CNrUDgpm6jgvGFdQBVCWCDZ3j7bvirH6LnI2u6iCjJ3NhA2F/D 8dxaYM1sUtOVJh3YKu2ktUr3kBQRmMLgKvNJ596o0SrIYKycz7l8v01odAENtZnr 5hccsx7zeJ5WOrHigQlbJupYr9Ti8XuExdU91sjQM9eVCbknHfH5bD6bzXrSQc7G XnoPAt10nNptnpOJQ0q4Fgnrz8NULcGeW39Um7pMRGgZoGah/HwIhxXOWUSkxrWn JGyCfIoskoPL0RTaqGQd59cOamnsG4us6z7kMu4ZdTC47iNbOAm21W0hYbEIsiCZ WtUlyHZyqT19vMV8ZAxOWBdTvTg9rF9Ji92tTZzEasK4ZeFwZQnWL4V52UTGN/eJ syOo3kRnnIStFxBZns9o3GVY/UN02qmAzF26M82w35p8UwLgtp5vAQ7kxWaZioNP bW6OnY3N1IxtYl98Kbdzr2bjijrnTCoSlJYUs/cBTrFrO+wnhpsFrnHvBeBsojvO gsiw4sw6e/Ykuu8jklFtlMHAs7/vxj3OFr+HOPFHkBh7jM0i+8kihJXyHyHFPsRQ KbalFPBlIpzRK5vJ7DPGgqUs9tsNnt88+mFZVuuNH/K8JUCUDPiK+zuO0C7H13nI JeoqgXDEHrtvgjIlITeYj0ae3Ftq6hsAqxVICah4kYv8BJsdk5pxBIqxgWq+JcFM PpIddYMTB7j3GTk9ZG4VMp9rcOr/pz/6o/Bvbn8WdrH39Y1N2AZkZFyDDTG2mE+O 2SFg3dJo+1y795fGcS3LqFb4JhKu3/v210IDDP+/+vSTsABIV042NoyTy9zIYHzt hrUGYfGv/uJvwq//iz8Mf0ITgitUTPn9b78bqtjfuahYtlAJ3Als+Rljnk5iYgb3 konNLyPCVEnViTMA/+gYsrh1EgBx1FuIvNjWd4p9MQN5zn/8O78e/jEShFmA/xHs klUfWJLxpUMYSUueiZgpwkTekZh06mhbI4T0Z98VMsaVfvH3fv4XMq3PP3TxKC8+ /B/8bzxuPPJPDx5P6h94AM8iWPWinRxc2PP3/dHvvQm//Gi8Tj7ve4I//2wLo5oF yLz50uvhpVuvhzQW8OPhMbxgex+nhnde6ODBFxNKoPwUdRI3AGoXAnlOy8CovRPo x4nDEQVIsirqpc5ox5rFRMmB8bQgsAypoQHr7ll0PHpvMXcGw4WX5MTG/kRjJog6 Qeuh7lAQuIqn7xXX4Nlzm9HLs96gGhvvzqzGLQycwNCwCHOWeUJWJee0/JPsQgw/ wDrY9k6wmslmYfhEwG0ylHpK2djIXbOpO36C2ItaeNoVJzSyBT6nGDxmVXL8DDpz YTe4LpnfizJValFNtLKlbDYhERfEIkZXhiOdv58jPJLJZ8ykdQEL7vf2tjE+e4AR QvsYwj12FNtlmp3vJPOZaTR0eq2+YOmaLRb9GoDsnDonJr5RExtHozDWuFuEzUpj XHNh97iM+GX3rjUkAs31ZAYzJseA3jiG3Kx1A00cK1WmQQrPAYa8vrYp5NdeNAkw 0WCbgsi7GDSNSA6essyK4alUwGcOG1QOkyGLTQ1zFUGuQD+JsbJZwzrM2tLSPEaL DQX2pAjDm40BtRD3CaGg2dmp8MmdO+GToV7YmUqeVybhNww/ALeUEiXZhKxkpRcJ j/77H/4t3u4QHYHqwyRM5QFjibVGw0f2Kd/KijNAbMbMPwCq1RTMHvahnnCfh8yX Y55JHixjIezLNklRjDRsR1LsUrW5sUcGeDUgDEYXL/wGgvg1/sbQbRlAPZm5ubm0 FLVIao6XCceXA6wzuc6NxflwCUbU0jePewkT8ywrAYsnsCpm37c1NsIc5lNkf5y1 kYMutDOGTHd4Fu+/eTOyFSboFAI8i2HQx4eHo6HPKTqlI9REmAdEtFIKag4j+eDp OOxJcUzOmp2cg2XaBXgWsVa3Yu3YKwCrpKwCmKdhgMZRaAL8HSKVmEHjmke4vZAx HQL4anRNGpkg1D9LK9j3XnuBzYEuN6vLMfzdTFWETWzCEqH5S7RibaFD3hOAQnNd ZWitp4sUVUVsTNHd0YhTmh76+scAiGSmc/2CYJZc1ImdMEeGB4cJJ2aEJjb/BQAg 8dJgnVQEPnFMyoiSXCcU/qR/Kjwmo78F0KkUqI/qAJYGaoSptT/8nbuP0cmmU1e0 EbC+is26KOTvZvPkSX90NtIJ9ZkR/hiZ02cPxsLXvnoLUHMKIzsa0pmnto217bDS BJOrBKnzY2OhjrrITR00ImBzmCHhzJJkljFSlnCnpz8mTHTx/gksnImNHZ0dODi0 jR4Zg6neDHWw6sMTSzBsk7BObPpslAKQyYnZuBHWwOZNj42HAXTS3/nl90Ih8/TL z+9FJ+PKVaqxsLYePx5AinIUXn2lPTKWH/zk01BIiLCC6xgeGqXSxHcKHXcAAEAA SURBVBLgF/aWkbt95xHPcT68/P7XzQUJg30PwuIhLNIOEaCZ8ZCKrk49ssmXFw1N YNe43sx0uvQgc1gmoSjR3IZdBZSyyWa7XonozNB2tqwEzWdtObYNqROgKRtgYUtl sG4Mh+/j2MvM2aFpchbbgM2ynOEIICkD+2+nvU0abJjZ6mYqkCph3acxBwSz6zgt 1ptFrQcQJpLD+lQuhWUiNI40ZHEFZg72kjE1qtbU2hCaibKpBd6anoB1Q9rG3Dzb miWB6gggTdm0khrsRhr3RdIp4HcNlj07zTwJgA62Wnax9Hw7VOVSrQK7uQv7Wkjh /8M1a+QSPSH5VB5uidq7mSSFHmzTLYl7Lj/nnDjBC7DUJazvY5jg4Xky4Bm37YVp jk1FjMYmpvRhXCvalzLA+iqRw2yqMwyPAJ4BKj6zHearewzGL6wtMVaMRypA19JP ZRU1OKeUWAIgFRCVAc3DGJahsS2N1R2qWPM2Z9imQoptiNeQUpxj5M3hcJ4dcD2Y JY6Jg0BOSTp7sWNtsuQBb+is7wA0z7S9/s8cC8Zb7S9detl7aPLA+sjmmSoDcX+F uQHMEb0CsLqXM4yYWEgpnukakbt5Pmc5qjScCpM3+XjcT1i6RA0hbDw2trSY9W05 rVX2Q8tViS1kbbPAG5YEtFJEYSlyAJygVYDy2iqd92DjD5h7lnUj55v7QXrCvDqF zTEqrHZaUGbE1EpDqbzvWLibbzI23737JUxqTXiruSlGRExWMxqXn0Z1IT6zvLRM o4FtpFLtoQaganMAE2NTsY95fJmj8E+Ye3t/+t3wmD3Q5zHLvrOJNKwcG2ODmzP0 6sfne9h36jw3XQqvdXTR/KSDqBqdyrgnMZWyMwfuDIfBrmSWU6ttaaaD4zKl8djH lMvwmTz2EeuQT6PPHyepL5sxu9x1iZyHJnI+kkPPRx+FHtjzOto5M+gXfCX37rHF e/6r/NBJwLegh4uviD/94dln4hv86MvPMbQ//4oIl1/7d89f8UD8hWFkTyjAew5u IygVmMbDcUhXHF+ewF9FhlVAE38Tf8sbfJ7/x+N4cX40nvDiez/rd6cMinU+X37n a+H6q7dCFiBikE3rE/Rqi3j5tRjIVloVCjxt8WZWp/2TBY1m3uuVyarmwGqYTe8C zGaiWQamEIbRtoYVhIby+N5JecpkN5NfBlgtq3XWIgvJpFCbphg8LhCMiIXwNXYm 0JjYZe1Hv9cDPuC8hxgZ3Qc9g33A6vjUIm0ll9ncDTOredSZRFfDQlZ6YOs4dZu2 SV3Dg9wA6OUDpgWke9SCtYaqWapbGEA1gXatsqtVVak1agFDgFfmeHw+6lU3YSAi 7OfZOLSGzqznKvCOLCa/tIWmYZASmEvZKTNuZcHU4cgq6xllcK2KybcBq/a9LodN KuB8zgU9z2WezyYMsNpYmWM9yEqlAIj5F2AkLMrtdNNA2Ho1C9bYMbLKQSbXorje 0JLTIDZLYG5pjAzDJzGeOTwvQbQtEtMxbsucS/CzODYUpieGoxdfBCNWTJmP4tJy QnH0oy+zlSsGnvmwBhBdYCOfHKMf++hoTGSxHqHyEJOyjrkOHlOcp1afWIQxVCtV ItvJxmypLAv8z8Nafvj5p+GHdwiVYihL2AQF/VZkKGYB29HHuaJOl7uNQPgYg3bI mB/yDEpgn6ydahaqzyILw7WP4Zmbp44jG2KcK/zeY6iDs5NXOmDGxI5lgOQaz8bE HGuFLqDDrGBDlI01kUvGuLq2lvamszGEo+bT7M1izlkGQFxEz7SIIatCfyijJSC0 U0sKgHcTQJDG+hBE9vf1c/3JVBuwPNZiGCJ0qtZUdmAQLd0BZWfyGWvbFBuCba0j uYfnvoKjaLi2D2dSgNmAQH9tc4es/IfoWAvQgWWFv/jJ/fCXnz2h3q7SHJjCiRkc wKTQCcCzacBTOkZZBkvA0kMilg5QDd79yvIKpefs0tRBCHuHsltTAM+GON79MJcL zK/YhhCDPcL5DWnWcG9zdKuyx3dHc0O8z0UMq6xqAYDHeqwCD0P9Jk5YdaCBigaQ tuEzwrpmz3cCpi2wbsWDbJ6D7XZnpudhoTZwJEoie7bCMWUoq2CdPGYvoMxNWy3d Z5/fDYOLq3TuQvsL4zoNGLBsWGcjtU0BsKPM4VTmainAYn56BknKBB2jWmLE54OP vwxf9E0B1GFNccCe9g3jaKHhrq5ErzsdBibmYVAbCD/TphTtsHUcr16mqgNzZxag mImT1sT7p8z/McYon+Svq8gPTI45Qr949ZK6xYPw8af3wghJTqkwRZJBCKZZP/RM t3IA1z4Ge3KZv6vk+BvLMHfM40bCgMpZrNCxx7qtaWyEZV8P3/2zvw33FraQ2cDA Lq2FpzC9xxQgP2AH7+8fCoPj42gxr4XXbl4P+4vT4Sn3e15cH0ZX0hlT6k1Cmdmp 6BibkoEMxyouJsfY7WmXMlErbL47gJ3YktvNH/slc7gDw5eXa11RknWwybHFJk6P 0jAZSp3cDfYGbf8WTrKJipb9WgaErWBXlVLYeEHHm+Hj8+xF1DnVRuPKRubeurrW F12EcVskaue5LbNmIo/VXVxHqTh3sl4H7DvqaPMB3LuwXDq6Vlmp5tkdwZzvL0+E kz2AM9e7Dlu7gj7exBrrVNueeJZ1p+1L4+t8d51kgKlwxPo9z8K+8PwONwFIJF/l 5iJbgrHNoTKO5Qw3GB8rv6xhK4b70X6LCHmmw/c+B6gvxP1jh+hQsZIn7NLKzCTR liWuFWkAc+yMCE8e9y9BkpKZD6BdCZPTNKBgP5AEmidaIpi3C+MRczGdcd9H+1/C nqxTPLsAg+uYYUyt3mPJxR3yBzLZCypIULLKQqKmjFA0EUCeg5I48wvWiJJAukKO sBcDJE0M0/mowW7lMS7uZVvMCcfaCjoHPCD36BUSvNZZ8+qJLSe4AFO7iF06ZxxN lLJ2bhb7Ri62NIJF7K7s6zzz1taoRlXdN62v6uZkG2UrC7kvC8pk6t2nTIqSeS9H tlKKzZPZVVqQDtBvwB63dXZie2FdC5Cf8YySsG3gVCgVdgKeh2W47DgWE7PYRwS6 F9Fb5jZ7ujr45maqs3A//9tf/nX48TC1s5GTVKAfP3GvR5t6wLpI5np1Ok/BFbNI Im/ffxA+uP0F7PRsHBOlYG9duxr+6299KyQgfmRqp2Hel3Ewjog6y9yVJyrDr331 nfA//sbvhP/y298J37x+g/JY1dhyakDgQJ2KaXgYyex9kisnglgMQz72roDnIzgu x75lQdKY6HpnsD+sn25TyaU2dCXqaXVLxAE7YbOP//a/+YPwdm0rckPmFqNqbpIV eFyIESLGnUZcyGDFT1xgRJMP/UD8l3d815f/+sXT+vlXRMH82of30xc/RBjJoEd5 gG+ymeqVehBsWTyiVHj8w/jHFxfEn0SD4aD5faSI41/xl77nn/of32PCXfCrHBcL ModmpD27PLz5la+EmtaWMITx+OLRQMiH4WphA7DAtZ6UTIEhmouNn2PxUrRvCR/Z xYsC/DB60OQuWL0gGcoIHhlMw+yGL0wgOmVgDb8bUrcMi4lHSge89l2YRcPeAmIT QnZYTBbA1lvK46Fn4n0bfrD9p7pNs6m9QxceQ4WhwRADAPGz+Jfz83mz6DWWgkV1 TerP8gmdVSBNkAHW8zPJwPIiHILjYzwB7LZstA6qf6duV2G4Inuz6z33Mpu55Tdk LjTEllQ5ZCILxJPwGGWBLQfiZyyppf5VMF9OSQszNGMoDmBma1BlGGqDTNAqZVyc C3bgMJy1yXjYPEBJmBuKrGo29yXQ1MDhZ5G5SntaxqcYhrQ4j3Ad96lmSXbZTSaP +1Vczx4Uw1XqeK2zeIZR3iFspTY4FzCvMVuEXXHMM7jvA7zBWRb7Ap7uBhuERtAs Z1sJCq5KS6mdWY5ujPtQ/7sDE7sB43aq08VnYo1BDJzZqGqXYikbDLSOTwVgxIQ+ 9axzczPhs/t3qXP3mHDiUXjr0vXw2qVunAjLoa2z8aGVdeHzolgObFhZ+OYb74Rv vHwrgqhdSuCU+RnAzwlGeWmG1qALqzB/OjY8UwxDLEzOsz2E6VbPav1Hl4ldwOz/ 3NTUAqNIzT4YBptRZPKMBOPWNszhXpcBDsXM267OJgy2OmnGtbiC64dlJ3pQDENn z+/1VTVvdVGe0fu0F2DP/fOZkZERtFwkQJG8tgqzZH9se9frvD0ZGAmjsJu2pJyG 1RufmiMZqRRGg9As3neZ8gocxyMA8Y0r9dSRrY4gw0RFAeWyQJvWtW2whvmEHO3f LqtqZytr3E6Mj9GFqZbanrRfZY3v897ltnocy/QwzsZZyDqvRKvbNzTO9Z5QlB/m kmf5aGgSEEw4kvknqFYKpHG13uq9HsOtzEHswjAsNdONtWCnr2XKWQFEuRfDxIbs Le5ukfohgNSj4dnIUGkf3LQtq2SlghXYq+Gp+VCM9nkf8P7RF4/isV+80h6TTaZg 19theKuQDYxxP2MAhddf7KYkXF7of9of67paTisJpkqtZEd7Xbh5tQNgnMz1rsBI NlDrtImyRWwGJKKUJ0jaYXr0oxu2hI/tRLcAHQ9gZItgxS011QtbrI0rQtpxwPqe 5hrs9NPSCnvN/O7nuS3iaFbX1rAZ2cN8LUocrM+6i1RiiRBfJRuOPesX5wQp8yGT 52MJHJ23s5zckKiriZUXRgCdFYS7beIiS+3m9CLtcwUkH3z0WZhZWw5ff+uVyFj3 8CwykQQUsJEPA7BHJ6eiVKG+poa6orRcnpwIr716PbTDrvaOLof+Wbp1ASCt8mEo WILAqIVZ3LKUlmHytcr9r/O1RPjajkk2sbAyg13VLEBvWUIT+9awAwIGk0N3scHn 2BmdqwXXHM8VkwcLtc7cLEdrD1OG82hbVptzZAEGs5kLKdiFM3TSsv6rzCtMDjaY CjQ4OUaRrEqThP7XyjDWuE5Qg9OkI2VrI4z7CHOzD+drAAnKPmHbytISmEayrNdx pLHluVzbEsB3loYIMnHFPMNkmt5YD1g7JsC1K+PO5nx0orMZi10c8BSSp+oASRlo kje47nSu1YoQliRyvisp2SRiYsvYPZzhOZ65Wuxd1nQ2jFoRNuEQWy74a2ixcsV5 rEZxmJmH/aaeLftjJWOygbMoKLS7VxJjWoicohin2zblnV2dsaKCZZHczdTu21mJ YDxglzmITVcOtsIcycfeRykZds78kAzsWhLILxNAug0o2sFhUD5mSUrbnavhVhuv LVNqYWUcu+vpOLtn2dbces/5OOwmFM/wHK1xaw6LzibbEs+J6B7H3GUPsRKNeSTK tiqREHhde3x2HZmIeyuDzNpBxQkpIFZQunCAVliSgAccwb6ElnNSZlBiywZCJQDs IsZKCUQ5UrNCnLW8kgqkaEjKkF7EMm0A0mxID48pEM7lXyNXRnjMpVGbq53JziFR GMdyZGwk/M2jB+EhBMkuc6KIdZlBJDKJz+XiMChFGx4bx+4NwxrTJIExtBLCMSB8 F+Dus/vqSy+GP/jVX47r5ccTY2GWMbbeeazKAW661N4Z3rrcHTqra3g2tPplfVmf nA07Jl4qMznDxppfkcE8sFKO+5Q6YTHI2NQMOQrMydNDxiAfTa2dupCKMPYLM3Q5 ZK+TUOmGSLnV3hKvY5m/czO7wH6MMvuRoE8cEfEh7/6ULOX58f+Ln/nMxU88Cj4o /pEE/P/18qSC1si4isJ+5hVP6vvxUjjZs7fjqQAFPvCL03oBzy/l2cf8BZ+5+Inv 2axPARknxAHe/O3vUBrlZthikT2Ecajiwb8De1ECw+jCszD6Hl6RJSrsY2/YW1Y1 mYllolAmTKW1Um2RVpVLaQsWlKF2vagCjJmFhWUIBclOTq/BfwVxsozqLbbYEGIS EA/Ul8ezdZ2FmmUWDUWkAriF3AK4tDQ1kLSEe8ZIOmnKAAMmQtlr2JCD3p9g1jCT 8E9towlkjmAxQFNdrSDTSgd2e7EwdhZeXBIAemOThcxEPVq3KoITgpA8hkWQ6/2b sOW1qU8xSWeNMMcOYEx2TK/Pl5OzENY0B2Bga0qzKksYH8eGQ8UJbYbtKizXHnot da6K2235uo4nt4oUIwuWOB/tnQZFWcCxMVaW/oELact+z7T2KyTMTjLTEpunoR+l HCYxLHFNVbBwpSWEPzifrKut8dY2qQkHq2vTB40ywxxqCbGqHVuAySlmDBMFbDwT sBxHyWgZL4eK2jpYSes40lEEw45Tz32oP3KiyXxkRH1RdRElsThPJgDzlAOfsgk5 E3W+DjHAKySfWOopZX8r6jPLMD7bbCCf3f8yfP/eF2GT8OG7XS+Et268HJI53+Rn MG+zw6Hs+iuxELTG3SoMsnKtiTruZSs8GKf0EQXYy7qux4SRPTbm+3fvUhtyPdR2 tkemxg4/VhrQq09mziaTuqlHvU+HlGWAf2EDrUFLK0JfT28sL5RIVNFyc4kMfFpQ wi4vr6yih+ylTWgn45ZGos0Y7CYdXpg/uzx3Wzka7p8aH48efxNZ3QtoWpc3qLnY dNGpaHYKkHrpMgz7eawDWo3msYYs+SHKY8kKXmajYhqGew+fomOqiPNliA3ZyhF1 iWpYoyUYziJkB3U4fmiw2PCbmgBHAK4v6LLzVldDeP16O5vFLswqon7YKDOJZQ4v tSbCJdi/NTZKWZ/OlsbISo+OotVlbOoBz1YssHB/W0sTz5YkAFjlljpKwQCYI9DF uSnHQTGhcnR0HKYR3SRA4ilhdRshNKDRcy4Pj4wCUq3nWRhB2jT660tXCsPEwnq4 PTBJ7VrAMpv72CSaMEBOPazjATvh+CQsNnOvtaYSHeV2+LuHw5SVaY5O18ORcYqR l4WXSCAzA30ekPPCta7QhVZweoxENjbQJgy4m+U4Y5YglH2lg7FhQ7mPnjGFze3F K5Ttgil6guzi1mvUb4QBGSKj30THpqaGCJ6G+/tjjdu6mmrKgo0yxnuwPTgprLvb dOiyC56Agh0mTMKSZmXAZHe187nT8LhvkLVG0XSe6Sosqg7am2++SIOGNnSqo+ER YPkQhrO5njJPjKUla5pbWmPJptH+gRjOLCQMPQcwvvfoafjaW92sfYA+x/1n3/8y /C9/8DuhC4b9808/C4usoc5Kk9k2yQQfhLWuDw3MBaUnH/34w3BaUBFq65rCFiz/ KazN1BE1Iudg8go3aSKALEj7yzpQn7/HproOu+lrB1C4sU0lDeqn2mXLMnkHjOkG 5UTOzggXEzGSoTnmeSUA3jKQ8+i7LRkkGbDLz4UAl2zWaS5jboLnOgyliauGRk/5 O52qLMLeW9sUjccRS2FNbgNcN7FJlnIqxYHKwQ76+zL+nZ9h7+Ea1deOTcNeEvmw mHsWtj+Z53EiawtYI/jKnlYcds/R4+ch0wG4zQESrWji1mdJPJt+JJPZFCvP8N7O tm0FcIbzSwCphH5xGHLK6/CMOefKPF28qIqg/WKvqW9t5xjYSZyHzPxqolJUSdjZ pERZJ3bbclejoZFkH8skGnVIw9GtSSRoJz0LsIJlJUIxNYsEAxlMXgrsJjquSpyU TNaogKeiFm0uF2r2fBn3tgUYLq6rZtzZIwDHBe5v3MMcoL6M8bZG7TKl/Jq4N6Vu KYyBz2aVUllZANIimMrzI+wy176CE5IFgCpkX5zHBuSxPjdZq2uQEvtJEBqcL4+9 zQoPSmtKS635irRiE+absdd5KeZ5LEAirbFXHfMsV7FLJlpbM9w9QILFZ8e0xsFC 1+x77HfZzDF3faWE2hoZQfdK8YqyNBOq0qRXsauWqeRXEbBaHvKIfVDds9KlqjrG jeiYUpbtdQCmcjoAnDkZEnFR9vJsj1eqJ8Hl38ZWtHy2CFLjxpVLoXd4MPxrjh3e fCtcr6oJudzz1PQUzjPkE+dmIkWWvhDAWCKLLUDmWq2SYHObEoiWb732SgTgQ+xn WWigT8AxOgIn7ClJOKJpYCjJkVN+rw75DCcmOYWIIuspKRkgDw6xRWwK+9gWtmIO 2ZPM9iKVco7PaNuKLC2fspx2QjtlzDeSaEIEIVWfCwkBsJ7Gdjov33v39VBWlwj/ /b/8P8I0+0Et42R0XfzI44jjrkNifg2/4cVc5vfxPWxAhIX+7K8iNovQ8OIXP/tf T/b/fUV29dkvnzOxUY/g75jISgD8K7/UHMWz8t/nL0N9XoHnvfic3/A3/uAVPrvQ +K0f5aEZ0nil7cVw672vhDwWwSIeWCMb7zsU307QO9tD2p1qHlbFQv0mU8liHrFR e5ICFoXF6EvwFgzJGj7X24nUP7uvDKJhBMPjDqQ0vl+ypN6N/zNEbsh6GbCl5jGV 8Lz1Og0C5+Lh89HIVLKOYAUURsNccmxr10WWljC3TLB6N4+bDSPgWAgo1Z8y1+L3 1k2V8VxlwY2jubLmpG/aq9mxzyE0rr7WRa9my/I/hYDBA5jIJcTtdp2KHhvHF2gb GlarahOAVcqubOLNGo6XVQPuAZwFwxcyCCsj+PkVwmZmFsrKWWrE+2d6xfMaDllA O5fMvclm7OKhGtZSc1uKDEChuwtQ+YQsKc54mOd9s3zt/5xC9q5tcc8B7AL1bZ6l /cT5aGSpZZhle2PCBMbE2ngMHF4z+mOYhB2chiUSwOwAVAZwyKS/9tTEEFq+efSV tu4sjobDUEsR35eRlZvD2B9yjyswDNYf1VBbPDsmOOH9SrecAX5SuSYn4BaGbhYP ch4GL3uVTM16gBNGbGF2Nnx8716Y5HrLOFcTXmQVOjAN4RqfzV/jegnRmTWbzLg5 h+0UE9uvoiezBqtlGEoAylG7zBw8xylZZUNbIGSvXs52ouvomlYA3G7Khq+s0mCV ipwy2ogC6A72YRbv98RQLhMRNoBsZJgra4IODQ9hLJgvgPWhwdHIUGSiX1qcmwFg kQQHQLSDz+LSBhtGXjRY52xE3d1dsKQweAJ1kjAyYJkEwAewNUWEgWYAbXcf9l7I cOrRx9G+0241JmINT8zCHiLRgf2V5V8AHBTCFpyyXlYIFcrKngNyJvHMjYRYI/ac 9SaDu+Ma5ZqewCJOTS+RbNLC8z8hFD8b2dZcDHHfyCwM+g5sZGcM4X3wyV0cP8Am 7LnlmjYBB52tjQAImkkwnxKAsVKvC5BtCNwkrTxQxjJAUOZbXZrvWYS+G1aXFLg4 TnZy2uPZ2m2qpLQEgEX5L0Jqy2w+rTCnRlpmydR3PjYCns8oC2VHvW+/+QLHLaLC wWCUySQAs24EmzzvS0gLLlGvdYvnOw9Qu3SlEzkGtWMBqLus4XJCfzIk42iGx2mp WsiGtc9GOTQ0GrLLiinO304dz4Mws7gIcKiJuuo+wOwygLyjE40oOvpJ5AhWXyjK p7QV5xgB/JuAmM2uvDw9QZh9m2gUGyk2YWZqksjTEQlSZegN16gk0AcTChvScYly U8zHnTUc2nSY72qAG7pkmNFYBYPvnz7pC8doEgvLquggthDnWk0FcpxSpApInj77 /EF493pnqKxpgp1bDGM9d6MNnmHMBgb6AQunMHxl6E93w6OHlObhnqEXcKBmkNzM h7q2TqQPJaF/fA4dPaFQ5z226gh7YQKcHbecW1RWR8ZiJQ8iZgAI2c1SnAvHTjZu A4CAOYk6VzWrxWzqa9g0gZwVIgT4uSSOmLBjSasiIkrnhNvH2WCV/4zQrGGWz1td 5QRW2n21gGMbbSngOefxfX2illJkOirYVvaG0qLsi/ql6ciAhCaAtnzOm4R9SYap stRYV0sjiTUwvgD4pFSY2Rw6DiXTanhxOUZXyrCflsRTzmAisTWSK0n0qWZdniQT GTgjUz0VPpToTw6NA2whOjM2SKF89Ng8g11AagrApJLKJMWMh/Yyh2oDlu5KQZdf WdWADhVbDyhMZ13JWtt+1MiIlUk2sHudaJ/LsBd2WyrlfteX50muK6QbHdIgGAAj kAralhYXqCpwHOZhyqeIsNTiqKWh995E/iIoS8bxt/2uuk+dN4xtlJRtAEDNqFdC tgAILMGZTOEaCnmGlkTUGfHhqUWN9VVxnuaIxqTxjAoAd2prrQW77/GxuwJH97Ei 9Dy5rP98SJF6pE91ZVRe4FqVEdkEaJfPRhoI2+ietQeDaCLdrv/i6CnlOOF5m1dQ xHOTZHKdHMBUWx3HfAdrpxqtOeO+PK+yv811yARs6SxSoQ0An39Xhy1uamjEyaWS TVU9siFsDuNvE5oU1k8q51CnG1sUY+tMnrbpUDJzyYYPNmwx6beeveQLnMTvP3gQ HsO4HoBJsokege2jpMwkrxzBJhjD2rTaSisxGLGyi5yMqzb9V956I/znX/lK6EIn Kz95KGByn8Xh3ufcllcUdHKRvA2uwYYbLc3iXNH5Yf26l9x5/CT85Ec/JI9iJNR3 toW3vvI15nRHrAu/xXM5BUvYejkXaYzO1j77/sL0VJyvbYzHW91Xw+++9Vao5vo3 2dcYcmYSoJyXzHYSCF7MGL/4jFFPTGTcR7lEt9P4ilCR79ytf/7lu3zy+Yd+9gMC qEjTcrQIZONnLw7rCXxdnOjiAL79/DgRuD7/meP89HJ+ekwG1WNwACexF/fuN79J OYVOwjspoZaJXtlMmRS8owU2KcGPmWkKAAxdl2I4Unn4+1voezCQRXgh2QAmpT2W I7GFqdcsIykDqNGRofV+fOiCBLWGJhalMHCKqGUXLdclOHOIuUI8kmegFtCTxkQw ezsDbZnH0aOyM9IhYVjniFnPyglszakcwB7y6nMUectyWqdzA+CtbiSX83JINni8 XEJlZsJuE7ZQ36Smxhqv/q01TLPxOlMwXmoqywnPZWIkNOSyyJb88EvWUvbQpKYy JlUeYUtIrwgMjwC73r+Z+57LjiIMDswbvdbLYRI4nyDCjGZB+DYge52w+5X6UkAz dVhhQJPQcckWG64VxKtRmoc9rVEjjDB/mc+bcCbTpsdpya10FuAC4bMl5A3qc2TA BM/2ZV8DOHktbu5qbtXxuiHLRu3A2lbVUmooaS+soKWpOF9h0SBpAGRQ1RUPmFDP 6QHlzFbRgsGWkLGbGmUXMsFowdhMDAHtA+IsFXWuBeDv1U0kp7ghAFq5lnkYFosj AwXZhAEoGIdpkpam+CohScGyJzNszKmDvWGTTUQpSE1bW8x8j2HNcxsRsCB5Zupj lwC1awDSYnRfbig+J7OSuy9RmqqqlrnB8+VzrCpqu9IakrHYJDkkNkAgBJ3MvK1r aw27zI87D58w+QhzArKHJ+fQ4qIdBpxvEWougmmopr7qKIZmdmKcMDXHBohZCLuO BCX7Zs8DJDPZ0JRO9Nx/ErPSywkzyzzK9De1NrPuYCcoWP7ClSt4ztnhgy8fRUes q6M1avsMCV+FuYN2C4/Qb77U3RwL1T/sGaD7Gs4MYz9B+F2dtrKATQyYpere6kb3 SLu/uS8H3Jnoed8aM68/vDsQXu5qYQ2gNZsejdrgAp5//8hMuEvh/tcMP7Pu7z4C rDP/W2Fx50kwmUSe8P7rL8T1PzU9Gx2fUhiyNeacnXpee+ESjBKd6SgR1MjxatFy zZB9byKfLWONPkwPD0YGswh29os7j6PM4s03bjAljsPtJ70kb1XF8l3Dw5adWgsv Xe/CKKeGh4TnbQv70rXO8MXdJ+E24OuN119kXEP48Yd3YDJLQ0dXWyw630tkqBnm VqA90DeAgT5FIlHHpsqmN4P0gHF/k4S1XbyNH3xwNwKCN26h+eT9Ec7rtVkL0ZAx 5Hto7+5mzSbF8l/t7Y2AVrTH6CCXYQvrANQ2Ptl2DnO9NbVUZOBZ3yMZbIrf3bjx AomrSeHLOw/C6OIm+uZaylXBbB8y70m6tCZxFZvdHE7aCvPX6FHP454wDqP9n/0n /ygmN/34734SFjjWa6/cAIDQvpZNbYZo2OXLl6OmcXm0N8zuYIOPaAs8+4hncBrq W9ph8NZDLwz90uxoKIfxXuIc9z7/PHS+eC00UTrrdKGXJaMs6ibONmFtnHVD5JNT s9gROuOVl4Qq7E6irh5AQA4DnznEsT/ORLcIIMzK1ClEdsTzX13epxtiS7T36h3r iOwY4l/AwSoHZLk2J5G6lPKcUqjDanWXdMKzW6w1mr6GUzSW9qc/wW6dAnDS6TZU gw60kLVThUNRU5bPGiOcDUAwfF8IsGpuJOSMY5+EjKmaYxhwkgVOAGpTkINMMe5b RKYKiwnnsn7tsHhAn9Q82M4k6q26eZuxfsw+ZsZ6MoAyj/2hI1FIy9fSsLyPzQUc 5mFvdkjC2mVPEdyek6R8hMNR1tjOs8bGce2yhcpyNnF4XKeCgVNA5ZVr1yKbNzk4 SOIa2e2AwTmqTmwzR2Qfd7EjbdoyEvemF9dCe6I5arxTU6lnC7N9hoRO2U1Sbk4Y Y87lE/lJYXx3cdIa0WmbIzLW2w8ww7lgMawDgmqra0iKpUY40bkE+SPzrMFsHAc7 vg32zEcbc4zdOMOxcnddXVxhvmfHdqcH2M1y2PJd1vD8HKXH2AdiHddCMvwhVyQZ jKiaqGx43Yio8rYk9qzkZKRh/N49M+YPYHd1OtcZX6w/ORmwvJzXzpFu7RJSjpmR 5JhLge0QN0gkUcQh7PCc8xn7PPdk5+U0Wl2eTyGkWIFkGfuJEpVU8tHOkQ8l872b udHMbaQbPHUOxnwBP6TiJKazB7l3CHiifpvr8FwmixeQH9ENG/rRwweM4W74va++ T7nAK2F7hvrYONMmkwp0bRBgM4U58kaU12XxEC8qNRAJ537KIFfKiwDnPDejyiec V6kHNDKyF1SmzE+jtaBnnEaqB2AbD2Gg1xlTEz9nAM5DMxMhCZli583u0FBaHmqb WkIuZMYWe3gGBEtppuWvcilCcYRNmmPeIgXBwWuCKZdgmyCqlAI++u3f/PVQ29gS /tm//n/CBIRINYy3UgdZenEH/2ckeBB+AxQBulz87K/8gdfFf+Pb8ed/+B8+6OvZ Pxc//Mx/n//xc8Y1Hp4LjCfyZJ7Yl0AogiE9lvgpJhOI+uLNi/8ySSIIjpfIe3xO 0a5Zob/xrV8PTVevkSmIagbg1FFXBcNDL2c8n0lCeat4O3aNKGcBGrofp/zOGtpP QZ0LQM3lDgBkm4cW67LhvS/DOlkuwwGzML4hAYGj4WEnjaWILKuUBKNniZSoWQWE KgeQkXUC5FMiJB8AdsZ1GQ4/YUJYVy+Vv7Huql+CuS1Yxh0BCZugBanV0+7wWUPn BTzILJKKLAnhcQXdBxzbGnIdDWUkIlFcmt8fcN8CbcGxNUBtFGDIxc5eGxg+/U2Z IBcN0bToDa5wj+uE0k0G28MgR30qzEgZIRVLGFlWawNRu7XjZE1tibrCWDoWGVEj wzmZS7GSAoZcuYDMRykGwTarG4RjZG+tYeu60zszK9dwsBIJn4eFnx1fi7czfBgt sg0Zt3NCC+pAK9X24SDErmDcm5pcN3I1ttssqhEAkYkKNpSwZWYV12+rPcP3W9sw 0ehIGZzQWEcZJcBlEZtKDobek1lsfYnQ2dTECKG76XAIO5VNiK4KI1tXW4expdSS z5sFawJYMk6MP28D2GTzD3kmDfRdLyA8foJh17vP5/3c+Jnd8EHfo/C3D78k7LgM kMUxwgD3IQHoe/SYAuAbkbWJDhoMzzEbgvriQp69IWdDiibvFcIk1ABkszScgJCq Yso8NTXBOLaxMTfE7P9iSqHkVpRE6cajx0Pot1LCDYyHSR+yZWdIRWRxV0nceOEK NTJh3Qy/Gu61k88mjEYDpZ3sMb8O42ct1gp0ofsY0S3DXzAAE5PTsH1jhLbLcSoo 67M8QxSMEmylZYTpYVwZ/xtXL7GWzkIPIX5UgzgUhIgBURVs4KXILSwl43xvR3Jg STN1zW42VhVIZ01Z5/Tla5dwpA4AS6uUgiJ5oR52Fgejo7Y0dKJPvf/oKQlpqyRG 1RH5PCST/glSg7w4Tyzgb9erX/vGmzE8+clHX4Rb19s4biuga4G6pjPhGMdjGK1t b39/ZIdK2TjuAXrnAWctSCmSYU7WAFt2q2oATE9MWBx/jblDCRc2/oHRWdq7tsBu FRHamuKZk2CUqIO1OYhjVFVRzEaLncEJMSpjvU3rdq4AvloJiVsyaNfya9RV3aZ6 wDI6u8eANFIaaQRAw4DJeSpJ8Fkcg1KcqUcAyUEcj3YY2autDYzFGsBklxqrl8is Twv37/fBAGWgcW0hpLdD+HSRdond4RpVCIaHp5DKHFOqrSWuzQH0o8lscobftaUm 6tlzPiW7IPQAfPuo8dh56RJyCJPFpmLiSye6520Yt+9+78Pww0fDYQ5QdAQqtiXx KUxydV0CY0KN1b4RwC12FzY/l048eSTXmPgzs7QV7ty5j91gfDsvw46dhU8/+SQ8 GJknuSoBmMOWAgizYQC3KRX0+MHD8MkHPyLCUMR4NIbUvSX+LaFuMiWfdhZCW+Yj pBalSBNghgEgMt8WqTcBpLOji69OEr5aAOmVrCNkL7RcHUWDO8HzP4YVLYVFrGfO CfzWsH1GT4xkFRQxB7Fxi0tqUgFnzNM5JCYr2mzWvrrHNOqmapNq62qJoOSTlU1T AWy0rNXCHM0yCGfnsCekQ0Tskqkv+DCZV8ZWXbbEQVMlOlMAaoKoSDG2vbmigI2b slvMeRvRZGTlMo4JwDasb9I2odVDKppo02gRi70+Zi0anl9AgzgzMoANovsen62v SA3X6xkzIjspuRUAi72wRxJbRj7JftiWrdWFUFBuUiLAnHD9HA6GNpmJS1UEolKJ GjSjaGTZEx27Alixc65fDa3VDlKw09U4EcMDI+EJrLlO7R5AqZS5r3M7MsnaYj82 sXYHG5LGXlNPtMOW2KUQA1bMOea622qp1wqYWoKU8T4hbU2fD5WAoUOBFnZACYUV EipxQMDr2BKAGnvoFra/GF2oUbhJGHVrCVtyTofAUlhJjIVO/CZ7lk7xFnv8ApVQ TIiWAT7jXjJ4BpNTC4Bq5i9roAopQydOXAXOcxI2zCoGeQBXO6SlAbrdo0wUM/Lj WCWxLx07tuwB4hj3HpOkxRey5CZWLkDIyNC6RyaDB4xqiSO04UbEYvkz9nGz9I1o NDS24lg0xooS+TCoyv1EQUZK/dl5HqsIAEBNvpXw8pwZkE8FRIebWXdPJsfC50OD tJNnzkFQZBM9zODclUS0qkvKcdL2sJ0PwzQRi3TscsQJnOMUG+S+s80zNjcimftU m2pL8XOcGqM8KZB0Rt3S+Ndk5G2+BvqHwvf+/K/CJ/e+oJ0tDWi6usLXb74Svnbr TRJmm8IZgH1tdob9PCB3aiXCWB5mIRCmVhYiGK/AyS4jIsNDIE9hhH1ijj0vgwo/ jazv7vC1V28QqSxEQodMgTnpXRshtEb7BSyVDI3wlZ+fv54hxmeAlN36F7yeYc5n //zcB5797U9//xyj/v0v+M4/5uvvP3vBzEZ2lrf8/U9BLz88/94Q/t7uWricUhRe fOVWqG1uwAMyBEB4nwmyBzDSK7KW5kVIm3Z9PAz1SXZiUhPKEBB2yIneZJwogDMT g/Ky4W4ZLPWkZg3K5lnGSs2OdfScjDIx88t0EQE0C7TVZ6jd3ED7J2Dl1ITICZvz plIAk3v2mAArm/s4MIjm0VYtAgDVfNoYwPtyEto+UElAOgulDMBrb2XWa1xEhppk C04E8ACjMoxfNte6jtd8wN/oRSYDiGWHXfzZGFg9Y1lJDZR15aJHyN9vYjTWYLes a2qttyo8njI675xxjgXuSd1vrPEaFxBtiAHYmg+rCFh42PJbyLABtWQtcg/+bItA VbBtddXxngS4GTAdttuzwUIOxmBhETE8x2iknaICe5+VU8AQUYJJquboyQAJCWwo dYSTTUBjrcNaFMFy8z3PoATGYp1FMcYGn8a1b3JeX5cBPaBhEmtGA9x0eOUy+r7z vfC9j78XPh0aJmRJ1xiul8uGXWcxA2Qra2pjuSrDLhs7HJNKA70P7hK2xvBimDUS 1nq8qIbBPbOwNxnvFTzM04PtCIQVzVsuqwlA+SvvvB/ee/FmuAoAaYHpsdyHywxL x+Q9D3/z4PPwZV8vTgq1VlmALkJZU5nLTRwX9blKFwy5yuQdA1As1n3Mfa9iyNWS zbFh2QUHpBi1rw2VVdQobYvGeXhhLVzqbCNsQ41eZAU3KQKfD8js6RuERc5mjtHu dGQiXAWk2inJJJp0dGwJNiQzVO0GZZH5XEJxtkJ+4cVuHJj08OThY+6FGptsttsw M4b3qgB50/MUMh8cCO+9dJWmBCWUYnpChQBAMIkzZu9PASRfvtKEQTwMH9/vh8RI J9sXiQTMulUVTJTch/VKx/BZSquAn6tgUN59ifIqgPwFwsyLCxsx490M792NZVrg lpOgchRuUxDdGqav08zA6MMYzG1VbYJQZBHVH8jAh5l7+cbV6BD2sNmm4umfMo7q 3a2k4KY5RuWAR4MTFD9P4GQdhoePB9CzwQAAMKcnxsOPPn3C9/U8n2MY3aGYmNZK jVfLZ03NrlIYn9argKMeQvLHaLcS3PciSTN3PA4JKWq0hwknrzGutrm1huLYmOCw I4bJ7j7pD73URW1obWR5kcVLeN4Qcz6OkNIDu/B0AqAzOPYAiV+9M2vhN79xK1wH wPf0DYVNNsmraFxzUk7oroUeulSGD73jHiFX9NbNbfWAijMSmsaxUTCQNWgYsR3T MGfs+tHpMUQ6NE3Hrq5WHKJG5CdIHnA2WztouwgYNDRYXgF7CPuYjoM1v0DWOfKF AyQ5llJjCYcMojPWdh1GxnH7S5yytCJq3tKSl/sZIUScg+42G1uwNDEa51waToy5 Abk0iG8nLFhV1xjD0cfUYe289mKobLqKXcVZZuOtbemOzlDSYi+gL58qD3XRFmyy BrXzgpd6QFeitIgEHiqW0KVL50hmdJ3N2qRCnXujKOrTM1iHVl9ppVWvJf+MJuUR YVIulsz8TMCsKhuxaUJLbUXMBD9hQy2rQOrDWs3FoUxhTDCxyBlKaHGaH0OtBzgq K4DjSRIErTiwTsKjus587NYJcwtqDnt7AXosERg15LCJGbCuFuM/hu3MZbyt4XzM NZfknIWGfLSZlM5aJSltcYmyUVyXkcEi7LV7imUAiSNh/7GBm2MxeamYpLYMyj8d sBfsuy8tTaMPXwtp2cXhAIJke2kmNgEwtLsH8C7GBrYQpcyG0GAIYh3imbFxtO2U 5sMeqbuGLgy1rNs0rrUIeY2JmMsArzrmuwD5EPuWh0O0t7FNIiUd9qjmYQg/A4bY MnuzSK5KSGbTQZidnQtVjH0ZjOoSjrSa3lQYjV02AquwnGNbtEmpSB0WGUcL+0vS KN2T9U2GbMjDFpisNUYjD0Y27mOSTGlIjcqIqmmTrQizxbjk4jSYJGq5Qi4gzlcJ oFnY2iiv47wH2FbrVqtXNhHvmD1cWVUBSb25hM3mGHslN+4Hrh9ZV7YadhnyNwyr Yd8sGefxjZqal6EEzCTUHOaLkjk1+tpU9651nDiTlk2wysAZSrAXtTS1EWUz4z4X uRlJfiTIWfvXlvCxNTrzVoCurlPmWM2x+5KMeSPz8M8+wbEcxYnFfiWqWCOQSMsr i9RBXUDgROczyI9MAL/lNM3NEdcobTCr2U5hVp9RoiOrKvmXhQQl07WE7dvfOuS5 rYYPP/wk/PWPfxT65iQmaIoApslhzBNU5CF2iENEt0bw1Rk255gygqfMN2AXxyZ/ gyhpU3MLEbf6sAZx8ODBnbBBRYFmok0vXrocUilV9sGPfsJagIj8xjfDb7/+tXC8 RrvvKPmxShEDrrHxxWX/DGiMv+K0/+BlBP7nXtjAn3s9B5XP3/gp+Hz+Yf9GlMJ/ nv3z7KM/exUmcMV3I5i7OObFz/5Xat4yJ0dLp6HlnTcIsV2hDWMNn2X8ARibeN4C VUuM2Ed5lx52a0wiwZOTzs0vygUAi16F/zM0YB09u8mYTSuItQuIL5MyOBQvpQA8 TN4zs946rRZtPjvme4zOKZ6p9QFcILlk/tmbVx2tbKRNAfKZhIcwM0lsRKu03DPD 3vp+zA8MNKEizrFOTU2I0Og5mllpjdATrlMdqJdQDF3O/GLyXwjJ1d+sATIL2JCT MFSGudQe+WxzAD+WicpM5wJYXoaTcgG53vUC55mHBWkqzyer18L+eI94pykkoisF UD90QNjLJAePwywMp0xea9ZZU7MGrazlljYxxiZGqZndAeia6bhEGMLNIRs5wt4C 2d+MzSbH3wSYxsYNLEJBe3E+hpr/7bCRN+PxVsBQ9WOEUjmGnVUWYNsMH9kOcwFd UAEGtLyqODwcGgtzaIRe7Ghh/ABXGLG6luZoGO72jkWPrQtgU59hJ5Ncwrcd4aCQ ItpYmenpcTpkLce2hblqWkuoFwjzWoi2K6sCzxInI5Z2SsGLxwkw4xe7EDvsWPpq g9DYNPohW7gmY9TK0BzmcD+WnWlAi1kLc2X7vXV0XBPouh4vzFF6bQojtQ7LDBvS QGY/9UUz2eiMNBwDuFcxYstb9BSHgVC7lcN5U9kkjwkXWusuCeNdVYYmEQdMBkBr 6QK1iPYuRvlkncLSOAIPR1dC4uZrMWv2bz78kJ7jMEIAqrU16q4CZPJhUAZg+B7d eRi+9Z33eUY4IYThSvF4bdVnsXtZ4wqyWhcJ91jbuAKN5wo1G02sa2prhdk5REO+ RBJGY2TQ7z95Sm2/csKeCdiPFdbYbvjld2/FsNQXD3rY9Gtia8zRyRmYk+LQVFcR 64MO0NHqLVqiqjGdnp6njSxJYmjTJtErGhHo4Hg7bIp+rgKdegaG+fb9XrJkSzHw 1ejklnAcDmAU1aNSfB+2tw7Gub2tKTIps8ydru6uKKkxTF8BWLvM/Y8BomVKmnnv FKM/PD0XXn6hHR1tafjhjz5hLh2HW2gLz5m/QxMT1J2lUgGJPAMDY2xGp+HVm1dg YtfCk57BcK37Umiqr0L32UP3sLVw84XLsJK74enTATZiyvKweS5Ss3Aa9s46qTIn jymw39hST3mwenR/lEdiI7zyQjfjTI1Nfm5tKKc+Z0UENBtcSwvgtro6ETXDn8Ay p+I81vFMdgCVQzCIv/WtN6Pc5/ajHsLTJPUBfpdh/ObGxihX1cx6IflscjJqcq/S YtaSfaODI4A9wsZsdCaJTo6Oozcky7moDDCyEuamxgGBlbBA6EcBoTqcb756E3Up tm6nN2ycE2IkQWofmzAH2M2EWX2VhI5F2Op/+9ndaNMKKhKE5bdCDttlUxelvNKx GzgBO8sLoevaC2jtkZs8fhx2AbL5zL8TdLXJ+3RxI8qQV96ExASWbKQvFDVcZVOk U9rj+yHMTyDhoN1tAvaRzf+QdWKoWUfckOM0c3aN42+qaaeJR1FuMQ7nbgTqXSQN 2UBln+iR7VYtG1UIYLSiimAiJZPYAHY1AUgtyBUMbQDYkYtgb7VPJv8ks64nmN8F 2KRk1qGZ4OkAtVPm4gkOhkSDFu2UsVQnavJhDusvzb0IsFVA6NyqN5IV28hwMgEF GewxK0TDSozWcOwFjm0HwlPA+Cl/a7nEjc3JML1CDXLYaHXSynKwSITXc1g/2Fec /1QYq8Wp22HBfSkXIAQQbCCh8wDneGb4KYQWUT2ucWViELY9I7R0Ma7IjLa2sO8A y3S0zynY+qZmalljf3fRP+bjAJ0C5gyTWyvU8mtmir/U0RmWYPXOWT+pjMk+n6nD plXzLGZxUrKJUOXxvAfQNhbA+p0h+0kC/FUDSE+5R3anCIhlyTdgBu1MuUa4OQVW 0PJce9jW1Aw088vkI2gPmIfHJKouE0krYW8yw76mhoRa9pxH7Ov5za3IBZapfrAV ShIwv9hEtdz5gKkCateWAeK0x3mASDtiGv3MwUEYPqCOMyTKDvvnJg6GxM4M6zWd vY23+SygjM+fsMfuwvIesfFaraQMlr0YZzSFjfuYdbQHkNSBspubdb5tvsOH2TeI vLKPVvJMl5EhSh5F2SGfU9O+hX0zyiu7m4WjEkkrjm9jCmWIDA9RBOaquzfHYHMC m4AzABTquQWd/qwIUZDemFIWfnD745AGxnijoSkUEik6xNYZZU2F8jzB4dog4rbB 3GvFlpfgsNnq2+s2smcU1giDmhVLSCKGZv6dsxYmSLIdJd0CPGDVIGxeAudqHwzx IVGiP3z859EpTOTlh+56mFLsmfuNl3wIMBdflbCuyrmeRZ7nwEAPzhTPnfVTWVVr J2HKTI6QLLdENNMGRfmsl3yiEVXhKhKpnpVZ9jsiyBKJ4JmYF8WxIy50c44vhXP/ 8PULQasAMn7Qb/zy9ezfXwReBZWs3/jFGeNN+W8Etrzh3zz/zN/D6OeX4r8XJ/JB HaGvqkzKD6+8+QZhpxa8E/oLM1n3eOi7PPRUAIJlkgxZS6WX44XHbEFAbQ4TyQFN x2vU85NVLEZYno+3LWu5CwuZj3fneUwQUvdhWRVbr9kcQM/HEHYK59tYZzIDQrPx 3C1JJRAxnJ1HssIK4HEWDVgJG64TzGLQJiJFDSyeaSY3a4hgHSOWcgog4aEcAoIr ATT5LLAzwIkEuPU9zZw0VKMexsLyJjHJ/miI1TMK7rxega7zzu4cAq5c2E2N0AG/ VKNrwpALT4bU+yrCCzXTcJbC24rfreVqwows9RYe1z7lRXbZdNXEZOMpmQClzs+F 4mI2Ic1wjmEyReoLaJzsS1yJ2N12iHqF1TCoU4D3KhiCSsKnExiGVK5HjeoUxqaK BVsCczAAI5WBIbza2UDnKsLv3ENDXXl8BjnMwIoyao1yLvW6V0iCcZELhC+3EXKl xNgs4bzGhkrCzQXhFJakl8Sgrb4+ADg1egkdVgMcoFlge8Zi+8FT5sUOIdXp6Qlq sqJ7YgMqJKRVCDhOg5kxszeJZ3yGwYrieJyOpHTq07LxrMB45DAfKmsArRhr+9Rb /irNcA5Zv/k4EIbe5/j72097Yhmk966+SH/27tDYTFIQbLHjfcTc22RMNwHAauES hHJsNen8VJIgTWt5nyXAhK07LbGjYcwi0SuvtAomw0xbnhWGJZ0NohSWbg4DMItx aGppCeMz1Jhcphtca3OcN3dv92HYa8MShvoJJeHUNpqgNQobdsAG0Eo3K+iYMD40 Sh3NquiAmIyTX1wJqEYCwvjXAwzLAbarbi7MubauDoASLDUZ7JdgaatJchgcGYsa y+sAJUsRrTIXLgPWikkKtBTLDqzuIh7/FKB5ehXDmknm6gE6W+ZPO2vPouJ2/5Kt dBzNJLa+4/Vr3VyDQH0tXL/UyPMqCoP0s1fj19LWwCayjwxgKoakUtjUv7jXi0FP R3bQGbXQ5zDXV7j+bDbHYcBaFdGFqx0NFwlFMEPvvHadtZZCS9fRWJmgo70RXdpc eEIVg+9QzJ8pF/7qB5+hfaWOqhn/bNIP6eb00s2rsXPTAxLg0nAguzo7YMfoqgN7 39VJwW3Wj52zigkFd8GSrgByJ3Ag6gFTjfUA2MlpwrMb4T3a2TqnH9zrj+HollqY TJzhoaHhMIYsovtKJ21vZ8JoL4COTR73nfA7xfhpafvue6/hQAYaFdDSljXfCBBe xBGxdNfla7RsZW6P9g+C/dB6w85bU3lmGtYN0HPlSke0k2OjozhIRaGxtTU2Ihgb GAjZxdoDdHyAj1TCo5WAjPzyBJpkqkrglNXBuKeeISeiRNzNmzoANeH+vYfh33/w Ufitr78Ji9waM/f31pdDRlEpDgod0/YoWbWJ41fWgM0gqXB6OEaZSurb8I/PqXBB 3V6c3upGxsrQPszxdunlcH+MJgdnPeGFghZsSRXPg7Ah7KURqFIcD7BhGARQtbLm s/MJt2OrlGfNYBtkmosInS+h3Ten4SKbnTAz82OZ+abTfZ35cMKalXmqra6OkapV 5nYZ8zA5iTJMOMnLdIIC60cdfQpAT+oBAABAAElEQVTeYyYSnlSY8BSeu1rYHSJu ttBVmVhEaao66nYWEK41/G+JugPmr3rqApyPXaJd+9hicxUkWqpxFvZ2N5CM9EYA u052/gbHOyfRyj1pG2d9uO8BCVUF/D1ljtjMzUnQWTo4Kg6bZwehZ34y/NavfjU2 /ph8eIdWyEcQO62wvWsU4SejO9HFXldIbc0l9gySjFgzM5PIuHDgC5hTlqNrgc0u wJaNjIyT3GMzCiJG2J9cAKlRljWAT3UL0R30k7KhNY0NaOipJYo8oQywuIgjOgcg exu7buLoS6xbk1NXcfitE234eXIK/T9SDXvPj/J8SipKAbWwrKzNIvawx49Yu0jV 8nAieh8MobXMxPbB/DFOhbx/wpovYK8sYE/cRNeag7O7h10w2bOsvCQy65k4+ufs +Wq9U3CQlHZlgwUKiR5V49CtEd2ynFYG91oKiFf3XoT+tJg9aQe98jzJyxjO2CXP slrJrEWTUY8ApHabU2B4gOOTxHkKIHdsSWoClZjG5G/ZBaNnJ2iqrUet3KSY+5EE sGqAUUs+zpwDxPIMT4iGFTKvd2Ap15HlMA0ZKzZo9oJM8IzjRsV0cIJzFJaXCS/Y 9HwmcFuS6r/78/8r/OHv/lfhW5e6QhJ60qmJ8bACYSd7LYljIpdVQTYgDCrYS/Ky Cy+0tdzLGQz0NmMyv4Dzynpe5ftTmOT03LTQUloeWi+RKFpSElamF8KffvGD8Mcf /SAcsWZSN87YRy/Kzf3TX/5W+I133g6NNTWQcZTXFITz7LlhpCtIWSBT0rhPW7w/ QjokKq8BL3TXIg3boBvel31hdG0GB6o2/Be/8evh7uP+8D//4K8ha0JohC0+RroS sSD3zASO9y465GH8/Yvv+fjPv9QaxA/6z8/8wT8EoTxWUZQvPhO/i38G/uaPLv6M 7y/OHx+yD5r5z3vxPxd/65/zeT0OF/cybdZ+81f/o/Dy67fQM1H0GXb1CDAmzItZ 8Wz2B3jDZv1lolex5louxtlAsqWeLHmF84mhJCyBMdHjtqYec5EQKdnryTxkJpih fvsQW/LCyXgIODVeb4FhLZcSAllX+7DbuWgWsCVTJFjeRVtTzQKwKgGpXYSb8Cb5 rMlYluFI4vM4atwX0gHOZSgw/eLGAZkcGwYXu4e3d4xRtvsJIBzGNZX7kvm19IlZ hWpzDDflII+I+p8jguPJhLswhJMkUFhLL4OQq+DdbkqWtbKAc1OiKE7gTdrVLgME M8/wfkpqI5BX42u3J3VvuYyVLSNlqldgiHO4Z5+9ImnBlvqIIhb5kc8wFHFv6FeY 8NtMyq56OjFxHSY56Bj4nPAVouMwx2YlKJNlmIC96x9bDNcoP5TG+0WM4QnMkYlY GuVKGNZVHAq1w9cBHWZUWlpIQy5jPEcFiZb6MkqolFFQmdqMSxRO30XXShvDZZyC vLWFkLtaiKdCkX8MXCmsRTHsm890o2yFz6yR2Y22GMZnlcoAkykzoWiVEDxj7YZS VkbySW0CRiYVpqsifPVSdyjqvBYaGwVAaNLQzxp6jiEowKiZjuqMZR5XdmBRV6mv WV1LctIVMnthVXi0Z4BeE6z8zAbnzSF0XwsQLeRfQgacGh2chhAhvW2At103OCE6 HfvLMAIy+ge0WHQOHyWFKzduhgMM05P+4cg47DD/5tgkDCUlwf6swfxawqoaNqK/ fyA8HV+lgPsV5gll3QAkNZRXOoFJHaZ4/zk1HgUBe7AbJ2S0nnOMJz29aBazAV0k RGEMh+gj3331CmvrPPzko89w2shoJsQ/OkTdSZjJq210WcKwPu7pY8MgEsD/fGaG JW92VXFsogSwD4k6wo2M0cIMGxrMtV6/RdrN9rcr1Sps/hT60deutgFSKfgPg1Vb kQ/LXc6zV7u8i1OKMWNtDPT3khCRRtZqSxgcGKWl5jbtnLup0nAapgCpLBdAYjXh PthIruWXvvJSDAcOUu+0qaGB8keAmqVFAMZx6GhrjkzKIkzaaze6Ihvb0/M07KB5 vNrdEcHkXdjfWoBlDWBlfGQksn5XWuthNfZCP4zmVQBqGTKHJx9+ycZJctrVN2I2 8f0HsMaMbxPAd25mlmYNQ+G112+wCdHedao/2oYKmEBilDi/dBti7d5EBsG2Fb7/ o49C7/xG+Nb774Yv0bT2oJF+5dZLAKxkrmHq/yXsvWIszbIrvRPee+/jhskwGeld VVaW7+5qw2ZTFIWBRgQhSiMNpBGgJwHCQA960OhJAB+GEgaaEWbAkTggxaHIJtns YndXV5fPSm8iM7z39oa74SP0fSeqSGrYA0V3VWVG3Ljm/8/ZZ+21114btiIDNrc1 eh/r3NBEg10DryUr+hwZQxHgoA8bLUfazgH4rnFdlXPo1ZpENtHV1REPyaWZacbP lsOW1XHf8K/FrH4VTWs9Oj+B3TYWSHZop3Fvp0lSNK3/3ndeAUTkhul+nAIuJHAw oCmNtbMwPwozvoMl27kozVgeHaBBEbkT6392bhoGEX1zayfJYQFre5bkpzicu3g5 NqgMA2iLqIoYvxwJnF+OrZWsC5+TQBdjpG4INog5AWsLU/6D/evRNq+c7+2jYx4j 8TZeuQa1+1Gesk0ckGioR9YyhQm7fQA2SToS1DPGuKPv8T6JdAEgNwn4KkRbSv9u 7DlIB3jKTOUjUcoj+B2i485IB8AS4FYpFTcgmWjin1yeRxs+HRWmiFPZsLalJPCa 40/Mww7iAHBMvHCaYG1mPjMCIE/QYx4fcVoRC4/xeM0txaKKGOJEJFnkNJiz3T1A BmfCCe9vbY/qX3EfoKQm9LRkh/a2Nqz0asLhfHm4BPN1ua+bKVcT4VEmfsgNaEk5 KSLwgjHMBIgVwerWATImBwYhBqhi9bWFdO7NCedtETrbDGLOKeDwHAnKDIlPBslH PUD2weDLOOHIWVRrMNygkVDKfdoGCCfakWfJFEs+cGZMT0yEWdZXz7kOwDMSFMBf HRKe7dUlGuUyAYrIvmBzyxksUMZ9zeYgaAZ8qls9BRQW5ReFxck5mNCyWN064F7V UwXJZa9tcp5eJi71A3CSsKO6zDgIwgoq2DlsonvYRUsuwdJHjFnmLOZSxKS1tFDg x1+Il6xoYnAZfQkOlVijxJ8Zupob4roYm8Rdhc+XQ9PgKfuSE5vlx9lPwmT5Pp/Y vM/aWePc1EJT4iFFQnLI++dtsE6wjGQdzC/T/Mh5ZnK8AemUCS4phvApJMbn8zmO j6lP0PvCSB9ILc4f0Je9Mp4VO342QIqDDuwl0eVHmGDzaWw4h1jpKKoNf/Lpp8g9 MsIr6K8bm1vDMlrWJORLbLTiTEvCuheATXSesCF8dXkJkLqKfzUaYOKN42CVPOaQ UJRw/8VS0+yFo0ykd926bLAmSSIm2TPXyyvDdy9e5HFF4WfIyP7Nn/5F6OYcridp LkKDrF/xHhWBdIi/YmJ26TFVNZKaJGdyARM4HSWcwzSvybkk/tqDYRnZXaKlIVxq bQ9Zx6ylhs3wKzSH/hQCyuEbjmF2X4hlItEZdzUXm+/5Ff/Dv34paJWmNQh8/eD4 G/xVvaVPFsEr3+SPEZSePacPOPvZ10BVcMp3eNBZ2TM+j8/L/8++vvpNLqJ/0n7j zo03w7vf/R4d2ZSSuNk2dTguVGF0HjcuBajcRTgtuyij4N/1bHQhaU/h6DvflBn6 KYBTD9P0PTYKv091gL87uQrDfX6uFZWd+2qI1PisUE7apLxdSQZdQ1DahOWzwUAM bzlfBnMRvavsZAMd9rKwjozdAnC5aJzhnAdlkyTjF7DqB6gmdQu9q9KEWAJms2vt tE2gz4E9LQY4p7O4ZQO0ACkGhJrleeOyeM9mMf7Pxeb0IEv2ds2qbU3CmJYeZsUA vU6jyirP6XQXp2jp7bjJAW0jWKKpDvBCUsAms+lIsFxFUK9mcetokM7nyWcT27BU 29EYS17ZCIr0gCNGYLOB/gxti9dqCQYtUVdFeQTWkPdbhF/qPCXolRUWZD3egzyP DVVFMAZqg9eQYKjFW+DnssjVLPpBLI6WACU9nc2RKV6EnWqiiUhHhVmeS8NjG3r+ 6tOHdLDSBEKwWeb7w7CMuMDhS0eLJpl5aQHTr+iehuomE0UgDuDLJGM54to72MB1 UFUO4K2sinqeHYD6AfdM/99FAu3q0jIMINogxkOWwEymyMwThcxyp9yntnqTDZkB AEiXcWERKHE65XqZEOluMbY0GW5UUBKGGbEJTJuv2A1J0N3k4FyyuYbmhXzAXKVN V2bmBAlzvTQOSbVVdvtmIRMo5n3msnaOD2FfeEAaG9iGsgzeVxZBf5rJNRnF1aGt iqx7lZGdZLYFMBeWqVfQoZ2/1EMgZ7exN95542a0aNErTzN3Z94vwmamaF7pQwsr a7nFPeqlkUm/0TXKdXuwBLJWqwDgMkCVFi5TI8McBnuhi1L2tLIImngqOYg9CB5R RtcK7vI5Jl9RmhqcmI9la7vTH4xRhm5pBEg3hftPnsEeo60G9Jp82jjQCONeCjMw jAZUtrQbptapU46gLKtqZ684cjEZmZEK2N0JNLTPBifD7TdeYT2eRNudWjRl6ezf +w+fU+6fhnHvQaJyBHsHywOIyQVwWPpfQU91jiqAOjeZzloONhs/XvS/jPHqytVG DrHl8HBwLly+3Asrz+8N438KeGgGGNm004+U4cal3phw3X34hJnxMBRop2dIHGUu HK16zPp48mwItiCdRrMEAeMoDJJA5PDZBdOjaEU/BYi2Ahztdl6GIbKi8Cp+01Zo PvvsXpiD/fn2N+9QXTkJT5+/DH28phKGSa7nJJKBa9hKVRJjnsKQ2zSh9CFKGp4P hHIOjc5EK8woicrpfrjMvS2MTPbqWdd8SxPXKweZBokL4LP30kWY+mRYnEVCwNot pux/SJweBaDPoZdr7cLShgN6dnw45ABu1zaPSTSH4nu9dvM17h92UrPT0Z2iupUE jz1rU9oGzG1T98XoYLDAQVlAImjDn5OhyvPSWX+3WO8Z4dGnH3JwpxFnSWxgdbeO AQlVlDZh+tX8Z6LbXqdHIIkF4D6xT9kXUATGsw5ZCSweMSWPNeQ4bnWr6tFb6rCc Y385rrOKn+uIYrNlHQAuRWyT+S2BCLH0PjyFzRpMvJrzQdah2nf3pQ0w6qi151PP KQmyQynUIRMlsI2+9yyucS3vcQMpxwLrdAVm8ESigX8kRzaIRVuA29aeHvyWmdbF WXNMom3puJDm232cVE5JCLSlyuReWOWArqCUrHf0GWClrMf/kVPBhqeVNuKR2h4H ObRxn7XtO+B6NSKvKUM7rOVQOTGogsTviGT+mCQzl+fVVlCGt4aKyzMSj0zivQmx AyqMb8dUzlYAOfVUBcqJzaPEjot9vSGftaX8oZcEqZB1vQggVdYk01lIElkLYBl8 9jKkI5s6IJaMjY2GjAriMODLznrH+Dqq3IEiRbB4ygX22A8EN+7nJoC2KnptTy/O xoEZ9oiMLiH3yKSZbGuDTn3ANnt7AS13PhIAm+OmuG5HgPp0kppdwNIOsXYLUOYg jR2AsjIFS9+SMVW4O2jNyMKBbKBySVzfNQljn23yXtbQ8qbhKpQOaM30nKTy5plR xHrPpoNsH9SrXWIu54f2WfaDKA3TSchJXBJl+8QqniRaUQmjqrg+dtw7+t2qbDqV i+3tNKRvFTHh10PVpuPCMu4TDOXpCjEEeJwPaN3m79vEYc9UkzQH3igx0AYzR6aH 59MHvZZ7sjQ/Gf70y8943LvhKtc2F1nHNs42B/sMp1AWx35Txjg1gzYZLe88ifoq nz+Lc0/f4k72Vznn2xZA/rMnz8Nn4+x39qa2kD94/bXwzQuX4rr6Xs/F8BcTT8N/ /Oqd8K3L18KNRGcYuXMr+nB7v2zEkx3fYf1ooXXKNdEysQhSqp57JkFo8+PkHFpc 9DkNrTXhfGEXpWIlAzb3HaG3bg7/CEvB8rSi8Hv3PqaayAAi9NomVGLMs3q0wM69 fwYbuRq/HLTGR3z9IB/11VcEodxc7kq8kBFp8leZ1b/+8s+84BmwPQO5vDoP9c88 in9ZJvKP8U3xdx+7BYPX3toX3vv+D8KVV25GY1sXG7/Kx6PBCqB1CmOo2b4bWx2L eqJtFoMMVaTYyUxsHBJcoj4BJLHx+bNgVvuoHILKDhtPwOeoR8XSivq1odFjTg3V Fs9VfEgQBxRQ2Y+g1PfQUqNuKY2uWXWlAlBK99wYu+YLCHJ+ZrN2RcVLgEctrhow yXZs6hHBypLwERtOml6gaze+nyGfz5NJqcguU7sCPZQPWPgytin+bIliC5C6z0K2 4WtVCyFeq4aD2c+dwZ8VphvYbUbjw/pW0ETuoxddDbXYctiks4SYva5StwR0KBww Wfy+10WdTSWAJbLZgDNtQNxEsr07gHHdEcrQ7bqRBDvnKTPvAYAXeR9VAHvtnFYJ GpUEFtYxz4MUgSzaMtoA7ElXM7YyLOjhiYVQsU9mT6CfoixbQsneBjJlGs49thnt CWXobK5hK1KA+09eRMlGDsHjJfKCZcBvIwdRwyklEOyapicm0dOg5cvFx4/DpJCN mk3mf0T66v3dokHBz5YGYHT6Ri73ukYx/5XLcYrIOht8Yxm2hc95ynU/8OBZIViS ZR5SWpuYGudwY3Qi2Wkuh38xHo3KPnIIEt7jBMHhvc4roauuFUBWw3W1C1Jgy0HJ NdMebI4kbJFg0IcZeCnAOxPQale1K18T50MO2qXlRa45bAqH4wkbXtCXyXuw49KR iIcZBWEYML7B871yuSfMzkyFjB06nVvq+N4WYHIObVd5ZPpHhrFwAiA102z0Vz/5 hHXH9DI0SjLgTt/pbG+llJTDYAOaMTjIG2ERR2CSnVLlgTmJFMExms2J9jBHcqJD wetvvwU4zg/9lMD1Bm7rROIBe95Px/73vnk7DiyYoczbTDJiOdCufNdVJYf/ISxr FeuvjvLkNuBXIF/HPrIrfphGqXH+qcfNwHU2AyiogQ2VoZ3HtsvSaTslS2PAY8Dn IVpSzbcXZ6ZprGJowTlM77m+4zR8pBcSPNFPbbBOHPvcwCE8PDVHqX6RhiVAOutB Gy5fK4s99+zlEF25S+H1axdIhtbwgx2h5IrHIvqsqakpwOgaZfQEB9xueIhhf0VV BQkoDVTIGowZ3UhYlLI8ezxERofGEuD1CKeC52Oz4fZNWETWwEsmRq3BmL15vTt2 5g6OTMA64d2ZV8xBgh4eXfO19i6AVkUctKATynvvvobzQ2f45MNPYhJk6fUU7abj S/XMPGVtL7B3VoiVtRy4ToMb53onqTVeJTlx+Ij+qtUwrk6Cm8JNZRY2uYa/2wS0 yp+XSF7q2ij5sgoXZiaplJSgGz8HI05VhntujClraEaDSPWEQy+L162sbw5jML3L E2h6Kyo4NXKRmQwBULBa42dp7MGluVnWDgMUOrpgmDBBRyNew/OkUV7formNToVQ eb6Xz5ATBtGx2pXedOkWIIqGPRqKjmD48lirNu/kA0QlKmRFncCzTuwyqa9lAIVD OByBWUF8zgUEtzTA2AH49AIubCNp5oDzvJDVXwfA6H1ag+ZOadkma6SC728Qr5Rv 2Rm+BQBMJ+akUYmwYbIeUFvIOt48wudzF8cB4rKNvqNUC1pIqqsBDvl4gxpbfH/k 6EwuLAQwUIUDfKod9nzKhzWU8QVNcEaUwczB4AF2q3ns8pJsHmckAFunGk3393Fa UFduqbqaBFb9Xw6Sp6J0YgGWW1Vc92skPJUFAH5iwJqVKp5vhf0/QxUwv5KkRBIB MkLgswXQTHFO6TCwT+JcQnyubEPOQty2vG3itL25GgGCjZObgJtTrkkTRMs07FzX uVbOBe4rSZmAh4+Md+tKqAAopwPIk7DRvUihHABAxg0xgYvIEtZUxKpy2H0lYrm8 ZxnLgdExgGol/p3JMEACWotV1x6f014PxxBvciY0A16cQOioYBooYGmRPLD/aqmC LdLgtctnKwckWVnRRmqfuEx4Y0oXMjP2dD37QYcQm/OchrWODttmrHwqVGvsn23W xTh7x2qsksBt1rm612Peh+RnGntIz/aSQj4oldEc4iC5Yzyr84ifJphVxGVL/U5l lB21GU87MV1Zor87GMJETCLKka9T3BfXQxbJguSZtptlSHmysfw7pQK2j8ToEDb8 EN2ypJoJhdrOeEKIkVhfVrMlMU75XHqnV3ANBsdHw/9Dle4IMNlLEtHU2gbhwJpg ve2h4Y4aVxMhkhnlaiYuldyLCiQiStQKYfhnjhkjPTMT/vDLz8M3bl0J13nM+198 Fl5Ojoc7PZdCX1tbeDI0Gn725Gk4V9cYbhFHL/X1RLeMDeKzMbKc3ykneXVy2wGV VkkMrUbHSAgncQ1QY+0AqFLOzxLOXqeWzbFGjri+DZAHdeXVYArcZVgvl2cqw7Nt Gxxt4o5A8Qyr+sevvs6++/8DWr9+8N/+r4AoPml8Yn/CN+LX2X8jHPVnPpAvqiNf AdSz/8Zv8i+ZXC01/OE6N68kozS88e63wvU7d/ABK4/d4HZ325wlaxlHlQL4vKNq POzMP4HOjywpgDTeWACb+tITul+1wCrgcTInTjuxxC+DrN/qMWVA2UzBh01MW/hH nsK+OOlJXWwEimQip4BUO8BzWLz6WaZYOHb1C943YIyOADzqcnQisKxeAhDOlAEm EAm+ZILTeH4f44hYG5fIF6NonLhM0MO/lEzuiOxP3Woa4NcNJ8tq95/f09HABa+5 /g4byd8pBvwIDOIkDwKketySAsAUIgn9DWUZfd+WGmoBS25kfTwLWUTOiAYWxUYf A4s6Xmc0ayjudJs5gFwlNjEy2I7Ws1lLBtryS2MtXadszBeP0EUiCbBU4/i+DspV ls8nKMU1o3WyC9bO1BJYIZniRYJVIQfNDq89i/9mKdernOA/NDFHEEYAnqgNI4CW SfQ01y+fA6QTFFn8l5kutMa1maf8ZvPJZWyoMmZp1iIznCMY7NM0kgczmFV8pkNm OcTDliyEpIUkgYYwp1NZIlmzPMVBoM1MNgGoCKB5BFt2CmA+gZne9jEctrsEr12T HbLuFFn/EofCCYe5CYtTvErKaQAAXFVz0NxsgxmiBGJz2gYMQ25mGQfUWRKmCP6A PSDwre6+ACNcBVAlOdgmK+VaH2aahHEvYUXSObid+AIHG30hs3jP2cROZQjzHDBz fJp22Ei9Ju8TeFth30poqFgELJYQlOrQ38rcTUwuhJbX6qOV1BGgqI1ueAPsCmMV E4DcVqQcGtBvAdBbCfIp3rMMVEMLHcFsRSfHOTfeRsPnaD87EonoTzmOlcwRCdJ1 mEiB9Cyv20uWrHWN06vshD0PQ5+kUU/blw4YGuUDTwdeYiPVQwKaH/7o/meRqbx4 vp2y/3Z4SMe+XoOZJFRPaApaI8lp5VqMT80CaBdIYBuiVGd4CNsqGgOuMUlrn7Vt F3N3RyLGl9ikBaPLSkeDOhcbii7SNHWK7vj+faYwtRoYi9FkzcakSludM6eJLeQT fbACJeHewwGiIODy1QSHFMkK7GNzM9ZENJf89JP7NHfkwVomuL/r8Xp3UJIvB5AI kk7ZZ7X1jeyNXYAvzTkcIOkckgPD2ExhH5To7OAQZJ0PTbHuisI7rQlYT4Am+6SF 4Sh5JEArrK3HT5lkxXW40N3JKMQNGOLh8Nobb6BrxPN2ZhYWjYQAYDwH277NOj6H DVYhh8/IwFBYBDy3dHSy5NPD1Jidv8QMQOQcr9E/OIaFVD1JSSM2XtM0v0wgs8H5 gnU4wIHkxLhWAGtVRSVVhyHkOwehvT1B4s7BR0xW5iSgNcE+pfO3BbC7j3XcFJ99 ZmQwNHGQNbAfNrnvMsnXrnQjuXLqGs1trLHS2sY4EWuJSsa5ns6Qg3RnAGnF/S8f hWqabPQoPSKx0Ze1Bka9gY76wgyAG9Uw15vUp2CAtwPIo2+Az5wkCaygcuIoWTX4 hfQSHBFb7Q0oJhHeNW7DMuqYsQ5zTQGX5N4mLaRYxDdjljG3gT2kA4zd3gUclOuL y/wcDR/r2+ZZZUp76NlTPHeOMgHOmBXWntZfAsq5ZQ5YYoQToDSOd7rYDoy9IC69 ENkZcXV0cJB4ckxChzQGwkWyQ5bOs1G3ARva8vKpdhEj41AaE1rOw/oaGDPAs6Of s092QhWvUQ5wlYw55P3sk2gmVxbCHr+XxTrNq6VJKQdrKc6JpoZKkgekO3yefK5T OntvcnqGCkl1SBC3FqdJnjIB/MQnbb6KAYoOXphCouC46x3i/zxx4TINk/t8xi30 rgVUXpyYtAPoKOP1J2BAi0kEcpA5OCWpBReOAj7WIHZnStLyuEegRfZGPWB4BdY5 Faq5PkskQUlASg6A+hBvX5009jkb5k0ue3ujjtdpVybY3uc8EkWQJ8MsGJbCtc4g Fsq/CSC1Gsvkc6RRPbQpqoDPs8keFVcYXzy/srln2nrt894qAOC6NCRIaL22WyRD StqSvP8c7pcOOGICGfdDPuc6Va5T9hTHbqyyesaYEOyBH2xk3iWGZwCKc7MgoDij fD/ul3xAqRW1YsihYpQJc3wOLfxEQ2ncL9dPDVXFYxKUyXHGsxMvM2DUy7gWDgeQ 2VU+5jqNjelcD+WFB5wxJswsNnBNbvjRl3ejBK7w1duhA5Y9l7gwgQ6/sKQ8knNq a4sBwjWc/1r8lXFeSKpITh0BlIEl0T5UPNbF+vz+rdth+5XXwl98+hHM+mK42dXL mnwv/JMf/jHSVJje7F8Nt5DOKW18Sjx7/95n4fL1S+GdG7ei527m7hZShaXwAuJp cHEyyv466lvYn7nsiU1i5zzVCJrlqQ4pk8vk2o4SJ3dIyjvONYT/ouI/DP/b7/9p 6KfhspYmcuWWXk+QW9wTvs+vv4BOf/eLfRO/4oX++i9+hycRQMY7EP/O8wkqudl+ 7wywfvUaAMLItrJBeUj8ij/nTzxD/D1r+lp6WMZ+73vfCjfeeAvdS2OkxvVHFIjy ijya4OUGZTFoFkyCBUPKz2FvNNXNByw6W1gNa0UR2hSAq0HEL6lyA5ZaVAcG+OX7 kh2WeS0ScPISB5QW1Y4579g58JsckFpomWVryXRksGMjsGbFYRzsZHQ8VzbvUVAc yzr8XReDCtilPN6Txvw+r+U/niYieMGP49tclHbO+Zwu6iKyM9nUCI5gGXZggEsB es423kKmsEPDAk9A9y/lIRb1HPR/KUFaxtdhAAZQSxACVT0EFXkrZldWAKRno1J2 4IMKplcIUHq9VnKgW4aahoHJAbitpdBf+v74fec56wtLEhjLxrou2Ok9hmZFP9bq ZkAfm7uVRoZcwPBTKH+bpkoS+BzyuXPZMO3NhbBK+oNitwRLGrt1+X4zjJbdkwZv 59zbPDZNkG0FPJkFjwJcGgF5ZYCM6ZcjobulNvR1tsaO1i0AWDYBJ9HWHYoammgQ QIfHvUiuMDoPwJFPANFr17NBP1YZ2Eyu6yGHSHF1FfeU8g+BSgbFjD6L+5ROkFRj WlBJiYvDEGEaP0sLScpXpQQ7Gi0BZHgAk7HvsOHzLA0R1ApYizsE9SfPnwLI8BRF Z1TEdTpl7YgCazjc7iR6wsXWRLR9isCUAO7n1qze0a5UQaPNTQFs8QmpvXo4D3HL cZtck8GXM6GKwKTdy2cfD0RW0mYtS1r77JsEvqbaYE3ABNkAopZqfhWGu6uT+1IY AcYWLE8za3kZ7eU0IMhObq1h5mdnSMQy8IGFLUE/Vs81d4TlMCXkVQ78O7eqYN8W oyl+ovNcZPInAT9ZrK3z6EJ3Cfo2yTUhP8gB9K6xrmoISrVcZ0uG83RGX4VpS3H4 JzmgW5pq47rcIRnIpaxZVVuP/g5NHA0x5bCxq3iP6m+q20Q55ddlWJsFQEUvWtIy kkUDXxsAvZh77jADw04HB6Z6whX0ytcudDKwAQ3qxAx7gK7bBPpPEpxM9ktbcxsB EmaKbuJrJEBNTY2AuglYpSTs6IVYAdngHrc21dNQ0gB4nonejK8DbmtYo3fvPYul SKf6bMICUYcJd165CGt1GB7dfxy6cAeobW6mBL2O/nSCElslh0UVDPI8AG4zfPOt a3HU4hzXrwIQ4OSuBeQz0wDJCXT8DbANSZjcsaEBbP7a0NIyh3xomPLaEs1Wl4hp jLtF96hGsT1hE9MsPqXLoedSH9KayjA9SjLHXjvHfU8BZJ2epVSnp6MJMH9Ck88w jYZpeJHWRWeLXcq0NvTphqDBvAlQXQPz09lz67zuDuxcF+VtKyZauV15+yqSjwQO CiPhi5HxqIeugd3NYdLdztYKe4tqB7Y+6zApEyNDoYCkUMJiGxCuZVoVZUlZtEf3 7wJYz8GgtQEU5+iYZwIW77Aidzc05jMgJteBHSSOUZoFKcE+LAbwVwHaT1Mv4mCJ 4grXjY2rMKXIuXbZCyZvZPQ4QeB1bWUI4EYYjxIKk27PqXrsvXS1WGWP9HCPbZLx ZyWwi1Y61AESHtAC+rskkJw9MnzGk3LA4Qrg3N+38c3xonkEmag5JOZucZ2WWUt6 d1rlS5JML9AEuQuYXOWsqioCFBEXHX6gP24RYFGXAX26j0iG47QlzoRCnB9KaNo0 ji9wj45TSbyM84mzDlzAVnEDKRbAUlvIIsBKW1sCKVE+yegChAL2XazPHe6B1ns1 ja0xiZ5n/Z+rauD6EVuIdY4T19tZVs+q28EWWkfWV205Sd34OOuE64pmfAHpkcTM KUBni9K3TaurVCYGWXddPWX8mXHZ/DyLa7QA+7ZEpUsp2xwseh2JElkn5xiSHJqC tjlvdjgHlElJBuSin5Yhn4bJTRLPTd62AWRFnHfZXO+9QyZs8dzzJJzq7nVYmSTh PiFmV5Asa09VCnjdALznQEytEhsWuLZlxDybhF0zSumOQayV+AHbjPrSATE8j43M GQXIJHAiKCHO5KHt1ApLSWEuz7vB2bAb8cRZEzI/hMUuQFZHLw1nLA/xoI8yo9PT dUgHiDA+g4OK8tjbJu8pgKYj1E26ZFj9nVOYcce5u4crSSD0wV5dwbkB2Y5DkBxB niIOe14K1tR6q92VPBOkSLwd81zFJLs9VQwNIVaUSoR094ZK9m4rcfmsuZgVCLbQ D9wxxq5pSSl9h/fBFnqmO8799vnz4ZtUNIdgsh2YdAfJkAB3HfvBDvZrB/FZYuV/ /vM/idhhBYCNaCJ88PR5+Gd3Pw0Xp4bBLCfh+2/eoRmbhC9jjXt2HG5c7YXU6Am5 R5n0HwzRu7Aek+xiSKJsEmqrGzPYs20DdCshueqrGsFhZbyfzrDwfDkSjt6HM7jG 5/Z683WG3v69TOtXj/I/X/3x61+Rso4oLz7J10/Dg87+Hx9+9iJC1K++6WO/Aoxc +3gBDCJH3MQFUPjbN++EN775rZDo68WuBqBKtiFI2mUTH5FmsyaiXk8WNRtWx278 aLXEQgQtEnjJrHkt6WlLzhThAJcEHIKEQmNNpC1zO8daoMreAJCxGLiB2Tx5FWW7 JLpTDYJ9jHOpkwDiFIFILzY9RjcAxJbwtCDK4+fRWxWAe8BzWzKwlEDMpJxAdgyI UOy/yfvz8btkZGoeBZNKBLR/kGSOTDNBK6uYyRTcJL0F7RicpYTjtKqzcj/lZhaO C66Jg8GJH1OLfG5KygZDG5t0H1jkcHejuSHzDihjUco1SKgvtTSolVQRmxt8jQaR CU38uYANNT6HKJ3FXgobvEogbuYwd4yrmkZLcXEEKe+xgoA+jfZUPdA1mCdlGhou F6HLmiWILlAuaOCgIv5SBlJbK9jeJbCjRGuqYyNshhyCW4JDdJFDYwXd2RWYU3fz IB3ctSzeSkpMi3Sj651bT2AaQl7QSHC/xSaQpZ7gIN58OUh5mk2WWRhqKSc2tdBY wItkENBzKD2mkX1v0qGpb6tTTJzq5fzzejJQWVKTnj1Kzno4yhpadklHO3fINTHL dRxiPsE5g3qYXcPlrTChZOI7ABrLsWkEHNfN2sgwhxsJF+tuHRAsMNkg+B8DZs1q smB0ywgEl5oTdEZWkaGixYKtiBZn3COzaEtMdrgekhWXsoCibo9rnwVTFOUGbKQy rmkNZfw5DplhtMDtlK0tm22srCBpIcDzWtOzs7GL0/GRWlC10wzQCLjzOu1xcFQ3 12P6jQZ3ehoNlJq9PAZxMNWLLLiGQ2R6iolSsNP19Q18JrRYXL9WAKbJ1IN7D0Py xEEYuAPAko1S0te304bFGUCw/p7uGQ3vV5M7yAc6SGoY7kCAa25vpxmNa7S2zB6/ iP65PLIdebzWzUvdlBiPwj28dxtg2RIwmE/6aQaAAkggb3CkqU4Dl/vOwUKgoSN5 KYHpsCt/hhK4UoNEJwwjwVkZgNPgHJDgoIAjmsyu8nsG/FGSu7ZmwDLATelCAaxZ a2MTQIcGMaQAly+cQ/5QEu4/9gDIDFeuwhJzXxwx2o5+sAJgscz0HyrL+BTD6nLt x1iv3TgHNJGwzY4/pWt8K7x7B6shEp6XfIZC4sXlHjxgkyQ0/QPhtVcvRTlM/5Mn AJ+VcPPmjXjN+pEprMHSXqH5i0UV7t27DwtTHn7tzo0wQ+LwGdKEXkCpDahLHMp2 xtdzOOkDOqRlEPermb8f02CzvDzPyEvsatAtT6I9dqT0HZrx1K0/vv80jDMOt+9K b6w0bcHUycKXIXFxTv2jx88AA4B8mM9d9GnTI6OhgCTCKW7b6FjtRK9lHeuNnbbH 4AL2dklDM9p5KhyU0JUGNXd1E7cP4vSstvPniAvFYXwMmyRAUXfXObSdx+Hepx/w WU6id6hd/KPTU+gFsbbi0N5m/xzuqOfzTIGJFHBwPkSJmPGIdWGX+z6HXso9lrVJ WRfJBijRPe8oZy37PAsscTulqYC42kIy+vmjERgeyvrE/UXA1wlMvGb1SZIPmfEs mB99l/XyXCFOudb1UMaHDIIEzTfMo9KMPWLKGs+Xjz7/iEw2jgzn/HFcs/6tSlWO eK5y4v86SfQ+CZmSRJnEvS108bBKNu1toPW1ybgchlvLpXXe6wl7Rr2mU6YO0vPQ I+r5SRWjCBBb3REaAcpq6T0bFom3VtJ6G2rpL2BaFs8/MzoYbty+HPXQq3yuHSRc p5A1exuraJ0bYFmrwr0vHoRSYkEl58EKe+GQeHzI6y4zWa8Ktu0UicIKCXdjY11k +5dgFBsBMWqE1bYXUPJehs0sIlavzVGyBxQ1EduHBwc4OziLiI07gPo1AFwlZ+nI C5ry+L2oMybBLWtsIT2RMHK4Dj6xxKpZqnkmofPssVx+P4s9vgkjqvVTkv8aV9s7 OG8AdyYMm6wj33cd78v+gG2qTyXsc10EtpDeHCMJKZVG3OEekJSUYpfXDLM5tvwi JgiHvA99Y1M8TxrneAMJnyTDBA4ezKhk38DwgTckzZSk2JzsMIasE6qgjPYWOdm3 4sTIJOf+BklZNa+RBrtzQrzcY30pK5Ldlz3Vii6Oa+f8EgJppaXHcBr8pcMZXFNJ ZBrK9sic4vmptjyHs9keBdl1G6fyJNN4T+KdDGJuIZVVMonw0cMvIhH1q1giXkRX PEeCucg1UxZildRzxGQ2mbsVe25yWO82VueBa85jZ/Zb33gz/M6P/jL83o9/HP6T d74RHLvaiIwAE7PQUFbJWfguFnFF4f/6q/fDf3//d4mx9WF2dxP7upLwdHM5/NM/ +ddgoRC+DbFSgs/vNd6nNmq5xchjSJ4LKopCVyWAFg32LHKl4fVprvspYLUwJPIg iQ54fzRq72YehO+9/SrrqSn8y5/+JIyTCGulFid1EhH+9pek59/5ipSs3+Xm/c3X 2V8i+PSP/OOfKdL/zUPin/zB2bds3HJ6DP/mW2e/L+j1f3w7si8U4tDNMabslVvo /vBRg3oqQlStXlXgZlefh2wawGwFsLPABtKztYgIpKWLWldLAFxjghLZNzfpECrd l3NaxjKb3MXtm7L0bmeeUyjMZtTZ+c7MyLKlUAEOMqoCY3VVGYgBNcrWx1PtawS2 bNQtFrnlBEeMStunyGrzXew8l3pVLatsCgGeRqZSLYr61ZLICgNMOVDKCaiWgPUO 1OpKsOpY19iRyGdw8pdl+22AkiNTywCrNijZmc07ognB30uLwXzObJXX1YFAmxK9 KMmz8Nabp5QA+Ic50AppBfZsGEZUawx1b9tsLD4xhziaSAJiLwFNMfg6z1VHxl4A G6ZMwQChfstM6yaHvK89Sie/WsxJwOrM/Ho0qM5g403OzAOAeHXewwwMTiOfg9hA qRjrJg5db9Sj54OxFKRzgx2X2n3Z9LLFNfZenWtviGz7/OIqFi2NsVwtoNki80d5 zJzrnfCCTG1wcoRgPRpmh8cACE7fKeW61VEKT3Ao42VZg2k668hxpuswbjanachu xusC1GZEW6ljNFqW7dU+muNG838CxDH32RxNkJpFRlkKKKmrhFEDXLfQEHKlpy+8 dQvx+utvh1dffyMkerviQalm+4As3k5e164dnf2PnvLPE0oiMJAEWO9hc10DJddE KANsOUbS8iEvQ/l+Cx3XNKCN+55opzt7N3zy6YPoEFDOgTHNNXb4gnPKF2FrkzBN 9bwfLcmK2RfNlMy1o3FutA0zxQSvVbtqYWRaCVSnJEBqa52hXsKayxKUoDHSkWMC ZrAMFlAT8bHxUT7BCZ3x5wGha+HH+J1ucRCrG305gFUN9zib5374gpLv83EcACpj kJmepsEKgNoE8F2C3cgElPR2tsfO3BnAYBP3pb2xFuC9HB0DGlhrFbxvuCTKtrDh rN5B9Kk2Al5HIlKYg8SEa1bD4ZBizd4FYBZT7qojSHotR2FaW0m2NEFfXFyJLHUj ZdLlpUXuKbpAyoyLMDkejOU0CSyxVj749BGJKKNrWymDAoasLGQAEJZIuB49fUlj 0FEs400iuXj/46fEJKzIOAxHXg5T5tyEyaFxDyZsioa+KhILy29JwINlv6t07WsP tgLbluKQKQMADjJA4C9+/jikAwzLSTS3Aa82sVynMe5yB/PkAZJ57LcffONVgnV+ ePbsRcjk93rRFiK4jk2IuVxTdW8DL4bYfzQvwnDb+DI2Mg6bWYu2rTV2Eq+wljv5 PcfQ6hE6AZhLnMNHmCa6Fdh7QiANN13s2VIOzU3uFXPb21u51zRJcO9207NDXaIV cIjOk0O178oVkh906aOATA7MV3E0aGLNaiDvgSwobaISoC70As1ib97m5wDHMuRO Fyj71lF23uXzHRBLE+evwtzhLjE1FKoAvk3tDMygaWWYdfFy4Ygu9CiSIUZRISEu rqLBffTZ56H/6SMAOSV+YpcNrM2UEIthFh0draWhMX1VkgHQmmLtD+NEUQxrV0Dw 0Wu6mHVuiLcpsJm1p4wgtY/8AU1xGuCG0EC8FajwfT6Tnfu5JK85NJdscG7MAzbX STDW0FoPodnbgATJJ/77vE4sWyO+7BNPTJRSxGxSYizn0LHrFECZfxmQp73Z7MoS h7pezVQCAUNayymDc6iFTT4FHPYpUMUca8kzrLQWwF8Ke87DZfhNVtdJNHQdsdlp E7b62ac/D7/ofw5ARZ5DYhp15cRcO/Y1vO9saYLJZrgMTP4qsUSdqpVHS+HzAMNN Xr+ZveQ9OgHUOClxlTOnsBhgJBDj5znEGuPoLqyHMoMj1m4a12eRWKSrSTFVvXI+ Fy8byqm0JKlo9LNOVwHfkzMzIZ39ISmzvk5DGOftHu9taGyM5yBKwjBu8XwlnG/G 4RESzW2Y9lWueQ6MqQjCMcW7PMZR26cAdhuo/GwFPO8WicYBn6UKmYDTE4+4putc J11sBIBrnInTJFCCqSWuUQqyYWV5Ieqdt0iMZ7hmK9y/Ve7BMsnwNueu5JPAUaP/ PGLz1z0vu6wRSR9CJvEdIgwPX2207C3J4axNwj7rp+7UTidHRucgznY+MgkMkQ0i ZZX7oJ96FgRJXSNaXuKfa9Oq6x6fSzIlDmFgPUX9LtdfXKOLgTIS3SHs0xB/VADU P3/6OPzV/S/DMuu8sQfJDgRTPYC5Al26kyZfjmKrNzuFVAySjudxyEAcWgTAfPfq xfDffOe98Ojek/Df/q+/E/7lD38YPnzwkGbpWX53F+lfQ/jN73wn/OP/7LfD67eu hGT6BnihLPz96zfCf/feD1gLHeGf/It/Fn5y90vwBOcdMcsKeZL7a/ntXHcXTd/I 0kbHw+AMEqSs/dCTaA5tNa00rh2FL571h5G50VCF7eYr55mYdeF6uN7QQnMS5zCf 0T3wNUnKco9//6XyAM7tswf737/19TWYjaCT75/912f6219f/RIskZrM+IL+x//x qv4vio25Odtkye/9ym+E3is3QnGFE1po/GHjag4uI+gYUtYFoBLQSsazw01ZBXzV HJLNEpA09pd1sgNUHVIlJSK74H1NS0fZfGYZVlJ2bjbgBWHyLjdMEBLZMFbSBpt4 jTnZ+egv1a+lKBMcMudekKbIWjPp2EQCkFMrWl8J68aCdITc3slm9IeTvbPTNLkF 4GXT73PwVRG0cwmQZTyvc5IdJHBABpoFGFZ/ug9AM4vaP6Bkz6K2TDFPBr3N+ylj EduAcERgUTCvZieDVb3IYs+BhdQma5dMugJd3DZA1ODlJJV+GCADjjOo9VX192UU dzbpAOcAm+KAVzxeCgu7BNCRrbZUb8f6ERtGJmsMAOAYNRespYHWpgbKJQc0eDDt J4FtE9nwh18+i9KBGdhpy+zXOmHoWA1PBifpHCyHZaETfWmNe0ETBvd4hsDYiO41 na7FfrKqIpILO9RfoG+lTS2c78RflM+RxHbrYm8rB8YRrCKjSWF0s2m4+Mn95yEF U/RaMfOd+aztFXUAOErZBEdob4I4gQJQcpq9GJnmfCKn85sLSkpCQ0VNaKFRIAJV 3qMdvKd8XstYQHKYRQ4NvncCkNOTUZZcKbwOCzZ0mVyZiTvxKAt9WCbr8wS9qCWz bD5fNoG7EACZQcA1QLUSKE5hrfa5zwuTTLjiGh/DnG4DDubHhkg6CPYc/Epa0kx+ +FkV2WVBJY0oiNXt5LaEp05qn8738b2T8OG9L0MPE4O62lsiWHRIQSmNVDZhbNNF kGhvZ00CdKemw/fefRVD6MLw2Rf3KWdjcs57nqckbTfuJSY3OZFnDqayqbGJakYG gGc62jrZ4W5Tj1PbLnS2xU5rO6Z/87VbdMjmhp8+fITpOQwiusUlytoTaDa//a12 Drfd8AFTor51rYcA3BS1npO4EbQBthc4HDdIMuvPN8Qy+UdoRF+91Empt4znX8YG ZRJ9LuuP7ficRMbmoWpA5TDl9WX2ws3zlDcBLrLMBziH5JKUjNPIscB+akq0wcTo WrHGQIQmysCwDGifZzioumD6bPBb5GflsCyCzFnWtf6XstPzAP1BOv87ZIVh7Rxz 2YLZ9S6A/BefPYI5zAkXaXpL4sV8j6Y/rAppZKmIzO9nOAQoHzC5ffpkMEys7Ia3 z1+O0oh7T57HaW8JAP/SwhJs9jqSF3Sg7MMnT/pDHgdJW1s7cpJhwPpEuIhzgMBz iga4F+h477xxHQalMDz48gmj6srDd29dw7kj8DzzlIJJlJooi9PgND0zjQdtV/ST fAG4LUd600SissT+3gEUnVO3V1nFnl0IszQsFsLStZHU7CJJGeMa1bcmACIc+lyH coCJsoZFfKlHAVULAP2WznaaI1lf/DkbZqUrkQjLY6PhGazxNSaFaWX3/Onz2C3d fB3Dcfb8wItB2LPM8MYdxm6j61wFWFy7fplpZUUAe3TUrKu+V99gjwD8n3zB4XUc Wts6I2O+n6ScnV8VGEURNul+tXnVMyKHe74DiPg5LM+nT76kBJqIciI7prNykSFx CBdwsDlWWxcMTx4BzhjAewGg6RRB9Y11NYByfVohMfKoNNjwukrDnwkcfh7hIzTE NiJuAnr3iX3aE+YSC2m9jQ2tWzyXI3udmrgMGGKgFfsHSyEOae2Z/EfUa0OoLjTH NARBeZCkbQGgFyPDdqZhxcOWpNw9qWXU/NhgTKpkpIwPZezxyLBxzqTzPCecAWvT JOcA8V0YOjIExpdOUkFSBpYRvvzss0jsjNAk11xej8vGbFg43cfeaAM2GYs1JB6l F7q4xlvscyyveJ9FJFqDy8gyeH0dCxycU8MaTBeQAnBKiGnu20KqQ1kALJlOJ+lR Gwz9z55j64UTA2AxnRhUBXkxSQzKJq4fc40WkC4ceHYDQpdYW1k85oT3msf6yCOu LmOlpue34OnpiwH2NI5AYIQN7p3AcIf1mSQeZwDcT2Bjm9Skl1UzAvgJLDa/CztY Q3zNI1HWvgm5KesIf12qJs0QBhkQOvvEYsvoyzsb4ZjrvL2ZggRYDDsASvrasHZD ggIRcwyRYz+GNnvjM1RglEyRrKQDltVTWpGqYd/sk7h5Vqibdt04vGIBOZNCiGPW RDpnbQrQrOfwPmdzCrCfKRNLHK8uKQTEQBjBvqZx7iollBDLIolndUT9s6SQ58jS LokIzjcy8IJhNd1KC00KJcb2cQewSVcZosjLfhx9bUVW28S33/vxH0em+9fBUoX5 YIGhF2AgsQKjhUlorYYpXxGsOkBBCcU2gVeZyvduvxIHNfyr938c/qc/+IOAaDD8 w1/7lfD3bt8JHeCmQhL216+/ErqIIdPzU1xXqjLl1VwTejzSCsJPSAh+9w//TybK 5YS3IB/1/3UoB+AMtx68zllplUhzmprR8qIKnBxfDAupQfBRNvIm+iZwxUnbzwgf cz7oNPCD9+4gH6oKf/bFl2GKa9fAvfHLT+u/fjlo/QqHxv/ER/poHs+fv4aoflsA +tdfZ9+IT8q1jQ/8+luCVe4NzJyP5g8sCg+X1y69Fu688y5ZfTMgEd0nG1OWUp9B f0cNpqzdKQsln4VQCUPhTd6h3H5wwPxmwJEjQw/QTvi4OGnKp+cQNENxwlU+AG2P hXfIzbdz0Dx+hwWbzwJRAL8M+FzikG1Jo7OOwOYkCxk/D5pM3qdlNp4tZvXlZHWF XOgxNr+WEUcAYN+v1IVmwDbh7FCerKCM4mFrWYQ3FgGwWkqZPjUmll1THKqWtfYI WFpnLXAjtWdR47HE4jrh/VdWA+R5eVnb+Um6MtnYRVWUaMhiBT1+RpuwOrpaOHSw 9SBwqL9zDN8eLFI+B6Aa1C5KOMWw19WHGNg3EpxlAgCb0v7bbNx1/FDrAcqPB6f4 DLghUN58waHaRjADJ6JB2QzVHG6VPP4hB+4Bn7mZ5qlJgHEv/62gBNBPeTgXgbgl kQ1KTvoVnpKBDhNIG2Azynn+8Zllrj72WRz6ExyeNly8dq2LeH8cs+aeNkAF2dkn T0ajvKAvglmGF8DidJzv5PR+Hh580B9m+ydD9yUYK2xj7FCGXg3bZHgp1oB6nHW8 61YoraFKjiX4GszozwMe1Dp7XW2EcqHGqgHg1CYD7VDS0TmZzCh7OCFjzyARsslI rZEBwsYbS5aWn3VSUF/laEKbtjIooQtCY3MfQEktrf58ZDEhHZ3oLmzLBlozM3v1 tQbd+aGhsA4TRt2LA2Ur3v9s9KzlHH60NIfZVHp4MLeDHrgE8/1LUf/44ulA6D3f wdqjNEVgcP6zQbz/OaMw21spdQMSRkfJwouZigaQQ5Oqj+T1i71ROzc8ArvBdXC0 n7PjPdgv9bVS9qasxSHXiiG+ptk7HExVBCkBwtIU2jxYmPfeeQPT6sIwSXLUSDlf D9Wjw3nAZTvMXoJ1TXmR32ttb2aXH4Wf/eIumko6W1nPH372BSxZNpZnsqNrdMxP hfM0HuXCguojmsXh2dOagGFaQ8c2zxqBfaRDdnxyHikC9ijtiTACw3WyTXmdhjDX +seP+ymXV+BogScqOrtnz0fRXTbEQRsrJErRC5fEcYH1cMB+N3jr1akW72IfTUMc 26S6TAAAQABJREFUpqPDw+jh8W692IJecjGOJ33z5jfo6q8KP3w6TjNIQfh7rwK+ OJw+v9sf8quqAI8N6E1HKIVTSeDzqV1/QHNiAYxlN4Bxiffy4V1AXWZBuMDnXRyf YNUfhu++Q9l/IRn+4uMHlKOLwlVKyTM89pMHA2H6MJcRkafhRz/7gklcL8Ptt2/D omSHxw8eM6RhGzsuDMW5R4NIChqJlx0c6Aszs6wTBotUokPboGFvloYbbI+cVnZC XPuctbLJ2lV+YGl6cnI8VDeQeJLMPUaWsQCT9cYtmdAKXCmeo4VeIQFK8BwVAKqz Rq1X33qNwylF0jFJApkXdZ+FlIjyqUJVo+H2sBegfHLvUfiHv/mdUMM9fp/XVad8 hT2nDnN8DH0th7iuC05ou88eaD3HfmZPbcyOxGaoVB57HycGtaMySjZyGbMtF1dx gAVwvC4olrbzYczWib/rxOk62OJCwdPkTAR8GscfAB56e9F6A4j0ktQlw5nseqTm IPU5YoCN0/a0EToi6Wtp6yA5PY0ypWNBCPHdPeVYaWPBPoTDHsDIruwtKLZCypun NFIleb4MiRZ6AaxQ6SLiGOapufWYeK4gs9mAwYu2hpwDvv9CAAhbL76vVUvjWAlq HZTL565tStB1XkrvAA4A+TRXTk+Ee3/+p+H9Hx2H//Q//63Q3tBA3MEfFCJFB5kn zwcwdYcYIb7kUSUcfv4MwEBFgOT3mJiygnZ2E3D9mGTqxYMHlO1J2vE0zeCxVsmO iDE2CCpt+JT9ss/1OEmthlmsihLcny0SR+OE55xevU5camH/r8Lu1nZ0hgOuie49 Rxm6gUwQU+llIHbsEdMcTyyQPUDzXEks3Oc62Ahnk/IESdoeYCCX83CVHoVM2EJ7 PHaJAZXE+l1AoA1ghVyv5ZHh8AQmMQe3GwFfDmemZfINEGshn9NJUOVUAvO5JlOs /3l+twD2u4p9mokMxIqVI7VNJjZh/04OALKswUzA3D4AfpUk74T3F7/4/K4tm46L WGcZxG+rT+l+RqUG3KMjsEMZlRD1pts7DPfh+HdKn04/Wkpuc7ZUcwbKrB5AdHjO y1oX8P5lULXiymTSXAFnh/acQoTjdIB2USWjriEsTqnuQYqsc5a4Dq1kW3mSxNoh ifD1lQsd0HUsmD0kcbKZVyD65x//HIKFQSo9PWiOmUpITwAwG/zBhDvu5Qbxo625 gb4DKntcy032JkiL65gPi3qd8x0MhAb7/0Cv+mR+JnwXidwJmOMF0/7mSB572urD ncvXSNKo6CKn6KeSNzA9FXrRrD8dGQ3//I/+Oe+jkIbda8R1qmLLeMNyDQrAAn0l fVRFZ8PDiZdhJw3M0lIfWmua2V+ZNIWO4PbCuZRJ5em1V0jkO0jYshgg8zxM7MLY 0mISv4RifP1y0PoV2vQ//vP1l0Dy7Ous2H/2MMClaJavCGJ9CH/9+pFnfzljWH2M Wr611Ao5dVr41V//Dcqqdxj3VxIZVh0CtKzi/4ALPEsBpfkEAwGf3fdKDRzv54JJ ReDKvGhKQ4XQz5Knliv3CUKympbqXQQuVi2h9NXMk14HeBgMLYGbrUazYHRWTgLR bkEa3q5KGVZ1qRaMZePMtixr2MV/ApgRFJhCZ2biYQe4LQZQO3HCMaz62Kk5Uh94 xILxagmYFfer87TkZinEz1VCiWsMrccuZac+LF3Uw6xjldEO0HTAQRYgzt9J49A1 6FniBw8DSPFrHJgOvfifqXUaJGirb82HpTOLq4FdmKSc71hcGd+XlCct+VuS3OUg k6Xe5TPOLyVjaT/FBZyCmXobJm0YVmqXzaCswUNeJldt3BRWR0uwT+cAJdvcqz4O E8ugM2TmSXShpTxmj40lM2y2OzO9HOfF2xixwOFcyffzePwnMFQLU3PhDlrVHRKV ZTwoG+hyzCMB6acLW0ajA9urJIebwvoEh3Quh8PyCGJ5NaiUi5e3kyFjepzhCTSM AcCJgmi/aigRMa601cYKSmeA5+l52EgsbhyLqmdfbNDgvadzXQwsTiU64ZrIxkNn k7rz3vnzMfdIf1Y947T0OKKcF0XxrMtj2BvXWwbBw9dRcC/TfAyYdR63pRs1rGbF 6Ryg6fw875RSEwCtkmC+z+skWReVrZ3Mbq8L+YDufd6HTSzqQY84QBfRxH3+cCKk ahPhP/j+2wDnvfAHP/0iXKPTUr3fNJOSKmDfZMpGOAQsX/f0dMUJWF8CmG7evMj6 JkHjYOnsbGEN5JJAjHFfDwAmrZSo1hjbSpfo5UuUx/WwpNuY96fueZmEUrB+jjU4 T4PX6MQ4IIsyKitrZHAERm+VCUmtgA00gBwA52m6qGDdTQCWs9kTFcWFTF2awyYM 65emymgXtML9+T6NS6uwIV+gsdRG7frNboAHIy557fMwJWskQ/3YW7Wgr7Ncvcx9 G6A8rK6uEvD/xZeP0UE3ETybw/sffAKDkQw3bzEEgZ/pc9jaUsOQh3aSrA1YeyzS cCDY0XicayC7qARmEL3nKdqxnsbGaIs2PDnH9egEfBA3YJX60Npq0n4I+FmlzNzT 3RE6uQ6jBGht5a7DwGZz7x7fe8iY1q7Q2dUePvj5F6yPXXStN3mtXazbhmCqSkJ3 Qz3BfQ72eS689dYtmIgs9KLDMNINvLfGMEBJfG16mjWXGy4k6rEVG4R9HgoNzY3s ARqveM27jwZoOKyn1LseNgALayn0h0VVMekbfDkYihspHXNwzk+MxgQ2kWiPE9YW AdRZSC662nujXOjFC56HPXbxfBvMJ2Mu56awCWomXiBLIaEqy0uLDWn1sNGys8op Lt64wsmLTnVoGPeG81yXaq4t5duJ+ZAGg3quJUGixc+H0SJXlhJr0PQOTIWXuIA4 alK2XL20/QMdgPtqYt3iIGwgpb8+xrYaY42XBcgeUkfuTZJH9o6WcZuwtbobRBa5 ufZsRGzHDaoRrkMOcV7XeO1AhBL2F8gE8ORYb4zikcS0IkFRapUO+DRuam90ANPV AGhdA5Q47ICFEKtmSrO0HKyEsdaGyjI9uI49zSkGyMpGsja/ThKEtVoOrGcmgCHF eQFpHC2bCrDPK8BE3abZ4blJmD+8qUkMbOzchY3b3qPPgYpKFhWfMt7LCXvdMndp YyuuIgxCIf44kTAT32kHmRTBNpXBNlsZrL51MVytoQS+thD6F2eQTVHeh0TYJDnM JQ4SgdDbA7w4M41H2Ue44TA20/2gTeFo/zPkUyRmXOd9yuIlRS2AHK4BINTR4Ls7 2MUB5vI5I/KIK8uAlWLAxAqAWZ/PPOQsh9tDsLVrJLvIAQCZFCSIgTgYsD/taN/d InZwVuilbjOjDbyZzA1fpxRvP8UCYLKM+8GvRV/ggiKS15wSmkSniY2cTxhgH5hE lCANYi0uzYxDIKBzZW8Mw+7msZe0kLSh+vBwg+FAnOP8/XBvkWSITv2jbPodBuO4 V+9/fkkLJMQpgHEVxhzWk3s9AwmzAoaoAg+wuTiLkUdwHrV2WKbGrxaQX0BMyuZ8 OeJ+H3GtllgT6STOx8SsNFjWVApWE0Du+Z9+DEHB9bYUlxI4wkDvA1BP6a845e9J kgstvqJckXW+CRt6xJlfpOwFMOoZU1oFuCX5WeS91HJ9dhm9u7wIqQHJZmaTwWvG aiCPjZjGbIc1bhN4HAHP961IWIUVEznm+Xd/9H+jRf8H4fXm9rDHHlpYxhKQz1wG g+uksCz2ydDwZDyrayDIdFjgKWJjW3eiJfza22+FwamZ8Hhy6MxFop2+He7x7/3+ vw2dd7rCP3jnWyEL54cffvBx+Mc/+WMhXfz6zmuXw+22dtbPfPg89Tn9EbXYbdJQ zD07Ze3JuGY5wKavnTMX9yUS8S/vP8Ouj2pjEWPQbxB38yvBFzvhz/o/5h4dht/8 jXfDJapxf3aXjJWviC/5b8b/yJff+P988SF8gF2Nd7/4PPzsgw/oOMT4l4zbrvSv f5mH8RUfzNYBmvnp/50vvxf/8YLzj1qhFYDPb/xH/2X45vd+hWaNpphL6KmXpOzn Ywoo+RZwcws5QGPXOkFPwGenvBoTy/QCPl4yWpE42vWYGxldAXxH3ETnRavbs2FI QTVrGKpcLZHTsNgggEEBrMC1kM5Oubd9NE7ib98vHzMKrs16beayScvnPyDg2Hwi gHbhgS/i++Gvvp3Y3KQEwWEC6nDzANUOFdCL0k2nu4CWG16qQkolDgxQcN9JmZ69 wGEEgENvavYjKFY6IDtbTqZmsFUjFH1Q2Wh+v5Ysx+YBM0LLrIeUuFpqGMeI3GCJ xzbDMpxN5dK2Al0TB0k+wcVsbQvgroyhim5tu6p7OTizYXeWAItOQPKwsYO2DGDk yE5LcOdopBJo+lk6G6vZxFhSwap4rwrYlLLGMunTZGL5vEZdNaVgnnsLoX4Df1Yv Os8B3EgJlQuEhgi2gUzMzTPDwZIiQSjieXQoEIQrZVhD/7NEJj/19GFYGh4BfDfC lF3CFLuF9XICC4Cv5yYJA4fcPBrKGTrJvQd5lGHKKfNUkSGXwbIVkMWfAkw4lbgv lglpjOOw2FqiY5HNnElZI4PNFZMNAEsaGayWZSlKYCcsIFlBmyUOeT3LBhkcTGqe 07meWn6doGXyxmYQ/DTuPvLv6KJOYeFPyNRPAWinvLblsLGxkejhpwzlBKCviN/h BdoyVZIJH8MoTOKdWdTaFm2EnvX3o+Esx5GhPo4+TaNEUw7DYjY9id3QOcCTHagv AJVVjU2sdxKSWbxPqyoAc42xfG3DWKI9Eff1JkCurb0NRoQmPkpvevjJgK95LTms mpobeNwhZvN0E8NY5FByWgGszvCcrYC4Isp0SwTJUtioYoLTGPdnjKSmEpaZJRsd Ibpg1ko4GDZXk+HNm5djCeoZgE7nCAcbFLJWpgG6+i1WoakdJ1tvZELQFYCjeu75 aRItmp3UJqsFzqX0+fabr4Zl1s+DJy8B6d10hGO+z+d3bb7xiq9RhC/kBO+3mP15 GoYGhqOmVJ9VLZ8cjtEEQ2jTXf+zl7FbXlZlCkDvxLuODjTErGeHD+Tyd90UZgG2 dk1fQAfqhLj7gG4dRb79zm3Wzzaz6MfD7VcuxVj0i8/usyYzKJNdprRv89d46L7Q E62kXjx9ilVbMrz22nXGjhbEca9OFZI51bpncXIy3Lx9halFjIqdmaGEOsRo3XZY 3+rIGLmP25AFmKS+AOAeAiLyaJbYIsGZHh1C/lDPmqjAKaAfrfl8uHDpAgkA5dVH z8Kj0YVw8xrT3lgjE6NjJLWVsMLYlHEtlaI006zTzdpwWtJ9WNMT9vOdm1fRSM6E 58MTfNZXmMhUi05+KjxGylCBHruadZ6CndfKppeEaY4k9RPYkRs3e2PCI+ju1wrr En60HGKTYySZaAmvXOrjWuWGxVGqNtyj0qoakrxdfDozYd/b0YxXxLVnFUmZxQL3 LK+Qsb/FxMhsDn7Wah7X7xyODRdo2tsmhqzy2Cpi5iH7q4J97ljtaRj7Qu6fSfAS iYyOLu7LWZj+EuJKFmfKMt9HEIYmHukV8VG9dxZ7T3N+ewF2uB77JK2rGAHnFWEb BBlhM69lY0JudCoo5L1YjZmbmiTWEfcAhWkQKE46PCXxjWcBkM0ENh9wo4RM/82C EjTgnHeb6PPVXmbzGWWmeRFAFx7WAOXOCxfx+r1Ow9t2+OCH/xZ/YTTHACJdGfRA PeZxOwwU2IbNM/b4PjYBiybb6h/XiIfLMF6HECh2oJSzD8gKWOPsc+KBFaMjXk/t /+z4aJT7FABy5udorCSmmtCusb62SaYFqL6OTY0rS+pF+RPJmlPi4nAVYpguA47A PeD9Cvsln8hHYrxc5T5mo62tQQq4zXXfI5bKzB4C6h24c8gZqSRllZhswmDjaho4 wKlSB5BUkRTi/cZznrN9j5hq34tjkv10+9x7BzI4ftc+kCLGBbeQPB3wOUdYtzaC 2qhnqdxxu03IQyo4B9Zn59C378YmTWUDh9xj9bNaoBnLdmWOuZbeF6/rOtdFskJt 9Q5rI45Q5SNqJZUFIHbimY2hyvO2ALxOEeOSxARRTHXAmtrgOqWRxOqCoNWeOMTm 1lXOcteAeMKzQb92+20ks7Rjk2QTpOhI5HuxKczPI4jVAsznG0A/Lfve1crUPsD/ gWV6nlv7w1Xi/iZrRxBbRQKo3nd4ksEuxJ8SEpd69lYJjPhHHz0Ma3yOujza2sFQ w8nV8E9//ONwjuqrpNwB8o2pucFw59qV8Bv46n/vxqvhjeuvQobhKjE7yfsh4ayo jNjoiETikPdVxJ4rQbKRhOgYn5thCheuFlTGOiFm9pnI93BgMNx/+YIKqefFtXCp hXMgeRTHkq9g/fbKK7fCO++8++9hWrkBfgmsBGJ//cXFkjfkJ163sx/yGEFs/Kvf 5M355b8jiOVJBLR+qf9YwwOsKXSE8zdeCRUNtYBPAaE2D45bhZ4nsLAXo/ZHVkiN puVK0kq+hyExyCwXMOh70+D7GDChT6ojVLMRrUijy3Dx/5jJn4Aqpddt9rHU44Lw Lbox08laePm4WNPSAUZ0rpux6GeaIkilAKq5SgR4MWBzDBaOdpMR/hq4C6AtM2dZ MiN4LSyygfjdQkyKnUQiUBQop3gO6XytOwoBaAJeJQ0e4J3cOLW4Q0xmqbcTF+2H zWR7ZIZLi3SzksVaynKD1mPi7nhXdbUVsAwrbCB97arQmg4wuacKZhqyGdbOkaYY VBhg+ZCNHDhjlD93AYWFdBg7bcMxtnYCm53WwhI0AhAExgkYFS5VBP164jkJa5kS SCulWKeI2S1bhUn2ShI/PICi4zsP+YVSCA8lFzO8tgE1kw23gAm26yCb97gI8+vv 3expRwvF1BhKmm3NVcgR8HUlkVFTWl5IKQPmrZTroW+ojUGaLxcQHOdhmu6+fIql UlfIgcVo4rOq3y2Daa8pw2aMQ2thCWZrdhM/S2QCAJk81mS1OiiuhfO8tS1x+okM 8gqM8gybZ3sFTWNzW2glcHifbZI4JAC7yE55PBQF6wuNMkz9CWVWZRxpHJ7qpo0u drA7NMKO5Aw1VdCwx0hc1ATH1U+wUJZwwnplEXA/KV/Brm7xvg75jJsprhfr1T1z QKDYATQe44Rw4c7tMIdLwlOAlwMgmls76E6nSYj75cxxdaxfDI2xXgGOvG6SA/7K hW60daXhR3/1EQxzMjZoeajrB1haQZmVzzhJSaeIklwjwGN0FC9Jnqf24nn2BUAX hi6dEtEeicnk+DiHLjOlYf42tg4YxztJtz3NZlzLkeFhEqZqpAuMygTIDsOkd3a0 0aGKUwU2TTYXNAGYxihn1wBuWkhYZhnhmoIWPN/Xw14pQuf5Ar0qE9a6mWbFwdP/ +Fm48INvxM7Wh8P96DeZnoU91QYHjONjv3PncuxU/+DjL5Gg0CCIfEHT+CnY2GxZ cdbJKgmSGacTzsammNCEpVcXa9uJTIuwy00tdE/DAL94ORymmFz3/St9XJJTnBb2 Qkthozcg3IUBOMBX8xrXcpX3/GefPg5vX+sNFzkIHJ87DYB97zVKYByQP/7ky7gn mngvLweHwiRJ4Tfv3IhJ98TwHIdbFpPfEjFZeoEfbQXsZDHaYHWeyoS6AGnFvNcB ALRTnL5x6xIsBHIKSr8VSA3uwJiv09D1/PF66Ow7zz2j3PuA5A0m+fbrr8SEZ4Q1 rF5XadEKbP0Tmi0LAbDHpxjpLy0BUEiETUKgyEb4WRbrxQaJUw7PTfZyHbriBPf4 gHjzGOB8Qmx869bVkMnB48jcIqoBWSQuGwAVSYCGpvpoDbQMsC4pzgl957tpTtkJ P/riEQCcqTstTZRgsYiDvbp2uTNch/22TLrOerzJ89aSlP3s/Q+p/rCG2roiA360 TZNlNgMSuI9aCFpNkCBRvlJfnyDpH4PBnQ95dQzqIFnUA9t15Tjuee5rLU28Tu47 5Heq6U1YIxFdJrY2ttJIxes6rcpx3mtUhQQ4xs/JqRksFmuj08oQMcfTzeKjY1fj 2UW1RJB6DDNUQ9J7hEVPUrsm4vAmIKGCSt4BDvlpMGX2QgjylFtlp9MczN/TCvC1 JjHOSaN7GsCRAVj1sYdImI63cABYR8vLObDBeNtCGlpSSUZUVzPpDcY1CRhy7HAx +yi1ymhYXjuvhHNvldiDu0AGbOYhZWSHhcQxuUizHPawTRNXOgA0jfV7SFw5oclN ydfJLvEWHDkn8AEsWQKP5xhsbjrDbeZSAHMS9bJy5DvTk+x3eiV4buVPspLG9wyA pv6fYB7IBQAw90GGOoPXU/O/zQuo790XdPK8AlKdGgT5SWRKuj7k5NRF/ec8ezaT +G3la5fEzzhqo5eay9iIxO/YoJzBea87h/F6h5/rbKPe85gY5PtTHlAE6WGX/zrr NR99rVZ8MgC16ZU0rmErNznD/QdXkGUIhI+J72pMT0g8ljexf2TPHLPuNjc4a7k2 yhtIOUg+8G5nHdr8J7GwDxYhgEbsk8nv7/F5dBbIA2NswzyzFKL2WWeBMvb4JmeP kgobxbW0TOez7LOe0gG/u1ynbSotSarJlVTBBKx+T01zrIfD9MrLeeZ7MmiFqWTx BAArbeg15WTii8bzSFhxH3loGXv75eiL8PuuCyoO3QB1h33sJOeRnWAXRnzOZR2u c97+dOZBTGh0cerqQBbEuq8gMXvnysXwP/z2b4bf+cM/Cv8L/Qs9Dc1hlsqmMO6D Zw/xcO1GJnARgPtfhUwwT2VpJQ3fJHqw0myKUNB7nkoV94r9c8D7EFxzUal6wJBT Ta2uoSqTR0UIXf0u2vIXJLfjMvRFuMrc7AxlOTShrx8wJW0SuUh++Ee//evhj//4 LyEfuSZ8Yk7dv/ulUb771wd8/fU1ixn/y8/iA3iEf/R78Vt+mwvtYe833Pge6H4J XO3MpvE7fOe3vh/9BfO4YTb8KADPYdFYYrA0b4lZrUY02QeI7jvQnedz82jqe8DP /Mfusl0WKjxdzCodCrDB4razzwEEzrI9Y4ABYPyueiffmpYmNhs5vWkbZjKPDSiN b3ZUBMurnVUK2lPw62fzmtsZfwZeyaSg9H18Lgd6FoFQ1kVWdBVw4IzvPDYq7xhw zc/4POpxwU+RubRsbnOADVFaZrgw81lUKwAVpylZws/nPRzRaLXBwtKvUMZT3WUb 3o2nAHYdEWpqGMUGCEon4yqndLsHgyMjWsA1naNs44zj2nI6UXlMLY+1A1S2sJBs Siswp6aUkImu8x5W8Il0wpZaWe160rk2G9wXu7ctRfh6pyzKEw6QFXRY+mjasKSX rWWaA66Hh0cpG0/5xCnXU23tGs/t9wX63qcigKgOCE5k8cAWwFYDvPf4DEUsbuUg mwZTylZEt1jS07YrAQtdcAqrxzYtJXPchkXpnxsPi/sYoHPAHcMY29VfnVZF1pkb OjnktAU5gL3ZA6wYePSYFYjOA9xXuE+zBMoBDvuXsAvl/M6v1aKB4/MZEGJjGv+F T+e6w+DyOXgGppfBlPNeTWFkVj1YWXgudNJx1hbvNb0EZoUgcgIgkGGJQy/42amg loC1xxokvnMvOPRgyXIJIlmAeyOhEgMNpu0CzgBURi8/Bl8Y8DTlX4Ydufd8KFw8 1xkrDpN0GB+kYdQCGNW70TJbc2N9HH84D3tQSsCa5ZBeW16MjUSFlPqmYWqWcGEo 78JQHmAxOz2H+XyLr8whjj/rNuV92IeXTkCCGXn3W+9GJiG5Oh0udDWHRFtrnLQ2 gIa5r+ecH4QAiH6RREST8bGJWYDkUejt5vDlni/AajU0NUbbnyEY0G6Y+g4mcFlm nAGwtnXg8gBY++CDj/i8VBhgghy3uQSgbAJMyeZMTMzhUlDMoc30KJi7FDICrb/s 5EXdhY4V54m94/DFkyHu8W4sTVkaNvGT0XXqzMw0ek80h74XtbvrHGxXKPXno9k9 gOm5APDKy0MPzLXJoaGorakVluSQgQ3TyGGaYAMB4ADNOfSbt2+ch8EGPD58Hh6O L4VrNy5G8P3yxTijL2EKAR5jAPwnXCNB6jLXZ31qgqSjGU16VRh4ORJGkCkUsufq KBHKDppsJ7oSJGvIOGDsHtHE9V9/861omq8Wrw5WSPbbZpVp3kcfbGxbbRllzxHM 37H14bmzj9GezjBxCN1qDs0NzwfR5DLZqZn7ko/+bxkAfkwHfjeSh3Tim7pyGyIr SHJs0lgkiVsjzlzALqycJGng6fOwzF6+UN8Qnj0dpPENVwj+XMf+nxgZpzFtM7wG QM+DCRsdegIoOw2/+s5NnvsoPHwKi03ceeN6X+wqfz45GxLtLeiBm0KSfbdGybil u5vyLuOeh/rZ7hnonfGS4X7IdKUADutYHDkJ7gBwsQLo0fXhcncvQAbWiANve2Mv jGzTOMoaaCCZFzhmczBuEv9sJmrpbCXJpNuf92oTXAE/2+ezOrnQLvx5gH89a/GQ OLZLwqPuNZvyvSxwikTOphqZQ4FoDmXmdWRc/p4sajZSAatt2rIJRK0C5pnYEtu2 sCBLh6ktJt7J5u4DFAtZLza07FFm39ycZzAMLBwVnGW0ubkALRnCU0rOVjtqaH6b 7F8KU8+eUVplTOYsjSgn9AngZ9kOcDXuWxFJ435XoYOtakIbTryQQDF2mnguISVQ q+lgAL2mrUT6vYXFad6noJynVONETLUJdZ/1p4zpiJ6MFLHLRkOZZ4kmm6OVI3AI RsCjvl9guZdCDsWfC7henvI2WDlV0uYuAeexQDcNYgmwptRNRwiZPaeJqad0YIPv w59n8RwCcJljExKnlemCs86Z5DhrySrP//j8ADdhRRqHp1OsxAmO5j3g53nEQD2o j1kfjmdeZi2tc6Yo85ChPkReY3zXF3qBmGBfwLb3E5Jln5+jMUH6wYAI7p8NbEUl VOQ4O445T53otMP9sgpmE5OuEcWAtgPPCGIRS4AvNM9UKzdIAGTq+RihiIEcWeCD XTxr+bicxbLFHhkAOa5/NntSByLZbAkqq8w8lDUOyw+mkf3Vb96mLJNGLk+81zZT WU124JAYhUUU30MrnfkfPvg81BEzf+32bbr9Scz4naX5uXi/srKpdgL2F1iL+n93 1tOfQAJiM/Z2+nb0h/8WVRaB8R/94sPwv3/0Y9ZeRXiDBPRmW3sctlRKBfPSuW4+ B/eYRnnv/T57JRMmvYw9dkQcs+n4kPNZhxmUtdFfXW/6Y/Zakr2rP/wWjDyXBzlg DVUizm8+xiZAeXoJG8PqQhqz+0JPABdM43zBWvTr7N/xj3/zrwj04uX9m++5ugSx EZ76By8SXz72r/8Sv8OCEvTGn5yB2TPGlSyXTPJS4zVKYK+QAdfx5r1ZoGc+hB3x llrNstWPOqmJHW8iAdOCbIAgewhLuMmi2WWzuKHyYET1Y/VmrgMWtSSRBtcDLlpm Aaw0m9brVfBgoiTDCuIkyHBM8z3ZuG2CXRGZm/ZaglA3gvKDfEqb/iOQctZ3KRff z6r/mRNTpHNP2UC6BxgwbegSzBYhN9DKSjreDW6zlc0//myXjWyTFqdr1Mdkk53M U0o3eFQRWH2fjvxzhrHjXC2drxNAS1jMBtN1nqsIVq0QvdpSEqYA+UGSz+Ckqwbc BNzgp4Ary4/KIpxu5Q6ZmlyIG2yH1yflAwjx/nitWdjlI4LyJIe1IFID/GWYUjNO S1fHgIEKGkxMKkwUTAZyuSY2w2nnZGKwk3tmHSZ7u0+wiONsuXXFWHy5j9fQ+VXQ CFaD7i3FayU5GAW+ZQBYr5GMtpZgeoXK6urNlkGQ2eZ+V7JZnACmMXkK1qi1grJk 53mCcSGM8wENJLNhZgXGghLfws5a1BtWoLdzsILZaT4HiYeFzzfF7//l3bthFFCE GisswF7McBC/2cghzudK5zHeL0v1WXw2h0CsoPntn5gKW5mLoRnGr5HrU8Djsimf uvJ9DXErizm+Rha2UpZ74nojwYh7g/tBpI5B9oDgNUNmrx6soa4p1AD6PSx8Lst5 AuFsGL31LOybYJCUrNzANN+Me2AQ0/qGBtwlKmHPNigxkcgAUr1Pymu6O5qjHcuX 9x5HvWs+IHUC8CoDXM89lKEdBMhYQk7jdR49fx4TlFwSAQHM2ORiDOZ8GAIKzGlL C+sY/0uC3SZB7tbV6zHZGp6ajmXzDMrT2q1l8V91pgbP6ZlF9jLMEvtyGVDc0EzJ GkcAZQtpXNMu7MzoZQwzBPrzgKcEgNk52SkC7ltvMhYWtnxkFPaV59MoXdkKNyW8 /urFWFWYmFgKN68wNY2aoxZCSlRaYCufAxA/eDYSfStPuD8e3E2ApuoIIMdjwmVp dA3GeRQP1AYsftoB4EswbDImPTgrOORiHHB0o7cNt4uG8JcfwKISfN+GHdzjUL// 4AENBNW877YwgV9tf/9AeO/t60hICsNHnz+CMd/DtgUATZIzMDTBGsVUn8/+mMYk DdPffP0GjWXTNC09Dtk0dXZgQWUZeI1Sfj7rqRL2fRxAepfyfAfSCjmVx49fIOlJ hgtXzodiovUTGtiaAKFXcNaQsVO2c+3apZjwvbh/NzJgfawXrfLuPngW7JDvamrm QEnGqUdtvPcqJB3jwzgWkGC89doVbvdp+Ij3tEX87OumYZG9qCvBfQYJ9N24FkvA H78AWBblhlvt+E5ynWYnp2BGaIQBBKysjNHs8yy89e4tJpCVhvtIJB7h/vHr374d 2c/nsMYz61SULvbB5m2EH/3J+2EvrxQHhJ7YbDRHA1+i61y0atPGSjCyD+uk5MNJ Z8+ePAmff/ZJqL98E2kV5U72oRKlWY6vHMBQT2ddTEiNHV7vORKlQ5i1ViQQwy8G KDtOsn5gd1jzempabj2CGWtn3VhaHR4i2UGgSrSLh/o2LjDJDXSOuJksrwOYiAkO qJAQkVncgG0tpcx5RLOQk7p0vXGylt7CMm8ezDb6+DkkPay3OE68kLgv05QE2DlU QBIni4qNwxIy2UNk2uyrimhjeAADuJJaDhXE5XkID+e6Z5bj91vZCkNIszJxOTen AuP8TsqudcglSpHSVPMzmETi/jox1fJ2MSCinFho42c+doBGmm2Sts1NIiDvW4mZ wz/SAWJOZtrBncJpdoLIU89nhmcIrvQJtw6VQpsuEZUOmPKcZNtGFtjpUcrhbGiz 0pQOO+11O2TfuG4rK/DI5jrIZur442tsRBZXMArBU0ATF3FSmUAe8czyvqO1Heig 3j+Le2dPgWRPLtVKCSTdd6zsWUmSGc5k7RwrY+BslcBaUX7A70XnIGL6Mb8vKBaP KA86ADwr/RN38K2YjKQArhI8Ek82K6fv8Fn5HJ71G8RYh0roo228z7Ihj99PZUNQ wHzbPCjA1e5pjbNGGU8OzGcOj3eohD0ymTzXNsxxtFRjjeh0k2TtbHsteLw6Akv8 xlJlhV4PZQZWCnJ4DYAEd9Brps6VhINfUZMt3jqB9DJ5EsFerEuEf3P3fSzDCsKv XLyG0wPuGVyrZYBqEfG+EDa4p7iZ84aEiqTTCpnnXQTJJBo2RH7j6uXQTAx+b3qS xjCqog0NjFxtgwnFvYFYIdts7DjcpUmRtWPL2D4k4AlYTlLHoTeyy3lZRfF6LdBD MbOMxEzAzPpmyTGGmSStHC0zFYL1FWw5qaYDLyCqmPJViO+vw0PwhW1tKaNqcyGu gV8KWiPI5DL8u18Ri/LNr/Bq/IP38+xLVvXrP7uw/fPZN9y4/pGYHi6/eSe0drZz sQCjBCXL5LJ+ajulx+108+KptfNGWMIQeO7C3uiraYq1y8Izs/Egz+bG73Gwb5G9 aONRAjiymzRKCngTahvZRQQnAamghHIDmaSHhIvf8vg+ADZJFuXY1xyyPUfAegN8 PX1DZQsVX8dMisfmAxiVEaij3OI9pwgg+r/avOIgABdEPu9DkLdCKTGJIFrZg7Pn eRqCg9ODkoANS8NMVuFztDbXkGkhCQDUZaRO4kGVz2fLIOgc4meWTifyCkyDXm7a ffmeSlhYvt4CouaiIky6uS52elYCUDLYdB6imhJPUa7NIroI2FMwdwVsbpMNm9s0 DN8hyAje20vrAY2Up7ne0e+Q/9oN34hGViBpsDHj1f9WTQ3Qkg1JmZbS3DYBWwZM NsMN5aLOh51Qv2OzRgWsEC8DYCXDZhN7f2W0tYRaR2ZQClhJpwN/DSbXUYWlLNpC dDcgOrpUU9HOaXxqnOfKCfWsmWoYmnzQTzmHTXNZbbRVSRFw7XKdpzFgYg1DeDa7 s8ibqpA7AL5eIi/4V1/+PAyS+LyaOBcTmwaATD3sl56xaqFtuGKBcD3LOXRCGJmd DT/qfxomCGQ906PhVZimm5Q/inm+E65NxKs8fpPO612uXT6sLSqtuNgz6OSWkdC6 Rk2r6zm3nBnQXEu2M2sXbRugdZdM3/K4WbPDAgxY8wDyKf6pQgtog8SLweEYYC70 0NVL4Hfim2MXt+wSXp6ni74msuH30S9mE1R68Cm1q9W9UEdjhUzH3ByyABjwSvSj JmJO+mppqI8HwwpgQjBcCbOwZHKARETWxzG2/QMDJCo0i3EYejg4MrOL5qsVGPgl NJFqCJdJfpyIdcT6KAXc6OG5xXU530XZk8OBCIYdVHVMUqZhWR3BKSNow8g4IPJa X19INDbFsqmT2kp5TmeSr5KwCXSL6Y798OP7NOyVYunUiN5zGMP2TTrdGQ7AWnKo Q3dTVbh6uRvNvJUGZTfn457R0LsPxlV94oefPYhNYOfa26JePAmYK3YfcX8dUpBN YKogadjj0JwB8F+/COvI2hxdnohrpLWxMTZpPaOcf66rMdy+3h0++Aj/XXyLr147 H4P+HMxwIT0AHcS5TQ46zeCvXb3EdSlgfWI6z8HeiR47m65rQdkq9769vRMAux8+ +PyLMAxY+sa3+RywUp/gWNDd0xZ9IJfQ5WUQn672nEMDm2IYwcNQm+gK3c143q4v kuQ4aagu6ixTJGOWybs7E+z9E5hdGhyJedUAY6+bXdP6bAo6N9krL0fGQivNYdVc 9xmA9X3cBcqbEyTFRUgT8KllBLBDPk4puT959jzM0jDRWNWEtQ5NWyMD0V+yDMA1 MjgafvLzz0Pt+T6YtaIwyM9/cW8gtMNkW7l6igTkX3zYH/7+r383XuPtZYYk8J5q SSIcNa1Gz7PCJpeir5pdnw8MoZGfCF23blFZIt6SzJYBvAvR5xrHZeS3VpfYthyY rD/BSS0JvE1KDhlpaq6PulbXRU01EicecwrR0IDc6QSNe0pywKoT683zRreKI07U LPZ4FpUugd0eSZbMocy8Y2Kt0u0DPrK06wGwrZM4L1nt4vB3T5PC/r90vWeMpmeW nvdUjt9XOedc1V3VgR3IbrI5zWGYsDPavGPJ2B8OMGBYhuHfhgHD+iVAhmFDgIE1 ZMEQsCutLUi71sysZodDcthskh2rY+Wcc87J1/XUcLxaz9ZMs0N99X3v+7zPc859 7nOfc7CXpqJJNGMn7Lhw4i/2oP1h1xxowhUmeV752C8nHRlsmQJPIzW8yTNKVNbD xNOoP1dtJP1UOfPFNbQIIoVbgQ2fIzhKljfE/Wp/V2VC3n8pZ2UzBR+F05fsEOwc 8XczAAlkcupcF9gf+wQLGmWZbIuV81jvrVUmZQH6stgb1hUolUrhvGdS9BV9Pb7K nxGE25tUGVgGtkXiSBb/vBm8VfF8HztnsZNZLx+qRdg2zE+l0Ek5HVNhon8w9Y6J 42d4fvp0CKkdWDs7TTin3i9HWusLbfkoASFJI1OcRiBgFx39mVraXeyJExlTf8Xi ysLGbjDuC54fd0FAgUwDjIHknGEZ5/fID/M6/D62mBg5+mmZzpi25bOVPBisEJLw 0nSyT9Y+YDMosMpC5qDOV3Y5QUHeGlnTObJU9otN4PuULtmaSwxwSvZvl88EGoQK /m7B1yY2ji0dMZPDityfjk4WQDpQyZod+367filprB2+/QT8YwcVMYcSPqVoZnF5 G4Cuve4T4WpqC9Kme9F/fnARfXtLSyhjXZVHZLK/xScbMJ3rsOj2js4kgPLsuX4+ a7OybyAjaq2ujpkP936SQNVWkHZ42qfllc/fbK+LloZN57+8P/fMc8qEMLIIemVj hgwO/WKH7RdL0TBdmrTHnQDgJOTMLLZzaG6Cezik/qAoDg06AwNN8/xnh8cA/gH9 fXPoaO/6u0FrTPezQN5A/OWu4XJi1MiDMIXq6hhxxV6svszXumJ+8WcZKP7Lv/M4 WdAD0hw3mq+FK2/ak5W2SGwuhwTkAVhddCl9H4JvYRQWKW8ihwig2Yx7PIgMQIWt lPI4CJMwOnPzqzhCQKqAjU0nYFJi4AU4bcrI2oeDbYh94gSM62goBCNx+hSGsRQH tcsiW0SSxobxPnwQAtZ9jNc6RtqHW4pjc1b6NhuVjg0AQHSc3JfTLfJgUZ1LnM71 7Zl+4DAIYgXiGzxcUxoWdDmiTjBs6mqHbgF5GFyBW2drDZ+XEqZxOgUwp3EEq5EP f17A6cVDyoWZtnFV51doZcFmLTX9D3i18fEam9ECEjWxFootA8wsYlvH+aoTsqG7 VY4WIFltuMRh832LWU9OEgC4jBvn3blWZ5OzDaMBcj08EFk4iOMTZA4wJjbztsLd Cl5ZZS9KcJsLeFB/6uHdA3w7Y32bSMkoToY16r3SOcCsrwJ1i6+2ABR7pCAzYGjZ EHz+OeMoqC2kmGyV3iYHRLepRNBqs1bY2DMrpDn5zDyY3DOAdBLtWAmpEE5NOIFl RU1D+6BtUr0zMIHTdBggQiaCU090u60rVLNWmRgDNcYJgEMVafQkVdRuYMFlKs8u hc0yBfD6JWzkFxREWPzxCmBAfTFpctKa7Fsj6X1SSJP06HvW9yLuBRvJ52NoSwGO rT1odEmVqLNTEybjbx+6AlKQRVWkQmGlMgEJdr2w6bRpILZ6THWto0UrbW7GcOSH lzCIGzhk+4MuoW80ki+DVdGp9L+eZv0R7PNcxyZm2Hin4dqlLgzBQixQM/1jJG0F by6Guqennc4E60yAmadbRUsE7oP99B4lJdlEtf3G2jLOBtYeQKl2eYXCmRqq+U9T 85ga9TxKXa5d6sHBUbwEQ5iOcbQ5+U/vPcYJHIfL6EBzOFdjk3O0zCrFIe5xzbL4 MF3Yi8fPhyPrc5kqdue6P6I63r3WjP5VHWLqyQ4a2srovBcYBlBIACaIHRgcRXO5 iyThRmTr+hloUIfOMElaa4H334RtudDaGJm4Na65iw4XBey7PnSkngP1tQMjQ+gf Vyge6I57eBoQWE9AVo5sYGJ8JkonLLYyA/PFF/S55fmWApLX2G9bOKILyijYF59/ /ZRYKgN5wWWc7h5M3XB4A3Br0eMAWlkd5VWmURk4j/T1k/ZmIIUjXafn6MW8ThFh V2zDtDDFKFaMcjugtBygMfyKvfZ0IHz4g+/HrM7TV6955gx64GcHYUZXcABv3r4e C8Y+/dnD8GRhP/z96+j22BMDA30xZV1XUxtlHRZCNrd3RJ363FB/GJ1fCZdvtXD2 GBKA9EPW+zKyG4uV5qeYSMd9Oi5XhkvdaxvtyBpb28IUwVI/bev+wbv0026oCA8+ +4SuFi9CRnU7QQA9KxnluEEqr/bCFTpXLFEo+ZL2RMWsRSXvM0tAtUC7unZYQDoe DA0zaak/3L3eRdZtK0z0vWT/pYTKhqbIONs6ygyFM9K1n7JWMqP1NDNfWOO8wDau LjFaFM11V3srrC6FkACcPOyIPTnLi0j7Y48zSMtX4RgFgBWcmerW7Lj24zMMcGAv CDBMnXMcYuq4FTYakxRT1rmyYgzotoWQEMBWXbbKGu2dIWjDBlGkkgdotD+zo18t oBIKOYa5Gqe+ToCyD1BN4LDNuBhEW5jFG8LUMTWPINPOLLgWfpauMzCkjvE8pcgw g0BcNmr1GDBJUdZlirAKd1+FYkbcopKDCKCTBhKxrubWMJ+bFn72ijPN66qRmFjl z/Ejb0xHhdrakFYKS4qe24JR09e2Pyyk8CsHgImF5v4pVsLWJcjIGXhvU6ykv1mf RxvMa+2PqyZZcKZdtjgTvobgF70s4NJ2gKf4INeAZYw+5AQ75tQ2C9n2AXl2Vclj vfx7zCACtA7xtRlIQWxdpdbyADtsRwbt1Da+zomYVUgpVpn+56jrbHxAOgCIf46g U82suMPODbF2QCEp62yXIRlVU/pn+NQEf3aRd8ENPm9RmBrLA+4lldeqh5UcsdhP KQrJ+uiPzLaKXZSvmfWyyMqalAWyRo4L0oeXoR1X0rdFYBGzp2AE09x1DTVxf+3g 983A5mDn9Z9HyD4E4hYn6f8z3K9c9wG+bxP5TqyhcG1dCzWt+KmTHQA0/2bng1hs R02Bn68cI5t7M+ji2wQjyiR1AQYOrI13ixMRxFscV8R6/OmP/ypmHusq3wpVXNP8 1BhMNNfCxZWwz7Pxm9PgqdUELe0YGqK/kJSyr6/9dd0jeWAKpzlaRwEihYDD17O+ cIDcK8w3SvFMCjPSwEH2oz+AaLJ4cYysXL82AqCcW5YI125fDm0w/nXo5JMUbZlp PzlBylacBbnUGI5o+zc5Q3uubdhbir0qqxgYhPwpjQ4RtkNM4t/ifnPP/c2vv4tp 9QGAqOJhNmJxgUQsLpD/8yuK5/2DCykI4v8+qC3SDDd+993QjsE+U6e6TtoAoyR4 UKchqImCYkDTAQ58E3BpqykBkkVWak39bHUWMisbLOQS/fbAXTwQwCrpCA/GkSlq 3utMuQEGOupQecCxJIbrcSa5KSG7B2xysI6hpeN8azZxAcDSKVvS7v6srbGifoeg UNlCgg1tk2zBxZYgg4hItjSP68shcpxepEgHgyCDaTXgNiDTVhhWHtpzVlZ0C0O6 CmBUt7JDNNVCsYXtq0zP6ux8z1MMSx0OxckcB6S6HDiQw0Yt4bCoI91mMyVhMXdh 9qoRNZ+wcScAIY5oK4A5FPDbE3ZlfZeirzRSyJVEczvoWEjTYzzd7vbF89DbTkvw KMO8B1PqgIHVIytEPefno3EduSgToIwiB2MnKOZS0VJSEMDBtthKKYNTaWxanp6R yjME0NMr1tcmYPtMI6mbwq7xLAgk+IfNX7G66uqUc5yn9wrjQbGq2JG8bqHdrVXa gM2FAkbpNbe1hxL0e6ccnDUAlhNWbCG2BjC1QMquCE5maiiknybMw159XTjACBt5 J3luF5pbwuejw+HxxBiGhkKNNIBlLkaI+1IjlMYvA5YZ1vOXwwPhl0Ov44GvotAt h/XKZT9qdPycHVi6VwC+T2m8/zkO+JBgqgS24ph0Tz1M7Q/R/dzk57hUWJVzCYAT jNRzYhVC4RYtcKJxdCoM1266CJCWX14J0CoIYyEvjuvcw4HUNjcxRnglVpS34IgN yhZx4Ba4afAFqbtcz+XudpzrDiBvMBpyC0FmxsajkbrG9JNCzo3Nuj0HNbBOY0OD XHOCllNtnEParaEjLCwpiXt/FA1qV3sDOtB6mLppKsGnwrfffhMmLxl1p6alWhga MQJA7Z2cD9+iBZTSmVWyC5kYe2UCj3uH0KLmU+xTTvX+VGSsquspoDK9/4xm9pyF S92t6IaZYjQwzPStDtafiVsD4+ha6W5RzdhWGOPPHr4EGF7AlxfF6vZlGLCuS7XR 6MkoO5jBquwJ0vZKVGrba1mTRfTdtPwCbKoj3yTl+wFV/WY1BOOTBCV3KahKg80f GqcIEnApG+y0rwcMvvjoHdpUYcBHB1/HPWufSUfm3ns1HH73e++yz3PCowcPeWYA vq62MDfO1JfXA+E6gXkW6enR4VFA6lp46zY6T+zF/cfPYcf2wzsXkUax1uMTIxSj ZFAIVBwE0J/dfxK++733aVHWFJ49fAQbuhy+91vfxiachl/2jYe2rhZkDYxeJRh7 NDIdrl69Eg3tx5/cD2vc8xV6+doH5Yunr6j+T4ZuMgiOKh2mgXqSKUZFFHzJgA8h A+m+3E3RRnbsx7gEY3cF+YHXMTo8xlQk5pDf7IYVPAy/6H8dMgkOyovKcaQ4Zxj6 YoK2REElxY4AC9KNNT0UpTFN7N7XL+hpuRl+9LvfjdmVzx48xt7DBLc104VgMnz+ i89CGQxzPRKKxw+eEOQxw777DdAIwSjrun9R8KjD4Oxjm+124WjjcnTiTQ1t+I3C 2Dg/vyQz+gtHceZiIFYW17Az2PR0GOXJmdDeVodvySLYWIuT3RwLPkTga89h7ZbZ NwMaW+XJslYjI9hC+25/TW3wFoBDm+4AmSqCmqZ6gmsc7+QsHg8bks9nxnQ1Z8uA U7IlAxuSlyQYR8t4APBP8hl2Yimi6I/HB6MNWcIuSofpdCzx9socYInWeaaySdWn EjQXwlTbXUWfUtdEocoCtg/JmVOScEGw5IWMewZIEBQXlVg8h2QMt2iRpx0DsgFS 6osttsnlfZRJrEcbbI2HukxYalPt+J4s1kLGuIR7158qKdN/ZmGvCwEJc9NTIb+i Jo4xVoKSXQJAw69YlOLo1xMAsW0Yt7mHbO6zEOB5Aot4ApjNwJZu5/E6bjxBUFnM +Xc88DI/X1BIQRvZNQkDAe1JLql41qOYojrlA07pKoIh3shaocCsgo8DXPGxmVyz wbk9Vy1aEsiZbldKiBPiz/hr7s819vP5FsCTrCH+1i5BeYA1Cy4d0mC6/Zhn5j7T Z/m5uxHEcf/sfZ+tkogk15WOLdpBuypqtrm/bc0sfN7GTuJFCToY8Y4dFgzL1Npx xbAgj2eQJ0XIq1KpwZAkU44gDsjGRhbSy91aHvXJJ+xPi+dykRnFfcnaHNO3O0oD eC+HaNgGjigoglMzRwJ3ZTx2DVIPz62xd2DAef8MggmZbscvJ7DVDbz2Xu8zJC1M wOq+EOoI+ASVGxvn/dpXdsiYEVwVkzEtKkX7nUrWk/eTobZ3LrcAmcD7c53WCaQR jNsD24K+E/c1a6TtTeXe1YEvAZTHpmYZZDJHH1gwRXFmuFFZB6nQBdlSGZnZQ2yJ LdHOYPBbkDo17NTiH2bCwPAErcYW6Zt9kamTjbDE+xRLz9LreTyUwja3nX7nN4NW Vjp++eC94PMvIaqP1y/+6x/43t98yTcgVWr5/HXcOAt5eLBB/8RbXAhGFaevJtWD eQxddshNO4XH/qzS3z4gmU03mgsWG9Wn5USQp2ZylbRUHoUSzruO2hY2hJS+G0XW 0bYcCdKTAl3TRYr61RhZ+ScoyQJc5rBBpNLPNSPcB5GGPctyQRdqV23m77WYstYY LmPUp+gKUCTTyb9bgQ8ajqBODZ7pEQFYLhHzBs7I/oIE1VFwLviUod7jIU0DLGZw os1ltGQB4AjUD/neGFGl3QGS+elRp4hVxGCamvBaaUG1S5FNBKcCqkA6HmcEo3CS rgYIJgvH1EB0qphfQ5GBJXNAwD5ALp+DswGra+rewEJHUE+qr5ieeBaC2b9P4JnG +hTCWKtdMhUj4+okL6NX+9va6DhKOSgK2sVBFmL0cjFW9rsV1Fowc8jBcj8cGTQA qtTC2kw5wSF3RKrGvYB7FHD7mSvrHka0rzwrq1KVPMioFxYzCxzjvo4+RmH22TaT fHDwYzj2zoLqUIbBrKHPYx3s524xzpRr3KXtyvjMeBgD3GbDChTgBMowxs11FLBc uhR71Z2gV9zCCE4AKr8iVSFoLYZlK8J4yhCYmlJXugAI/nxgIPz1615GR1IQCZto m7AS7q6Snoz5HFgj/hH0hz9/+Tx8OTnCJBbTygInrpt98oDq4FKAbCVBQiMpfoFw NlKUCg68QcUSwHWLA56yZFbAti38mc+3cpnmlGGWPfoQpnqf6PnNy62kWHZIxY4B uOoAg1lU4s9Ew9Xa1IZzZpIaLMUVhg5YBPPJV08AUjAwsOuLsJW2S+mgyCebNR4c HIYhyQo3qP7cpo3J2PBYHNOpcbdYKYcUkbrl4bc1uIkAAEAASURBVNFRGJckRSF1 sfradlE9nZ2xh+jo+DjAbiZ8+NG3ozHOJNz+++/fZNpTPe8xxzOATezp4HucC/ZC FSBYm+Aeuv1GGxN2qsPTvinaMM0yfasaJ1mMhvJlmOe5VNPma2UQhpwqadlkRybb 3Dqd51lUUcV18T1ao126AqjCKE9OTEVWrIR9PomR3MEQNhMI2lP41dBIqEGXy0Kh K33Nupkup6UVBY6DQ6xlQy33mhmGhrhXGKWuix2ApW0M5ET4/e+8gxGvDH0w7fa7 7Ohpis9tZGIGkN2C/pLOCwOD4avHg0yJegP2PDt8OTEdttg/+eyDdaQTDkZw4kwB DndsaCg8Ahi/efUCOrvAcxjnrJ3RDqqTbBMa0pfo02HWb1y7wt6YY5Tsy3DnNgMG 8pMUdY3SYqosTjTDQMJWDgP2msMdBnMsjI+RoVkLV27QsYCge+z1KwohknQa6CIQ 2gm9gyPhGEBfV0vVNsZ/kmfnBCNH61oslsO+vfvuzVBOen4FBl79bDEsaRnp8qHe XmbKb4f337sLwNuhi0V/2DrLZ9JVJ62u6KE7BguIRKWtrZXWNKthGY6y++67kfUb GaOZPWAnBfC+ivynn4BkD5D/xhsECRz6+4tjUS/tUI+RgVd0RQBwofO1yl5NuYG0 Keh9CmUcdHGWapsoAAXAzHTrIAHQCkC0ibN1kElakYyPI3yVNmWQPVlcQrqFbSsq YooU962kqZlxufRLj0A4yfvbueIUm2lVsn1cy1iDbVizM+yJadck/SNzAVwJbXAH XSwAB8vYT2s2TN0qTzNNK4A4JmVsxXQGzFgxKWLZOdOlMqDrgBo7bDh5rLymDsoU nebyREikUKxzAnA9hckCqKUBRi1CaujoZoBBGoHnIwiLZbI2zIDPQadv+8KV2fAM zW16URUkRkHYJJM0gT/dBlRkYCtsPdh2oYMiboJHUtQWZ2axNuusi2yhkoryggqk G5Aj3IMUswyabaLMiqjP1genclaqSmnJhc/07FU2NiFJocc47Kut1zZg0TbZd3l0 bamvR6eOrTW4dpiD0qVMSINjfF4+gVMxjNpGGh0empuQwqWSHRqKQDMb0JWaix/l GrYAUbKfLD5SPwpKOy+G4iXOMEHgCedFm2d2SylAJKUAjBIz9mkHW0HK7EI88EJs q8ylwNMAwN609g/W/kgI5WBfEwBs96BsKsuNzdM/4buwEzFDSuAneeV7mXmQQbbF n7UDrtkSfsSUutX4AuN9Or6oi7VLwCZ4Y3OTQmsAvRdmlhXITfoQPTP7aFeJHaC5 mII6M8OzMJwGURY+yngfeGawa06y4pLALUj+uFeLcS1c26RP8j5Bg52SYh0G1xO1 rYA15Y/iKr+U8elPxAQlBNVm6P7PT/4fhknkh99/462Qs3MaBueGwioscDGZrG6C bnXIowyOmc5fDC3KddjLEoh+PssH+FbWBrLj+tGQhAzWMgvstEvWRLsxy/6awnat UCtyzL5LyaGLC5PrrC85OeHasbvFZEXTudcjSSzPSxpEIWfkhOBnmb66ZU2JcKW4 haVzJO4GhBiF0+sUcbYXhyv0ihaP8WT+/1+/lgfwrW/Ap79/8+ubfySo+tWXgFbf wO/8Ov++f5bSZ2McZocLl2h1Qj9Cb5xEOo4TRpKHpT7iCMCk82Dvsjyk7tm8Tl9y xu4mm8ZDtUFU4hk7r+iHsgY4CDZE/su0W1Fjao80Rcoyttukxz08gjjZX6/FyMyi L6vXjA5LiIyNUtSRCBzYpRgJ2jgBWkvQU9qoX52h28A01iZgxM3v/F4PkRtEg3XA z+/L0QNkMbUAMFhQQEB7fVUEpYKjQw6S4u8WwKVtqwTT2bR3GhybDa3lRURYsDgU nWQDOG09ZCoqn7SSGsd62KwTov9YUAPw2QB4OdCgFIc4D2DZ2iBFjoE9IN2jVIC4 J36/idZZdg9YABAVE/HXsPEFnupbU0knyCLJl6sNcvavKf119aV8rrhcAJnJc7Id l8bOIjirdvMB3D63WTaqqTCngcmWr6K5LQdwZhM0LMHqauwTeAl74KkbttjN9mSm qf15mTqnzjhO1FG5RpOK3m0Xk8Whd+JNIX8vxvAUEGVuo4UaWmMs4iRpLKLfdADa GetaUsYBy01QoHUppF+gqhUQNYMx38Ip7eFg0mEUBHP2JLRQbZNUjnvLzV+McVCD nMYz85Cv4aTvD/aHnw/3U6hFWo59KVsc5Q8ERGUcsHwY1CWM1mNe93xuCld9GJqR BdzpvhQlEvcAOk9wGP1oTZ8BVooweAJ39cubsKH7gOJSnFRxVTWsanF87wPSZrFy l/cdnF8KX+AAFrILqexE2wkb6SztmgqK0jCmhzipAmQdgt+ZyYUwD3vW1IDmVCA9 NAwbWY4hohsEztLODJ3d3aSFz5gaNEEqB4nAhc4IDFb4rJbLl3gNRUawr/Zqraal 0ozV3VtbjNFtRHICUwcbm0W1dGtTM+t9AuAaQ3NacQ7wAYfFBHyOmDX1N8fry3gP 12tyYpZipxoi5mI6E9A7F51OCvd0wvlKQ67x5hVSvKSjnLPeO4qEgABjbI5+zRjY BoK9cliuyalpJDLb6ENboza0F6ClHsp0+iBsstqp8tpajBtV9QSFlyg0UuvdC+hr 47MFvhYC2eqmjLM3R8WqxWilOFO7LjylKv7nH/8yvPPenWhnBpEdtKDtvESrraev RliHzfAW7a5M9ffxvT1S4t2XOjlhaaTNx9EYEvTg3B0Tu8zI3bsw0XWka+emZ9BE OgWqNbZWuo/W+Pfevx0utTaFJ0+eh76JeVLwHTEA3WOMbDms99sXuskq7Ib7n92n O0BXeONyOxmG+dj2rbu1lUwPbfEAoVOkCt9gQlYWtnUQMHgROUh3Rz0V/cPsxNPw 7rfe4kxlhs9pDeY40h7aeq0S2H78y/vEQyXhSnsTjOts+MVnT+h7e51CP7S3AJBX rPUJ+0PN+StkHF989igUVNHLkvPZ//hheER3hgvvvBlqKO6cXKRll8F+TTNpcaQ2 AMg8BpM4+a6vb5D7W2YO+qWYApd9Vov7937rQ5x5enj++H5MT2eT2l6cnQoj/Oz1 t2/AHlaZ0gJs0E4J1oeNEgZ7D2CB0G3vIYdqIFhGn221/ukufS6P8glqGDAja8hZ MDirpY/kNmv47MVQaG2vjs99BjCbxvmzOnoWW1jFhD5TPhNolvNpVSaRkgAQ2sNT u1zJdCIDPBnIFIDHIucxheu3v+/xPLaLs3FGO7EUii7TyKTFbBpM4sQwGQZ6X+az hkouIIbwRhTiYmmAtVEmlQ2Y3CRDZOBua5/Zg/ywj7QpR8cOU3WEbVaPmA0QEkRW 11eHnjo6rGC7pihk3t5H/gRpc4a2X7Cyw3PIKUFXC6gfglHP4sxUtaDXBrTEtn18 soNVLAg64wxMYhNPANVqyi0WziJIPQQw7FOAtEOAAJrlvQKSoOpIVqwDQvPMlCAf 2d86lxXkAyxzWRelEbY/qysvZEABGS8qwj3fufg12+JJRhXD3CmhOsopoK6hLpxt rETWv4C9sw6BY0o8B996wufL3OYgHawiOM1lLfqmCaLJIpm+LsBPqM0+pGjMoEKZ jjbc4uQdbHY+62dPWSv8DwCwFleKB7QPZgkP0YLGOgDAdCFrsUmLpXUAosVn0jkW pmqzLOQ+wecKWgWrrqH9X03bG4RYrOigF9/z6IROMCmwyyxYFsDXbOMOn28QZKcE BxtR3w/QpTaH+1RIIcFzBjFmmj+TfX6ATzjEr8WOSewr2V+1sk73lEgpoPUh+O8c F/AzGylW6EtOcdX4thzOplKEKBvgMyyA9XnHYkD2kv5b8i6fLIt9bX9670uq/1PD u53toeeNHgLZBUgqgkNILSdlTqF1LsNet9TWcL/Uvoh5uAsxlF2SrJFJw0/L9m5Q sL3A2k9QqDw8TlYJv9pIy7u3rl8I1UkIBnzTv2W61gryw32IM9n/u3zvW/R1rauu jcSk2uXNo9VIKl2/dZ2eurthGCJlZJKgrhb/19MdLodLYRWCaG2Zbh+sz28Erfjy +MVa/YdfLNr/B2P91jd/F6gK+vzyz0IhwBCvP2KTFSXa0WY10Dah0ECKSjE4WyLJ XJC4TOw50AX88bCyEFt7xA0znB5xxiQhdWAHFDspclcPY8sMC30SLGSaQJU3tfcp uwIRNOl3PjPJ4goeZTG8NkGSWh51nMY+tqbK4xpKkgAsgKoFUCkY1ByMfCpzsf18 o5odokpbaxViZGxDJSDOZwM7QxoMjVyA9lFs8DMOxSQPqba8NDLI5QDKdK7VzgD8 SFyLSg5wOWDCFL8gz0NdSbRSiaFZ46AVwo5mcXjWSbenpdDcmtcYfXpNURTOHQga jQDzAYOmIwpgTXb3TgGQGzFyK2IdFKTnxQ1L6iOfFkYA0h1YavvSmn4RnCm8l4lQ 8+OAAXU8NlRm/0eJwM6v2Ga1OKZUfJ6csQj6MmC34UijBiwf5sOvdRjXqGniGQgQ tgEadjBgMXkl68+1nqbCJPDMTOU4lSsHMJyEGVD+sMtBti9rJpGX8dwOr/eZ7KNt meZAbCwvhZ6ajnD1rXdDOYU4W0hDhl72xirxMg5lHutm38wi5BGyZqVEidX1jcwr ryRwQDJCOth04DpR6iKCevU8+ewFuy94Ddk8U5nAF8Mj4cfPn4VRWAWoY94To8B6 y5xkplL4hZMyBTePLGGYNG3//Ew45vff/dE74aNb7zJxBGaHSPyx7YMItmbRhcoI KGJfwbD3v34ZZmEtq9SQYlAOONBGyGk8NwsSDJHqWpvD79fUhwmi4Rf9U2GZZ15B T9QZGKOXL16FdwAzFqA8fd3He1qhzz2SlRgcGSUdWoaxzAxP6IE6Nb8amhobY+Wq Dbg7W6pw5I3hGeltp6JcRS6gDObLh48jI1Zdy+QlHJeFUWoGbYk21D9IqisvXKBy c4vekUMAkJKy8lBWUwezTUEV69dFg3fH01qVX4ocog096SR6zTHA9HfoaJDD885n H9WiT5oklTs7jWwG1uQ2c6c32CvPni3QCL+Vgi6CLKL1uuqiWD3KiUPHTNFSewtB Uzb6ScaQVpIi5RyNcq+Lc8uhuauTGetboW9wlECW1ChAdGV5HhuSElnVaZjmuZm5 0ARY3MbY3v/qSaggqLrK6NotwP9f/PV9OjLQhxQD/RVFWguLi+EH37sTp6C9BMjb MksmeACgPo/soY4CQXtGPl9cAJwzgQsGc2h8njGW06EZ2UpnPWu4xDhYnlVLWzPj TlPC1/0DVOU3h7dZw6mRMcZS9oWmtga00fQfBUyO0xHgQncbPZYzwqeffBGWd47D j350i8xNKjKA8ZDOntN22Hh9cp4RtF2tOJ7T8OkvvgxDK4fhyq1aeojuRN1mbX0t Wt9iQPNczGZ0dNBSDBCvNnWf59Da3gFwTINdptCqupSuCa0UK56E16OjYZ4zWwqI W+S5PiR9v4VNsEuBvYHH+16HphsAS9K4i6MjnDv03XUEMdia/mfPSDeiP25Aq9o/ HD75xafhxnvvMMK3McyPM9Xr3r1w+fpVgpysuH///N9/Ei5cvg7Lwtz4tcXQxrqZ NszjDJq1kpWK8gD2wjLs+wGOamORiVQEzoUE+Mt0htC2lJEZOt6hx3FJLrpTJEIE 1fWNDADA0Qpo1LzavmiKIsFc9JwLyEgWeZ2jvS28c+RpMXvb9ajAbhwDYvKx5dlk z7YgMwzISQvG7JQFRAKEBoKsJc6sbKP9QtU2N9DBIuuMbAKFO8PYYShH/BojXwlO SwDxHRd7YOut30BaRaChbt4+pyn4tBQYzmL8mhIyC11LmJpl/+wsNI9x6AqjnCVy 9qiaXJ7vCymFMM3ZtQTX9M7Gph3vrYUiOg+cHa4CTClAA3xvcx9KhPgIgK3TIM12 kE3KZZwoNlUdp227cjn79q2OrDb37chTu7jkYt/suWl7PmVQpay1rbto5R/BvkSR OtokIMb+wBn8fTcDsqOa62A/KAdzuMMG/iUHJmoRVj6JZOsUULoJxVZZ3cj7UEQE 0RALinPAAmmlrPMmZ7Y9Fs7e//jjMIeP7ey6wHagwh376BQve3nnYPs43uwVamF4 BtUNpJEht6bZt/nY0jPrQPDt2gz9OCsdq/zT8ZmZnAE7t+yxpyxYlSkFe0NKgTV0 cBBoR9pkPk8JgQVxEZcc0F8dIG4mzmykGV2lBbYDE7w7AfHw9NwHpmKz7A6RDkV8 XtmP/2Pd3ZMSRKmAxnWIiGP8rR0KbHloeyj9jPtf7S1QIwY1EdRw/Sf8mwXk2bz2 jIzDLoVKONLIPEqsSbRJ/p3LmEE6gHoDJouL7Yh0CIvqVLYJbOifbM3jI/84fNTe gy/bIXAcp0gzkzPIIBrApNhqkG4s8+iJ6zkrSbvBcK+uxxqgcoFr166OQjbMcP4K yrLZ4/WhG6wGe0jmNAmhZLH5RviT+5/FtrMNnL8JWsb9X/3Pw3/Dc/ydb78XLjZi HwnYdvHxFsbZu/twg4wuFXIX8HGJPLDNGsELWZlJCKJKBs908Tx/M2hlwX799Tf+ HP/4N4DrOdj0X4U05wDWFLR/k4G0nykEGg6pDY1OE9oG0D5Vr6aP8zAALoT9x9gH LDpGgAejRkWQscoGztknZczJM7V9ipHIItqyj5mFRdL4mYAcQRiPm9f40NW4qN85 b/2QTksKD51/35HpJPKVHRVwLbGxd/ngmmyZLh4yDzaLyCgdkJgKk7mJAd/nPV3M EqrALQJbol2O1dVu7mzSXmd8tsVeKWxEq+nihCUO7S7MZylM8AztSmQCOHuRqbF6 UPnBOgDVdlQyi604/CU+S+NSQFrPDWPrCnAiawWIYfNlYVRNSW8CDFOpKBeUrMEY 2HtWPYnxfDkBQSFG2E1tj9Z93vuIYp6iJPpLUl12OFBrq3YopmMAC3YisFrXTa22 1QlWhYBtAkMiNVlWNj4Xv4kuysbt2APxP1iO9AkGQACqPsgnXyrDmo5GCRB8SKcH G3mvk2rNhhXIY00XF2FG6KigZm2VgMHUqGlTK9KdrqVW2a/ChK2mSI0BSHyfgtSd 8Gx8IPS+fBJqam9GNlGWOIHBqSuuDHVEdIWArXVA5CyV7rPT6zF1n2QvWLAQp9PI WpDWysJp7vHsNrlv2Zw8ghQ1qMoYZLRtXv7zp4/DC9jQSsBXHusRO0Kwn2UxswAV akS9B1e9AyC5t98adgA8HTX0rySlYprUgEHNKKFkBPbzpLnyYQQS+YWhp7Ur1MMo ZcDkJzgP6sO2Flej4dwF4G6SdktepDCMQo4sgLPOxs4Qq+tW6jPJhzPgHpmFJdrA gDQ11PL4DzAiy1T8VxMU5ceBAVa1liF9MGU1T2qyqb6K6mFYKBi1ERjKvMJKnieO anYKw5FLyr4RhmorPIeVzEcCUYh2axtAAaoNrS2dVHmmhd7+vjCxfBTebmyNcgQd djsAStnOxNRsPDuNdTWxQtqiqmaq/o3ipzkHhRSqZLNfpwCyGezfUtK6Flw6FrYJ 5usm/TyH0Gmq8WzrbIpdMMYGRmPBV31DeXjy9CVs4Ga4e+etaDRfU0zkfHEtxiL6 Y1N39bA+mwQk/UPjsXjMNniywq5zJZ83PTMdgUgP4LEcMDHzpDeySNdvXKF90U54 9PxVuPveTToVFISXAHnHZd6g6GYdUGzBUjlMdzGM02MYx1XO+B90fSsWaP7V8Oex aOhaJ2wzgMGisQJAZi2vFaTOA9Q/eP891ncvfP4VkhPAWg9AeZ0gZhDpgxriAuQc s5OTkQn+8KM7MSvR1/sMQL5HL1QLxzLC8xeTZBEABLSLmp0aD8Nc163rl2hztB+e D03xmaUEBgwR4fN14A4UkGF7/ZrJVBSkOY+8srqGoGk07s0f3L0RCsliPu99GR4z CKGgqiZqkscAsFkELL/3wZ2ou/vfftIb7rxzPXznzjXee4gxzK9CiwxIbV0YeEEj c7oFfAhjqyrx4VcPA3AJcFcaTtApjwB299ATrh8hd3n0LPQ9eUCqk6p9Kmm2YLv2 sSX5+Ar65pBl0a7A9BH4zcKcv+S6xwDpJ4CdPdhBbUpNPvYWO4Knj+lcq8XnFzbQ LlLQwrlztr1dMa4gn6gm7TkxAksKqNtEA72N77Fn9hrnbRuRXiOZPwHC+ORsXG8L EDPwAdsEYJuAVgHEIfvC6XLp/MIssefoE71IZxLudZNsWtrySrjUVg/bWBrmywhu kJEZpGfgjPVZDiawJVw2Eo0In1jvEs7h5grtf+ZGGX9LNw7ArsV/pq9dih2zfbtM tQJkpKfVhBWKmJfWIRgOyOwBODIq0fIyErP4mEp1zr62LOWMCYJkEmpKKLYCdNlf 2+l++zD1mQA9K/h3YE+aG+pIjSNPwv8t08A9H/tgn+TCvIKwyDXrrzLSSOsDpLc2 8VFc0zZ24pQzmwrrdwJZsIffdkpVIb5RSdUKe1Sb0U6RmMVnTn1UPnUGgLffbS7n ycl8toZM5dwpJbAOoaGKlkYEycusYSZnIhvAzhOIY5jnkYbVtnaHhKCLPWEfbwwM mSr8LAA7D2Cs5jqVvVVbjfQFAFWRgo6Z7FFzJ4w/wHaNbNc3HXJWYLdzCN5Oyd5t QzCVA5C2AK+m7322eDgYTIImbLn2VvC6tLhCep3P51krN4i+j6ADFx9xi4DUVl92 gsmGoPJndIZiDvuTmnkyg6dUbpd1FmdE8IePXAXI29Tf7GyO68v7WPxk5b9knxth hzVy1K7ZY/XETiTNIhMbOwWwx/jnWISF+4wZ5VPJQnxjnNbJczCrfMS9WiBuWv0Y W15STMErXXb+1z//i3DyOyF8u6czdIFvVggEratY5wyurK0jhdFfkk3DNlk0vrRO dxKe0yjB6ihZv409exEfh/balnCxvoWam+zYpejlzHh4ODoS2ouY1IkcAMFy6CpP C//ZnfdDOXUeP8YG/C9/9THkGNndH/5uaGloZg+RXSU42AKzpOdnhIuXLwJWHf4x T/A/ST0KA2kgOJraCWDYW78ZtLJmrkn8xW+//uLffHDn8gFVpL96UQSyAh0gK//k 5rRjgEi7qqQ5XH/ndmiEabBv1xnpNavL/ZJlPeLhWLTjZCenI+SyOaWhnfywyQHa JNVj2sQA3HS1Mx/9XF8jK+mX9LfaTG/IaDYyeT58IxuiwBOu55jPINSLEdUxF+lD VLs6R2N9pzypFxE5xPYYXDu7JEYt7CB+VoE2hTxseqdU7XFNpYBEuxhIy9s8XCBd X1sZgWbs0wh7UgGDqebGqnk1nLwrm9kD4ntSYQ5AtC2Vry9XsI8BdQHVNbqktr7Q mOUaSfO/nEy0LrCTRlQCDfvUyjAkAHq5HF71r75+h8/jkjFEHEI+dxuDbf882Waf i+vkeljNbU9b18miAwvR7JAgELXPnYJ3hwiY6hCY+HwLuR/X7YSlP+J6TZfE0XgI qnm6UWeTA+O1y/0V8Vo/d4H0XrwfUu0RiPOXRYrEVmhvJchSW7wJwCglqhP4LyF5 WMDgXWgCaLGZB3bWifbpr0hv1+mdlbA7whoC8g/o4VeMoUtyvUlAbKK+ORZcrVPY sDY7A/jmnlnzDPZPivdDSm8b47GH4bG1VRIjaPGJgHkWFuves97wk6dfw0b1hHfb 0fjw2j4q5GdYhyx+Pr84O6YNFdvncZ1vX70Gy9gYVsanKHajAwT7egU97TLgUmG9 23wWYHKv90ks7KqExcrF4GcCZi3UMfJV5pFB5JzFczg+K6WYD20QjfUnxhidyH51 UMMhAYUpsPh67mGatFqcVY6R1Yhvri7yeaw1VZzq9JYt0MM5CZIs+LlIpX4pFd1T RMeTpHJSsgHkOKW+wfNK/qraBh4mwJeUTB4OxrZIKwuk+zD0JdXN7JUQhkn5Go7e uN5DQAdbOj4XPvrBB9yH2rsJsiBo6dobANIb4enjV7Hqu6W2NowCZu2vqNNeQOua gwGxhdUp933v69ehnzTydwFPGRjlJRm0yhrOShYgeC7Mch9dMFsWqwzxeemkGLNg 9leXh+Nzlulco8J4DS1mDXrBVIDMyMgoTi439qkdGh6F3UgNPV3sCwK4XQLhmzcu URSGk4M1Xds6Dm9euxTtyNQ0wxOQQ3RStLUGw9c/sRCu3rxK9J8fhmFKTbldrq/F uaI/Bpjmwcw5ZWcEoG2buHe60SHyzJ+9GscIp4eWpuaYLnzVPxLK6puidvLBkxfh NYa4C9CcAnAYgMHc5xnfutgRA8HHz5keVs/wBeQJY+Mz4eOvXjGquIn3ddTufFhC flBB6m6W8zRIVudbt6/BjJSHF4+eY0fpatHeHHWVv7j3KOSxr6+3FQHANsNzwH8G QUMjgdXm6hL68Mm4Brmcx2ePekM/PVWLGlpi6yQLkrS1t966wdkoCb1DX4bjwhJG 0V6Nut10ct49b3SjgeuC0TwIk4C//5wZ4RcvXAyjfM40zP/dj+5EpzvQ1xd2cZTX b96M6cRH97+MjFhxaU3UeVJ7T/atCjtAq7q5cQJ3GEn22BLPc4j73wfINLe1wvyO hTQKvk54lscwn0nS+Ns4ZMdDL6/uhCxmwieSyEQIEpzKJPisBMBvY1O0ffXY6gE6 G6xiqxqYeb9A4FRYURAasFPzAFYJjXP7TvCaxVoDVngs+BgIAOykBZJnNPf3medQ 0cyjA4xg2wnI9UaxZR9g16EwV5orseHn+2ve9yHjAxznmmCJkfQ0VNAyCJs2P4Em d43sYQb3lVkEKCODg+8qyEP+BWi2U0YR/aMrjtBCrjwFjFDwAsNn2rqsAvkNWQnl DmsACgmjEu43r6gi6g2PT8+nVKURGFiweYQN0SbZmqmUNPEGYE7/l19EZo/zq09R 4lXJed2E9RIN2blFidroLFrlvTX2Avp2QHEO9qHYbCQ21GE9J2gbBXxxKqVrxvtZ 6DwPsNmX7cUGJ5VvQQ6ccY6dNqlB2TqkeAsGVxmDoMKCu238//j8RpikPqGstT0C 41kkTTk892x0teUEnkIThxfoi7dSYLK5Hzw+/pDCT7SzSUgZC/9kkUdhaH3m4gQ1 ug4Q2M3ehexgahZSNtclCzt4RFrbYikHKRQhR0gAeJcJbCoJgk8591uQCT4//ZQ2 JnYFACvYx5aLgS0/l5A5zEaSwJ6qgqczQKo1DnpGB1gc4ZTtya20Swyj9ML2nQJc ybRMwK6+RaLIZ2qfWplk2xaijOC1FmgR+vCZEkc61VT+p683RcpfsZViF96dM2xn IvGLRW+8OPp9ZZClAMonrwbCv/jspwS5xeFiATaWT5xfpjUm+1g8UVJYE+UtzwbG AaybdF1ZJOjZZ4/CdraU02WALN0xBcvUXQxOzMUsx2Myon/x4iGfFcJ/+f6dcAm/ 8g/fuhr+6Scfh7O3z8JFsu0N1AncpaA0C9DKBsMOQtJwrjYB7Htk8rLQH9sqazed fvQUYF4uaufSaSnHIJAFsFqtaxU/4W/9JzKof+vffAj+it9zkfxiAVJcKb40NvyF h8vD55+2KAKyM+WtDz6Mba4S6N7WN0nlcK12DBD4SrFvkaa2wbxghvWPXzJ+6Tin JQyuc5FtpWSanPZ24YhIKRs0EHWVWI8dqFwLt0wN8u0YdWq0rNbDV8Zr2gPU2Ijd Aqy0NKIoNpGtLfYxfNtsAsEg+ZXIZGqwBWe24bLZ7y6Up71DbWJcgAOT0TrjmnLY TKl7Di9AO8uGVAAvGMzPcbtRdUdqV62UhQVFXLspFbUhSYCuelfBn6DXnrBGdrE/ GxvOVPUR66e21rF2tjxykILrowbJNXf0rRrUMxbaVlr5fIZspcUGR6SS7SGYYHMl +eWBOOB91aJY3IZiDJB/ntri9qLcwapRUy1GevZRjWCPNbNfbjKfXnJY8F89/fje MrC2rFLjajpojeAEWVKooxerjPUKLJ8nyLTXCtGik0FMmdjwvKqEFAuSjmlHfcLm pKYn0YytuXUAK6kwcUxwIlq+2Ex1bCmjYodmwvLkNKCeGcVNnaGquYkDCVM+PRlW 0EFtsRZLQxshFzZGw5jAqOZwL9lFpWgtiyN4POE1aRjvLfRqS7CJmxhjp5JUo50y 3a+26euRwfDTx1+GcdIdfwxDe7u5nRT3eHhyOBH3Zym7pphCEVvHaDSyMIAJC1Zw oDsZgKQq9Muke14SZb4GAKVikG0mbh9YJ4Kt8L77s0TeOEFZj3R6JVqNHjWzvM4+ pDKQOsbivLIwiYEaBDgdUYDVQD/JA/bZJoDQZtn1aMiohKMwbZo56jRp5v2yeA4z ABu2FIwuelYYVSvFZVhLeE/ByxRp8jIAWz65pwUkDAZPFVQI7xNhL8MGF5XSrgvW eRHwuEjrnfK6Wl4RAJATpEP3QlNTI+xzOlWhdATg2m1/MwowtIjClDUHIzx99jL0 MoP+t9taYjC2QVDVWF+NxngRkDoQvs2YPodFjE9NhzGGCjQAEg+R93z96HWYob1Z UXVabLCvJKi+Ac0vUg91qCVcd21NLQU2zDxnLerr6qLDnQW0H8Og4x1wzAaPx+E6 /UTdf4swnD2XLzCekIEFA/1oxOjxCytjVbmz04upqM/jeU6MjIQXQ9PhbQqqnJA3 2DcAeKyFxW4gjbdKIEFlLfpjkDKsHqk1ztIlAgGzI798+Ay2toggFoZzfAJ5yQSg 7ippdMbvPn0e1kkRfoimdIbgxxZWdRSrNdXXhD1Su1YPN3dzfbDuFmqN0lz7D27f wJAj9RhmihMSkhrY8xlS/bOk1NrQDWdyD30v+snypIXLGH+npy3Cmr1NF4RSHPYX AONtmLvbFIuV01XlEay6Yy4v8jl2MHjRS2cBbEgR58RWar2vhkIXFf6NrO8CrOZA /3AoKAGcAQJ6YZ5/fu8JGl5AJ+vqJK8U0sZdbY2QDwDW0dFQj1TnrZtXSMPvhS+Q RHz0/W8xcetiDEBO2R9Xr1wFyFD0NUdbNfZxfmk3a78WNvtfhQqGJKQD6gaRy6Sm 1vA6HDBrugzTY8BWScCScYgecptgB2YsBcZwgZ7Ufp230EMmdsYkPZ51PfcujWI2 oo1gV5v0BGlFdQ3t8DhfUDlhlYxd+gYADYdZy75y2tICUqzmuqqYqj3EPmBdI1jN 5xlLYBzjVyxE3cK+nRK4r88xhY9gxUlIthTSZqmDnSYIon4o1ACQdbqlsPub2OI8 mM9m9jEGmmybciRkSIBPz1kerKNAxiJYNauV5cXosdF8c+9JzmJ5sjocjLBXRx3H Sk0AUrbUWKUNANpirwNc8rFx6TRfdwiIk4hWFhepc+Cc1zdwHwImjgL/2wOYVcGE crEwbbTA4hm777znTO7DotqK1EIavZvRY43x0xmsd0m5YA37jQ9Ow9ckAESF7L09 AlfHYbOVIDVI7bIO29ht6yKSnKlV7H5+Ai0q6u+c/GS0/9Y2OPDAXsj2DLcYSs9S S5CsP1eyF4NTAOlNim52OaNLS7Q/IhWeKEwJZQBPpQE7+xY18eeCTPwumSfOZxm2 2GmCAsJq7msfrKGsTsZV5lLN6wr2sLy2BgIkEeYOaLMEi+jqZGWiCeZZW0CVzMMO 48czWBNHw6bAZisPssBsB58fA3D8rT1eHZSwA6BWN2tGLiMPgEjm7NjgAkIiGzba gTUpPGOHCjgVUlCv1tXiTmBv3LOSP7bwsuOQ6IH/4BdgVKnjOKMtgP7SaZa2JLNN 6D57yXoGCS6+w/cNFCSbkCBwjT6UNJ6RrTvdw/p/n1M6PtiSKkm9S63NZD5ehn9y 8i/Df/rBB+ES578ZX79kMaNk4QkZOpjoVbTjZQSDDQ20qGL97UzhryQ+5ghZ4gzB 4H//Z/8ikBcINY3l4Q3kRuP48BfLM+HtS93hA4KrxwTyf/bFg1BKhug2wW7HXTqi sJ/3IF+GXg6GJEWmxZwXkbl6ZKUNgv0sbIMZQ+sVRrHRjTDCV7nv3whaNQp+cZ+/ /vLPAov4xV/i93gQ33wp1OVYs4jQ3B4Mmid/9O4Pw+27d5l20hIXf4OUdh5gNBtH b9SiZnEHAOV7FbBJuA/SrYzwA8iajnRzJ2AdTcn6/nsYAZlTU9pGnDuwX9sYU/tC xpYSsIj2MpVes1m8DJrpC4t8TKlmAVhNSWrwdNSKuS2yMbXo321/YiFUNERcnyBO 3ahV0DZ4twVFgvc1zWOgsw5oE8DVUqVtcdcaAIP9S8oQo0Xz9Wke3hEHNQ8Dd+xa uc/4Leo6iUZtgeWgAFlidXLeZ2RBAeO2c+ESONxOlWKjubwslE75fFoV6XfAsrqa c0aA6wVo+kRMgWmnV4jYZYnVkhWop+LerNCeZWNqlJIAYuUXtpvymgT7MqybyCNK PPBo//ZZbyN6WVmfFR41VOKQFwAIjj2UcV1a2CSCgr3D0C9xuO2eUEWrE/tw+gwq GNX6Em1mBT/nhLFpjBESmtDWWMoaMi6RiLKG4h1Tx1YwX73ESFBaDx0DliwAedr3 NBRUXAnNrHEeTlOGIzVJY+9ynh/aKhs221JlhQM2RLPyU66/paQs1Lact9Jyhr3C 9K2jfdKtOAH2oRWYdaSX8zkci7BLD8eGwhiO4I06WmqxR+3hNwWwWwHQZvBcmBwN 2EJrhjHySyOgBkntWgEAQD1tP873F08eo4c9ZKRsfmgmor2Lnk3gesweM362Z+Ip 13LMGzjpZRdnskUHjcXl+bg/chrbwmmCKmb2wwrpmFrSzAYC48Nz0bFZRILsO2qq M2EHCpELWO17RoRfxMFXrjI+PIIxmYbFquSZUzQzTmEVzryxtSmm0p6/fBWWYGQv XrkMW8D0q9kpCq1o6F/kAAFaluD48mHZ8mHY1FFy1JBm1EYpx8DkS5xXItS0t9Nm jTF8rGUX6Tgd7Qi6Tp3qt25djgGUjrKttZb7OmNiFYCHZ56OtneGwG+UopGGGp4R Dl2pg+xaPrq3xQXYKdK4TsOy2OqEPe4ZeP9WD6lGpQ6z9HGthaPLiLpZ9cXlOOAj WsTswmB1M+WoqbYsvHzWh5Gn4wAObBnZiLo++1ealRkdGosFZ3V8/gzB0wAVswVl SCnwHI+fD8V9e6f7Ipq+HSQLk+g8K3GGBRQI0Eh/cQ4WtZYG2MkwNjIW5UNtLU2s 2XJ48OgF+lMcP0yYjKbVtD2Xu2Aos8K9B4N0V6hBowebiJ1ZweElfV/u2T62UxMz 6Fo7o77WgGyJ/sa3AYMCzeejaHkp+GpjiuAEQwLsD3mHfq0UXkdwi9GiGAitPGdy gO4KNQ0AY7I+JzAXEgUNBGAl2JkR5B2mMds72wCHx+Gr/mGCrWqCinqa868gpRiA GcyOjNXw8Hi4/8X9sIGOu4a92ve0F+3rLtq1zpAKQLUAbIX3/6CjOeq+Xw3QEop0 4Pe/9x4p5KO45zrQA9fV1MAoD1CgtxQ6L3cDYNDvrzyCsaPfKcBtm3spIwirQzaT zx40BZrJenXAjm+xD59/0h/6n3wdKm7/UfQH2j/b9zm9rBSQVw3IU2Jm0ewWjFAO Mooi5APPKcT6+OV4+K+732M4y1pkwNh+BNTrTDWjpRwAYd4sACDFftfT46RELe4E LFjMmmAd7EOdLwOHsbQeIJ8eyxOQJoKhfD4jwVomsWn52PcjxIT7gM8z0qtWemP2 YD8Z0wsT3oDEh7pD/A2FU3TssPikCG1qFQB3Yd3JQkgfABT2E1YuZTaojklXNQTt A0NpBKYzsOD12B/0tBThjbx4Eg4SaHzL0OzDoIP+AGVI5zioB9iXgcklphKR8s/H TwGgisoKIoNnuvkEuVUW5EcB+2GfAN4MZx2DCZTzWSBbiH8rwD87pVD5T301XQ30 d+xD5VJm6nQyB2SHlCMcwaYqzchinXaRkY3ToqucTgqec/t9q+XM5rr0LUo6RAh7 2Ec1pEr9JMHsi21GqQQt8UkFgTx7ox27sAJoWyXIG5tmYiQATPlgBvrKLAAroQX3 CyiE4TnGPhewDnYOsV+6GUILSVPYE0Vch515zvAJGwRDCUiKE5g7pTTpACTZUId+ bGBrN9GVnEF+OODIoM0pYsl8WkDx/hI3Fv5i8AFv+ADOj4SV2cUktqASUu4YsO8w iT38nz2GBa2eM4u59N8O7LHiX2mE9QtxzVkTiStJMf6P1lbmFnxDwGGG2Q4pB7yn NSHKDtKxpcf4/KhYBScIQ8UAglbX1aBLAjEWqgEgxCyyqMIHZS4Q2lw6z5Dfe9oa wv2nz9gL1NV8/we0iCxEHsKkv0mKeVmnJGvQQeGja+hnlBclIJrwR/xPgJwF9rnY Vhv+q+99NzyfGWIAQAN7OD88y54Of/nkUfjDt7YYCd0W/os/+nvhP/mn/3P4x0v/ PPy3P/rj8Ft37oYy9tyrydXwlz/5NOQ1JMP3P7gbGpDNpG/wnMmOzJFpfdg/GF6N 9mPD02Khb2ddNWtEwKID/ru+BEDffPnnCJ74wze8m98ziosaCjal/65GZA7DcKGq J3zr/Q+pXL3MAtDLDCNt/zBZTCMfIzIby34DuvxZI1YF7pv8u1oUIxLZTaOb8x5k pIXZcKZhBYFeTwSwPG31mYJepQkWt9jyIQewppg+9k3Fipiqt1WJgGufVEQSoKxD tjDJ9L2soulxwaT9+vwM/ydraZpcgOwoUllG30dgWE7bEen/ZVpxWWG8DTCyX55M sml/Y6e4aUjFHbLxTwB+Rl8xSgYw2/7CGctJDptaHYuZ1LoqIs/BqMt2WlnoHHun tQisBbYrOHDBVyHG07XDVkZjYrpH8GhR0SQMpqC8KO88Is7gPh0Pu4vEQvapBMPJ jbNWHAxeX4qxmCSlJdDNIW1vJb3FWgID0xQWalVVwNoRiamjkvndwLHXkWqzutS0 6RkHohFg5YxmW4xVoW0bpa2HerRmtIn7sEAbfK+dGfTOip5H72ifRNd6cITJSF0N OO4yWJ/VsPNsIOzLSDL1JRVguIHlnweUOsd5YWaag5nGtA7arQDMzjgE8L6kxtHG 4IANjFIxjGes2QmGXIC5zT0s8f0d7iMLY1eGw7PtygLgfhaDZ2VzKc5/dBYWcJye mxRZZbJn3BtOKHE94j4miEkhkvVZeb+y6FY7/uLR17TKehWSFXWhkfe50dAYuuvq o5511YIOjJXcRz7XmguYOsOCHKhn4/k5yWydiHKa9Z6A5VyH1esB5NSVJ1kvpuPA GCj3sDcsNwo7gjHOZTweqWmLcCp4P3ukzi2g6+V9TDOXwPJsc++mGysASAlAgQBJ kJiHBs29tDyDphWjXVxOIQTnVp1lRXV97CUosyvDX1RcBoNAkcngIMaUedCd3Ri+ s5jWbW8GtMBcTM4vRfbkzWtXYju2x70vw91rbVEK8JOPv0LGskV7J/SXbFNB4hnG ur6mLrI6Fi5dQD60eQDwheW8cZl+pET+kxNzMMArVNKTuibK/hjm8ozg4GJXG2NS h2PFfndPV9Rzj8FwCyLaACQn7MMl2Nmyqjp+XwiD6Dmr6moBnokw83oQh3xA8QyA HvCvzjXJvr9xFVBM8PTg0TQygVbsVHp4RXrbTh6NtTUwxcv0Ox1FatAQGlnLscFR ipcmw3c/ehv7lBn+3U8+ic7mxqULFPTsMzRghMbYjHwF4A6hW90AfP9H77xJgJUS Hr6imwH7ppa9cQiYfkawY/eRbmQBG9imkYn5UFFbS2eLbAKQKVL/BMb83ZGIq6xz z8V2zlgl79sfHgCyy9o6YgZomuczC/tRBTB0yswSRRe5BB+mTEcHBuNUrBs3rpAR qYyFVnlka3q4Xt42dluwQ8kNmGk1lZ99gd4XYHP5QneYm5jF+dKOrLOd/cDo55lx mv1v0LifojP0jJ+MfR36AfB3aBzuBKb7X6EHJui6w7nOgik6oOCtEu11AkZ6hb23 MDWGDKSWc8AeJNBshHGtqqrBRlDDwNm0NZDV7btkSE6xdS1vfyecwewfka3ISpRD fJBaZbK36dwMUpZZ/B3HwH6GgaeITwLDSUP1zbDx2N2pGYYeoEFOwhDZ0LLQVDWv d3hGObp022RtsifMZmzwXNLKyCRxplPwH2YO1zk/Zp/sGlNUzqQt9lcqdlMgK6li t5VTriWH8yeQyQZw2PVBPXp1ITIgrlFZiRXqFk5a3JPPNftrmsU/5RqzkLTkIkE7 jEEs9grb6cAMZVIFRbD+FDEeYLMWlhZhU1+G4mtNFPAS2HPdgpgMAsk97MsmQTks CT2ysQv7TkqEFcN+z2ITpwn6a7H7FvXReTBMozneZqqRa7GDv/X8WG9SDDjJYzTp LjKlHP5NJngbltke1soItIcpu6wN93mMz3bQDctFvQAYgTUQrJGfi8GqRcxiAke8 VgJyM1jHidWZkAHY973MkG6iHZ+gC0lpcV70QWe8dpGzv8rZVw7jqHDbWcahDYDz PJ7JMaBa3yazU0KHkFgPw/U41ncWH7br1Cr8p88swboe4z8r6ypjJjKVZ1YBKFtJ Afhj360ZWTgjiwW7neRnUrmnM8iU1BJ8MDIQR/faizkLP2wXGhvuH6UR0MBseybr aipDBWdlbmIqMrrZ3GMK+1YCISebbDB2hkvGhtNODAwhoE5jXZRRCFyp2IqyMyIC slesLb/8SgdgIIyIYFT5od83V6rkDw/EmoqlBKBgFa5N4WG6Ru0cEUQ8ZX958YKf HwEC/1UO6P7ynHTUVoWfPnpEe6v88L3LV0JFU024hl76FBuWBUHks1vEnzhJ1Gmj 7vkT9qFdEswA6+v/8M6t8O46kwPxuTtkro/JMv8ln/Ng4EV4q/sKHQOuhH/8o/84 /I//6l+Gf/Rv/iwGeFfq2sAF8+HfDo+E3vtDYRNJyx9/7we02sIGQmrMTYyzTpPh 5q2OcKGyPqTvgMQO3FLgTW/lb38JuL75+uZPgjfWgi9/xD/wL/x2/svv+kraLcBg +fX2dz4Ml25cY/oV6Vci4A00JLayUrNoCwlHhbFukYkzCluFEXAsqoyeLKztlBzV alWlI9sUKKcRjdrM2SpRNZZWmwpENSBgqLiYPmZ1lKaE1X3skO47RT5ggY9gbo/P lTH04Jm2jdMv2HhWcJsSsshJoGgFpGytzKpp9U2YWtfFzWEKy1FoNhn2tudhiRZx +Hukq21AbDRqNbEtMpzBKzvgvabwwDN40IJuW3eZFjD1YlrM9EyakTL3ah86AbCy AXBuBIhCdDeQrTCcxGTHg3VYCcHUFgU5W1Tg7xNNuhBg06hnKcEw2I5jGaZR/egk +hNff57ayo6dFfJgXzXWRsP2i3PWezGbc5mU4whaNyM8D4yFQK6hQM33ciCAgxKM lMuJMjeIWmWzazCIztyehjUtRtOrVGEJBqYdAGYz5DWKR1pgjWSfXw/PRi1Sgusc mVxAmF/CFJg2WBRHRQ5FjeUSjFVBRjJcRFvZ2dwG64WBgu1dpg/qHD0Mx6enaLcx AZhlEg33X0ALl+aK6sgoOs3G9iEnGOSYjuBatnlugsUiUl/5fF/ZSRrPOx99A3w4 u+c0vKZd1s9ePw17rGMpkoAEmrY5wKWtsJ7DRllcYNGeETwheBiamg4/efBl+PGz x2GToKqRn3kHJvKNpiaMvxWuOEMKwQYHX4UnL3qZzDQIWEdLR+r5FKeThYazAla2 EKCbyp/VrLUAqigGjunRBmQXHc0U7AGwRoeHYjrPPe8kKBuG15LmZttE5s/Rihcv dBI9U5UJwD1CN1RfL2Aj7Q9zZcqntNbUIdX4sKhqxwW7MjQ7pBkr6D5g+6V9nOfe Lr0rCUYMrF6+7o+FIV2XL2I4lWdMxbReMSm2aYAhYWS42NIYHaSdA9Q+CY52SMVP 0QOzp6cjBjk2ureVS8+lrsguPEHH6ZzzJAHEGutheq+RCUU6tEned4tnlgpQnQTI PemfDVUY2Tyo5hWYOyUBFoyl6GSwB4Wwoc5/f9bbB2MBKOAaBvoGYuFWJfekJnAe iUQ1jtDikx1eu0C3kQttsFqwtWkwvBc7CTgojhwFhH3W2x/bZDm5zmlUtbBAF9sb MPiH4dOvngJKS0nRN4Ucem2mIzH61rs3KUAqoe/oUNQVdzQ3YvzXw4tBUvCA6wJS apNjY2GC51BISjQH27Y6N03Lm5NQT7puf2sj3PvlfQKaROhgOtk4jPDDx6+xC2g4 sXkvX1PURR/blsbGyAL/+OP7jDuupNNCNYwrLD8Atq6FYSXYsc/uPw1fDsygJQYo cnY/4XqPAGH5BSWw7vRTnJ2hHVcLWRDaik3OEMxtE0i2REnP+hwdMbCfH33wHoFT PQzSGgxra3jz5iXWcJ/PGkUOUUJ2pApJxHT4s7/6PBRwpt9980rIJq04yzO/C9te gK1b5v4KYByvdAOOcXSPfvkJ2Z4VAiUq+LEr+4ARJVFZ2EQdkuDG7Nb8xHSYBSzb v7SegsJTgO8mwVsOz74MrVsl0iI7n2inlEGl8WdBm+3tHHAioOqCmXZPvegbCcPz mzE7ZncF2wuukXZUTrKAbGN8AgkQ+2xtiTQkgYjSpWmYtzXApf04rWMwE+UUIfvz VpDdMb2tzEL5ldeRiQ2vhdEshbWSdTTIL+G+MiiUslOKUpBtrmWde1cnm8LP2a5v c2UR3wARgR3KAXjqe/QHKwQFz2Cov34xTsaDtmpIPVJY24P9hdgCsYsgQH2qmbEd bI7DeFZg+22/6FSjYmx1NsWySj38rBUAcA6BrsGR6WtlfRZHtrLPCrB9jqQ94xxN AiT2eb16SDtfqDm0jZR9UB3+orbbYT7lFKQ5DVN/buvJPZ7ZAb6mhU4KlYAeOy3I 5hooyBiusp7KehyqUwaYL+T3XYIBnBu+jkwp1+q1QzsT5ByFz37+dbjHkIwEMqgO 5B75fI7tKRPs7QpshC0YC0jXZbMfJE8ceuGgFYkSpwemAcJyYGQdNqSMzX68Ndgj s5lV7N3YyQHfXsgaOnErlyC+BjlOLa8pJTOmtrWtqTkWEZ/wTIpLS8mo0XNZZps9 mgnoLUY3Xkw2qrQEeQHPgDwk5409gP/RnhXzHpVI0JRnWRnv803wHuWAY7X59i6X VXX8cTb7VmwV0+KsXSY1IvaUrcC2VwLKJc0cCCRwV0PM1sPPw6DySwLJLkf2mRXI 57A3zTw4GMFRurKTyhLUMQt24y+IM4ewuO+aCB7/9N//LPx8qI+hJInQSFcQCZxl CiXNQsLX4uNL8AMEWQursfWnLcAcT8wTI4ivCG91XQwXqhsYBc9gH2wOKxGGKdpa IciqJGP7e+++E/67P/h9nvlh+If/+5+Ef/J//3n4d70PQkoBdrq0OPyjf/WX4V9/ +imZB6RA7N2Otprww7dvhQ+vvw2De4GAiSmfBF7aiN/ItH6jaWVd/oMvuVRX6xzd y+/x5d/5QwSvAkqE4T/87h+FW99+lyIOKtVgWOYXlmNUIeNqAZD9zJy8kU7Uy/kA AKLF4PCpj7SKu5BNmOMCsyhgax6MUTTgE3ApyMzAsQuRRYICIaPhI16/fWyjfA4q G0JQaPNg5QRS7wrSZXf9HNONObAjOmNBo2BS5j/1VMOB3hajcQADAsmCdBBdKo7d ca1niPAtSrKIKrYn4vdVjMEqB9pG2mvr+ywwDCKH1AlTFkupNTX2EYD63rHPLGuQ mmAj4bRMT8siu7aqXIhnYwpBptiJXRoX263IFLoeVtZr1LEpNACHtufepep3AHqy zCdIdpVdqAO2vdbyGA4SYL/IZjC6cgqJOhefsVGY1ZZHGAPbXo1NwfDAOvmZGs0y fj7226QS2TYoHoB52lbUIIfYIbW9iDi6kg03T7+2TYIOq6e9zteDkxHwC9r7SamW kvZxcsgEwNTZ8eWkU54OjHMwaCFTXwk4WWQdt8LN7ssRfA3QdF5ZxeH+Sng00AcL maSHJzouIrx0csxJ+iN2AGKzOByniIvmZidJAa8B5lk/7rEadv7CxQsx5X0Cc2Or DnYBxgz2AEctKojJAABAAElEQVRhNWg5oE6ZhaxADWn09y/2hEbA6VFKNjIDWsag o0uQ4nGowD4OaBWAvrZDcU5bY2TjBbLrgIzB6enwSf9g7DiwzGfVYZyu08LnRhfT PwBRO+x/thYppOLQ2MRUK/6ezmce8/xM8zplJINgZ8VAbRFGp64Dh1CBwSBdO4Ae kfGgxRjf+emJ8Bqwe+PKBfZDFmwpfWiXFnjPxrjPRkdI9SK9aG1sJxW7QrP+fgBA WgR5pqcWp6mQxtg3NzfFrhZLsE+1OCyLBlZYfx40PVUZQMDenyTK1VG18N4nBHwz gNBG7qmlrT2epQl6pdbUMCmLnpiLSChs/dNOtbZn8zmsoqzx7Ws9OMq98II0vdrL +vqq0PusH0nBSrjWgzOARVyl7VYlo/1qa6tJg06F1/RPvXGlkwAIcEmTas9ELTKR FQKdl2hOW0g31+KQTctPUdRlb9hTPntqCQCLzjAdcPcCVnV4YiG8ffsqQPYAPexS aO1sJx2cQmupqRi0NtZVcdbPYp/IYhyGLJe9AVfQWL0JKDcS/aveF0T99LyE0bS4 Z4mg9NbVtth/chSt5BmOoediB1o+JzItxvWp5FwsAwDHYMoFqe6fpw9fwb7ATne1 xXPx4vVwaAQIJnF+k6T6U453w3u3uFakSz/72adoFVfCrUsfEuTba7QvHOLo1O/Z n9WCpRoCA4NngfESGZkfXKA1DGf9AWDovbcvhTsAx5XF1fAVKfx6nyf3Ngi7bPV9 cRXTxQhcp4YHYkW9XTNmx+mJODZKD1KuiereCYLt4ak5puZ04ozLGKc5FlsEJcuq Iyt2SCCzj92updBPAOBgi7eut9HF4DKaz2MCzflw6+0rtMpq570nYGVn6dF9kT2a CH2Pe7mGsnDz4vsEfodhuPdpWAcw9OAotftmvPQLVuwPDAzHnsNzUwR4dL+YW6S1 EVO39jlMKdhtA2NlTRXF9L0GUMyzv1fWCby47xHaHy0SyNckdmm7BmsD0Ld6exrG qI1itV1s1bOnvciUCMq4DuVGxYDNDXzBHvtocu582pHp62yuyzR+CiylY6ArkxQC zpmu9RqoPSDotP5CSUA+r11iCIMp7Gr2rYBp10wHweMKAZjyFQMt5QQxKGS9jg83 6NtpS8fzYS8nMMQnAAozjusA+lO6SmRmo3tNpcCMIDkrl4lCGXw2AabvJ2g2Bb3I ++8D6tNY5yL8TgYFc0fcC7AIMoHenti6HAqTUvBhWexHDitnHWKE62bBCWSWsPHo QiWG0LzvoC/VLymjAOdGNtWi3w26yrQ3cQ34xiX2qEyjxTt4KWyDek2sK247hT2Z BHSJEbRxFp8tY5slimTorKK3jaW+UrAsu5vJPvDDMPPUCaTQU7gCtrooHMLEWojq 9DzbQ1YgGzJNzjGgD/c5k2tNCMsJOMtCW0lmTl8IiSLJ4vjybZrV1+B38vNgUsEZ W1yTBXZ2m0AIQSBSHP2xwckR62yHhzxsxuYCenrY3dg+i/NyxnNfZX+ZFbC1WibX L2DdxYfmAWTTuK4CgKtZY4fNHBKsWFNDd88oPUmFVU9Ppzcrz3ef4CFJ0FhGACe5 sMz5PtmnqNCAQ3uGnzCg22PtdimEsy7BcagysGZnzfaKvST6hKO2vjrNoH6FaxPM yuqyCjwDUAV+M+Ik1kv7oSwC88G10/qMZ1LNHr/3/Dl+sSjc7cR3kerPhTASW6S7 RmRY+hjvfMpEtivYsiIkbGKUfe7T56dEUTDvUARZ7MsllWH1jKlXBMjb7K0aAP4f vfetUF1eFP7iwYPwbx49ZGcEsqxF4RLB/yZB6P/wr/8cW5Ydfvv2bWxkc/QjhHMx K5Wso3MLWVs7evxG0OpNCWrYE7/+4jYjIHGu7a+/PLW8ztf6+xyR67WGm+H9734f HWsrmw/hOqDOaVcJtEb2TjNFegrCL1MHxMJbfe5XIc5e5B9TANDMAht7odqeSdAo E+p0nQQHJEEaX4thAZFNfp03LHsrw5BHdaKXtU+0xhlinCsVgxg4J50IfFNJd+SR LrDKzma6vjgBqNoxzUJ+QySfhrDcNPoZD4qnAZDy7hnBSsSWTuGQBLWVmPtsWIGk DLD9Jh1llw/4Yy8YBkVQ7Rhar93uBNLyNr4WxTjeT4bvgDSHC22/WTea7O2x/86B sJJQrYqVhaZjY8cD7mELkOw84FwiTc4VulTSW7xeo2G0ZZsOVo7IhHYjrF2COdUQ 3YDcYpgJQBzRs6PkZGoF3Q208tkS9LK9Y3sqoqmKcppEEyUPkp6UxZVxHoDNKcpF l8oaDw3OhUY2nCvzAhDT0VAZGemHLwbD+Phi+ODuNRi4ZXRmO6G+owzNH1XJPO8K pARTaCE3KJToAeSafn7Wx6QrWBH76v7iXm8EpzdhvIYnvwp7VJdvNuaHR0zvYFge UTZAGkCV4FDX48SciVyDQ3UU5yH7a2GV4iXe84TINQUDEU7QNnGNsqZL7DXF/qZk I1sCqMjEKFRQUfzWcWfoKalC0we4Rrco6zZD5Z/Mgu3UCng+l3p6QntLM/ulkNTi fpy49JOnT8ML0j1HGJJc9vudtq5wq+sC0TR6L5iZQwqYDnF4xzirXNItCRgKK7uz SdlGQM2zS2M/b1IFTzlDHL85YUXmyBD/zoQgUr3PaXL/ydf94drVNwASCcD/VOw5 mSRqt4n2HKyZzqILoO7Ellcvnsdij4tdTI1ize2fajs0mbEjgqu5MaYR8Wz9NQvj K3juAmQLQmanp2LmwEbq6Smk6RaptMb4NrUSJHCPC0TPJSUVNBVviOyj63mFdHUG z6FviAbTMJIXWgH2WNP7MJ657Js20t5bSA003t2AcCvme2EFLaK8dbUrMvw/+4wC IFh6tXAGOhY+tAB0TR/2D09iSyg86miJDNnqygLa0JY4end4iFQ171NRDnAhOFZa 0Y7OsgxnN/yqPzQ0NgGKayKDJEi5cf1SlAkMs5fV2LfD4jhO8ymvbW9rjgHBxCgF RjCYLdgwA+UFHFc1qf4SGJV9zsISur3G5hYANywzTOPLURybRVvs6UfPB2CvaUTP 63dY6wkCkQ6Yb3Iy4SFAbB3dXCs9C52MY3HaRToptNRW8xnLUc/9BuAv6Rq8eEXl fUq4Cfjfwlk9fD5KwVM3Z6aZwrHR8DkjYd8HmJewPgJY23G9c/NqqMAGLpIJuMVA hEbu/ZS9maSN2Lu3rrCWueHVkycwVgfhrbeux0D3CZKLXGxJZXUttoF0NEFYEZKn YmzFa5i+oZfPSW/CmkwR3GJnF8iy9FzsJHhGmz41id3bDr/93Q/QuSfCT356L0zz mh/9zvtU2Z/Bws6GdIBIFY55n+dvr+mb795lSEVTePH1/fCA9Slqbo/sWy7Mkn2a 97DJkxNMecJG7CHz2saZD7z+OqxlN4ca1sPJOxs4wjP2W0U1+keCfomRKexLSi4t ribnqI5H154LEDgk+KUSvRyAvYcNXyYomeK9D7fWwz0KQA5TsyMZUcLaYRKYHU9h JXblVe8AAHiLYIMBNtjpIgz6Ef4BqoBgdh9bBnAnFe60Myx3DGyteTC4cfQ3Vocg nRQ9vVPtj7yKVGAAPbGV7NWAoTXOlBXru9j0RB5DFGBij1mbGbJcGCsCwrKYXUig Mb95/Tq9VV/g617EQq5qnPvMyhiB0RQAqRgtP4XJaG31G/tOykIfa/ZxHzu/vElG MiA1QAYgWFQOUQQ4KS4FUBNsLLD/1rawObKp+NIMAsk89rvZm0XWKhWSJRPfqWyt jmzYPsGEukn91zbsvdIEebs8fJ5+yqlbstIHPCfZ5xxAN+4o+o7dnXzanoVzDS/s c0ECRh3fvst6OcY3F+2onRtky5Owq5eutMe2dElsUB8dVWSULV5S6hf7kSINsw+u 2uYUgoZ8gR/vT0MGJGm8F9e9hh9Q3iXAxSniBfCj4JcZSJZUUHcFn3NMFLTL95OQ ShJAwpsT/EY+xMgZ12kBmn7X+5CZtqgqk6BEwuw0B7BG5tLWVQlsQcEBRWFchOyl jKlT15aP10IOZ0kdrI3/7Um+fEwAglTA7jpJZAe2eVOm5iTKM/yPGSOBYpRd8N5m CQs4R2Z3D/1ccFH8fAGcv7g2O/6c4vdtxyjOsCOTDGzESdy+ZE6UIvDExDhiPEmG U9be7HUJ92aP7n/2F/8SW/4Pwh/evhNqyUYOUzC5fQLD7nO3DzDynCMkJfNkU/JZ M7XJBk3iGAdnZIMNKiC7rpdXh382eZ8+5ZsQNRQv8hzNWt69cCVU03/13fauMLJB 8S8tOXuqmsE7qeGf//zz8D/96f8R3/O7b96CjadTEcQQjzXqhgsgEKxt+o2g1Qfk 169+O//L3/jvNyDVVwhafJ0A1K873/sIoX8nD582BURI4DnSnhwM1s9GwkYJ3GNk PF1QIyKnNkjxGzk4x950tFOK7DIgqBFg+tAFm2o+BL+yvTKzdgXYwNCdp/WJ+HgI CpvVhfDcox5HxyOQzQM4HPBz9kg95JcsogdF8JgkSljCIO6uHkbgKwuagiE1leyd GcVpqBeWVvg+sgHuSa2rzOIagFX6vrocEIWTNvoWOCloPy/cQkvKZjZlZNFMGpGZ +l4KD2NFu3Oy4z2xydLYgakwGUoB+E88NPZcPZbKJ/p0/dzgO1y/DLSSBhlQ5Qz2 1IupFjbS+Dzpc9qHVMHGOkmrHUbTSVrL6H0aaSruZjfd4waz0GdpiQbQOJ6XffTG ZJ3aKOoZmabdEwC2oboS40JxBY61/c1a0r3MdIepu/rtBqp1mRHNWth0fGiCCmkA aBdskLrXkZEZ+rBVEphQFcos92tX2mLq6QEz5xsponANnz+hqptqLitIZ3BUvTBq 37nZxRSe0/AKPWsr6ZrWN+6E0roajISaMPrE4ZS2uZdp0pYJnJdsksUUCQ5eBcMW 1I2a3jjCiRCp8HwJSgh4ZnAg05trYZQI8rfqmjBUVMCzlhZP5GDUbM2SjcHIwFD0 UVAzur+KBGIrJIjUf9h9Pbxz6XJQ32iA8Lq/P/z1o68B0+heMTwnMLN3m9rC9269 Q3U4bBguzglc6p19ltOz02GZyvMCnFQZzyMHR6V0wUEIzH/A6cA0MId7GkcyxR4p svsBEf7A4DDR6hyTi27GPTsy3AdTk8Mc+vbIrvQBWJRXdMAgqRce5vUHnIEbb1xm XbIj6Gyjwb+Monq3l0TTh4CqalJ4swCUeXpONjc3YyRT+Dt9QDmDlRTn2NZtDkCW ArAvKGMwAo5XBq+ovCqm/W2ttQiAeefG5Vi88bJ/hBTzHim1+mgVfv6Lr2Lw9ebN y3HPjTI9qqezNY7q7B8Yj+DiQmcjrAuM6+IywLc59nK2z+kJTE8HwwYcnTgxMY9T gXEFRDrAwL6y1652xB6tjx88I2Cap1K6Nna9mIbZqwdsX2htIrU8zX5cCNdvvwnj wNCIQfWoTeEN5Cdey48/fRKu0bqpiMzCAsD9iKAnCxZmDP31JGfH72EhYTsHKdyp QFfbSrHGZpS0ZMEkXMKAzsHuLVHklUd6rIB/m4KBFTgLdu0Nvcg5sYirtKycZv7j gJtUqukvRKA0MjTEHsE2sp6OQp6epOCLzFRBVX3oo42Wn/vGpe7QSsV9L1Nq0mDE amrqmDuPNGhmmkCwiQEJncgvlsMrwOEVwK5SqsdIGqY4y518L4HsYGwRprmxMjSQ ARonuExFF/7tO9cZddsYvrz/KAblLW0tpI5hGCdoLs/Iz2quwazRvS8fMoWJ4sQ3 3yQYhJ18NIIWuCQ0FNFOCOZ3bmkOLXQxTistTHJ/n3/5KNx+/y2YF4YVEMCsYrPe utQWC2bm1hnZe7mb4khsAI7oYIPOFuzZXHSuZ2gvM7hWe3s6RW0Jm14Ma60dXCLN m0IBUpI1tOBqi+DObhM5OZAa2Dvb8czOA82wz+UVhQBYsnoQHqnpeZHxfvNGG0wS xa442UOM+BQ2bQcg3HX1aiyK7OsfDpU5DbyX7B9gA2fm6MpUgvNCbIqZLTsWOBxA 5uuM6T3+fog8C44NYkMwRQaP4HYP8Gcx5B7gf4172SMYWmK/zqPXtEj2FBZ1eWEq ZrjsIBJHlyMNkAhSFqRfTQKSi7n+E4LZM4KF2gZYXq55YXwlNuovzmI6JH158hNp pLDpygDDmUGGpQAyZpdndQJ4VJJmqjyXYDkOboEhrayvlt2ARQUCALzS02C0+dxx mOg8/N8FzmY+gH0/zd7qtG7idXmp+BSuSZZR2cM2beM28Vlp7EGBkZOZrHlI4NwP CfCVICSQA+qrZcTX6TldAMWYIKt1gLM7hWyJLbGyyObhnJexw5nogQ2mIjOK7bFZ v77f7j6SW/MLDIQgKM0n0C+BnRWwOuZVVs9rwzXi95Q4UZ/Bde2ybupYU/0Gr1c+ JFvsxCf1txns81QCEjOusrJmAE5zAWS8rweyCH+YSFC/gSY4i+dcRaBvi0eZ6mzA 7AbPVKDGcuOTuR7u084NDfi5/5ev94qxNMuu9E7YG9577yMjIr2vzMpybaqb7Gmy SZEjQYKEkQYYPelF0JMwb9KThAEEDCRIwGAehMFAQxI9bI7IJrtZXT69icwM7254 773X953spgSwqWwmMysj4t7//v85Z6+99tprb3GtiyQ0NlMVExN400gqFSEPyCUR VcOayEbCwpnv6HWtPz3/Unl+EhgJgHchCaTG/McAU0kcujIg0JD+YblWgBThLIWk DaAufkgjTtnc57PgAI+xUHlinMAJKFVmIljkr/yy30jVK3wa91bgR6t3TBz0YBfE es1nW2nhl8/QuJIA3mluJhmvR8a2GvLY00p3xCEDVKwS+CVfv9QTY+gRjKrVSNfW ORtIz+I7EBn/auDb8Ioz+b2LV6LzwyTj6seJG6dMErvJmfNpxV1wE9Gapv2BCRwv eFa/ms8J//Lf/xT8husKCVsR5+oucUspXWolfRk+ej/O3//1Dq4KSP+/v6SiWbN/ 90ua3Zshgl+m9PKDBz8Jl/H3y5XK5karfZRud1Qn9wVmEzG8TCjlDScg6Uvng+F+ s4kEZFosJWAoaBYi0Jgd2oG+z8aIJuv8rJm1+tZNmEGK/5HVLKRc4MI8gqJX65fN IhBO2/1vIJfxMmtRROwYSkXEh7yuY0W1jlAza4ZyxN8TZjh8HhufYrMXi8fs+Yia Bf/CAYVhP2P+1I3YgCbQNoMrB7SVwJjZnayUIJ0FruUIayj+9v8lWOx2VKYDqLxz TsFQqpAA/Lox1N86C1xmOXq1cX9lWKM1GPcrB4/OslKyPH56m/LQCfdpESBRonic m+j8Yz/3Gibsaxy0ls+WKfPruWbZbXh0JOp7XeTrBCEne5UAeAzUzl/epVTwKjkd fnT3Boc/XqHIBdSrFtEEk0QLqHH5Nvfv0bO+0N1INzn3ZpYsuJZSmOMiF52khGtC HQB5fHIWBhR9D4fYw+e99g4x7jQ1PH87TikEH1HGky4SSKbRj3UQUO1yHBydDbcA BxcIsrNPvwyP/ubnMCSURznwKmBOnIazx2ZqZPwhOxJG6xxgjiUWLI6axzDOAYsm Ko8McZ7Aoe1QAkBqOX2TDWvZ7E5zEzKATHQ79WTOJTwWniEMxBGB7Jx7kGpyweGq lGSfA2Gfn6tn41+qbwpdDU0xMH070Bd+8fpV6JudYi0DIOm6vNWE5u/SZeZ+X4wJ yC6A2iqAwCeXtdHAQVWivgxWwICl/tlu18RRPmW+DbxPt0P/MiXMREm0QVKPPDo0 FMerfu+DG1F79csvvmV9BvStjbFK4Ix6PVW1jdogmA9NMhWK97A7XL3g1Ay6au5T DZpAxwWuoau9jq2TjXBvkA/YSd7aiUaVxTg6hrwArV5Ta1McC9v7tp+/N8epYisk DwO9faH54iXcDBiFCvjeoKx6laYru3WH0Lses7bvMKIvi332ki76Q+77B3duxuTt V988g/1gUheMxRLXdMLBfwswY7XiNeV85QWtPBcz231YxTbYz0q0oaOUowb5XYSm yyrKK9ZRA3rUKtbhGEnQGzTRl3mdMtaohv6y5x+/dzFKBr5+3ItlVz1gMju8SY5T IuQ51tYAkLjHo+Po15CpsJ60v/IQuQ/o01ZoADa0Gf1wHRKC1zDF21xrY91l2MpE eJFMhllGRt+4jMk1rMcjWMuOnvZwr7srvHzRD2DsZ5JLZ+gENC8CaCfRB169cYMz kMlmoxPh9rXuOFThq8dUE0hIG7m/MnaPXvSFickpAF0roPIovHj7FguZRLgKk75N cJNNqq8HmAM+VsbGKD/mIze4wNl2imPFHGNc29l3NTTVzYfBqSX0pTXxzJgYpVmN asuDzoZQSsL3msTJ8ZqNJIAgxwgAy2rrcA+o4yzZDJOcKWr1nCq2towFF2D+008f MDb3QhgfhEGuggGiutE7NMOPr4b7N1q595Xs6YmwNDUeSuvLCUJZ4cm3T8IQQPrW +zdCA4zzFon+OqDNyWY6vejPO7eCGX5lHc/qMAYmNe7KmrRKyiVZySZZcnLcxGiS jI4JbNWtgDyAj/sYoG/SrcZPM/xjkmKffeYRZVf2bFvbhZhgzQOEu5GQ7JPsKL1K y9N2kdHFMP+3kG8sTU8CVg/jwAAHV8zCigtSM9H92ki6QvzKhBg4ZA14jmfw7zmN 5bhlNNEsNw379Gs/61PGrBIjJFSUhEzih7xO8nXGHl8h2A5PMESAWCaw2qfnIwXQ 5t83AdjceECrHpXqcbEUKq7hXIY9Xlqiix6Qw75aOshAokNTMowqNBvxBTbxHAsr JgQV1zZFK68lmNcUEm0HGTgeNR0ZQAUJxQ5Aco6RrxnpaijR5qJ507HBUcraTzme Y484coh/ujG1nnV/wDqbB6REuR5nYhbXc0BlYJoeh0POr4oSe1Loomf/WGGRAAJi A7pyWF80TpMAayMpKyb4smoZG6OJR1kcNpapi9E5esZtAfokYPLorcgjFlotM3He IxZuHgGWPJx41o31FRGAmiivkNSUFubw+dCj8pqZfOY97msZgF8Z4AmAU2AtQM4m xqVzDscrBMRpi+gkL+00tcArJQbkcP7YoKoPaoHyBvb6NNdshVTXEB50vOZDcIj2 iJItVqUykJV4rfYHFJLwHmZhF3mM0wE6Wwm3Q85gra/8u/dJV4xc9m4dn8f9vsb9 tm/GOLVNteAsnQoiz8TESQxgUxUIAikVPq1c6wmfMZO9kYM8YYNzQXbearNSDZGa xJzxzDM/KmQFriQx4gfZVftTUnjvBM/FRCuDirL/fowXsH/yVuzF/Nic+n/8xZ+E sx//Qfjx9Vshn/g5TizSU/bUe4ikq5RzYnvzEFzuMzp/h2NYq5bv7Xe5xhjsf3L9 /fCvP/+axPVa6KhvJflMhJ89fhK+7n8a/ps/+r3wjyBHaHULX6I5/+tnL8Lg6izN XPnhNevsbx/+IlygAlLYjhyOuL1HfDMu53OdvxW0xhvATXj3y//il7s2/hIWAVT9 J/+bLx8ebAAEmsODT38QNVca9WYi2lNfuhnLFyxWAKeNOzZdyW6aeTp7N4MnxD6K 5Xk1TYJB9S7KBNSkJswWCK6W4bUe8g1lMdV1Wgp3ApRlccvQh4DWUkCSXZA2Pzn9 aAMAqRDczM2GBK0kLNkfsSDYPmwsHiobdI1OSbMc3Qp8+HaiQohG8GgGl8MCnZvd ADzjA8oBpBZHXUzUlRB4Cll8sQTDwasjglmzwxG0AjLgqtkyOAoUvZerdIUekI4W wYQK/vVBdFqW5ZcyyhYOT1jHODsXsJwADOvJyqUC4mkkYnNVY7Q/QWanliY9A50L n0fz6jkOLEeo6he4Djg/5lqy2RQvBiaRC+xFL8DphRWkDIjp6ThfgQ3fYWZ0ZzuG w2RFWo3U0BA1Tpk1F5bDzv5NSrXHXJuMzCil68XN4/BDuqLt0pxa2MA/Mj82hhWy mTvp2N3ke7cBy80XAXkkDIsA2ytXL8KAH8eGkevY2Thx5eVb/DApLZXA+g2Nj/O8 jykBt9DAAHMDMHJO9TmBbnx7KaRwaFfvs7FZEydoxYr5/LkcfMUwZKd1MNkEsy1K brMwX8vM6F6eATRO2IjHpC9ArOWPXEprjWS9RWThOg6YYZ7hpJAGS5ABG5sJu8Ji 4PPCyFIqWYRltemtoISyIe4FbvgBgtVf974M4wBAZ7STJmHPZmNIeSyPyCo7veQM 8OE+2eN5Whb3Z3O0tqFEYnf06QHXTpCRpc0iuB4ewZmgc+4BjJQCMqPWEDbu2sUO rj+byUN0DFPmbWtspswH48fAAtmdNkrxHl4To2PY3/D56mnYoqHkbW9/ZDEqYf/1 09Rdo6eHkjFB6cXLF2FyeAA7uu8SaDOxv5rl2klgShijyvVPA87KSDwbGmo56N7p S4vrqhnF3ARrjk50djLcvXUX4FfJ9Cm0h2iV//BHn4QW9IqDg1ohHYb33sM3lPX1 lEEDJwClQsB1L4fTIJrJBzT0tLPOJriXGwB3WR5tjB59+wrPTJoUshqiZ+jA0GS0 ETJurQAEbH5paqY8zqH211+9oOGhHEN9Pj+s9Rxfq66mOQUQ3TsxFLJIZC8zWWsL qccW7/HenSskdhnh8ZM3rJPz8D7lcsciClKvXGLMNNWEl0zdct83A+rsck5OzbEX cE5gnbzpT8IWncJgA1jpTH7yzVMSqv3Q3dXJGM0MdKMDWIyVhPZ2EgaCiyA6h/tZ wj1YmJzgCCGhouHBcnEKYOY6TGiCADYxgWZ0ZZXkoT02O8yOTcSSaTvPyobTbb6W VYR/J2BgAg3s+MhY+BFspjKpLx+jCWVq0XvvIWvg2vrxUU0n6Fzkc++vr+DBOhxa L3QiY0AWNJtkmMRkyKHJwgak1Sm8dzlzqhoIDJwFJwQufUJTsotYA5TAl5e4L118 3uv4UXO2bqyEmwyWyKDR8SuYFw5UBkhwnwAJT18+Co8npsJ//1//49if8Gd/8034 4Q/fCxdxCDmGVZ2amgoVBChByiRs9CbnYlFrN6VtmUjWw7X7gAMSUc5rGbRUAvwO pcPJ8WHYXcbs3vgkkgBq8FsBoTJ5q8vLdG8zOpX9v7FD0PRnYGRkXLcpi2/z+XPR 121yrq/yHrsk/wn2WjakSGcbUgOkKDvzM7E5R3uwRYL7HA21RXzPNRIRNaejkwyO ACDZLHPM87O3oJlGowabiznfVkgYsogZAqNzgoWjU8+Q62x7TkFuKNvZABzt7QMi kSAVFVDhgvU94ExX9w3aZlpbDVTIu8arDGKPU+qMBRIOjVQ4QIRhZic9bFfc5HXX wiJU51bBDeJjZSg/zUJ3XRbKiQen25j5E7eAitxXJE1EykyuOYdYWFNeTkykysg+ yqXMvA6IV5ZnNSCde65edJLqwhHX3E6CkwK5JJHja9mDIfhy5Pga5EEaSfqEzhTr y+E2MoYE0jNdbBy1q4uIyccxz1VZUiH3ZYeRxOuAG4fqCEydQKZvdxFrQR/tAq7T SojTovQY1VPUkdZK8nhJqlpM/0JaaM8Fd5kkAG0s9z4TFt5Jd45lz2XPpwCi46fn 5/xswDLALgCW13NypJOk8tCNC4CzSonHAEFJLEkmCQqJVv1O/W8bmLSXig5CLknu k3hFFjida5OQcmiJtps5fI49yuXz3BObnPNYG6euYeJuJns2wTOQ/FKPLM4wJugd a8NXBhZc2WARWexSPp9+8CazRZxdJeAJZTzrYJbqOgiWEpJ4ZEFWfgvzte+E5d7Z AgPBlvJ9VtE841O4/7pQ7ANsHSakTIuPxvqEvOFzZHPtYierFIAqsA5XxNQs2Wn/ fsY9cTDHChr5f/PLXwBwM8PdduRWXUxBhCV1YIQNfUo6rJgdpuyH2xdo4EQasAuO WIX40gmpqb4s/NHH90Lf9Fz41//h34c2qpg9yAA+vXEdLDIe/sUvfxqK2Z8thdXh 27dvwr96+UuuMoTm2vTwT//403CnqQWPX4oDVA9SAbLpxOsUQDMf5LeDVr8QQeqv mdT4atzsd1D13X/5JXlOS9L7W8fh0//4x6ETwX0BD0APTL3AzCbNfHju/BsUPLdP QGrnnuzkb6QFv5niZGZmOd0JHT6AY8oAPkxq4DHo+8BdkE7JipfIZWodZTed3f3S 99xNHjyZGj+/DHul0b3zlO0SP+J7jvj3IoJ7SjoaGw4kge4R4FFhdQ2HuzoPGQ3L /v5btPgAhAuCdzlU8ggKcqvqY7f4PkGk5tPFMKDS5wkynWwGDDjhSWmD3ZX+ctE7 BOGMEssxwMgRgB52fmbZA0s0OywYp36xpiLYVoOVDWiU6dWKawNAkbLJtBeYT3/G UaYVZIIT0/MciMzLZjKMpYN67FEKaRiY7rMjv5LXPAIsLIaL6vf4+wr3RS9ZZRJT NFZVUQbb5XqW59fCNcrOAvJUbnBnax0bZx9wMc9YU8AV5c0zNGL3bnThaUgDDO/b QLOKrMI4wOUWQcrJMosEsGI/GxtrdmYacFyGfgdLkJXlqIPVbN4O3RXM1HsMsDAZ b96OwGAxVYi1sQ7w3OV3dfOlUNJ6EauSWkAqpQvW1czkYphng6ZSXiwELBZTwilA W+ZhnAe4K+Pf0joxUqcMtLKMlGBsFJNvMkx04jYNpPBMvMHjMhM8ryq6Ij0MXR9F gPR0Dm7Z7WIaPC6Y9bJRLgDWSjk0FPuPUyZ/PY+eDLCn9YpedUuwVA/Hx5AdyHoX x67hetZSKQeI+qZ1Ar4NKWlsmpLScnwkaSRg/2TBkGcXs6u41060aurpDIn2tjA1 NxeevnodS1NtLej/AMnfPHwd/vgn32e/HVLWfRgb5Tq6LhDc10ISMFNI6agRBumQ g2zo9RuyU0pWBGebNUYACm28bg6HxNwUZfPBoXDlzl2CQX4Y7R+KuqIL3T1RvvPs WS8AEu/VzlYYaKxoYAS0galtaCJZOsJKaQU2phZGoAArqVH2GAkJZd9USraDvcyo 57lW0CzFEYgusx+AdxK+h/H9AjKTYVjAUljSBO+bnJzluqdhDFtDOyzhv/3pZ2EV 8H0T0D2D5myGNeSoRs341ayfcX5cudwZGZ43r9/iY1kWmihdbSAnUuvVwvexfcIr 5CZJSnTXLjt16ij0octsaW/nPeqiDdXA1Hy4ee1SDDyDg1wfwakO0OIccCe3FdPt S7qN7ncSZpoJLGhVpwhInz3uCzd76mn6KWUu92R4BYv6w++8F0HcCMz7Pvvnzu2b Mdg/wbR7ce88vHe1kUCEhRUd6VXNrZxMKcg3xuOZUF5exvsR6Eh+3r/ZCRjrCAOA +t6BkXDzPmUx9vXY0DjyhRzkDi0k1Vth4NVSSAcEZ5LsOD/dtX0TJtdBF0MMCRhZ O2T6VAfAPR0Gey4skJC9Dxg/5Hk+w4VgH5a0AaBvYrHMfausr0e7B+sEuMohAPf0 dAGwjtFE95GQHzE+9h5fh+F+8izMY6X1oBbdOYGwoxLrnjSsn5C0bLCnd2kkugvD XEYTx/IMaw09+uWLPaARyn6sL/dia2M13rVb2IiNIpG4EIPQz372S6zQ9M4EfLBB dxkAIPvumTgzAvvc/yLspfA1gJ4T8LTY6iZxPoMRPgL4exbbtLUJ4liGAT8BSJjI LC2tUJJfDDlo3b98NsgzWIZlLWXf0S0O22oifsjzXuJnoFeIU/lIegC/K71UA4pi B3x2AhsjCIWB4WRcjxlZ+bDtMG+wPsof9uiZWIIoaaLZ6JTkcYdzYo8kd4MkaYX7 jTNoHJc8h6VfCqDpjN9R68g1H3N9m8s0otI0U1rRiY6e8aUZdNpzn1yHm4A4B884 NMZ4UFrfQNCnsWZ+j0abonCc2xyOqaicZgASSR4y8UzN5/mdsl+dxpbFGZwGsEhj Q2wsO9WuGiIEcLWLhhMv4h1iRB79ENmAmOQM/sbEuhoqfDolLEJi6I2snpewRwK/ HQ4AeE6qtBs+h/gu+1+EhpMDkXVIxY8Yr1OPY0DTSgSdkAHcVy2yjDGpJPdFXJMO Nd47m7xWt42NNEARi3eRqUko6Q5wDtDMIe5yN+Of2XzdUqxOLfmAyjKu+4zv0wFo hUYwpX9F7JFihkxsgwtSSWgkohzBLANcCxFhDM6A3MpJoS8GxjiFe1ZYqKsLE8WI hevYBpokCEI3Wf9ZXH85bKHV4E32QRblLUFnDmBMza+k1g7v7xqwUuw4efXg5xzq FYBRKwbvvp/GMmLgDu/JjwCCkVSAL/y7kgk/K4AoVkiz1YNCatjgZ2NbgmSMv5KI gImIayWc3YUkm1us90wShYrazJDD2a612x6JoQSfn8sqBcdgtK0Tw2nVJrPNo4zk nrICJ4TagCtGco0IWLm1MWmUcRWj1WRWUrKfCP/zn/2f4Z//038WPu5CBpaawxjm lxBjkzE5ySWZKM3E6pKq25vlGSp9c0jPjqg4doROZFrXO1vCf/uHvxv+h//rT8L/ 8ud/Gv7ZBz+Ksr2LJJ7/5mUyfD7aF4pvFoTvfXA5nObxvEkou5AA9LTg005CfA4u O4B0UgOSRnXU4RYSlb+VaY2fkM/gB413OP4pZOSG84/+u393I8ooXb/5g3DnA3SH dHedEChW6dzUa7UYYFRJRquF0xmiejuGY0c2CzhaNQBs/fOUCUfI2AgV3GQu0Iw2 nw1sCUJwm01py4UgYD1hI8h+7bO4nCChAFkzZjWdjoiT+TzaBEzy74tsWDvHUwA2 2pO4ETcoAx3ssoD5u68l05jJAulqaySD8d8oC8M6HHFB+pXmAKAzeMia7NdU0kAD 2yWH5mJzEpasRBksXBYb20zLzW22HBliFCnaguySfcsinsjsnZOtsUCyOJSUMWSw 4GNDGRx/Lp8zP48sCSbCjnwte9wIWoAJjh371gxlrv/bPIb+jj3dAvDZeZgBCNfT soJSdC3XOQRbNrewTjm1huaDBfxMi2GNimgUGeHwBnyTIS5gF5PGyVRShpaVrKkS TY2HwCtMuTUyr8Dc+u3wCs+IYADD7NSkfJ5NYwOz4GFJs2A8G2rLKH2Oo4Wh4YNN PUuZ5Vve43ZnFwzIPiVSLC/U7ZGNj5BhfZfO4nwW5xePkmxWMm+e4SgAQKanFDbu iBLf0nB/ePXsUZiFRSpHcF+KDrSa1zilMzeV51qArcYp9/VgZxM/RVwM0InZbZtB 9tdehjcm5cHiMqaYwGo2cWAeEfRSaJ7yPs1PjIYl/m2Dz/kGQ+Q3yQGark4BpeXc nxoE/OjkOBwqAJ/lBNBc1khzSSUHn2zKOwuse20djFKlUYTPLzM0tbEQHg6+4qAB QMPqXqmtCz+5e5cDNi96BdawLrMApfrbZRE41UQdEGC20fKdLS9QPl0Mk+tkuyVt USs3M4NmCNDfBGCyIakXkNmGSfM2n32k73WYZ81dunIl6p2G+vuQtWQw3aUs2pIl h/qQdhziYtEZDym1WXVkrWVlsLdMunr7ti+cMzKypaYGFmodXeJCaGq5Ftfp+so8 n4eGlDYSCfbRTD9lTe6bfqKnWB2tcZ9b2trpSm+hdA9wg338vd/5iKSnJLx8Q/lI sNvdzkZOD48fvoDlpknnxx9FVr+fLv5W3ArqALy6AfQByEphyk0MZwGoqwD+3/n4 NsxkUXiNP68jna+34nHLfjsBiDehf9S3+IvPnyLFyWHE6mWA8Hp4BdDrplxbDyM6 AOBz7V26SOc+YKK/7204hBmqrKhClrBAB/44wAxQR/AVzPZNrYbf+eQ9nmtq9GEt KK+E0XDAwQoAhsEAl7oiYzI1hdaTvZnLOpynujEE49HDgVxfjQcrr/n4m+chjaQh m+etz61T5Spr0GCT5AzAdp7A4lfBcK9hH7PJPlZ2YaI9lpyKZ6OWNtB06LtfhQMC bGtjXVicwoUA7W3np/fRpReElckpzoA9gOQdJBlUJmgANFGx1L1D0HLynM1XJXzu YZKFweHpcP0Kcg3W2sNHL8PEFizxTaZTcV6/HQN01DXAnNeHheREeAPjffVGD57C lPxWJhhMMRmfU7PuENMzNMAehouXetBoH9HkBCvPGdCEdpk8MGp6r/c0oam9y2ff DH29g6EbPbCg5RWTcKapsnz/41vRv/UF58QREfV6d0vUk/50cwUtYCPPgyQH5kzW qFwWkzNkfjIZVqcHwx32URoNcKcAszz28TlAY5fmL/fdDoBjE9ZXQ/hZnkslLGhz fVVYn54KSQqrRTyPHdwZEgCJStjqVFj0QkEGiZRuJ+kA0PTDrdiQpN1etGiiWmVM s+/a7y3GQ7OXfVJQzqc9zYZVhEllL0T9KlZegsuF2alYKcwmBq2wdjYhW84BsAvz 83GCWybxLf0IThHpkpZJR6zneYYMFPHzJpcFBOpM1oiNXtoGgmvirwU01Pmw8bcu Yfm0jt5961GYXM2DXa1kbHQlZw24kc+0BxupDMCzG5qamJEepVk5vO/4ygLqCs5L GkutABlj3du1sP41kB+Z3PO5TTSyoJZtYt4an4+DLTYrKreTb7UEb1OPo1ZLAY1h n1gLiWGlZ4fkIYskVKZfRw6lP+fEujzOuw1kW5sAtiYAtmtFJtMqpUiCgAUpxVCY PTrv+cy7NPKoN9WOUUnhFt9j9dDqEbCXa37nnlNLvCng3J0j/ln1qcTHWvnhIbHm HPmEhMupQIzXcvqgr6Xl5R7MGUdNBIXH6Jdtrsp2DXEpkJEAViWFwB1AP29MHwQ6 YfZOClVMKV/gA6CVBjfxBkyyJNY5SVIKvyW2zjzTSZ5SYCZ5y8hiKqvIZQ1t7yJP Y+9Euy/kSupHtwBkRbzHO2ckqnFggzx6M/LFFcSyLQCx8KyIGHZKUmC7eqH7hErN Mbgrj+tPkJjsQlpo83VeLpZi1/HmEolnEFFqTOPgAmKlTCvfxtMUR8ME86fkm/eB 2xWrt8foqwXVxmWbv7taW5j0Nhf+tz//cxKF83AdLFHMuXeMJaQ2g6Vc2zlrphfn l765CZKTs9BB7FMW9xsy78GlzvDPM/44/K9/9VfhP/sX/1N478KVKDMQQY4tJPE8 vR9uQ75UgRVTwCKVxJt0zuPzEy6KhFkruziQR2cnnpcV7N8OWk0FeEj+8Q6i+oeA FajqB/Sf2QDnoPzyoqZw94OPQyfo2gxrdYUpG2Qdskd5LDq7mkkxWDxoS8iYnFd8 xKGQydfMqNUBeeN8fceHqWHVZkpP0E3+vk0WdHrsZdp4pbcpTCS/o57Wa+R6lAeo idVHj73DwqWbjb8IrO3a5wd5HfUisK38fZ5GhWoepB6aTj/JBZDwEjxkHjrfr5m+ gV+wmICVs7y7zyJT16a/6ymvL9OpHsWJVloJnfF6TpzQiNpM11nMZmxrsKMHZq78 m1YfXCaflyyP67QRLE7M4D12WNQOU7ALc39vC3bSDFEZtnw2GSv3rYKg7Qb1HmkR ov+nHbqyqRlkiWdsEG2q9Ix9PcjoU4LzPGByk3LK+zcu0OSzTFnNzuILsM00jAGa SgCq22T3loKu9LSFb2BZ5mEC7mLvozG9gbKlga49wPUYVlRmSXpyarZ+H+2ki9uZ wR21NFYBzkZH3h3gOdyTmUUaEBTjd2g+v8AywF6DUvEK16cGurmhnrWyFl4NwUTJ eBKMj7axhKKpKZXAckYAmz+kFDk1EtYO1sm40JsiN3H6TwmJQiqByLWtFY1DDtaW 8B3l2hSca9WhGL8YLWwm5fYEwECNWRlrZKeilnOXz88mXaeM6HQoy/xTq/Pcnzma ywCtMG4N+WStnGhO0RmbQlvJe9oBeQ8md2EZn09e/5xntAqArSRTPgCsbRAcEoAq WSB97GQq7PgszYFVpXxm44GDCQ4POIw4DLUrUaC/kkdwnJwO832DEahdpTysM8Dz hw8JxIwwbWuNU4gmJ8axc4Lh4/oH3jCdirXUAvjYgLFzIILODnp+HrJe5lYQvfP6 1UyI8lkuL2Jl1I5FFsF8BRcAGyV7YLctfw4OYq/E82lqb42sycjgMPebSSQt7awM HCLIsGt5n46O9pgwPn7+EoB6gT2fg5UTXfEwZvcARdUAhL6+gfAWzemn370bbcee v3gDowYTCatqU6Dz7TvaakgSc2MS5SStrh70kdyzcd7XANvd3RzZ0LHxOViWNJ53 EYncMsBpN9y+f5cAlBmbm3QoKSABXYUlnWNf37nVhSygnSrAHGV2vGO7u2Mn9LNn L9HJkpgA1mdg4Z6hw+yCHbRz/jVSCpuhLl+/TCKcEh7RUFRCknaxqxN5w1saBBco k18mcSuF9X7D894MH39wh9LqYfjqq69CJpKTzosXAQ+wZLCnzfjMCkbWKEtnIv24 d+8GrMYhFYsZGO9mwKbm/3PsA3wHGQE8OEkDDUnMPPv6xlUaqlg387CfGwTB05RE 7KbvffWSayoI1ZREV2dnwudc/wfv344lTN0V8gEmXTTcDbMm/vRnn4Vrd66Hy0h1 psYnSDyT4faD9yKrNdT7lmdUEVo6mmFjdpFHJEliSJYBR+vsSUH2GVKRMgC8lmrz fIYLV3oAD6VhhLOht/cVTGoXSTk+v2hoR2HLP4BJ72yoDt9MToSvhudC7cUruF9M wqSPA0prScaZoIcl0+zycuhC7hN/dn48avhl+G1+UUIVznPZw8thgiRtcG493Pju 99DiZoUZPRrRZS4C4jbXYF9JbBFQRoIjlzXkvjw4XiaokeBzXh0DPApq6mIlS8Cv TdIBycLqijpFzmSAJRgBh4gKJAWL6P9J7JBTKd9wVOUWz3cfRvCE91Frn8vP7JOM rO7lhLfs9+piKjzscdk0E/oZJAhzPHflVvuUivcBrUuw6+oU0wCFW1vroZBJe4WU SLUw2gKgB7yn14+pKpKUFxOMnWOvNZO/4SpilWGb9aDLSw2DXsIJfSLHXNtpRmjl 7K9lfa4zKatvZCwyssbjSp6rVchdzkMeKRpfGEQ+j97fk+PjIRVwmYP+kIMlgt3C ojpkU/mhfImm3ZkVKirFUbJxTEWrknPqgKqamvUSNJpL9E5gfAEAzI2laBnJAkCK TGgGQfiYJDML7eMGEguBr8M7tPvS1lKd4x5sauIMsojP76TFFGL++OQqsZRnwj20 yU6JEp0ZUSKQzXrMhNnmrSmDH4ZpwK82XvXIIUqLAZvrByGJfC6PPW5VdxerTZ2G TqiUbQPkJb20JfTjmpzrHHMMkJOkyUSSaAJ2Cinl+VmELMtmM+VCvESMJ4s4MVQT w5ThSJ0J7HQmUmaYwjmpfaQ6VWVfR8QUpY0ZVq9ZWIJGZY8ZrEenKBrvU0kEbJrW v3YfgC5hZlXZ53SegoQR/KNcgUtCqsDf+RnxUjFJEV/i/Dh9N5mPtb7LWSIY34Yg ExfJLGu3RVt/rKqcUO4vLi2J7Os2z+BdrRvsxIsL+nhHEoZ3Aw14C94HIg7wbZuW X3VNSybaXN5S2xTP9//x3/7v4b/7T/9J+OACU/pgrHsffhOm2M8C7VSwQQ+4wGb6 Ks5Cx3SbTCkRsQr9UQ8e3ZAwf/nqWfgMdnWGe//gcnP4LtKlCkgFJUbtJNFWwZU/ HJIMObo5A4Y5VeAKPjomKVHTKpb7raD13Qd7B1ffkdn+nY+DrvI3XztGj5N5lIYf 5u1wiSYGNYZHBBvBYy7siIFYyl2G1RFwcTVwWxQyp++z8Sn3Oh3LUn42B+ApP7fN xhXls24Bc1woB8YG2dT+ARoTrjQDALzCpvAAEuQ4X1ewqXeqwwS0KbEs6QJ0Rjtp SiwZCGATfNgNyjkuwLMMkDyLo4SNmSDoath/CJA+ho2woemQRSh4FACYGSpQ9/sF 2QZQ2UbtN/KYdqIZdDrlA8viakZmd1YiSLFhzIUesx00k8d8VhetwFtD7AyyOV0A dEE48CGxoPb20dhwhdlcv2VL75sL288lwG7E+N3v3WYDa0k1NjTP63ANfP8aQuVK LVg4sIcJYjUEGcdNPnw7zNSKCpi7RBhmxKP+t5YEtN5yPJvC64HkLPcMnQ90/y6v fR2NipZaL/oBixwMFS2yeOg7mebTAICdwZvTcaulHPRqOBfIeut6EPBzT5aZzd0B c6AN2NTsLAATjQ+Z9zIAtpoy1Q4NMc/e9sbDLbcTLeMudmUAmSIC1zFJi7Pe02CN qtF61RBUSmtro8DfDbUcA/0Suq61kLfGJBMevrOiNW9uLKkK1SQfAv10NtE+ujJH QupiAbRkb5Npcpiks0G0oymm3J/GMzpGi7pZVIXG2UyZ8vckjQbFW3Qv4yTAvZqZ TqLjXaApZZLkBODJ/cpEGoA6LjIVBRyEm5RF10praIRQJ3sS6vjvetg9GXE99ha4 X35G2Ql9hePOAmwpaSgBQJaWM+UnkxGIE4AnMuz7yCJcvn1s8jmGNHz/+qcccnx9 dIT9dokgXBF9Wp2YU1PXKLEZXiFwb+2gjAjQmkHzKXhRv13FSM911sYiLGsD7Mwl 5B8rq0toEMfQKCO/QL+0hBuD3snV3GsT0/kpEg+ea0trG/uQMugc/02iVlBazXPf AhDO8CwrmWffE5vgRgAusqT1dTUhyVp6CaN+5VYP5dwGysHJ8MXL0fDBbRqdWB9j sKoGysswx0sE+icrOFJ0NdEMUxmevepHrzoTPgTk1VVgeg/IW6QyUo8MYAbN3TDs aF0drBOJw1uapOw0v3G9y01GAMRLmLV2+9IFuqxTQh/lxnqY83IqCs9fvo42PK3t jAYleD4EcNc2lqArbcNzcyH81S+/DV2Xe+Ke36cpbpNn1tbeCHik7DybJPjpZ8lE NliOYRKLunqmOXF2jPW/Zi+dh9/9/vucAbnh26+fIpfgbCKBE1ybKKiXrcca7vHD VzEgtTC4YBRXjdd9ozQsAhr43DZCjo6MhotX2qP+8NHDl+i9RwHnd2Iy+5JnuZeW Hbo7O2Ppe5Z1cJvPbbPS148o1wE+f9DYFO2G+oYnwhmMTHN7K+zXYRjq7Q01bW2w t7VhGoAzmoSBvX+be3TOoIs3YQWN2u89eB9wmEligt6XZO86DXY8drTPA+yDQkb4 1nIfFnDMGAoprNkUpqL10UC3tjKHnVcHU4Xwd6WjeH15KdR1tFFixooI5iUHmYLD AUaxrZtOjiALIaghD/HzPqaZMwWQZCIn45aRityA03t4aCI845xquXQpFB9VhJXB p5Qfl0N6OWcFSdw0DGUG51aCczAf8FNSXgZBAjjgnDyjkvEWmURlfTkNWLVITCZD Rll5KKNaNrO0BHgifnEGzFFW7uiCxWePDQK4BPH7nHvqGLMBAHpeZgM6ppdpeIFt bEGfZ+VLS6pdqj0VrO0sTpUDKglbJOW6GWi5ZHnacvMeCWRydiKyXLJg1hAb2pgO 194eDtEKDgKKM20A4izJwtLOpq8tEswz2Mk04sIxcaKmkooasVPfVuUOiyNL4dkk YC2byViQIAsLS8hWaB7iXKwC+dg7kU2ilHaKSwKfZY7rPSGZ5sBinbxr9MlBGqFe PwVwI/GiPjQfVJjH2afrzC4hfg52OAUwllcAm6zVXwEVJuQ329z3PWLlKvvRGLx5 joyA67t5naoWkoEzKgX6nq/j3T0PuKhHDmJimcdrOg0RYRv7CrDMtdlslJuKfAFQ YsUxj/3qcA5B8Rb6Wkd/67yTQtA/h+E95LnrK6qjwRFEgQRQIYlqEfvez5CcobOc +J3GZ5E1tXKSwZqQ3RWE6o+ezbUBPWNlNgVpK98WX9PYmZ6JPBC8cgaesZKcIJ5b sTXuiiOsokpWxaYncIZORTZp6YCg68H+IaCPa8sVpHB+psPOaxOW4GAGT0OgSVBx bcT4NRICHYR0jjjitwBSjJEm7gELyBTbkJ7OmrVKK6Z4V753KA4squ9NPFV+4mQu ZQ8y1d7/Tc51hzYp1bLXRwmAPqr8FK+hvjeinwgmz2wk4n5IAhpr7KHhLkS8wg8Q RyXoiJ3sl56OTpxh1sKfffMVwDg1XCBmNl/qZp2vUrWgVyMTIfrjIwAAQABJREFU Io1rmkOGc3gwR5LD/WZtOwFUrJLPZ3mvgymHNMzebmkmyVsPVVTlLzU1hcqsAtY+ AFVwzv/EAFLVAuNj1jkXFoFrBvsojXssEOMu/8O/fID+9pcaR0sLonAIIg5wmmZa LoY7Dx6E5o4mULkIDeZSWt4Pyz3ZQfcpsJf5UthtZ5sm8xlpdtRp56CXGOCUxSeu sJNdsb2m+pmHLiCYBhaJU6zOKQ/p66Y+hZePGZPmz2mUhB2rKuhz9KLCcQGh+hS9 2vYJxi4Gx70es3oEkxmgfgcUyHYKRO0y1CdVTc06LLFddqWU2W0kMVvY5UM44lVp QDaLoYDvdQEeoPNSvpBOSYbnzqHJY+f61KRskCVruqvA3PKBQn4ntcTP480HPBnE 9Vr1Hu8CDqeXsKOiQ1et6wRWPlWAbrv/nIZTR6em4GR1nlGGvN4aLJnjIyuaMCmH lTnlXmv6rwm6DglNsHMblM8T3F+Z2AnK9N7mcnxC1c2lkhFehVnd5GBagqFqxZB5 AkuKXMobbYDdRXRLCq0L6Jj1OU7PMO6SrMqMeBmwUcZzPIZpmoVBgY+GqczElJvS KFlxFyzaDu89TYC8duk6djlMV9ols0MLN0hZ+QW6QxtRFKsnYdkKeTbnbKLk2Cjs z0JIQe81zkKuT8fgmZJ7BYAwk4O5hGurymHGsxsV654lDtjVOVhbD2fWViEgth1Z QgLR9qmld5hUdrVLiw2LyB8QK7A+ZyBBws3Ks09nbRaYkZPBngFa89lkzEANJU1N /DdDF0hQVjD4PuJa98ni9W3dhDnZ5zPZtGHn+wH3UJa8OJ/JJ1xDCUFVneUhbg8K 6LVU2+QwPuew9Vkfcx2W0k0QDintTsFw9a6iB+OLD+5cI2vOp8z6PLzF9ujW+/cB 02mh79nTUMThVtPYGp/90Ot+Egu0sRz8c+h/6+2IBmywRcKjqQmspZgsRaB0f40M DMWu7SqA9DnP0iYv5QQK/pdmtbmioau1HVYjlQlSfXFKUBtsss2TQwCzUw7Eq1dv xMPgmy8fMRgjN1y9dYcDjxF/PINupp1VVlTCYCKTePkWXWEJ4LodcLxGybs/PKBs XQkzNNg/hBXQuy7yA/bsCEb7HSQmD/AbffJiJPzsq77wB59cw5i9mvNlM66zWuzZ CmF7Xrx6E4PexZvXo8b6cyY+FXPwWVnYxAFACVJdYxUlYzqf0TzbEFLI/VkABDu4 4oO7V5GYFLL2enku5+HO5QuhHFDVx7peIPG7yPePszbXATflACtnj4+PMnCAn22G bV4DaEwmx2MiWAX7YFPT6GAyfPe7D2AjKtEvjsb1Usxes2qh32gF7H6iAHYWGUUS LXDPNZwlWIvzs9NUCFLCpc52wFpKGEGjO0Gy8sO6ehp09sNPf/5VuAYo7QRojlNS n+BnH7x/m0BdEB4/es79yGFueCvM+lT4ky9fhP/qP/pOHPE7CEu/e5oO6L+LhCoN nfhwOOdz1DU0xvNhDna9mHtbTIlaQDcL8/4dOvzb6yvDaO8bktqp0A1b7rjNsaEx up3Tw4X2lnCALvfp02chG4/gTvbXGk2kb3iviwC/a5cuRt/Sv/z6Zciwyam1Jmoe 5wn4d9ouGzlgZ/tDElD20YdIMQCWA0iLhgFVFSRUxs5tEgxLzQcwSFuckwI8ai5h 5MlQeMJz36v9IFSz5w+Pd2D+0WdSKTEx2yOmaJN1TJLBAU5XOcworghXSlqo1qWH RcrjJt9bnOlLJFt6aG/zHA8JIJqcpwKGGjj3SpASzZCYahN1xvNwYqG2d8o70jmL BXTbO/qAHzL4o5gSf0lYHB8BwDm10UZYYg1xQj/KbRiirdV5zhwZMNbBLgRFU0+o Zt9WkiCuEPzPzxljXYNUgDN03fjCuaz2UJAaYwng0MrEMdd3RGxZW+R+PX0chkmI ypoy8ULeJE5RFgaElwLKT4iXh8RKfUBNOo1Jjvne4Hc2lcBsQFBqCYkxDP/GwjRV GthDQNwoDDywmKS/kLORTvDUIzSoJAMQAZ7zhEVC57sY6pjbA3WjWGLpUJLC85pe hIAi1mbDkO7x5zprXs1oVp6VRiyoYBdtrjrirDsnjsviSH7IJOrp6TrOhDDyiotg lLVqsonOfWvC6JQvYYVWcdpm2qi0yv4W0Kgv7S5E5kWCtAWplIu1VhpVjUgsAXRs srXq6X9L/FRAjFnKdx2QHrBfcDogpviMOI4BxGhyuXcmLhVUM23gmkfussv9KOXf BKcSbjrvSADlETP2YQaPAcved3WianbV9prQxq58XnOP885mXAHRPqQP4cHQT6IA ecTil5WNWIjrtL/GQUtqSrks0RY/x/3h+/NZz/vEdQGVFqGgnZj06Eigp7vNdFHC IZHH2t2jkTDqXHldri7qix0yI0noe6akwPbyHNTV+lpKQJws536K/vBgq1xii81n Z2cH0QvdCVn/7rP/O/zRJz8MHxEf0lbLwsTAIE4MYAvWX5xOxnPZBxepMTdZ0HbL ZnGH1tRz7pRlU5FiXeiik815pkD4BKxgDE0nOXDfCDBT2VPiP6uzJghaUSZslObz //+CVpeTt+43v2K3PcfuNmwity/cuP9huIJJdQm61R1KxKublG8o36oNlRp3nrFA 13K5pVDBq6BVI3jZTLtAU7k561voMtlEMoxRAsCFmukISgtZ/GpAZDh9iDmwiYJc FxNPJV6aulbNeIvIvJUK+MB5qxgQyijjnHK4mUm48DmR+AIZBu+hs4ALLjOd8WoE 4uwsATS+q2Tivwb1BHRAM++lXlbK3CEE/qkFlnIAp1Ac4TPmjTaIs3XiZ7ZEI9DP 4TB10Skcd2JLMZlrBZ3Z6lZTYNt8gE4O2SALVXfiJKtd7uUxi0fwvbCA9spshkxk moDqqLsiHq5z2RsJQCmwo19Ow3jUM7OXA2OWRpgm7ILyChPh8y+wCCopR59E9/nE BP6aHHCUWCZm5uj0ro6Bcwjma2MHDxXAWf/gGN9fhIZtP3z7/A2bfie0t7Ww2dgU HFItNHXoGLCyeYC90UUMwGFM8FztaKGkzA13ao8eovkAlPHxYZjR1ZByLQ2WjoMO IGZGOe+1ArAu0DG+SHn0JYxTI0E1dthvLoeGTDJ2YPAapa3D1QUObZrsDhFpwz4c bKHBTXHsXVEoy8T6KLuQ5wAYPYV5WF2OUoYTNqnsqky4YNUmAEc6sgjQW8Ew8CcL kedGWYmgdkJ1wMw8ncPonEMojcPKklcBDFAKnzujpBKbpxoFTRxqDCng3zYJwCvo 7pycwpZGy4d04YCkByCt2D6Ng0ZD60KSnjKBC5sujYMog1KI3aKZaHI5VU1nyYBh VGGw3tK8U/PJdyibNwAmYN6Sk+FCT3cop9w+ASv68tHr8KM//iHr8xgd5Rg/S/MB 1YZtWPuVRaYhAT4Ee88fP0IOgr7xg/sEtFK8V5lIRoC2s95g1ve6DwacNQL4ODqE KVphnGd3D+s7O8wmkzBK6J+72hlEUAHDOhslFzfv3486UL05U1OPw/t334fVyEaz iJSBtVtXW8c6XYkJib68F0lIbGZ89vAR2rvq0E2WvQqwPuVw7WptZaukhBevB8MQ jVl28Vse3MXx4WIHDgWsS2eRKwXIhrEu5x4uL9C0NctkpauXY0L7+uWbUI2uWs/T YwLzkk1FXK9SpBe9wzHB6UY3OU+j4BMY2XZ0VQ0A0TVA2jbX9X0AoKMHd2G9Ukli f++792MlY2homLMBe7O2dtjpTbTdo3jAtoZCEo/k8Ajdq4dIDy7Fff7F2348SitZ K+XIZibDAMxjKc+jgmewxLWfM5vde2g3+ROaoErYk3WA7GUa0nYA7J0wuTqKzE9O xaT6xw+ux3NqDh3rB7c7w/XbN6JzwByDFu7QuFQD8+wksKHphfDpJ/dhiTKYAjUL o1gXbsB26mPhPS1rbA6djdUA1rfhz798FT58H00oye1TwK4NN/c4r4FmjHjFuQMG 9XJnW/R6fQlDWcIZUod8QqeGeRjoTiouyjLeIg0Z5Nl//Ol36J6vhI1YQ0+fhfNA I+sYgASL7wSjq13daOxg2rZWYdI7KXSVxKR0kfv83m2TBqaZjWKPBXPYASPuMJlT rOFSUmggJCB7hrS1N4Ua4sGbh9+Ebx8/D1OZjeFCXSOEgFZ0O6HhsglQSTTsn2di SA5A7oR7rFm7Z5Ta1DyCm0lPEWdZJVWVjdUV9OJYYhFfDqji1KIlVStnj0QhACXd ZJXY4HQpO+HTAQL2JJRSPczYoNRPMr7D9cW1Xo51G+dKrPgR0K2mHKFf3dxYj7Ki Q2KSjVlWGrXzAqpRatd39Yz9NB8nBNVU4cyRR4c9w9RXuf4EIDgXOZwWePZRZLC3 j3hmByTXpym4InAWZhVnh5sFsKSlaG0hNjJZi1rn5fB8cEOPVR+nG+2uAOhgV8FQ aIELaQwiRnA/LUmXVpTGcvcq8VJtdnraKZKfGvaNI50Bwexpn0MpsbKYczzlBKcD ntEGgMjGPKctbfCz7U2QCQCuXM5aJVib7Fd9NWWOlwCu1ZW4JBAjHYJzTDDeIOnJ JHmwGfeI+Jnx63OPFB6wjpcs524JgM+eiKN9CATuqfFfud65AI7YXsj5dETMdMCQ 4FjWvAawXcN19o7PE9f10OXc5f3eDeoRrAFeuQ7pNs977wkvBYgEL2QQez3v2YOH sFeuPb3ZWQLsb0gNzoHYFLwF6CZ+ZRLL7cvQ1zsdfbuYRFAoyBJU2SzEW/FaPBee fWz+4nMIHgV+kk8xNlCKt9k7H7IqKjUOsVQD2Oq45IAkG9dyoKdRlfAsaETiuiNh xnrUZ1jGNwdg6nUa5yIDLEaTXeY6jg6pYAMAV9ZI6oh3WtCBccFDyioZWET8UKuc SED08Zm9X/6bXu0J1tNJAn0tn0H7TJ9DWgqEFG+mBr+UyoijjT97/So2PV/i/Kvm HNtZkWEFA0EQ7QC6nw5AmtCMfodzt7GgEtCKJAxsok2d1aECCEPxzx7rPZ3kIZ1Y e8q+tPxv9dzbaZXeYRdWafeots+jlbai08x958t//5cPRBmAQf83kFV63v85TWkH y5gPb/0wXL93j27gMoAdQmqAnRocM8/c3HdlWF9Azarso/T5LhefyWI8Y8FJVZ/A tgrU/JqA1jK8jKwaV8XiBywmxctRo8jXBR4OHtBCQv3dHgBZeynL7pksBsuhajtd 1Iq0aYiMHZlnoMbo2aqBNCvXDn8f0hm/LQErBVAj60K1zK+FlIDUkZ/R05X31F82 +sMCLllH8UEKRmRwU8kKBdJ60fk9B5S71KM4tvYUfZOj4jLZJOBCPo8lAyy0AKce mmplLRUcsFi1qVI4PT27GkXOAjn1la1Yi+zxQDeYk27X8YYMHYtEh4ApNJgZ3GfN wWcIBuZNdtovkInPLGyEtvpmmBpKPtyvutqa8PjtYFycXR0NbCwE745i5eDegiFY ArDcpFQ7BrDsG5wM9650ARBzw8jUDJ8RdhoGc2g0yWGMnQmsxeDYWDhFw+Wc601K BUlAws0rl+I9G6dLW8skD4llwG0V2bPMghluJeXeQoD7i763APAMGo7qONzZdLCN 2QmOGMTdl2taQ3EdZuqw7w5eWAWUzgNcTtWA8dnisAlZkMioYWfFIZ/C+jKwmNWr lWJXx0zbQRNs2xhE3OxmNU4P8d/Nanlr/k/bKZgB2RW+fsiaPmeDOq43k8+X4P7q u+uGOGCdNBCQz2Aq9wko68gTzvia63kBYCTwczrOFmDapg1Bssy8WmmF9TLpsv15 ADInrnDeMRmoJbR0dsa1ryddFploI/8tuO2nxHuRUZ9FpTDp85PsMWUBNaynFKQS G3GoRQ7PxgYiZ4d3AxpLaY5KhWm2scy57zZLyNpNwybWNjbFoDoyMsRBxFhEQNks Xc/jANzGNsAGh5GODltrNE9d6I7Tkiz9rgE8P/3R70Qg2gcTt0Zy1X2RjnMOU+fZ t9DRf4cJTiYB3379BAZ5M3zw8fthDZ3yGO97iXK84xFHxqY4OA+wzbrIAZEID5/0 sV8ymPB0mYQNh4iJhTgGUznJOmytILun+wLygyqaq4b53Ofh3q0rMQl6NkzSRaBt RLqxDxMyAfN/40p3ZDxe9zPKlvvbCHicpaz/+PGrUIcncANs6Cbs9jxgpAu2s4As 3oRrnX115QojZjkDvnn4hIaWtKhr1U5mBrbz+rULke3UQqyWxq/u61djifHZqyHs 5zZguhvivHZKOpE1MFBtLS9TFs/EAYDDnc8yNjYN41Ucr2GDpG0UdrOhtip0IBtI JmdgO2fC7//ugzjK+iueewaSh+7OVkoFDNNgH5aTOCYAQbLaS9yr7zEoQIBk89Up a7CJhDATWUDiaCfcudZBE2RplNX84unr8OGHd2P3+8CLF0FT+Q+7L5OUbABKe2Fk C7Dd6gAcHuIKMRQ78uvR5p7C4iWpmLRd7KG0T5MFe8z7c/XqJapqTMwbho0m6f3J 9+8BvMrCZ7/4Jla42mm62+M8f/kG14UbnYzHvQCjshu+Bvx3XOlE5lEfHn35LWf4 MkGKM5E9wmYNum7M7W5Hd4k3Iyuh88GDUFXXHLZZnxsCJDytUk6W3wVzWGyrb+es /RzIDc/UQqofa5xpaZwBndzTM85i2dNm7ss2pMEm71UE87bG2nSIgQzvzCya4HLc QThTzSWtJspeqatP4efV7x9kA2ABaQcQHVODg2ja15C0ES84R3bYrwto9tVFW6bW gs5Ki6DV+JlCbJhPjofNmSSl7k3GMqMjZF+a2K0SHyo4npQc7fBZTtg7NhU72EBg oyPKIc+gnGSo/oyR0MSmA8rXKQCEdBJymVDpSEmVXeQMNiifUZE6Q/ZRCGFTyf0Y Hx2FYJjn/lh+lW2D3QZIlQGE60mmnDzkuGlWLZ6vgErOW8GcNoEyo06c043AiY82 ilm+ruDa5rjfm7DkStoqqa6UUolcXIPR5HWMWxucnbKOO1SlqiEaPPv383FGgKVU vyg4AuLR70DcSi8PnexvR/RuEhOtiBblwhFSHXWyl1ZQluUPYaNTiLcRn/A5tNEC 4rJ+YPVS3+lPj8Ai6kiLiFF+3wEAaYd7mMv9KMLL1fV2xHm8Bn6QDLLBzB4c/90Y vsw6UfaXKbYw0YFASiPIqjnV91nHmB0Aoe5A6lwl22QuxUfGDtnYdEC9uOeQewks inHIn/Nrkn/vLMX4d65PiaDYyD0gyw/nEcHwMd9rpTc2YsNeSnCVEo+NfcckEzux GYwjlP/ZuKvl5sEe8YS1kQ9ps7u3wPsB/Lkmr92JhtniLdaQ7G4cosF7nR0hTeDa dBY4T6f3RrDI92n5JdLX+UELMh2gEmh0t5E4/Lz3STi9wcCd5naeU0EYB1fMLC2G bfZMaja9JCQUe7iXzLPP9OYVD8no+swNwcfnfF7WamSaObsd2JEW9bfanhLzifP7 6JTnIckGINZe8frtv/+9UP+j7/920OqN/M2vv/ub/8ZiUctYn9MW7n70EUG1DZaL bk6bZ9h0eglmoUY2kxC8CQVE7O+ocvQaBJc9ShA2R3mDZDUN+jYjieoVRrNm+Ck5 VT6iD5MP6chD/65Xq6UAmVsbkc4ohfndlnUss/n7lI2iHIA7zh/vZAo+ELsC7dzN SENAzqZ2UVqeUDfijbPbTWNqWRD1KLmUDp02oVQgh+xAzYkZmdctSF+jA9pO/Xwa muxy1Ptun0NLYKMWVzZUmw4Ni2V189jgmRwaa4CMQ4CehuhO87KsPEXp3idZUo1m iNKPZsU2GMwA9py6peZ2mtJ9OVm1BsxPeYgNHGq+rlMmatA4+gK7MN31MCXbbPpe sh2dG05J575CT3cbtisLq4x1NlsNjKtTV/QQLGSBtgIiB8YnKA+jb+K+zkP5J/ic gk7B+CLz4vPQUq2QDAyjX7zV1cb9YuQjQfhyB9IQrm8ONqyO1xVUz7N4R8bmwx/+ 4GMOD6yPBkdDC/o8rcwcQeemcEKYQbqZn2lh6s8sizONZ7ZNuXyOIJk4ZyINwaio rJJsjIOBZ5/F8zxnQ+rFso2u1UAhQNKHtZjnUwf4Ehi6ZpVemI6ms9nU85hYxGXt xuS/FdC/W9L8O6/t/fOA4NQho0PnzIsc8RnN0FnBUVt2ziHCd8cSTiYHbxa64QJY FsjYkKDJ4pwEpolnsbmOTROHvSNJ7fA84J4rcXH/aCS+sLoaNhiL6Uz6dNb+OEbr pTc/gTUpx5JqDkZwlUaki+j98hij+YpyLd6bNMNYQlkHEFcAupzQsgGj5yEsEzgx NYvOdYqmKxqcyIi3APlH+8wiJ6stBpTtEsTmAZ2lJC7aAk2Njcb59i2tlHthEAQq Rayv1lZGpXLtg30DVm6YQV8fr398ZDhOJbJBZ3WZBIX3++jm1ThqcTQ5T1KXGe7j YVrCnvj6yQucBcbCh+9dZ+0m+O/emHDeRPe3gxvCCtrAVsBjU2MNIv/JMMjz7oF5 rwc4fDn+kj24G+7TPJZNSayvbwG9U14cHTpL4F0GmN9Af3oIQ5GcGIsWMAJh9YRL VCIqmSpVy5qamphgDPBc+MPf/yHrmuYqdK1DlLUburthmdZjh7wsVSP3+Bi5h9ZN 9Q11cUjIKuBiigTs0x98AJuTE2bHRrBPYloVZvh2OZtc37zWja1WG0ByFjYfuzz2 yjaHcP9wMibcZThhKP9YJKhfAnBXkOA8+fohlYO00HXxImwJCadSHhaaI2JTCVha e5XU1kV9rCy3JdkOWFbPiIWphWgG38V4REfirs7PxiESVbCObznQX/aOhhvohuvQ uo8MjpDMFYQ/uHuBe70VvhkeiAMIymHe+18PwEb3Mwa3I+rbH337lCl04+Hq3Tuc pDh5DI+Gft7ryp1roYxgMsJnn1xYCr/3j/8A78gChky8Qa5Cl3BXLQ4Yu+HNwBDe 3HXhehdyEBoaB98Mkug0xKaeLT77Ceu9tqIsls+nAKwpWan8bGdk6CZJeh2hncp5 rHTMJhetrZwktkAjbOO1q5z1SMYAkILSKtbmBOdEdgpaf55HTrqTFm1ooYEKcJDN mS4YmOHZO32vkrNsgnMtG/BVjnRhDWZ6n3OBWEoeCaDiHNqkAa5vZjl0sp9TiUWV VKay+Noc7OEJ8idjlAxkBufLBtc1BDvE2MSwKjjkfyaF+6xpP+sxIPWUfXZC0qB5 +yGDA/IrGwETucQ+XQEyISpwHyCxPaLSuXmUHU7SYZKwmjpXKwzo0mFH4JMBOVSc gySME0dv30TqSawGHGzR/LbFmsUv12lu0N5RWjC3mIJVINPCeIrKmraoFHi+rXBG Lq4twYAdxaQ1jbiU62ekHK9nLKoUPsM+FQ3vJVaLECG5lPuV3Hn/UgoAkVv4S/P5 E7zgNqypYDuL+5gHEHUAgWOGZe1yAXYOA9hjL8oOJ3gtY9AM6wSMFeNzIfHL69Ki UnCmDCPVc9fVxzmcQyw/54wWAIpOdCPyGVPYjP9mZco4bxxxGlchkjUnaB2wftIA 8w6u2SHpcUqVfuY2ZQsGlYQ53rwYjbUxSfC9gSOD/TQyqp4fJsPKBYx5+1ywwwN0 AzpCv6Fs0ecSQSn3UumBSa1xyWChjaes6DsHIt4LTOGYWau8OnjIgiYAspJ7Tr08 gFQTH6hrFesoidQ7tUBQTBz27LU6nUlMsSFqj4qSlWsb485zLLkj/8AlyeRChtrE zEZ2b1oCHFbGObPGGtC1yBHzh1RPs/jceTB5cXiSlx3DnoCSfQNmOuF7ZbXTYVwz qXDKOFs9tuLtQ3NAUwb3Mz8VRwfW87dD/bxWRriAi0l+PW5DYN8sqiEJrke3nAGa aI+Q9Mi41sO4+lr2dvCoYn9SbDwD353xvDKIpVnp+lhTqUECuY4MxAFFfVOMBj9i 0EYarLGjwlgWXvbf+yXT+u7Xb/58941H2IewxsMd2JOrBKx8uhoFPupQNCB+l2Hw kq5GPqQ3m/sfF8EJgFXrKFnUmCWx6F1Q6WyGLALbCRnnAZmuFLIPQu2TDOgxDMMe N1zAqrA4jmvlJuvJWs5hVMzB6tUJjG2mEnwCUViMFB/4jJag1Oc4aUuf0WyyUi21 IiPKTbRUoOfaFtmU06MUgjuDOOE18AIycdkcmLsAQT0McwGRXBwHCBkImzILIKYJ sBuZdRP1pjlsJKl2ajtRWyu57tei7VNyjvsE08xGsns6l2Bvl6WMsotcpqkeHZ+l 5t293ai92iIpsESTm88YOcCaUL2czHZsksk0rNNSgt4Kz8ERbpkssNGZ+XDGaXSb juwVxNF7AOwSgM0iQTKfQ7GpviZukiQ/72z3BMyD08sqSyreZXUsPKUHrGaE+St0 hjLMAC3s3gGDCADudQ31Uat7eHBG6bmcAwGfOjL1RhijqvIiQM4Omz0ftoCGFBZp Ds9Kw+g1gu02Af+EZ7tKSd33zMWj0dLfHiXEcrJep4rtcuBN7a6HgZlxbIEmYFjn YUYIFiy+CpjBppp6vBQbkTjUkcGz2HkGu6dsTA4mdVMeGKkcdLLvNl7ZuOCY2k02 +RkgV+9g1xgnX2RkPXi16Thm09pNmuBA9wRXe2oJxulonCv8H6CTA9bhFsoQZMwP +dwmNlp3ueaLAGaNVXWhrboWBruEZIVuWYJ9E2XvtsaW0NrSRmm4A3/SS5ic0zTE 9x9mUc6jFD4ByPryi0ckatxvytmalX/+5BUAtgd/0GJGZzIHmudaWlrB9aInBfzl 8nMZBNXHb/rj2le3anlynMTDEahn7K911sY4gMFKQkd7K/v+OIxPJKNTQCYAfXRm Og5nqCwDPPGZdlkzCzCW6WTQ3rvJUQAuAKy8pi4+t/5+AKzPAenCMSzb4spanJbm nhwD/H7+q4cwlC1oNll/s9O8BtrB5gbYvdXwxUOaf9A9JyhhOr98c3me76unsQvA Tul7GkazBo2o2vjlxUXY0z3KkXUc4mc0BmHXxTPN5DO/oWz+NcypAzUaKhlRy9rS leQOY1rT2J8ve9/SHV4butopLdMFPg/b09nTGbVnjpzdYf9VUcGYB4h8zT0uZN3e omlqnzLvk0cvmGyGV2BDbWyQscpxlddVfqBvrVWBWt4zE1ByRtLS1dlISd6xrhyy MKk6EkQDfBjaM84sy9lzMKPPeN/mVg53qgx2ya+zHqvr61m/2WGVz5og8Dk+dov3 e903gYykEqPvUgIWcgkaTqrqarEJS9D0JEOeFa7gkiBb+xd/9RksaxZlWTq2Ycdf kDCcsf/ySZh22Fcaon9w6xpl6kR48hhtNNf+0ft4ynJfXg+NUOavhpkvxBpviqSU QQBUPirK0F9yzdqENbU30UmdF/ZXGDHM2XJAYNOCcJOkNQ9QX4oVjl3zK1OT/Dye weXMWYKA2CTw1JAI5AHIppBQfPnoFd+LXpjEU1lEkkaicxjMMwKfndgOj9jjDBzl jNxhK1+m6pN3toVn6yB6cOwTGYxQAltWDdt8ob2dM6CUShJNIawdpwpVwRo6DtaB GFr0vWtIWosWaalIjFZIpnlZziCAA/u/CqCWBigqruUaqZxoV2QDyykVCif8aXPH 0QQrlaW3VFicZrgDidIMZ72d5iYOM5PjsbHxiNKr1ZpzwOUpoPGYszIFIFxS3QC4 xKYJVrgU31ibovrfvA0vJtbDAn0blZTSjWsxqeX8sHqyjuTHgRgJjhQn21m6V0bh NEZleMOTS2GE6V3TOPXMI1NyqtssTP8mZ5hjZEshJLI5wzaIhRPT03hg4raCe8EO Z1khz97RppbCnTA2zesMMpI7FcBfQELh3lM7r1fzIWeB1csi4pTDcwhbcf8cyn5y DlXQjCnr7oS9bZ6/99WR1ZbGnQIVySW09UVoF7f4Gc9+hwLIvNlQzA2LVbrmiuLY DCYjmsW+L0We5dQuz2sJJTGBAFSLSUvVntOrJBWrkCjLrDFldGXsOc99kxYJKrtN DgB5u4BvCQqxhHGaMMyfMJh8NidMrdEUpNOMLi7AFc5IYijXJysKOxHjgMJE685O z9TK09/6w3ve60IgABZ/CMbeTbQkQhMzBJV6tNocDOQAiwDa2BcC4EjqcQbtsJa8 L/o8iz2UI9rw5c1WMqkUEcQUYzt8Cv0b29Ef2Mb1TGQKAmzvuTpXK78xVtEtVAA2 qoXAsPFREsy4sYzscZfPDqqJchHlBr6VMc/4JxsdmVDu47tJWwBqrlufeO+dFUx7 dBBs4KGbIBashb94+nV4sTwbChpriWedMLkZaO3nwhgEw0kKtqew3UcMY9kCN8hM G0XFfzaYKcl0TGs64HgHjLIIHujDoeinn30d/uXP/jz8fPjLkA8M+d6tq+HDy++H MpI4nx+34e//+n+ZVh6V3/XrX8sb6BpLemgOuReaYdjS6bC0c00EbTlglc3mg5MK VrisrZV/V0/hh48jTLnZaih8ik7Gksb3/dSNajpMDgVooLzBD/hgLedrm6DuRk1q KUDZA8f3dCn5Aez8czKG/q1+Kjv1FGqnk1UoMNZ+yoeazcK1xKH/qYBDmykzC1lX CvtsCDINFwk/z6twndxiFlbMSPgn//mAwy+VRaKfYASzMC/LsBmyw+VRq0ojDytB HYcMqZ/f7HGPBz8L06NWsqwCqyZew+ldq2TpXruaW9lGtZuygj74ckrJObKSLJjW xkpYC5oTCAqNsCmZZJXDyVnAJGVgbsI4QwIEAqZoOgk0NzAxhUA0y+tcBkAkOOwf vxxi+hOZEvdmdFq7lCl+1okmZDawxBojG5S2Yd6aKO/t8r7jME6WHQoA6IeA6xKu P41nscf3p8F0bwDk9brNQPuieb3ldO/FXQYQ2KG4gGTh9rWu2Iw0BNCoounBWdPT k3Nx8lAZzN/sEnowWJpsDxc2e3lhGUxcG4wZTSMwVOcEjHnAzShNBEkChSB2nbJm yhEeszlFgJbq0ERALybAO4TB0pyaYMHfHMzAy5GR8ItHj7DWwieSdeOaUwNtB61y DPZM9PP1gWdTznJd2nwkw6OmKmpkXVjeaJgVdjjrnHXNax3Dfp75d74c9UK+niCW /15DMvGmvzc8f/2c7vBBWNQpQBClf75YgxayliShsaYpXLp6PVoj9Y0MwTBth3zK x9pCzYwOhZt4kFYCgrdgAkfH0E3WAHLQxh5yqCukP03hWbDWaktzuc90NXO9E6MT TC3DSQNw54QZx3kmp7C7qm+KTOjG6iJd14x/5VA7oFs+lSB7CQmBh/vo4AAjMOfD hUuMHIWRnZlKAtQm8DftiYHLLvdFDvpSWJbV5RXYmwnWYBHaxwK8V5PhT//is7BO gLro67Hv5yaT4X1kAK31VZFx/wwngVTYjQ2AmQMldgCwFwFfZSSVT9CqpsLyFKEN tSQ7RKZeUkrDGAFpfHg0LBAEmtsB3TwGdZEHVHecxy3QFlS0NpA0sacctvBkiklb XPMB6zRJyb2iviFc5GePSaievxmIe7UClm9mAr0w3fxtLU3cw4KwyNrKALBduXaJ YHYUXtPM5AjFCsDxDlKcqUk8W2Fnd3jdv/38ESWxVZhEOr3RJ47xfMuQ5jShq9zf WA5LsFwV7E8t4R49xT0ARrCutoGBAqyLXkfdpuEEgaMGgWsEmUARchHfJ8nz6p1a BlTXxAA9PJqMDUoy6PsAfe29GkgqdTWYn54KIxtUffheNYRjI+PoUtF1FuQzrSwZ nqJzzefnigBLa7NMeIL1unjlIg4ZWFwhXSjmGX/MMIN6ANwsCWKCJOZD9OrpaPF+ /vPPwi5VjAfv3UUashxevnod6mi6awHkTs/OhVFA7dXLPTDkZaGX8czPOV+6L7cQ /NNxVhiI66S1DV9HgvWrXhr81GHbRMU58OhXX4Qd1nEezH0qREICxCAwWELzOw6Q KgSUtxceh6oUEi/23Hk6mkWeRx33s7O9jQoRg0RIuNvrKuk+h7CArUnl+2x0La+v 4fVgp7k+WfBiPpNG82dplE0BWQ7cMGjaGa2XdA8gvZDvQ0wDWQCoIAYI1I4574aG HMRAg+naIoF/lSoZ4z957VMA5D4M/RY+mbt7eGfipiNrnonMwuqKrF5WYQ33Hg0s Sck5oEAJmHxQUX1byK5oCFUtXTy3BpoG3zWk2Pjm+aKDiiOyLYmrBdzmPMvYxzWH P7fT8LHk9Qtgbw/x+3PmuxIjK4Yyabkk/YKBXICi1naFJAyFOLFkUcUpRVOs92YD +zXBtQpEdLhQJpVHE6nNZg53KKcELRuICjBaRIIDxRrxuRbHNZrPz7/TXC5zXqlb FfTpZrJLDC5kD+RTHk6hf0SdpueKMVuWWcbU8amSSWecgwliu53wZ3wOQZoh3GNW izg1ozaIKfWKelbuH6dvJJNk7GRax6ZXYHWJaSSU++wjAekxYHwdJnOTzycDrLMC oShKtjYA4wJe9aJKBieouixjq8lFxrjPY4vrQtbRgUBO77K5bBN8AhKI133Amaq2 VVCews3Rq90GNskLyQSrtYc8b8GJ6+CQ15DtPOCcdY0oJBAP6N8uWJWhNf7r6Sro thPfSiSwJoLEI0sD3DctJZWebENmKEusJEGRhLLZ3PuhrMOKRZQcEt8cx1xGFUqf aqcXmtiJmHh5MAX3iXPazygWEjvZs2GV2IqeNp1RysC/67gS1y7xkocUSQgbX3MA w/sA7S/e9uJsMRmW+N5skp5imhVdynXE44byWqqwW0y96o8OBD7v7Ewq3OiPlThu 8NkmFzbDt0/fhn/3yy/DX795irxhJ1zvqQo/+ehu+CPsVO+3XQ1HG2lhmGelTIGX /od/8fz+7pddcv66971P8O1jchGlCa1h1Kxa9jT7UR/qSDV/nZE1yY6a0ThbWJ2Q Pm7S4HbI5VZTPgfUmk05lk0rC20s7M73xh3Blhhw8zic0mHQeAs2il343DRKSBps CzjcyH4Pf+VNBctoB0lR3bz7R4Bf1k7srgNcepiatTlOzZKDOMTD0uz6ZMeMDuDF CFFNhBWW77EJZJpKWSBm+LI+eog5mvEQ3aVzr+22U1NWTJnWLkEf7hklnxPsM5Bl AOL4DFD+HkK5HF6NaoBZvB6Y6oOXmQ1eh4/oGQyBeho7O8enZsMB+tUa2IS1LQ4V /ldNE0cSbeoBLsk2NE3x92wYXbPqAfSCZzDVORx+djlbWtJAfYrAvsSmrr5zJ3a2 vhpKhu/RlWyjV+/AMIctCwCgOTMzx4ZnQhfJwut+ysSwDpVk5NNz0PtkozUwq8sk JJb8u9va0XOhMwEA6nu54hQVpAHNyBIU4idn5tkWaYCAWjInPFAp5/bcuxldCtYI tpfbm1gTHDgE2nvoH+1u/csvRkK+m4178GJkGFaK8ngnHekFVYA02F86glO4z04h y+LZ7OMMMAcg0PlApt5hCa0AjfwasjbefYn1ZPl6lgC/gEXNJGzUIGXOW3VtXBcA ngBlk9yhz88TmXVwbtZJcD2nC5UFGGfUC0wFwezlGGzM3n1ulrE0yk7hPrvADIxc PmCWbJyftfmGC4NFxjg8z6SEo8KgSOZ+tGazFuUjsm+7ak8Ixjntl8PB8hr2S9zf rgsANVjVkYE4G/7Djz9wO4Vf/OXjUNvcAcvEUIBlGmUmZyJrRVyIPoTXey7Qud0U hgZH8EidDVcwi9c8fn52NoKXNhqvSkop7a8wendqBtumtsh4rPFahRg6l8AKj4+P h79hBOeVW5ciix31fgTplgudSEoq4mjeU0qfrRc6+KingJQ32E2WhFsw7FskSs9e vGZm91n45ME9ctL08PLFqwiY6ms5uLiORZp7PrzRBuihMsAz6U8CjjtaCZBZSEIG 42te7ungOR/z+eZjI01ZWTkSmDmSOKyw7l4JLQCMJRhNR9p2vg/YJ3iPkZjJ7Llu Z6kM9AHWPrmLCwMM06++ZmQtQMixsnmcpH2ArV2SllSAxw5rehtwf5mGo0wA1DSv s7CxHydbVQLC3z59HpPBZp5JnOgFgE0ABnSnGBoaC3/FSNgHd29QZSFAAuRt5mlq bKC0xpQ0yvtKiSppspmHybYScevmbdbcOSNfR3A4WAtdNDIlKMPtYc9mR3YG1zQB 6OwbTobG9uY4xciBEBPowhqbm2I5fpSv5ZDUnTJBSU3uIuD++x/exQ+1GlszJCI0 Sd6g6amMM+f5kwH8TWmcQQaxSIn/GZ6zJTD+xSUVYSo5G0ZGp7E9Y1gEbMxCMhmT 1C4AYRUSjxcDb8MSLPJ/8o++Hwr5HH/5q6/CAeegAwv2OJNes+fTSarLKDXvwih/ /fWz6Ht84/plutk3cXhI0myFHpo4oSxghHPuxoP3I+vzi5//PDwnIWm/fgtdJdPs ZLcoLa4RC8YXsL8BZHfk0Xw0PxCyjpkyV45ul+C/u0jygU5VGcA0a9iJiw2sy8Wt 6TgsoALWV4siJTBbJENqVq9wvWkAkmWYHM8r97aJNCGAxmE6z9nzZZzT+wAgO+G3 SEZKYPpOAfcTY8nwGaOF80p4Xa6PFJFzgPhBzDmgB4DOCtYYGnq+ojsM9eRIejgw I7cY7XFxNQl/AZUl5GQkeNoPVRQcM7a2iXJoe0ivuAAGIFbwGZXX5fPMCBwk4zQI QyYcKG8DGJUVMi2RvTOVgq9sPmw7sSYd4mWLD1HA3y/3tIUDAOM4lRrLzwZ1j7Us QEUWZ61ypxxi5/ZhasjlWRoDc9CCHlo5hHiqJ+mq4DlMUyU4AN1Znpb48fyT4dRQ n1MLUiElNrpV4yIxOcF5tUGawevVENPU1J5RiS1XqsFzWSSBkqnV/iwTIqaaz7HJ GtjjPqVxhh5B7ORyaNqpHsd+s393AY+5VBLKiT02hsqAbgAwD7i1lu11c9CMX4tL u9HV80IfkGQAjsEEa1RJdnAZEvlqj5ngt0IDtZtWTwXWETgDGBPIKwrZ43oSK2cU RzhYyHvHQY0nLv00hepkAZk+I+I41BhrhBjAt/i41cGaaJk4OGxCGU/GOdIKPnuC 55PF51ZOsAOA1hmjhIQ0A1BwCrY4hkFf4/vSwSo5EELUZcEWgEK+ZuKyDzFik5Wx VIZSeUcxiVxjFUkw98z4Gck8pIw6NKjD1XOepc7noZoA3kljERjfneYoe7yzgxMF 53+0BuV9vH+7XJs/L27SjtFGubU1GpCJbwX5DPPgXmoHp00ZDwAJAckFz8E3yQKA FrC+lxcY+fr5L8OPbt8KH7X1MH6YRlDO/jdIv/IK1uLP5SBpOEsp47lzHWiJxRBT 9EEkqRIscBYeH0PCcGer2KP3urtDB0C7hL2VCRE3tbgV3nDeHpRzzf8waGXFx8fB H7/+tU8gvtb+UbiO9qmMRSqNbEeiTSU+QA2jfUF9wpQBKFq37GozkeV3X1Ea2pKt s7wXOJy07GD/sCC5uWwUgcAZmXLsrOf9NfqPS4Sbq+7C1zgiQ7NJJZMbJl3v4hc8 cglxYWkHZTe+YJoEBDDLTaZ04wLwvWwWM+szsyG/iNmE/qNOuLBkUgxw1i5rHcC6 ic7F7Mfsa5+fO4Lizid7NSvZ4cCz3Kr4X9cCD59FHp5TVba30WjwWcan8I4ErKiR zeN3MQzpDsbOI3RNX2Haj6WFUsonCYLpFg+yta46+tUOTi7QMVsdzZWTHO7O6N0g 25mH0a2pr4tent887KVruBOwfwggmwoXsG6hC4BufLwsOYBsbBmgBJcOs8yNjVq1 a81VGMK3smCW4gFxob2T0WjYcwF0dRxYZfHsbe5hr4O+jXsxmZxmTCpiftjRUYL9 2iGZfDETsJhCJLv63v3uWA485NqabqBZYeN+TSDvaayNGeY0XchF/Lwz31cZu6qw 3W7UmZU5AiVm6O2NYZJAuwL7eO9KR2gqIZt68bc4EjwNG9y38ZX5ULdQTZcqBxbZ q2WmcuZ3hyIAOozoBuzKDutSVtXyhkyv3ZvPR0fCX3z5dZgAcGeQbOiXpyDe0pOJ lEBU8GkzEEsrHs6Ot00uYt0hiwXLVMh7KiOI4NRjisPGZj2Z+HOYDj0GDTAuyhTW puz6OWudEzKW9PbYC5ayqmE4smvz0KvCphgcKaebeZ9wDSswc+jrwyJs56v+/jDL hKYb11hf3MddtHayZ9kEnMkxmNLVnfDje3dYo6dhdHSQxoh8MmiAJKByjud8te0B Gxy2DEZ6bfMEb8mG6KO7PD8TOrq7QgPShE1kAn0vn6ILzgK4FKOfpiuaQ6igApkP FZNDqgjX716MJU2TujWeTSmg6wKgTc1ncozBBp98hzXYEJQIzFIluH/9egzYTx8/ i+N8/+B3P0X2Uhi+/vxheNg/Ef6LP/5dksbDyNK1NNcwv/4K+2MnvJ2aZrIWJaWO FtwRZsLffvYk1LV3hBrKuiNDw9Gm5kJbMyCCz4cWt7W9CWlDE9pO5sjjGfnx/csA hvzwFPeKcUBpXV0NDR0bSBmGAaTpNChdxjlhIXz7eji8j/m9k6KSQ0PRePy7D25j 35PC4ADkBgSv2wCtTRj5v/nyCesFZwr28LpsPnuhpbONAJcF0J/DmzIldLP/nLM+ BDPahnl/aU1deMUghSTd9w3IVTwfRgGEa/h3XoKFFGw56ODqjSuhHWA5Ojgang9N U66txxILXTpNdemcf50tjIul4vDFo+dUORrQwXajEZ3H2mku9HS1xjPtxZMXoZfy /XsfPohBdXRogCCdRumshxGXuH+MToR9xpWmZmFyT6WAYy3cvUnXPgxy//Nn6DF3 w40Ll5HKUHKHzV1BF9yE9mwFoD/J57PZx2TXxqs5LPi+/+l3Qysl4G9++Xn4gmv+ L//zn3COZaK1x6YOgN4dddZ7NN09Qm5xhC72LuMmE2Gk9xVSDJIoALzv8/jlq3Dr Ox+GJrSt/c9ehEeDPJPvfYcmTzxWWb+O+rXpQ4Ypn7PmBo1IuxMbYeT5GNdKs0YJ ewxm02BudcF55LKcVkXsAbDjv4rGuCzY0xOIAa0Cd3EayWIt1fJ6i4DPWUrszW0N 0fLqhPjkHtxnvdtAuU5CIVmSx94aI4HPyKgDeDOshNctqSzGtYTknzVmY90Zrg2y 9Sck0qk820QuVjywqamwR1Zm9tjfug84rUzJAUEQNnc99gOknR2E+lp8LyFstrII 9rDYace/LvsTa3LwGdXTVLCgbMvYk4U9ZCHPdmyB8nFpLWAOORbXZnu50+JqKgvD BRI5R1/32eBI0uLEOJvNlkmE51cXcd24hF8qWl/A+hixpaQAuRYgxorXOetHrSQH WCgnPs3u4QfN9ziYo4jnIROXrs6Wc0pWsCaXpld6M+zVKCIGFxIDd4hBx4DdPNjV XM7GBO+VRgNqNvf2AABYDvNq/FuaWiTioqsk3unf7ns6YjyT523MfznMMIpoaUaT K+eSlbJjwSb3gQOe45NyNc/Os95qnvrPNID9OnF0AXAsMRT1mjwXNab/D3tvFmTn kSXmZVUBhVpQQGHfdxIgCS5NdrPJXmfUPdIskqyRFXqSbD0o/GBH+NHhB4ceHeGw 9WKHwxHWix0hP1ghTYzGskYzPZq1pxf2kM0FJEHsS2EvbIWtqlCoKn/fOZn33gJA kOxFjlDgB+q/uZw8eXL5M0+ePHlyJbyJixhvYLzPvNvHwmBmBpzky/DOvI297jXs qCJousg5AyXWQ338weDHjZbMEYO4lepLreP9PIsWOUPV++6yk+TV1h7aHhpgl5GF kIeq5VnCnCL1INM6hjDIfuBCXhUgTWZheh67t/RDyvWAP3WGpV0hn2dpVIVQL9Sr dmUc5Vs8WOeCyl1tTXNOD2JpAFweSp+m7ylMGWMx4nilOoDzzzCM83J2VRbQz55G Qqtw8B7SWlVEnAPnEfx4bkM9X5YTwQ+p6ukFGe6AyHdZVyHtBt5dD82KwmyxAFH4 R13D+F9CQPVvfvJD9M0xRbZuS1nBbs/CDFcYc9HBftS7NmM68/btB+UH7x4rp+mr V7FAdZvF2QCLpj0IMV7GLNzYcuxvHz6P9YFzSMYHyqs7UOnkDJK3tm3fNl4mKZcP LfDoQ/3WB0d19z8YLl/77nfKMzBKnuZ24lHJ16199R/UyZR5U6p6kxWuBR2CID9C Fd7VZVV5WiPQK2HUPFl2CwmFHWAjUoYN6D6EnpQrRRpqNROwZrNuMQjYGIriNfy/ isresG5tMKGucLTPCtrYHvG2C7fTNUc1wRWmGh72/uONSCPXKgmlYZ2I3O4V3ygN alluokel3ugIjaRJLiWgN9ApWqYfJlZ9FZlYJ3iWa5j2OYcuEYc3WL2PwPyqqKxO KX0UfCpXs6Klo6tgPuyKBlH8MJ3fep2AsbU8Nv5lBkIH/2Onz3LX/EnqcJAP3avr MFHEQZTrDMxuOa9H3O4pzvt0xFV03ItsSQ0zeLoqmYCZUJdnKyuweaTTXhW7mcln kQXBDQb0L710gIEXqTgD8Cv7n4kP9dwV9OM2bmei5MAQg3s/uN58g4kbycpyOuAm JtPL165gUB9TMTBHttUUOoH72YqbeTCNnhRG3Q8ewC4p2zwweDu3wFzBxN3Ajhtj BDd3bIA5mIWxvYuEaGesypSAKQn2bmxv5lLdw9Oa19GztW620gc2EvbM6Lry67/y He4Y54AXN89cvX25fHD0UPmTD3/CjRo/Lv/+7be4uvMoW1EMzkNryktIDL+KfqjS vLhkASbnvTPHy+9+9H6ZBv8GJo41bJGNMwBsQn92EP1przl0IHClqb6a7TYBA/d7 779d/vkP/7T8yz//s/JnP36bRQvSFwY6G05m1QNdNFvUMfMs7ariOswsfUl8qkZo 1sT+5fWrHyOt+ukH78JkHi3nTmPq5+x5TkFjCJuBT8nmM7ueYdLZRV9Dlwep2Ubq TansJaRrF9D3G0OidgkG48c/fh9TRa9yep52RbF9lMF25779DDrcxsNW+AhM4hz2 bLXY8B4HYQ5yEMY21X6p0gWvg/Vbmjh9gu9mGZcGYHuT1fMhbKquRk1hNQzsdWBH aPtvfO0NJLY7aO+rxH/C4SwmKRYQN65zQYHmeViA3MV94Qx94EsHy/6dW5GmXyrv nJqExi9zb/QObjWDCT95unz3218Ofc6P30NF4tDxsgcmRt3Fk6T10OY3X96PhH22 /Ak6sNdR7h8iL9UPLmK2zUsPqHJudDrD9v9ieW7fLhiCO+VttpnVadzPyXb1Se8y Kb/y3Payc+t4XNv6LioHr8JM7eLwWv8cetYwyhtQN9AG609gLJ9/cX/58vPPsK11 u/yPf/R+WQMu1Y7OwpBzo2R5/jnqhh2Vo8Cvp76f49T/7N2bjCkz5TXKu2nDurie c4IF5D4Y2Gc3ccEG2/0nkNAqWZ+l7B9/cgTGkbva2ZE5g+7wJLp+L6ECcQ81nIkL Z8sYaji79+xDwojN48tXyzFsDV+HWfAaaLdnDz7/QlyreeQjruilP3iKexqm+gw6 v6++epCrnFlwTJwuR1lUvMD3vQlm4eLERHkH6bQ6/9OolkzAhG7E+sIBGOWZycuh jvNNTH3tZ7F8+DBqKEiGX331xdDV/wukpGe0m4p0Q1vGP3z3Y9pDSdRGTKQdLr/3 vb8oe19EX214daiA/BQJyhj9ZhXf/CTqOjeZZP/23/pOeROY20yox7ChqtqGW7VH jp9GGj9Ke6wvc1cvYzHgrfLGN9/EVNfuct8DSWytaw3mLnPJSnZMvvL8nrIVZuwk eXxw7Fi5usDlHc4pSKNHOeToJQ7qcI6jJraey13OnecgHHX23LNKy5n4Gc893COD 4fbpJQ5z/BSzeqtiy5IDLEzSa1HjmideVSF3yTwo6m1xN7k/Xbu85xA2eCPcXRgd 9am30uaaJ9SiRj/M+fRtTPywKMBJO4+VzeyA7H/pZRiuvUiCOU29ZQ/tuIotUBhj +gPiEMxU7SjPwDTv3sihptnL5TxjwjXGca8p1WbsIAzzAJJ2zALAUMNYUYYrSFfP cWlDCEt2HShDSMiVPnrhgFdjSkUAAEAASURBVFeK71JvFybsOrqtWpbRDNoAImsl buuZT1dz8LafCwUecKPY5NkJBBTcbMWYdRSmdAamZJRxY5Yx5NTl26he3YjdoLXM 4+cRanjXu+OS1wOPc2h4Hd+I0j2FNV7us34D4wZz3B3Gb3Uh3RW9Rx92e3wZO2Ye atIgvGcVLtEn4DMZMFEX4mzCHMzoNs5IuLOqMpm3sW2u9bCGOeI++Wo73DjPlPTx /avXe5f2UtVkkgNnMqheznMPBv4akv9bnLvYunFDOcj3voWFl/ZuPU/hjVyjzOPT LEzuQLcXUbjwckGgiqFb/f66VatU9TbnSK6ykOrnUJnzqgegXMwrYVWQo5DMbd9h 9H9ljrRhvhzmXQZYZk6dVM/QGOv2t4ssrQgsEq6JTVna4UHKPMrFL6gJjtFe11hc TFHPg4SHvi/93ZP6cb6HnZh+TDMuB06Bj2XwcJdqADKy1/he+2B+19DmC9Ai0ys/ Aiq+Ae0Yw5BC3yDCI4510TdWI7FlvqAfeT5DU2LuPGqSTdNS6oNqbuqBTCn4w849 47C73+4EK3iEfaEP3ON8DeeZGEdt103gvMS8/r/8/u+U929xOQjj1N/+lb9Rtg1u ZLy/Wb7/wfHyvXd+GvP41YLJu/2bEcJ8ufyjX/3V8p++zlWuz74If7E79N3/99/7 4/Lf/e6/KP/+CDaa0bvfBE/2yp497BhtCH5zGUV79IHIeGifmNH5ef7FN8srX301 9BWUprqdwuxNGe2NrHtgVjQdwbqAD44wOy2NPELjOhFr5HyQjoSci8q/h6LwaEiu bjB4etBhE7pKa9lKUtdNRWcWKzBISklh+GDkNJrsCqKPD0JcHszwhDhtCuOHKB79 VW2oqmsmc+hqQsnvPNfeLaA7pikubbGFMX/S3kWyqQh/hobzpg5XbGNs+6nUfJ3t LlftqjqEgd5oSFZITjJ8pHfpfBs3rocut3w5DY7U8To0u111E2XnUfC43eB2jydM 3Vr0pPgdyuO29HN8WJ7IvczNMF/lSlU7v8yxp5I9Pb+VAUfDxe8iqfJENZwWOqf3 4prLUerYwz8HDz6LKsFw+fjUZXT5tkfeE8cnkdCqc4atxTvXueVmdXlm+04kWWfI Y1kMNDe4rWWaj3kng7F3I0+cORUHIIaRxtw/xgfFQHYRaeN5pFTP7+ZO950YOEf6 oJWCX/v6a3w0U/HBP8/Ef4tBfAYD0Hv37wvpwh1wP8Mhsg0cLjiO7t8AA+NGJCCz LAIGqPNtbPXLsC/y8anXdBqdsx9xV/xuwjW/pd7nWW7DWbtud9mzaiMH/diKZSFy +dwZmPNrmFbxhOS9cuzymdJ3he33ZXyElMGPbjWmOK6z3TV9/zY34AyV/4SDJ9P9 TAIMMrbhEH1Po9UeLKALMrhqSQJ9ZibeSzDubx35pPybM0eRzGwop86fLJxRhoHZ H4MmlRfbbRcYXI6ePBELM3UtV8Kkqtu5BRzqbXlS+gFSBz+fjRyKWWQBcwNmw0HN rcEp2lbGa4jfYZhCB9LTdxfL+0waq2Cqn9+/C6nxXZjWC0x63LCDGPbkGbaSYRJf //Y3OPBxg8n0VNm7ey/5rYjDRtfuLHJ4Zx8LDoz1w6jPseJfDYNwisn6NnkMIY3y ru4pticZq8tr334D3aW+8id/+KdMppgY2r7dZTST9hX6xzq+DxgvGAR1Mrc/uwPp y1osEVyO60m9hvIqyvL3pthGZJDbgaT3wS1OEyPd/c63vowUn4NO0H/u1Emu9cVe K5P01I1L5Xt//qOy9xnUEViIXmLyvMvE95VXYIJY4bzDNtJatl9/7Wtfjf7w1nuH keTuYgLGiDrS/cu0u4cJXEAeZ+C7B8M/DnN1iYMnh2FQB4Hbvn4NC2WMxjO5fPNb ryNJWl3+im3dI6cvwWi+SB+dLj/98OPy7P7d6LVyoQY4z3xyrPyDbx4o+/gOrnDo 7DKSi9+kbtYx+H743sdIMJEA8I0vhzO5Qz2u2bCRhSHbztfYkkcXdB/f3wiS+8uc zKeDle/+tW8iZUTiADPZR0Wvgqm7yMGzj06dhzGmjpm1z5w8xTewoezYuy8m+bMs Vi+wKBljsr1LvV29mqa9NtAHT3/8YbkG3b/6tX0xnnmZwSrq+xtIqpfTd8+zqD74 8ktxw9lyyu21yK+hi/rMrs3l7PHjbD3OljdRE5hjUtG6wLpde8qXDuxHqsQBGw45 Pv/8s2UXEvPvoUf2feri178L/Ugoz8Moul24+9kt5Qg679//3vfiusi/juRUafR7 6MhexnblGKantE178fx5pOcvUa/Plmt88z/8gz8qF9jSm5qGuTgPYz1xMRi6B1zF fersiTJIWz5/AJ1Zxu7TR4+W5w7sYhsfCdmKaW7BY5eLsVDJ7wenr5fzc+hiIk33 6l919/YgnZ5mvtBqyVe5kGINksILXMm7Fd33UeaaO4zPHshRItjPYnM13+Wpo+TJ XLOPep8K5mCGm91UD+IQKczSDLtLf/GTD7jZ6QBbuy5kF1lkcqEDfXgcYYfCk/sw Rh7u8rwFwy+7HDAoSM00v7cMM18bsOiwlflrBnwbOXQyTbvdgvG7eYXLT/gbW78N NQrgBmF6mbCvsPi7eJ9+jNqb28aaXJMxXmTckmm4DxM2jb7qfS5kuXZjtjzDtaUv bh0rV5nHTlxHj5/63UxebjG/i+WDuzPHmL/YMWGXwInYU+Mr1W1dxwG1eQ7PMkZf ZwzYQr9bBZN9+kQKJ9Zjv7uPeVIddA80jSLRcudvDYKlzUhHFVTcQud14+J4SDln YawussjqZ/7XRJhmu24jVFqDMMOrO8/DhLOGZ9zTEL+HWmGsmLcGYMo9GzDOoenJ B3fimvdNa9G7pU2vwtQqDVxL2VczVnkeQJOVXvO6knHzFszSOvrlHeoEtjHmU1hj xikYXvrFJRgnLyCZhzkzXy8QGeRbPs2ZhytYZZmGn3CHbAbmfBZ6B2FGtZijEG0I 6a8mDrVkMIe633ryV7LqoWxP8ns7Vb8MIrADMLl3pzjnwPy9BuFc2ESFEe3rQ2eY XZywDMDO39zCCH2VbXMYx5u0reVRdVK9Va9m1Sa9V/aGiS3m7zjPAs+hJaDlSKC1 IuJBcQ99DsEoD8CwulM7vsBOtozvdfSi7YPwXc43y7FIMQxeVQXmgFNqroUgmjR2 vRXurKRt6KnBTFOJ9GPmYOIVxLibqODRfmOYh8RUC1E4oR62B8KtP1UoNcelUM45 dWEByTb148Hv4BHhrTYhiLmCoO0P/+qtMsTFOs+uxDwnNL538oNQ69vGvPStnQeh BX6NvrF5dFXZTprl7PxppswFyhvoxP/X9/5a+W//9b8q/2zoj+PSiW89+wJCLG4P 5PCvQpjHMq1Ouu1R38PnzW//Kiddt4Y0T9Me3iesOQYbz4qQv9WGqisumTsrQ7MR cuyuxLQxpkTVU4XD95AGaFuNg0Wz6BxeuIjxYlY0O7ZtpDOpk8gJPTrbejrDJqQV A0xMruBcVXny3j87lXomrpi8cs9Gd5tnhsFaya7220JXhXTX0ZFEtsZkBsPCRxVS YqQAC/OsMljxeIL/NgOxpxEHDadzeOOFqw+vrYubvGCoVT04cmISPEjuWKGocnAZ vThPDxq2AgnBtbNX+ci8+YOrQFnpKz1RaZovPG4IWoXekwdLLtMxdzKQehJzhEbb +dwmtqOQUhw9h53J52EIOdkIg3BgJ1dYss1+AUncNzEphFy5zKIXuRxFrCOnmbT5 ILwAwCsOf4oNy++89lJIW2YucWhupyoGA+V3f+dHSKOQkDM4nDmOngl1vG7VALqs Z5EAXipvIGW9yZbbHepPA+FXcKsy8MbLLyKhwKj5RQ6JMMCNoXtz/TzXxaJzNkj5 L589jWmgy0g5DsDMYtAYetfQsWzvyatXMdLOpEP/OH7mDMwsk/WW8fLJKe4mhxnQ +sF7nxzhsoKb5Tff/ArS2rFy6BBbfdcxS4M0pf8iNM6w9UZHVhdqfLkH2DD1RPu5 recAdItV8aRSrksaLOfu7yMflpdh4L+8jdPO6NX8aAKj7+i+Mrqht4YhbgZGJTFu dQzQLx0wbjLovXviWPnRqWNlK4P+RiSAbiVtRRqmbrMLL1fPR5Eo/RAG5e2PDyGR 8IKIcYx2Y85o1wvl18bXc2iJk418KtqFdIU9zz3hwzDVK5nQvNLOLS6ldZoK87CR kptzlOPd9w+Vf3fqVvkHv/0bbNkMx1Wtmqx5Ad1Ot4DeOXQIG5cvMkH2ISHDQgAL gT76y236irrJzx3YiwRsuHz04QflxuXzGHVHZ5kVs6aKXGFvoT2UZl+9eolDX9DJ LsUE7X795lW2c78di8KLZ48HI78Mxn8Cae3NKxOhQvEikjNvdfvkk0/YylksO3Z7 cxAnppnUdx98CXWGCW7YuYiZpq3la5hm6oOJf+snb3Mr1tHytW99m++Fw1U//HMM u68rr7/xFcaAe+Wv2B7evGNvWQ0dl2DSDqMq40n2AzvWlKMfvI20ZDxO49+HcZ48 NwEjvR6dOW6cOnaSE/XHynrSnmeX4ycwV5fJ+7mD3LCCmtKVy5NIYLeU15EeKu38 faS3B155mUXcRi5ceIuFEvqNLzzLtz1T/uAPv1fOwSz+47/x22UA/eg//rPvl00s BNaiA3vjMgw6E/HzMGGa0/mYiwGmYVj27tzG5DNdPvzgEP14Xei9XoRJe+enh7Gk 8grS7T3oIZ9kQXO/PEta++1R1ByWM6i/SBsdPoTU/Z0Pyt/9+38r1A/OT5xj22uh HCROm703r2LejslwL0z0PQb+9w9xher27WET9w67AJdgRHbynXu70eQFDoNxqOJV 1Aa2jvFNXzoLc7e6fP2ZfdxUNFs+YhE9D2NzlQX0yfNnMK01Vb6LvtkqmOm3fvxh LKr27NqBHiS3yV08Q33vLs+gXjSHSsrEeczQoTf64q716MS+wwR0pPyT/+Y/KzsZ /w6ji7uAlOkVpNVeEPPJiZP09TtlBxOni9pj775XznPj05Yde8qJw0fYWTiOKg1b k32oDHzCKfvrF7i44jnmBi5KOY1EHeZ/2y7MiDHmehjkJlu0F06d4vDnBBYNtrIW eBFhAEwG29Fe0jJNHXjl8EoYqpXsmlwH3pXYZha33iynaSGGh9gl243EfxqG6RB6 mt/+1kv0TS2IoKLE2Kdd1T6+7WUr+QYZm6Zhbq8xuT/ge1SidJeFWD/Sq7vs2kwx 9l2aOIUU61YZXrslLGo4ya+AnjLMQRi2QvvY3ZpjLFDIsZ4F03UWENPXYUIGF2PX yZt/+rk69fq1i+WD+1c588DYwfg0B6N4kbFyNUyFuoLItZjcx7hABwaWCfUWu3tz lOngJib4ZVPlfRmxsd2o9nCT3Q3GQCwKbEbifJet9nUwa+ouXsJ84qnz3Mw1twqd RtZTjJELLHJG2U15bi+7VzB6kxMwvvS1zavZdZpFkon98lUwTJ7H8ACRVn3cQRxA GHR50gsQMI0IHStXIuSBgTlH/9rNId8x5vLx1WNcOrMpGK1JFhOT7G5egHFaRCC0 nr/bjP8bYIQ9lKla3g4ubAgTlvQjw1TnWsm4xzALg4foes4rX9H5h3EaoQ0eoIe7 GiYQomhbeAsYp+UIgzSVpoKflwxsZhf1Nvqw98EJ38Y2cz9qbejwopt5hW9Z290P 6BceflZ4g3wkDje7Pe7C+T6JlsNkeXBMHgz2Aok20m5oc672xjBTTiExVtClZQFp 5fNFGAMsbSfDbN+7JVNK/Y2bCRI1VaO0DnCXsWOcrXOtLd25aT/loiUk5YPwSSH8 gqeaRFgkIz2MOsMgzLK7YdPMRdpU9RyEB8ceUEYPkg/BVIpfneDbNzlPhKTa3Wov 99Dc2ErmnHnUf5SIzoJHm+7e1KnVG2Y/JPssD6n/O6gMaP4Npgq/1g2w4EC7DtIg WjNQfcO+2L8MNTv4sEWEiKGHDbztqVrnIjjdJVfNYC3f+0kW4//bud8tf/db3yxf e2lP+dsbR7Aqcxz6ucqX3fU5bEiPcvnAtnUrY46yrm/z7a1gjtwMv/d3vvoGsIvl n/y/v8O3/ydQ21e+9sxzZZzD4ZEn9fzIQ3eKgU1mbXhovPzN3/ovMS69n4+FU19U GmsaBi0kXUyWI1SgK5KbmL3SWK+MnyfMFziwodmMtI/JCgkFaQ8vqaeykvihRba5 GYyhFGZPXVPtV96hslELGMZGJwPJBqSTMqV2OCdgpasuB2SMndgVw3swxxWM0pQ5 pKUjDBAWDELRHYGDtyEQ99vga/v4eKhgbbYNjqDWQIfxlqIV5HWT+62nmPw2o2Su uRSVlacYNNyykTF35T5J2ABM50pWjNOsXN3WtnLdGvdAgR+ItzhYf6M0HnLg0MHd AgOkovYAH8ZaGCP1U+GxYdK3hpmjuzTkrq3oID3g9qtR7pZmUPdWpM2ulNdyQIZB fBWre685O3PhAjpAMHPU4QTXQ3qd4zq2bz56h5O/1Nsgp0AnkELdg3nX5MVFVrIM segOIhmFaXjv44sMMhthJplIJs9yoAPJ3FoOu5w5SwefD7ub14/f4LaljRxAgAGl wy9j0jl4EEaaj/j4qSswUV+CQcXo+ASnj1ENOA9jf+LsObapMZq+DxuufMQrliPd eG4/iu/TnMA+gyTtSyEdvATDcXD/HsYO7B4iSfgO9lv37dlV5m+cL/2olTy3mwND u/eHTUrb6QqMiXqvI+iA3WU08TDAKtrVVdeakfE4gb9/0w4MzLNtR/m8rm8XJxb7 kVwNI0G7jUqIt1OtYut5FZLW5SxGNIPl/cyXGfTfPnum/CnM7nXSj1HHcbMLH+e2 NRwCozx2uQmklN8/drR8/yR6nEz0qzFfo2kyFxkTH33ASd3R8vWXYPBZ/buKdVtL adA1JlWv2vXeem0JL3MFDSPnhQior5V7HMoYGOV0/Pa1SGa3MMDJ+N+C+drGAIO0 fvYKH/Y6dMh3s+BBjwnm/eArr8SlGGcvHkfSNxZSJlVNzl6eKl97/evB4MmkrWa7 auuefSEZOH/6jJsiGH3G0DwqGycxP7R5L9YAot3P0MZzbG0+G4PbOzBWiwzK+zmc 5Ar47NmzZXJ+hOtjtzLx3mehc7EMYK90fNPWkH6/deJK+ccvvRoSgsNI9P7gx5xW J74fXVEN6X94bDJ0ML1y9sgH72OuihOle/cgRcaI/TH0B8cxyTIKA3vhMn1mhNu2 XgkJplvj95CObNm0Lba4Pj4MY7ZhJ/U1Xr7//bewLuDFBwcwOM+BmqOn+dYWuGVt P/WKRI/LCLbzXXwLu6UzDLwTl+6UL7/+ekxAR44cKyewp/TCS19CwrIQJrouIdHe OrKKBRWHnpCGajljm4wyOoL/zztaP3gBO6ur8Z8qqFiWbx04wGUZI+UQ27czI+uR wm7j4oCrSOfOllXU6U7azx0Mty2/+sbrXBc7XL7/8ZGyAIOzbCUHs1iAnmLxFid7 YcqvX0dliH7y9a98hc9iEDuqH5VxxoZ9+7hJjENY59jOXU19D2L26cjRU7GIteyD SNvPn57g++AyEqTA7mSdpL0WxzD0zvbtWSSWPz10GjWA5zD/xTcCk/juSUyK7d/H gu8+V/QiuUYN4DWuZHQSPMMW7NDaTRy8ey70bJW4/hf/1T9Agv5KuXD0SHkXKevB b7yGVHUPh3awaIDkbXh8HepNWLY4chqp1o3y5W//GpPSA64O/ji2szeNb0R14VyZ RDVlzyscvGRB+tH777MQOlKucu33bQQbXvSykm/n5sWb5Z3D4GWSdGy8fO4cuxFc h8sikU3ncgIb0YgGkchykAwJ402Yz+30Sw+73mCXbdeOTWypX47DVR4qmWQhO7hx S6g5eL3rCuqFc/z0f2w/Mn6ND9+hr1wuG7nQZJYFYNx+iGDELXglXrfR01Na6gUG w7TbEOlHUDfSpBx3CpW1Ow9gbnAnUjzsbDKer6ePDDHpn4MuhRUygVv37KU/c9j1 6FF0qs/EbXurt+5hy1pzkTCpLAb6Ydqx2hmqR0qulMp6sck12mN4A7fzcXXq4p0p 7MSia4pO6RALKC1m3EJgMsw3M8RkspFxYgfMI1t8XAtLbTEnTlH+ERY3SpBl7r2R bAFzdtr/xOgQG3ikZQxdxTzm4TZvh3MuvEP/vET9DMKEaKKrH73aGeq4D6Pv4zLU hA8xPt1nkXqfPjiP8vQCC/VB5pThPm6uQkq8EQsFG2AW4RTQE8UeLioMAzBDm6mL k7TpChb0Y+Rlmnmk07Oo9C1HYKDq1h36phYVZBhdcHt1q4fBguniV33LFUi5veRm mEOcHuScZVEwhOqcFhAuTnLgizpwnF2+XEGaabDJGnzJIoefFX6xjY7AaoTveP0G pPK0t3q1k+y6ypgiuGYuQHCFCSf5DYVto9TFAEzlFJJrGftF5v4bMKSrYRgHkQYP UydedXoNPigPRXE4jXzjgBUM8SDCimkOqs6yyFFv9MEwiw0YVK/6vkhbn2MM34y6 0VpocvHkbonb/XwaPOi70g9lWL0d9D48xDTj9qySYGrZHYLbdzjURj0Ow1DJUHvR hNaRlNSqiocGBQwmptxWIgFHmGMdzBEvsPaR5V3dffNMgFuLtnmoQyCMUT+2H/8A fE9YJ4C/kgdUVSFUNCmTc4xneTzTcInd6h8c/RC75etRodpRNt+aQ1BwgTmQsXYz F01Ql9PoY32A0GwNDKzSfT57hDLuuIyVv4Mu/gyM/n//R79PGyPpheF+8/nnyfMz JK2uKFcyKL/85VfjUMcKVj55gg9iKbCn6jTIrkhZ3T6VdlWA9hT9VTh+JbIrBrmt gZXCqpXorPFh3ESvS/n2RhTkxwnTSK+n/LwlQxWAaTq/4va4bMBVBPbfVF5Wlks2 NI5MqweouM6U1VaYk6IDaL5oM6u/OQcQBlOlvUpf/fMWKvX/NHHldZr0TzohXAP4 Qo+M/O0IfLZBv3fe3mQFrA7HGjq2TPAAq5q7hO2C4fOgjB3GQd0ViXTcZzV7HT0c T9mpG7KZLcuTKBxPIX3cyRa55iPWwJCvpJOeZut9CmZuC5LlGwyWY3y4N1jNqnKx jyvybtNYR88w2R/cS4dCBYOy7seAt1LrsxdvhFkdeC5WPkhod2K2iFXKbaSkryDt uQdtP4Fx+NKe9TDIQ+Xf/ugEgyB3/kLPX7z3Xujmrn5hdUxaHpDbtXszzCCmfThJ vIkB6RyMnteC7oexVMJ06PBJVpx0NE7mf3zieDnPAY2NKFlPoHd5GRNeL8LcXISh +oBJ6+995ysc2hpj4jnJlgSLAZjsYxPoZLE689rPq0g+lEprnuUqA66D0lfRa1zD wYBTH5xlEj1VZqdQY0ABe3xwDMsCfGAMjMtZxQ3QyV0ia7/wNgP6JFvM3hc9xiT/ zI5tGJ+HuUE6Nw8tWqq4w2r/KjBHry+UZ5GK7ERypLkxtzc8SaqJr3fQW/y9Dz8q fwTzNEI7c+47FjJjM9www6n+lTBt6mi/B0P/J8dPl1MYo97YN14OrOf6TvRs7rDY +H0GmrXvHy7r2Oo4yAEaRfkjmA/ayNaxOq4OtjOYQ9KM2ANW3UNI78bZClEidoa6 XGBS/8o2VDLYiruG5NG7xrVrd4JDC+cvXg/LDczr5UMm7Hkmj+UwqneQJJ6d4qQu C6BbDOCTbHc/8+ze8vzBg0in6DuYDNqO4vtaFh4X2M7+iP74HFuo7COUD7AAcWry Pgeb9nJwaqb85cS18s0Du6hraKD/HkE68Qo2SecGYC5OXwxpgzqi91i1//j9I7Fb 8dorz/OlsA1K3fzKm5wWZxHww7fe5XDS6bKNOti2fSeSt3Pl4yPHYSwxXcahuzMn T5SPOVT4Dbas1TE7i8qKJ4k3oUbwMdYOrpw7wY4BJrk46X7q5MnY7t5/4Nm40e5t tusvs/33K2++gGT+avmdDw8j2X0ehmFDOXbmHNu+V2D4XuCbZxBEQqlu77e/8Srm yGYwN3a0rN26FYkmagEwhxMwKd/BksBy1C+8bvA4eb35+iuoLgyjjnM0tvNe5Xvx 6s+Pj50ozxzgQBsMwSR6tuf4LlxwabnkGHGHsW+5mYWBh02OHP2knJy8Vr71zJ7Y qvVmMjoJOr3oh09gyQL96O/81rfjYMa7WCE4Qdt+Ayn8FG1zCT2/DRvXodc9XjTX dYUFz6+y/e0taj/4wXtcF9yHybvtcZL6bfQzt8Go9THhv3XoBHZZL2M3eWNIut57 78MyQf/fCcOuJPQw6jdrtqwpX0KVwQMjh46gN49NZ3Wjj9Cfj1y6ysUAu1gYcUCU nZFr3LW+c+/usH998dQJFniryt/4lddZAGPe668OlQv05e8ybg/x/S7wrWn+aASV EW/n+gj1mtf5ljWddOrIEQ6ALi979uxG8jRT3jp1iotHuAmO8eUYTPfpY4dY2Gzg kA23QDF2jwxyQQA7QlOMaQvMA2tgnu4heT564Tr9CAndVhgMxpDrTNSaMFzD4u3C 3Uv0K3T/ETB4454mDUcZH+54sAQm18tfrrMAfHn/jqhzbZYuh2G6i4rDBO12Gusu 3sZ3jAXBYeCeU1rIBK71iEnmF45al3IONbU5OAbmEm4vYLJI6Vbh1DynXcvLSKs3 0l9vMpYtZ84agO6zZ0/HddvXmbc+uMWYD0O3gg/4MjuJFy9SFpi5fTCKmu5RoDJE VpMwcUo7uZGbelgOs8dYibT3Mv13P3PZ1OWzSGSXlUOTi+WH57EagqBgu7uWzFvT MhbMfc5VSvU0laRtzDUc/pmAUZ+lLoaZE28z1xl/n/F3DOkou/cciIWRZE5fy1h1 BwnpMO3p2RRP3l+DoV7g+x5hvtLCzk0Yx0WYLu2/TiG5VwoYtkYRKp2jz91GbWME 6w07NkMXgi2vKKY5Y25U31/7y5pd1IqAeqOqqLl7KgPsxTzz8gjQRc/iNja2mmHe 3I26Cr0DlDHssyOLuk37TJHWSxJm2InyWtfVV7EmcwWpM3RP4r+C8EImC/6I38K4 dj3Gho3shqpTaxq6Stk9tJY6Qf0HJtOD2VoKkjZ3XhEtcvZW+90PEFYxR6M6AHcI q4/gzUUG9S39CvC8KvYm843b7dpv91C3u46hFgkMMsxQGfCg0wx0ab9+Ocyw86LX tm6D6fWChKuxYELqyDw5A375FfkcLVZoXlOGReHbXdr7Ct/uFerGmxo97H2HHbwy oFQWNTXq5zbpxB1nLaj/oJV6deGwmnMdd9gNuAeDb1trE99r52FhWBwi12S88cbS C7fSOoP80zyWhgZQHxmhTuag5z560g8Yk5WwDnK9r7TFuQ8EhzLYw4Pj3GR1rfxf 939Y/t7X38SE1TNl0+U12OJWj32ea1nZSWNOXByYQZ91FxdWrYO/kWlVvW4BU1lr yt9jB5YeUv6HP/p3SFy5cOnA8+XVr77JzPOEhzaIU5D7htfEikRDtnL0Sivl7lUE 1pandujWsqJbSUHUJojrWMkOnqMsm71U5q+f4VQWpLD1MYe0UpMQgwyeTjJD2Odc Bt5VSC9lJm3IZXDdbu17FaZ7rv345+lEKjp70MUVsbTNs0qdRXLlISO0V5l4OTQE Tep8DiDxVHdPUbanPj3NN+NHwscrw80oBw6YZHDO8iH1y9Ay+d67xeEiGL9FBnBF 9wuMpKojqNeygk4wPI/ZBiQo0uyWlgzSAlstXq3Kvjr3PaP4jsRwYRpG9dzpMsCA f2v4eDDcQw4sd9E9OXO+sEGMDtbhMnoN6wCsMKcRLyxzQOnfBOPGQambSC6Ju3OP CxUoz/CKLeXeefSf2ApcNb+uzDJwboLh5aQOE8PNsu3uxbJxjPvVr3LJwYmPkXq+ QD7oq078KXpeG8vdEwxsR94uLy2bL6sZ/G9fhOm5jTmsNdvL9PF3y+jlj9lq5Dak Qz8sy1ndjqw7WO6cR4fn2LFYOQ1cWFdWnDteXhtBL+gq+q/nJspWDklt5hTgAlcx vlROlzGYuvsnPirLJ06ydYRuGWkXoeHlIW5QmUSvko9y68yZsgx1hzn69ibaepBt 3ZvXkJSc/TEDzJ9wQQD2P8l/sB9d3nkmusW76PUycI2wrcDCYXiAU4eUVwnwFAws LcK2yEvcTHWdj4+t+QfX2fph1Txzrewc+7j8w+fYTkS3dTeK//Pz3Ipz4xTSpT62 sa7Qfw+XHas/LP/wVQYjRtjBQfRrWHgNL7BqX4ENXXTMbyNVmbn/YXlu7UflwBhb lTBzu7ZgNoYJavUCVhvWX+EELarliFouXD/LB8yg38eKnP62ZrWMNXrZTPKuGu89 QJrDwHB1klOjlGFSCefWvWUPUoVbSKtXsGW/FxWOoXnucmciW9enfu42pCwn+O5g BNjy2cA22DgS4r++ZgKpOjo+s1h4mKXtkcTtWsDG6q3L5bfWfUj7o0fHILNpxWR5 Zv9lzLco3ObmnsWJ8tLO+9w0hg4g/WrnDg7s4B7su8YKf4Kt7rtl1frLDHLYGB34 hC1qLhGgT1+lbw+vfBumFLuc9OebHETatAJ9snVMmrcnyikkazv5Bg+uwTzR/NXy yTluRprGjufoGzAZ3F527IPy3Dy37DB5D/BZD165UPZyYGKYu7JPHz5RFi6e5oad 19m6OlLuHv4EPbrZsmUW1ZwLLHrPflD2MTluZTFRps6WXx//oOxH1WfF3avl/uSR sgm9qy1I1supQ2UKxnMD3/XoJLrBH98oM0iZX+QA1Yor2Pc9fqKsu4OO7AZ2A6Zg gi4dKi8sTpW9LGgHry8rm69/yDjEPfCoDkyxlbyF/v2lPbtL3+3zMK0XyzZG9R1r dxT0AMr106fKzgc3yrZZTLqc+aD0nz1a9jI5jF3DpB99fe2NY2ULOyLLzrM9d+ZE eW3ljbJ7nlPmZ5D8n3mnbGdMGUaK+uAGdY9EfgRzRrf6PipTJzAlx6JsLUzDDbYL l0+8w8HKbWXLPXYikFTsmTlb9vZjj/fKGcqHCS7m13Ubni0P0HWbO/x+2cYYuGOa b4BF2d57J9Bdx3btHbb6JjjtPnGkfHkTdhux+XkS/e298xxyWMaVytfOsw2OxPHW NfK+VPowP9Z/5nTZyYJ/7DJVfgZTU7f+sjy3gcM3V/6cOudwC4eWXqSvD9BPVs9f KFtWnS7bl3Ho4ybbgDc+Ks+x9beORZunhEfXHEZl4CBmlz5k1+i9sm0MidLWlxmr 7tD+zAtnYFzmNpZZmIutc5eZvNDBxIzVt1f9oMw8h6rXCraz565yLzq3PzEpjl5G T5VDp9vXssxkHBrkENUoc8TdBWw6n2M8RSI4cxtZIrtMa5ftxMYjkz2SHxn5RfTD 1/Hdj7F7NDjDAZaRt8vBxavoU7LoYY6ZHdDuqIdzaMdtecjEyXgAyWgfkgJG/DK3 gR2TDfNl3/DRMsqZiVt9fLvkPXqVRe7Vw+XlZeDg/vhXl93B0AlCGa7JHF9zlgNo 3FS2Gokit0zBPTDoMB8NIJnkO1/G1osSsQ0LF8uqO2NllF2WwdFr6KRymPLOYXbp 9pUXx2+XbUjTtnqddz+2d+enYH5hHqjnsSt8Q7fQY2UBuwZp3OpF1JP66P8PkPAh JGLNWQZYEA1O3yqvDGGjlIsN5mGiV7N7uvoBVhhYcA09GC8jdwbLnvvsgM6hwsdc OoqO5sh9hEbsIq5CGj96E1vgLHD6Z5GSIrDZRF5heP4KB0fnN5ZVi9ggx/TUAxl7 pZN8sgqKBvje56c46X4b1bqbl8riBLtV19FrpY+7/avt7zH0cGVUVXkbu7qONiTP G5c5EwAemLYhGPcFFhjLmHeHoXkBZneEhd3s/VWcE0BYUbh0hbF9FdK6BXdjYS77 WRQNMIaPo0YzssD4znw5xgLHi3gGBtZQ9xwqZ7G+DAn3cs5PrGFrHbECdZr6s8vo Z273exOjO3YyeaMwpUqvNfu3CmHd0DXKRT4uqNaxaBimPebPM32xWGAawCoFFgRm EGIgjVxBPYYpLBiRRb5LpgasQaBqwfi1ZRqe476STw5D8bea+pf30OrOyLRCPbkc dVmp0yvMOzCaw/fZtocHkolWIDPEYkG1mEXyXAcOmd4FVGw0w7acsq2CsdW60/px dKGXT4VAzhOFs8zR9iP5Iw9beaPbgUE+fp5B+j7LSf5p5Qk78tDj7t4DDkk9YOwN uwMU1INqy2CI45AzeObYOb556zACOcTW27+EwI4y97MQvcTONzSspr09wDWLvvtR 1A7HWLSpYjND3XIekdsy15W/D+P6gAL/0z/9g7LjG5+UF37b80yeVvqUx5XUD36E PhsNsW4DnYSCyO/JUJrqNiuTe4jUPUW4ZjV6JaxwvOVF5WPaq/Rz9+2KyT9jgDjE SUVOUzLgaNJqnslLkxv9MBMeprIprAiaOKSKtDOPklU+bipe/Vj9GRbqF9EZ/Bj4 NOgMdCpo6kcE70UGVpqmjZToKqUMRWP8MtwS7j/QRmXbGCFgh/mMf6SVHu2/mYkK 01aR9uHUeVEPUusCIrDhPI3oLSbm621LMiuGK5b3Ng9XjoaprqCyM70hytxHowEe 9ahNPm9RsfwqIy/QiazncEcdIB0kXBjrNfOTBvR2qccFBnkMg1CHDKikNV87qeJ7 TZNJt1vTc7RfP1JH4Tw9SwGjE2oOw4/DrckH3PJDznzAtA244j5kOqP15aKhjzxd Kbqd4ApQvV4NelNkPgDLR9sjQbB8NEngNQ1ZRjstUF9hc8/SApOm0VgAsJp228rr 5GwTB7Lltgn1aDuoyiENSqzno64THrRRH36wDgAgALMtyB80GSQhKnCDBY9t6cKF eLIyN9u//ucXGP6HXT/yVSISBqoBMMq0rqCzPmxdk4IB6cIyApVAqlbjROfOgb0p Ghk8DnLWs4fxtEgxz7ZMHxOBqRapa4JIZ1+XBDBTV/Zj+/M8bmlUAd8oJ0+JMAf/ 2y81wWMfMQ/z5n8+djRoiprx2zCcSL8N+5wGsPHEllLAhZc48HjATL0l6z0u2qAf qvITV96S1mtiF9lXegBD1087q1KgAtEcC4jsR6xc2Ux9gC4pxmljkPQgArlFWklx 8KPk+F1Dpx58H1JlFwDuWbmz0gfD4Y6N+bDWYSCnf5KP/dhbYNzlcU/PgdfrMF2o PoDxWEBqra0/N77mmMykQXNw0beBtbzL2F50shSX34fdWPr7YGyWsf2qbVq/i378 A2xrWl4lMDQesNQjE5s7OX7fpvUbn1fiEPG0OeVFNAouxjjpZ8wjo6gL811E4uxu Th+LjIhj69krTb1GVMmKdeyY6xXVjkU5MfDNMAlpxkeLDJoQ8vZAx1S/+0Xrgj6j +hOyAcpzBxjrmMM3VLpmAC17jKF07KhH+onjsG3gZCeNkBxt5+1J5uWOEwMOdBBB m9j37QuEgpvC27Z8eP20j/lYz24Ru8Wc25DYnSZOdYioF8rvgR1NA7EPHzTa99Wz o8tZmaTLvmxfxceDxNL+Ag77fxhBh1bdjn3OAx4QDpocP8Dlt+U8EN+gbv75tph+ /2avfiJNEX9+e8abULwxhxDiN2Tf1a8gBIwxRjj+Zl1ANMnEL62yPqLySnHTUuUR 6ls4v20iwScu/kGIIMFsmDd/xqii4NgZsLSB8IEg3vFlAxuFAQcpiHd8tg7MJ8uh tR/T8V1Bd9Rb9Fnw04YSJw1SHYyHJbAR/eV/jEWmpP0NVYvTcd552jZ3UZBjO3Ug LUAp1NH05QPnMZDot0KSeugGUdBISMyTwFjjjtfS5Pjr3J7lIcYGI16ygkYROCby 2CeE1XqLY3WfcwV0xCgHnfbs0GulfiyPbdj6r+NlHEqKNs22881QR/nETh5mFfUB bZGv5bHf+Q1Yt9SRdBMXvAHhlt32cD6wvqXUb7nPMVkioC/5A3uS2TAeEGYZouWj /2W+ZklkJGv1a6aSZ5ytJ70hlLMfgUPirYEsqzgBCDzSGCnTGzFEiCjmQOME9DG8 pgu/cR00pDReP66axL4nlH+W16vWH7DbcfMMh5Gvb2FBxM47i7QRxqdLk/fYdTxf 3jiwtXx5916ygm9hrPP20eXsJn9y7mr5X//v3y3Dv/mt8j//0/8p2tH8H/vYSddx YGbBLf0oOIOhgyyckxPMMHoG3p/rlaf3kVRqAivuloX8OVYVd9nu3Dr9dtnz5TfL Om81mMVIPLKxfgbnwEOJZCUsbHQ7Suw/K8h/2UFs+Fp9EcUrKsZJNcmOiiLMydr0 jakOXJGmVZ8J/UuE0bFB7kBlW0V7OTgLxcAQqVrnItDwGMuzz+MHooOa3IKQpMGP RcmtHSC+s0wthvj4zZuaxG/jOgyKH4wEiUcmOQcO4/mj3t1Wd4J24modRLtwds74 Dv26cDtx2nG1oSbja1oHgHBHGYSLDKlDsTP8UCbT+PESwEcoW1TrEgqEa4OKcE6M 4nBw9YOEsEgvE+9HGmsh6ZQwS0h9mI+g1o1pLX3mb8cGX8Ba79nmURxgIj3voMeE 1gP/oueAUDt5yewa7gDhAAZENCipgfEDFSYWIcbFRx2oAw9B6eFtawgbbYFbfBJu WuGiZ4Bbu3rSIqBhDlaCJDNoGU1Y+1OUFhwEZT/RDYyFBGmA8qvP8goj/dHW5iEM 4fod0LpPprWviMrcAj+4k1zTkWmkE41YyBe/dRX+yNR+YM5G8SaJuGw1/daBNFqP li8rBVjcTii5SASzgy7pciAGnnhIg2mJ1qKPgNtMRCgNuI3zcYKy3k0rzS5o+YmF mR+nDIl5JVNm+UgP0+i/GKgrLtFLR9hsNJ2ThXjoY1F6/KaR5ihTtIHx0tT6Zx2Z pN/+RpztEf0I/MGwAOvk5OPkLbFO3vxQPL5T/jlhxCRlU7tKIkMlEsJkXREf7Wxd E0w+MVG6QIQ+FyIekLBMfufSS7F5oMl+gKd9t8H42g/MRzzE64x+j9/6sL0sQ6sL 0+snM5MErEx05AtFpo8Tu0Q65QYzy5ho/flf5hDodIOHoCiDk7UFcmyIOnZhSzbm K1QsiOyj1G3YtgxYaUi80uNaynEwyuiPuMSvm3/5jYo/6wFspBHGWicP6i/6p/kK E4kdG3SaXke2hf7EKpBP5mU+GWesYcZLgH/kgxfSeeEw75o8hByCmJrAaGMJj7Qm ADPh0YfxxTdLdO2KpuqESUOUXfy6yTvqVzTCxW9glmyYtYyPeoG6mMKiHyd9mae4 qJPARwmkBV+M3w1hxkZeOR4BR5kX6b8KaGI8NBXwgYl8oy7sSIEt8ensb/Np5Eq8 3yURgrYymTYYTn7Nx17mn3TZosZHfzKecHMxn+yB+G2PCAmktXQEmJ0vImNeDYwG Ci0sfz72WfERHuU1vIZFdKSzvIbTtwzkXVOHW3+kAaYbbruaLts0v3faKDBQvgYb CYCRLB/HJ9saZ5AhRvHwBH1iiKAsu+ENV5AIbHwrwhgZNeJv0qEr6j5+pVdaMgvD zSPSZeKAMq3/AIs/X5UiHIbq4zfK5K8CD8ZdbLBeY5e4b+6PypbhnVir4VbO88fR YZ5ise3FUgi/WPTcROXAA6pWghafkFxg4m9d+c9/47vlAgdtpcnFx6c/5Dm2GuPB bCU4cCru1kKANLGOjg7khGODaEdUe6dKYfg+2FZl8EdE7yC1Altxo9gaVDdRSVx2 9lo8ypiVBdJwxU+2jZWOt1ZD0mlrGMYgFEwJbgcrP5qABdi6S6gIEbxWbDpEkfUL fpGTOBqLVLEyisaGqsgrcUhJNCFhRJPAT8WHzhsOCh2ESgmPI0UgJ124M1pKg74o m5+kWDOPQEOkV9iaiUyeUTlA4aAho8x+MEo8eDTCK+Y2eUibE4FSSrezAibeSrJF Zp5RgHhnPCGmqfDSzRSX5aS8pALW8iWt8cFEIP7ARxsEnLiF9SXt+VHlhyctTEpR btJZ5754oppJJeNl4swxcRogzkAagFljEhf58LYvZltVOsRhJDDWksmizmv+5mCf 8ZrZ7EOtjOZV3VGeQFLzEV2WznfLLyYQIHIwNUbM1hMfqslpB9NJiW8f69p/xufE IRx/THxmkbSKpfYlYU0b/1t/E5HJwJQE4cYRVUgE4UFjRKbf1olyR5wg4hUHb8pr WSJAcJHHIx5Bqz/qRcajtpVSLWGtaB7v/c46JadAqx8I21ZElkk/rpiSxB1UKf+x vN3+2fpvwgYy4oWvIWSQbsthWsoXdSsWJV8iF5ZhTmc0iE6lb5bXJJbPtIkpaaSv GulfxGVZoy0jF9OY3vzNxVoNVLjt5+CS3KBJn0HAySCF27zEnd9EkkW7ZiRvsSot NMCKlR7zSRplxlzARoIAsnDCglK6TGsA/6NO6+RnfIw/UkbZsg9HLdWyiIR+G+1k +9lWEpH1I8vfh4Q16SWHYE6oy6hI0kbeFty8s2akgWSB17BgmAI/OCWbMGS/kdaS Cuqf4fwPj+jcxbBMxhloVNZfhsgIkIrasp5re0adWR5iQGLZg/ZADIb4dZFR4QOG PIjKWsn+JFzmYlytLwKyPeNLCJrMP+e2pEUSI6W0gTSpjhCjzCRoirJEnuGKMMd6 2whP0u5KJhKYP//AaYmSSUmarL+A4hVfUZDRaLG+zZBIfqOewBFNCHRSl3iCmYu2 F9RcfEwrVunxnX9BQwBE7WYWEZcQpswn+7eppCGqJHCaZ44Vnb4ZCYCX1Jp79EES Jy0C2GY8jCumE5WHayNImk1MYPRl6A0fYbZtfseWmHTWYxaFKk+42NXLWNJJXT6N b4ni13TRZ5NQIJO+KKnxZpXAlWkNMoMG8SZ0zV/YICRjhMyaT+KyixJmGWqbiF+4 6JO0jWOfDZA17chR2xOohE34LHDmYEjWlX6e9gryGgXWY8JliNlEgIF4xN7TvlFr NSzgsLjAGYIHM1zPzS7JFDtn/Rzg3FRQtcQqx5qV2AJfNoq+8b3yPW7Be377+vIc pvGWsyOj7rPCv5ewBvLSvmdCJeXJTCuk3GcLymu83HLxmrP7KMouUIPZ6fPmBwm+ hv6JdwF7CszVzCbsfg6PbCkjl9ciYUVlYJp7Y9G9W1y8SeeQ8aW5Q0ph7UQNRcVE J7LQFLZb0YD4WD+1wYTLVBEc7laPEdISAxS4rNx4arqGhzDx+AjRaRTwxycqXHQm IaKLBpzUZYe0IxmXTyd90E8E/xN/dn2ZmfzoHZSMk0BTZcpuqaxjP9yU5DQsllGc ril1x4dnkExB5FQHWoAcyO1KDtjiigSkDYIjW5Hlg7yGeEvsP4ESTJxRr4bl/0zQ khIWTl6WgKx4Ek9MFITHtpXBflgi0cmf6exL6bZHCZuDUZsKDEy8UeNAAJOZEA5t fsQgiHohToFHw62jlUWm2iewNzpkWs0g/jIf0zg5Bx4RB36hHBTCi8ucE968fJwo My/kBxFoTkDlf8rt06CzrW0f/2X3itLUtBUOmnU5bJpfSoaS4swjUkce2UjWhdCk gvaAxC/+xGF/Ek/2HdPEgCdlZhDlwgFQ+tMduURdiEd8AmeJInP7XmQSSEQU+Wcp ggoCWv/ESYRxxljCrA0C8EUoeWX5DMu+FOmlgSekFjV1BFRszS2+BQa6pKZiF2Gt k8RC+7RMGtlEZLnJVTcI9YshGIjsPV08AWM9C+k7y5NdreYeeWQdxKQCTOISq8gz Tme2sqVIl1gNDwg7n2MmTycfYgyOEPKJ3KMf9tYR+dR6C9CAJkUgj+wJaTHisvcY 6QLTcP0yA9Yp4YTZs4XI75BcKy5DI0m+9AkEJG0YMOCSzqygjCPcjeMgIcqQ5Qhc BMqQZP0K5JPSNMsq5kCLo+OrAVmGikvAoCbbSJ9BMXYEhpoDgZIetEYFRcKah7h4 wB+jqp4OTMIhpql0QKVILGc0kETleJxI8BpnsD/8+tfmNrH510b+9FEiuywxwb8q 1SQP69Iaso79LvwnI6o7xoHABYT0mB+PP7U0hNdvt4ZnPbZvFUT8j7qUviSSNAkc 4TWd+WfpBUyKs35ITwL/ol5r7tIXiyCAc0EBXCaF7mwP6ZTuJF2khvjnD5URhFhL jmtS3r4bKKNc2Xdq36s0WQbLrvaOGSZu3JGPBcsmc1z0O42uHJw9NFktvGI3IOCC wiTLhDzCi1rckdayVJITu/kTELTzY7x+nqj7BoxPxI33CHIDKFsuwWr+HdhAQy2Q vX+iMA7Pkjwi3n5S85bWBA546WzwQWeSF87WnYUJONK2cSBosp2Jy/IzbmBNwmVp 7Hpgo/c6tmz/+JN3yndf/ptcn/0K5xmOc+j8NJYVsODEOY7bnIeYX7aOvjSICT4O vKMitQydZg+rr+a8hzspT2ZaoUKbj7cxvbBqJWoAKCurz+dhKQ38xxYcOl7L0Ktc haLzpo3orYLS028rOdWGcQYWw5QYMyV9/Z4KU49KvTJ+lbhamxbR3hCFzUrMComi W3vWgK8ErUmEt+P70VbIhNJjOL4Ezdh4R1y8AmXzCpcMpElJR0Ss1oloHyrBhNm4 4AaAbLv0Z5bZW403Msol5vr4UeA0bbrybaLIo8HV2Migk7+RpuapKIPV022wcPyT 7hYkoygZ0RlbYMBlmpY7PtLgq+jTL7Yso3FZz+QReYkkPktBlzwR2vCYPwOLQ2pS JRH5pwTH+ky/OYEyKjhDjGmwTJ2dQayhDjQQY02aWBolLsph2+gKpJnCdzAhtEEb joOqTJ44pCfSgM9w/T6BKHLQkwNWDRM+cxC+1X8ibeENjVRF3hkd6TqDIr7Iwb4j 7pq45Zo0kH0NlzadyTyahoCgKcsecYJLU/zWBOZDpKGd9m7AogA28yBnAIWJPyNq fMAkkBlkIn6DFryi88+n06+jv3RKE+mifqPNyCeQJmY9lqLzBKH43d4MpInfcqSE QDqznAJYpyYRSzwmygz4qWEEdRdUGd2JAb7FxcQoEnCaNPq3+BoeaTW/gOHVJjf9 UGCzBPnhk27DktaGwlBLlmNGpov2MZ/MUUfFIx30QRJbJN1Jd75NYhn1Ba0mrI9x Ge9U3jw6Mq2ucEp0OJe0QiQOBocC9dajEcFPZ7LMpGIID+FiSmx8AR3CiIhKMIZy SZ24SdtQdSgTtIMzxzXT+s8qNy7jsz50d+s9MVpfgR1HwEbegbSmNpTRxo+Ux7q1 AZOiSpUgIM6JO/MKGgkXLvQpo/5auxghgSb0CWhwJ75AlxGAJUzml/knI2FIzhG5 W9FJUNGRzv/i5M9LE4L0yCpxZotLk2VvbwECKBAGc6iLMTt37XAG6gZDWpyO6NlW tYyRRYOp1BsmEQTX6oicIp1IpDOITAYxMAV4xRn1E8RYNMDFH65u2SLIMBrMhZow tZ57wCOVaXMBhksw/nrr2ZwMzBwso672ABnSAvwR3KDAQX4Nj9ARwyshfPt0IXRl 3WWY7oQFzHSWKeB7MBhmXEBmfDc28ekPSmqdpl9Yn25eOKP+MjzjfCdNQubT/J0Q IrIvBHDiMEzwTiLyMX8DIkKKZFrx2Kc4YqsxSGxslkOf/ICzUNxu9fKrXP2LKc/r nkm4W17nZsPxlS9j/elB+YtDZzH7eRYLISPllb17ubwB2/cwvJsh5MlMK9lqimp0 1KtPkapy0EK7ZuogXIcxvYdkVSPv3mG8FttcEsgnEzDaY/VGjVWc3FN7RV1WmdZF DjVg0Zi/WF9n+XjHBFsLCyCMkuhqI+u2LiLemvKhknoDgLX+YrDxt2IWrjkbuPUY sGIxDwKMczxNJq96wp+wiaOHCBIELDA+QanfT/W1PDsfEAHB8AIRg34lwKa1WHoD B57U6wGeidpSVdDA3HJoJbQs8QAkXv2kzLBwm9o4cgoY4zMswhtswBjXfUBnaDAC LSJTCiW1+MTr7yNPZB5wEWUFpyMyyXKZznBwxGRBC0BktqHpLUlCZj4VXDydyS8x qE8aNZlEZ6Bw0bY1Tr/4ghTDfDJ/f5KxBQvuKF3AJUTAGp4VnHiEsvzROUXMkm1+ AABAAElEQVQVCTNtxR5SNWhSKhI8TaUvS87bJKarT4QHDGGBL2FakPFUUIXOdKEf aH4Baphl7IURV9ROwEQ/iXJ30Vgb2Ve7/bTGBo0dt5nUtNlmeFtWOoIk8+um0J1t WhvNRWo8wjd87Zegh9L24mrlsjQNLqoJfGKIh/Q2U2I0c0MzVqffbUzSnSwNzXjf EVyDYrLDbTtLavYdgAIpAcZFGt7BvRmX4bXGA19bYEcfE6TmZ2Lzy3A9YjO/3onY +hInfS2ICJDI2LStHhKT30ziCKjaN4VrwX5T4QkwWx6H7hpsiHR08Zo4gjo47PMR z0BtFtl3Ei7zF0sibL8Zy9tyEBXtEIHmDz7CakkzNGiSTWr9xXpyES1en4yRfv+k J13kaFp95iNkSwMqYXnFn2kCm6+Ikw7+pDFSEg9Mg4tf/TSYEImqufUTmagjTnem NQMTGsLDbzJHiaNiIEK4BDP/oLvSHoKIgJBGxpPgnhu0v9KdGKL8iQocYLdMQW+W K6OEr0AmB6KSH7jCIz5Aog4CQjgewk1qeMOAs/M0OjoBQAkX9Ro48dXMsm0yddAI XOCUbly+DRCuQQXe8PhK3Nl5ImXQl8kaRoMqbODpSWcMXlMGJj3+N0AwH+MDNa9G t+la3oD0gpsg/DV9pTBQNchu3XUoA3WW115vfC6QajJ/GqGVuJansO3p1pK0xn8T JqX4Azb6uClaCRLQMiYqHbpMkLSk3xw7wekUJEubIITqj8VSiLQ5vMthVflAzyOs 619d/o9//a/LDayc/KNf+XXME363nD98tHyCCcoVI5izxBTk4UtnsH/dhzWaFzAF 56HwHAPM/clMKxAa8Necwh3MOI1jJWAVhrJvYQtvEhM93oqlDdWb3LowMI05B/xj 2LnyJP2Fa5gpwlbeqjgoRKmYqFJnkUqKScuGslJ8uo0mUXbsfLLotk83pEbxExXc IvTzr1trYvJJgIYzQmtUfgTSAxhhwSgzE0ejGxYdQxw1L+sNuJocT+Ju/vabA14m 77Q7oNIbiS0/fgcSh91OcQ2EswkGU9SBkLoRFq+MWqMtlweEMbklnO6AChgn5dQZ zcY2ueUUwm7a3pYx6Io20U1cJToHkyAicLa0jQEObF2kZsEDfKCvrUsivYmlog4K CJF0kfqEyCQrOJm4RqUwtlEXkfUruZJqDeZ/6815p+EQaSJv/UfGQDqyRiIlEAQK 5g8IssyZ1vozrWl84rfBIpLJSYc39KQ74YI1E44n8Is3PRmCx+KYZ6vvaIN4EUbh avIod5azpiFZozxoFq/4IoUx5tVSR5QQPBkWaa2oIMBwoU3j4iTdERcEd5KFI4OA acSDRmm6tyQ1mswl8eEIt6mIj+z5toLWiIqyJV32ZinhH3A9pSckEkYCB/IGn99Y pagLUgsMniijyYi0EaUqwiynLZT1lNUADIT5L56Gj0jD9MYbIiMKsGwqfPwPt2HA Jz7hE1vWlXENdaYJZjg6SoabsOVUUzIeWSuG+1QE/Hby6FRmi6v0B3xNE3hJ3UAM jrJWoIgwklxx601QqdCV+ce7jhHCtjrVGbWZiWragIi05pJ4xASW/PgMjnQmiHDj IpSXuMwicCbijBPSdPmbNAlLKMDZ5EAGsC/DaW9cRkYbJKJO++ViyrIHNGiy9g0w r0iDI7A5gOByjPAbbUUJBl6aKlzWjZkCbcLIk0iT+8draXAE1rxxk2nSY80h8Ilo FzGJKsb+qJxATDwA/o9VsWnEL46ai3UToeZdyQmX4UlNoAMmg62DjItCGZxZRWjk Z7rMtkUZEhhMnYua7gfjt5vYG94Ap22SgmyHxGn9VcoTJxWQeWV455uKfCohYidR 5MHLNm8C0lZvCUD+UVjhpdM8kybzbAXNOoyAfEUkr0pL1I9hkWGDq2UTzKCo/3CQ T5bBtvQvMxaOcOGTEPy1V3XwBqZMA6xMbEqNc5Q0tlOHZsWTNQ2CqMf4Ois9Fal5 gSvybikgKr6ThKx1JFgKzgyOamsFThSZGnxZh+CMcL/QxteovoHKHPbm/fj9N8/l Pes27y4fcBnL74/+VZl+/uXgJSemrpRF7Drv5nKa38IknhcdzHIj2jmuL9+IasBa BbdgezLTShnvckvPHZhSjawvoxKU/l3FmsA1pKibMXCssfwZr9fjalGvMh3AlqI3 SXlLyRg2zZbPYhInsiI7SmRFxeDob7SgFWPZ7UCSxINfV3RRHfgDxLDqxxlALYne hIlUGdkSGVmfiLX2IwNfvU/FUJEm3cQ3MH7D6avhxq0zOqKxOAKmom3uQNmIjcBG ZwV8zE9++EtpMml+UKTH01bKLVw0HcwEdtyBpuFKqCQ8EtSXWHRmqobboG6pKkwX c6ARxseUOahUHA3cyKioHpoM66SWWAEqjeDx6dYrMQ0XIM0ZtEYSQ+xT/BqfP4mj QgsW/S/eEYWrYvLHvw5uPDWq/YbXbyAd5lYz6g5xmaTCZIaZEYnMu/MIqDfyM6bF dTAkbhO0KN2RpwHARdoIDG/GZvocYFqI8AIb558DZcI1CKMdBqM+alSH4i6o4LQJ AT1hvf4IBneWFZ9Zi9WIDhktPJBlfMDpBBbi9YrF/yYMt06TZgPo4xHGQAb7gM2h txOVgRWf4JWWSBoJkq7AE6nwm1tS0MiqyBNbTRZ9E3dA1zEl+6v5SGfFJ4T+8OqO nhNAnXYPnMbp8K+WORL5yriAb3gjmHBiuw+UJzhBxFQiuvnnhB7wBAYqXokF+B7a Aq+vWt8d2ppf/PwPHF0CugFGB2xCRB5L4DO9ddbT4l2cUZmmTeo6+UA3KYOu/K1Z BroICRwB1aGV1DUqSK3IOmXqjQMgFnBdVF2apCXqrdJgxdZHZ/qs14fy6wEKGF6d 8ohTTy+ugBcP/Tkiu/FZXzWzSJfIO0xqehNfZNKoEkeLrLlTP/7rQRP+LpwJOux5 xlU0khtYKqogH3etmZ7MOplGnL7IL4K7cfbV9EEPjhbjb82iE0ZQBaiADSAiMq6l N1F+BokpcXdiicadDdDJJ5AHkV06Wha2f9S19OJuTHRAdtHi7dZEkFXj/Gm4osRR caYmtLqN90/YyA+fsLlbRyDu3qz0dEN0kVoE8XQhEz3+qJBM0akPcfSk6cC2nLpo lqCtWCI/afVptIebsMgu6otSYCfXK1sHYWT/4N0fltOXzpW/87Wvld/8zd/ADPfl chH/1NzdcpdLW+5gS3ph08qycw1Xf3PjmPifzLSS9SKmkkY09IfpAe1wLsNG52pu gJL/1sYfxiZRkB3GBiL2LNnyv3IjTV+Nj4xicBlbfBh6t7Jzy9taoRj+WIoooL8W rftEJXTC8Anfjf5U15NgHsbZkESa1lBBTxdLeBsgv0v8XbCE6Pg7jqRZL3+RRSvq Q4jCKwAOwe1EXZLwGNjzZMfIwFAXrHGZOj0hMehNF+5eCOB646snyGi0GN8hJN2J hncnHJwVLugmvJML4QGfJHU8S8OqL/A9nKCXRrD25LkUcc2g1p9xCVrTdNJZhqQu aDaZcR2CluZvcCdKWJ8KovwmurBBHWR4evLK4Pxgm7ui8KeHexBt/bAj08y5N+8e tCTMmN5sA1/Pa2lc4ovoKG/WQQecsMAPWERX/HoaDUtSGGhj+zinpuuhd4YuoYOg qLPMJOAdG4TshctDbQQKF/kAkegiTcL2BBja+yHoN10FET6dNSBLa6LMtzdz0wZY TdFDq1GPPBVlMgzE6g+6K2QP7goaQIIkGZWGSmEnuPqjb/WWBXegDARC+3Qxh6/X +9j8I1G8AnQJTEvcMsgGzlDc5qXH6PYrpgTInxZeUSxdIAHaUNc0Fsh/7Wmoe8PM L/xdsJ4+szR9D0jNzG8LGCI6eQfNSyCDAqs68je/LiFBWu5EEC8eOn5v6l638ULE jziyoTOkxhnq0/Jagqx6BE0skSjg4xX1ld6kN+NtncwKf2vTRJLAve8kMkMEDxfv VuYKG+Rb1gYTAc1T02ViUnTDxRO0B1GdbCrWll/HS12LpCLq4GvkVGZN8Ia3wiR9 pITAjruibVUQ4cBnkp6EOB2PfGprpUd/BYuA6u4Emca0DWMF7uTfcTR0AZw4e3C1 Juj0yZ5MdQaouCK/HgorjoY9fx8OBP7hoJ4EvXNWJ/8avyRdG1d7yiR8jzdSZVa+ +QMg1eKAC2TSUiEotHFDw1ykwXWta2ZGyztHj8eNnTu5ynzTju3cVnmd2/+ucWXt CJdXbOBmyhXwlbNlAJXUbaT9DKYVrharAaPceKUeqpPJCmyzegewxqK9fMD7eoc5 3bVpPTa2uP3pDldDqrfgNtAc5rHmNQzeU1kd52MDa+yT4gT5rPiWyeeFa/D/f/7+ ImjtwdHj/EKleiRdb0Cv+2GsLa79Phz/Wf4vku5h2If95PWYoKTg4YiH/Z9FZ0/8 k5L2xvW6e5I/4vxUuE+NeATFzxYAfrNoA9ESJL/gvL8Quk8lagmFv1xPL8G9bnPt 9X+a+0nUkaY32cOgnbjm6G2gFvZwol+Y/3EZ9IT1OB+bpfHS+zi4x4U9FklP4M+S pid5x/kkujpAOH7O/HqTd9iN3sCa12OCeqn44u7Pi/DT4B4KX8LASM1D8V+cwM9I 8ST8rf8/AeYJUUszroAPl29J+iWepcn1Gd1Ian5/P+/zGeg/L5qfH663IE8gqreu HgF7JACyIkFGxDeAX6m0V8oOI2ldwaUoi1wRv4rrrv/lX70VV5z/zde+Up558cUy fWGSa80nuVhmsVzmZrCzXL18d8/OsoUdtc9gWtULcQWD8XlvPkK39S4I7oPIm1sG ufbMW1q8LWUFV7Z5C9My7uK6i4msGSSveVWa5lJ8Hm7ex5UyIf+Dv/8DkBJZfM58 PifYL6+aPg8Bj4F5TNAjNH4emEcStYCfJfHPkqbl91m/j8P9ecMeh/txaSvcE6Ie h+nTw56A6JGoRwJ60D4prgfsEedD6R7yPgL+M0+ST0T8xMhHafglhDyJgk+N+9SI XwKBnxflk2iqcU8CeVw2XxT+cTi6YYmtd8J9Up96Yt5EPjG+ZroEZomnS9US1+eB WZKg6/k5knaR/DJcX5SwT4FfErzEk0T3BvW6e4v0aeG9MF/I3YOwx9lF8bjAx4W1 FD9rXEv/i/h9Eg3i743vdX9q3g0o+b5kWsWTO+9YTy0zCDy97XB89Uquvh0s/+Kd vwyh6N99mau/xzeUK1z/PTE5waUzpaziKmcv3JOQz2ZaVZzlYgFNXakFPMW99dem 7sUVixvWjPALCkaE+/e5j1cj1jCn3gDj/bpDZbQMcK9s53TzpxbwacTTGnhaA09r 4GkNPK2BpzXwtAae1sB/LDXgYlG2Vesp/A9ecQCd1lmsS92HEfVyqmHUT1eNDZeB W8vKv/3JO2Xh3mL59v5nypY9W8soB/tvTk6iUoCGaj87/jw9GifhX/KKzDiC94B7 db13fJA7uwdXcMOvfKpMLOoCKorPefMVKYfRUxBWtYBBCFP/1dNuqhD77+nztAae 1sDTGnhaA09r4GkNPK2BpzXwH3MNJL/XuD7YwOBe1QOWaR0cGigjCDZVLZ2L3fqF Mr5qddnIJQP/7F/9y/KHR35apgeHyvYdB7iwalO5cPZKuXD9djC/nyFpXSyzDx6U W6gELEdNYPXK5agArODe7XuwzhzFglOd4aDW7DSKtWS+DKZ2aHh5mbw6U6YuXi1r FqfKqId6g91u5P/H3FBPy/a0Bp7WwNMaeFoDT2vgaQ08rYGnNRCHtuRYccgBKjFd sWxZGR5aBq84xHV482WKSwOmZ+7DxC4Pm/8v7t9b/vn3/5Lbr1aW33jxS2XT7s1l z8JNDmRp7/+zTF6ZF4zpPEoFSHG5B3a23EfiuhwrAmbcj66rV4GtGOTqAHQU7t7w ulfusIeTvj2DxBWzV2WhXqcYrDYIf1lP44l/nnx+ETh+zvKFCB0c8vlPfiQWoB6a e5xPTlpjvyj850L6RYEaEaZ7YpkFfBxAT3gvrkbH45K0uMf9NhxfNN3jcD0c1nAb /oXx95TzIbwN7SMoiejEPRL5EJLP5e1g+1zQv3ygVkAK90XK14ohgY6qXyRxb9pI 7+tJzxfE/yRU/yHiILcV8fONQRDlMejPqv+K97Nx/iIK+VCdtwKJ+rPo/Hmz/0Xn 1fB9LrofKvfnLUvL43PVz6fl0ZBAKM6A+lw0fxqRn5ZPg/+s+Ab38O/Pmu5hPM0P Pvt/e3qcLeixv5LR+zwpXYN9Ekwvrl73krRLPL1Q2WAt5GfJp6Xt/FYkDZeMDYeo 0CAtYytXlzVlDKZ1JCStI9yeOnUbKSqwIytQKx3aUvo5qPV/vvU7ZXHgXvnt175e 9h54rQyMrwvsnyFp5XIB1ABGuKp1GJurD8h0nitcxzBxNcqVrv2YvFrOKLTIrVhT d9F1vXG3DEHVCJcQbBgZLPNXb5QH2HeNp7dhOwX7WRzJscdcQ/IlaFsF9aBtQdbZ EwfM2p5d8yxWch3jGhLze2jU64nqyfVxTjNo0JRB3EsIyvgM0k1ePUk6JnWMEA1x YQxfvw9+05ok0kVghkV0J77S0AtUYXsrqNme69AIvLg7/vBlwg4qUCd2+4SwkSKA OviAaIakOzRX2hoZD/8GltrQzRh4IvVtjiLwvxrVQtenh54IsQxJYAI0D3Rmf5I2 8HQK1BB92m8vskdhGiXi7pQZsNbsWUem+ww8IopEDSP+6kxcpA+YeIkwvVEu6yRD mtmf8D7xVZH3wnSCKq1RYY3u2p+zETqpbPNuf+kE/wyOTuY1bS0vPr/HoAIQ276b X6Wp1ltrUr3xjYvShDR49lNRByYdjzxBAa8GYV4+zZ8JqOsoc/oqSHhaV8sYqfZZ mjrj2jvxN1/+Cp/hDYPhrYUTpob01P0SmirQkvqQDuEjqW5whqfREJ4oWwOJXDvR pm0wQrQI3TwZ1eN4KD6AHvfqJHwkUgztO11St0S0VK0/RHwtcItLhPp6+8kj2SwJ WFqPpCWvzCPBzKJ3DOrmla6IX/LdLEG/1FNxR2EsQKd9umDd7xlgH9MEfj2tRXQ/ /ul8n4E+cXRpNk3253AZERWJgzy6/a+bd5ad6AQxWc9T4WpI1kX9XgwjTUBUMLOL EMMJy/5oUMZEtHREnGHV3QOSkOZhehGLLGF1ht+fz3pAYOpMw09FJa4M583/R8ee XsSZr7SIKLLH1dKLsxWtM9cHkIh78WT6h0OaP1qmljF+MtuIDrpxtT7SS0VN8hBl re4a9i/+G+XLyiExxEDEwPBo2TSyoaxBX3UI5nSgb125hW3/e3OzCECXAcWtWRvW lb33tperd+6WPzv6SXljx/PlhX3PwPRidvWzyLiPwuwCeq3ejPVg7j5uTn8hflWx Vr8fzgr0XIcGYVaH+mFi+3GvQDyLtJX4B/Nc46q49tGa/6ysnxAfTQNGqyRbNBoi 2rf6TV17QhuA20eeHYfPrvMl2Hmyek3WXJ32JoGwLV00sIA178wxAh59kajhNruG I9KGh8AOgsw54CsRCS+IARUw4gyxLQitsNHZmycikpxuni1/umvUjWnFCYKoi4qo pxQObJmtcdaBdVEBesAztoVnRMCauNHU8BLd4IM24pPGRNzQm842iycS1JpM4EqW +MUHQAc0sdciEqy/PpEWaApRwYnI+Hhn0gb9Kb8NKNN9ClAGB0jNqdZDpjYsy9dl mh7FVItKhKUwDWo5rU7EALIsH3GJOMKyPrKtIvegQ/wdh56lD1GBIhKIO/u9oZkq 68x+Z8Aj/dnADm2ZYkl/WZrbE32t3K2viccMk7SKu/kMND7+G5fx1kzHWR0Nr7iy VOAUPBD3pHuYuoo/UCYRAdHB1wMfWCqqRnHQR2LHqZ7kPak+zQmiwJX0Zp239kiy rfLsA4B26l93JUIEFcfSzA03cYODBpxZ5z1hnfTSSN6Rh/GtJLobTenOuEaVOC23 MN006Wp+cben4fb3CzwV3DzyZiFpZe4hi6x3KKgwLdeWQy9lj+QIUBeuxdaQGtdK atUkrm5emdocpSfromF55LeDz5iaRzR6xVKDMl3DR1yEmyeOKFzWwiP4a4BwmSbh k5EJ4pcmEW8nuOKMvGpE5GWS5uihqWLqfl81oP5k/wTeclJxvRSnu9FoAt0Jp43c Fh8xWZCE6aXDyPoIEm1kPpCaNFmGL/B08skKydSWO5AHffa8DJdefPXb6iQ10rBW XZG9NZA4k5rEoDtcgtdswk/6JckzUQe2ekkMXhMKH/VbbQt7EYtPD20NbwRH5C/o VWkP+nlZD96RNTy2sqxdtwrPQrmPTuv4+HhZfvdO6RtASLpiJMysKhydw2LVrZm7 5b0rR8rahb3lBWj+bKYVhN6ItWLFsriu0TuX57AmMDtHx4GB1VZrf98Q6gIryuY1 K6BhjtuybpSZOexwoUIwCAE2yWNr+Weul85UAIao7h5MkRt+YVpL+9vbzKbpTVfj rFEqtqZKnBGWTtP0fiwZ2ou3wXV/e3NZmqd5AecXJFAvmk6iABCogjR//galwObH b54Vp87A10H0mDwAsFML+jAsif2XsWYgEL7o68QEvC8DwsNvezJVr68LkR90F6Ib E/CN3MyAIAPSREb7+DtwAUP6+PAqHUEqL4MjbUDzctHEY1tmZCTr8UZ09yXcZz0V 1xPBKu21jqLcQV4QSMqWz0P10HBGdIMJykmR7dKbIvukiQgFvJXL/ITT32F0o756 U9fMOtlk60TfytSJV7DOaK8nMOuoj5ngDDw4wt2Q6vmiD2njf+tvvemzvaUxumQt Z+Rp+SxwDNKkqaREasKCrHhlXBIMfOd5Aq1EBWRUqAkaIkOdEOo3Ew3QQRgOIYTO FJmf7gwJxxNfsVBYAlExJar6TSaAn0aS0HpG5lSp72CJYiQa4IGtYI389DfKa0aR uvarrI1EG8C170Q/kQbStKxJF3ij/4nkcXgDeX21+N6wXnelp7Wz+KIs0ubFH5lx H/NV5mvamibQGB8JwteNy3Q1cElwjrOtTmWcRMEiMvoc6QzA3cVggH91/ImY7LGZ N1EPPVmDBNbGWFqFkaORYOWPyBwXa47VH2T0UPFQFh2vWZiytVNiaTTbm8mjtmtW Yk1KGYMhC6+0eNWQeCytNBkRIQER5Y+CJGWRQ6snPT6ZeeDQKdasu55InTyLGoH3 tyUKnwH1+9Zf8UVU9MeKL8jC3YnvOAJ06asRl6H6OtCBp6ctA2UnFsiladMvkDAV roGENxBkNUc7WgNENJggoXqiPBHwmNeSBJmePKOvyC4qQBSteUTqNmqRjv8pyBNH xj4mg88Z1EuH+ZvMvgFe9FhvYYVqhIP6fQhE76LPqhWqRcIfzDwo85hLFfw+B/wf wNTO83ts6kLZdv58+Tb+z2Ratb+qCSttryI8Df3WFZgosOx2XOtv9v5cmUeHdQjY ufn75dK1q2XFyMayYWy0DC1wexbM7S/moSi1LuLjAKlVmxWSHbZ6iBCWWAF88ObH lN58C1MHHwEbMgAzmbnYuFZ6MiCBqOILHA1/L9pH3A0oiY8BVfriaZ2n+gyWbp/6 YQthcL4zPAKECzSJKzDhjHJaKTU664d0GZSOTIibhwTZTao3fFnuQKI/s0iA3rQ1 pDGVCWbGlqHb7kE75Qk8FVer2/xsKqKKu006GdrNPJivnrrLCoDWqAvgyLYbLQ0+ LSfxGOZft1YdVDMH3/w1MHyPfzL94+MeFyrORJoUURvV/zjobphpfKgh4Dul6NDX pSMgxRkZ1FysE52tfQXqpBXvw09gicAgz8QRVBNFxfYiSPfj+3MkBFfS8nBOn+2X dtqIvxhnkqp459fZ8JJPZMVLcv1RutZ5staaN0HjnUGWqeNtOBt09zfzzDaI0ESU +cUHZ5vS30XhX8WZE3rFG99EJ7OE62bxiCvKkh9z5CNA0BF4cDdyRYk726wHP8GJ I1MGXRIWICb2T0+m8R2Tipe2N9zGVm9CEdCJzJCsG8N94kuPt/QJkd+m7lo/xC5N Ewl7Xo2unqAnOaNfNgBz9K87OQeV8TIK3J2y1cAl6Ruepb9Zt4bV8nUDyK0ijAJ3 Mqp1T1wLMp9O3kvxd30C1H4WebT6JGlGEW28T33rr3lo1Cce/c1dg3p/uswJgPzP Kkg8GWd/FgdhRvI/DVq2cVMybMVO6QE2geF+t2SeyZKOgHU+qEQZTXz2A97Ep7RX HD2ECxP5G8Zf/IAnwHjFt67Hx0jzTneOsQFYYwxPGiIFryVMv9HtaRUKLrtMvvzN 3U39tkKnTYyqZDSpfsKQOCq30VwzqLBJM2Ey4pFRZCY2AyuwPunmESbwdeMyIt9L U2X7JCpiKs2JW1zpamVIjPYBsZCNWWVlhv+Lvbr0WU/+879/96dnEGxeLXN3bsFb Yn2KW1X7OSe1GnWBRa5unbp1Df5SBrMffhPGdQFjAFNT5e7tmSDhiUyr2a7g+taV o8NxCGvq9mzckDWOAu0oOqsz2GZdhsVXJLrl1t1p7LdOlwf374WFgfHxlWVw8Q4Z KwyW4CC7pxki/y/waoWulRFGak3e89m0yu50UT8o46XA9PhohMRQ8WRM4HGF3mjF UTthds5AIjaSmTJLU2n6lIZtnVhc3cfULe8MjX6Is3WWLFMrWYPPHE0RqXml5NOV fsUjObVTZxi0tzqJjt6kQfUDCCDwRjESie/8QMxPeOvE0G4+QnQf69iHVObNE5NU hKY/wCP/iK44TZH/Ig2hmbyFkdZsoDFbrIULLU2WwUEDuIWkUYiaY6YVlKczGFay Ay3hWUfSrQesQUAF6mISxWOeTk6PicugrAdJSZxLy5G+T01MRJQmkpJXZAemaHTL 61/3yXbOdk11HONIFGUzvQ7+on900y1xRV6ZxLcUZn+qeAO4ArU48VWcxgSZPW29 BP8X8gSmmmNz90qu87v0HU8b9F2EQk+f/pZMgI5b+PyLFgC2Ykg08X7Mq6UP4JZG T0ZE36vlzsk8YzKnBlX7bC9THWka8ofztb2lMv8Zm5+z/qQ6+7DhhEQk4aDzu1jw ZANw3Ymn0Zr5mDZLQD54Ov1tSfu1NPlbEyRsoMn8KmGJ2Fylmy4aeqdmgj8/ODy6 fepPeh5+PzEyakS0PgnZcDpmWa4aKx36CLR6AipIsLRR4i7prTIDa33VdOGLeDHY joyHrRzxLXbzi+Boi8itFjelkXqEfFxWjeTIKxs66Y38pN+yWLbuE+46JnRwZmCF NEXS0U3V4wrYpCkx98D6DXWebrgqF5ki+3Mbi7LcmaAr5NFPJiS3trPO/UYNjlck iLigJV5ZQYHQaL/7Ot7ZN/1+SCtF2c4tjbDVbVqdwDsWJLTxPt24qFMRfcoTJBrv n1mHk1yDtlpvBGbdS03DLcJEnDTqS79YGvVRB5anrjayTylEMTNz6z6Jmxl5yffZ jTdJ5BHZSIfpGw78PR0kaRGQnCJd4tGdKcwtEPVk8LM7JdnslV/Ozs7wO8/FVPex TIUwlLocXjFU7g4sYrN1kDisVs3cq98XF1jxb3ERXlNGk+eJTGtAUArbpw9OWBHu INe6ek1rPyPSIAxrPyJe9Q6Wo0A7PQvTioh364YNZWjVyjI3iTks9BGE/XkroNPI VKmF198dpC2MdBIKsf5FQwgX7lqGaBCbxL+kKLY/BDZ9hPLywRMQ4ohOEpkSlnFd 4CWpjH3oMUXF7w/u6DsRHNgqPPkH0fZfwoHNDwo3+UfSSJ5pOimBDfAA0G1CAAXg N+CC/swmMNmgPQCZr6UlPPA42+SA1ZNzIoh3YAWmtQHOwFlBIr9KR4cIByqR1/aT tppdZBlpDBC3kYY6UDX4bFNnwpQ6WlZhE6atbk0lzUaRIob7/4+194rxLMny86Iy K70t31XVrtr7aTfekLPk7kparUhBBGRIgdCDzIue+CKAL3qSIEACoQdBECCABI1W C+6SK3LWzu7sDLfH9czOTPd0z7Q35bp8ZqX3pe/7nXszq7qre3Yp3cz/NREnjosT ESfMjdtjMiRHrw9pGclzpatowUy7C98F18VwD3F1+PL84VOlj4zc7tpj8PawXXr5 uA0q8zIOteAgQqogSj4FhTQ6fqKLHl8f1sUGvzTI0+j3dsS6NFwSG3yi90mKxouj nnkInHkamzMc2OJN2A6fgIHMzV/4tEs+/FT+FG7p8G9DLSs5lIubwHKN7Wq/nc4C w5PwsUGjCk9ggkenAvhdHF2i3YtEfegalHoonD3hxItMuh1PYq0gwgJANHfRq5Ah vktl76aDTSqgysw798V0HOCwOe6P8G8wQT0XxobuHhjJtCQgCBP2Rj88Fxj1Vkfw AFZ668JIFNo8Fm0Tia1CQV0ceWNMyPT36M5Wi7zrafbpApxTwfYS7IXfepe6RHvr dGmq5HbPnDYQUVScgUBwqbvdnMhzhQIhSIS9lVYnUQdr3lVIn6+7AdAo7dxKqyPK pbdH4nP0zNZThZb+7XhKR0qFtWAThEh9fWtcHV18lybpop8u+iMXAP0HJjx39X0v fto84uOeAlP4RM59SHn12UNrT2B3hkGYLzDOXbJAiivJuMZYSoJ0Mq3LdeAqIWAA mr8djQrvkfV4K9Z8q3zp2gceekjTRZe7+iBmN/Mq7nb5Hnwdj2EppHIXjsJoka9n YNVmJwAkyEv56qCL//6hD+1KQPLBuL3wguQ5JItu5U/PQ3/9KM4+pBKjC4QpNJyT n1KqcGF35Vf/hO8bKDtUB0VzD+Nf6q6IkkS86sI2rZeRvfwJG2QJz+CNzbY4N9d2 JibD5zY7T+3gV5rckdYN/MjyH/4CTmu+ZIBJ7mcbK7cm2L9vsG3g9W4sbkS/OrLL G7xwxdpWR2WHcWLHGZn1SwfrDO36NSwpy+z/L4dGBD6Fiex59HSTcUhLGD77lSww k4gvlent8wxIr7vgAl8aXxMS51Hwxlo5GmIEocl0Efjocy4CfMyRxMSVIQQoxDvc XaqiAb6bwCVR64oEIkL5c2BYPFalU5VLGjYaIHUdFEFEwwYtf8bkqIR1H0jCjTcc /OWIiDxYOprKGW4E7fB0uWpyQnr+fdotBEKKpuPFuCS3gEuiw9U34gVc5466GG7C 7YOy1GH6ots9iz2RIu9uO5rytKuDXQzCFGwYC7KOqQR0hD5y6WE+EtEF9PFFsXiU b2jJX6I97T7cFlGtyQMulYngHa9BYHjhULZqaApfj7mQdnShtWsbH6FGCpPmCJe5 cw27eVd67gGKh+Rk7NHncvpuQlKokrBu//Jnpaij8ohzSEt5T6ZeNyUz4bZ7Fv4c JOAfBqMrU1klxecNoHF9k1sYDPnYIyCcIrdNetAGvWl8VsuWdEH7s6G9VjMAmlig fyHJMN/pv0eH9Og1HXSn0eBFv7N0U/CeVX1kDSPCE5YIIsM/V4/dwAASIFABiqOY FD+jPNGtYTfVreI1IMBIybXHFDTGia475HU3/qa7Pr6uexC3hvdPxO/i5L7+K7IU wX3hSLkANvpPkAnLgkxgeOWYT7c51G+nIx31vNwFmEFiqp/4QJ4HiZRtGHTrYYA/ AW+NDNsdndK7MP1RXCaaoD5GezZTfE7+9kwlmXLtwSboIydSmjD2EA3FtkzY06hu WqS7BWvqHEJKCjmp9EkJH+WImg6j6WyjoAu2Q9Yj4LGcPOnqN9juqZM9XngA766e ieopFg8C25ETzJBoJ2lMZ8xuPRnISsXtR47EgENqpsw5z51Og59kBZhreJWFPhiZ BSsROlmMS5qciFSmPTRJazpvpNzFC1GDAxWe6CJet4EWqvAWDTnvcBvOQ483/kDk qfojcdFtpYmeC3gX/1/u5iY+oquOM3AOUu+usnZ1dIgvp7LF1Q6V8TofpFrHj9zg 5f39g8PkP+OrOK2y7RdZr/Oe1AbxKu8XjLQqJcOzJqZguCuAe7DuMOW/usqiWZYH bLCeVeNyT1Y/MDDOFgZr6+usCmAklrWvw8NjmIoGuKewv5zwHXR0UFpUfO869WIY PGmU8NE38tsYPctr4RVoW4n8k44aUzg/S8uAcRWOys8YWKfaEO3UHtzhPw24qIAi YCeZvmdgt5VL65G2LHa9mD04KexJEyAjhfXC1bu+V12hHT0iM00AjA3TNnR2tvj5 kNSFwPXI4hncz5XwiicOW02mcJFgaNEzlF3p59TRN+imiELfGaLpwlGASrcFQIDp DUdXuXiGgGnkxseKkUDAcjVZ5akAOhlV2SAxSW5y/AOtdVlpi0/c0vBJLB57+vK+ nnt+eAwYMEYVY30g1/8vRyeZIoRuUd+VPewWP6H7MaR6KUxnXorKPOp7nRFAIG1R I/VWYACtuHs973ZEzPfbHpUm+IiXRo0U+KAExBvWVfx6hrudNyMEy1XmgO10Wbwk +t/idDNP3nf2yV3Qy1J4Iv+Vi/K5w57SVlfaefQUeymn1BmMfXSm9Wfj0kYu7ElA C4T6ksxtjy4CGpWfEgdQnCaKF2xC5S+LdDRRvUcv4bMQBxOn2FwF3eYcqI+EVxrw KwA4LRt834WXY2XGIPiTlnxZ9hFLu4npKOctxUd5u7ztUpMy8olNsaIWQtTp1ibY 1auEpaHKpAMcE3HwpLxEUd+aVBz+PEoadeeDaSrEx3+bI1wiqPQ8Ikd0LS2EBH+/ c0BPqnRHSuACv8uCOuNh97lw7p2J0L6gZU3jgIyKTLvW2XqxIV5T7SEKnzJJkHqr 5714oW85uvReomeuWaMt89Da7RB0snYEASqZ96F7qSQtaaR3+6PCyxHqjKKTJTJE IPn2Bjxe8AHEa5uqBvojcTz0enYWJPlLQPiI/NDzylH1kvCG8QsrHZ0AdCfrGDWu bJYvqQZWzXOk94eEwQOlPQYII17cOeCfpB31YrQeCt8uXAfOpVCZvnDk3MN1Oklc 8HR6Trx8dHhAUtHmgoHRBsk6feIPCKs+SjXi4SfxDkcwK3+Okr9TYw/SxXFJsqIp ir6NCO0SqOcgNOQtXzYNJmkQElrFb9J36faI/EXvSgDrHf2k4s0c5I9Pqup/OZK6 SYS+ywpOrPXHBoOf+pQjzOK7ntUBRnFsr25ku1V5/gVOKyAYy8bGDrsH4JAykqrC 11gsq/ol5hZX02xNsAYxKzT3cV1joe3QBKOyjLrKSHSxK6tk/d109I8l500Re7dG BYybMgCevU8OVkab+RvQn5/baHPXGG5eYueD5S0calICtx/px9iea3JqqM0eGG6z B/mM2LhKRBqc7MLfGYgFhoC11a22uLjpC28x5JhE0O1rQ3yKbHKCLzvwDd3bHTGc 3QixA4ehWlHQtrbVla22vLQF7s5QgRDKIjkG7tlpvjJGY1DGI6Kb6cAJDK6R2Vev bbB4GXn5raxsYwzCIi/ZNQF/E5PD7SCyHpgdYhmHpRcqihl00haezggJF+BndQUO yEuDzWd5ssEfVd4p9ual4yKK5IORHgCLxzf+FtD/up/25blSF4CV2dgY9jLNV9VS 8RcNCQhXfIA1JVmc5bAuoafVZRpnlbaLETjwj6D76Sk6U/TaKs5mxQOM3Pj2oTpe oZMVmUhkfHqaMDgxjkzjfCiD8MWljbZMfqs/K47CE2R/qVPphm09Jso+lNVO3XXs aH2dKQ90L/5eGinxePtD3ZAXo+IiH+McMHXjAvbd9xtNK1E5xrb8rPICtr++DiGD Ofr8+lg6pI2ddfDikSnDdHqmKDPjfMUkfCeqMyA7YsCK347sEnQ3cW6qcxiOioF/ i7M4wxO8+Yno2VnpF6LSX/egswrwyuJWuza32a7Pb7LvX8m/HSWxfMmZorHhNjM7 3A5Q9mdmmBUapnElnS4tpDiDT9kk0aEuav0ZuWQqTOzln47jErSVXxutpB0CdDc6 qv6wMW1eQkXsY2gULUFuPdSxdgJe8xg6S8x2zVH2F5B3Efob6N1cwTKQTdsbQt6h duDgcPJv0LpYtnaRe6MOuNiqk9JnzI08L7AtbGl5eRs6623u6jp0aGj8aAww4hsb G6R+GaRuGaGOGWbDcPIoaET6IVLQXsX+lygHOtoefX7W01/wDGqxmxUjbLOobp3h i2564Yp8xO3z1SBzbZv8WqFdUC7rXuupSnsb+h0e2xZR76cATlAWh/mgDpvjIOtg UVQQywJMSU/e6hHbgNYKtGIbn0ArpDwJE1Z0jL0DI3kvTpkYp82anh4KvgV0uZG3 rePeGR24fQxSTJIv1m0fq+TIVPxaWYZnEGhF6sZf2XMIFx7YGWIwamYGnVOmOhQh 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 mKwDbHBBDnVeS7FNVVAbTAXrhLlYhMtWXzAHuoSqShxKETpXuuBAbHf6a+SKcy4X rFFC0OA/SX86o9+Z3VRH2WVvu3DSTplH0thb1W3KGdOnPAdpe/YD5xWPSVjJd86z IHTsi0fJ/MWcha0XDLBgKo8G4kjTVm6vFF81TtYJx5EyJtUtzfbqfMsxdKlT0UpX aJLSYPYxwVgmow2qvh3Tydod581TxmcN16dDwDQe79mMkQW/UulMN8uX1HlRf12a hsveaojVnrZtBLasYyjhAEnbmDS0z/GCZyDHtBLns5652gAqy7NvYf+4RC7p9ArH In3DYlADMeehTQIduAYERAAbgDHlgGoV9IV9bIeSdz4XawykQepQm328hKOSoA1d te+cYFgb5/nsM+1I87nAzSoFcRYElwGSyflWW5oDEojRnjjHVcxpKr/YX11kKUe7 qW1ag9PmMzgh46wSTyVj3IykfsQOY7EU9FelEuUT8deZ4wmwuIYK5pzIw6WxtGHa C32xWCOBX6OtvwTpPiNVr+qL861+nH1a/8iB4fXTJHy2jYBWeBbuz+PBzrH6oPYQ H6iSNnLhHud7pcSuAAu1t3J5zdRUAUqWEFwxFADAqC/AHsojroYqkkBedI96j0uX dWWe8Jl7ems2zLZJy6zEdhwecy0g4/X0lwPqG8qiSgU1Rzw7lxwWfHCxBFALONaN HCv5151W7pgb1EH8836t30YzroV4uw3v/fLtZ4/y/uvv3MYZxIO93fzmdXiS65dv 4/kK393cjt3jg8rLNfiejfM7Xl93/N1vrk9XuPb8th6axrs+hg89f7r8xteHiDu/ 3YYt8u91hwrn993bE8RT6DzGb6+vPX+s/LXF/fM/xmO9265wvL++nb/qAF0fwsu+ fn9jP97m7+36mPlN3t7fj4/hJ+6Lay70CR0476nQP2yZ/Pv8Oa4P9/bPn//Wo+Zf 8a//sOHNbeP7wvPl9+tN3p2Xm/O/eC3xUPm9899d3xv7vz3OdWMUjuMu8Qh+wSve X/4d/15/GT//+J/8L+zJG01C/qr5e/3WMxaOW2gzn2t+h5t3mD9n/M2jxHt1s0J7 8mU87HXb5z/y741XvIh3x/zRvjc2e//tzXP6vrCf1xB/u3nc+N67zP8WbzPfqD86 bP4YfnV9DLaJK5K5w/Xx3M22yb/45Ln5ELeLX8aj59/xW7798rv7ZdzfY8UP+aPF t54z/21+Gz7FJ3/df+I9xV+uj8G27l14xbMWDhd/YO/rv4Vt3v21vfzEPzdOevP5 Fc739hjX91nY5voA8SLe3s67E7w77PVFus31W37zpPHurt/ziQnUi3l7Xj5pB/Lt d/3cbnwutHv+egr7XR+H7dzXCc+XY99X4drz5y9cwXUTsL0XGB1794nXGPe6cd18 73bXr8Lx4o7YFPfJf3fdf9jO9nt7T4UGiPvf/OBG7l94+S7/e/w3/xA8UOHrt7/n 9/D+8+8K7REP5s7vDpXfwK/itvkf8mfJ/5Q/xI3vb/z49vg3Dul9ubV93/MWPuev 2WPyjm28M592vI38Sfwx/3q78fUP/Hnbjr5nf9VUPFFsR97Ge7zevHCY61O5Uf73 6+txR89d2NzTvX1//eHt5/ibn/I/cKj8NV9//vH3bsMrbnR9Tdcf4/dvz+Kn623j D+/Odn36/Ob+e32swnn8ymv3Fe/dv/HTu/O9++Z699jIcQc3ut463wZ+ePuM+C3+ er2Jp/7zL38oHOfdFn4Tdyns6PE8343PcYvr48ajFHaKh7v+cP37uyP/2dP96Of8 hxv7x+P57ds3vI9nzF9P/Pr6N67vP5zSay601fV7ty60uUeOr3eHeHumeJb3vi8c /+0ho6PNeWmg600LRyz+LbZAsQWKLVBsgWILFFug2ALFFii2wE+rBcSP/+Yrests Vfhb2KHg7RY84sL3/n1/25u/vf/+5rY337+/XeHz37ON297czve+/ty15n/58faF 7/x78zg3v/9b79/f7+bnm+/fP87N3/7Se/f5S7/5va/Cvb6/3V/6Le5045+/d7+b 23lVMVC8cRzfFq7pva/jx8J1vv3NL653+Gv7vd2eN/m4rxBPv/slHpt//lZoVtgu thob/63zxu0Lp7ne2X1ufv8fPseGeRehehY/xbPFjd2bN77nZYT6o5jy+uf8r+/9 +/5vN6Pe9zb90cfCBV+f/+1HrrUQIcefbuz05z7f+PltG9zczve+3l1m/t797i9t 9x9+u9F+f2mf98/z9nzv7eux/+bLff6uF2d513A/3oPnEK+hcCyfi68/97nwW36L t/++3f/t7/m7j99fH+vts7o+7rvP9qP8oQoIzvXHfN9692Pc6N1+nIPf/uw53l7Z jeeZv6QbzVBou7dHuLGXhy5chU1R2Da/ib/Fb/j+/fduUbiPuPV7++YvIH/sH5+Z IxZOUzh3/iT5kxb+ffsbP/7ovRtwxMIxfMPHwmj+0TXlt4xHzFuS6/28oBsvPxZs gF/nLyd/3vxv1xt7j1xLYfd4y4UPcS8+FNqhcM3sevMY8f37x7k+fP6PZ/c48VTx K7+Jx70+d/wcf3n3z/vHfX8bfy+8/C1uf/3X7wvbF7Z7217+yKvwve8L2978vvDd +9vd/Pxu33c2x+8Kr8J1FT4X/ha+v3mOm+/dLv+5sGVhz/zfwjXc/PXm/jff39zz R30pPjN/9WjXR4p/+AfaSfzuL53o5vce4j+8Csfkh/j2xuf3t715rPg+v629snAf 7lLY7P3dr6/8/a//7s839y8irX93sxU3LLZAsQWKLVBsgWILFFug2ALFFvj/qwUk JRZfxRYotkCxBYotUGyBYgsUW6DYAsUW+Em3QNFp/Uk/nuLFFVug2ALFFii2QLEF ii1QbIFiC9gCRae12A+KLVBsgWILFFug2ALFFii2QLEFfvItUHRaf/KPqHiBxRYo tkCxBYotUGyBYgsUW6DYAkWntdgHii1QbIFiCxRboNgCxRYotkCxBX7yLVB0Wn/y j6h4gcUWKLZAsQWKLVBsgWILFFug2AJFp7XYB4otUGyBYgsUW6DYAsUWKLZAsQV+ 8i1QdFp/8o+oeIHFFii2QLEFii1QbIFiCxRboNgCRae12AeKLVBsgWILFFug2ALF Fii2QLEFfvIt8P8BlqXIB0tWw6kAAAAASUVORK5CYII= --816df2443a21ea6c_5912007582d539b3a Content-Type: image/jpeg; name="giovbscf.jpg" Content-Description: giovbscf.jpg Content-Disposition: inline; filename="giovbscf.jpg"; size=18719; creation-date="Mon, 04 Apr 2016 09:46:35 -0700"; modification-date="Mon, 04 Apr 2016 09:46:35 -0700" Content-ID: Content-Transfer-Encoding: base64 iVBORw0KGgoAAAANSUhEUgAAAkYAAABUCAYAAABnXPjVAAAKrmlDQ1BJQ0MgUHJv ZmlsZQAASImVlgdUU1kax+976Y2WgHRC770FkF5DEaSDqIQEQighBIKCXRkcwbEg IgLqiA5FFByVOhbEghUFC1gnyCCgrIMFLKjsA5aws3t29+z/nZvvd77c993v3ffu OX8AyP0sgSANlgEgnZ8tDPX1oEfHxNJxYgAhFxboAQyLnSVwDwkJBIjm4181+RCZ i+ie6Uytf///v0qWk5jFBgAKQTiBk8VOR/gMMjrYAmE2AChkAO1V2YIZLkOYJkQa RPj4DHPnuGOGE+b4/uyc8FBPhEcAwJNZLCEXANIHJE/PYXOROmQawhZ8Do+PsBfC LuxkFgfhfIRN0tMzZvgkwgYJ/1SH+5eaCZKaLBZXwnPPMiu8Fy9LkMbK/T+3438r PU00v4YWMsjJQr9QJCoie1abmhEgYX7CkuB55nFm589yssgvYp7ZWZ6x88xheQXM syg1wn2eWcKFe3nZzPB5FmaESurz05YESuonMiWcmOUdNs9JPB/mPOclh0fNcw4v csk8Z6WGBSzM8ZTkhaJQSc9JQh/JM6ZnLfTGZi2slZ0c7rfQQ7SkH06il7ckz4+Q zBdke0hqCtJCFvpP85Xks3LCJPdmIx/YPKew/EMW6oRI9gd4AW8QiFx0EAGsgD2w BNbADwRlJ66e+aaBZ4YgV8jjJmfT3ZFTk0hn8tlmJnQrC0s7AGbO4Nwrft8/e7Yg BfxCLicBgMXI+4EcF3JxyLptuwCQ8VrI6SCRaAHAxUa2SJgzl0PP/GAAEUgDGlAC 6kAbGABTpD874ATckI79QTAIBzFgBWCDZJAOhGAVWAs2gQJQBHaBvaAcHAJHQC04 AU6BFnAWXARXwU1wFzwAT4AYDIHXYBxMgikIgnAQBaJCSpAGpAsZQ1YQA3KBvKFA KBSKgeIhLsSHRNBaaAtUBBVD5dBhqA76FWqDLkLXoR7oETQAjULvoC8wCibDNFgN 1oPNYQbsDgfA4fBymAtnwnlwPrwDLoOr4ONwM3wRvgk/gMXwa3gCBVAklAJKE2WK YqA8UcGoWFQSSohajypElaKqUA2odlQX6h5KjBpDfUZj0VQ0HW2KdkL7oSPQbHQm ej16O7ocXYtuRl9G30MPoMfR3zEUjCrGGOOIYWKiMVzMKkwBphRTjWnCXME8wAxh JrFYrAJWH2uP9cPGYFOwa7DbsQewjdgObA92EDuBw+GUcMY4Z1wwjoXLxhXg9uOO 4y7genFDuE94El4Db4X3wcfi+fjN+FL8Mfx5fC9+GD9FkCHoEhwJwQQOIZewk3CU 0E64QxgiTBFlifpEZ2I4MYW4iVhGbCBeIT4lvieRSFokB9JSEo+0kVRGOkm6Rhog fSbLkY3InuQ4soi8g1xD7iA/Ir+nUCh6FDdKLCWbsoNSR7lEeU75JEWVMpNiSnGk NkhVSDVL9Uq9kSZI60q7S6+QzpMulT4tfUd6TIYgoyfjKcOSWS9TIdMm0yczIUuV tZQNlk2X3S57TPa67IgcTk5PzluOI5cvd0TuktwgFUXVpnpS2dQt1KPUK9QhGpam T2PSUmhFtBO0btq4vJy8jXyk/Gr5Cvlz8mIFlIKeAlMhTWGnwimFhwpfFqktcl+U uGjbooZFvYs+KqoouikmKhYqNio+UPyiRFfyVkpV2q3UovRMGa1spLxUeZXyQeUr ymMqNBUnFbZKocoplceqsKqRaqjqGtUjqrdUJ9TU1XzVBGr71S6pjakrqLupp6iX qJ9XH9Wgarho8DRKNC5ovKLL093pafQy+mX6uKaqpp+mSPOwZrfmlJa+VoTWZq1G rWfaRG2GdpJ2iXan9riOhk6Qzlqdep3HugRdhm6y7j7dLt2Pevp6UXpb9Vr0RvQV 9Zn6efr1+k8NKAauBpkGVQb3DbGGDMNUwwOGd41gI1ujZKMKozvGsLGdMc/4gHGP CcbEwYRvUmXSZ0o2dTfNMa03HTBTMAs022zWYvbGXMc81ny3eZf5dwtbizSLoxZP LOUs/S03W7ZbvrMysmJbVVjdt6ZY+1hvsG61fmtjbJNoc9Cm35ZqG2S71bbT9pud vZ3QrsFu1F7HPt6+0r6PQWOEMLYzrjlgHDwcNjicdfjsaOeY7XjK8U8nU6dUp2NO I4v1FycuPrp40FnLmeV82FnsQneJd/nZReyq6cpyrXJ94abtxnGrdht2N3RPcT/u /sbDwkPo0eTx0dPRc51nhxfKy9er0KvbW847wrvc+7mPlg/Xp95n3NfWd41vhx/G L8Bvt18fU43JZtYxx/3t/df5Xw4gB4QFlAe8CDQKFAa2B8FB/kF7gp4u0V3CX9IS DIKZwXuCn4Xoh2SG/LYUuzRkacXSl6GWoWtDu8KoYSvDjoVNhnuE7wx/EmEQIYro jJSOjIusi/wY5RVVHCWONo9eF30zRjmGF9Mai4uNjK2OnVjmvWzvsqE427iCuIfL 9ZevXn59hfKKtBXnVkqvZK08HY+Jj4o/Fv+VFcyqYk0kMBMqE8bZnux97NccN04J ZzTRObE4cTjJOak4aYTrzN3DHU12TS5NHuN58sp5b1P8Ug6lfEwNTq1JnU6LSmtM x6fHp7fx5fip/MsZ6hmrM3oExoICgTjTMXNv5rgwQFidBWUtz2rNpiFm55bIQPSD aCDHJaci59OqyFWnV8uu5q++lWuUuy13OM8n75c16DXsNZ1rNdduWjuwzn3d4fXQ +oT1nRu0N+RvGNrou7F2E3FT6qbbmy02F2/+sCVqS3u+Wv7G/MEffH+oL5AqEBb0 bXXaeuhH9I+8H7u3WW/bv+17IafwRpFFUWnR1+3s7Td+svyp7KfpHUk7unfa7Ty4 C7uLv+vhbtfdtcWyxXnFg3uC9jSX0EsKSz7sXbn3eqlN6aF9xH2ifeKywLLW/Tr7 d+3/Wp5c/qDCo6KxUrVyW+XHA5wDvQfdDjYcUjtUdOjLz7yf+w/7Hm6u0qsqPYI9 knPk5dHIo12/MH6pq1auLqr+VsOvEdeG1l6us6+rO6Z6bGc9XC+qHz0ed/zuCa8T rQ2mDYcbFRqLToKTopOvfo3/9eGpgFOdpxmnG87onqlsojYVNkPNuc3jLckt4taY 1p42/7bOdqf2pt/Mfqs5q3m24pz8uZ3niefzz09fyLsw0SHoGLvIvTjYubLzyaXo S/cvL73cfSXgyrWrPlcvdbl3XbjmfO3sdcfrbTcYN1pu2t1svmV7q+m27e2mbrvu 5jv2d1rvOtxt71ncc77XtffiPa97V+8z7998sORBz8OIh/19cX3ifk7/yKO0R28f 5zyeerLxKeZp4TOZZ6XPVZ9X/W74e6PYTnxuwGvg1ouwF08G2YOv/8j64+tQ/kvK y9JhjeG6EauRs6M+o3dfLXs19Frwemqs4G+yf6t8Y/DmzJ9uf94ajx4feit8O/1u +3ul9zUfbD50ToRMPJ9Mn5z6WPhJ6VPtZ8bnri9RX4anVn3FfS37Zvit/XvA96fT 6dPTApaQNWsFUMiAk5IAeFcDACUGAOpdxC9IzXnkWUFzvn6WwH/iOR89K8S51LgB EIlgwEYAjnQAoItEIhJDkHy4G4CtrSXjH8pKsraaq0VqQaxJ6fT0e8Qb4gwB+NY3 PT3VMj39rRpp9jEAHZNz3nxGMoj/d9toz7AKvK29Ffyr/g6AiQSi0F6CAQAAAZxp VFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRv YmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpS REYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1z eW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIK ICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlm LzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+NTgyPC9leGlm OlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9u Pjg0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRp b24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+ChfJQh4AADyESURBVHgB7X09 cGLJlubRzsQ8NLOxgaxBHliLLJCnsqA9PU9tgSxoT22htlB5eKKMDWhLeFCxBpSx ITwR60DNGmI3JgLKAo/rCauhX3c/eN3z5u538uf+8COQWlWtKuVVCO7Nn5Mnv8yb ecj8MnPHxkXmMggYBAwCBgGDgEHAIGAQoP9iMDAIGAQMAgYBg4BBwCBgEJAIGMPI 1ASDgEHAIGAQMAgYBAwCCgFjGJmqYBAwCBgEDAIGAYOAQUAhYAwjUxUMAgYBg4BB wCBgEDAIKASMYWSqgkHAIGAQMAgYBAwCBgGFgDGMTFUwCBgEDAIGAYOAQcAgoBAw hpGpCgYBg4BBwCBgEDAIGAQUAsYwMlXBIGAQMAgYBAwCBgGDgELAGEamKhgEDAIG AYOAQcAgYBBQCBjDyFQFg8AnR2BO0/H03lTnU4us8fzeMPd6zqdkWWP6HRLuFf9U nvNHKDifjmn6iHhPovNnguuT5NUIMQi8UASMYfRCC95k++kQGDaytLOzs/E/2/hA 3QqH3aW94+Y9RsucGskIRfaPqP9IA2DYSFIksk+14SMFPB08ayXNrQbt7lbuwcEf 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 --816df2443a21ea6c_5912007582d539b3a Content-Type: image/png; name="unsub.png" Content-Description: unsub.png Content-Disposition: inline; filename="unsub.png"; size=100; creation-date="Mon, 04 Apr 2016 09:46:35 -0700"; modification-date="Mon, 04 Apr 2016 09:46:35 -0700" Content-ID: Content-Transfer-Encoding: base64 iVBORw0KGgoAAAANSUhEUgAAAc4AAAAoCAYAAAB3jBqbAAAKrmlDQ1BJQ0MgUHJv ZmlsZQAASImVlgdUU1kax+976Y2WgHRC770FkF5DEaSDqIQEQighBIKCXRkcwbEg IgLqiA5FFByVOhbEghUFC1gnyCCgrIMFLKjsA5aws3t29+z/nZvvd77c993v3ffu OX8AyP0sgSANlgEgnZ8tDPX1oEfHxNJxYgAhFxboAQyLnSVwDwkJBIjm4181+RCZ i+ie6Uytf///v0qWk5jFBgAKQTiBk8VOR/gMMjrYAmE2AChkAO1V2YIZLkOYJkQa RPj4DHPnuGOGE+b4/uyc8FBPhEcAwJNZLCEXANIHJE/PYXOROmQawhZ8Do+PsBfC LuxkFgfhfIRN0tMzZvgkwgYJ/1SH+5eaCZKaLBZXwnPPMiu8Fy9LkMbK/T+3438r PU00v4YWMsjJQr9QJCoie1abmhEgYX7CkuB55nFm589yssgvYp7ZWZ6x88xheQXM syg1wn2eWcKFe3nZzPB5FmaESurz05YESuonMiWcmOUdNs9JPB/mPOclh0fNcw4v csk8Z6WGBSzM8ZTkhaJQSc9JQh/JM6ZnLfTGZi2slZ0c7rfQQ7SkH06il7ckz4+Q zBdke0hqCtJCFvpP85Xks3LCJPdmIx/YPKew/EMW6oRI9gd4AW8QiFx0EAGsgD2w BNbADwRlJ66e+aaBZ4YgV8jjJmfT3ZFTk0hn8tlmJnQrC0s7AGbO4Nwrft8/e7Yg BfxCLicBgMXI+4EcF3JxyLptuwCQ8VrI6SCRaAHAxUa2SJgzl0PP/GAAEUgDGlAC 6kAbGABTpD874ATckI79QTAIBzFgBWCDZJAOhGAVWAs2gQJQBHaBvaAcHAJHQC04 AU6BFnAWXARXwU1wFzwAT4AYDIHXYBxMgikIgnAQBaJCSpAGpAsZQ1YQA3KBvKFA KBSKgeIhLsSHRNBaaAtUBBVD5dBhqA76FWqDLkLXoR7oETQAjULvoC8wCibDNFgN 1oPNYQbsDgfA4fBymAtnwnlwPrwDLoOr4ONwM3wRvgk/gMXwa3gCBVAklAJKE2WK YqA8UcGoWFQSSohajypElaKqUA2odlQX6h5KjBpDfUZj0VQ0HW2KdkL7oSPQbHQm ej16O7ocXYtuRl9G30MPoMfR3zEUjCrGGOOIYWKiMVzMKkwBphRTjWnCXME8wAxh JrFYrAJWH2uP9cPGYFOwa7DbsQewjdgObA92EDuBw+GUcMY4Z1wwjoXLxhXg9uOO 4y7genFDuE94El4Db4X3wcfi+fjN+FL8Mfx5fC9+GD9FkCHoEhwJwQQOIZewk3CU 0E64QxgiTBFlifpEZ2I4MYW4iVhGbCBeIT4lvieRSFokB9JSEo+0kVRGOkm6Rhog fSbLkY3InuQ4soi8g1xD7iA/Ir+nUCh6FDdKLCWbsoNSR7lEeU75JEWVMpNiSnGk NkhVSDVL9Uq9kSZI60q7S6+QzpMulT4tfUd6TIYgoyfjKcOSWS9TIdMm0yczIUuV tZQNlk2X3S57TPa67IgcTk5PzluOI5cvd0TuktwgFUXVpnpS2dQt1KPUK9QhGpam T2PSUmhFtBO0btq4vJy8jXyk/Gr5Cvlz8mIFlIKeAlMhTWGnwimFhwpfFqktcl+U uGjbooZFvYs+KqoouikmKhYqNio+UPyiRFfyVkpV2q3UovRMGa1spLxUeZXyQeUr ymMqNBUnFbZKocoplceqsKqRaqjqGtUjqrdUJ9TU1XzVBGr71S6pjakrqLupp6iX qJ9XH9Wgarho8DRKNC5ovKLL093pafQy+mX6uKaqpp+mSPOwZrfmlJa+VoTWZq1G rWfaRG2GdpJ2iXan9riOhk6Qzlqdep3HugRdhm6y7j7dLt2Pevp6UXpb9Vr0RvQV 9Zn6efr1+k8NKAauBpkGVQb3DbGGDMNUwwOGd41gI1ujZKMKozvGsLGdMc/4gHGP CcbEwYRvUmXSZ0o2dTfNMa03HTBTMAs022zWYvbGXMc81ny3eZf5dwtbizSLoxZP LOUs/S03W7ZbvrMysmJbVVjdt6ZY+1hvsG61fmtjbJNoc9Cm35ZqG2S71bbT9pud vZ3QrsFu1F7HPt6+0r6PQWOEMLYzrjlgHDwcNjicdfjsaOeY7XjK8U8nU6dUp2NO I4v1FycuPrp40FnLmeV82FnsQneJd/nZReyq6cpyrXJ94abtxnGrdht2N3RPcT/u /sbDwkPo0eTx0dPRc51nhxfKy9er0KvbW847wrvc+7mPlg/Xp95n3NfWd41vhx/G L8Bvt18fU43JZtYxx/3t/df5Xw4gB4QFlAe8CDQKFAa2B8FB/kF7gp4u0V3CX9IS DIKZwXuCn4Xoh2SG/LYUuzRkacXSl6GWoWtDu8KoYSvDjoVNhnuE7wx/EmEQIYro jJSOjIusi/wY5RVVHCWONo9eF30zRjmGF9Mai4uNjK2OnVjmvWzvsqE427iCuIfL 9ZevXn59hfKKtBXnVkqvZK08HY+Jj4o/Fv+VFcyqYk0kMBMqE8bZnux97NccN04J ZzTRObE4cTjJOak4aYTrzN3DHU12TS5NHuN58sp5b1P8Ug6lfEwNTq1JnU6LSmtM x6fHp7fx5fip/MsZ6hmrM3oExoICgTjTMXNv5rgwQFidBWUtz2rNpiFm55bIQPSD aCDHJaci59OqyFWnV8uu5q++lWuUuy13OM8n75c16DXsNZ1rNdduWjuwzn3d4fXQ +oT1nRu0N+RvGNrou7F2E3FT6qbbmy02F2/+sCVqS3u+Wv7G/MEffH+oL5AqEBb0 bXXaeuhH9I+8H7u3WW/bv+17IafwRpFFUWnR1+3s7Td+svyp7KfpHUk7unfa7Ty4 C7uLv+vhbtfdtcWyxXnFg3uC9jSX0EsKSz7sXbn3eqlN6aF9xH2ifeKywLLW/Tr7 d+3/Wp5c/qDCo6KxUrVyW+XHA5wDvQfdDjYcUjtUdOjLz7yf+w/7Hm6u0qsqPYI9 knPk5dHIo12/MH6pq1auLqr+VsOvEdeG1l6us6+rO6Z6bGc9XC+qHz0ed/zuCa8T rQ2mDYcbFRqLToKTopOvfo3/9eGpgFOdpxmnG87onqlsojYVNkPNuc3jLckt4taY 1p42/7bOdqf2pt/Mfqs5q3m24pz8uZ3niefzz09fyLsw0SHoGLvIvTjYubLzyaXo S/cvL73cfSXgyrWrPlcvdbl3XbjmfO3sdcfrbTcYN1pu2t1svmV7q+m27e2mbrvu 5jv2d1rvOtxt71ncc77XtffiPa97V+8z7998sORBz8OIh/19cX3ifk7/yKO0R28f 5zyeerLxKeZp4TOZZ6XPVZ9X/W74e6PYTnxuwGvg1ouwF08G2YOv/8j64+tQ/kvK y9JhjeG6EauRs6M+o3dfLXs19Frwemqs4G+yf6t8Y/DmzJ9uf94ajx4feit8O/1u +3ul9zUfbD50ToRMPJ9Mn5z6WPhJ6VPtZ8bnri9RX4anVn3FfS37Zvit/XvA96fT 6dPTApaQNWsFUMiAk5IAeFcDACUGAOpdxC9IzXnkWUFzvn6WwH/iOR89K8S51LgB EIlgwEYAjnQAoItEIhJDkHy4G4CtrSXjH8pKsraaq0VqQaxJ6fT0e8Qb4gwB+NY3 PT3VMj39rRpp9jEAHZNz3nxGMoj/d9toz7AKvK29Ffyr/g6AiQSi0F6CAQAAAZxp VFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRv YmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpS REYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1z eW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIK ICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlm LzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+NDYyPC9leGlm OlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9u PjQwPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRp b24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CsCgGZcAABp9SURBVHgB7ZsL XJVlnvi/dbgdQFAQBY8iICoqimJhWDSR0JAy6phN2m0b28bPWvtp3cu/mT7N/ttt PrO5zay1s8OmrWNljpqXLMkozOMVBBUFgUBuBuFBERAEjsA5ub/3PecAGqg0M5bu 8/jxPYf3fd7n8n1+t+f3vue2S1JQRRFQBBQBRUARUASui8Dt11VLVVIEFAFFQBFQ BBQBnYBynEoQFAFFQBFQBBSBARBQjnMAsFRVRUARUAQUAUVAOU4lA4qAIqAIKAKK wAAIKMc5AFiqqiKgCCgCioAioBynkgFFQBFQBBQBRWAABJTjHAAsVVURUAQUAUVA EVCOU8mAIqAIKAKKgCIwAALKcQ4AlqqqCCgCioAioAgox6lkQBFQBBQBRUARGAAB 5TgHAEtVVQQUAUVAEVAElONUMqAIKAKKgCKgCAyAgHKcA4ClqioCioAioAgoAspx KhlQBBQBRUARUAQGQEA5zgHAUlUVAUVAEVAEFAHlOJUMKAKKgCKgCCgCAyCgHOcA YKmqioAioAgoAoqAcpxKBhQBRUARUAQUgQEQUI5zALBUVUVAEVAEFAFFQDlOJQOK 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 IIH/Bb/S5Yc8P7pkAAAAAElFTkSuQmCC --816df2443a21ea6c_5912007582d539b3a-- From pro-surface-saver-xfs=oss.sgi.com@grateececi.com Mon Apr 4 14:17:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 350FC7CA3 for ; Mon, 4 Apr 2016 14:17:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D008B8F8052 for ; Mon, 4 Apr 2016 12:17:53 -0700 (PDT) X-ASG-Debug-ID: 1459797471-04bdf0110421c700001-NocioJ Received: from mail.grateececi.com ([103.200.108.249]) by cuda.sgi.com with ESMTP id 38ASGw7ZH4dORGqD for ; Mon, 04 Apr 2016 12:17:51 -0700 (PDT) X-Barracuda-Envelope-From: pro-surface-saver-xfs=oss.sgi.com@grateececi.com X-Barracuda-Apparent-Source-IP: 103.200.108.249 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=dkim; d=grateececi.com; h=Date:From:To:Subject:MIME-Version:Content-Type:Message-ID; i=pro-surface-saver@grateececi.com; bh=uxUW+hro4MV/++guvMqJhVXRhk8=; b=knJn7Mw6PqleV/kBQI/Z8P7aSJhCQcrl8qNltDhO22/wCU5qeXs1lUauifjU+GlGd9nahotUsJ+u DghdHSfmOP+Y5v7jy1vvbX0dC3ggeJwZ3nG1e87/nTC8PBPbtTsZ0oRd8JaYCQX9NoKtYp27ljn/ Sad5jJjmmjOR0DXQ2ds= DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=dkim; d=grateececi.com; b=AdAejPwywsqDXTIxd2mWKy2xTYoUpenoeUujXDAUZzGTSdxIkuOnofB24+Dy/rkwyPHYnXrA/b5w IucvNDSaSQ5cpTCL8uDsuCt+imjJOOABVZgusfHklpE9PP/0swrQhiOkzMf1jXjcuBOlv2qYb+T2 1nYtmgfP0ZzswGtnKq8=; Received: by mail.grateececi.com id h0aupa0001g7 for ; Mon, 4 Apr 2016 14:11:36 -0500 (envelope-from ) Date: Mon, 4 Apr 2016 14:11:36 -0500 From: "Pro Surface Saver" To: Subject: Spring Special on Surface Coatings MIME-Version: 1.0 X-ASG-Orig-Subj: Spring Special on Surface Coatings Content-Type: multipart/alternative; boundary="----=_Part_427_112810899.1459796683055" Message-ID: <0.0.0.2F.1D18EA5CF16FBEE.157876@mail.grateececi.com> X-Barracuda-Connect: UNKNOWN[103.200.108.249] X-Barracuda-Start-Time: 1459797471 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28453 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 ------=_Part_427_112810899.1459796683055 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Spring Special on Surface Coatings http://www.grateececi.com/yellow/tree/829I8r64mf0fZsnFjnn0ntv0Mjh509 Update Preferences- http://www.grateececi.com/green/mean/3d3r8B64pf14VZsnFjnn0ntv0Mjh7bc ------=_Part_427_112810899.1459796683055 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit

Spring Special on Surface Coatings

 
Protect your investment with ProSurfaceSaver - an easy to use, industrial strength DIY  sealant for wood, concrete and metal surfaces.
Click here for your free quote. 

  Click Here to Protect your Surfaces - Free Quote

Commercial, Residential &   Industrial Applications

ProSurfaceSaver sealants are able to coat, protect, and restore almost any wood, concrete or metal surface.

  -Use on your garage floor or basement

          - Works great on metal roofs

      - Coat and protect your driveway

      - Excellent for warehouse and industrial facilities

    Click Here to get a free quote for your project

 

Questions?  Concerns? Write to us at:  1930 Village Center Circle #3-3787
Las Vegas, NV 89134.


Update Preferences.

© 2016 ProSurfaceSaver. All rights reserved.










 


------=_Part_427_112810899.1459796683055-- From dave@fromorbit.com Tue Apr 5 01:06:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 55C6D7CA0 for ; Tue, 5 Apr 2016 01:06:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C9E75AC002 for ; Mon, 4 Apr 2016 23:06:33 -0700 (PDT) X-ASG-Debug-ID: 1459836390-04bdf01102230210001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 7TJG3PDqGvMDs1MG for ; Mon, 04 Apr 2016 23:06:31 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2C7CgBLVQNXPDGaLHldgzeBUIZqoDIBBpF4i1NNAQEBAQEBBwEBAQFCQIRCAQUnLzMIGDE5AwcUGYgmvzeFWIodhQoFmAGOCo8NjxqCGAELgjcqMIgmAQEB Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail04.adl6.internode.on.net with ESMTP; 05 Apr 2016 15:35:46 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1anK7T-000151-Qi for xfs@oss.sgi.com; Tue, 05 Apr 2016 16:05:43 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1anK6z-0003aW-F3 for xfs@oss.sgi.com; Tue, 05 Apr 2016 16:05:13 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/4] xfs: Don't wrap growfs AGFL indexes Date: Tue, 5 Apr 2016 16:05:07 +1000 X-ASG-Orig-Subj: [PATCH 1/4] xfs: Don't wrap growfs AGFL indexes Message-Id: <1459836310-12619-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1459836310-12619-1-git-send-email-david@fromorbit.com> References: <1459836310-12619-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1459836390 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28467 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Commit 96f859d ("libxfs: pack the agfl header structure so XFS_AGFL_SIZE is correct") allowed the freelist to use the empty slot at the end of the freelist on 64 bit systems that was not being used due to sizeof() rounding up the structure size. This has caused versions of xfs_repair prior to 4.5.0 (which also has the fix) to report this as a corruption once the filesystem has been grown. Older kernels can also have problems (seen from a whacky container/vm management environment) mounting filesystems grown on a system with a newer kernel than the vm/container it is deployed on. To avoid this problem, change the initial free list indexes not to wrap across the end of the AGFL, hence avoiding the initialisation of agf_fllast to the last index in the AGFL. cc: # 4.4-4.5 Signed-off-by: Dave Chinner --- fs/xfs/xfs_fsops.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index ee3aaa0a..ca0d3eb 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -243,8 +243,8 @@ xfs_growfs_data_private( agf->agf_roots[XFS_BTNUM_CNTi] = cpu_to_be32(XFS_CNT_BLOCK(mp)); agf->agf_levels[XFS_BTNUM_BNOi] = cpu_to_be32(1); agf->agf_levels[XFS_BTNUM_CNTi] = cpu_to_be32(1); - agf->agf_flfirst = 0; - agf->agf_fllast = cpu_to_be32(XFS_AGFL_SIZE(mp) - 1); + agf->agf_flfirst = cpu_to_be32(1); + agf->agf_fllast = 0; agf->agf_flcount = 0; tmpsize = agsize - XFS_PREALLOC_BLOCKS(mp); agf->agf_freeblks = cpu_to_be32(tmpsize); -- 2.7.0 From dave@fromorbit.com Tue Apr 5 01:06:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4D06E7CA0 for ; Tue, 5 Apr 2016 01:06:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DE9578F8033 for ; Mon, 4 Apr 2016 23:06:35 -0700 (PDT) X-ASG-Debug-ID: 1459836390-04bdf01102230210002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id riuDwchNoia5VzRi for ; Mon, 04 Apr 2016 23:06:32 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2C7CgBLVQNXPDGaLHlVCIM3gVCGaqAyAQaReItTTQEBAQEBAQcBAQEBQkCEQgEFJy8zCBgxOQMHFBmIJr83hViJLYV6BYdvkBKIZYUljw2PGoIYAQuCNyowiCYBAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail04.adl6.internode.on.net with ESMTP; 05 Apr 2016 15:35:46 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1anK7T-000154-S2 for xfs@oss.sgi.com; Tue, 05 Apr 2016 16:05:43 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1anK6z-0003al-GK for xfs@oss.sgi.com; Tue, 05 Apr 2016 16:05:13 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/4] xfs: reduce lock hold times in buffer writeback Date: Tue, 5 Apr 2016 16:05:10 +1000 X-ASG-Orig-Subj: [PATCH 4/4] xfs: reduce lock hold times in buffer writeback Message-Id: <1459836310-12619-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1459836310-12619-1-git-send-email-david@fromorbit.com> References: <1459836310-12619-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1459836392 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28467 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When we have a lot of metadata to flush from the AIL, the buffer list can get very long. The current submission code tries to batch submission to optimise IO order of the metadata (i.e. ascending block order) to maximise block layer merging or IO to adjacent metadata blocks. Unfortunately, the method used can result in long lock times occurring as buffers locked early on in the buffer list might not be dispatched until the end of the IO licst processing. This is because sorting does not occur util after the buffer list has been processed and the buffers that are going to be submitted are locked. Hence when the buffer list is several thousand buffers long, the lock hold times before IO dispatch can be significant. To fix this, sort the buffer list before we start trying to lock and submit buffers. This means we can now submit buffers immediately after they are locked, allowing merging to occur immediately on the plug and dispatch to occur as quickly as possible. This means there is minimal delay between locking the buffer and IO submission occuring, hence reducing the worst case lock hold times seen during delayed write buffer IO submission signficantly. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf.c | 60 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 467a636..0d49e81 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1780,18 +1780,33 @@ xfs_buf_cmp( return 0; } +/* + * submit buffers for write. + * + * When we have a large buffer list, we do not want to hold all the buffers + * locked while we block on the request queue waiting for IO dispatch. To avoid + * this problem, we lock and submit buffers in groups of 50, thereby minimising + * the lock hold times for lists which may contain thousands of objects. + * + * To do this, we sort the buffer list before we walk the list to lock and + * submit buffers, and we plug and unplug around each group of buffers we + * submit. + */ static int -__xfs_buf_delwri_submit( +xfs_buf_delwri_submit_buffers( struct list_head *buffer_list, - struct list_head *io_list, - bool wait) + struct list_head *wait_list) { - struct blk_plug plug; struct xfs_buf *bp, *n; + LIST_HEAD (submit_list); int pinned = 0; + struct blk_plug plug; + + list_sort(NULL, buffer_list, xfs_buf_cmp); + blk_start_plug(&plug); list_for_each_entry_safe(bp, n, buffer_list, b_list) { - if (!wait) { + if (!wait_list) { if (xfs_buf_ispinned(bp)) { pinned++; continue; @@ -1814,25 +1829,21 @@ __xfs_buf_delwri_submit( continue; } - list_move_tail(&bp->b_list, io_list); trace_xfs_buf_delwri_split(bp, _RET_IP_); - } - - list_sort(NULL, io_list, xfs_buf_cmp); - - blk_start_plug(&plug); - list_for_each_entry_safe(bp, n, io_list, b_list) { - bp->b_flags &= ~(_XBF_DELWRI_Q | XBF_ASYNC | XBF_WRITE_FAIL); - bp->b_flags |= XBF_WRITE | XBF_ASYNC; /* - * we do all Io submission async. This means if we need to wait - * for IO completion we need to take an extra reference so the - * buffer is still valid on the other side. + * We do all IO submission async. This means if we need + * to wait for IO completion we need to take an extra + * reference so the buffer is still valid on the other + * side. We need to move the buffer onto the io_list + * at this point so the caller can still access it. */ - if (wait) + bp->b_flags &= ~(_XBF_DELWRI_Q | XBF_ASYNC | XBF_WRITE_FAIL); + bp->b_flags |= XBF_WRITE | XBF_ASYNC; + if (wait_list) { xfs_buf_hold(bp); - else + list_move_tail(&bp->b_list, wait_list); + } else list_del_init(&bp->b_list); xfs_buf_submit(bp); @@ -1855,8 +1866,7 @@ int xfs_buf_delwri_submit_nowait( struct list_head *buffer_list) { - LIST_HEAD (io_list); - return __xfs_buf_delwri_submit(buffer_list, &io_list, false); + return xfs_buf_delwri_submit_buffers(buffer_list, NULL); } /* @@ -1871,15 +1881,15 @@ int xfs_buf_delwri_submit( struct list_head *buffer_list) { - LIST_HEAD (io_list); + LIST_HEAD (wait_list); int error = 0, error2; struct xfs_buf *bp; - __xfs_buf_delwri_submit(buffer_list, &io_list, true); + xfs_buf_delwri_submit_buffers(buffer_list, &wait_list); /* Wait for IO to complete. */ - while (!list_empty(&io_list)) { - bp = list_first_entry(&io_list, struct xfs_buf, b_list); + while (!list_empty(&wait_list)) { + bp = list_first_entry(&wait_list, struct xfs_buf, b_list); list_del_init(&bp->b_list); -- 2.7.0 From dave@fromorbit.com Tue Apr 5 01:06:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A70C97CA1 for ; Tue, 5 Apr 2016 01:06:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 700CC304039 for ; Mon, 4 Apr 2016 23:06:39 -0700 (PDT) X-ASG-Debug-ID: 1459836395-04cb6c2460294260001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id miBAWvALnCC5jmCU for ; Mon, 04 Apr 2016 23:06:35 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2C9CgBLVQNXPDGaLHldgzeBUIZqoDIBBpF4ihyBN00BAQEBAQEHAQEBAUJAhEIBBScvFgoTCBgYGTkDBxQZG4gLvzeFWIk7QhOFFwWHb5ASjgqBZo0nhhqJAIIYAQsBQRmBXCowhmqBPAEBAQ Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail04.adl6.internode.on.net with ESMTP; 05 Apr 2016 15:35:46 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1anK7T-000152-R9 for xfs@oss.sgi.com; Tue, 05 Apr 2016 16:05:43 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1anK6z-0003ab-FS for xfs@oss.sgi.com; Tue, 05 Apr 2016 16:05:13 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/4] xfs: allocate log vector buffers outside CIL context lock Date: Tue, 5 Apr 2016 16:05:08 +1000 X-ASG-Orig-Subj: [PATCH 2/4] xfs: allocate log vector buffers outside CIL context lock Message-Id: <1459836310-12619-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1459836310-12619-1-git-send-email-david@fromorbit.com> References: <1459836310-12619-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1459836395 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28467 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner One of the problems we currently have with delayed logging is that under serious memory pressure we can deadlock memory reclaim. THis occurs when memory reclaim (such as run by kswapd) is reclaiming XFS inodes and issues a log force to unpin inodes that are dirty in the CIL. The CIL is pushed, but this will only occur once it gets the CIL context lock to ensure that all committing transactions are complete and no new transactions start being committed to the CIL while the push switches to a new context. The deadlock occurs when the CIL context lock is held by a committing process that is doing memory allocation for log vector buffers, and that allocation is then blocked on memory reclaim making progress. Memory reclaim, however, is blocked waiting for a log force to make progress, and so we effectively deadlock at this point. To solve this problem, we have to move the CIL log vector buffer allocation outside of the context lock so that memory reclaim can always make progress when it needs to force the log. The problem with doing this is that a CIL push can take place while we are determining if we need to allocate a new log vector buffer for an item and hence the current log vector may go away without warning. That means we canot rely on the existing log vector being present when we finally grab the context lock and so we must have a replacement buffer ready to go at all times. To ensure this, introduce a "shadow log vector" buffer that is always guaranteed to be present when we gain the CIL context lock and format the item. This shadow buffer may or may not be used during the formatting, but if the log item does not have an existing log vector buffer or that buffer is too small for the new modifications, we swap it for the new shadow buffer and format the modifications into that new log vector buffer. The result of this is that for any object we modify more than once in a given CIL checkpoint, we double the memory required to track dirty regions in the log. For single modifications then we consume the shadow log vectorwe allocate on commit, and that gets consumed by the checkpoint. However, if we make multiple modifications, then the second transaction commit will allocate a shadow log vector and hence we will end up with double the memory usage as only one of the log vectors is consumed by the CIL checkpoint. The remaining shadow vector will be freed when th elog item is freed. This can probably be optimised in future - access to the shadow log vector is serialised by the object lock (as opposited to the active log vector, which is controlled by the CIL context lock) and so we can probably free shadow log vector from some objects when the log item is marked clean on removal from the AIL. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf_item.c | 1 + fs/xfs/xfs_dquot.c | 1 + fs/xfs/xfs_dquot_item.c | 2 + fs/xfs/xfs_extfree_item.c | 2 + fs/xfs/xfs_inode_item.c | 1 + fs/xfs/xfs_log_cil.c | 258 ++++++++++++++++++++++++++++++++++------------ fs/xfs/xfs_trans.h | 1 + 7 files changed, 202 insertions(+), 64 deletions(-) diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index d613e7f..55b5ad0 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -949,6 +949,7 @@ xfs_buf_item_free( xfs_buf_log_item_t *bip) { xfs_buf_item_free_format(bip); + kmem_free(bip->bli_item.li_lv_shadow); kmem_zone_free(xfs_buf_item_zone, bip); } diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 8f51370..df4a70a 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -74,6 +74,7 @@ xfs_qm_dqdestroy( { ASSERT(list_empty(&dqp->q_lru)); + kmem_free(dqp->q_logitem.qli_item.li_lv_shadow); mutex_destroy(&dqp->q_qlock); XFS_STATS_DEC(dqp->q_mount, xs_qm_dquot); diff --git a/fs/xfs/xfs_dquot_item.c b/fs/xfs/xfs_dquot_item.c index 814cff9..2c7a162 100644 --- a/fs/xfs/xfs_dquot_item.c +++ b/fs/xfs/xfs_dquot_item.c @@ -370,6 +370,8 @@ xfs_qm_qoffend_logitem_committed( spin_lock(&ailp->xa_lock); xfs_trans_ail_delete(ailp, &qfs->qql_item, SHUTDOWN_LOG_IO_ERROR); + kmem_free(qfs->qql_item.li_lv_shadow); + kmem_free(lip->li_lv_shadow); kmem_free(qfs); kmem_free(qfe); return (xfs_lsn_t)-1; diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index 4aa0153..ab77946 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -40,6 +40,7 @@ void xfs_efi_item_free( struct xfs_efi_log_item *efip) { + kmem_free(efip->efi_item.li_lv_shadow); if (efip->efi_format.efi_nextents > XFS_EFI_MAX_FAST_EXTENTS) kmem_free(efip); else @@ -300,6 +301,7 @@ static inline struct xfs_efd_log_item *EFD_ITEM(struct xfs_log_item *lip) STATIC void xfs_efd_item_free(struct xfs_efd_log_item *efdp) { + kmem_free(efdp->efd_item.li_lv_shadow); if (efdp->efd_format.efd_nextents > XFS_EFD_MAX_FAST_EXTENTS) kmem_free(efdp); else diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index d02cbab..77799e1 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -651,6 +651,7 @@ void xfs_inode_item_destroy( xfs_inode_t *ip) { + kmem_free(ip->i_itemp->ili_item.li_lv_shadow); kmem_zone_free(xfs_ili_zone, ip->i_itemp); } diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index 4e76493..ebb9ea9 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -79,6 +79,157 @@ xlog_cil_init_post_recovery( log->l_cilp->xc_ctx->sequence = 1; } +static inline int +xlog_cil_iovec_space( + uint niovecs) +{ + return round_up((sizeof(struct xfs_log_vec) + + niovecs * sizeof(struct xfs_log_iovec)), + sizeof(uint64_t)); +} + +/* + * Allocate or pin log vector buffers for CIL insertion. + * + * The CIL currently uses disposable buffers for copying a snapshot of the + * modified items into the log during a push. The biggest problem with this is + * the requirement to allocate the disposable buffer during the commit if: + * a) does not exist; or + * b) it is too small + * + * If we do this allocation within xlog_cil_insert_format_items(), it is done + * under the xc_ctx_lock, which means that a CIL push cannot occur during + * the memory allocation. This means that we have a potential deadlock situation + * under low memory conditions when we have lots of dirty metadata pinned in + * the CIL and we need a CIL commit to occur to free memory. + * + * To avoid this, we need to move the memory allocation outside the + * xc_ctx_lock(), but because the log vector buffers are disposable, that opens + * up a TOCTOU race condition w.r.t. the CIL commiting and removing the log + * vector buffers between the check and the formatting of the item into the + * log vector buffer within the xc_ctx_lock. + * + * Because the log vector buffer needs to be unchanged during the CIL push + * process, we cannot share the buffer between the transaction commit (which + * modifies the buffer) and the CIL push context that is writing the changes + * into the log. This means skipping preallocation of buffer space is + * unreliable, but we most definitely do not want to be allocating and freeing + * buffers unnecessarily during commits when overwrites can be done safely. + * + * The simplest solution to this problem is to allocate a shadow buffer when a + * log item is committed for the second time, and then to only use this buffer + * if necessary. The buffer can remain attached to the log item until such time + * it is needed, and this is the buffer that is reallocated to match the size of + * the incoming modification. Then during the formatting of the item we can swap + * the active buffer with the new one if we can't reuse the existing buffer. We + * don't free the old buffer as it may be reused on the next modification if + * it's size is right, otherwise we'll free and reallocate it at that point. + * + * This function builds a vector for the changes in each log item in the + * transaction. It then works out the length of the buffer needed for each log + * item, allocates them and attaches the vector to the log item in preparation + * for the formatting step which occurs under the xc_ctx_lock. + * + * While this means the memory footprint goes up, it avoids the repeated + * alloc/free pattern that repeated modifications of an item would otherwise + * cause, and hence minimises the CPU overhead of such behaviour. + */ +static void +xlog_cil_alloc_shadow_bufs( + struct xlog *log, + struct xfs_trans *tp) +{ + struct xfs_log_item_desc *lidp; + + list_for_each_entry(lidp, &tp->t_items, lid_trans) { + struct xfs_log_item *lip = lidp->lid_item; + struct xfs_log_vec *lv; + int niovecs = 0; + int nbytes = 0; + int buf_size; + bool ordered = false; + + /* Skip items which aren't dirty in this transaction. */ + if (!(lidp->lid_flags & XFS_LID_DIRTY)) + continue; + + /* get number of vecs and size of data to be stored */ + lip->li_ops->iop_size(lip, &niovecs, &nbytes); + + /* + * Ordered items need to be tracked but we do not wish to write + * them. We need a logvec to track the object, but we do not + * need an iovec or buffer to be allocated for copying data. + */ + if (niovecs == XFS_LOG_VEC_ORDERED) { + ordered = true; + niovecs = 0; + nbytes = 0; + } + + /* + * We 64-bit align the length of each iovec so that the start + * of the next one is naturally aligned. We'll need to + * account for that slack space here. Then round nbytes up + * to 64-bit alignment so that the initial buffer alignment is + * easy to calculate and verify. + */ + nbytes += niovecs * sizeof(uint64_t); + nbytes = round_up(nbytes, sizeof(uint64_t)); + + /* + * The data buffer needs to start 64-bit aligned, so round up + * that space to ensure we can align it appropriately and not + * overrun the buffer. + */ + buf_size = nbytes + xlog_cil_iovec_space(niovecs); + + /* + * if we have no shadow buffer, or it is too small, we need to + * reallocate it. + */ + if (!lip->li_lv_shadow || + buf_size > lip->li_lv_shadow->lv_size) { + + /* + * We free and allocate here as a realloc would copy + * unecessary data. We don't use kmem_zalloc() for the + * same reason - we don't need to zero the data area in + * the buffer, only the log vector header and the iovec + * storage. + */ + kmem_free(lip->li_lv_shadow); + + lv = kmem_alloc(buf_size, KM_SLEEP|KM_NOFS); + memset(lv, 0, xlog_cil_iovec_space(niovecs)); + + lv->lv_item = lip; + lv->lv_size = buf_size; + if (ordered) + lv->lv_buf_len = XFS_LOG_VEC_ORDERED; + else + lv->lv_iovecp = (struct xfs_log_iovec *)&lv[1]; + lip->li_lv_shadow = lv; + } else { + /* same or smaller, optimise common overwrite case */ + lv = lip->li_lv_shadow; + if (ordered) + lv->lv_buf_len = XFS_LOG_VEC_ORDERED; + else + lv->lv_buf_len = 0; + lv->lv_bytes = 0; + lv->lv_next = NULL; + } + + /* Ensure the lv is set up according to ->iop_size */ + lv->lv_niovecs = niovecs; + + /* The allocated data region lies beyond the iovec region */ + lv->lv_buf = (char *)lv + xlog_cil_iovec_space(niovecs); + } + +} + /* * Prepare the log item for insertion into the CIL. Calculate the difference in * log space and vectors it will consume, and if it is a new item pin it as @@ -101,16 +252,19 @@ xfs_cil_prepare_item( /* * If there is no old LV, this is the first time we've seen the item in * this CIL context and so we need to pin it. If we are replacing the - * old_lv, then remove the space it accounts for and free it. + * old_lv, then remove the space it accounts for and make it the shadow + * buffer for later freeing. In both cases we are now switching to the + * shadow buffer, so update the the pointer to it appropriately. */ - if (!old_lv) + if (!old_lv) { lv->lv_item->li_ops->iop_pin(lv->lv_item); - else if (old_lv != lv) { + lv->lv_item->li_lv_shadow = NULL; + } else if (old_lv != lv) { ASSERT(lv->lv_buf_len != XFS_LOG_VEC_ORDERED); *diff_len -= old_lv->lv_bytes; *diff_iovecs -= old_lv->lv_niovecs; - kmem_free(old_lv); + lv->lv_item->li_lv_shadow = old_lv; } /* attach new log vector to log item */ @@ -134,11 +288,13 @@ xfs_cil_prepare_item( * write it out asynchronously without needing to relock the object that was * modified at the time it gets written into the iclog. * - * This function builds a vector for the changes in each log item in the - * transaction. It then works out the length of the buffer needed for each log - * item, allocates them and formats the vector for the item into the buffer. - * The buffer is then attached to the log item are then inserted into the - * Committed Item List for tracking until the next checkpoint is written out. + * This function takes the prepared log vectors attached to each log item, and + * formats the changes into the log vector buffer. The buffer it uses is + * dependent on the current state of the vector in the CIL - the shadow lv is + * guaranteed to be large enough for the current modification, but we will only + * use that if we can't reuse the existing lv. If we can't reuse the existing + * lv, then simple swap it out for the shadow lv. We don't free it - that is + * done lazily either by th enext modification or the freeing of the log item. * * We don't set up region headers during this process; we simply copy the * regions into the flat buffer. We can do this because we still have to do a @@ -171,59 +327,29 @@ xlog_cil_insert_format_items( list_for_each_entry(lidp, &tp->t_items, lid_trans) { struct xfs_log_item *lip = lidp->lid_item; struct xfs_log_vec *lv; - struct xfs_log_vec *old_lv; - int niovecs = 0; - int nbytes = 0; - int buf_size; + struct xfs_log_vec *old_lv = NULL; + struct xfs_log_vec *shadow; bool ordered = false; /* Skip items which aren't dirty in this transaction. */ if (!(lidp->lid_flags & XFS_LID_DIRTY)) continue; - /* get number of vecs and size of data to be stored */ - lip->li_ops->iop_size(lip, &niovecs, &nbytes); - - /* Skip items that do not have any vectors for writing */ - if (!niovecs) - continue; - /* - * Ordered items need to be tracked but we do not wish to write - * them. We need a logvec to track the object, but we do not - * need an iovec or buffer to be allocated for copying data. + * The formatting size information is already attached to + * the shadow lv on the log item. */ - if (niovecs == XFS_LOG_VEC_ORDERED) { + shadow = lip->li_lv_shadow; + if (shadow->lv_buf_len == XFS_LOG_VEC_ORDERED) ordered = true; - niovecs = 0; - nbytes = 0; - } - /* - * We 64-bit align the length of each iovec so that the start - * of the next one is naturally aligned. We'll need to - * account for that slack space here. Then round nbytes up - * to 64-bit alignment so that the initial buffer alignment is - * easy to calculate and verify. - */ - nbytes += niovecs * sizeof(uint64_t); - nbytes = round_up(nbytes, sizeof(uint64_t)); - - /* grab the old item if it exists for reservation accounting */ - old_lv = lip->li_lv; - - /* - * The data buffer needs to start 64-bit aligned, so round up - * that space to ensure we can align it appropriately and not - * overrun the buffer. - */ - buf_size = nbytes + - round_up((sizeof(struct xfs_log_vec) + - niovecs * sizeof(struct xfs_log_iovec)), - sizeof(uint64_t)); + /* Skip items that do not have any vectors for writing */ + if (!shadow->lv_niovecs && !ordered) + continue; /* compare to existing item size */ - if (lip->li_lv && buf_size <= lip->li_lv->lv_size) { + old_lv = lip->li_lv; + if (lip->li_lv && shadow->lv_size <= lip->li_lv->lv_size) { /* same or smaller, optimise common overwrite case */ lv = lip->li_lv; lv->lv_next = NULL; @@ -237,32 +363,29 @@ xlog_cil_insert_format_items( */ *diff_iovecs -= lv->lv_niovecs; *diff_len -= lv->lv_bytes; + + /* Ensure the lv is set up according to ->iop_size */ + lv->lv_niovecs = shadow->lv_niovecs; + + /* reset the lv buffer information for new formatting */ + lv->lv_buf_len = 0; + lv->lv_bytes = 0; + lv->lv_buf = (char *)lv + + xlog_cil_iovec_space(lv->lv_niovecs); } else { - /* allocate new data chunk */ - lv = kmem_zalloc(buf_size, KM_SLEEP|KM_NOFS); + /* switch to shadow buffer! */ + lv = shadow; lv->lv_item = lip; - lv->lv_size = buf_size; if (ordered) { /* track as an ordered logvec */ ASSERT(lip->li_lv == NULL); - lv->lv_buf_len = XFS_LOG_VEC_ORDERED; goto insert; } - lv->lv_iovecp = (struct xfs_log_iovec *)&lv[1]; } - /* Ensure the lv is set up according to ->iop_size */ - lv->lv_niovecs = niovecs; - - /* The allocated data region lies beyond the iovec region */ - lv->lv_buf_len = 0; - lv->lv_bytes = 0; - lv->lv_buf = (char *)lv + buf_size - nbytes; ASSERT(IS_ALIGNED((unsigned long)lv->lv_buf, sizeof(uint64_t))); - lip->li_ops->iop_format(lip, lv); insert: - ASSERT(lv->lv_buf_len <= nbytes); xfs_cil_prepare_item(log, lv, old_lv, diff_len, diff_iovecs); } } @@ -784,6 +907,13 @@ xfs_log_commit_cil( struct xlog *log = mp->m_log; struct xfs_cil *cil = log->l_cilp; + /* + * Do all necessary memory allocation before we lock the CIL. + * This ensures the allocation does not deadlock with a CIL + * push in memory reclaim (e.g. from kswapd). + */ + xlog_cil_alloc_shadow_bufs(log, tp); + /* lock out background commit */ down_read(&cil->xc_ctx_lock); diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index e7c49cf..be7b8e1 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -52,6 +52,7 @@ typedef struct xfs_log_item { /* delayed logging */ struct list_head li_cil; /* CIL pointers */ struct xfs_log_vec *li_lv; /* active log vector */ + struct xfs_log_vec *li_lv_shadow; /* standby vector */ xfs_lsn_t li_seq; /* CIL commit seq */ } xfs_log_item_t; -- 2.7.0 From dave@fromorbit.com Tue Apr 5 01:06:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8CF087CA6 for ; Tue, 5 Apr 2016 01:06:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3CE03304039 for ; Mon, 4 Apr 2016 23:06:37 -0700 (PDT) X-ASG-Debug-ID: 1459836390-04bdf01102230210003-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id zq7nHpEmVmR6Fxpx for ; Mon, 04 Apr 2016 23:06:35 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2C3CgBLVQNXPDGaLHlVCIM3iDqgMgEGkXiLU00BAQEBAQEHAQEBAUJAhR47gQIDB4hTnUqhbYVYiS1whQoFkxiEaYhlhSWPDY8aghgBCwGCNiqIVgEBAQ Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail04.adl6.internode.on.net with ESMTP; 05 Apr 2016 15:35:46 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1anK7T-000150-QL for xfs@oss.sgi.com; Tue, 05 Apr 2016 16:05:43 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1anK6z-0003aT-EU for xfs@oss.sgi.com; Tue, 05 Apr 2016 16:05:13 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/4] xfs: various fixes Date: Tue, 5 Apr 2016 16:05:06 +1000 X-ASG-Orig-Subj: [PATCH 0/4] xfs: various fixes Message-Id: <1459836310-12619-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1459836394 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28467 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, The following series of patches are all standalone fixes for various issues that have been reported by users. The first AGFL fix is a recent regression, which the other three address long standing issues. The second patch addresses the issue of memory allocation occurring under the CIL lock and memory reclaim requiring the CIL lock to be taken, resulting in deadlocks in extreme low memory conditions. This version has minor changes around the way the shadow buffer is allocated and initialised, but is otherwise mostly unchanged from previous RFC postings. The third patch addresses the excessive CPU overhead of bitmap based dirty buffer range tracking on large block sizes. It keeps a small number of ranges per buffer, and extends and merges them as appropriate. This completely removes the bitmap overhead from the buffer item formatting path. This main change in this patch from previous RFC postings is that it uses multiple ranges for tracking rather than a single range. I decided on 4 discrete ranges as the best tradeoff between efficiency and log space requirements. THe last patch addresses a buffer hold-off when there is lots of dirty metadata beign written back from the AIL. If a buffer at the tail of the log is at a very high offset in the filesytem (e.g. AGF header in the last AG), it could be locked for a long time while we wait for IO to lower offsets to be dispatched. IO dispatch gets blocked by device congestion, so in the worst case lock hold-offs measured in seconds have been recorded. This change sorts the buffer list into offset order before we lock any buffers, and then dispatches IO as each buffer is successfully locked. This limits lock holds to the length of time a buffer sits on the plug plus the IO time, which is usually very short. This means frequently used buffers can be locked and relogged while we wait for IO dispatch rather than blocking attempts to access the buffer. Comments, thoughts, etc all welcome. Cheers, Dave. From dave@fromorbit.com Tue Apr 5 01:06:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D29D57CA7 for ; Tue, 5 Apr 2016 01:06:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 61BF6304053 for ; Mon, 4 Apr 2016 23:06:37 -0700 (PDT) X-ASG-Debug-ID: 1459836393-04bdf01104230220001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 6A1T8rTutSYtADId for ; Mon, 04 Apr 2016 23:06:33 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2C7CgBLVQNXPDGaLHldgzeBUIZqoDIBBpF4i1NNAQEBAQEBBwEBAQFCQIRCAQUaDS8zCBgxOQMHFBAJiCa/N4VYjycFh2+QEohlhSWPDY8aghgBCwE+AxmBXCowiCYBAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail04.adl6.internode.on.net with ESMTP; 05 Apr 2016 15:35:46 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1anK7T-000153-Re for xfs@oss.sgi.com; Tue, 05 Apr 2016 16:05:43 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1anK6z-0003ag-Fs for xfs@oss.sgi.com; Tue, 05 Apr 2016 16:05:13 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/4] xfs: byte range buffer dirty region tracking Date: Tue, 5 Apr 2016 16:05:09 +1000 X-ASG-Orig-Subj: [PATCH 3/4] xfs: byte range buffer dirty region tracking Message-Id: <1459836310-12619-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1459836310-12619-1-git-send-email-david@fromorbit.com> References: <1459836310-12619-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1459836393 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28467 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The biggest problem with large directory block sizes is the CPU overhead in maintaining the buffer log item direty region bitmap. The bit manipulations and buffer region mapping calls are right at the top of the profiles when running tests on 64k directory buffers: + 16.65% [kernel] [k] memcpy + 11.99% [kernel] [k] xfs_next_bit + 5.87% [kernel] [k] xfs_buf_item_format + 5.85% [kernel] [k] xfs_buf_item_size_segment.isra.4 + 5.72% [kernel] [k] xfs_buf_offset The memcpy is the copying of the dirty regions into the log vec array, but almost twice as much CPU time is spent working out what needs to be copied and where it needs to be copied from. As a result, on a production kernel creating 100,000 entries in a 64k directory runs at about 9,000 files/s while on a 4k directory block size it runs at 19,000 files/s - about half the speed. Switching this to just track the first and last modified bytes in the block and only converting that to a dirty bitmap in the buffer log item at format time, however, gets rid of most of this dirty bitmap overhead without increasing memcpy time at all. the result is that peformance on a 64k directory block size increases to roughly 16,000 files/s with memcpy() overhead only slightly increasing. The profile now looks like: 10.41% [kernel] [k] __memcpy 0.42% [kernel] [k] xfs_buf_item_init 0.27% [kernel] [k] xfs_buf_item_size 0.21% [kernel] [k] xfs_buf_item_format_segment 0.15% [kernel] [k] xfs_buf_item_log And the majority of the memcpy load is coming from: - 9.43% 9.43% [kernel] [k] __memcpy - __memcpy + 95.63% xfs_buf_item_format_segment + 1.93% xfs_buf_item_format The buffer item formatting code. Hence we can see that there is major reduction in CPU overhead as well as an improvement in performance for 64k buffers with this change. The current implementation tracks, at most, four dirty regions per buffer. The nature of directory operations result in almost operation modifying a header in the buffer, a tail section in the buffer and then some number of bytes/regions in the middle of the buffer. Hence if we just track a single region, it will almost always cover the entire directory buffer - if we only modify a single entry in the buffer, then that's a fairly large cost in terms of log space and CPU overhead for random individual operations. We also have to consider non-directory buffer modification patterns. freespace, inode and extent btrees are the other major types of buffers that get logged, but they also have modification patterns that lend themselves well to a small number of ranges for dirty tracking. That is, each btree block is kept compact, so when we insert or remove a record or pointer we shift then higher records/ptrs up or down as a block, and then log the lot of them. And they also often have a header that is dirtied with each insert/delete, so typically there are usually only one or two dirty ranges in a btree block. The only metadata type that really seems to benefit from fine grained dirty range logging is the inode buffers. Specifically, for v4 superblocks the create transaction only dirties the regions of the inode core, so for 256 byte inodes only dirties every alternate bitmap segment. Dirty range tracking will double the required log bandwidth of inode buffers during create (roughly 25% increase on a 4k directory block size filesystem). There isn't any performance differential noticable on typical systems because the log is far from being bandwidth bound. For v5 filesystems, this isn't an issue because the initialised inode buffers are XFS_BLI_ORDERED buffers and so their contents aren't logged. The same problem happens with unlinks due to the unlinked list being logged via the inode buffer. Again this results in an increase in log bandwidth on both v4 and v5 filesystems, but there isn't any performance differential that occurs because, again, the log isn't bandwidth bound. As it is, there is an existing plan of improvement to the unlinked list logging (moving the unlinked list logging into the inode core transaction) and hence that will avoid any extra overhead here as well. Hence the overall CPU reduction benefits of minimal dirty range tracking versus fine grained dirty bit tracking are overall going to be beneficial to performance and throughput on current (v5) format filesystems. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf.c | 2 + fs/xfs/xfs_buf_item.c | 422 ++++++++++++++++++++++++++------------------------ fs/xfs/xfs_buf_item.h | 19 +++ 3 files changed, 244 insertions(+), 199 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 9a2191b..467a636 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1462,6 +1462,8 @@ xfs_buf_iomove( page = bp->b_pages[page_index]; csize = min_t(size_t, PAGE_SIZE - page_offset, BBTOB(bp->b_io_length) - boff); + if (boff + csize > bend) + csize = bend - boff; ASSERT((csize + page_offset) <= PAGE_SIZE); diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 55b5ad0..53fd2dc 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -65,50 +65,12 @@ xfs_buf_item_size_segment( int *nvecs, int *nbytes) { - struct xfs_buf *bp = bip->bli_buf; - int next_bit; - int last_bit; - - last_bit = xfs_next_bit(blfp->blf_data_map, blfp->blf_map_size, 0); - if (last_bit == -1) - return; - /* * initial count for a dirty buffer is 2 vectors - the format structure - * and the first dirty region. + * and the dirty region. Dirty region is accounted for separately. */ *nvecs += 2; - *nbytes += xfs_buf_log_format_size(blfp) + XFS_BLF_CHUNK; - - while (last_bit != -1) { - /* - * This takes the bit number to start looking from and - * returns the next set bit from there. It returns -1 - * if there are no more bits set or the start bit is - * beyond the end of the bitmap. - */ - next_bit = xfs_next_bit(blfp->blf_data_map, blfp->blf_map_size, - last_bit + 1); - /* - * If we run out of bits, leave the loop, - * else if we find a new set of bits bump the number of vecs, - * else keep scanning the current set of bits. - */ - if (next_bit == -1) { - break; - } else if (next_bit != last_bit + 1) { - last_bit = next_bit; - (*nvecs)++; - } else if (xfs_buf_offset(bp, next_bit * XFS_BLF_CHUNK) != - (xfs_buf_offset(bp, last_bit * XFS_BLF_CHUNK) + - XFS_BLF_CHUNK)) { - last_bit = next_bit; - (*nvecs)++; - } else { - last_bit++; - } - *nbytes += XFS_BLF_CHUNK; - } + *nbytes += xfs_buf_log_format_size(blfp); } /* @@ -135,7 +97,9 @@ xfs_buf_item_size( int *nbytes) { struct xfs_buf_log_item *bip = BUF_ITEM(lip); - int i; + struct xfs_buf *bp = bip->bli_buf; + uint offset; + int i, j; ASSERT(atomic_read(&bip->bli_refcount) > 0); if (bip->bli_flags & XFS_BLI_STALE) { @@ -154,6 +118,7 @@ xfs_buf_item_size( } ASSERT(bip->bli_flags & XFS_BLI_LOGGED); + ASSERT(bip->bli_flags & XFS_BLI_DIRTY); if (bip->bli_flags & XFS_BLI_ORDERED) { /* @@ -168,17 +133,45 @@ xfs_buf_item_size( /* * the vector count is based on the number of buffer vectors we have - * dirty bits in. This will only be greater than one when we have a + * dirty ranges in. This will only be greater than one when we have a * compound buffer with more than one segment dirty. Hence for compound - * buffers we need to track which segment the dirty bits correspond to, - * and when we move from one segment to the next increment the vector - * count for the extra buf log format structure that will need to be - * written. + * buffers we need to track which segment the dirty ranges correspond + * to, and when we move from one segment to the next increment the + * vector count for the extra buf log format structure that will need to + * be written. */ - for (i = 0; i < bip->bli_format_count; i++) { - xfs_buf_item_size_segment(bip, &bip->bli_formats[i], - nvecs, nbytes); + ASSERT(bip->bli_range[0].last != 0); + if (bip->bli_range[0].last == 0) { + /* clean! */ + ASSERT(bip->bli_range[0].first == 0); + return; } + + for (i = 0, offset = 0; + i < bip->bli_format_count; + i++, offset += BBTOB(bp->b_maps[i].bm_len)) { + /* Only format dirty regions */ + for (j = 0; j < bip->bli_ranges; j++) { + struct xfs_bli_range *rp = &bip->bli_range[j]; + + /* range ends before segment start, check next range */ + if (rp->last < offset) + continue; + + /* range beyond segment end, check next segment */ + if (rp->first > offset + BBTOB(bp->b_maps[i].bm_len)) + break; + + /* dirty range overlaps segment, need headers */ + xfs_buf_item_size_segment(bip, &bip->bli_formats[i], + nvecs, nbytes); + } + } + + for (j = 0; j < bip->bli_ranges; j++) + *nbytes += bip->bli_range[j].last - bip->bli_range[j].first; + + trace_xfs_buf_item_size(bip); } @@ -191,7 +184,6 @@ xfs_buf_item_copy_iovec( int first_bit, uint nbits) { - offset += first_bit * XFS_BLF_CHUNK; xlog_copy_iovec(lv, vecp, XLOG_REG_TYPE_BCHUNK, xfs_buf_offset(bp, offset), nbits * XFS_BLF_CHUNK); @@ -214,14 +206,18 @@ xfs_buf_item_format_segment( struct xfs_buf_log_item *bip, struct xfs_log_vec *lv, struct xfs_log_iovec **vecp, + struct xfs_bli_range *rp, uint offset, + uint length, struct xfs_buf_log_format *blfp) { struct xfs_buf *bp = bip->bli_buf; + char *buf; uint base_size; + uint start; + uint end; int first_bit; int last_bit; - int next_bit; uint nbits; /* copy the flags across from the base format item */ @@ -233,16 +229,6 @@ xfs_buf_item_format_segment( * memory structure. */ base_size = xfs_buf_log_format_size(blfp); - - first_bit = xfs_next_bit(blfp->blf_data_map, blfp->blf_map_size, 0); - if (!(bip->bli_flags & XFS_BLI_STALE) && first_bit == -1) { - /* - * If the map is not be dirty in the transaction, mark - * the size as zero and do not advance the vector pointer. - */ - return; - } - blfp = xlog_copy_iovec(lv, vecp, XLOG_REG_TYPE_BFORMAT, blfp, base_size); blfp->blf_size = 1; @@ -257,46 +243,40 @@ xfs_buf_item_format_segment( return; } + blfp->blf_size++; /* - * Fill in an iovec for each set of contiguous chunks. + * Now we need to set the bits in the bitmap and set up the iovecs + * appropriately. We know there is a contiguous range in this buffer + * than needs to be set, so find the first bit, the last bit, and + * go from there. */ - last_bit = first_bit; - nbits = 1; - for (;;) { - /* - * This takes the bit number to start looking from and - * returns the next set bit from there. It returns -1 - * if there are no more bits set or the start bit is - * beyond the end of the bitmap. - */ - next_bit = xfs_next_bit(blfp->blf_data_map, blfp->blf_map_size, - (uint)last_bit + 1); - /* - * If we run out of bits fill in the last iovec and get out of - * the loop. Else if we start a new set of bits then fill in - * the iovec for the series we were looking at and start - * counting the bits in the new one. Else we're still in the - * same set of bits so just keep counting and scanning. - */ - if (next_bit == -1) { - xfs_buf_item_copy_iovec(lv, vecp, bp, offset, - first_bit, nbits); - blfp->blf_size++; - break; - } else if (next_bit != last_bit + 1 || - xfs_buf_item_straddle(bp, offset, next_bit, last_bit)) { - xfs_buf_item_copy_iovec(lv, vecp, bp, offset, - first_bit, nbits); - blfp->blf_size++; - first_bit = next_bit; - last_bit = next_bit; - nbits = 1; - } else { - last_bit++; - nbits++; - } - } + start = 0; + if (offset < rp->first) + start = rp->first - offset; + end = length - 1; + if (offset + length > rp->last) + end = rp->last - offset - 1; + + start &= ~((1 << XFS_BLF_SHIFT) - 1); + first_bit = start >> XFS_BLF_SHIFT; + last_bit = end >> XFS_BLF_SHIFT; + nbits = last_bit - first_bit + 1; + bitmap_set((unsigned long *)blfp->blf_data_map, first_bit, nbits); + + ASSERT(end <= length); + ASSERT(start <= length); + ASSERT(length >= nbits * XFS_BLF_CHUNK); + /* + * Copy needs to be done a buffer page at a time as we can be logging + * unmapped buffers. hence we have to use xfs_buf_iomove() rather than a + * straight memcpy here. + */ + offset += first_bit * XFS_BLF_CHUNK; + length = nbits * XFS_BLF_CHUNK; + buf = xlog_prepare_iovec(lv, vecp, XLOG_REG_TYPE_BCHUNK); + xfs_buf_iomove(bp, offset, length, buf, XBRW_READ); + xlog_finish_iovec(lv, *vecp, length); } /* @@ -313,8 +293,8 @@ xfs_buf_item_format( struct xfs_buf_log_item *bip = BUF_ITEM(lip); struct xfs_buf *bp = bip->bli_buf; struct xfs_log_iovec *vecp = NULL; - uint offset = 0; - int i; + uint offset; + int i, j; ASSERT(atomic_read(&bip->bli_refcount) > 0); ASSERT((bip->bli_flags & XFS_BLI_LOGGED) || @@ -323,7 +303,6 @@ xfs_buf_item_format( (xfs_blft_from_flags(&bip->__bli_format) > XFS_BLFT_UNKNOWN_BUF && xfs_blft_from_flags(&bip->__bli_format) < XFS_BLFT_MAX_BUF)); - /* * If it is an inode buffer, transfer the in-memory state to the * format flags and clear the in-memory state. @@ -356,10 +335,37 @@ xfs_buf_item_format( return; } - for (i = 0; i < bip->bli_format_count; i++) { - xfs_buf_item_format_segment(bip, lv, &vecp, offset, - &bip->bli_formats[i]); - offset += bp->b_maps[i].bm_len; + for (i = 0, offset = 0; + i < bip->bli_format_count; + i++, offset += BBTOB(bp->b_maps[i].bm_len)) { + + /* stale regions cover the entire segment */ + if (bip->bli_flags & XFS_BLI_STALE) { + xfs_buf_item_format_segment(bip, lv, &vecp, NULL, offset, + BBTOB(bp->b_maps[i].bm_len), + &bip->bli_formats[i]); + continue; + } + + /* only format dirty ranges over the current segment */ + for (j = 0; j < bip->bli_ranges; j++) { + struct xfs_bli_range *rp = &bip->bli_range[j]; + + /* range ends before segment start, check next range */ + if (rp->last < offset) + continue; + + /* range beyond segment end, check next segment */ + if (rp->first > offset + BBTOB(bp->b_maps[i].bm_len)) + break; + + /* dirty range overlaps segment, need headers */ + xfs_buf_item_format_segment(bip, lv, &vecp, rp, offset, + BBTOB(bp->b_maps[i].bm_len), + &bip->bli_formats[i]); + + } + } /* @@ -800,6 +806,9 @@ xfs_buf_item_init( bip->bli_formats[i].blf_map_size = map_size; } + for (i = 0; i < XFS_BLI_RANGES; i++) + bip->bli_range[i].first = UINT_MAX; + /* * Put the buf item into the list of items attached to the * buffer at the front. @@ -811,124 +820,139 @@ xfs_buf_item_init( return 0; } - /* * Mark bytes first through last inclusive as dirty in the buf - * item's bitmap. + * record dirty regions on the buffer. */ -static void -xfs_buf_item_log_segment( +void +xfs_buf_item_log( + xfs_buf_log_item_t *bip, uint first, - uint last, - uint *map) + uint last) { - uint first_bit; - uint last_bit; - uint bits_to_set; - uint bits_set; - uint word_num; - uint *wordp; - uint bit; - uint end_bit; - uint mask; + struct xfs_bli_range *rp = NULL; + int i; - /* - * Convert byte offsets to bit numbers. - */ - first_bit = first >> XFS_BLF_SHIFT; - last_bit = last >> XFS_BLF_SHIFT; + ASSERT(last != 0); + ASSERT(first <= last); + ASSERT(last < BBTOB(bip->bli_buf->b_length)); - /* - * Calculate the total number of bits to be set. - */ - bits_to_set = last_bit - first_bit + 1; - /* - * Get a pointer to the first word in the bitmap - * to set a bit in. - */ - word_num = first_bit >> BIT_TO_WORD_SHIFT; - wordp = &map[word_num]; + /* simple case - first range being stored */ + if (!bip->bli_ranges) { + bip->bli_ranges = 1; + bip->bli_range[0].first = rounddown(first, XFS_BLF_CHUNK); + bip->bli_range[0].last = roundup(last, XFS_BLF_CHUNK); + ASSERT(bip->bli_range[0].last != 0); + ASSERT(bip->bli_range[0].first <= bip->bli_range[0].last); + return; + } - /* - * Calculate the starting bit in the first word. - */ - bit = first_bit & (uint)(NBWORD - 1); + /* 2nd case: search for overlaps and extend */ + for (i = 0; i < bip->bli_ranges; i++) { + rp = &bip->bli_range[i]; - /* - * First set any bits in the first word of our range. - * If it starts at bit 0 of the word, it will be - * set below rather than here. That is what the variable - * bit tells us. The variable bits_set tracks the number - * of bits that have been set so far. End_bit is the number - * of the last bit to be set in this word plus one. - */ - if (bit) { - end_bit = MIN(bit + bits_to_set, (uint)NBWORD); - mask = ((1 << (end_bit - bit)) - 1) << bit; - *wordp |= mask; - wordp++; - bits_set = end_bit - bit; - } else { - bits_set = 0; + /* wholly within an existing dirty range, we're done */ + if (first >= rp->first && last <= rp->last) + return; + + /* no overlap, continue */ + if (first > rp->last || last < rp->first) + continue; + + /* left edge overlap, extend */ + if (first < rp->first) + rp->first = rounddown(first, XFS_BLF_CHUNK); + + /* right edge overlap, extend */ + if (last > rp->last) + rp->last = roundup(last, XFS_BLF_CHUNK) - 1; + + goto merge; } + /* 3rd case: not found, insert or extend */ + ASSERT(i == bip->bli_ranges); + /* - * Now set bits a whole word at a time that are between - * first_bit and last_bit. + * Case 3a: Extend last slot. + * + * If the range is beyond the last slot, extend the last slot to + * cover it. This treated the same as if an overlap existed with + * the last range. */ - while ((bits_to_set - bits_set) >= NBWORD) { - *wordp |= 0xffffffff; - bits_set += NBWORD; - wordp++; + + if (i == XFS_BLI_RANGES) { + ASSERT(bip->bli_ranges == XFS_BLI_RANGES); + rp = &bip->bli_range[XFS_BLI_RANGES - 1]; + + if (first < rp->first) + rp->first = rounddown(first, XFS_BLF_CHUNK); + if (last > rp->last) + rp->last = roundup(last, XFS_BLF_CHUNK) - 1; + goto merge; } - /* - * Finally, set any bits left to be set in one last partial word. + /* Case 3b: insert new range. + * + * Find the insertion point for the new range, then make a hole + * and insert the new range. */ - end_bit = bits_to_set - bits_set; - if (end_bit) { - mask = (1 << end_bit) - 1; - *wordp |= mask; + for (i = 0; i < bip->bli_ranges; i++) { + rp = &bip->bli_range[i]; + + /* order ranges by ascending offset */ + if (last < rp->first) + break; } -} -/* - * Mark bytes first through last inclusive as dirty in the buf - * item's bitmap. - */ -void -xfs_buf_item_log( - xfs_buf_log_item_t *bip, - uint first, - uint last) -{ - int i; - uint start; - uint end; - struct xfs_buf *bp = bip->bli_buf; + /* shift down and insert */ + ASSERT(i < XFS_BLI_RANGES); + rp = &bip->bli_range[i]; + if (i < XFS_BLI_RANGES - 1) + memmove(rp + 1, rp, sizeof(*rp) * (bip->bli_ranges - i)); + bip->bli_ranges++; + rp->first = rounddown(first, XFS_BLF_CHUNK); + rp->last = roundup(last, XFS_BLF_CHUNK) - 1; +merge: /* - * walk each buffer segment and mark them dirty appropriately. + * Check for overlaping ranges and merge them. If there is only one + * range, there is nothing to merge so bail early. */ - start = 0; - for (i = 0; i < bip->bli_format_count; i++) { - if (start > last) - break; - end = start + BBTOB(bp->b_maps[i].bm_len); - if (first > end) { - start += BBTOB(bp->b_maps[i].bm_len); - continue; - } - if (first < start) - first = start; - if (end > last) - end = last; + if (bip->bli_ranges == 1) + return; - xfs_buf_item_log_segment(first, end, - &bip->bli_formats[i].blf_data_map[0]); + for (i = 0; i < bip->bli_ranges - 1; i++) { + struct xfs_bli_range *rp_next; - start += bp->b_maps[i].bm_len; + rp = &bip->bli_range[i]; + rp_next = &bip->bli_range[i + 1]; + + +check_merge: + ASSERT(rp->last != 0); + ASSERT(rp->first <= rp->last); + + /* no overlap or adjacent, move on */ + if (rp->last < rp_next->first - 1) + continue; + + /* + * overlap: select lowest first, highest last, remove the merged + * range (rp_next) and then go back and check the next range for + * whether it can be merged (e.g. we have 4 separate ranges, + * then something logs the buffer entirely. This merges all + * ranges into one). + */ + rp->first = min(rp->first, rp_next->first); + rp->last = max(rp->last, rp_next->last); + if (i + 2 < bip->bli_ranges) + memmove(rp_next, rp_next + 1, sizeof(*rp) * + (bip->bli_ranges - i - 2)); + bip->bli_ranges--; + if (i < bip->bli_ranges - 1) + goto check_merge; } } diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index f7eba99..16e8d31 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -57,6 +57,25 @@ typedef struct xfs_buf_log_item { unsigned int bli_recur; /* lock recursion count */ atomic_t bli_refcount; /* cnt of tp refs */ int bli_format_count; /* count of headers */ + + /* + * logging ranges. Keep a small number of distinct ranges rather than a + * bitmap which is expensive to maintain. + * 4 separate ranges s probably optimal so that we + * can log separate header, tail and content changes (e.g. for dir + * structures) without capturing the entire buffer unnecessarily for + * isolated changes. + * + * Note: ranges are 32 bit values because we have to support an end + * range value of 0x10000.... + */ +#define XFS_BLI_RANGES 4 + struct xfs_bli_range { + uint32_t first; + uint32_t last; + } bli_range[XFS_BLI_RANGES]; + int bli_ranges; + struct xfs_buf_log_format *bli_formats; /* array of in-log header ptrs */ struct xfs_buf_log_format __bli_format; /* embedded in-log header */ } xfs_buf_log_item_t; -- 2.7.0 From cmaiolino@redhat.com Tue Apr 5 05:42:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 78CA27CA0 for ; Tue, 5 Apr 2016 05:42:17 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 46A51304048 for ; Tue, 5 Apr 2016 03:42:14 -0700 (PDT) X-ASG-Debug-ID: 1459852932-04cbb07ad827c420001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 3nWgB7po9BnRcCP0 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 05 Apr 2016 03:42:13 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8CAB864380 for ; Tue, 5 Apr 2016 10:42:12 +0000 (UTC) Received: from redhat.com (gfs-i24c-02.mpc.lab.eng.bos.redhat.com [10.16.144.214]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u35AgAls014902 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 5 Apr 2016 06:42:12 -0400 Date: Tue, 5 Apr 2016 06:42:10 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfs: Don't wrap growfs AGFL indexes Message-ID: <20160405104210.GB55837@redhat.com> X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: Don't wrap growfs AGFL indexes Mail-Followup-To: xfs@oss.sgi.com References: <1459836310-12619-1-git-send-email-david@fromorbit.com> <1459836310-12619-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459836310-12619-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Tue, 05 Apr 2016 10:42:12 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1459852933 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Looks good to me, feel free to add Reviewed-by: Carlos Maiolino On Tue, Apr 05, 2016 at 04:05:07PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Commit 96f859d ("libxfs: pack the agfl header structure so > XFS_AGFL_SIZE is correct") allowed the freelist to use the empty > slot at the end of the freelist on 64 bit systems that was not > being used due to sizeof() rounding up the structure size. > > This has caused versions of xfs_repair prior to 4.5.0 (which also > has the fix) to report this as a corruption once the filesystem has > been grown. Older kernels can also have problems (seen from a whacky > container/vm management environment) mounting filesystems grown on a > system with a newer kernel than the vm/container it is deployed on. > > To avoid this problem, change the initial free list indexes not to > wrap across the end of the AGFL, hence avoiding the initialisation > of agf_fllast to the last index in the AGFL. > > cc: # 4.4-4.5 > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_fsops.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c > index ee3aaa0a..ca0d3eb 100644 > --- a/fs/xfs/xfs_fsops.c > +++ b/fs/xfs/xfs_fsops.c > @@ -243,8 +243,8 @@ xfs_growfs_data_private( > agf->agf_roots[XFS_BTNUM_CNTi] = cpu_to_be32(XFS_CNT_BLOCK(mp)); > agf->agf_levels[XFS_BTNUM_BNOi] = cpu_to_be32(1); > agf->agf_levels[XFS_BTNUM_CNTi] = cpu_to_be32(1); > - agf->agf_flfirst = 0; > - agf->agf_fllast = cpu_to_be32(XFS_AGFL_SIZE(mp) - 1); > + agf->agf_flfirst = cpu_to_be32(1); > + agf->agf_fllast = 0; > agf->agf_flcount = 0; > tmpsize = agsize - XFS_PREALLOC_BLOCKS(mp); > agf->agf_freeblks = cpu_to_be32(tmpsize); > -- > 2.7.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From apache@vps.com Tue Apr 5 07:53:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.0 required=5.0 tests=DEAR_SOMETHING,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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C53297CA0 for ; Tue, 5 Apr 2016 07:53:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 90FEB304059 for ; Tue, 5 Apr 2016 05:53:08 -0700 (PDT) X-ASG-Debug-ID: 1459860785-04bdf0110323e3f0001-NocioJ Received: from mail.vps.com ([40.83.127.154]) by cuda.sgi.com with ESMTP id iDwUiXBWw2r7LvbH for ; Tue, 05 Apr 2016 05:53:06 -0700 (PDT) X-Barracuda-Envelope-From: apache@vps.com X-Barracuda-Apparent-Source-IP: 40.83.127.154 Received: by mail.vps.com (Postfix, from userid 48) id 6B8E91873DE; Tue, 5 Apr 2016 12:53:04 +0000 (UTC) To: xfs@oss.sgi.com Subject: Trade Representative Proposal X-PHP-Originating-Script: 0:usged.php X-ASG-Orig-Subj: Trade Representative Proposal From: Finance Consultant Reply-To: fundbizuk@gmail.com MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 8bit Message-Id: <20160405125304.6B8E91873DE@mail.vps.com> Date: Tue, 5 Apr 2016 12:53:04 +0000 (UTC) X-Barracuda-Connect: UNKNOWN[40.83.127.154] X-Barracuda-Start-Time: 1459860785 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.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.28474 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 Dear Sir, We represent a top government functionary in Tehran, Iran. We are looking for trade representative (mandate) for multi-million crude oil deal with our foreign buyer. The deal has reached an advanced stage and considering the nature of the trade, the buyer is not willing to make transfer to our mandate account in Tehran as there is no standard contract paper in place to pass the transaction via regular international banking channel. As a mandate, the buyer will be paying directly to your account and upon confirmation of his initial deposit, the vessel will sail. For your services, you will be receiving 10% of the total deposit in each deal. And to make things easier for you the proceeds will be re-invested abroad, so you will not have any problem profiling or redirecting the fund according to our instructions. We will handle the entire closing documentations and export processing.If interested, we will provide you with more details. Sincerely Mrs.M.Santos This e-mail is confidential. If you are not the addressee you may not copy, forward, disclose or use any part of it. If you have received this message in error, please delete it and all copies from your system and notify the sender immediately by return e-mail. Our company accepts no liability for any damage caused by any virus/error transmitted by this e-mail. From cmaiolino@redhat.com Tue Apr 5 08:03:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 075B07CA0 for ; Tue, 5 Apr 2016 08:03:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4F88CAC002 for ; Tue, 5 Apr 2016 06:03:50 -0700 (PDT) X-ASG-Debug-ID: 1459861426-04cbb07ad5280ee0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Qe8mj4ttrTLJTocz (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 05 Apr 2016 06:03:47 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id DA9CC804E2 for ; Tue, 5 Apr 2016 13:03:46 +0000 (UTC) Received: from redhat.com (gfs-i24c-02.mpc.lab.eng.bos.redhat.com [10.16.144.214]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u35D3iEu013700 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 5 Apr 2016 09:03:46 -0400 Date: Tue, 5 Apr 2016 09:03:44 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: [PATCH 2/4] xfs: allocate log vector buffers outside CIL context lock Message-ID: <20160405130344.GA56593@redhat.com> X-ASG-Orig-Subj: Re: [PATCH 2/4] xfs: allocate log vector buffers outside CIL context lock Mail-Followup-To: xfs@oss.sgi.com References: <1459836310-12619-1-git-send-email-david@fromorbit.com> <1459836310-12619-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459836310-12619-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1459861427 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This make sense to me, but knowledge in xfs logging is not good enough yet to properly acknowledge this, so, I'll just leave it to someone else with better knowledge of how xfs log works. Cheers On Tue, Apr 05, 2016 at 04:05:08PM +1000, Dave Chinner wrote: > From: Dave Chinner > > One of the problems we currently have with delayed logging is that > under serious memory pressure we can deadlock memory reclaim. THis > occurs when memory reclaim (such as run by kswapd) is reclaiming XFS > inodes and issues a log force to unpin inodes that are dirty in the > CIL. > > The CIL is pushed, but this will only occur once it gets the CIL > context lock to ensure that all committing transactions are complete > and no new transactions start being committed to the CIL while the > push switches to a new context. > > The deadlock occurs when the CIL context lock is held by a > committing process that is doing memory allocation for log vector > buffers, and that allocation is then blocked on memory reclaim > making progress. Memory reclaim, however, is blocked waiting for > a log force to make progress, and so we effectively deadlock at this > point. > > To solve this problem, we have to move the CIL log vector buffer > allocation outside of the context lock so that memory reclaim can > always make progress when it needs to force the log. The problem > with doing this is that a CIL push can take place while we are > determining if we need to allocate a new log vector buffer for > an item and hence the current log vector may go away without > warning. That means we canot rely on the existing log vector being > present when we finally grab the context lock and so we must have a > replacement buffer ready to go at all times. > > To ensure this, introduce a "shadow log vector" buffer that is > always guaranteed to be present when we gain the CIL context lock > and format the item. This shadow buffer may or may not be used > during the formatting, but if the log item does not have an existing > log vector buffer or that buffer is too small for the new > modifications, we swap it for the new shadow buffer and format > the modifications into that new log vector buffer. > > The result of this is that for any object we modify more than once > in a given CIL checkpoint, we double the memory required > to track dirty regions in the log. For single modifications then > we consume the shadow log vectorwe allocate on commit, and that gets > consumed by the checkpoint. However, if we make multiple > modifications, then the second transaction commit will allocate a > shadow log vector and hence we will end up with double the memory > usage as only one of the log vectors is consumed by the CIL > checkpoint. The remaining shadow vector will be freed when th elog > item is freed. > > This can probably be optimised in future - access to the shadow log > vector is serialised by the object lock (as opposited to the active > log vector, which is controlled by the CIL context lock) and so we > can probably free shadow log vector from some objects when the log > item is marked clean on removal from the AIL. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_buf_item.c | 1 + > fs/xfs/xfs_dquot.c | 1 + > fs/xfs/xfs_dquot_item.c | 2 + > fs/xfs/xfs_extfree_item.c | 2 + > fs/xfs/xfs_inode_item.c | 1 + > fs/xfs/xfs_log_cil.c | 258 ++++++++++++++++++++++++++++++++++------------ > fs/xfs/xfs_trans.h | 1 + > 7 files changed, 202 insertions(+), 64 deletions(-) > > diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c > index d613e7f..55b5ad0 100644 > --- a/fs/xfs/xfs_buf_item.c > +++ b/fs/xfs/xfs_buf_item.c > @@ -949,6 +949,7 @@ xfs_buf_item_free( > xfs_buf_log_item_t *bip) > { > xfs_buf_item_free_format(bip); > + kmem_free(bip->bli_item.li_lv_shadow); > kmem_zone_free(xfs_buf_item_zone, bip); > } > > diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c > index 8f51370..df4a70a 100644 > --- a/fs/xfs/xfs_dquot.c > +++ b/fs/xfs/xfs_dquot.c > @@ -74,6 +74,7 @@ xfs_qm_dqdestroy( > { > ASSERT(list_empty(&dqp->q_lru)); > > + kmem_free(dqp->q_logitem.qli_item.li_lv_shadow); > mutex_destroy(&dqp->q_qlock); > > XFS_STATS_DEC(dqp->q_mount, xs_qm_dquot); > diff --git a/fs/xfs/xfs_dquot_item.c b/fs/xfs/xfs_dquot_item.c > index 814cff9..2c7a162 100644 > --- a/fs/xfs/xfs_dquot_item.c > +++ b/fs/xfs/xfs_dquot_item.c > @@ -370,6 +370,8 @@ xfs_qm_qoffend_logitem_committed( > spin_lock(&ailp->xa_lock); > xfs_trans_ail_delete(ailp, &qfs->qql_item, SHUTDOWN_LOG_IO_ERROR); > > + kmem_free(qfs->qql_item.li_lv_shadow); > + kmem_free(lip->li_lv_shadow); > kmem_free(qfs); > kmem_free(qfe); > return (xfs_lsn_t)-1; > diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c > index 4aa0153..ab77946 100644 > --- a/fs/xfs/xfs_extfree_item.c > +++ b/fs/xfs/xfs_extfree_item.c > @@ -40,6 +40,7 @@ void > xfs_efi_item_free( > struct xfs_efi_log_item *efip) > { > + kmem_free(efip->efi_item.li_lv_shadow); > if (efip->efi_format.efi_nextents > XFS_EFI_MAX_FAST_EXTENTS) > kmem_free(efip); > else > @@ -300,6 +301,7 @@ static inline struct xfs_efd_log_item *EFD_ITEM(struct xfs_log_item *lip) > STATIC void > xfs_efd_item_free(struct xfs_efd_log_item *efdp) > { > + kmem_free(efdp->efd_item.li_lv_shadow); > if (efdp->efd_format.efd_nextents > XFS_EFD_MAX_FAST_EXTENTS) > kmem_free(efdp); > else > diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c > index d02cbab..77799e1 100644 > --- a/fs/xfs/xfs_inode_item.c > +++ b/fs/xfs/xfs_inode_item.c > @@ -651,6 +651,7 @@ void > xfs_inode_item_destroy( > xfs_inode_t *ip) > { > + kmem_free(ip->i_itemp->ili_item.li_lv_shadow); > kmem_zone_free(xfs_ili_zone, ip->i_itemp); > } > > diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c > index 4e76493..ebb9ea9 100644 > --- a/fs/xfs/xfs_log_cil.c > +++ b/fs/xfs/xfs_log_cil.c > @@ -79,6 +79,157 @@ xlog_cil_init_post_recovery( > log->l_cilp->xc_ctx->sequence = 1; > } > > +static inline int > +xlog_cil_iovec_space( > + uint niovecs) > +{ > + return round_up((sizeof(struct xfs_log_vec) + > + niovecs * sizeof(struct xfs_log_iovec)), > + sizeof(uint64_t)); > +} > + > +/* > + * Allocate or pin log vector buffers for CIL insertion. > + * > + * The CIL currently uses disposable buffers for copying a snapshot of the > + * modified items into the log during a push. The biggest problem with this is > + * the requirement to allocate the disposable buffer during the commit if: > + * a) does not exist; or > + * b) it is too small > + * > + * If we do this allocation within xlog_cil_insert_format_items(), it is done > + * under the xc_ctx_lock, which means that a CIL push cannot occur during > + * the memory allocation. This means that we have a potential deadlock situation > + * under low memory conditions when we have lots of dirty metadata pinned in > + * the CIL and we need a CIL commit to occur to free memory. > + * > + * To avoid this, we need to move the memory allocation outside the > + * xc_ctx_lock(), but because the log vector buffers are disposable, that opens > + * up a TOCTOU race condition w.r.t. the CIL commiting and removing the log > + * vector buffers between the check and the formatting of the item into the > + * log vector buffer within the xc_ctx_lock. > + * > + * Because the log vector buffer needs to be unchanged during the CIL push > + * process, we cannot share the buffer between the transaction commit (which > + * modifies the buffer) and the CIL push context that is writing the changes > + * into the log. This means skipping preallocation of buffer space is > + * unreliable, but we most definitely do not want to be allocating and freeing > + * buffers unnecessarily during commits when overwrites can be done safely. > + * > + * The simplest solution to this problem is to allocate a shadow buffer when a > + * log item is committed for the second time, and then to only use this buffer > + * if necessary. The buffer can remain attached to the log item until such time > + * it is needed, and this is the buffer that is reallocated to match the size of > + * the incoming modification. Then during the formatting of the item we can swap > + * the active buffer with the new one if we can't reuse the existing buffer. We > + * don't free the old buffer as it may be reused on the next modification if > + * it's size is right, otherwise we'll free and reallocate it at that point. > + * > + * This function builds a vector for the changes in each log item in the > + * transaction. It then works out the length of the buffer needed for each log > + * item, allocates them and attaches the vector to the log item in preparation > + * for the formatting step which occurs under the xc_ctx_lock. > + * > + * While this means the memory footprint goes up, it avoids the repeated > + * alloc/free pattern that repeated modifications of an item would otherwise > + * cause, and hence minimises the CPU overhead of such behaviour. > + */ > +static void > +xlog_cil_alloc_shadow_bufs( > + struct xlog *log, > + struct xfs_trans *tp) > +{ > + struct xfs_log_item_desc *lidp; > + > + list_for_each_entry(lidp, &tp->t_items, lid_trans) { > + struct xfs_log_item *lip = lidp->lid_item; > + struct xfs_log_vec *lv; > + int niovecs = 0; > + int nbytes = 0; > + int buf_size; > + bool ordered = false; > + > + /* Skip items which aren't dirty in this transaction. */ > + if (!(lidp->lid_flags & XFS_LID_DIRTY)) > + continue; > + > + /* get number of vecs and size of data to be stored */ > + lip->li_ops->iop_size(lip, &niovecs, &nbytes); > + > + /* > + * Ordered items need to be tracked but we do not wish to write > + * them. We need a logvec to track the object, but we do not > + * need an iovec or buffer to be allocated for copying data. > + */ > + if (niovecs == XFS_LOG_VEC_ORDERED) { > + ordered = true; > + niovecs = 0; > + nbytes = 0; > + } > + > + /* > + * We 64-bit align the length of each iovec so that the start > + * of the next one is naturally aligned. We'll need to > + * account for that slack space here. Then round nbytes up > + * to 64-bit alignment so that the initial buffer alignment is > + * easy to calculate and verify. > + */ > + nbytes += niovecs * sizeof(uint64_t); > + nbytes = round_up(nbytes, sizeof(uint64_t)); > + > + /* > + * The data buffer needs to start 64-bit aligned, so round up > + * that space to ensure we can align it appropriately and not > + * overrun the buffer. > + */ > + buf_size = nbytes + xlog_cil_iovec_space(niovecs); > + > + /* > + * if we have no shadow buffer, or it is too small, we need to > + * reallocate it. > + */ > + if (!lip->li_lv_shadow || > + buf_size > lip->li_lv_shadow->lv_size) { > + > + /* > + * We free and allocate here as a realloc would copy > + * unecessary data. We don't use kmem_zalloc() for the > + * same reason - we don't need to zero the data area in > + * the buffer, only the log vector header and the iovec > + * storage. > + */ > + kmem_free(lip->li_lv_shadow); > + > + lv = kmem_alloc(buf_size, KM_SLEEP|KM_NOFS); > + memset(lv, 0, xlog_cil_iovec_space(niovecs)); > + > + lv->lv_item = lip; > + lv->lv_size = buf_size; > + if (ordered) > + lv->lv_buf_len = XFS_LOG_VEC_ORDERED; > + else > + lv->lv_iovecp = (struct xfs_log_iovec *)&lv[1]; > + lip->li_lv_shadow = lv; > + } else { > + /* same or smaller, optimise common overwrite case */ > + lv = lip->li_lv_shadow; > + if (ordered) > + lv->lv_buf_len = XFS_LOG_VEC_ORDERED; > + else > + lv->lv_buf_len = 0; > + lv->lv_bytes = 0; > + lv->lv_next = NULL; > + } > + > + /* Ensure the lv is set up according to ->iop_size */ > + lv->lv_niovecs = niovecs; > + > + /* The allocated data region lies beyond the iovec region */ > + lv->lv_buf = (char *)lv + xlog_cil_iovec_space(niovecs); > + } > + > +} > + > /* > * Prepare the log item for insertion into the CIL. Calculate the difference in > * log space and vectors it will consume, and if it is a new item pin it as > @@ -101,16 +252,19 @@ xfs_cil_prepare_item( > /* > * If there is no old LV, this is the first time we've seen the item in > * this CIL context and so we need to pin it. If we are replacing the > - * old_lv, then remove the space it accounts for and free it. > + * old_lv, then remove the space it accounts for and make it the shadow > + * buffer for later freeing. In both cases we are now switching to the > + * shadow buffer, so update the the pointer to it appropriately. > */ > - if (!old_lv) > + if (!old_lv) { > lv->lv_item->li_ops->iop_pin(lv->lv_item); > - else if (old_lv != lv) { > + lv->lv_item->li_lv_shadow = NULL; > + } else if (old_lv != lv) { > ASSERT(lv->lv_buf_len != XFS_LOG_VEC_ORDERED); > > *diff_len -= old_lv->lv_bytes; > *diff_iovecs -= old_lv->lv_niovecs; > - kmem_free(old_lv); > + lv->lv_item->li_lv_shadow = old_lv; > } > > /* attach new log vector to log item */ > @@ -134,11 +288,13 @@ xfs_cil_prepare_item( > * write it out asynchronously without needing to relock the object that was > * modified at the time it gets written into the iclog. > * > - * This function builds a vector for the changes in each log item in the > - * transaction. It then works out the length of the buffer needed for each log > - * item, allocates them and formats the vector for the item into the buffer. > - * The buffer is then attached to the log item are then inserted into the > - * Committed Item List for tracking until the next checkpoint is written out. > + * This function takes the prepared log vectors attached to each log item, and > + * formats the changes into the log vector buffer. The buffer it uses is > + * dependent on the current state of the vector in the CIL - the shadow lv is > + * guaranteed to be large enough for the current modification, but we will only > + * use that if we can't reuse the existing lv. If we can't reuse the existing > + * lv, then simple swap it out for the shadow lv. We don't free it - that is > + * done lazily either by th enext modification or the freeing of the log item. > * > * We don't set up region headers during this process; we simply copy the > * regions into the flat buffer. We can do this because we still have to do a > @@ -171,59 +327,29 @@ xlog_cil_insert_format_items( > list_for_each_entry(lidp, &tp->t_items, lid_trans) { > struct xfs_log_item *lip = lidp->lid_item; > struct xfs_log_vec *lv; > - struct xfs_log_vec *old_lv; > - int niovecs = 0; > - int nbytes = 0; > - int buf_size; > + struct xfs_log_vec *old_lv = NULL; > + struct xfs_log_vec *shadow; > bool ordered = false; > > /* Skip items which aren't dirty in this transaction. */ > if (!(lidp->lid_flags & XFS_LID_DIRTY)) > continue; > > - /* get number of vecs and size of data to be stored */ > - lip->li_ops->iop_size(lip, &niovecs, &nbytes); > - > - /* Skip items that do not have any vectors for writing */ > - if (!niovecs) > - continue; > - > /* > - * Ordered items need to be tracked but we do not wish to write > - * them. We need a logvec to track the object, but we do not > - * need an iovec or buffer to be allocated for copying data. > + * The formatting size information is already attached to > + * the shadow lv on the log item. > */ > - if (niovecs == XFS_LOG_VEC_ORDERED) { > + shadow = lip->li_lv_shadow; > + if (shadow->lv_buf_len == XFS_LOG_VEC_ORDERED) > ordered = true; > - niovecs = 0; > - nbytes = 0; > - } > > - /* > - * We 64-bit align the length of each iovec so that the start > - * of the next one is naturally aligned. We'll need to > - * account for that slack space here. Then round nbytes up > - * to 64-bit alignment so that the initial buffer alignment is > - * easy to calculate and verify. > - */ > - nbytes += niovecs * sizeof(uint64_t); > - nbytes = round_up(nbytes, sizeof(uint64_t)); > - > - /* grab the old item if it exists for reservation accounting */ > - old_lv = lip->li_lv; > - > - /* > - * The data buffer needs to start 64-bit aligned, so round up > - * that space to ensure we can align it appropriately and not > - * overrun the buffer. > - */ > - buf_size = nbytes + > - round_up((sizeof(struct xfs_log_vec) + > - niovecs * sizeof(struct xfs_log_iovec)), > - sizeof(uint64_t)); > + /* Skip items that do not have any vectors for writing */ > + if (!shadow->lv_niovecs && !ordered) > + continue; > > /* compare to existing item size */ > - if (lip->li_lv && buf_size <= lip->li_lv->lv_size) { > + old_lv = lip->li_lv; > + if (lip->li_lv && shadow->lv_size <= lip->li_lv->lv_size) { > /* same or smaller, optimise common overwrite case */ > lv = lip->li_lv; > lv->lv_next = NULL; > @@ -237,32 +363,29 @@ xlog_cil_insert_format_items( > */ > *diff_iovecs -= lv->lv_niovecs; > *diff_len -= lv->lv_bytes; > + > + /* Ensure the lv is set up according to ->iop_size */ > + lv->lv_niovecs = shadow->lv_niovecs; > + > + /* reset the lv buffer information for new formatting */ > + lv->lv_buf_len = 0; > + lv->lv_bytes = 0; > + lv->lv_buf = (char *)lv + > + xlog_cil_iovec_space(lv->lv_niovecs); > } else { > - /* allocate new data chunk */ > - lv = kmem_zalloc(buf_size, KM_SLEEP|KM_NOFS); > + /* switch to shadow buffer! */ > + lv = shadow; > lv->lv_item = lip; > - lv->lv_size = buf_size; > if (ordered) { > /* track as an ordered logvec */ > ASSERT(lip->li_lv == NULL); > - lv->lv_buf_len = XFS_LOG_VEC_ORDERED; > goto insert; > } > - lv->lv_iovecp = (struct xfs_log_iovec *)&lv[1]; > } > > - /* Ensure the lv is set up according to ->iop_size */ > - lv->lv_niovecs = niovecs; > - > - /* The allocated data region lies beyond the iovec region */ > - lv->lv_buf_len = 0; > - lv->lv_bytes = 0; > - lv->lv_buf = (char *)lv + buf_size - nbytes; > ASSERT(IS_ALIGNED((unsigned long)lv->lv_buf, sizeof(uint64_t))); > - > lip->li_ops->iop_format(lip, lv); > insert: > - ASSERT(lv->lv_buf_len <= nbytes); > xfs_cil_prepare_item(log, lv, old_lv, diff_len, diff_iovecs); > } > } > @@ -784,6 +907,13 @@ xfs_log_commit_cil( > struct xlog *log = mp->m_log; > struct xfs_cil *cil = log->l_cilp; > > + /* > + * Do all necessary memory allocation before we lock the CIL. > + * This ensures the allocation does not deadlock with a CIL > + * push in memory reclaim (e.g. from kswapd). > + */ > + xlog_cil_alloc_shadow_bufs(log, tp); > + > /* lock out background commit */ > down_read(&cil->xc_ctx_lock); > > diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h > index e7c49cf..be7b8e1 100644 > --- a/fs/xfs/xfs_trans.h > +++ b/fs/xfs/xfs_trans.h > @@ -52,6 +52,7 @@ typedef struct xfs_log_item { > /* delayed logging */ > struct list_head li_cil; /* CIL pointers */ > struct xfs_log_vec *li_lv; /* active log vector */ > + struct xfs_log_vec *li_lv_shadow; /* standby vector */ > xfs_lsn_t li_seq; /* CIL commit seq */ > } xfs_log_item_t; > > -- > 2.7.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From cmaiolino@redhat.com Tue Apr 5 08:19:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 781AD7CA0 for ; Tue, 5 Apr 2016 08:19:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 524898F8037 for ; Tue, 5 Apr 2016 06:19:51 -0700 (PDT) X-ASG-Debug-ID: 1459862389-04cbb07ad6281bd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wjCjXhjaoJCHX9YQ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 05 Apr 2016 06:19:50 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7D4168F50E for ; Tue, 5 Apr 2016 13:19:49 +0000 (UTC) Received: from redhat.com (gfs-i24c-02.mpc.lab.eng.bos.redhat.com [10.16.144.214]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u35DJlug004108 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 5 Apr 2016 09:19:49 -0400 Date: Tue, 5 Apr 2016 09:19:47 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: [PATCH 4/4] xfs: reduce lock hold times in buffer writeback Message-ID: <20160405131947.GB56593@redhat.com> X-ASG-Orig-Subj: Re: [PATCH 4/4] xfs: reduce lock hold times in buffer writeback Mail-Followup-To: xfs@oss.sgi.com References: <1459836310-12619-1-git-send-email-david@fromorbit.com> <1459836310-12619-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459836310-12619-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1459862390 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Looks good to me Reviewed-by: Carlos Maiolino On Tue, Apr 05, 2016 at 04:05:10PM +1000, Dave Chinner wrote: > From: Dave Chinner > > When we have a lot of metadata to flush from the AIL, the buffer > list can get very long. The current submission code tries to batch > submission to optimise IO order of the metadata (i.e. ascending > block order) to maximise block layer merging or IO to adjacent > metadata blocks. > > Unfortunately, the method used can result in long lock times > occurring as buffers locked early on in the buffer list might not be > dispatched until the end of the IO licst processing. This is because > sorting does not occur util after the buffer list has been processed > and the buffers that are going to be submitted are locked. Hence > when the buffer list is several thousand buffers long, the lock hold > times before IO dispatch can be significant. > > To fix this, sort the buffer list before we start trying to lock and > submit buffers. This means we can now submit buffers immediately > after they are locked, allowing merging to occur immediately on the > plug and dispatch to occur as quickly as possible. This means there > is minimal delay between locking the buffer and IO submission > occuring, hence reducing the worst case lock hold times seen during > delayed write buffer IO submission signficantly. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_buf.c | 60 +++++++++++++++++++++++++++++++++----------------------- > 1 file changed, 35 insertions(+), 25 deletions(-) > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > index 467a636..0d49e81 100644 > --- a/fs/xfs/xfs_buf.c > +++ b/fs/xfs/xfs_buf.c > @@ -1780,18 +1780,33 @@ xfs_buf_cmp( > return 0; > } > > +/* > + * submit buffers for write. > + * > + * When we have a large buffer list, we do not want to hold all the buffers > + * locked while we block on the request queue waiting for IO dispatch. To avoid > + * this problem, we lock and submit buffers in groups of 50, thereby minimising > + * the lock hold times for lists which may contain thousands of objects. > + * > + * To do this, we sort the buffer list before we walk the list to lock and > + * submit buffers, and we plug and unplug around each group of buffers we > + * submit. > + */ > static int > -__xfs_buf_delwri_submit( > +xfs_buf_delwri_submit_buffers( > struct list_head *buffer_list, > - struct list_head *io_list, > - bool wait) > + struct list_head *wait_list) > { > - struct blk_plug plug; > struct xfs_buf *bp, *n; > + LIST_HEAD (submit_list); > int pinned = 0; > + struct blk_plug plug; > + > + list_sort(NULL, buffer_list, xfs_buf_cmp); > > + blk_start_plug(&plug); > list_for_each_entry_safe(bp, n, buffer_list, b_list) { > - if (!wait) { > + if (!wait_list) { > if (xfs_buf_ispinned(bp)) { > pinned++; > continue; > @@ -1814,25 +1829,21 @@ __xfs_buf_delwri_submit( > continue; > } > > - list_move_tail(&bp->b_list, io_list); > trace_xfs_buf_delwri_split(bp, _RET_IP_); > - } > - > - list_sort(NULL, io_list, xfs_buf_cmp); > - > - blk_start_plug(&plug); > - list_for_each_entry_safe(bp, n, io_list, b_list) { > - bp->b_flags &= ~(_XBF_DELWRI_Q | XBF_ASYNC | XBF_WRITE_FAIL); > - bp->b_flags |= XBF_WRITE | XBF_ASYNC; > > /* > - * we do all Io submission async. This means if we need to wait > - * for IO completion we need to take an extra reference so the > - * buffer is still valid on the other side. > + * We do all IO submission async. This means if we need > + * to wait for IO completion we need to take an extra > + * reference so the buffer is still valid on the other > + * side. We need to move the buffer onto the io_list > + * at this point so the caller can still access it. > */ > - if (wait) > + bp->b_flags &= ~(_XBF_DELWRI_Q | XBF_ASYNC | XBF_WRITE_FAIL); > + bp->b_flags |= XBF_WRITE | XBF_ASYNC; > + if (wait_list) { > xfs_buf_hold(bp); > - else > + list_move_tail(&bp->b_list, wait_list); > + } else > list_del_init(&bp->b_list); > > xfs_buf_submit(bp); > @@ -1855,8 +1866,7 @@ int > xfs_buf_delwri_submit_nowait( > struct list_head *buffer_list) > { > - LIST_HEAD (io_list); > - return __xfs_buf_delwri_submit(buffer_list, &io_list, false); > + return xfs_buf_delwri_submit_buffers(buffer_list, NULL); > } > > /* > @@ -1871,15 +1881,15 @@ int > xfs_buf_delwri_submit( > struct list_head *buffer_list) > { > - LIST_HEAD (io_list); > + LIST_HEAD (wait_list); > int error = 0, error2; > struct xfs_buf *bp; > > - __xfs_buf_delwri_submit(buffer_list, &io_list, true); > + xfs_buf_delwri_submit_buffers(buffer_list, &wait_list); > > /* Wait for IO to complete. */ > - while (!list_empty(&io_list)) { > - bp = list_first_entry(&io_list, struct xfs_buf, b_list); > + while (!list_empty(&wait_list)) { > + bp = list_first_entry(&wait_list, struct xfs_buf, b_list); > > list_del_init(&bp->b_list); > > -- > 2.7.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From guaneryu@gmail.com Tue Apr 5 08:30:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1A8CB7CA0 for ; Tue, 5 Apr 2016 08:30:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8BC83AC003 for ; Tue, 5 Apr 2016 06:30:24 -0700 (PDT) X-ASG-Debug-ID: 1459863022-04bdf0110423fd70001-NocioJ Received: from mail-pa0-f68.google.com (mail-pa0-f68.google.com [209.85.220.68]) by cuda.sgi.com with ESMTP id bXmcjB2tF2d4F9GP (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 05 Apr 2016 06:30:22 -0700 (PDT) X-Barracuda-Envelope-From: guaneryu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.68 Received: by mail-pa0-f68.google.com with SMTP id q6so1318074pav.0 for ; Tue, 05 Apr 2016 06:30:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=8eDbU5M8W2DsLJkLfvQ6KfYDLNxbOn92dEZi9HAgvOc=; b=rSWsstUyitKTpfAXO4lILtihlY/kCVCNSPDEc3WB9RjHs/WLAA9EWtRO6nB6dupWU+ EY/I8NpPtBRXTxuBrt+Yiqahp0JZXSUth7CuJPKDL0/TIGhTwjZcoBlneasTVO7kKn9A +gv2DUvm9qUY8XaQNl40YqIKIFEALZX8UQztjgykJJKGKRW2WyD/pUNyD2fjlCd6Chss dzLDghuLV3DsetgS5Eg4JRXG/Sb2ABveXMMvvfgCvzReMG/vl8s5GBtUNVhHIFs1zL6G zeUWQR2FaAL2e9Sf7uRJWCHSHHrsABsvGDpcWf1KbYMdSfKtfk4Hg1V3xfkKBdCNwm6/ vy4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=8eDbU5M8W2DsLJkLfvQ6KfYDLNxbOn92dEZi9HAgvOc=; b=GXsbCNtaJWrxo5J2xN6ehLeri+YF7Ggb0B6mI+hzvEeB21x07iP3oeHLEKvfQ4Ctwj cRqr/2cqEsmFLGZtOoIsiqB1yU7kmo9ZjUm0AMrn3u8ytmVuUt/U538stnynNkdVcN71 8aimXax6ovRvegA5m7nkAJ4/I5SkzFvWcGfJyID2PEjlIoILUAGH3IRoTKfLcIhjhHby lUajI3GuSJp0IeJGmzizLe7Cn38zbAb7S4gs1D1aScUUcFtWd8dC8QcJLgYQPxpGM+rR 9/U/B8THGL/EX+X3NX7qJbmKaLQ/j2oXZQYmWv/8HHg6U7FwGb/AIAskdn3AOulwWePY lbUA== X-Gm-Message-State: AD7BkJKcC0qmF9Iy5k7Zuf223tHXMl8SnMBDcZlvfmNh9dNOwd0Rzfa89yxOsgv+W0zShw== X-Received: by 10.66.66.198 with SMTP id h6mr61317985pat.112.1459863022225; Tue, 05 Apr 2016 06:30:22 -0700 (PDT) Received: from localhost ([128.199.137.77]) by smtp.gmail.com with ESMTPSA id 17sm47088990pfp.96.2016.04.05.06.30.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 05 Apr 2016 06:30:21 -0700 (PDT) From: Eryu Guan To: linux-fsdevel@vger.kernel.org Cc: Eryu Guan , Steven Whitehouse , Bob Peterson , Alexander Viro , Dave Chinner , xfs@oss.sgi.com (supporter:XFS FILESYSTEM), cluster-devel@redhat.com (open list:GFS2 FILE SYSTEM), linux-kernel@vger.kernel.org (open list) Subject: [PATCH] fs: return EPERM on immutable inode Date: Tue, 5 Apr 2016 21:28:10 +0800 X-ASG-Orig-Subj: [PATCH] fs: return EPERM on immutable inode Message-Id: <1459862890-22957-1-git-send-email-guaneryu@gmail.com> X-Mailer: git-send-email 2.5.5 X-Barracuda-Connect: mail-pa0-f68.google.com[209.85.220.68] X-Barracuda-Start-Time: 1459863022 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28474 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 In most cases, EPERM is returned on immutable inode, and there're only a few places returning EACCES. And EPERM looks more reasonable to me. So converting all EACCES to EPERM on immutable inode. Signed-off-by: Eryu Guan --- I noticed this when running LTP on overlayfs, setxattr03 failed due to unexpected EACCES on immutable inode. fs/gfs2/inode.c | 2 +- fs/namei.c | 2 +- fs/utimes.c | 3 ++- fs/xfs/xfs_ioctl.c | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index bb30f9a..4c68d91 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c @@ -1757,7 +1757,7 @@ int gfs2_permission(struct inode *inode, int mask) } if ((mask & MAY_WRITE) && IS_IMMUTABLE(inode)) - error = -EACCES; + error = -EPERM; else error = generic_permission(inode, mask); if (unlock) diff --git a/fs/namei.c b/fs/namei.c index 1d9ca2d..7f4a40a 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -408,7 +408,7 @@ int __inode_permission(struct inode *inode, int mask) * Nobody gets write access to an immutable file. */ if (IS_IMMUTABLE(inode)) - return -EACCES; + return -EPERM; } retval = do_inode_permission(inode, mask); diff --git a/fs/utimes.c b/fs/utimes.c index 85c40f4..794f5f5 100644 --- a/fs/utimes.c +++ b/fs/utimes.c @@ -92,10 +92,11 @@ static int utimes_common(struct path *path, struct timespec *times) * then we need to check permissions, because * inode_change_ok() won't do it. */ - error = -EACCES; + error = -EPERM; if (IS_IMMUTABLE(inode)) goto mnt_drop_write_and_out; + error = -EACCES; if (!inode_owner_or_capable(inode)) { error = inode_permission(inode, MAY_WRITE); if (error) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index bcb6c19..4c4c58f 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -232,7 +232,7 @@ xfs_open_by_handle( } if ((fmode & FMODE_WRITE) && IS_IMMUTABLE(inode)) { - error = -EACCES; + error = -EPERM; goto out_dput; } -- 2.5.5 From cbMWaEqYxX@hotmail.com Tue Apr 5 10:36:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.4 required=5.0 tests=BASE64_LENGTH_79_INF, FORGED_HOTMAIL_RCVD2,FREEMAIL_FROM,MIME_BASE64_BLANKS 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 1E4277CA0 for ; Tue, 5 Apr 2016 10:36:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DCAE2304053 for ; Tue, 5 Apr 2016 08:36:38 -0700 (PDT) X-ASG-Debug-ID: 1459870595-04cb6c24642a5540001-NocioJ Received: from 611122-app1.discovertheworld.com (611122-app1.discovertheworld.com [104.130.41.136]) by cuda.sgi.com with ESMTP id ghYUFuhJlPhjuexm (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 05 Apr 2016 08:36:36 -0700 (PDT) X-Barracuda-Envelope-From: cbMWaEqYxX@hotmail.com X-Barracuda-Apparent-Source-IP: 104.130.41.136 Received: by 611122-app1.discovertheworld.com (Postfix, from userid 48) id 6422330AA80B; Tue, 5 Apr 2016 08:25:43 -0500 (CDT) To: vtran@viclaw.com,x6f91a6o@gluemanoidy.ru,vzvytemx@nrcbwwuv.com,zoonaria@wouwwarra.ru,wiezpldr@lldzauev.com,xmiigf@celinejp.com,zkzxgj@zvddim.com,vympel-sb@mail.ru,velmaelk@buchananinbox.com,vitaliibulat8900@gmail.com,xfs@oss.sgi.com,znhyvgoz@dikuapia.com,zambaelena@gmail.com,valkyrie-007@mail.ru,viptjzzc@xqvjmjju.com,yzt53m@kto-zdes-est.ru,zmfazzyx@sihdyxxs.com,web@drymix.ru,yuriu@dosug-mailers.ru,yuma1@mail.ru Subject: =?utf-8?B?0JvQuNC60LLQuNC00LDRhtC40Y8g0YTQuNGA0Lw=?= From: =?utf-8?B?0JvRjtC00LzQuNC70LA=?= X-ASG-Orig-Subj: =?utf-8?B?0JvQuNC60LLQuNC00LDRhtC40Y8g0YTQuNGA0Lw=?= Subject: =?utf-8?B?0JvQuNC60LLQuNC00LDRhtC40Y8g0YTQuNGA0Lw=?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?utf-8?B?0JvQuNC60LLQuNC00LDRhtC40Y8g0YTQuNGA0Lw=?= Content-Type: text/plain; charset=UTF-8; Content-Transfer-Encoding: base64 Message-Id: <20160405132543.6422330AA80B@611122-app1.discovertheworld.com> Date: Tue, 5 Apr 2016 08:25:43 -0500 (CDT) X-Barracuda-Connect: 611122-app1.discovertheworld.com[104.130.41.136] X-Barracuda-Start-Time: 1459870596 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.12 X-Barracuda-Spam-Status: No, SCORE=1.12 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, FORGED_HOTMAIL_RCVD2, MIME_BASE64_BLANKS X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28476 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 1.12 FORGED_HOTMAIL_RCVD2 hotmail.com 'From' address, but no 'Received:' 0.00 MIME_BASE64_BLANKS RAW: Extra blank lines in base64 encoding 0J/RgNCw0LLQuNC70YzQvdCw0Y8g0LvQuNC60LLQuNC00LDRhtC40Y8g0YTQuNGA0Lwg0L7RgiDQtNCy0YPRhSDQvdC10LTQtdC70Ywg0YEg0LvRjtCx0YvQvNC4INC00L7Qu9Cz0LDQvNC4INCx0LXQtyDQv9C+0YHQu9C10LTRgdGC0LLQuNC5INC4INCx0LXQtyDQvdCw0LvQvtCz0L7QstGL0YUg0L/RgNC+0LLQtdGA0L7Qui4K0KDQsNCx0L7RgtCw0LXQvCDRgdC+INCy0YHQtdC5INCg0L7RgdGB0LjQtdC5INC/0L4g0YHQsNC80YvQvCDQvdC40LfQutC40Lwg0YbQtdC90LDQvC4K0J/RgNC40LPQu9Cw0YjQsNC10Lwg0Log0YHQvtGC0YDRg9C00L3QuNGH0LXRgdGC0LLRgyDRjtGA0LjQtNC40YfQtdGB0LrQuNC1INC60L7QvNC/0LDQvdC40Lgg0L/QviDQv9Cw0YDRgtC90LXRgNGB0LrQvtC5INC/0YDQvtCz0YDQsNC80LzQtS4KaHR0cDovL3d3dy7Qu9C40LrQstC40LTQsNGG0LjRjy3QsdC10Lct0L/RgNC+0LLQtdGA0L7Qui7RgNGE From uUEbTozav@list.ru Tue Apr 5 11:07:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.4 required=5.0 tests=BASE64_LENGTH_79_INF, MIME_BASE64_BLANKS 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 537907CA0 for ; Tue, 5 Apr 2016 11:07:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2CD5D8F8035 for ; Tue, 5 Apr 2016 09:07:45 -0700 (PDT) X-ASG-Debug-ID: 1459872461-04cbb07ad8289810001-NocioJ Received: from mail.e-torial.com ([104.236.21.126]) by cuda.sgi.com with ESMTP id W5hgQBWnrBP21RIz for ; Tue, 05 Apr 2016 09:07:41 -0700 (PDT) X-Barracuda-Envelope-From: uUEbTozav@list.ru X-Barracuda-Apparent-Source-IP: 104.236.21.126 Received: by mail.e-torial.com (Postfix, from userid 33) id 45AA913B374; Tue, 5 Apr 2016 10:08:56 -0400 (EDT) To: valu-eoyav@neftegazoswarr.ru,wgpaxdxp@qfnhkcqc.com,webmaster@shorouknews.com,zgwd5sbxzwc@penza-city.ru,zmzai@referaleportaler.ru,z024@071.pfr.ru,xfs@oss.sgi.com,viktorabc19@gmail.com,wiqee@teleport.net.ru,versia@pochtamt.ru,y3kahym9k@gluemanoidy.ru,zipoco10@tl.ru,yurius@appleclub.ru,zbaje@ergo-koq.ru,zmoldir@gmail.com,whdnlf@yxjlze.com,zamumi666@yandex.ru,vektor-ka@mail.ru,vologdavad@mail.ru,w9_qyeo@wmhtxjvxs.biz Subject: =?utf-8?B?TGFuZGluZyBQYWdlINC30LAg0LTQtdC90Yw=?= X-PHP-Originating-Script: 33:hostdata112.php X-ASG-Orig-Subj: =?utf-8?B?TGFuZGluZyBQYWdlINC30LAg0LTQtdC90Yw=?= From: =?utf-8?B?0JHQvtGA0LjRgQ==?= Subject: =?utf-8?B?TGFuZGluZyBQYWdlINC30LAg0LTQtdC90Yw=?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?utf-8?B?TGFuZGluZyBQYWdlINC30LAg0LTQtdC90Yw=?= Content-Type: text/plain; charset=UTF-8; Content-Transfer-Encoding: base64 Message-Id: <20160405140856.45AA913B374@mail.e-torial.com> Date: Tue, 5 Apr 2016 10:08:56 -0400 (EDT) X-Barracuda-Connect: UNKNOWN[104.236.21.126] X-Barracuda-Start-Time: 1459872461 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC5_MJ1963, MIME_BASE64_BLANKS, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28477 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 MIME_BASE64_BLANKS RAW: Extra blank lines in base64 encoding 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 0JzQsNGA0LrQtdGC0L7Qu9C+0LMsINCa0L7Qv9C40YDQsNC50YLQtdGAINC4INCU0LjQt9Cw0LnQvdC10YAg0LfQsCDQstGB0LXQs9C+INC+0LTQuNC9INC00LXQvdGMINGB0LTQtdC70LDRjtGCINC/0YDQtdC80LjQsNC70YzQvdGD0Y4g0L/QvtGB0LDQtNC+0YfQvdGD0Y4g0YHRgtGA0LDQvdC40YbRgyDRgSDQstGL0YHQvtC60LjQvCDRg9GA0L7QstC90LXQvCDQutC+0L3QstC10YDRgdC40LgKaHR0cDovL9C30LAt0L7QtNC40L0t0LTQtdC90Ywu0YDRhA== From alex@zadarastorage.com Tue Apr 5 13:10:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.9 required=5.0 tests=STOX_REPLY_TYPE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 40ABE7CA0 for ; Tue, 5 Apr 2016 13:10:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A1B47AC002 for ; Tue, 5 Apr 2016 11:10:15 -0700 (PDT) X-ASG-Debug-ID: 1459879812-04cbb07ad728f800001-NocioJ Received: from mail-wm0-f42.google.com (mail-wm0-f42.google.com [74.125.82.42]) by cuda.sgi.com with ESMTP id ZOclCF6Tn1H7CjQD (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 05 Apr 2016 11:10:13 -0700 (PDT) X-Barracuda-Envelope-From: alex@zadarastorage.com X-Barracuda-Apparent-Source-IP: 74.125.82.42 Received: by mail-wm0-f42.google.com with SMTP id l6so34342204wml.1 for ; Tue, 05 Apr 2016 11:10:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=message-id:from:to:cc:references:in-reply-to:subject:date :mime-version:content-transfer-encoding:importance; bh=Sf5teLX3E5HELpIiCVOb4uHt++wXtG4veiftBZy3kGM=; b=E7IXUl1SXJAGmULcfBA6vLrr0+YcTXmRXWgGnXkq1hqwnSyYLbE+ePJQOgli032I7Z xuvajaV19nzYDlykfjrHhYbLkbVgQJc0J1paaxbowuLYEWeSCGvyCIh+/9wjuo04fIbE Q8KllNQVLiZGSjYd39ScaPNHftdQ3hhWpGQBVUEE+M0VA00DMP3+GtIBYazAKACaL1Gq jMxyAs1L7XuhlIRl3sw93i6Y5Ek3JYdqzEKD6uNSg7QUmdLYyggmjjf14QW/S5HZJu25 1zc210VPE5AcmgPn+klKfKrAzDdcYRLjlrODBfDVimFD/prG9LypwOG2B+UDRBVu2VxJ qD4g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:from:to:cc:references:in-reply-to :subject:date:mime-version:content-transfer-encoding:importance; bh=Sf5teLX3E5HELpIiCVOb4uHt++wXtG4veiftBZy3kGM=; b=LgyormCAfsBvSGt/ZR5d1VnM2Z+11IsHsoNBmFqifsTEJwln25+t5Uzds+MzCRFOt2 3xBZ4xtxQwclOhWAxwIXIbNl6nX3SUtU8SXzgp8zj1ukolkcw/HuzFvl/TgHJx1avlZT xU73xaHUFGwo9VFYJfcCCTCpxi+htIQuJuB4EvYv6sxZDsx0gjShOH2TDdTOQCXKUFUQ 9u6DXyg7+qxTEXcRt+ju7IAxgQmgb6aYQp+gcKT1nGu5i1llhvI+O8Dgk3BuLinyCza1 CABgjZeCxTLhCWgt44NLgDaiXd3rmZ/QFnV0rRvAjHXFcDsj6cU3Pr5nbtQt55vh2cRh pWJg== X-Gm-Message-State: AD7BkJIp1anhuP7d7wJeUy893wwyQAzvR9rByaNI+w6uxhxSoxdhx1n8WsIh3Zil6AEUGw== X-Received: by 10.28.147.72 with SMTP id v69mr19110032wmd.79.1459879811647; Tue, 05 Apr 2016 11:10:11 -0700 (PDT) Received: from alyakaslap (bzq-169-168-31-234.red.bezeqint.net. [31.168.169.234]) by smtp.gmail.com with ESMTPSA id uq10sm35795880wjc.38.2016.04.05.11.10.09 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 05 Apr 2016 11:10:10 -0700 (PDT) Message-ID: <77693FFEB62A474DA7F039FD92CC5304@alyakaslap> From: "Alex Lyakas" To: "Dave Chinner" Cc: "Christoph Hellwig" , "Danny Shavit" , , "Yair Hershko" , "Shyam Kaushik" , References: <20150629222651.GG7943@dastard> <20150707000911.GT7943@dastard> <20150707090511.GA21863@infradead.org> <7792DA2A464640B1BC7220973CED41AE@alyakaslap> <20150723230912.GE3902@dastard> In-Reply-To: <20150723230912.GE3902@dastard> Subject: Re: xfs_iext_realloc_indirect and "XFS: possible memory allocation deadlock" Date: Tue, 5 Apr 2016 21:10:06 +0300 X-ASG-Orig-Subj: Re: xfs_iext_realloc_indirect and "XFS: possible memory allocation deadlock" MIME-Version: 1.0 Content-Type: text/plain; format=flowed; charset="iso-8859-1"; reply-type=original Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal Importance: Normal X-Mailer: Microsoft Windows Live Mail 16.4.3528.331 X-MimeOLE: Produced By Microsoft MimeOLE V16.4.3528.331 X-Barracuda-Connect: mail-wm0-f42.google.com[74.125.82.42] X-Barracuda-Start-Time: 1459879812 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, STOX_REPLY_TYPE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28480 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 STOX_REPLY_TYPE STOX_REPLY_TYPE 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hello Dave, Brian, Christoph, We are still encountering cases, in which different IO patterns beat XFS preallocation schemes, resuling in highly fragmented files, having 100s of thousands and sometimes millions of extents. In these cases XFS tries to allocate large arrays of xfs_ext_irec_t structure with kmalloc, and this often gets into numerous retries, and sometimes triggers hung task panic (due to some other thread wanting to access the same file). We made a change to call kmem_zalloc_large, which resorts to __vmalloc in case kmalloc fails. kmem_free is already handling vmalloc addresses correctly. The change is only for the allocation done in xfs_iext_realloc_indirect, as this is the only place, in which we have seen the issue. Final code, as usual, will be in https://github.com/zadarastorage/zadara-xfs-pushback Thanks, Alex. -----Original Message----- From: Dave Chinner Sent: Friday, July 24, 2015 2:09 AM To: Alex Lyakas Cc: Christoph Hellwig ; Danny Shavit ; bfoster@redhat.com ; Yair Hershko ; Shyam Kaushik ; xfs@oss.sgi.com Subject: Re: xfs_iext_realloc_indirect and "XFS: possible memory allocation deadlock" On Thu, Jul 23, 2015 at 05:39:28PM +0200, Alex Lyakas wrote: > Hi Dave, > Just for completeness, XFS speculative preallocation (that is based > now upon the size of the last extent) can still grow up to 4Gb-8Gb > (depending on which patches we are pulling). As a result, xfs_iozero > can still sometimes trigger 1-2GB writes of zeros in one shot. This > turns out to be a bit unfriendly to the drives in some > configurations. So we have applied a custom patch to limit the > speculative preallocation to 32Mb. It would be much better to change xfs_zero_eof() to convert extents beyond EOF to unwritten extents rather than zero them. That way you still get the benefits of the large speculative prealloc but without the zeroing overhead that wierd sparse write patterns can trigger. I just haven't got around to doing this because it hasn't been reported as a significant problem for anyone until now. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 5 15:41:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3BEDF7CA0 for ; Tue, 5 Apr 2016 15:41:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A0B9CAC004 for ; Tue, 5 Apr 2016 13:41:36 -0700 (PDT) X-ASG-Debug-ID: 1459888892-04cb6c245f2afc90001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id OOftDpCr8MADI1eh for ; Tue, 05 Apr 2016 13:41:33 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BDCgBxIgRXPDGaLHlegzeBUIZroEABBowSg0+GJoYHBAICgUJNAQEBAQEBBwEBAQFCQIRCAQEEOhwjEAgDGAklDwUlAwcaExuIC8BtAQEBBwIBHRmFP4UTh2qCKwWYAY1+jxlEjlaCZhmBXiowhnokgRkBAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail05.adl6.internode.on.net with ESMTP; 06 Apr 2016 06:11:07 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1anXmc-0002qc-Uh; Wed, 06 Apr 2016 06:41:06 +1000 Date: Wed, 6 Apr 2016 06:41:06 +1000 From: Dave Chinner To: Alex Lyakas Cc: Christoph Hellwig , Danny Shavit , bfoster@redhat.com, Yair Hershko , Shyam Kaushik , xfs@oss.sgi.com Subject: Re: xfs_iext_realloc_indirect and "XFS: possible memory allocation deadlock" Message-ID: <20160405204106.GF11238@dastard> X-ASG-Orig-Subj: Re: xfs_iext_realloc_indirect and "XFS: possible memory allocation deadlock" References: <20150629222651.GG7943@dastard> <20150707000911.GT7943@dastard> <20150707090511.GA21863@infradead.org> <7792DA2A464640B1BC7220973CED41AE@alyakaslap> <20150723230912.GE3902@dastard> <77693FFEB62A474DA7F039FD92CC5304@alyakaslap> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <77693FFEB62A474DA7F039FD92CC5304@alyakaslap> 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: 1459888892 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28482 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Apr 05, 2016 at 09:10:06PM +0300, Alex Lyakas wrote: > Hello Dave, Brian, Christoph, > > We are still encountering cases, in which different IO patterns beat > XFS preallocation schemes, resuling in highly fragmented files, > having 100s of thousands and sometimes millions of extents. In these > cases XFS tries to allocate large arrays of xfs_ext_irec_t structure > with kmalloc, and this often gets into numerous retries, and > sometimes triggers hung task panic (due to some other thread wanting > to access the same file). > > We made a change to call kmem_zalloc_large, which resorts to > __vmalloc in case kmalloc fails. kmem_free is already handling > vmalloc addresses correctly. The change is only for the allocation > done in xfs_iext_realloc_indirect, as this is the only place, in > which we have seen the issue. As I've said before, vmalloc is not a solution we can use in general. 32 bit systems have less vmalloc area than normal kernel memory (e.g. ia32 has 128MB of vmalloc space vs 896MB of kernel address space by default) and hence if we get large vmap allocation requests for non-temporary, not directly reclaimable memory then we'll end up with worse problems than we already have due to vmalloc area exhaustion. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 5 15:44:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 20A6B7CA0 for ; Tue, 5 Apr 2016 15:44:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E684A304048 for ; Tue, 5 Apr 2016 13:44:34 -0700 (PDT) X-ASG-Debug-ID: 1459889072-04cbb07ad8296da0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id EAbuscIvHvkOaCZx for ; Tue, 05 Apr 2016 13:44:32 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AJCwBxIgRXPDGaLHlegzeBUIZroEABBogyg2CFZoQPhgcCAgEBAoFCTQEBAQEBAQcBAQEBQkCEQgEBBDocIxAIAxgJJQ8FDRgDBxoTiBIDEbtWDYUKAQEIAh4ZhT+FE4JBh1QFh2yHE4hRMYwTgWuBXI09h0SHVoRdKjCINwEBAQ Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail05.adl6.internode.on.net with ESMTP; 06 Apr 2016 06:14:31 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1anXpu-0002r7-QD; Wed, 06 Apr 2016 06:44:30 +1000 Date: Wed, 6 Apr 2016 06:44:30 +1000 From: Dave Chinner To: Eryu Guan Cc: linux-fsdevel@vger.kernel.org, Steven Whitehouse , Bob Peterson , Alexander Viro , "supporter:XFS FILESYSTEM" , "open list:GFS2 FILE SYSTEM" , open list Subject: Re: [PATCH] fs: return EPERM on immutable inode Message-ID: <20160405204430.GG11238@dastard> X-ASG-Orig-Subj: Re: [PATCH] fs: return EPERM on immutable inode References: <1459862890-22957-1-git-send-email-guaneryu@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459862890-22957-1-git-send-email-guaneryu@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: 1459889072 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28482 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Apr 05, 2016 at 09:28:10PM +0800, Eryu Guan wrote: > In most cases, EPERM is returned on immutable inode, and there're only > a few places returning EACCES. And EPERM looks more reasonable to me. > > So converting all EACCES to EPERM on immutable inode. > > Signed-off-by: Eryu Guan > --- > > I noticed this when running LTP on overlayfs, setxattr03 failed due to > unexpected EACCES on immutable inode. This should be in the commit message itself, rather than "EPERM looks more reasonable". Other than that, change seems fine to me. Acked-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 5 16:55:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0BCA17CA0 for ; Tue, 5 Apr 2016 16:55:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DA272304048 for ; Tue, 5 Apr 2016 14:55:12 -0700 (PDT) X-ASG-Debug-ID: 1459893309-04cbb07ad6298df0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id IE065d0Rao0uXOz1 for ; Tue, 05 Apr 2016 14:55:10 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BBCgAbMwRXPDGaLHldgzeBUIZroEABBowSiXWGBwQCAoFDTQEBAQEBAQcBAQEBQkCEQgEBBCcTHCMQCAMOCgklDwUlAwcaE4gmwGMBAQgCHhmFP4UTihUBBJgBjX6BXI09jxqEXSowiDcBAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail05.adl6.internode.on.net with ESMTP; 06 Apr 2016 07:25:08 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1anYwG-00034Y-7F; Wed, 06 Apr 2016 07:55:08 +1000 Date: Wed, 6 Apr 2016 07:55:08 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: support RCU lookups for inline symlinks Message-ID: <20160405215508.GH11238@dastard> X-ASG-Orig-Subj: Re: support RCU lookups for inline symlinks References: <1458740935-31260-1-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458740935-31260-1-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1459893309 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28483 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Mar 23, 2016 at 02:48:51PM +0100, Christoph Hellwig wrote: > Return the inline link body in the inode to support RCU mode lookups. The series doesn't appear to cause any regressions and the code looks good, so I've added the missing xfs_setup_iops() call in xfs_rename_alloc_whiteout() (patch 2), and converted dentry->d_inode to d_inode(dentry) in patch 3 for consistency withe the rest of the code and committed this series. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 5 20:29:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DFFC47CA0 for ; Tue, 5 Apr 2016 20:29:46 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 46A1AAC003 for ; Tue, 5 Apr 2016 18:29:46 -0700 (PDT) X-ASG-Debug-ID: 1459906180-04cb6c24642b61d0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id e95Eq7a379VlTVE8 for ; Tue, 05 Apr 2016 18:29:41 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DMEwB4ZQRXPDGaLHlcgzciMX2Ga6AlAgoRAQaBEYsBhWeEDxcChW4EgUdNAQEBAQEBBwEBAQFCQIRvExw7JDQFJQMHLYgmnw6hdRmFP4waC0CCQwWHb4sphGmFdogLjxYCjxyCGAEKAQEBgjUqMIg3AQEB Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail06.adl6.internode.on.net with ESMTP; 06 Apr 2016 10:59:39 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ancHq-0003U6-E6 for xfs@oss.sgi.com; Wed, 06 Apr 2016 11:29:38 +1000 Date: Wed, 6 Apr 2016 11:29:38 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfs: for-next branch updated to d8bdd04 Message-ID: <20160406012938.GI11238@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfs: for-next branch updated to d8bdd04 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: 1459906180 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28484 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, The for-next branch of the xfs kernel repository at git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git has just been updated. The new head of the for-next branch is commit: d8bdd04 Merge branch 'xfs-4.7-misc-fixes' into for-next New Commits: Carlos Maiolino (1): [9f27889] xfs: Add caller function output to xfs_log_force tracepoint Christoph Hellwig (8): [143f4ae] xfs: factor out a helper to initialize a local format inode fork [2b3d1d4] xfs: set up inode operation vectors later [bfe8804] xfs: use ->readlink to implement the readlink_by_handle ioctl [30ee052] xfs: optimize inline symlinks [0e51a8e] xfs: optimize bio handling in the buffer writeback path [253f491] xfs: better xfs_trans_alloc interface [710b1e2] xfs: remove transaction types [664b60f] xfs: improve kmem_realloc Dave Chinner (8): [ad747e3] xfs: Don't wrap growfs AGFL indexes [bb18782] xfs: build bios directly in xfs_add_to_ioend [37992c1] xfs: don't release bios on completion immediately [f0634af] Merge branch 'xfs-4.7-writeback-bio' into for-next [1347070] Merge branch 'xfs-4.7-trans-type-cleanup' into for-next [14e3103] Merge branch 'xfs-4.7-optimise-inline-symlinks' into for-next [615c175] Merge branch 'xfs-4.7-cleanup-attr-listent' into for-next [d8bdd04] Merge branch 'xfs-4.7-misc-fixes' into for-next Eric Sandeen (5): [d0a58e8] xfs: disallow rw remount on fs with unknown ro-compat features [2a6fba6] xfs: only return -errno or success from attr ->put_listent [e5bd12b] xfs: don't pass value into attr ->put_listent [7af5ad2] xfs: remove put_value from attr ->put_listent context [3ab3ffc] xfs: collapse cases in xfs_attr3_leaf_list_int Eryu Guan (2): [ce5c767] xfs: add missing break in xfs_parseargs() [6e3e6d5] xfs: mute some sparse warnings Code Diffstat: fs/namei.c | 1 - fs/xfs/kmem.c | 26 ++-- fs/xfs/kmem.h | 2 +- fs/xfs/libxfs/xfs_attr.c | 58 ++----- fs/xfs/libxfs/xfs_bmap.c | 22 ++- fs/xfs/libxfs/xfs_dir2_sf.c | 9 +- fs/xfs/libxfs/xfs_inode_fork.c | 72 ++++++--- fs/xfs/libxfs/xfs_inode_fork.h | 1 + fs/xfs/libxfs/xfs_log_format.h | 5 + fs/xfs/libxfs/xfs_sb.c | 8 +- fs/xfs/libxfs/xfs_shared.h | 102 +------------ fs/xfs/xfs_aops.c | 354 +++++++++++++++++++++---------------------- fs/xfs/xfs_aops.h | 15 +- fs/xfs/xfs_attr.h | 4 +- fs/xfs/xfs_attr_inactive.c | 16 +- fs/xfs/xfs_attr_list.c | 85 ++++------- fs/xfs/xfs_bmap_util.c | 45 ++---- fs/xfs/xfs_dquot.c | 9 +- fs/xfs/xfs_file.c | 8 +- fs/xfs/xfs_fsops.c | 14 +- fs/xfs/xfs_inode.c | 63 +++----- fs/xfs/xfs_inode.h | 5 +- fs/xfs/xfs_inode_item.c | 6 +- fs/xfs/xfs_ioctl.c | 31 +--- fs/xfs/xfs_iomap.c | 53 +++---- fs/xfs/xfs_iops.c | 117 ++++++++------ fs/xfs/xfs_log.c | 62 +------- fs/xfs/xfs_log.h | 3 +- fs/xfs/xfs_log_cil.c | 1 - fs/xfs/xfs_log_priv.h | 1 - fs/xfs/xfs_log_recover.c | 12 +- fs/xfs/xfs_mount.c | 1 - fs/xfs/xfs_pnfs.c | 7 +- fs/xfs/xfs_qm.c | 9 +- fs/xfs/xfs_qm_syscalls.c | 26 +--- fs/xfs/xfs_rtalloc.c | 21 ++- fs/xfs/xfs_super.c | 37 ++--- fs/xfs/xfs_symlink.c | 37 ++--- fs/xfs/xfs_trace.h | 15 +- fs/xfs/xfs_trans.c | 88 +++++------ fs/xfs/xfs_trans.h | 8 +- fs/xfs/xfs_xattr.c | 17 ++- 42 files changed, 594 insertions(+), 882 deletions(-) -- Dave Chinner david@fromorbit.com From guaneryu@gmail.com Tue Apr 5 22:45:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1C07D7CA0 for ; Tue, 5 Apr 2016 22:45:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D4479304064 for ; Tue, 5 Apr 2016 20:45:31 -0700 (PDT) X-ASG-Debug-ID: 1459914329-04cb6c245f2b87c0001-NocioJ Received: from mail-pa0-f67.google.com (mail-pa0-f67.google.com [209.85.220.67]) by cuda.sgi.com with ESMTP id cHpBAEqyCEtqEGUl (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 05 Apr 2016 20:45:29 -0700 (PDT) X-Barracuda-Envelope-From: guaneryu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.67 Received: by mail-pa0-f67.google.com with SMTP id q6so2917770pav.0 for ; Tue, 05 Apr 2016 20:45:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=UFENoaUB/7KLZmHpJzmiDmgGfHbWlZNwuxu8apyS7LE=; b=BMoXbUAQZwoKbg7T+Lb6slbFcnSxqrsUxni96QCyoQbM7NNrJbTGVqbmgnBDoqEGdY RR/+R6y/cacjGqN7bc2Sd3s8YmOEXUpddg06qEvPy6veTy7NksgMtIenO4W0aP1J6SmF W8q+DRuH5boDkIl4dYPMxwxaX9wMfQnz5koU+zgCJxGdqjnwvbPhsgeQLzjk8T4QhGLf f2JCAgz56Jhk5yyOfod3fmtTK6qTrNpE/AdoXiim857IrpFr/FieSbUwwrL7iO2yJYXe k4WI2BPUPsmesY0w0lG3IiqruExuMahILE0z0WYPMzq4XWGfRRBo3/h4Cp/9ktEn3b9w Zr7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=UFENoaUB/7KLZmHpJzmiDmgGfHbWlZNwuxu8apyS7LE=; b=ZPa7+jFMf9hT2PErZbaWrT4QGFxZW9ApnTUXUcinfO8oEUlSq941CG0Bi+36KsNL0m Q7M1u3IPt1MfHPMu54UuwsuOJ+cuClqJ064trnCx+A/SDJaoLmiz5jAGr9jv01GeuSo3 vsJH9+9XUgGgsIiTPyWhRpjtvdobX0ejD3aBDBojdZjPX8Jb4/xawbSBDJ36fLMCiaTz dBc3cB1L2G0Bkjr10I+SJcsgu7q4E9wVL+zUTPRHQcnyZoxhd2V9E/+h4VlJuFTKAQzS Jo6aWPlP/d1FXPu5moXqe4WuWxCfRWeoVlBQewWw1RAC/iMqF/grgeEfgY2UpRC0nwm7 cpNA== X-Gm-Message-State: AD7BkJJmjPHP01iqbbaDsyCRBNw7NSVezjDdTCRgkXLeE++EPXTy6L21idWZMLVuCFQmuQ== X-Received: by 10.66.251.132 with SMTP id zk4mr49356129pac.50.1459914329145; Tue, 05 Apr 2016 20:45:29 -0700 (PDT) Received: from localhost ([128.199.137.77]) by smtp.gmail.com with ESMTPSA id p26sm764302pfi.84.2016.04.05.20.45.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 05 Apr 2016 20:45:28 -0700 (PDT) From: Eryu Guan To: linux-fsdevel@vger.kernel.org Cc: Eryu Guan , Steven Whitehouse , Bob Peterson , Alexander Viro , Dave Chinner , xfs@oss.sgi.com (supporter:XFS FILESYSTEM), cluster-devel@redhat.com (open list:GFS2 FILE SYSTEM), linux-kernel@vger.kernel.org (open list) Subject: [PATCH v2] fs: return EPERM on immutable inode Date: Wed, 6 Apr 2016 11:44:12 +0800 X-ASG-Orig-Subj: [PATCH v2] fs: return EPERM on immutable inode Message-Id: <1459914252-13462-1-git-send-email-guaneryu@gmail.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1459862890-22957-1-git-send-email-guaneryu@gmail.com> References: <1459862890-22957-1-git-send-email-guaneryu@gmail.com> X-Barracuda-Connect: mail-pa0-f67.google.com[209.85.220.67] X-Barracuda-Start-Time: 1459914329 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28486 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 In most cases, EPERM is returned on immutable inode, and there're only a few places returning EACCES. I noticed this when running LTP on overlayfs, setxattr03 failed due to unexpected EACCES on immutable inode. So converting all EACCES to EPERM on immutable inode. Acked-by: Dave Chinner Signed-off-by: Eryu Guan --- v2: - update commit message to include the background on noticing this issue fs/gfs2/inode.c | 2 +- fs/namei.c | 2 +- fs/utimes.c | 3 ++- fs/xfs/xfs_ioctl.c | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index bb30f9a..4c68d91 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c @@ -1757,7 +1757,7 @@ int gfs2_permission(struct inode *inode, int mask) } if ((mask & MAY_WRITE) && IS_IMMUTABLE(inode)) - error = -EACCES; + error = -EPERM; else error = generic_permission(inode, mask); if (unlock) diff --git a/fs/namei.c b/fs/namei.c index 1d9ca2d..7f4a40a 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -408,7 +408,7 @@ int __inode_permission(struct inode *inode, int mask) * Nobody gets write access to an immutable file. */ if (IS_IMMUTABLE(inode)) - return -EACCES; + return -EPERM; } retval = do_inode_permission(inode, mask); diff --git a/fs/utimes.c b/fs/utimes.c index 85c40f4..794f5f5 100644 --- a/fs/utimes.c +++ b/fs/utimes.c @@ -92,10 +92,11 @@ static int utimes_common(struct path *path, struct timespec *times) * then we need to check permissions, because * inode_change_ok() won't do it. */ - error = -EACCES; + error = -EPERM; if (IS_IMMUTABLE(inode)) goto mnt_drop_write_and_out; + error = -EACCES; if (!inode_owner_or_capable(inode)) { error = inode_permission(inode, MAY_WRITE); if (error) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index bcb6c19..4c4c58f 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -232,7 +232,7 @@ xfs_open_by_handle( } if ((fmode & FMODE_WRITE) && IS_IMMUTABLE(inode)) { - error = -EACCES; + error = -EPERM; goto out_dput; } -- 2.5.5 From fengguang.wu@intel.com Tue Apr 5 22:56:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3489C7CA0 for ; Tue, 5 Apr 2016 22:56:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EB24B30404E for ; Tue, 5 Apr 2016 20:56:24 -0700 (PDT) X-ASG-Debug-ID: 1459914983-04cb6c24642b8a40001-NocioJ Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by cuda.sgi.com with ESMTP id DXuDE6afKM197Ofo for ; Tue, 05 Apr 2016 20:56:23 -0700 (PDT) X-Barracuda-Envelope-From: fengguang.wu@intel.com X-Barracuda-Apparent-Source-IP: 134.134.136.65 X-ASG-Whitelist: Client Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga103.jf.intel.com with ESMTP; 05 Apr 2016 20:56:22 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,446,1455004800"; d="gz'50?scan'50,208,50";a="939199863" Received: from bee.sh.intel.com (HELO bee) ([10.239.97.14]) by fmsmga001.fm.intel.com with ESMTP; 05 Apr 2016 20:56:22 -0700 Received: from kbuild by bee with local (Exim 4.83) (envelope-from ) id 1aneZl-0005dy-EY; Wed, 06 Apr 2016 11:56:17 +0800 Date: Wed, 6 Apr 2016 11:55:32 +0800 From: kbuild test robot To: Dave Chinner Cc: kbuild-all@01.org, xfs@oss.sgi.com, Christoph Hellwig , Brian Foster Subject: [xfs:xfs-4.7-writeback-bio 2/3] fs/xfs/xfs_aops.c:97:16: warning: unused variable 'blockmask' Message-ID: <201604061130.PrESp9Nb%fengguang.wu@intel.com> X-ASG-Orig-Subj: [xfs:xfs-4.7-writeback-bio 2/3] fs/xfs/xfs_aops.c:97:16: warning: unused variable 'blockmask' MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="AqsLC8rIMeq19msA" 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: 1459914983 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 --AqsLC8rIMeq19msA Content-Type: text/plain; charset=us-ascii Content-Disposition: inline tree: https://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git xfs-4.7-writeback-bio head: 0e51a8e191dbd9b9c7b7bb0a1c28d57cd2be8e6a commit: 37992c18bba3f578860c6448b7bae18a14e535d3 [2/3] xfs: don't release bios on completion immediately config: i386-randconfig-x013-201614 (attached as .config) reproduce: git checkout 37992c18bba3f578860c6448b7bae18a14e535d3 # save the attached .config to linux build tree make ARCH=i386 All warnings (new ones prefixed by >>): fs/xfs/xfs_aops.c: In function 'xfs_finish_page_writeback': >> fs/xfs/xfs_aops.c:97:16: warning: unused variable 'blockmask' [-Wunused-variable] unsigned int blockmask = (1 << inode->i_blkbits) - 1; ^ vim +/blockmask +97 fs/xfs/xfs_aops.c 81 return mp->m_rtdev_targp->bt_bdev; 82 else 83 return mp->m_ddev_targp->bt_bdev; 84 } 85 86 /* 87 * We're now finished for good with this page. Update the page state via the 88 * associated buffer_heads, paying attention to the start and end offsets that 89 * we need to process on the page. 90 */ 91 static void 92 xfs_finish_page_writeback( 93 struct inode *inode, 94 struct bio_vec *bvec, 95 int error) 96 { > 97 unsigned int blockmask = (1 << inode->i_blkbits) - 1; 98 unsigned int end = bvec->bv_offset + bvec->bv_len - 1; 99 struct buffer_head *head, *bh; 100 unsigned int off = 0; 101 102 ASSERT(bvec->bv_offset < PAGE_SIZE); 103 ASSERT((bvec->bv_offset & blockmask) == 0); 104 ASSERT(end < PAGE_SIZE); 105 ASSERT((bvec->bv_len & blockmask) == 0); --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation --AqsLC8rIMeq19msA Content-Type: application/octet-stream Content-Disposition: attachment; filename=".config.gz" Content-Transfer-Encoding: base64 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 VM28uDDVcE4o/QHLsEBDFXsBAA== --AqsLC8rIMeq19msA-- From jtulak@redhat.com Wed Apr 6 04:05:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 810B87CA0 for ; Wed, 6 Apr 2016 04:05:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 523C7304059 for ; Wed, 6 Apr 2016 02:05:49 -0700 (PDT) X-ASG-Debug-ID: 1459933547-04cb6c245f2c0ac0001-NocioJ Received: from mail-ig0-f179.google.com (mail-ig0-f179.google.com [209.85.213.179]) by cuda.sgi.com with ESMTP id Brq9Y9cRzXACrwTQ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 06 Apr 2016 02:05:48 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.179 Received: by mail-ig0-f179.google.com with SMTP id gy3so73660902igb.0 for ; Wed, 06 Apr 2016 02:05:48 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=ihFLvRJ1Vu4JmYwQ2MUH635lrv7PbEG5uEA91J3V8Qk=; b=jfyrpXqE+3vBkJNMqfqYM8apaw/RgqndkmRI7q9ONDeDIyNThQm4exso8GFFb18zD1 eA8xZfl7ywiD0e+v6mU4FJy3GfVKaZwBCQ0yj2K0vhhiHlJ7o3k0iHawkS8g9/scawQT g7ntip74c/QE+KPuQ1Gazf4DCAFujKQ3zERaF/fnsvpt819lNNWNmoie0Edvv4zvbZWX skBuQ2Zd5LfORlSjZJejyk5mNw0lfK6ozLTN28MAYPSqieBupuHLSewAyIn6w55mW5Nd 5IOrTjUFiFldOXnK1Dow6+v+z5iec9pD1lvYGYOzJzTzstX28bfYQC2Ur4d9Inj+d4wK rAdA== X-Gm-Message-State: AD7BkJLmXyd10LZ7wgc01XT2G6fYwJc9dOmMO4frlL0MS+3Itn7qZy+UErjA9u6sjqEaujNcvr1c+Mulpz53AUaI X-Received: by 10.50.112.137 with SMTP id iq9mr19866036igb.19.1459933547534; Wed, 06 Apr 2016 02:05:47 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.142 with HTTP; Wed, 6 Apr 2016 02:05:28 -0700 (PDT) In-Reply-To: <56FD87BC.5070805@sandeen.net> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-2-git-send-email-jtulak@redhat.com> <56FD87BC.5070805@sandeen.net> From: Jan Tulak Date: Wed, 6 Apr 2016 11:05:28 +0200 Message-ID: Subject: Re: [PATCH 01/19] xfsprogs: use common code for multi-disk detection To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH 01/19] xfsprogs: use common code for multi-disk detection Cc: xfs-oss Content-Type: multipart/alternative; boundary=089e013c60ec7f50a6052fcd4416 X-Barracuda-Connect: mail-ig0-f179.google.com[209.85.213.179] X-Barracuda-Start-Time: 1459933548 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28492 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 --089e013c60ec7f50a6052fcd4416 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Thu, Mar 31, 2016 at 10:25 PM, Eric Sandeen wrote: > > > Minor comment stuff below, otherwise seems ok. > > Reviewed-by: Eric Sandeen > > and feel free to add that if you make the suggested changes, too. > =E2=80=8BChanged, thanks. :-)=E2=80=8B --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --089e013c60ec7f50a6052fcd4416 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable



On Thu, Mar 31, 2016 at 10:25 PM, Eric Sandeen <sande= en@sandeen.net> wrote:

Minor comment stuff below, otherwise seems ok.

Reviewed-by: Eric Sandeen <sandeen= @redhat.com>

and feel free to add that if you make the suggested changes, too.

=E2=80=8BChanged, thanks. :-)= =E2=80=8B
=C2=A0

--
Jan Tulak
<= a href=3D"mailto:jtulak@redhat.com" target=3D"_blank">jtulak@redhat.com= =C2=A0/ jan@tulak.me<= /div>
--089e013c60ec7f50a6052fcd4416-- From jtulak@redhat.com Wed Apr 6 04:12:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 DAF427CA0 for ; Wed, 6 Apr 2016 04:12:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id AD7968F8035 for ; Wed, 6 Apr 2016 02:12:42 -0700 (PDT) X-ASG-Debug-ID: 1459933961-04cb6c245f2c0ce0001-NocioJ Received: from mail-io0-f174.google.com (mail-io0-f174.google.com [209.85.223.174]) by cuda.sgi.com with ESMTP id GDEh8XQDP8qzcKF2 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 06 Apr 2016 02:12:41 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.174 Received: by mail-io0-f174.google.com with SMTP id q128so48874053iof.3 for ; Wed, 06 Apr 2016 02:12:41 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=3lEqkh+QiyoeGoScCEIz5KUnGR1k1VH+PbKYPhs3QCU=; b=TpPsdmRL2h/LQzVGwtjEDN1d8gptdiBXWpxQdEY82iDGMIN3DwLxqS8PCSHjZ76LxV 0pJk1102tpIG+lDhZx+5vRsukc2Xu9SqwSCz2mbMTRSVAOtveukT8l4GDT6/D8zxyrRv HW1Tx8C6bSHvM9ka9Zfa4tC7hlxGdV2MObHa5ZW2u4brpGab57vPG9khqFDf1VP0xgTu L2/cljzNpkS1hcIe3OhgcpM1exH++qrKrtsFjhnP0m6BXfOYXyDr4E8v4N/HpfpIrZwL eH5yNEPeVAi+h4GcRIyGGkAIV5tRLNirVsb+OAWihLBAj66cRs7iyDqgCHmXzqTXr0ui yXZQ== X-Gm-Message-State: AD7BkJLp4KE/roqnhDvEri+60HQfG5EFllYtnNk0jzO1uLt0OadUylI0PjjcvnApyPPNCZE8YPVFXOeuylONNl8g X-Received: by 10.107.170.17 with SMTP id t17mr15992406ioe.71.1459933960725; Wed, 06 Apr 2016 02:12:40 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.88.70 with HTTP; Wed, 6 Apr 2016 02:12:21 -0700 (PDT) In-Reply-To: <56FDD750.3040002@sandeen.net> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-4-git-send-email-jtulak@redhat.com> <56FDD750.3040002@sandeen.net> From: Jan Tulak Date: Wed, 6 Apr 2016 11:12:21 +0200 Message-ID: Subject: Re: [PATCH 03/19] mkfs: Sanitise the superblock feature macros To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH 03/19] mkfs: Sanitise the superblock feature macros Cc: xfs-oss Content-Type: multipart/alternative; boundary=001a11427d74200291052fcd5d7a X-Barracuda-Connect: mail-io0-f174.google.com[209.85.223.174] X-Barracuda-Start-Time: 1459933961 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28492 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 --001a11427d74200291052fcd5d7a Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Fri, Apr 1, 2016 at 4:05 AM, Eric Sandeen wrote: > On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > > Just FYI - generally, the patch changelog goes below the "---" > so it doesn't end up as part of the changelog in git. > > =E2=80=8BGood idea, next time it should be there.=E2=80=8B > > } else { > > /* > > * The kernel doesn't currently support crc=3D0,finobt=3D= 1 > > - * filesystems. If crcs are not enabled and the user has > > - * explicitly turned them off then silently turn them off > > - * to avoid an unnecessary warning. If the user explicitl= y > > - * tried to use crc=3D0,finobt=3D1, then issue a warning = before > > - * turning them off. > > + * filesystems. If crcs are not enabled and the user has > not > > + * explicitly turned finobt on, then silently turn it off > to > > + * avoid an unnecessary warning. If the user explicitly > tried > > + * to use crc=3D0,finobt=3D1, then issue a warning before > turning > > + * them off. > > */ > > - if (finobt && finobtflag) { > > - fprintf(stderr, > > -_("warning: finobt not supported without CRC support, disabled.\n")); > > + if (sb_feat.finobt){ > > + if (sb_feat.finobtflag) { > > + fprintf(stderr, > > + _("warning: finobt not supported without CRC support, > disabled.\n")); > > + } > > + sb_feat.finobt =3D 0; > > } > > - finobt =3D 0; > > } > > Is there any other case in mkfs where options are automatically disabled? > I don't think so .. I'd just prefer a failure here, not a fix-up, even > with the warning. But I guess that's how it was before, so probably > not something to change in this patch. So never mind. :) > > =E2=80=8BWell, it was so, but as I'm trying to get rid of inconsistencies= , I changed it to a failure if both crc=3D0 and finobt=3D1 are explicitly used. > But, do we need the extra indentation? > > if (sb_feat.finobt && sb_feat.finobtflag) { > fprintf(stderr, > _("warning: finobt not supported without CRC support, disabled.\n")); > } > sb_feat.finobt =3D 0; > > would suffice as before, no? Meh. Not a big deal I guess.... > =E2=80=8BChanged. Honestly, I don't like the strings starting at the beginn= ing of the line, because it breaks the indentation flow, but the rest of the code uses this style, so I should stick to it.=E2=80=8B > > @@ -2962,7 +3038,7 @@ _("size %s specified for log subvolume is too > large, maximum is %lld blocks\n"), > > /* > > * Free INO btree root block > > */ > > - if (!finobt) { > > + if (!sb_feat.finobt){ > ^ please fix whitespace :) > =E2=80=8BDone. Thank you for the review. I will wait a little longer if someone spots something more, before sending an updated patchset.=E2=80=8B :-) =E2=80=8BCheers, Jan=E2=80=8B --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --001a11427d74200291052fcd5d7a Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable



On Fri, Apr 1, 2016 at 4:05 AM, Eric Sandeen <sandeen@s= andeen.net> wrote:
On 3/24/16 6:15 AM, jtulak@re= dhat.com wrote:
=C2=A0
Just FYI - generally, the patch changelog goes below the "---&q= uot;
so it doesn't end up as part of the changelog in git.

=E2=80=8BGood idea, next time it should be there.= =E2=80=8B


>=C2=A0 =C2=A0 =C2=A0 =C2=A0} else {
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/*
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * The kernel do= esn't currently support crc=3D0,finobt=3D1
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * filesystems. If cr= cs are not enabled and the user has
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * explicitly turned = them off then silently turn them off
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * to avoid an unnece= ssary warning. If the user explicitly
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * tried to use crc= =3D0,finobt=3D1, then issue a warning before
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * turning them off.<= br> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * filesystems. If cr= cs are not enabled and the user has not
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * explicitly turned = finobt on, then silently turn it off to
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * avoid an unnecessa= ry warning. If the user explicitly tried
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * to use crc=3D0,fin= obt=3D1, then issue a warning before turning
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * them off.
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 */
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (finobt &&= finobtflag) {
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0fprintf(stderr,
> -_("warning: finobt not supported without CRC support, disabled.\= n"));
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (sb_feat.finobt){<= br> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0if (sb_feat.finobtflag) {
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr,
> +=C2=A0 =C2=A0 =C2=A0_("warning: finobt not supported without CRC= support, disabled.\n"));
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0}
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0sb_feat.finobt =3D 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=A0 =C2=A0 =C2=A0finobt =3D 0;
>=C2=A0 =C2=A0 =C2=A0 =C2=A0}

Is there any other case in mkfs where options are automatically disa= bled?
I don't think so .. I'd just prefer a failure here, not a fix-up, e= ven
with the warning.=C2=A0 But I guess that's how it was before, so probab= ly
not something to change in this patch.=C2=A0 So never mind.=C2=A0 :)

=E2=80=8BWell, it was so, but as I'm trying to= get rid of inconsistencies, I changed it to a failure if both crc=3D0 and = finobt=3D1 are explicitly used.=C2=A0

=C2=A0
But, do we need the extra indentation?

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (sb_feat.finobt = && sb_feat.finobtflag) {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 fprintf(stderr,
_("warning: finobt not supported without CRC support,= disabled.\n"));
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 sb_feat.fino= bt =3D 0;

would suffice as before, no? Meh.=C2=A0 Not a big deal I guess....
=C2=A0
=E2=80=8BChanged. Honestly,= I don't like the strings starting at the beginning of the line, becaus= e it breaks the indentation flow, but the rest of the code uses this style,= so I should stick to it.=E2=80=8B
=C2=A0


> @@ -2962,7 +3038,7 @@ _("size %s specified for log subvolume is t= oo large, maximum is %lld blocks\n"),
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/*
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * Free INO btre= e root block
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 */
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (!finobt) {
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (!sb_feat.finobt){=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ^ please fix wh= itespace :)

=E2=80=8BDone.

Thank you for the review. I will wait a little longer if some= one spots something more, before sending an updated patchset.=E2=80=8B :-)<= /div>
=E2=80=8BCheers,
Jan=E2=80=8B


--
--001a11427d74200291052fcd5d7a-- From dave@fromorbit.com Wed Apr 6 04:23:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 059A07CA1 for ; Wed, 6 Apr 2016 04:23:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id AB87E304059 for ; Wed, 6 Apr 2016 02:23:38 -0700 (PDT) X-ASG-Debug-ID: 1459934616-04bdf011042705e0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id IAC0nuT8D8mkLnKd for ; Wed, 06 Apr 2016 02:23:36 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2ByCgBb1ARXPDGaLHlcgzeBUIZrn1EBAQEBAQEGj2CCGYtcTQEBAQEBAQcBAQEBQkCEQgEFJy8zCBgxOQMHFBmIJsEPhVmJIH6FCgWYAY4NjwxFjlyCGAELgjcqMIZ6gT0BAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail06.adl2.internode.on.net with ESMTP; 06 Apr 2016 18:53:31 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1anjgP-0004C4-2l for xfs@oss.sgi.com; Wed, 06 Apr 2016 19:23:29 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1anjft-0006il-Vk for xfs@oss.sgi.com; Wed, 06 Apr 2016 19:22:57 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/5] xfs: skip stale inodes in xfs_iflush_cluster Date: Wed, 6 Apr 2016 19:22:51 +1000 X-ASG-Orig-Subj: [PATCH 2/5] xfs: skip stale inodes in xfs_iflush_cluster Message-Id: <1459934574-25543-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1459934574-25543-1-git-send-email-david@fromorbit.com> References: <1459934574-25543-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1459934616 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28492 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner We don't write back stale inodes, so we should skip them in xfS_iflush_cluster, too. Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 2718d10..6598104 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -3190,10 +3190,11 @@ xfs_iflush_cluster( * because this is an RCU protected lookup, we could find a * recently freed or even reallocated inode during the lookup. * We need to check under the i_flags_lock for a valid inode - * here. Skip it if it is not valid or the wrong inode. + * here. Skip it if it is not valid, stale or the wrong inode. */ spin_lock(&cip->i_flags_lock); if (!cip->i_ino || + __xfs_iflags_test(ip, XFS_ISTALE) || (XFS_INO_TO_AGINO(mp, cip->i_ino) & mask) != first_index) { spin_unlock(&cip->i_flags_lock); continue; -- 2.7.0 From dave@fromorbit.com Wed Apr 6 04:23:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id ECE007CA0 for ; Wed, 6 Apr 2016 04:23:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B840F30405F for ; Wed, 6 Apr 2016 02:23:38 -0700 (PDT) X-ASG-Debug-ID: 1459934612-04cb6c245f2c10b0002-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id cF0E9cYFERWWw5q2 for ; Wed, 06 Apr 2016 02:23:35 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2ByCgBb1ARXPDGaLHlcgzeBUIZrn1EBAQEBAQEGj2CCGYtcTQEBAQEBAQcBAQEBQkCEQgEFJy8zCBgxOQMHFBmIJsEPhVmPKAWHb5ASjg2PDEWOXIIYAQtCGYFcKjCINwEBAQ Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail06.adl2.internode.on.net with ESMTP; 06 Apr 2016 18:53:31 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1anjgP-0004C3-2J for xfs@oss.sgi.com; Wed, 06 Apr 2016 19:23:29 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1anjft-0006ig-V0 for xfs@oss.sgi.com; Wed, 06 Apr 2016 19:22:57 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/5] xfs: fix inode validity check in xfs_iflush_cluster Date: Wed, 6 Apr 2016 19:22:50 +1000 X-ASG-Orig-Subj: [PATCH 1/5] xfs: fix inode validity check in xfs_iflush_cluster Message-Id: <1459934574-25543-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1459934574-25543-1-git-send-email-david@fromorbit.com> References: <1459934574-25543-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1459934615 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28492 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Some careless idiot wrote crap code in commit 1a3e8f3 ("xfs: convert inode cache lookups to use RCU locking") back in late 2010, and so xfs_iflush_cluster checks the wrong inode for whether it is still valid under RCU protection. Fix it to lock and check the correct inode. Part of the reason for the screwup was the unconventional naming of the cluster inode variable - iq - so also rename all the cluster inode variables to use a more conventional prefixes to reduce potential future confusion (cilist, cilist_size, cip). Discovered-by: Brain Foster Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 64 +++++++++++++++++++++++++++--------------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index f79ea59..2718d10 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -3149,16 +3149,16 @@ out_release_wip: STATIC int xfs_iflush_cluster( - xfs_inode_t *ip, - xfs_buf_t *bp) + struct xfs_inode *ip, + struct xfs_buf *bp) { - xfs_mount_t *mp = ip->i_mount; + struct xfs_mount *mp = ip->i_mount; struct xfs_perag *pag; unsigned long first_index, mask; unsigned long inodes_per_cluster; - int ilist_size; - xfs_inode_t **ilist; - xfs_inode_t *iq; + int cilist_size; + struct xfs_inode **cilist; + struct xfs_inode *cip; int nr_found; int clcount = 0; int bufwasdelwri; @@ -3167,23 +3167,23 @@ xfs_iflush_cluster( pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); inodes_per_cluster = mp->m_inode_cluster_size >> mp->m_sb.sb_inodelog; - ilist_size = inodes_per_cluster * sizeof(xfs_inode_t *); - ilist = kmem_alloc(ilist_size, KM_MAYFAIL|KM_NOFS); - if (!ilist) + cilist_size = inodes_per_cluster * sizeof(xfs_inode_t *); + cilist = kmem_alloc(cilist_size, KM_MAYFAIL|KM_NOFS); + if (!cilist) goto out_put; mask = ~(((mp->m_inode_cluster_size >> mp->m_sb.sb_inodelog)) - 1); first_index = XFS_INO_TO_AGINO(mp, ip->i_ino) & mask; rcu_read_lock(); /* really need a gang lookup range call here */ - nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void**)ilist, + nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void**)cilist, first_index, inodes_per_cluster); if (nr_found == 0) goto out_free; for (i = 0; i < nr_found; i++) { - iq = ilist[i]; - if (iq == ip) + cip = cilist[i]; + if (cip == ip) continue; /* @@ -3192,20 +3192,20 @@ xfs_iflush_cluster( * We need to check under the i_flags_lock for a valid inode * here. Skip it if it is not valid or the wrong inode. */ - spin_lock(&ip->i_flags_lock); - if (!ip->i_ino || - (XFS_INO_TO_AGINO(mp, iq->i_ino) & mask) != first_index) { - spin_unlock(&ip->i_flags_lock); + spin_lock(&cip->i_flags_lock); + if (!cip->i_ino || + (XFS_INO_TO_AGINO(mp, cip->i_ino) & mask) != first_index) { + spin_unlock(&cip->i_flags_lock); continue; } - spin_unlock(&ip->i_flags_lock); + spin_unlock(&cip->i_flags_lock); /* * Do an un-protected check to see if the inode is dirty and * is a candidate for flushing. These checks will be repeated * later after the appropriate locks are acquired. */ - if (xfs_inode_clean(iq) && xfs_ipincount(iq) == 0) + if (xfs_inode_clean(cip) && xfs_ipincount(cip) == 0) continue; /* @@ -3213,15 +3213,15 @@ xfs_iflush_cluster( * then this inode cannot be flushed and is skipped. */ - if (!xfs_ilock_nowait(iq, XFS_ILOCK_SHARED)) + if (!xfs_ilock_nowait(cip, XFS_ILOCK_SHARED)) continue; - if (!xfs_iflock_nowait(iq)) { - xfs_iunlock(iq, XFS_ILOCK_SHARED); + if (!xfs_iflock_nowait(cip)) { + xfs_iunlock(cip, XFS_ILOCK_SHARED); continue; } - if (xfs_ipincount(iq)) { - xfs_ifunlock(iq); - xfs_iunlock(iq, XFS_ILOCK_SHARED); + if (xfs_ipincount(cip)) { + xfs_ifunlock(cip); + xfs_iunlock(cip, XFS_ILOCK_SHARED); continue; } @@ -3229,18 +3229,18 @@ xfs_iflush_cluster( * arriving here means that this inode can be flushed. First * re-check that it's dirty before flushing. */ - if (!xfs_inode_clean(iq)) { + if (!xfs_inode_clean(cip)) { int error; - error = xfs_iflush_int(iq, bp); + error = xfs_iflush_int(cip, bp); if (error) { - xfs_iunlock(iq, XFS_ILOCK_SHARED); + xfs_iunlock(cip, XFS_ILOCK_SHARED); goto cluster_corrupt_out; } clcount++; } else { - xfs_ifunlock(iq); + xfs_ifunlock(cip); } - xfs_iunlock(iq, XFS_ILOCK_SHARED); + xfs_iunlock(cip, XFS_ILOCK_SHARED); } if (clcount) { @@ -3250,7 +3250,7 @@ xfs_iflush_cluster( out_free: rcu_read_unlock(); - kmem_free(ilist); + kmem_free(cilist); out_put: xfs_perag_put(pag); return 0; @@ -3293,8 +3293,8 @@ cluster_corrupt_out: /* * Unlocks the flush lock */ - xfs_iflush_abort(iq, false); - kmem_free(ilist); + xfs_iflush_abort(cip, false); + kmem_free(cilist); xfs_perag_put(pag); return -EFSCORRUPTED; } -- 2.7.0 From dave@fromorbit.com Wed Apr 6 04:23:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2B3F27CA0 for ; Wed, 6 Apr 2016 04:23:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id F08AF8F8039 for ; Wed, 6 Apr 2016 02:23:40 -0700 (PDT) X-ASG-Debug-ID: 1459934618-04cbb07ad82aac60001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id BcnQkeSIklgsX5Oc for ; Wed, 06 Apr 2016 02:23:38 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AtDgBb1ARXPDGaLHlcgzeBUIZrn1EBAQEBAQEGkXmKHIFATQEBAQEBAQcBAQEBQkBBEgGDbgEFJy8zCBgxOQMHFBmIJsEPhVmJGGAmhQoFmAGODYFlh3WFMkWOXIIYAQtCGYFcKjCFSoEyBxcHgRYBAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail06.adl2.internode.on.net with ESMTP; 06 Apr 2016 18:53:31 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1anjgP-0004C6-3d for xfs@oss.sgi.com; Wed, 06 Apr 2016 19:23:29 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1anjfu-0006iv-0M for xfs@oss.sgi.com; Wed, 06 Apr 2016 19:22:58 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/5] xfs: xfs_inode_free() isn't RCU safe Date: Wed, 6 Apr 2016 19:22:53 +1000 X-ASG-Orig-Subj: [PATCH 4/5] xfs: xfs_inode_free() isn't RCU safe Message-Id: <1459934574-25543-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1459934574-25543-1-git-send-email-david@fromorbit.com> References: <1459934574-25543-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1459934618 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28492 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The xfs_inode freed in xfs_inode_free() has multiple allocated structures attached to it. We free these in xfs_inode_free() before we mark the inode as invalid, and before we run call_rcu() to queue the structure for freeing. Unfortunately, this freeing can race with other accesses that are in the RCU current grace period that have found the inode in the radix tree with a valid state. This includes xfs_iflush_cluster(), which calls xfs_inode_clean(), and that accesses the inode log item on the xfs_inode. The log item structure is freed in xfs_inode_free(), so there is the possibility we can be accessing freed memory in xfs_iflush_cluster() after validating the xfs_inode structure as being valid for this RCU context. Hence we can get spuriously incorrect clean state returned from such checks. This can lead to use thinking the inode is dirty when it is, in fact, clean, and so incorrectly attaching it to the buffer for IO and completion processing. This then leads to use-after-free situations on the xfs_inode itself if the IO completes after the current RCU grace period expires. The buffer callbacks will access the xfs_inode and try to do all sorts of things it shouldn't with freed memory. IOWs, xfs_iflush_cluster() only works correctly when racing with inode reclaim if the inode log item is present and correctly stating the inode is clean. If the inode is being freed, then reclaim has already made sure the inode is clean, and hence xfs_iflush_cluster can skip it. However, we are accessing the inode inode under RCU read lock protection and so also must ensure that all dynamically allocated memory we reference in this context is not freed until the RCU grace period expires. To fix this, move all the potential memory freeing into xfs_inode_free_callback() so that we are guarantee RCU protected lookup code will always have the memory structures it needs available during the RCU grace period that lookup races can occur in. Discovered-by: Brain Foster Signed-off-by: Dave Chinner --- fs/xfs/xfs_icache.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index bf2d607..0c94cde 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -94,13 +94,6 @@ xfs_inode_free_callback( struct inode *inode = container_of(head, struct inode, i_rcu); struct xfs_inode *ip = XFS_I(inode); - kmem_zone_free(xfs_inode_zone, ip); -} - -void -xfs_inode_free( - struct xfs_inode *ip) -{ switch (VFS_I(ip)->i_mode & S_IFMT) { case S_IFREG: case S_IFDIR: @@ -118,6 +111,13 @@ xfs_inode_free( ip->i_itemp = NULL; } + kmem_zone_free(xfs_inode_zone, ip); +} + +void +xfs_inode_free( + struct xfs_inode *ip) +{ /* * Because we use RCU freeing we need to ensure the inode always * appears to be reclaimed with an invalid inode number when in the -- 2.7.0 From dave@fromorbit.com Wed Apr 6 04:23:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 787007CA1 for ; Wed, 6 Apr 2016 04:23:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 29458304059 for ; Wed, 6 Apr 2016 02:23:40 -0700 (PDT) X-ASG-Debug-ID: 1459934616-04bdf011042705e0002-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id dHm6sPHQSCOac6Aq for ; Wed, 06 Apr 2016 02:23:37 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2ByCgBb1ARXPDGaLHlUCIM3gVCGa59RAQEBAQEBBpF5ihyBQE0BAQEBAQEHAQEBAUJAhEIBBScvHhUIGDE5AwcUGYgmwQ+FWYkuSoUwBZgBjg2PDI8hghgBC0IZgVwqMIg3AQEB Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail06.adl2.internode.on.net with ESMTP; 06 Apr 2016 18:53:31 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1anjgP-0004C7-49 for xfs@oss.sgi.com; Wed, 06 Apr 2016 19:23:29 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1anjfu-0006j0-0q for xfs@oss.sgi.com; Wed, 06 Apr 2016 19:22:58 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 5/5] xfs: mark reclaimed inodes invalid earlier Date: Wed, 6 Apr 2016 19:22:54 +1000 X-ASG-Orig-Subj: [PATCH 5/5] xfs: mark reclaimed inodes invalid earlier Message-Id: <1459934574-25543-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1459934574-25543-1-git-send-email-david@fromorbit.com> References: <1459934574-25543-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1459934617 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28492 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The last thing we do before using call_rcu() on an xfs_inode to be freed is mark it as invalid. This means there is a window between when we know for certain that the inode is going to be freed and when we do actually mark it as "freed". This is important in the context of RCU lookups - we can look up the inode, find that it is valid, and then use it as such not realising that it is in the final stages of being freed. As such, mark the inode as being invalid the moment we know it is going to be reclaimed. This can be done while we still hold the XFS_ILOCK_EXCL and the flush lock in xfs_inode_reclaim, meaning that it occurs well before we remove it from the radix tree, and that the i_flags_lock, the XFS_ILOCK and the inode flush lock all act as synchronisation points for detecting that an inode is about to go away. For defensive purposes, this allows us to add a further check to xfs_iflush_cluster to ensure we skip inodes that are being freed after we grab the XFS_ILOCK_SHARED and the flush lock - we know that if the inode number if valid while we have these locks held we know that it has not progressed through reclaim to the point where it is clean and is about to be freed. Signed-off-by: Dave Chinner --- fs/xfs/xfs_icache.c | 40 ++++++++++++++++++++++++++++++++-------- fs/xfs/xfs_inode.c | 14 +++++++++++++- 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index 0c94cde..a60db43 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -114,6 +114,18 @@ xfs_inode_free_callback( kmem_zone_free(xfs_inode_zone, ip); } +static void +__xfs_inode_free( + struct xfs_inode *ip) +{ + /* asserts to verify all state is correct here */ + ASSERT(atomic_read(&ip->i_pincount) == 0); + ASSERT(!xfs_isiflocked(ip)); + XFS_STATS_DEC(ip->i_mount, vn_active); + + call_rcu(&VFS_I(ip)->i_rcu, xfs_inode_free_callback); +} + void xfs_inode_free( struct xfs_inode *ip) @@ -129,12 +141,7 @@ xfs_inode_free( ip->i_ino = 0; spin_unlock(&ip->i_flags_lock); - /* asserts to verify all state is correct here */ - ASSERT(atomic_read(&ip->i_pincount) == 0); - ASSERT(!xfs_isiflocked(ip)); - XFS_STATS_DEC(ip->i_mount, vn_active); - - call_rcu(&VFS_I(ip)->i_rcu, xfs_inode_free_callback); + __xfs_inode_free(ip); } /* @@ -929,6 +936,7 @@ xfs_reclaim_inode( int sync_mode) { struct xfs_buf *bp = NULL; + xfs_ino_t ino = ip->i_ino; /* for radix_tree_delete */ int error; restart: @@ -993,6 +1001,22 @@ restart: xfs_iflock(ip); reclaim: + /* + * Because we use RCU freeing we need to ensure the inode always appears + * to be reclaimed with an invalid inode number when in the free state. + * We do this as early as possible under the ILOCK and flush lock so + * that xfs_iflush_cluster() can be guaranteed to detect races with us + * here. By doing this, we guarantee that once xfs_iflush_cluster has + * locked both the XFS_ILOCK and the flush lock that it will see either + * a valid, flushable inode that will serialise correctly against the + * locks below, or it will see a clean (and invalid) inode that it can + * skip. + */ + spin_lock(&ip->i_flags_lock); + ip->i_flags = XFS_IRECLAIM; + ip->i_ino = 0; + spin_unlock(&ip->i_flags_lock); + xfs_ifunlock(ip); xfs_iunlock(ip, XFS_ILOCK_EXCL); @@ -1006,7 +1030,7 @@ reclaim: */ spin_lock(&pag->pag_ici_lock); if (!radix_tree_delete(&pag->pag_ici_root, - XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino))) + XFS_INO_TO_AGINO(ip->i_mount, ino))) ASSERT(0); __xfs_inode_clear_reclaim(pag, ip); spin_unlock(&pag->pag_ici_lock); @@ -1023,7 +1047,7 @@ reclaim: xfs_qm_dqdetach(ip); xfs_iunlock(ip, XFS_ILOCK_EXCL); - xfs_inode_free(ip); + __xfs_inode_free(ip); return error; out_ifunlock: diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index b984be4..5b84bbc 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -3222,7 +3222,6 @@ xfs_iflush_cluster( * Try to get locks. If any are unavailable or it is pinned, * then this inode cannot be flushed and is skipped. */ - if (!xfs_ilock_nowait(cip, XFS_ILOCK_SHARED)) continue; if (!xfs_iflock_nowait(cip)) { @@ -3235,6 +3234,19 @@ xfs_iflush_cluster( continue; } + + /* + * Check the inode number again, just to be certain we are not + * racing with freeing in xfs_reclaim_inode(). See the comments + * in that function for more information as to why the initial + * check is not sufficient. + */ + if (!cip->i_ino) { + xfs_ifunlock(cip); + xfs_iunlock(cip, XFS_ILOCK_SHARED); + continue; + } + /* * arriving here means that this inode can be flushed. First * re-check that it's dirty before flushing. -- 2.7.0 From dave@fromorbit.com Wed Apr 6 04:23:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 670AB7CA0 for ; Wed, 6 Apr 2016 04:23:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B13D4AC001 for ; Wed, 6 Apr 2016 02:23:38 -0700 (PDT) X-ASG-Debug-ID: 1459934612-04cb6c245f2c10b0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id zLOmLPzp1O3LUina for ; Wed, 06 Apr 2016 02:23:33 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BuCgBb1ARXPDGaLHlcgzeIO59RAQEBAQEBBo9gghmLXE0BAQEBAQEHAQEBAUJAhR47gQIDB4hTnwuiBIVZih6FCgWYAY4NjwxFjlyCGAELAUEZgVwqiGcBAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail06.adl2.internode.on.net with ESMTP; 06 Apr 2016 18:53:31 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1anjgP-0004C2-1b for xfs@oss.sgi.com; Wed, 06 Apr 2016 19:23:29 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1anjft-0006id-Ua for xfs@oss.sgi.com; Wed, 06 Apr 2016 19:22:57 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/5] xfs; xfs_iflush_cluster vs xfs_reclaim_inode Date: Wed, 6 Apr 2016 19:22:49 +1000 X-ASG-Orig-Subj: [PATCH 0/5] xfs; xfs_iflush_cluster vs xfs_reclaim_inode Message-Id: <1459934574-25543-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1459934613 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28492 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, There is a problem that RHEL QE tripped over on a long-running fsstress test on a RHEL 6.6. Brian did all the hard work of working out the initial cause of the GPF that was being tripped, but had not yet got past how to fix the issues around xfs_free_inode. The code is the same as the current upstream code, so the problem still exists.... The first patch fixes an obvious (now!) bug in xfs_iflush_cluster where it checks the wrong inode after lookup for validity. It still kind-of works, because the correct inode number is used for the "are we still in the right cluster" check, so it's not quite a hole the size of a truck. Still something that should not have slipped through 6 years ago and not been discovered until now... The most important patch (#4) address the use-after-free issues that the xfs inode has w.r.t. RCU freeing and the lookup that xfs_iflush_cluster is doing under the rcu_read_lock. All the structures accessed under the RCU context need to be freed after the current RCU grace period expires, as RCU lookups may attempt to access them at any time during the grace period. hence we have to move them into the RCU callback so that we don't free them prematurely. The rest of the patches are defensive in that they make xfs_iflush_cluster only act on relevant inodes and be able to guarantee detection inodes that are in the process of being freed. While these aren't absolutely necessary, it seems silly to ignore these obvious issues while I'm fixing up other issues with the same code. There's some more detail on the fixes in the commit descriptions. Brian, I've only run this through xfstests, so I have no real idea if it fixes the problem fsstress has uncovered. AIUI it takes 3 or 4 days to reproduce the issue so this is kind of a pre-emptive strike on what I think is the underlying issue based on your description and commentary. I figured having code to explain the problems would save some time while you sleep.... Comments, thoughts, testing and flames all welcome... -Dave. From dave@fromorbit.com Wed Apr 6 04:23:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9F6C27CA1 for ; Wed, 6 Apr 2016 04:23:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 727CB8F8039 for ; Wed, 6 Apr 2016 02:23:42 -0700 (PDT) X-ASG-Debug-ID: 1459934612-04cb6c245f2c10b0003-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 832iIJpD1LiMc3sK for ; Wed, 06 Apr 2016 02:23:38 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2ByCgBb1ARXPDGaLHlcgzeBUIZrn1EBAQEBAQEGj2CCGYtcTQEBAQEBAQcBAQEBQkCEQgEFJy8zCBgxOQMHFBmIJsEPhVmKHoUKBZgBiGiFJY8MRY5cghgBC4I3KjCINwEBAQ Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail06.adl2.internode.on.net with ESMTP; 06 Apr 2016 18:53:31 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1anjgP-0004C5-3F for xfs@oss.sgi.com; Wed, 06 Apr 2016 19:23:29 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1anjft-0006iq-WB for xfs@oss.sgi.com; Wed, 06 Apr 2016 19:22:57 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/5] xfs: xfs_iflush_cluster has range issues Date: Wed, 6 Apr 2016 19:22:52 +1000 X-ASG-Orig-Subj: [PATCH 3/5] xfs: xfs_iflush_cluster has range issues Message-Id: <1459934574-25543-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1459934574-25543-1-git-send-email-david@fromorbit.com> References: <1459934574-25543-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1459934617 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28492 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner xfs_iflush_cluster() does a gang lookup on the radix tree, meaning it can find inode beyond the current cluster if there is sparse cache population. gang lookups return results in ascending index order, so stop trying to cluster iodes once the first inode outside the cluster mask is detected. Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 6598104..b984be4 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -3194,11 +3194,20 @@ xfs_iflush_cluster( */ spin_lock(&cip->i_flags_lock); if (!cip->i_ino || - __xfs_iflags_test(ip, XFS_ISTALE) || - (XFS_INO_TO_AGINO(mp, cip->i_ino) & mask) != first_index) { + __xfs_iflags_test(ip, XFS_ISTALE)) { spin_unlock(&cip->i_flags_lock); continue; } + + /* + * Once we fall off the end of the cluster, no point checking + * any more inodes in the list because they will also all be + * outside the cluster. + */ + if ((XFS_INO_TO_AGINO(mp, cip->i_ino) & mask) != first_index) { + spin_unlock(&cip->i_flags_lock); + break; + } spin_unlock(&cip->i_flags_lock); /* -- 2.7.0 From irislee02@vip.sina.com Wed Apr 6 05:54:14 2016 Return-Path: X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A99E17CA0 for ; Wed, 6 Apr 2016 05:54:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7494C304048 for ; Wed, 6 Apr 2016 03:54:11 -0700 (PDT) X-ASG-Debug-ID: 1459940000-04cbb07ad62af1e0001-NocioJ Received: from vip.sina.com ([223.73.2.58]) by cuda.sgi.com with ESMTP id ReKF5aHEAG9UdGVH for ; Wed, 06 Apr 2016 03:53:50 -0700 (PDT) X-Barracuda-Envelope-From: irislee02@vip.sina.com X-Barracuda-Apparent-Source-IP: 223.73.2.58 Received: from workstation ([192.168.0.1]) by (Merak 8.0.3) with SMTP id UB106958 From:"2016 HOT VR BOX Glasses" To: "xfs" Subject: 2016 HOT VR BOX Glasses Message-ID: <3997de2345face4e85fd817bed9883f4@vip.sina.com> X-ASG-Orig-Subj: 2016 HOT VR BOX Glasses Date: Wed, 06 Apr 2016 19:01:34 +0800 MIME-Version: 1.0 X-Priority: 3 X-Mailer: Email Sender 2.0 Content-Type: multipart/related; type="multipart/alternative"; boundary="------_=_NextPart_001_F0F30E07.D72B7446" X-Barracuda-Connect: UNKNOWN[223.73.2.58] X-Barracuda-Start-Time: 1459940030 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: -1001.00 X-Barracuda-Spam-Status: No, SCORE=-1001.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 --------_=_NextPart_001_F0F30E07.D72B7446 Content-Type: multipart/alternative; boundary="------_=_NextPart_002_17822EDA.0F085346" --------_=_NextPart_002_17822EDA.0F085346 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Dear Friend,=0D=0AHow is your business?=0D=0ASorry to bother = you again.=0D=0APlease check our VR Glasses as below.=0D=0ALet = me know if you are interested in.=0D=0AMany thanks! --------_=_NextPart_002_17822EDA.0F085346 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable =0D=0A=0D=0A=0D=0A=0D=0A=0D=0A

Dear Friend,

=0D=0A

How is = your business?

=0D=0A

Sorry = to bother you again.

=0D=0A

Please check our VR = Glasses as below.

=0D=0A

Let me know if you are interested in.

=0D=0A

Many thanks!

=0D=0A

 

=0D=0A

3D""

--------_=_NextPart_002_17822EDA.0F085346-- --------_=_NextPart_001_F0F30E07.D72B7446 Content-Type: image/png; name="ATT00002_recompress.png" Content-Location: ATT00002_recompress.png Content-ID: <39286f7a0dbcbb47a2584451259879e7@vip.sina.com> Content-Transfer-Encoding: base64 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 vGKzuq7cqu4rt3Hcps58/mnlFv0IOP68ciPXe44/0r4fl6/zHu3zenXi+q9XbHT0zcpN+mr5JnVc ul5fIkV/hURt1HHFOn2xco2jL3mfr5av0TdLV+vbpWv0/ZI1+gFQ7QS4frcQsuOitfqGY0d+/3zp Wn3K9R8vg5Yu4/tyrl2l7wHYnrz7UCT+4b/t08g9+9V97Xp+XwIt1TcLFuqreYv0NUD0JYDVccEq juv0FcLCF/PW6rN5q/S5oxX6dO5yfWE0a6m+5jhgw3ZtvXJd569dU7fv+ygkZU692XIK0WswHYtY JNw9G1ptUUyqL9QeoNRpsmr65Lm6evk6ZpxLGjZhvn5F++8yeKJ6jp6lfuPnasC4ORo4ZhY0U0Oj ZmnoqNnQXA2O4veRszVo1BxorgaNnKeBI+ar/7C56jd0nvoMnq1eg6PVA/Dq1n+8o659x6lzr9H6 sdtIfQf4fPPzYH3deZg6fNtXn37XX5//MFCfduqv9zv2UOsOnT30ya969+Nf1fKjzmrx4S9q/sHP atLuB9Vp8aWqNfpEVRt2UJX6HVS57seqWPtDvVO9nUpXaa0SlQCdck1UsGwj5S9dX3lL1lHeUnWU s2gN5SxcTTkKVFb2vJWUPU9FZc1VXtlylFOWHGWUKXspRxmylVCGrCXwqRXDr1KUY1G9kaGwXsmQ Xy+lz6sX3syt59/Iqede99Czr+XQ069k05OYvZ54MaMef/5tPfrsWx56+k098tQbSvfk63ro8Vcd PfzoaxCfH3lZDz7yAvS8owfSPQs9o/sefkr3PPS40jz4GObPR3U3dNcD6bj2KY1Gqzpz+Zq2bt6v 557JqzTZGqr86KPKQQSdgU5OW8/wcNvomZlKoVkBG0vymR3en3naeZnlKisgUhKfTlfAqwybQ/NM PO1cKKYBGSBlB3ByEqWYEz9gNpSVLGBDVkCp5FRXTwe1yp2YPNDJGkPY4IRDGnzcMoaexKzi03Ru gI6Z4RzouGgIcypZ6OUF5QF0Iu8tpEF9Z+oqCDkGs9Drj6TVG4DOt+2aaN/mFbpyZJeuHt+jy4d2 6PyeDbp2bIeuH92my/vX6srhjTq+ZaFObl2k3xZHa/3caC2JjtLMkf01bUhvTe7TVRN7/KrJPbpo Sq9ujsZ1/0Hje/yo4T99qV5ffKhfPmqjTh+01k9ffKCfv+6gLzu0VdP6tVS+dHEVL1pIxYoWVdmy 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 --------_=_NextPart_001_F0F30E07.D72B7446-- From dan.carpenter@oracle.com Wed Apr 6 05:57:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B5EFC7CA0 for ; Wed, 6 Apr 2016 05:57:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 78ACE304053 for ; Wed, 6 Apr 2016 03:57:10 -0700 (PDT) X-ASG-Debug-ID: 1459940226-04cb6c24642c3780001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id rJ2Z8xSlHvbTUZBT (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 06 Apr 2016 03:57:07 -0700 (PDT) X-Barracuda-Envelope-From: dan.carpenter@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 u36Av5Kj029222 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 6 Apr 2016 10:57:06 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u36Av5u3016590 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 6 Apr 2016 10:57:05 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u36Av2w9009276 for ; Wed, 6 Apr 2016 10:57:04 GMT Received: from mwanda (/154.0.139.178) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 06 Apr 2016 03:57:02 -0700 Date: Wed, 6 Apr 2016 13:56:57 +0300 From: Dan Carpenter To: darrick.wong@oracle.com Cc: xfs@oss.sgi.com Subject: re: xfs: use named array initializers for log item dumping Message-ID: <20160406105657.GA30644@mwanda> X-ASG-Orig-Subj: re: xfs: use named array initializers for log item dumping MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1459940227 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28494 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain Hello Darrick J. Wong, The patch 5110cd82ca90: "xfs: use named array initializers for log item dumping" from Mar 7, 2016, leads to the following static checker warning: fs/xfs/xfs_log.c:2085 xlog_print_tic_res() error: buffer overflow 'trans_type_str' 43 <= 43 fs/xfs/xfs_log.c 2080 2081 xfs_warn(mp, "xlog_write: reservation summary:"); 2082 xfs_warn(mp, " trans type = %s (%u)", 2083 ((ticket->t_trans_type <= 0 || 2084 ticket->t_trans_type > XFS_TRANS_TYPE_MAX) ? ^ Should be >=. Why is zero invalid? 2085 "bad-trans-type" : trans_type_str[ticket->t_trans_type]), 2086 ticket->t_trans_type); 2087 xfs_warn(mp, " unit res = %d bytes", regards, dan carpenter From bfoster@redhat.com Wed Apr 6 07:51:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 223CB7CA0 for ; Wed, 6 Apr 2016 07:51:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DC9D8304059 for ; Wed, 6 Apr 2016 05:51:39 -0700 (PDT) X-ASG-Debug-ID: 1459947097-04cbb07ad52b3600001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xrGDwuIhLeJaWoK2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 06 Apr 2016 05:51:38 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B70EFC057FAC; Wed, 6 Apr 2016 12:51:37 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-153.bos.redhat.com [10.18.41.153]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u36Cpbqh026098; Wed, 6 Apr 2016 08:51:37 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id D9747120505; Wed, 6 Apr 2016 08:51:36 -0400 (EDT) Date: Wed, 6 Apr 2016 08:51:36 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/5] xfs: fix inode validity check in xfs_iflush_cluster Message-ID: <20160406125136.GA4188@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/5] xfs: fix inode validity check in xfs_iflush_cluster References: <1459934574-25543-1-git-send-email-david@fromorbit.com> <1459934574-25543-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459934574-25543-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1459947098 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Apr 06, 2016 at 07:22:50PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Some careless idiot wrote crap code in commit 1a3e8f3 ("xfs: convert > inode cache lookups to use RCU locking") back in late 2010, and so > xfs_iflush_cluster checks the wrong inode for whether it is still > valid under RCU protection. Fix it to lock and check the correct > inode. > > Part of the reason for the screwup was the unconventional naming of > the cluster inode variable - iq - so also rename all the cluster > inode variables to use a more conventional prefixes to reduce > potential future confusion (cilist, cilist_size, cip). > > Discovered-by: Brain Foster > Signed-off-by: Dave Chinner > --- Heh, the variable name changes are probably a good idea. It's very easy to misread between iq/ip. I'm not sure how many times I read through xfs_iflush_cluster() before I realized it wasn't doing what I thought it was doing, but it was at least once or twice. ;) Reviewed-by: Brian Foster > fs/xfs/xfs_inode.c | 64 +++++++++++++++++++++++++++--------------------------- > 1 file changed, 32 insertions(+), 32 deletions(-) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index f79ea59..2718d10 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -3149,16 +3149,16 @@ out_release_wip: > > STATIC int > xfs_iflush_cluster( > - xfs_inode_t *ip, > - xfs_buf_t *bp) > + struct xfs_inode *ip, > + struct xfs_buf *bp) > { > - xfs_mount_t *mp = ip->i_mount; > + struct xfs_mount *mp = ip->i_mount; > struct xfs_perag *pag; > unsigned long first_index, mask; > unsigned long inodes_per_cluster; > - int ilist_size; > - xfs_inode_t **ilist; > - xfs_inode_t *iq; > + int cilist_size; > + struct xfs_inode **cilist; > + struct xfs_inode *cip; > int nr_found; > int clcount = 0; > int bufwasdelwri; > @@ -3167,23 +3167,23 @@ xfs_iflush_cluster( > pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); > > inodes_per_cluster = mp->m_inode_cluster_size >> mp->m_sb.sb_inodelog; > - ilist_size = inodes_per_cluster * sizeof(xfs_inode_t *); > - ilist = kmem_alloc(ilist_size, KM_MAYFAIL|KM_NOFS); > - if (!ilist) > + cilist_size = inodes_per_cluster * sizeof(xfs_inode_t *); > + cilist = kmem_alloc(cilist_size, KM_MAYFAIL|KM_NOFS); > + if (!cilist) > goto out_put; > > mask = ~(((mp->m_inode_cluster_size >> mp->m_sb.sb_inodelog)) - 1); > first_index = XFS_INO_TO_AGINO(mp, ip->i_ino) & mask; > rcu_read_lock(); > /* really need a gang lookup range call here */ > - nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void**)ilist, > + nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void**)cilist, > first_index, inodes_per_cluster); > if (nr_found == 0) > goto out_free; > > for (i = 0; i < nr_found; i++) { > - iq = ilist[i]; > - if (iq == ip) > + cip = cilist[i]; > + if (cip == ip) > continue; > > /* > @@ -3192,20 +3192,20 @@ xfs_iflush_cluster( > * We need to check under the i_flags_lock for a valid inode > * here. Skip it if it is not valid or the wrong inode. > */ > - spin_lock(&ip->i_flags_lock); > - if (!ip->i_ino || > - (XFS_INO_TO_AGINO(mp, iq->i_ino) & mask) != first_index) { > - spin_unlock(&ip->i_flags_lock); > + spin_lock(&cip->i_flags_lock); > + if (!cip->i_ino || > + (XFS_INO_TO_AGINO(mp, cip->i_ino) & mask) != first_index) { > + spin_unlock(&cip->i_flags_lock); > continue; > } > - spin_unlock(&ip->i_flags_lock); > + spin_unlock(&cip->i_flags_lock); > > /* > * Do an un-protected check to see if the inode is dirty and > * is a candidate for flushing. These checks will be repeated > * later after the appropriate locks are acquired. > */ > - if (xfs_inode_clean(iq) && xfs_ipincount(iq) == 0) > + if (xfs_inode_clean(cip) && xfs_ipincount(cip) == 0) > continue; > > /* > @@ -3213,15 +3213,15 @@ xfs_iflush_cluster( > * then this inode cannot be flushed and is skipped. > */ > > - if (!xfs_ilock_nowait(iq, XFS_ILOCK_SHARED)) > + if (!xfs_ilock_nowait(cip, XFS_ILOCK_SHARED)) > continue; > - if (!xfs_iflock_nowait(iq)) { > - xfs_iunlock(iq, XFS_ILOCK_SHARED); > + if (!xfs_iflock_nowait(cip)) { > + xfs_iunlock(cip, XFS_ILOCK_SHARED); > continue; > } > - if (xfs_ipincount(iq)) { > - xfs_ifunlock(iq); > - xfs_iunlock(iq, XFS_ILOCK_SHARED); > + if (xfs_ipincount(cip)) { > + xfs_ifunlock(cip); > + xfs_iunlock(cip, XFS_ILOCK_SHARED); > continue; > } > > @@ -3229,18 +3229,18 @@ xfs_iflush_cluster( > * arriving here means that this inode can be flushed. First > * re-check that it's dirty before flushing. > */ > - if (!xfs_inode_clean(iq)) { > + if (!xfs_inode_clean(cip)) { > int error; > - error = xfs_iflush_int(iq, bp); > + error = xfs_iflush_int(cip, bp); > if (error) { > - xfs_iunlock(iq, XFS_ILOCK_SHARED); > + xfs_iunlock(cip, XFS_ILOCK_SHARED); > goto cluster_corrupt_out; > } > clcount++; > } else { > - xfs_ifunlock(iq); > + xfs_ifunlock(cip); > } > - xfs_iunlock(iq, XFS_ILOCK_SHARED); > + xfs_iunlock(cip, XFS_ILOCK_SHARED); > } > > if (clcount) { > @@ -3250,7 +3250,7 @@ xfs_iflush_cluster( > > out_free: > rcu_read_unlock(); > - kmem_free(ilist); > + kmem_free(cilist); > out_put: > xfs_perag_put(pag); > return 0; > @@ -3293,8 +3293,8 @@ cluster_corrupt_out: > /* > * Unlocks the flush lock > */ > - xfs_iflush_abort(iq, false); > - kmem_free(ilist); > + xfs_iflush_abort(cip, false); > + kmem_free(cilist); > xfs_perag_put(pag); > return -EFSCORRUPTED; > } > -- > 2.7.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Wed Apr 6 07:51:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5873B7CA4 for ; Wed, 6 Apr 2016 07:51:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1F8108F8035 for ; Wed, 6 Apr 2016 05:51:53 -0700 (PDT) X-ASG-Debug-ID: 1459947111-04cbb07ad72b3620001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8HwrkaTRNsP8D2OX (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 06 Apr 2016 05:51:52 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B247B85547; Wed, 6 Apr 2016 12:51:51 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-153.bos.redhat.com [10.18.41.153]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u36Cpp19026217; Wed, 6 Apr 2016 08:51:51 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 0479C120505; Wed, 6 Apr 2016 08:51:50 -0400 (EDT) Date: Wed, 6 Apr 2016 08:51:50 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/5] xfs: skip stale inodes in xfs_iflush_cluster Message-ID: <20160406125150.GB4188@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/5] xfs: skip stale inodes in xfs_iflush_cluster References: <1459934574-25543-1-git-send-email-david@fromorbit.com> <1459934574-25543-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459934574-25543-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1459947112 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Apr 06, 2016 at 07:22:51PM +1000, Dave Chinner wrote: > From: Dave Chinner > > We don't write back stale inodes, so we should skip them in > xfS_iflush_cluster, too. xfs_iflush_cluster > > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/xfs_inode.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 2718d10..6598104 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -3190,10 +3190,11 @@ xfs_iflush_cluster( > * because this is an RCU protected lookup, we could find a > * recently freed or even reallocated inode during the lookup. > * We need to check under the i_flags_lock for a valid inode > - * here. Skip it if it is not valid or the wrong inode. > + * here. Skip it if it is not valid, stale or the wrong inode. > */ > spin_lock(&cip->i_flags_lock); > if (!cip->i_ino || > + __xfs_iflags_test(ip, XFS_ISTALE) || > (XFS_INO_TO_AGINO(mp, cip->i_ino) & mask) != first_index) { > spin_unlock(&cip->i_flags_lock); > continue; > -- > 2.7.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Wed Apr 6 07:52:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 556FF7CB1 for ; Wed, 6 Apr 2016 07:52:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1A7798F8050 for ; Wed, 6 Apr 2016 05:52:04 -0700 (PDT) X-ASG-Debug-ID: 1459947122-04cbb07ad62b3630001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id qDc5o9dgtiyMWECv (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 06 Apr 2016 05:52:03 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id BAB6F80B56; Wed, 6 Apr 2016 12:52:02 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-153.bos.redhat.com [10.18.41.153]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u36Cq2V5026341; Wed, 6 Apr 2016 08:52:02 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 13005120505; Wed, 6 Apr 2016 08:52:02 -0400 (EDT) Date: Wed, 6 Apr 2016 08:52:02 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/5] xfs: xfs_iflush_cluster has range issues Message-ID: <20160406125201.GC4188@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/5] xfs: xfs_iflush_cluster has range issues References: <1459934574-25543-1-git-send-email-david@fromorbit.com> <1459934574-25543-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459934574-25543-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1459947123 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Apr 06, 2016 at 07:22:52PM +1000, Dave Chinner wrote: > From: Dave Chinner > > xfs_iflush_cluster() does a gang lookup on the radix tree, meaning > it can find inode beyond the current cluster if there is sparse inodes > cache population. gang lookups return results in ascending index > order, so stop trying to cluster iodes once the first inode outside inodes > the cluster mask is detected. > > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/xfs_inode.c | 13 +++++++++++-- > 1 file changed, 11 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 6598104..b984be4 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -3194,11 +3194,20 @@ xfs_iflush_cluster( > */ > spin_lock(&cip->i_flags_lock); > if (!cip->i_ino || > - __xfs_iflags_test(ip, XFS_ISTALE) || > - (XFS_INO_TO_AGINO(mp, cip->i_ino) & mask) != first_index) { > + __xfs_iflags_test(ip, XFS_ISTALE)) { > spin_unlock(&cip->i_flags_lock); > continue; > } > + > + /* > + * Once we fall off the end of the cluster, no point checking > + * any more inodes in the list because they will also all be > + * outside the cluster. > + */ > + if ((XFS_INO_TO_AGINO(mp, cip->i_ino) & mask) != first_index) { > + spin_unlock(&cip->i_flags_lock); > + break; > + } > spin_unlock(&cip->i_flags_lock); > > /* > -- > 2.7.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Wed Apr 6 07:52:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E0B337CB1 for ; Wed, 6 Apr 2016 07:52:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B644F30404E for ; Wed, 6 Apr 2016 05:52:14 -0700 (PDT) X-ASG-Debug-ID: 1459947132-04cb6c245f2c6350001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 00bc6RpIELmb5663 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 06 Apr 2016 05:52:13 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CE7DC46202; Wed, 6 Apr 2016 12:52:12 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-153.bos.redhat.com [10.18.41.153]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u36CqC48014351; Wed, 6 Apr 2016 08:52:12 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 15615120505; Wed, 6 Apr 2016 08:52:12 -0400 (EDT) Date: Wed, 6 Apr 2016 08:52:12 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/5] xfs; xfs_iflush_cluster vs xfs_reclaim_inode Message-ID: <20160406125211.GD4188@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 0/5] xfs; xfs_iflush_cluster vs xfs_reclaim_inode References: <1459934574-25543-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459934574-25543-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1459947133 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Apr 06, 2016 at 07:22:49PM +1000, Dave Chinner wrote: > Hi folks, > > There is a problem that RHEL QE tripped over on a long-running > fsstress test on a RHEL 6.6. Brian did all the hard work of working > out the initial cause of the GPF that was being tripped, but > had not yet got past how to fix the issues around xfs_free_inode. > The code is the same as the current upstream code, so the problem > still exists.... > > The first patch fixes an obvious (now!) bug in xfs_iflush_cluster > where it checks the wrong inode after lookup for validity. It still > kind-of works, because the correct inode number is used for the "are > we still in the right cluster" check, so it's not quite a hole the > size of a truck. Still something that should not have slipped > through 6 years ago and not been discovered until now... > > The most important patch (#4) address the use-after-free issues that the > xfs inode has w.r.t. RCU freeing and the lookup that > xfs_iflush_cluster is doing under the rcu_read_lock. All the > structures accessed under the RCU context need to be freed after the > current RCU grace period expires, as RCU lookups may attempt to > access them at any time during the grace period. hence we have to > move them into the RCU callback so that we don't free them > prematurely. > > The rest of the patches are defensive in that they make > xfs_iflush_cluster only act on relevant inodes and be able to > guarantee detection inodes that are in the process of being freed. > While these aren't absolutely necessary, it seems silly to ignore > these obvious issues while I'm fixing up other issues with the same > code. > > There's some more detail on the fixes in the commit descriptions. > > Brian, I've only run this through xfstests, so I have no real idea > if it fixes the problem fsstress has uncovered. AIUI it takes 3 or 4 > days to reproduce the issue so this is kind of a pre-emptive strike > on what I think is the underlying issue based on your description > and commentary. I figured having code to explain the problems would > save some time while you sleep.... > > Comments, thoughts, testing and flames all welcome... > Thanks.. it looks mostly clean and logical to me on a first pass through. I've reviewed the first three, which look straightforward, and I'll follow up on the last couple once I've run through testing and had a closer look. To migrate some of the discussion over to the list... what I'm testing now is an XFS_IRECLAIM flag check (and inode skip) on the inode in the cluster flush path. This has run clean for the better part of yesterday through overnight. While the test requires a few days to verify, the hacked up kernel I've been testing with usually detects this a bit sooner (within 6-8 hours or so), so I'm fairly confident that test at least corners the problem. The concern raised with the XFS_IRECLAIM check is that of performance (skipping an inode flush when we don't need to). I'm not totally convinced that's much of a problem considering how rare this situation is. The best/only reproducer we have takes a couple days on a debug kernel, for a bug that's been present for several years. The concern I had with this approach was more that both codepaths seemed to have trylock or checks that cause the reclaim or flush to "back off," and I didn't want to create a situation where neither path would actually do its job (potentially repeatedly) for a particular inode. So that approach seemed cleaner than the alternative I was considering, but the thought of pushing the i_itemp deallocation to the RCU callback also crossed my mind later on yesterday after writing up my last report on the bug. This series appears to move all of the deallocation (incl. fork destruction) to the RCU cb, but that seems reasonable to me as well. I think relying on RCU is probably the cleanest/most correct approach so far, so I'll kill the currently running test, pull these back to the rhel kernel and see how that goes. Note that I haven't even attempted to reproduce this on an upstream kernel simply because it's so difficult to reproduce. It's not even consistently reproducible with the original kernel on different hardware. I agree that the problem likely exists upstream, but I'm going to continue to use the original kernel for verification because that hw/kernel has provided a consistent reproducer... Brian > -Dave. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From alex@zadarastorage.com Wed Apr 6 11:39:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.9 required=5.0 tests=STOX_REPLY_TYPE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B59CD7CB3 for ; Wed, 6 Apr 2016 11:39:33 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 16D60AC003 for ; Wed, 6 Apr 2016 09:39:29 -0700 (PDT) X-ASG-Debug-ID: 1459960765-04cbb065ac09c90001-NocioJ Received: from mail-wm0-f44.google.com (mail-wm0-f44.google.com [74.125.82.44]) by cuda.sgi.com with ESMTP id Ck5oe1YhQQmqBjkY (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 06 Apr 2016 09:39:26 -0700 (PDT) X-Barracuda-Envelope-From: alex@zadarastorage.com X-Barracuda-Apparent-Source-IP: 74.125.82.44 Received: by mail-wm0-f44.google.com with SMTP id l6so73093819wml.1 for ; Wed, 06 Apr 2016 09:39:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=message-id:from:to:cc:references:in-reply-to:subject:date :mime-version:content-transfer-encoding:importance; bh=IeqmTtMenX5EbEYwowcMtFsayqOa11C2FoXg31zWrnw=; b=XHEiN/5+MiZcAGeCK206FfmsukR5Aba1m6cfT7jrYkKHqhTiP6qhB+b3SUZsgdQnUE JOTLteJYR6b1VmDu/bZrTSaT8ThJ5Qn/4Z0dv6GE+9tZM2F7MyqRkcxYUJ+J2yec2pju 7J0YIKLPSrtbEU/gGTxWeN7tKxObfMOPShE/UjdTItLbpMpKrNyz0HAEaIiFjU6zPD9b SxxuIJDrfuD7T80Drt2yI6MCZDexD++5Po8ur3uSGyp/KDan61golrccRIheZ+4XI5/z L2z6UWKZy2+LPCt2VVud3XRtWVqcXWQFSgeG9BtKcZl06JzEuEYyA5Nkh/SPkM6cqnVo mQuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:from:to:cc:references:in-reply-to :subject:date:mime-version:content-transfer-encoding:importance; bh=IeqmTtMenX5EbEYwowcMtFsayqOa11C2FoXg31zWrnw=; b=j0eLHk8A9CTCPpS+MTs69Q5u2RrAauKc7btuWEnzrnqXzLFBej8V2MSGoYwXyMT0xm YYSTudIgKw6WDsGHw2+VbjBLLnufc6+R5EoWxWGJnC8XrsMoBxcNR1OfGK/wRb7CxzDH 520UCrDRzpjy2x1E1xG23qhO2knP4v0GbXHObXG3dTA8F5ceBnUmbSSfBe4cCmITUnuU 922AhvGy+N5AvOKGizN/5Wg6/vJDHkxJmBclUC4YvDmSiuDmPChrfuuDsfNDoMIcGuiV ZjX26IlPhL6RMFqiIEAsimIDPad4tQR4UZr7beCbmOg6m+p78Vi4vgFmiHQ+OcOWVvwN XaRw== X-Gm-Message-State: AD7BkJJo9JiG1IzvxxkWom8AWUAB+CqWsZB3q5v0l8tFLaeA4hzP1DlDBkCWrRxaWyX6rA== X-Received: by 10.194.123.35 with SMTP id lx3mr23299268wjb.132.1459960765369; Wed, 06 Apr 2016 09:39:25 -0700 (PDT) Received: from alyakaslap (bzq-169-168-31-234.red.bezeqint.net. [31.168.169.234]) by smtp.gmail.com with ESMTPSA id m6sm4068312wje.21.2016.04.06.09.39.23 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 06 Apr 2016 09:39:24 -0700 (PDT) Message-ID: From: "Alex Lyakas" To: "Dave Chinner" Cc: "Christoph Hellwig" , "Danny Shavit" , , "Yair Hershko" , "Shyam Kaushik" , References: <20150629222651.GG7943@dastard> <20150707000911.GT7943@dastard> <20150707090511.GA21863@infradead.org> <7792DA2A464640B1BC7220973CED41AE@alyakaslap> <20150723230912.GE3902@dastard> <77693FFEB62A474DA7F039FD92CC5304@alyakaslap> <20160405204106.GF11238@dastard> In-Reply-To: <20160405204106.GF11238@dastard> Subject: Re: xfs_iext_realloc_indirect and "XFS: possible memory allocation deadlock" Date: Wed, 6 Apr 2016 19:39:21 +0300 X-ASG-Orig-Subj: Re: xfs_iext_realloc_indirect and "XFS: possible memory allocation deadlock" MIME-Version: 1.0 Content-Type: text/plain; format=flowed; charset="iso-8859-1"; reply-type=original Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal Importance: Normal X-Mailer: Microsoft Windows Live Mail 16.4.3528.331 X-MimeOLE: Produced By Microsoft MimeOLE V16.4.3528.331 X-Barracuda-Connect: mail-wm0-f44.google.com[74.125.82.44] X-Barracuda-Start-Time: 1459960766 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, STOX_REPLY_TYPE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28499 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 STOX_REPLY_TYPE STOX_REPLY_TYPE 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hello Dave, Thank you for your response. We understand your concerns and will do further testing with the vmalloc alternative. Meanwhile, I found another issue happening when files have many extents. When unmounting XFS, we call xfs_inode_free => xfs_idestroy_fork => xfs_iext_destroy This goes over the whole indirection array and calls xfs_iext_irec_remove for each one of the erps (from the last one to the first one). As a result, we keep shrinking (reallocating actually) the indirection array until we shrink out all of its elements. When we have files with huge numbers of extents, umount takes 30-80 sec, depending on the amount of files that XFS loaded and the amount of indirection entries of each file. The unmount stack looks like [1]. That patch in [2] seems to address the issue. Do you think it is reasonable? It was tested only on kernel 3.18.19. Thanks, Alex. [1] [] xfs_iext_realloc_indirect+0x40/0x60 [xfs] [] xfs_iext_irec_remove+0xee/0xf0 [xfs] [] xfs_iext_destroy+0x3d/0xb0 [xfs] [] xfs_idestroy_fork+0xb6/0xf0 [xfs] [] xfs_inode_free+0xb2/0xc0 [xfs] [] xfs_reclaim_inode+0x250/0x340 [xfs] [] xfs_reclaim_inodes_ag+0x233/0x370 [xfs] [] xfs_reclaim_inodes+0x1d/0x20 [xfs] [] xfs_unmountfs+0x7b/0x1a0 [xfs] [] xfs_fs_put_super+0x2d/0x70 [xfs] [] generic_shutdown_super+0x76/0x100 [] kill_block_super+0x27/0x70 [] deactivate_locked_super+0x49/0x60 [] deactivate_super+0x4e/0x70 [] cleanup_mnt+0x43/0x90 [] __cleanup_mnt+0x12/0x20 [] task_work_run+0xa7/0xe0 [] do_notify_resume+0x97/0xb0 [] int_signal+0x12/0x17 [2] --- /mnt/work/alex/tmp/code/prev_xfs2/fs/xfs/libxfs/xfs_inode_fork.c 2016-04-06 16:35:51.172255372 +0300 +++ fs/xfs/libxfs/xfs_inode_fork.c 2016-04-06 19:25:55.349593353 +0300 @@ -1499,34 +1499,48 @@ kmem_free(ifp->if_u1.if_ext_irec); ifp->if_flags &= ~XFS_IFEXTIREC; ifp->if_u1.if_extents = ep; ifp->if_bytes = size; if (nextents < XFS_LINEAR_EXTS) { xfs_iext_realloc_direct(ifp, size); } } /* + * Remove all records from the indirection array. + */ +STATIC void +xfs_iext_irec_remove_all(xfs_ifork_t *ifp) /* inode fork pointer */ +{ + int nlists; /* number of irec's (ex lists) */ + int i; /* loop counter */ + + ASSERT(ifp->if_flags & XFS_IFEXTIREC); + nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; + for (i = 0; i < nlists; i++) { + xfs_ext_irec_t *erp = &ifp->if_u1.if_ext_irec[i]; + if (erp->er_extbuf) + kmem_free(erp->er_extbuf); + } + kmem_free(ifp->if_u1.if_ext_irec); + ifp->if_real_bytes = 0; +} + +/* * Free incore file extents. */ void xfs_iext_destroy( xfs_ifork_t *ifp) /* inode fork pointer */ { if (ifp->if_flags & XFS_IFEXTIREC) { - int erp_idx; - int nlists; - - nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; - for (erp_idx = nlists - 1; erp_idx >= 0 ; erp_idx--) { - xfs_iext_irec_remove(ifp, erp_idx); - } + xfs_iext_irec_remove_all(ifp); ifp->if_flags &= ~XFS_IFEXTIREC; } else if (ifp->if_real_bytes) { kmem_free(ifp->if_u1.if_extents); } else if (ifp->if_bytes) { memset(ifp->if_u2.if_inline_ext, 0, XFS_INLINE_EXTS * sizeof(xfs_bmbt_rec_t)); } ifp->if_u1.if_extents = NULL; ifp->if_real_bytes = 0; ifp->if_bytes = 0; -----Original Message----- From: Dave Chinner Sent: Tuesday, April 05, 2016 11:41 PM To: Alex Lyakas Cc: Christoph Hellwig ; Danny Shavit ; bfoster@redhat.com ; Yair Hershko ; Shyam Kaushik ; xfs@oss.sgi.com Subject: Re: xfs_iext_realloc_indirect and "XFS: possible memory allocation deadlock" On Tue, Apr 05, 2016 at 09:10:06PM +0300, Alex Lyakas wrote: > Hello Dave, Brian, Christoph, > > We are still encountering cases, in which different IO patterns beat > XFS preallocation schemes, resuling in highly fragmented files, > having 100s of thousands and sometimes millions of extents. In these > cases XFS tries to allocate large arrays of xfs_ext_irec_t structure > with kmalloc, and this often gets into numerous retries, and > sometimes triggers hung task panic (due to some other thread wanting > to access the same file). > > We made a change to call kmem_zalloc_large, which resorts to > __vmalloc in case kmalloc fails. kmem_free is already handling > vmalloc addresses correctly. The change is only for the allocation > done in xfs_iext_realloc_indirect, as this is the only place, in > which we have seen the issue. As I've said before, vmalloc is not a solution we can use in general. 32 bit systems have less vmalloc area than normal kernel memory (e.g. ia32 has 128MB of vmalloc space vs 896MB of kernel address space by default) and hence if we get large vmap allocation requests for non-temporary, not directly reclaimable memory then we'll end up with worse problems than we already have due to vmalloc area exhaustion. Cheers, Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Wed Apr 6 11:45:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2C2297CA1 for ; Wed, 6 Apr 2016 11:45:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1B490304032 for ; Wed, 6 Apr 2016 09:44:57 -0700 (PDT) X-ASG-Debug-ID: 1459961095-04cb6c24642d7e00001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id PNu9aHqQDauaEp3C (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 06 Apr 2016 09:44:56 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u36Git0R015160 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 6 Apr 2016 16:44:55 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u36GislY018303 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 6 Apr 2016 16:44:55 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u36Gis65032386 for ; Wed, 6 Apr 2016 16:44:54 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 06 Apr 2016 09:44:54 -0700 Date: Wed, 6 Apr 2016 09:44:53 -0700 From: "Darrick J. Wong" To: Dan Carpenter Cc: xfs@oss.sgi.com Subject: Re: xfs: use named array initializers for log item dumping Message-ID: <20160406164453.GA408@birch.djwong.org> X-ASG-Orig-Subj: Re: xfs: use named array initializers for log item dumping References: <20160406105657.GA30644@mwanda> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160406105657.GA30644@mwanda> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1459961096 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28499 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain On Wed, Apr 06, 2016 at 01:56:57PM +0300, Dan Carpenter wrote: > Hello Darrick J. Wong, > > The patch 5110cd82ca90: "xfs: use named array initializers for log > item dumping" from Mar 7, 2016, leads to the following static checker > warning: > > fs/xfs/xfs_log.c:2085 xlog_print_tic_res() > error: buffer overflow 'trans_type_str' 43 <= 43 > > fs/xfs/xfs_log.c > 2080 > 2081 xfs_warn(mp, "xlog_write: reservation summary:"); > 2082 xfs_warn(mp, " trans type = %s (%u)", > 2083 ((ticket->t_trans_type <= 0 || > 2084 ticket->t_trans_type > XFS_TRANS_TYPE_MAX) ? > ^ > Should be >=. Correct. Good catch. > Why is zero invalid? There isn't a XFS_TRANS_ code corresponding to zero: /* * Transaction types. Used to distinguish types of buffers. These never reach * the log. */ #define XFS_TRANS_SETATTR_NOT_SIZE 1 That whole guard expression might as well be: (ticket->t_trans_type == 0 || ticket->t_trans_type >= XFS_TRANS_TYPE_MAX) Furthermore, XLOG_REG_TYPE_MAX could be 21 to be consistent with the rest of XFS, and the checks for res_type_str usage below this could be the same. (Though personally /me finds it odd that the _MAX values are usually one more than the last item in the list.) (Also I thought there was other discussion of that patch so I'm a little surprised to see it in mainline?) --D > > 2085 "bad-trans-type" : trans_type_str[ticket->t_trans_type]), > 2086 ticket->t_trans_type); > 2087 xfs_warn(mp, " unit res = %d bytes", > > > regards, > dan carpenter From zlang@redhat.com Wed Apr 6 12:39:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 719627CB9 for ; Wed, 6 Apr 2016 12:39:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 45B35304032 for ; Wed, 6 Apr 2016 10:39:18 -0700 (PDT) X-ASG-Debug-ID: 1459964357-04cbb065b20cd00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id RZMUpb8ThAhi38ZG (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 06 Apr 2016 10:39:17 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 48AAAC0D7F0F for ; Wed, 6 Apr 2016 17:39:17 +0000 (UTC) Received: from localhost (vpn1-4-39.pek2.redhat.com [10.72.4.39]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u36HdFTr002239; Wed, 6 Apr 2016 13:39:16 -0400 From: Zorro Lang To: xfs@oss.sgi.com Cc: sandeen@redhat.com, Zorro Lang Subject: [PATCH] xfs_quota: print quota id number if the name can't be found Date: Thu, 7 Apr 2016 01:39:13 +0800 X-ASG-Orig-Subj: [PATCH] xfs_quota: print quota id number if the name can't be found Message-Id: <1459964353-25151-1-git-send-email-zlang@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1459964357 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 When use GETNEXTQUOTA ioctl to report project quota, it always report an unexpected quota: (null) 0 0 0 00 [--------] The ID 0 store the default quota, even if no one set default quota, it still have quota accounting, but not enforced. So GETNEXTQUOTA can find and report this undefined quota. >From this problem, I thought if others' quota name miss, (null) will be printed too. e.g. # xfs_quota -xc "limit -u bsoft=300m bhard=400m test" $mnt # xfs_quota -xc "report -u" $mnt User ID Used Soft Hard Warn/Grace ---------- -------------------------------------------------- root 0 0 0 00 [--------] test 0 307200 409600 00 [--------] # userdel -r test # xfs_quota -xc "report -u" $mnt User ID Used Soft Hard Warn/Grace ---------- -------------------------------------------------- root 0 0 0 00 [--------] (null) 0 307200 409600 00 [--------] So this problem same with above id 0's problem. For deal with this, this patch will print id number if the name can't be found. But if use old GETQUOTA ioctl, it won't print project id 0 quota information(if it's not defined). That's different with GETNEXTQUOTA. For keep consistent, this patch also print project id 0 when use old GETQUOTA. Signed-off-by: Zorro Lang --- Hi, This's a problem from GETNEXTQUOTA feature. The original disscussion is as below: http://thread.gmane.org/gmane.comp.file-systems.fstests/1852/focus=1968 Then Eryu send a patch to xfstests, try to fix the test failure bring by this bug. The disscussion is as below: http://oss.sgi.com/archives/xfs/2016-04/msg00002.html Finally we decided to fix this problem in xfsprogs. After talked with Eric Sandeen, I wrote this patch. At first, Eric thought we shouldn't print project id 0 quota information, if no one set limit for it. Then he change his mind to always print "root" as project id 0's name, if no one define a name for it. But there's another problem, if we print "root" for project id 0, but we can't run: xfs_quota -xc "limit -p xxx xxx root" $mnt Because the "root" is a fake name. Then I suggest to print id number, if the name can't be found. This method not only used for project id 0, it used for all user/group/project IDs which no name defined. So this patch should be the V3 patch. We can't sure which one is the best idea. If anyone have better idea, please tell me. Thanks, Zorro quota/report.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/quota/report.c b/quota/report.c index 48a3f29..557d667 100644 --- a/quota/report.c +++ b/quota/report.c @@ -389,7 +389,10 @@ report_mount( name = p->pr_name; } } - fprintf(fp, "%-10s", name); + if (name != NULL) + fprintf(fp, "%-10s", name); + else + fprintf(fp, "#%-10u", d.d_id); } if (form & XFS_BLOCK_QUOTA) { @@ -571,6 +574,12 @@ report_project_mount( id = oid + 1; } } else { + if (!getprprid(0)) { + report_mount(fp, 0, "#0", NULL, form, XFS_PROJ_QUOTA, + mount, flags); + flags |= NO_HEADER_FLAG; + } + setprent(); while ((p = getprent()) != NULL) { if (report_mount(fp, p->pr_prid, p->pr_name, NULL, -- 2.5.5 From sandeen@redhat.com Wed Apr 6 13:34:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5284C7CB3 for ; Wed, 6 Apr 2016 13:34:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2510A304039 for ; Wed, 6 Apr 2016 11:34:27 -0700 (PDT) X-ASG-Debug-ID: 1459967665-04cbb065ac0ec10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id jPXZs4rWGCpWAfHz (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 06 Apr 2016 11:34:26 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B0A0B478 for ; Wed, 6 Apr 2016 18:34:25 +0000 (UTC) Received: from [IPv6:::1] (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 u36IYMOO009389 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 6 Apr 2016 14:34:24 -0400 Subject: Re: [PATCH] xfs_quota: print quota id number if the name can't be found To: Zorro Lang , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs_quota: print quota id number if the name can't be found References: <1459964353-25151-1-git-send-email-zlang@redhat.com> From: Eric Sandeen Message-ID: <570556AE.7080306@redhat.com> Date: Wed, 6 Apr 2016 13:34:22 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.1 MIME-Version: 1.0 In-Reply-To: <1459964353-25151-1-git-send-email-zlang@redhat.com> Content-Type: text/plain; charset=windows-1252 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: 1459967666 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 4/6/16 12:39 PM, Zorro Lang wrote: > When use GETNEXTQUOTA ioctl to report project quota, it always > report an unexpected quota: > > (null) 0 0 0 00 [--------] > > The ID 0 store the default quota, even if no one set default quota, > it still have quota accounting, but not enforced. So GETNEXTQUOTA > can find and report this undefined quota. > > From this problem, I thought if others' quota name miss, (null) will > be printed too. e.g. > > # xfs_quota -xc "limit -u bsoft=300m bhard=400m test" $mnt > # xfs_quota -xc "report -u" $mnt > User ID Used Soft Hard Warn/Grace > ---------- -------------------------------------------------- > root 0 0 0 00 [--------] > test 0 307200 409600 00 [--------] > # userdel -r test > # xfs_quota -xc "report -u" $mnt > User ID Used Soft Hard Warn/Grace > ---------- -------------------------------------------------- > root 0 0 0 00 [--------] > (null) 0 307200 409600 00 [--------] > > So this problem same with above id 0's problem. For deal with this, > this patch will print id number if the name can't be found. > > But if use old GETQUOTA ioctl, it won't print project id 0 quota > information(if it's not defined). That's different with GETNEXTQUOTA. > For keep consistent, this patch also print project id 0 when use old > GETQUOTA. > > Signed-off-by: Zorro Lang Thanks, I think this makes sense; so this solves 2 problems. 1) always print the id # if there is no name mapping during quota report, and 2) always print default project quota information, even if no PRID 0 in in the projects map. UID & GID always (?) have an ID 0 defined (if the system has no root user or group, something is very odd, but it is normal to have no PRID 0 defined) other comments below. > --- > > Hi, > > This's a problem from GETNEXTQUOTA feature. The original disscussion > is as below: > > http://thread.gmane.org/gmane.comp.file-systems.fstests/1852/focus=1968 > > Then Eryu send a patch to xfstests, try to fix the test failure bring > by this bug. The disscussion is as below: > > http://oss.sgi.com/archives/xfs/2016-04/msg00002.html > > Finally we decided to fix this problem in xfsprogs. After talked with > Eric Sandeen, I wrote this patch. At first, Eric thought we shouldn't > print project id 0 quota information, if no one set limit for it. > > Then he change his mind to always print "root" as project id 0's name, > if no one define a name for it. But there's another problem, if we > print "root" for project id 0, but we can't run: > > xfs_quota -xc "limit -p xxx xxx root" $mnt > > Because the "root" is a fake name. Then I suggest to print id number, > if the name can't be found. This method not only used for project id > 0, it used for all user/group/project IDs which no name defined. > > So this patch should be the V3 patch. We can't sure which one is the > best idea. If anyone have better idea, please tell me. > > Thanks, > Zorro > > quota/report.c | 11 ++++++++++- > 1 file changed, 10 insertions(+), 1 deletion(-) > > diff --git a/quota/report.c b/quota/report.c > index 48a3f29..557d667 100644 > --- a/quota/report.c > +++ b/quota/report.c > @@ -389,7 +389,10 @@ report_mount( > name = p->pr_name; > } > } > - fprintf(fp, "%-10s", name); Could use a comment: + /* If no name is found, print the id # instead of (null) */ > + if (name != NULL) > + fprintf(fp, "%-10s", name); > + else > + fprintf(fp, "#%-10u", d.d_id); > } > > if (form & XFS_BLOCK_QUOTA) { > @@ -571,6 +574,12 @@ report_project_mount( > id = oid + 1; > } > } else { Comment: + /* Print default project quota even if PRID 0 isn't defined */ > + if (!getprprid(0)) { > + report_mount(fp, 0, "#0", NULL, form, XFS_PROJ_QUOTA, If you pass in NULL instead of "#0" does report_mount do the right thing? If so, better to not hard-code "#0" here. -Eric > + mount, flags); > + flags |= NO_HEADER_FLAG; > + } > + > setprent(); > while ((p = getprent()) != NULL) { > if (report_mount(fp, p->pr_prid, p->pr_name, NULL, > From david@fromorbit.com Wed Apr 6 15:20:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 204A47CA1 for ; Wed, 6 Apr 2016 15:20:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E57FD8F8035 for ; Wed, 6 Apr 2016 13:20:32 -0700 (PDT) X-ASG-Debug-ID: 1459974026-04cb6c245f2e1400001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id J7o6W0MSTTtJTRY3 for ; Wed, 06 Apr 2016 13:20:26 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DGDwB0bgVXPDGaLHldgzdTfaY5AQEBAQEBBowRiXglhWIEAgKBT00BAQEBAQEHAQEBAUJAhEIBAQQnExwjEAgDGAklDwUlAwcaE4gmD8EuAQEBAQEFAQEBARgEGYVAhROCXoFPgz2CKwWTGIRphXaIC48YjyGCYxyBXCowAQSIbgEBAQ Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail06.adl2.internode.on.net with ESMTP; 07 Apr 2016 05:50:25 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1antw7-0005RZ-Rq; Thu, 07 Apr 2016 06:20:23 +1000 Date: Thu, 7 Apr 2016 06:20:23 +1000 From: Dave Chinner To: Dan Carpenter Cc: darrick.wong@oracle.com, xfs@oss.sgi.com Subject: Re: xfs: use named array initializers for log item dumping Message-ID: <20160406202023.GA13574@dastard> X-ASG-Orig-Subj: Re: xfs: use named array initializers for log item dumping References: <20160406105657.GA30644@mwanda> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160406105657.GA30644@mwanda> 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: 1459974026 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28503 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Apr 06, 2016 at 01:56:57PM +0300, Dan Carpenter wrote: > Hello Darrick J. Wong, > > The patch 5110cd82ca90: "xfs: use named array initializers for log > item dumping" from Mar 7, 2016, leads to the following static checker > warning: > > fs/xfs/xfs_log.c:2085 xlog_print_tic_res() > error: buffer overflow 'trans_type_str' 43 <= 43 > > fs/xfs/xfs_log.c > 2080 > 2081 xfs_warn(mp, "xlog_write: reservation summary:"); > 2082 xfs_warn(mp, " trans type = %s (%u)", > 2083 ((ticket->t_trans_type <= 0 || > 2084 ticket->t_trans_type > XFS_TRANS_TYPE_MAX) ? > ^ > Should be >=. Why is zero invalid? > > 2085 "bad-trans-type" : trans_type_str[ticket->t_trans_type]), > 2086 ticket->t_trans_type); > 2087 xfs_warn(mp, " unit res = %d bytes", I just pushed patches to the for-next branch (i.e. linux-next) that remove this code. https://git.kernel.org/cgit/linux/kernel/git/dgc/linux-xfs.git/commit/?h=for-next&id=710b1e2c2948c1e5d0499def5273ecbc6472342d Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 6 15:58:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5DD997CA1 for ; Wed, 6 Apr 2016 15:58:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1F49B304039 for ; Wed, 6 Apr 2016 13:58:07 -0700 (PDT) X-ASG-Debug-ID: 1459976284-04cbb065b216bb0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id HRhGxE2nNtVxi3AG for ; Wed, 06 Apr 2016 13:58:05 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2D0DwD5dwVXPDGaLHldgzeBUIZrn04BAQEBAQEGjBGDT4YphgcEAgKBT00BAQEBAQEHAQEBAUJAhEIBAQQ6HCMQCAMYCSUPBSUDBxoTiCbBUgEBAQcCAR0ZhUCFE4dqgisFmAGOAY8YRY5chFsqMIhzAQEB Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail06.adl2.internode.on.net with ESMTP; 07 Apr 2016 06:27:37 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1anuW9-0005V1-17; Thu, 07 Apr 2016 06:57:37 +1000 Date: Thu, 7 Apr 2016 06:57:37 +1000 From: Dave Chinner To: Alex Lyakas Cc: Christoph Hellwig , Danny Shavit , bfoster@redhat.com, Yair Hershko , Shyam Kaushik , xfs@oss.sgi.com Subject: Re: xfs_iext_realloc_indirect and "XFS: possible memory allocation deadlock" Message-ID: <20160406205736.GB13574@dastard> X-ASG-Orig-Subj: Re: xfs_iext_realloc_indirect and "XFS: possible memory allocation deadlock" References: <20150629222651.GG7943@dastard> <20150707000911.GT7943@dastard> <20150707090511.GA21863@infradead.org> <7792DA2A464640B1BC7220973CED41AE@alyakaslap> <20150723230912.GE3902@dastard> <77693FFEB62A474DA7F039FD92CC5304@alyakaslap> <20160405204106.GF11238@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1459976284 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28504 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Apr 06, 2016 at 07:39:21PM +0300, Alex Lyakas wrote: > Hello Dave, > > Thank you for your response. We understand your concerns and will do > further testing with the vmalloc alternative. > > Meanwhile, I found another issue happening when files have many > extents. When unmounting XFS, we call > xfs_inode_free => xfs_idestroy_fork => xfs_iext_destroy > This goes over the whole indirection array and calls > xfs_iext_irec_remove for each one of the erps (from the last one to > the first one). As a result, we keep shrinking (reallocating > actually) the indirection array until we shrink out all of its > elements. When we have files with huge numbers of extents, umount > takes 30-80 sec, depending on the amount of files that XFS loaded > and the amount of indirection entries of each file. The unmount > stack looks like [1]. > > That patch in [2] seems to address the issue. Do you think it is > reasonable? It was tested only on kernel 3.18.19. Looks like a good optimisation to make. Can you send it as proper patch (separate thread) with this description and your signed-off-by on it? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 6 16:01:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 012E87CA1 for ; Wed, 6 Apr 2016 16:01:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 74C88AC002 for ; Wed, 6 Apr 2016 14:01:32 -0700 (PDT) X-ASG-Debug-ID: 1459976489-04cbb065b816e70001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id BsbY9RLblARVeYPo for ; Wed, 06 Apr 2016 14:01:29 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CWEAD5dwVXPDGaLHldgzeBUIZrn04BAQEBAQEGjBGFaIQQhgcCAgEBAoFPTQEBAQEBAQcBAQEBQkCEQQEBAQMBIw8BIyMFCwgDDgoCAgUhAgIPBSUDBxoTiB8Hr2iRagEBAQEGAgEdGWOEXYUThz8rgisFmAGOAY8YjyGEWyowiHMBAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail06.adl2.internode.on.net with ESMTP; 07 Apr 2016 06:31:28 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1anuZs-0005W1-D9; Thu, 07 Apr 2016 07:01:28 +1000 Date: Thu, 7 Apr 2016 07:01:28 +1000 From: Dave Chinner To: Jan Tulak Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH 03/19] mkfs: Sanitise the superblock feature macros Message-ID: <20160406210128.GC13574@dastard> X-ASG-Orig-Subj: Re: [PATCH 03/19] mkfs: Sanitise the superblock feature macros References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-4-git-send-email-jtulak@redhat.com> <56FDD750.3040002@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1459976489 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28504 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Apr 06, 2016 at 11:12:21AM +0200, Jan Tulak wrote: > On Fri, Apr 1, 2016 at 4:05 AM, Eric Sandeen wrote: > > On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > > if (sb_feat.finobt && sb_feat.finobtflag) { > > fprintf(stderr, > > _("warning: finobt not supported without CRC support, disabled.\n")); > > } > > sb_feat.finobt = 0; > > > > would suffice as before, no? Meh. Not a big deal I guess.... > > > > ​Changed. Honestly, I don't like the strings starting at the beginning of > the line, because it breaks the indentation flow, but the rest of the code > uses this style, so I should stick to it.​ There's good reason for doing this - it makes it easy to grep the source code for a specific error that has been emitted. Indentation is useful for demonstrating logic flow, but it's harmful when it results in strings you might want to find being split up over multiple lines. > Thank you for the review. I will wait a little longer if someone spots > something more, before sending an updated patchset.​ :-) Just send it - I almost got to pulling in this version and fixing the various comments directly myself yesterday.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Wed Apr 6 16:10:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2B9EC7CA0 for ; Wed, 6 Apr 2016 16:10:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9176AAC002 for ; Wed, 6 Apr 2016 14:10:07 -0700 (PDT) X-ASG-Debug-ID: 1459977003-04cbb065b817620001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 4XmqZvE38mUUm6eB for ; Wed, 06 Apr 2016 14:10:04 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id AA6BA16C150 for ; Wed, 6 Apr 2016 16:10:03 -0500 (CDT) Subject: Re: [PATCH 18/19] mkfs: unit conversions are case insensitive To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 18/19] mkfs: unit conversions are case insensitive References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-19-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <57057B2A.3000100@sandeen.net> Date: Wed, 6 Apr 2016 16:10:02 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.1 MIME-Version: 1.0 In-Reply-To: <1458818136-56043-19-git-send-email-jtulak@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1459977004 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28504 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > From: Jan Tulak > > Solves the question "Should I use 10g or 10G?" Might be nicer to do it like the cvtnum in libxcmd: c = tolower(*sp); switch (c) { case 'b': return i * blocksize; ... (hm, why do we have 3 copies of cvtnum?) > Signed-off-by: Jan Tulak > --- > mkfs/xfs_mkfs.c | 12 ++++++------ > 1 file changed, 6 insertions(+), 6 deletions(-) > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index 2bb3b35..680c6c4 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c > @@ -3625,17 +3625,17 @@ cvtnum( > if (*sp == 's' && sp[1] == '\0') > return i * sectsize; > > - if (*sp == 'k' && sp[1] == '\0') > + if ((*sp == 'k' || *sp == 'K' ) && sp[1] == '\0') ^ 1 space is enough, no? I guess doing it this way doesn't really bother me, but the whitespace is messy and if you're here anyway, tolower() might be simpler. -Eric > return 1024LL * i; > - if (*sp == 'm' && sp[1] == '\0') > + if ((*sp == 'm' || *sp == 'M' ) && sp[1] == '\0') > return 1024LL * 1024LL * i; > - if (*sp == 'g' && sp[1] == '\0') > + if ((*sp == 'g' || *sp == 'G' ) && sp[1] == '\0') > return 1024LL * 1024LL * 1024LL * i; > - if (*sp == 't' && sp[1] == '\0') > + if ((*sp == 't' || *sp == 'T' ) && sp[1] == '\0') > return 1024LL * 1024LL * 1024LL * 1024LL * i; > - if (*sp == 'p' && sp[1] == '\0') > + if ((*sp == 'p' || *sp == 'P' ) && sp[1] == '\0') > return 1024LL * 1024LL * 1024LL * 1024LL * 1024LL * i; > - if (*sp == 'e' && sp[1] == '\0') > + if ((*sp == 'e' || *sp == 'E' ) && sp[1] == '\0') > return 1024LL * 1024LL * 1024LL * 1024LL * 1024LL * 1024LL * i; > return -1LL; > } > From sandeen@sandeen.net Wed Apr 6 16:42:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6DFF87CA0 for ; Wed, 6 Apr 2016 16:42:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2A5F48F8037 for ; Wed, 6 Apr 2016 14:42:07 -0700 (PDT) X-ASG-Debug-ID: 1459978923-04cb6c245f2e5070001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id ktgL9wRdOSeqPIkc for ; Wed, 06 Apr 2016 14:42:03 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 9EA1E16C150 for ; Wed, 6 Apr 2016 16:42:03 -0500 (CDT) Subject: Re: [PATCH 17/19] xfsprogs: disable truncating of files To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 17/19] xfsprogs: disable truncating of files References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-18-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <570582AA.9020909@sandeen.net> Date: Wed, 6 Apr 2016 16:42:02 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.1 MIME-Version: 1.0 In-Reply-To: <1458818136-56043-18-git-send-email-jtulak@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1459978923 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28504 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > From: Jan Tulak > > Unify mkfs.xfs behaviour a bit and never truncate files. If the user > is trying to mkfs an existing file, we don't want to destroy anything > he did with the file before (sparse file, allocations...) Hm, I guess so ... What motivated this change? I see that it changes behavior, but I'm not sure what it unifies or fixes - can you explain more? a bit more below. > Signed-off-by: Jan Tulak > --- > libxfs/init.c | 2 +- > mkfs/xfs_mkfs.c | 18 +++++++++++------- > 2 files changed, 12 insertions(+), 8 deletions(-) > > diff --git a/libxfs/init.c b/libxfs/init.c > index 268136f..5f4b6c4 100644 > --- a/libxfs/init.c > +++ b/libxfs/init.c > @@ -112,7 +112,7 @@ libxfs_device_open(char *path, int creat, int xflags, int setblksize) > > retry: > flags = (readonly ? O_RDONLY : O_RDWR) | \ > - (creat ? (O_CREAT|O_TRUNC) : 0) | \ > + (creat ? O_CREAT : 0) | \ > (dio ? O_DIRECT : 0) | \ > (excl ? O_EXCL : 0); > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index 9a6ae2c..2bb3b35 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c > @@ -1029,15 +1029,19 @@ check_device_type( > const char *optname) > { > struct stat64 statbuf; > + int statres; > > - if (*isfile && (no_size || no_name)) { > + statres = stat64(name, &statbuf); > + > + if (*isfile && statres != 0 && (no_size || no_name)) { statres !=0 doesn't imply ENOENT; it could be EACCES or several other errors. You'd need to check errno to know for sure. > fprintf(stderr, > - _("if -%s file then -%s name and -%s size are required\n"), > - optname, optname, optname); > + _("if -%s file and the file does not exists, " \ don't need a "\" there, and should read "does not exist" > + "then -%s name and -%s size are required\n"), Better, just tab it out if possible, though it's a long line... perhaps: _("-%s file requires -%s name and -%s size for file creation\n"); or something like that. > + optname, optname, optname); > usage(); > } > > - if (stat64(name, &statbuf)) { > + if (statres) { > if (errno == ENOENT && *isfile) { > if (create) > *create = 1; > @@ -1059,9 +1063,9 @@ check_device_type( > } > > /* > - * We only want to completely truncate and recreate an existing file if > - * we were specifically told it was a file. Set the create flag only in > - * this case to trigger that behaviour. > + * We only want to create a file only if we were specifically told > + * we want a file. Set the create flag only in this case to trigger > + * that behaviour. + * We only want to create a file if we were specifically told it is a + * file. Set the create flag only in this case to trigger that behaviour. > */ > if (S_ISREG(statbuf.st_mode)) { > if (!*isfile) > From sandeen@sandeen.net Wed Apr 6 17:23:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 161567CA0 for ; Wed, 6 Apr 2016 17:23:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DFA0D304032 for ; Wed, 6 Apr 2016 15:23:35 -0700 (PDT) X-ASG-Debug-ID: 1459981413-04cb6c24602e6bf0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id MR9B177EclsC9uCD for ; Wed, 06 Apr 2016 15:23:33 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (erlite [10.0.0.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 327F316C150 for ; Wed, 6 Apr 2016 17:23:33 -0500 (CDT) Subject: Re: [PATCH 19/19] mkfs: add optional 'reason' for illegal_option To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 19/19] mkfs: add optional 'reason' for illegal_option References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-20-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <57058C64.2010105@sandeen.net> Date: Wed, 6 Apr 2016 17:23:32 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.1 MIME-Version: 1.0 In-Reply-To: <1458818136-56043-20-git-send-email-jtulak@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1459981413 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28507 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > From: Jan Tulak > > Allow us to tell the user what exactly is wrong with his options. "with the specified options" ;) > For example, that the value is too small, instead of just generic > "bad option." > > Signed-off-by: Jan Tulak > --- > mkfs/xfs_mkfs.c | 27 ++++++++++++++++++--------- > 1 file changed, 18 insertions(+), 9 deletions(-) > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index 680c6c4..76e193d 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c > @@ -1550,11 +1550,18 @@ static __attribute__((noreturn)) void > illegal_option( > const char *value, > struct opt_params *opts, > - int index) > + int index, > + const char *reason) ^ tab that out to match. > { > - fprintf(stderr, > - _("Illegal value %s for -%c %s option\n"), > - value, opts->name, opts->subopts[index]); > + if(reason == NULL){ ^space ^space > + fprintf(stderr, > + _("Illegal value %s for -%c %s option\n"), > + value, opts->name, opts->subopts[index]); > + } else { > + fprintf(stderr, > + _("Illegal value %s for -%c %s option: %s\n"), > + value, opts->name, opts->subopts[index], reason); > + } > usage(); > } > > @@ -1646,16 +1653,18 @@ getnum( > > c = strtoll(str, &str_end, 0); > if (c == 0 && str_end == str) > - illegal_option(str, opts, index); > + illegal_option(str, opts, index, NULL); > if (*str_end != '\0') > - illegal_option(str, opts, index); > + illegal_option(str, opts, index, NULL); > } > > /* Validity check the result. */ > - if (c < sp->minval || c > sp->maxval) > - illegal_option(str, opts, index); > + if (c < sp->minval) > + illegal_option(str, opts, index, "value is too small"); > + else if (c > sp->maxval) > + illegal_option(str, opts, index, "value is too large"); > if (sp->is_power_2 && !ispow2(c)) > - illegal_option(str, opts, index); > + illegal_option(str, opts, index, "value has to be power of 2"); "value must be a power of 2" The "reason" strings should be translatable strings too, right? : _(" ... ") -Eric > return c; > } > > -- > 2.6.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@sandeen.net Wed Apr 6 18:02:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4712D7CA0 for ; Wed, 6 Apr 2016 18:02:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id DE3FF8F8035 for ; Wed, 6 Apr 2016 16:02:21 -0700 (PDT) X-ASG-Debug-ID: 1459983738-04cb6c245f2e8330001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id JXU8GdAgT9j08Er9 for ; Wed, 06 Apr 2016 16:02:18 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 28CBC16C150 for ; Wed, 6 Apr 2016 18:02:18 -0500 (CDT) Subject: Re: [PATCH 04/19] mkfs: validate all input values To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 04/19] mkfs: validate all input values References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-5-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <57059579.9090900@sandeen.net> Date: Wed, 6 Apr 2016 18:02:17 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.1 MIME-Version: 1.0 In-Reply-To: <1458818136-56043-5-git-send-email-jtulak@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: 1459983738 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28508 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > From: Dave Chinner > > CHANGELOG > o Fix an unsigned < 0 comparison - save getnum result to another variable > and test it, before converting it to unsigned logagno. ... > @@ -1468,7 +1485,10 @@ main( > respec('l', lopts, L_AGNUM); > if (ldflag) > conflict('l', lopts, L_AGNUM, L_DEV); > - logagno = atoi(value); > + tmp_num = getnum(value, 0, 0, false); > + if (tmp_num < 0) > + illegal(value, "l agno"); > + logagno = (xfs_agnumber_t)tmp_num; > laflag = 1; > break; > case L_FILE: Why not cast to (__int64_t) like other variables do? i.e. + logagno = getnum(value, 0, 0, false); + if ((__int64_t)logagno < 0) + illegal(value, "l agno"); or am I missing something? Thanks, -Eric From sandeen@sandeen.net Wed Apr 6 19:12:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E8E4D7CA0 for ; Wed, 6 Apr 2016 19:12:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C0759304032 for ; Wed, 6 Apr 2016 17:12:28 -0700 (PDT) X-ASG-Debug-ID: 1459987942-04cbb065b81f530001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id FpDRgBbUCWX1hzky for ; Wed, 06 Apr 2016 17:12:22 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 4031B16C154 for ; Wed, 6 Apr 2016 19:12:22 -0500 (CDT) Subject: Re: [PATCH 03/19] mkfs: Sanitise the superblock feature macros To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 03/19] mkfs: Sanitise the superblock feature macros References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-4-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <5705A5E5.9060204@sandeen.net> Date: Wed, 6 Apr 2016 19:12:21 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.1 MIME-Version: 1.0 In-Reply-To: <1458818136-56043-4-git-send-email-jtulak@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1459987942 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.75 X-Barracuda-Spam-Status: No, SCORE=0.75 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_RULE_7580D X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28510 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.75 BSF_RULE_7580D Custom Rule 7580D On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > @@ -1262,10 +1358,11 @@ main( > switch (getsubopt(&p, (constpp)iopts, &value)) { > case I_ALIGN: > if (!value || *value == '\0') > - value = "1"; > - iaflag = atoi(value); > - if (iaflag < 0 || iaflag > 1) > + reqval('i', iopts, I_ALIGN); > + c = atoi(value); > + if (c < 0 || c > 1) > illegal(value, "i align"); > + sb_feat.inode_align = c ? true : false; > break; > case I_LOG: > if (!value || *value == '\0') Hm, this seems wrong, as well - per the man page: "If the value is omitted, 1 is assumed." but this change with the reqval() removes that, doesn't it? Why? (it's fixed later, but there is no reason to break it mid-series...) Before this patch: # mkfs/mkfs.xfs -dfile,name=fsfile,size=1g -i align meta-data=fsfile isize=512 agcount=4, agsize=65536 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=0 data = bsize=4096 blocks=262144, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 After this patch: # mkfs/mkfs.xfs -dfile,name=fsfile,size=1g -i align -i align option requires a value Usage: mkfs.xfs /* blocksize */ [-b log=n|size=num] /* metadata */ [-m crc=0|1,finobt=0|1,uuid=xxx] /* data subvol */ [-d agcount=n,agsize=n,file,name=xxx,size=num, (sunit=value,swidth=value|su=num,sw=num|noalign), sectlog=n|sectsize=num ... -Eric From zorro.lang@gmail.com Wed Apr 6 20:41:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,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 2AD527CA0 for ; Wed, 6 Apr 2016 20:41:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id F2DEF304032 for ; Wed, 6 Apr 2016 18:41:51 -0700 (PDT) X-ASG-Debug-ID: 1459993307-04cbb065b223b70001-NocioJ Received: from mail-yw0-f173.google.com (mail-yw0-f173.google.com [209.85.161.173]) by cuda.sgi.com with ESMTP id 9DAHHPOweFcsWcFu (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 06 Apr 2016 18:41:48 -0700 (PDT) X-Barracuda-Envelope-From: zorro.lang@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.161.173 Received: by mail-yw0-f173.google.com with SMTP id d68so79489135ywe.1 for ; Wed, 06 Apr 2016 18:41:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=GvnUGhf9CErd7DtUSx7H6x63ZIlk+EP8C5sTOmyLwnY=; b=LzSsmebsF8eTi/VAvPS6N0Yxeagl73jiSnOQ+KZsIj/nWC01V4Rfj5HuRg6SUINv1W gX3R7kbukUoD6cde58qwYMc6QKKDj+mlHAP/3y4xBTNSwQDV8p1G6shWXOc1nO1s/FoR t4sXSKbqEcooSirOuyvZoa7js31MnhMas2VEdqmn/d02DmiITCLZT4c3mz2DWOezTqRp kUkNJPpoU4bOLrGS6kpFSld889lIUcapDYhaNahR4v+vWDNnHt7s9dCQldtbHdnJa2G8 UGRaPHD5wKHuBT3AnSi1zHTAQGNPeiFOK5YoWWZcygLU94rQp7vQQOCrrvv6STp+v5T2 nGUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=GvnUGhf9CErd7DtUSx7H6x63ZIlk+EP8C5sTOmyLwnY=; b=KIiRvwBUt6BrcxPQ19qp+R+rnMPZuihNTj/6kC2RDQVaoDgD16w5YFHt2TorqAiiXo BxyLMi25vcT+1SlIMYgazzMISgwd6ZyS4ECvx/rmQY9jNJDUObqM47MngJLNGqWYN+8B /7Isetv9zIXLniSAMRBIly7UPyu9ID2Z7BBhqhOqUkMgQa2xgdWXdkvn/I6xRUQP0q00 XnPZl+KtXB8b4hivIamidFmaoV0ibEQ335qFEClMJLgmk3ewUsmMUzpYPeu843F7kgsv /54O+3eeUDtHwEKFrvQnxsOWDhjpYhEQguV/HU9VnpnTOYpHPLAn4leL15LHYrrPgYl8 BjRw== X-Gm-Message-State: AD7BkJIKOX3l5Ofi5yXdVL4zWpOXRKcSaLh/pTstxBcYk1QC+9DjGoBCf7yzohw5/e6SveVNuuHAQDrEu9roKA== MIME-Version: 1.0 X-Received: by 10.13.212.71 with SMTP id w68mr183953ywd.129.1459993307313; Wed, 06 Apr 2016 18:41:47 -0700 (PDT) Received: by 10.13.203.147 with HTTP; Wed, 6 Apr 2016 18:41:47 -0700 (PDT) Received: by 10.13.203.147 with HTTP; Wed, 6 Apr 2016 18:41:47 -0700 (PDT) In-Reply-To: <570556AE.7080306@redhat.com> References: <1459964353-25151-1-git-send-email-zlang@redhat.com> <570556AE.7080306@redhat.com> Date: Thu, 7 Apr 2016 09:41:47 +0800 Message-ID: Subject: Re: [PATCH] xfs_quota: print quota id number if the name can't be found From: Zorro Lang X-ASG-Orig-Subj: Re: [PATCH] xfs_quota: print quota id number if the name can't be found To: Eric Sandeen Cc: xfs@oss.sgi.com, zlang@redhat.com Content-Type: multipart/alternative; boundary=001a114fa4c274fbf7052fdb2ec3 X-Barracuda-Connect: mail-yw0-f173.google.com[209.85.161.173] X-Barracuda-Start-Time: 1459993308 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28511 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --001a114fa4c274fbf7052fdb2ec3 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable 2016=E5=B9=B44=E6=9C=887=E6=97=A5 02:34=EF=BC=8C"Eric Sandeen" =E5=86=99=E9=81=93=EF=BC=9A > > On 4/6/16 12:39 PM, Zorro Lang wrote: > > When use GETNEXTQUOTA ioctl to report project quota, it always > > report an unexpected quota: > > > > (null) 0 0 0 00 [--------] > > > > The ID 0 store the default quota, even if no one set default quota, > > it still have quota accounting, but not enforced. So GETNEXTQUOTA > > can find and report this undefined quota. > > > > From this problem, I thought if others' quota name miss, (null) will > > be printed too. e.g. > > > > # xfs_quota -xc "limit -u bsoft=3D300m bhard=3D400m test" $mnt > > # xfs_quota -xc "report -u" $mnt > > User ID Used Soft Hard Warn/Grace > > ---------- -------------------------------------------------- > > root 0 0 0 00 [--------] > > test 0 307200 409600 00 [--------] > > # userdel -r test > > # xfs_quota -xc "report -u" $mnt > > User ID Used Soft Hard Warn/Grace > > ---------- -------------------------------------------------- > > root 0 0 0 00 [--------] > > (null) 0 307200 409600 00 [--------] > > > > So this problem same with above id 0's problem. For deal with this, > > this patch will print id number if the name can't be found. > > > > But if use old GETQUOTA ioctl, it won't print project id 0 quota > > information(if it's not defined). That's different with GETNEXTQUOTA. > > For keep consistent, this patch also print project id 0 when use old > > GETQUOTA. > > > > Signed-off-by: Zorro Lang > > Thanks, I think this makes sense; so this solves 2 problems. > > 1) always print the id # if there is no name mapping during quota report, and > 2) always print default project quota information, even if no PRID 0 in in the projects map. > > UID & GID always (?) have an ID 0 defined (if the system has no root user or group, > something is very odd, but it is normal to have no PRID 0 defined) > > other comments below. Yes, I should add some comments. And I will add one line in xfs_quota man page about report command too. > > > --- > > > > Hi, > > > > This's a problem from GETNEXTQUOTA feature. The original disscussion > > is as below: > > > > http://thread.gmane.org/gmane.comp.file-systems.fstests/1852/focus=3D19= 68 > > > > Then Eryu send a patch to xfstests, try to fix the test failure bring > > by this bug. The disscussion is as below: > > > > http://oss.sgi.com/archives/xfs/2016-04/msg00002.html > > > > Finally we decided to fix this problem in xfsprogs. After talked with > > Eric Sandeen, I wrote this patch. At first, Eric thought we shouldn't > > print project id 0 quota information, if no one set limit for it. > > > > Then he change his mind to always print "root" as project id 0's name, > > if no one define a name for it. But there's another problem, if we > > print "root" for project id 0, but we can't run: > > > > xfs_quota -xc "limit -p xxx xxx root" $mnt > > > > Because the "root" is a fake name. Then I suggest to print id number, > > if the name can't be found. This method not only used for project id > > 0, it used for all user/group/project IDs which no name defined. > > > > So this patch should be the V3 patch. We can't sure which one is the > > best idea. If anyone have better idea, please tell me. > > > > Thanks, > > Zorro > > > > quota/report.c | 11 ++++++++++- > > 1 file changed, 10 insertions(+), 1 deletion(-) > > > > diff --git a/quota/report.c b/quota/report.c > > index 48a3f29..557d667 100644 > > --- a/quota/report.c > > +++ b/quota/report.c > > @@ -389,7 +389,10 @@ report_mount( > > name =3D p->pr_name; > > } > > } > > - fprintf(fp, "%-10s", name); > > Could use a comment: > > + /* If no name is found, print the id # instead of (null) */ > > > + if (name !=3D NULL) > > + fprintf(fp, "%-10s", name); > > + else > > + fprintf(fp, "#%-10u", d.d_id); > > } > > > > if (form & XFS_BLOCK_QUOTA) { > > @@ -571,6 +574,12 @@ report_project_mount( > > id =3D oid + 1; > > } > > } else { > > Comment: > > + /* Print default project quota even if PRID 0 isn't defined */ > > > + if (!getprprid(0)) { > > + report_mount(fp, 0, "#0", NULL, form, XFS_PROJ_QUOTA, > > If you pass in NULL instead of "#0" does report_mount do the right thing? > If so, better to not hard-code "#0" here. This's a good idea! Better than use hard=E2=80=93code #0 which looks ugly. I will send V2 patch to fix all above problems. Thanks, Zorro > > -Eric > > > + mount, flags); > > + flags |=3D NO_HEADER_FLAG; > > + } > > + > > setprent(); > > while ((p =3D getprent()) !=3D NULL) { > > if (report_mount(fp, p->pr_prid, p->pr_name, NULL= , > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs --001a114fa4c274fbf7052fdb2ec3 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable


2016=E5=B9=B44=E6=9C=887=E6=97=A5 02:34=EF=BC=8C"Eric Sandeen" &l= t;sandeen@redhat.com>=E5=86=99= =E9=81=93=EF=BC=9A
>
> On 4/6/16 12:39 PM, Zorro Lang wrote:
> > When use GETNEXTQUOTA ioctl to report project quota, it always > > report an unexpected quota:
> >
> >=C2=A0 =C2=A0(null) 0 0 0 00 [--------]
> >
> > The ID 0 store the default quota, even if no one set default quot= a,
> > it still have quota accounting, but not enforced. So GETNEXTQUOTA=
> > can find and report this undefined quota.
> >
> > From this problem, I thought if others' quota name miss, (nul= l) will
> > be printed too. e.g.
> >
> >=C2=A0 =C2=A0# xfs_quota -xc "limit -u bsoft=3D300m bhard=3D4= 00m test" $mnt
> >=C2=A0 =C2=A0# xfs_quota -xc "report -u" $mnt
> >=C2=A0 =C2=A0User ID=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Used=C2=A0 = =C2=A0 =C2=A0 =C2=A0Soft=C2=A0 =C2=A0 =C2=A0 =C2=A0Hard=C2=A0 =C2=A0 Warn/G= race
> >=C2=A0 =C2=A0---------- ------------------------------------------= --------
> >=C2=A0 =C2=A0root=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 0=C2=A0 =C2=A0 =C2=A000 [--------]
> >=C2=A0 =C2=A0test=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 0=C2=A0 =C2=A0 =C2=A0307200=C2=A0 =C2=A0 =C2=A0409600=C2=A0 =C2=A0 = =C2=A000 [--------]
> >=C2=A0 =C2=A0# userdel -r test
> >=C2=A0 =C2=A0# xfs_quota -xc "report -u" $mnt
> >=C2=A0 =C2=A0User ID=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Used=C2=A0 = =C2=A0 =C2=A0 =C2=A0Soft=C2=A0 =C2=A0 =C2=A0 =C2=A0Hard=C2=A0 =C2=A0 Warn/G= race
> >=C2=A0 =C2=A0---------- ------------------------------------------= --------
> >=C2=A0 =C2=A0root=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 0=C2=A0 =C2=A0 =C2=A000 [--------]
> >=C2=A0 =C2=A0(null)=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 0=C2=A0 =C2=A0 =C2=A0307200=C2=A0 =C2=A0 =C2=A0409600=C2=A0 =C2=A0 =C2= =A000 [--------]
> >
> > So this problem same with above id 0's problem. For deal with= this,
> > this patch will print id number if the name can't be found. > >
> > But if use old GETQUOTA ioctl, it won't print project id 0 qu= ota
> > information(if it's not defined). That's different with G= ETNEXTQUOTA.
> > For keep consistent, this patch also print project id 0 when use = old
> > GETQUOTA.
> >
> > Signed-off-by: Zorro Lang <zlang@redhat.com>
>
> Thanks, I think this makes sense; so this solves 2 problems.
>
> 1) always print the id # if there is no name mapping during quota repo= rt, and
> 2) always print default project quota information, even if no PRID 0 i= n in the projects map.
>
> UID & GID always (?) have an ID 0 defined (if the system has no ro= ot user or group,
> something is very odd, but it is normal to have no PRID 0 defined)
>
> other comments below.

Yes, I should add some comments. And I will add one line in = xfs_quota man page about report command too.
>
> > ---
> >
> > Hi,
> >
> > This's a problem from GETNEXTQUOTA feature. The original diss= cussion
> > is as below:
> >
> > http://thread.gmane.org/gmane.comp.file-systems.fstest= s/1852/focus=3D1968
> >
> > Then Eryu send a patch to xfstests, try to fix the test failure b= ring
> > by this bug. The disscussion is as below:
> >
> > http://oss.sgi.com/archives/xfs/2016-04/msg00002.html
> >
> > Finally we decided to fix this problem in xfsprogs. After talked = with
> > Eric Sandeen, I wrote this patch. At first, Eric thought we shoul= dn't
> > print project id 0 quota information, if no one set limit for it.=
> >
> > Then he change his mind to always print "root" as proje= ct id 0's name,
> > if no one define a name for it. But there's another problem, = if we
> > print "root" for project id 0, but we can't run: > >
> >=C2=A0 =C2=A0xfs_quota -xc "limit -p xxx xxx root" $mnt<= br> > >
> > Because the "root" is a fake name. Then I suggest to pr= int id number,
> > if the name can't be found. This method not only used for pro= ject id
> > 0, it used for all user/group/project IDs which no name defined.<= br> > >
> > So this patch should be the V3 patch. We can't sure which one= is the
> > best idea. If anyone have better idea, please tell me.
> >
> > Thanks,
> > Zorro
> >
> >=C2=A0 quota/report.c | 11 ++++++++++-
> >=C2=A0 1 file changed, 10 insertions(+), 1 deletion(-)
> >
> > diff --git a/quota/report.c b/quota/report.c
> > index 48a3f29..557d667 100644
> > --- a/quota/report.c
> > +++ b/quota/report.c
> > @@ -389,7 +389,10 @@ report_mount(
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0na= me =3D p->pr_name;
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0}
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
> > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(fp, &quo= t;%-10s", name);
>
> Could use a comment:
>
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* If no name = is found, print the id # instead of (null) */
>
> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (name !=3D NU= LL)
> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0fprintf(fp, "%-10s", name);
> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0else
> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0fprintf(fp, "#%-10u", d.d_id);
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0}
> >
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0if (form & XFS_BLOCK_QUOTA) {
> > @@ -571,6 +574,12 @@ report_project_mount(
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0id =3D oid + 1;
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0} else {
>
> Comment:
>
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Print defau= lt project quota even if PRID 0 isn't defined */
>
> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (!getprprid(0= )) {
> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0report_mount(fp, 0, "#0", NULL, form, XFS_PROJ_QUOTA= ,
>
> If you pass in NULL instead of "#0" does report_mount do the= right thing?
> If so, better to not hard-code "#0" here.

This's a good idea! Better than use hard=E2=80=93code #0= which looks ugly.

I will send V2 patch to fix all above problems.

Thanks,
Zorro
>
> -Eric
>
> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 mount, flags);
> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0flags |=3D NO_HEADER_FLAG;
> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
> > +
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0setprent();=
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0while ((p = =3D getprent()) !=3D NULL) {
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0if (report_mount(fp, p->pr_prid, p->pr_name, NULL, > >
>
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
> http://oss.sgi.com= /mailman/listinfo/xfs

--001a114fa4c274fbf7052fdb2ec3-- From sandeen@sandeen.net Wed Apr 6 20:43:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0BAC27CA0 for ; Wed, 6 Apr 2016 20:43:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D67DB8F8035 for ; Wed, 6 Apr 2016 18:43:25 -0700 (PDT) X-ASG-Debug-ID: 1459993402-04cb6c24622ee450001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id iB6J2d01wVrRHHKH for ; Wed, 06 Apr 2016 18:43:22 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id BA52E14429 for ; Wed, 6 Apr 2016 20:43:21 -0500 (CDT) Subject: Re: [PATCH 03/19] mkfs: Sanitise the superblock feature macros To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 03/19] mkfs: Sanitise the superblock feature macros References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-4-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <5705BB39.5010003@sandeen.net> Date: Wed, 6 Apr 2016 20:43:21 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.1 MIME-Version: 1.0 In-Reply-To: <1458818136-56043-4-git-send-email-jtulak@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1459993402 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28511 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > From: Dave Chinner > > UPDATE > o disable finobt when crc=0 no matter if user used -m finobt=X > o split line > 80 chars > o remove unused variable > o add omitted finobtflag > o change variables in spinodes case to look like surrounding code > o add I_ALIGN reqval > > They are horrible macros that simply obfuscate the code, so > let's factor the code and make them nice functions. > > To do this, add a sb_feat_args structure that carries around the > variables rather than a strange assortment of variables. This means > all the default can be clearly defined in a structure > initialisation, and dependent feature bits are easy to check. sorry for multiple passes. More comments below. > Signed-off-by: Dave Chinner > Signed-off-by: Jan Tulak > --- > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index 979a860..36bcb9f 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c ... > @@ -981,11 +1077,21 @@ main( > int worst_freelist; > libxfs_init_t xi; > struct fs_topology ft; > - int lazy_sb_counters; > - int crcs_enabled; > - int finobt; > - bool finobtflag; > - int spinodes; > + struct sb_feat_args sb_feat = { > + .finobt = 1, > + .finobtflag = false, should we really have "finobtflag" in this structure? This structure should only carry feature selections, not feature specification flags I think. Why is this the only such flag in the structure? Pretty sure finobtflag should stay a variable for now just like lvflag (which goes with log_version). > + .spinodes = 0, > + .log_version = 2, > + .attr_version = 2, > + .dir_version = XFS_DFL_DIR_VERSION, > + .inode_align = XFS_IFLAG_ALIGN, > + .nci = false, > + .lazy_sb_counters = true, > + .projid16bit = false, > + .crcs_enabled = true, > + .dirftype = false, > + .parent_pointers = false, > + }; > > platform_uuid_generate(&uuid); > progname = basename(argv[0]); ... > @@ -1517,7 +1617,14 @@ main( > c = atoi(value); > if (c < 0 || c > 1) > illegal(value, "m crc"); > - crcs_enabled = c; > + if (c && nftype) { > + fprintf(stderr, > +_("cannot specify both crc and ftype\n")); > + usage(); hm, why is conflict checking added? It's not what the commit says the patch does. It also regresses the bug I fixed in commit b990de8ba4e2df2bc76a140799d3ddb4a0eac4ce Author: Eric Sandeen Date: Tue Aug 18 17:53:17 2015 +1000 mkfs.xfs: fix ftype-vs-crc option combination testing with this patch, it is broken again: # mkfs/mkfs.xfs -m crc=0 -n ftype=1 -dfile,name=fsfile,size=16g # mkfs/mkfs.xfs -n ftype=1 -m crc=0 -dfile,name=fsfile,size=16g cannot specify both crc and ftype Usage: mkfs.xfs ... > + } > + sb_feat.crcs_enabled = c ? true : false; > + if (c) > + sb_feat.dirftype = true; > break; > case M_FINOBT: > if (!value || *value == '\0') > @@ -1525,8 +1632,8 @@ main( > c = atoi(value); > if (c < 0 || c > 1) > illegal(value, "m finobt"); > - finobt = c; > - finobtflag = true; > + sb_feat.finobtflag = true; yep this should just stay "finobtflag" I think. > + sb_feat.finobt = c; > break; > case M_UUID: > if (!value || *value == '\0') ... > @@ -1879,23 +1988,25 @@ _("32 bit Project IDs always enabled on CRC enabled filesytems\n")); > } else { > /* > * The kernel doesn't currently support crc=0,finobt=1 > - * filesystems. If crcs are not enabled and the user has > - * explicitly turned them off then silently turn them off > - * to avoid an unnecessary warning. If the user explicitly > - * tried to use crc=0,finobt=1, then issue a warning before > - * turning them off. > + * filesystems. If crcs are not enabled and the user has not > + * explicitly turned finobt on, then silently turn it off to > + * avoid an unnecessary warning. If the user explicitly tried > + * to use crc=0,finobt=1, then issue a warning before turning > + * them off. > */ > - if (finobt && finobtflag) { > - fprintf(stderr, > -_("warning: finobt not supported without CRC support, disabled.\n")); > + if (sb_feat.finobt){ > + if (sb_feat.finobtflag) { > + fprintf(stderr, > + _("warning: finobt not supported without CRC support, disabled.\n")); > + } > + sb_feat.finobt = 0; like I mentioned, just this, I think (assuming we like the silent turning off, but that would be a different patch): - if (finobt && finobtflag) { + if (sb_feat.finobt && sb_feat.finobtflag) { fprintf(stderr, _("warning: finobt not supported without CRC support, disabled.\n")); } - finobt = 0; + sb_feat.finobt = 0; } > } > - finobt = 0; > } > > - if (spinodes && !crcs_enabled) { > + if (sb_feat.spinodes && !sb_feat.crcs_enabled) { > fprintf(stderr, > _("warning: sparse inodes not supported without CRC support, disabled.\n")); > - spinodes = 0; > + sb_feat.spinodes = 0; > } > > if (nsflag || nlflag) { -Eric From sandeen@sandeen.net Wed Apr 6 21:48:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8DFD57CA0 for ; Wed, 6 Apr 2016 21:48:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E1139AC004 for ; Wed, 6 Apr 2016 19:48:51 -0700 (PDT) X-ASG-Debug-ID: 1459997317-04cbb065ac267a0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id KLwwPVRp9POw7QBL for ; Wed, 06 Apr 2016 19:48:37 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (erlite [10.0.0.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id C12BA16C152 for ; Wed, 6 Apr 2016 21:48:36 -0500 (CDT) Subject: Re: [PATCH 05/19] mkfs: factor boolean option parsing To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 05/19] mkfs: factor boolean option parsing References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-6-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <5705CA84.9080603@sandeen.net> Date: Wed, 6 Apr 2016 21:48:36 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.1 MIME-Version: 1.0 In-Reply-To: <1458818136-56043-6-git-send-email-jtulak@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: 1459997317 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28513 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > From: Dave Chinner > > UPDATE: > - add a forgotten getbool update to FINOBT > - change -m crc and ftype to enable by specifying (instead of toggle off) > > Many of the options passed to mkfs have boolean options (0 or 1) and > all hand roll the same code and validity checks. Factor these out > into a common function. > > Note that the lazy-count option is now changed to match other > booleans in that if you don't specify a value, it reverts to the > default value (on) rather than throwing an error. > > Signed-off-by: Dave Chinner > Signed-off-by: Jan Tulak > --- > mkfs/xfs_mkfs.c | 109 +++++++++++++++++++++++--------------------------------- > 1 file changed, 44 insertions(+), 65 deletions(-) > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index 4811d77..9394bd3 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c ... > @@ -1451,12 +1459,8 @@ main( > sb_feat.attr_version = c; > break; > case I_PROJID32BIT: > - if (!value || *value == '\0') > - value = "0"; > - c = getnum(value, 0, 0, false); > - if (c < 0 || c > 1) > - illegal(value, "i projid32bit"); > - sb_feat.projid16bit = c ? false : true; > + sb_feat.projid16bit = !getbool(value, > + "i projid32bit", false); > break; > case I_SPINODES: > if (!value || *value == '\0') I_SPINODES now needs the getbool() treatment as well. ... > @@ -1631,28 +1625,20 @@ main( > > switch (getsubopt(&p, (constpp)mopts, &value)) { > case M_CRC: > - if (!value || *value == '\0') > - reqval('m', mopts, M_CRC); > - c = getnum(value, 0, 0, false); > - if (c < 0 || c > 1) > - illegal(value, "m crc"); > - if (c && nftype) { > + sb_feat.crcs_enabled = getbool( > + value, "m crc", true); > + if (sb_feat.crcs_enabled && nftype) { > fprintf(stderr, > -_("cannot specify both crc and ftype\n")); > +_("cannot specify both -m crc=1 and -n ftype\n")); > usage(); > } > - sb_feat.crcs_enabled = c ? true : false; > - if (c) > + if (sb_feat.crcs_enabled) > sb_feat.dirftype = true; > break; > case M_FINOBT: > - if (!value || *value == '\0') > - reqval('m', mopts, M_CRC); ^^^ whoops ;) Well that bug goes away now ;) > - c = atoi(value); > - if (c < 0 || c > 1) > - illegal(value, "m finobt"); > sb_feat.finobtflag = true; > - sb_feat.finobt = c; > + sb_feat.finobt = getbool( > + value, "m finobt", true); > break; > case M_UUID: > if (!value || *value == '\0') Other than SPINODES this one looks ok to me. -Eric From sandeen@sandeen.net Wed Apr 6 21:53:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0E0017CA0 for ; Wed, 6 Apr 2016 21:53:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1BFE7AC004 for ; Wed, 6 Apr 2016 19:52:59 -0700 (PDT) X-ASG-Debug-ID: 1459997575-04cb6c24642f2210001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 8Rlc6RFgNR74AiVi for ; Wed, 06 Apr 2016 19:52:56 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (erlite [10.0.0.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id C82D116C152 for ; Wed, 6 Apr 2016 21:52:54 -0500 (CDT) Subject: Re: [PATCH 06/19] mkfs: validate logarithmic parameters sanely To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 06/19] mkfs: validate logarithmic parameters sanely References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-7-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <5705CB86.8090701@sandeen.net> Date: Wed, 6 Apr 2016 21:52:54 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.1 MIME-Version: 1.0 In-Reply-To: <1458818136-56043-7-git-send-email-jtulak@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: 1459997575 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28513 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > From: Dave Chinner > > Testing logarithmic paramters like "-n log=" shows that we do a > terrible job of validating such input. e.g.: <<<<< >>>>>>> This lost pat of Dave's original commit log, which said: # mkfs.xfs -f -n log=456858480 /dev/vda > ..... > naming =version 2 bsize=65536 ascii-ci=0 ftype=0 > .... > > Yeah, I just asked for a block size of 2^456858480, and it didn't > get rejected. Great, isn't it? > > So, factor out the parsing of logarithmic parameters, and pass in > the maximum valid value that they can take. These maximum values > might not be completely accurate (e.g. block/sector sizes will > affect the eventual valid maximum) but we can get rid of all the > overflows and stupidities before we get to fine-grained validity > checking later in mkfs once things like block and sector sizes have > been finalised. > > Signed-off-by: Dave Chinner > Signed-off-by: Jan Tulak > Reviewed-by: Brian Foster otherwise, Reviewed-by: Eric Sandeen > --- > mkfs/xfs_mkfs.c | 79 +++++++++++++++++++++++++++++++++++++-------------------- > 1 file changed, 51 insertions(+), 28 deletions(-) > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index 9394bd3..dda076d 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c > @@ -1022,6 +1022,27 @@ getbool( > return c ? true : false; > } > > +static int > +getnum_checked( > + const char *str, > + long long min_val, > + long long max_val, > + const char *illegal_str, > + char reqval_char, > + char *reqval_opts[], > + int reqval_optind) > +{ > + long long c; > + > + if (!str || *str == '\0') > + reqval(reqval_char, reqval_opts, reqval_optind); > + > + c = getnum(str, 0, 0, false); > + if (c < min_val || c > max_val) > + illegal(str, illegal_str); > + return c; > +} > + > int > main( > int argc, > @@ -1179,16 +1200,16 @@ main( > > switch (getsubopt(&p, (constpp)bopts, &value)) { > case B_LOG: > - if (!value || *value == '\0') > - reqval('b', bopts, B_LOG); > if (blflag) > respec('b', bopts, B_LOG); > if (bsflag) > conflict('b', bopts, B_SIZE, > B_LOG); > - blocklog = getnum(value, 0, 0, false); > - if (blocklog <= 0) > - illegal(value, "b log"); > + blocklog = getnum_checked(value, > + XFS_MIN_BLOCKSIZE_LOG, > + XFS_MAX_BLOCKSIZE_LOG, > + "b log", 'b', bopts, > + B_LOG); > blocksize = 1 << blocklog; > blflag = 1; > break; > @@ -1325,16 +1346,16 @@ main( > nodsflag = 1; > break; > case D_SECTLOG: > - if (!value || *value == '\0') > - reqval('d', dopts, D_SECTLOG); > if (slflag) > respec('d', dopts, D_SECTLOG); > if (ssflag) > conflict('d', dopts, D_SECTSIZE, > D_SECTLOG); > - sectorlog = getnum(value, 0, 0, false); > - if (sectorlog <= 0) > - illegal(value, "d sectlog"); > + sectorlog = getnum_checked(value, > + XFS_MIN_SECTORSIZE_LOG, > + XFS_MAX_SECTORSIZE_LOG, > + "d sectlog", 'd', dopts, > + D_SECTLOG); > sectorsize = 1 << sectorlog; > slflag = 1; > break; > @@ -1399,9 +1420,11 @@ main( > if (isflag) > conflict('i', iopts, I_SIZE, > I_LOG); > - inodelog = getnum(value, 0, 0, false); > - if (inodelog <= 0) > - illegal(value, "i log"); > + inodelog = getnum_checked(value, > + XFS_DINODE_MIN_LOG, > + XFS_DINODE_MAX_LOG, > + "i log", 'i', iopts, > + I_LOG); > isize = 1 << inodelog; > ilflag = 1; > break; > @@ -1573,16 +1596,16 @@ main( > lsflag = 1; > break; > case L_SECTLOG: > - if (!value || *value == '\0') > - reqval('l', lopts, L_SECTLOG); > if (lslflag) > respec('l', lopts, L_SECTLOG); > if (lssflag) > conflict('l', lopts, L_SECTSIZE, > L_SECTLOG); > - lsectorlog = getnum(value, 0, 0, false); > - if (lsectorlog <= 0) > - illegal(value, "l sectlog"); > + lsectorlog = getnum_checked(value, > + XFS_MIN_SECTORSIZE_LOG, > + XFS_MAX_SECTORSIZE_LOG, > + "l sectlog", 'l', lopts, > + L_SECTLOG); > lsectorsize = 1 << lsectorlog; > lslflag = 1; > break; > @@ -1658,16 +1681,16 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > > switch (getsubopt(&p, (constpp)nopts, &value)) { > case N_LOG: > - if (!value || *value == '\0') > - reqval('n', nopts, N_LOG); > if (nlflag) > respec('n', nopts, N_LOG); > if (nsflag) > conflict('n', nopts, N_SIZE, > N_LOG); > - dirblocklog = getnum(value, 0, 0, false); > - if (dirblocklog <= 0) > - illegal(value, "n log"); > + dirblocklog = getnum_checked(value, > + XFS_MIN_REC_DIRSIZE, > + XFS_MAX_BLOCKSIZE_LOG, > + "n log", 'n', nopts, > + N_LOG); > dirblocksize = 1 << dirblocklog; > nlflag = 1; > break; > @@ -1786,16 +1809,16 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > switch (getsubopt(&p, (constpp)sopts, &value)) { > case S_LOG: > case S_SECTLOG: > - if (!value || *value == '\0') > - reqval('s', sopts, S_SECTLOG); > if (slflag || lslflag) > respec('s', sopts, S_SECTLOG); > if (ssflag || lssflag) > conflict('s', sopts, S_SECTSIZE, > S_SECTLOG); > - sectorlog = getnum(value, 0, 0, false); > - if (sectorlog <= 0) > - illegal(value, "s sectlog"); > + sectorlog = getnum_checked(value, > + XFS_MIN_SECTORSIZE_LOG, > + XFS_MAX_SECTORSIZE_LOG, > + "s sectlog", 's', sopts, > + S_SECTLOG); > lsectorlog = sectorlog; > sectorsize = 1 << sectorlog; > lsectorsize = sectorsize; > From sandeen@sandeen.net Wed Apr 6 22:15:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1DC327CA0 for ; Wed, 6 Apr 2016 22:15:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 53769AC004 for ; Wed, 6 Apr 2016 20:15:01 -0700 (PDT) X-ASG-Debug-ID: 1459998894-04cbb065b027ab0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id uF1xza9ZZbPH9aXM for ; Wed, 06 Apr 2016 20:14:55 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 5E06016C152 for ; Wed, 6 Apr 2016 22:14:54 -0500 (CDT) Subject: Re: [PATCH 07/19] mkfs: structify input parameter passing To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 07/19] mkfs: structify input parameter passing References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-8-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <5705D0AD.9060106@sandeen.net> Date: Wed, 6 Apr 2016 22:14:53 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.1 MIME-Version: 1.0 In-Reply-To: <1458818136-56043-8-git-send-email-jtulak@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1459998894 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28513 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > From: Dave Chinner > > CHANGELOG: > o Add a description of the new opt_params structure. > o Fix indenting > o Add missing I_SPINODES to subopt_params > o Add a check for undefined minval/maxval into getnum_checked > o Drop "const" from struct opt_params - it would be removed in a later > patch anyway > > Passing large number of parameters around to number conversion > functions is painful. Add a structure to encapsulate the constant > parameters that are passed, and convert getnum_checked to use it. > > This is the first real step towards a table driven option parser. All the code looks ok, nitpicks on docs below. > Signed-off-by: Dave Chinner > Signed-off-by: Jan Tulak > --- > mkfs/xfs_mkfs.c | 650 ++++++++++++++++++++++++++++++++++++++------------------ > 1 file changed, 439 insertions(+), 211 deletions(-) > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index dda076d..6e29848 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c > @@ -48,147 +48,361 @@ static int ispow2(unsigned int i); > static long long cvtnum(unsigned int blocksize, > unsigned int sectorsize, const char *s); > > +#define MAX_SUBOPTS 16 > /* > - * option tables for getsubopt calls > + * Table for parsing mkfs parameters. > + * > + * Description of the structure members follows: > + * > + * name MANDATORY > + * Name is a single char, e.g., for '-d file', name is 'd'. > + * > + * subopts MANDATORY > + * Subopts is a list of strings naming suboptions. In the example above, > + * it would contain "file". The last entry of this list has to be NULL. > + * > + * subopt_params MANDATORY > + * This is a list of structs tied with subopts. For each entry in subopts, > + * a coresponding entry has to be defined: "corresponding" > + * > + * subopt_params struct: > + * index MANDATORY > + * This number, starting from zero, denotes which item in subopt_params > + * it is. The index has to be the same as is the order in subopts list, > + * so we can access the right item both in subopt_param and subopts. > + * > + * minval, maxval OPTIONAL > + * These options are used for automatic range check and they have to be > + * always used together in pair. If you don't want to limit the max value, > + * use something like UINT_MAX. If no value is given, then you either has then you must either supply your own validation, or ... > + * to supply your own validation, or refuse any value in the 'case > + * X_SOMETHING' block. If you forget to pass a min or max value here, but forget to define a min and max value (?) > + * call a standard function for validating user's value, it will cause an > + * error message notifying you about this issue. > + * > + * (Said in another way, you can't have minval and maxval both equal > + * to zero. But if one value is different: minval=0 and maxval=1, > + * then it is OK.) I think that makes sense ... by the time I got to the end of this I was a little confused. ;) So you don't have to define min/max, but if you call getnum_checked(), then min & max are required, and they can't both be zero - is that correct? Thanks, -Eric > */ > -char *bopts[] = { > +struct opt_params { > + const char name; > + const char *subopts[MAX_SUBOPTS]; > + struct subopt_param { > + int index; > + long long minval; > + long long maxval; > + } subopt_params[MAX_SUBOPTS]; > +}; > + > +struct opt_params bopts = { > + .name = 'b', > + .subopts = { > #define B_LOG 0 > - "log", > + "log", > #define B_SIZE 1 > - "size", > - NULL > + "size", > + NULL > + }, > + .subopt_params = { > + { .index = B_LOG, > + .minval = XFS_MIN_BLOCKSIZE_LOG, > + .maxval = XFS_MAX_BLOCKSIZE_LOG, > + }, > + { .index = B_SIZE, > + .minval = XFS_MIN_BLOCKSIZE, > + .maxval = XFS_MAX_BLOCKSIZE, > + }, > + }, > }; > > -char *dopts[] = { > +struct opt_params dopts = { > + .name = 'd', > + .subopts = { > #define D_AGCOUNT 0 > - "agcount", > + "agcount", > #define D_FILE 1 > - "file", > + "file", > #define D_NAME 2 > - "name", > + "name", > #define D_SIZE 3 > - "size", > + "size", > #define D_SUNIT 4 > - "sunit", > + "sunit", > #define D_SWIDTH 5 > - "swidth", > + "swidth", > #define D_AGSIZE 6 > - "agsize", > + "agsize", > #define D_SU 7 > - "su", > + "su", > #define D_SW 8 > - "sw", > + "sw", > #define D_SECTLOG 9 > - "sectlog", > + "sectlog", > #define D_SECTSIZE 10 > - "sectsize", > + "sectsize", > #define D_NOALIGN 11 > - "noalign", > + "noalign", > #define D_RTINHERIT 12 > - "rtinherit", > + "rtinherit", > #define D_PROJINHERIT 13 > - "projinherit", > + "projinherit", > #define D_EXTSZINHERIT 14 > - "extszinherit", > - NULL > + "extszinherit", > + NULL > + }, > + .subopt_params = { > + { .index = D_AGCOUNT, > + }, > + { .index = D_FILE, > + }, > + { .index = D_NAME, > + }, > + { .index = D_SIZE, > + }, > + { .index = D_SUNIT, > + }, > + { .index = D_SWIDTH, > + }, > + { .index = D_AGSIZE, > + }, > + { .index = D_SU, > + }, > + { .index = D_SW, > + }, > + { .index = D_SECTLOG, > + .minval = XFS_MIN_SECTORSIZE_LOG, > + .maxval = XFS_MAX_SECTORSIZE_LOG, > + }, > + { .index = D_SECTSIZE, > + .minval = XFS_MIN_SECTORSIZE, > + .maxval = XFS_MAX_SECTORSIZE, > + }, > + { .index = D_NOALIGN, > + }, > + { .index = D_RTINHERIT, > + }, > + { .index = D_PROJINHERIT, > + }, > + { .index = D_EXTSZINHERIT, > + }, > + }, > }; > > -char *iopts[] = { > + > +struct opt_params iopts = { > + .name = 'i', > + .subopts = { > #define I_ALIGN 0 > - "align", > + "align", > #define I_LOG 1 > - "log", > + "log", > #define I_MAXPCT 2 > - "maxpct", > + "maxpct", > #define I_PERBLOCK 3 > - "perblock", > + "perblock", > #define I_SIZE 4 > - "size", > + "size", > #define I_ATTR 5 > - "attr", > + "attr", > #define I_PROJID32BIT 6 > - "projid32bit", > + "projid32bit", > #define I_SPINODES 7 > - "sparse", > - NULL > + "sparse", > + NULL > + }, > + .subopt_params = { > + { .index = I_ALIGN, > + }, > + { .index = I_LOG, > + .minval = XFS_DINODE_MIN_LOG, > + .maxval = XFS_DINODE_MAX_LOG, > + }, > + { .index = I_MAXPCT, > + }, > + { .index = I_PERBLOCK, > + }, > + { .index = I_SIZE, > + }, > + { .index = I_ATTR, > + }, > + { .index = I_PROJID32BIT, > + }, > + { .index = I_SPINODES, > + }, > + }, > }; > > -char *lopts[] = { > +struct opt_params lopts = { > + .name = 'l', > + .subopts = { > #define L_AGNUM 0 > - "agnum", > + "agnum", > #define L_INTERNAL 1 > - "internal", > + "internal", > #define L_SIZE 2 > - "size", > + "size", > #define L_VERSION 3 > - "version", > + "version", > #define L_SUNIT 4 > - "sunit", > + "sunit", > #define L_SU 5 > - "su", > + "su", > #define L_DEV 6 > - "logdev", > + "logdev", > #define L_SECTLOG 7 > - "sectlog", > + "sectlog", > #define L_SECTSIZE 8 > - "sectsize", > + "sectsize", > #define L_FILE 9 > - "file", > + "file", > #define L_NAME 10 > - "name", > + "name", > #define L_LAZYSBCNTR 11 > - "lazy-count", > - NULL > + "lazy-count", > + NULL > + }, > + .subopt_params = { > + { .index = L_AGNUM, > + }, > + { .index = L_INTERNAL, > + }, > + { .index = L_SIZE, > + }, > + { .index = L_VERSION, > + }, > + { .index = L_SUNIT, > + }, > + { .index = L_SU, > + }, > + { .index = L_DEV, > + }, > + { .index = L_SECTLOG, > + .minval = XFS_MIN_SECTORSIZE_LOG, > + .maxval = XFS_MAX_SECTORSIZE_LOG, > + }, > + { .index = L_SECTSIZE, > + .minval = XFS_MIN_SECTORSIZE, > + .maxval = XFS_MAX_SECTORSIZE, > + }, > + { .index = L_FILE, > + }, > + { .index = L_NAME, > + }, > + { .index = L_LAZYSBCNTR, > + }, > + }, > }; > > -char *nopts[] = { > +struct opt_params nopts = { > + .name = 'n', > + .subopts = { > #define N_LOG 0 > - "log", > + "log", > #define N_SIZE 1 > - "size", > + "size", > #define N_VERSION 2 > - "version", > + "version", > #define N_FTYPE 3 > - "ftype", > + "ftype", > NULL, > + }, > + .subopt_params = { > + { .index = N_LOG, > + .minval = XFS_MIN_REC_DIRSIZE, > + .maxval = XFS_MAX_BLOCKSIZE_LOG, > + }, > + { .index = N_SIZE, > + .minval = 1 << XFS_MIN_REC_DIRSIZE, > + .maxval = XFS_MAX_BLOCKSIZE, > + }, > + { .index = N_VERSION, > + }, > + { .index = N_FTYPE, > + }, > + }, > }; > > -char *ropts[] = { > +struct opt_params ropts = { > + .name = 'r', > + .subopts = { > #define R_EXTSIZE 0 > - "extsize", > + "extsize", > #define R_SIZE 1 > - "size", > + "size", > #define R_DEV 2 > - "rtdev", > + "rtdev", > #define R_FILE 3 > - "file", > + "file", > #define R_NAME 4 > - "name", > + "name", > #define R_NOALIGN 5 > - "noalign", > - NULL > + "noalign", > + NULL > + }, > + .subopt_params = { > + { .index = R_EXTSIZE, > + }, > + { .index = R_SIZE, > + }, > + { .index = R_DEV, > + }, > + { .index = R_FILE, > + }, > + { .index = R_NAME, > + }, > + { .index = R_NOALIGN, > + }, > + }, > }; > > -char *sopts[] = { > +struct opt_params sopts = { > + .name = 's', > + .subopts = { > #define S_LOG 0 > - "log", > + "log", > #define S_SECTLOG 1 > - "sectlog", > + "sectlog", > #define S_SIZE 2 > - "size", > + "size", > #define S_SECTSIZE 3 > - "sectsize", > - NULL > + "sectsize", > + NULL > + }, > + .subopt_params = { > + { .index = S_LOG, > + .minval = XFS_MIN_SECTORSIZE_LOG, > + .maxval = XFS_MAX_SECTORSIZE_LOG, > + }, > + { .index = S_SECTLOG, > + .minval = XFS_MIN_SECTORSIZE_LOG, > + .maxval = XFS_MAX_SECTORSIZE_LOG, > + }, > + { .index = S_SIZE, > + .minval = XFS_MIN_SECTORSIZE, > + .maxval = XFS_MAX_SECTORSIZE, > + }, > + { .index = S_SECTSIZE, > + .minval = XFS_MIN_SECTORSIZE, > + .maxval = XFS_MAX_SECTORSIZE, > + }, > + }, > }; > > -char *mopts[] = { > +struct opt_params mopts = { > + .name = 'm', > + .subopts = { > #define M_CRC 0 > - "crc", > + "crc", > #define M_FINOBT 1 > "finobt", > #define M_UUID 2 > - "uuid", > - NULL > + "uuid", > + NULL > + }, > + .subopt_params = { > + { .index = M_CRC, > + }, > + }, > }; > > #define TERABYTES(count, blog) ((__uint64_t)(count) << (40 - (blog))) > @@ -1022,24 +1236,42 @@ getbool( > return c ? true : false; > } > > +static __attribute__((noreturn)) void > +illegal_option( > + const char *value, > + struct opt_params *opts, > + int index) > +{ > + fprintf(stderr, > + _("Illegal value %s for -%c %s option\n"), > + value, opts->name, opts->subopts[index]); > + usage(); > +} > + > static int > getnum_checked( > const char *str, > - long long min_val, > - long long max_val, > - const char *illegal_str, > - char reqval_char, > - char *reqval_opts[], > - int reqval_optind) > + struct opt_params *opts, > + int index) > { > long long c; > > if (!str || *str == '\0') > - reqval(reqval_char, reqval_opts, reqval_optind); > + reqval(opts->name, (char **)opts->subopts, index); > + > + if (opts->subopt_params[index].minval == 0 && > + opts->subopt_params[index].maxval == 0) { > + fprintf(stderr, > + _("Option -%c %s has undefined minval/maxval." > + "Can't verify value range. This is a bug.\n"), > + opts->name, opts->subopts[index]); > + exit(1); > + } > > c = getnum(str, 0, 0, false); > - if (c < min_val || c > max_val) > - illegal(str, illegal_str); > + if (c < opts->subopt_params[index].minval || > + c > opts->subopt_params[index].maxval) > + illegal_option(str, opts, index); > return c; > } > > @@ -1196,30 +1428,29 @@ main( > case 'b': > p = optarg; > while (*p != '\0') { > + char **subopts = (char **)bopts.subopts; > char *value; > > - switch (getsubopt(&p, (constpp)bopts, &value)) { > + switch (getsubopt(&p, (constpp)subopts, > + &value)) { > case B_LOG: > if (blflag) > - respec('b', bopts, B_LOG); > + respec('b', subopts, B_LOG); > if (bsflag) > - conflict('b', bopts, B_SIZE, > + conflict('b', subopts, B_SIZE, > B_LOG); > - blocklog = getnum_checked(value, > - XFS_MIN_BLOCKSIZE_LOG, > - XFS_MAX_BLOCKSIZE_LOG, > - "b log", 'b', bopts, > - B_LOG); > + blocklog = getnum_checked(value, &bopts, > + B_LOG); > blocksize = 1 << blocklog; > blflag = 1; > break; > case B_SIZE: > if (!value || *value == '\0') > - reqval('b', bopts, B_SIZE); > + reqval('b', subopts, B_SIZE); > if (bsflag) > - respec('b', bopts, B_SIZE); > + respec('b', subopts, B_SIZE); > if (blflag) > - conflict('b', bopts, B_LOG, > + conflict('b', subopts, B_LOG, > B_SIZE); > blocksize = getnum(value, blocksize, > sectorsize, true); > @@ -1237,14 +1468,16 @@ main( > case 'd': > p = optarg; > while (*p != '\0') { > + char **subopts = (char **)dopts.subopts; > char *value; > > - switch (getsubopt(&p, (constpp)dopts, &value)) { > + switch (getsubopt(&p, (constpp)subopts, > + &value)) { > case D_AGCOUNT: > if (!value || *value == '\0') > - reqval('d', dopts, D_AGCOUNT); > + reqval('d', subopts, D_AGCOUNT); > if (daflag) > - respec('d', dopts, D_AGCOUNT); > + respec('d', subopts, D_AGCOUNT); > agcount = getnum(value, 0, 0, false); > if ((__int64_t)agcount <= 0) > illegal(value, "d agcount"); > @@ -1252,9 +1485,9 @@ main( > break; > case D_AGSIZE: > if (!value || *value == '\0') > - reqval('d', dopts, D_AGSIZE); > + reqval('d', subopts, D_AGSIZE); > if (dasize) > - respec('d', dopts, D_AGSIZE); > + respec('d', subopts, D_AGSIZE); > agsize = getnum(value, blocksize, > sectorsize, true); > if ((__int64_t)agsize <= 0) > @@ -1269,25 +1502,25 @@ main( > break; > case D_NAME: > if (!value || *value == '\0') > - reqval('d', dopts, D_NAME); > + reqval('d', subopts, D_NAME); > if (xi.dname) > - respec('d', dopts, D_NAME); > + respec('d', subopts, D_NAME); > xi.dname = value; > break; > case D_SIZE: > if (!value || *value == '\0') > - reqval('d', dopts, D_SIZE); > + reqval('d', subopts, D_SIZE); > if (dsize) > - respec('d', dopts, D_SIZE); > + respec('d', subopts, D_SIZE); > dsize = value; > break; > case D_SUNIT: > if (!value || *value == '\0') > - reqval('d', dopts, D_SUNIT); > + reqval('d', subopts, D_SUNIT); > if (dsunit) > - respec('d', dopts, D_SUNIT); > + respec('d', subopts, D_SUNIT); > if (nodsflag) > - conflict('d', dopts, D_NOALIGN, > + conflict('d', subopts, D_NOALIGN, > D_SUNIT); > dsunit = getnum(value, 0, 0, false); > if (dsunit < 0) > @@ -1295,11 +1528,11 @@ main( > break; > case D_SWIDTH: > if (!value || *value == '\0') > - reqval('d', dopts, D_SWIDTH); > + reqval('d', subopts, D_SWIDTH); > if (dswidth) > - respec('d', dopts, D_SWIDTH); > + respec('d', subopts, D_SWIDTH); > if (nodsflag) > - conflict('d', dopts, D_NOALIGN, > + conflict('d', subopts, D_NOALIGN, > D_SWIDTH); > dswidth = getnum(value, 0, 0, false); > if (dswidth < 0) > @@ -1307,11 +1540,11 @@ main( > break; > case D_SU: > if (!value || *value == '\0') > - reqval('d', dopts, D_SU); > + reqval('d', subopts, D_SU); > if (dsu) > - respec('d', dopts, D_SU); > + respec('d', subopts, D_SU); > if (nodsflag) > - conflict('d', dopts, D_NOALIGN, > + conflict('d', subopts, D_NOALIGN, > D_SU); > dsu = getnum(value, blocksize, > sectorsize, true); > @@ -1320,11 +1553,11 @@ main( > break; > case D_SW: > if (!value || *value == '\0') > - reqval('d', dopts, D_SW); > + reqval('d', subopts, D_SW); > if (dsw) > - respec('d', dopts, D_SW); > + respec('d', subopts, D_SW); > if (nodsflag) > - conflict('d', dopts, D_NOALIGN, > + conflict('d', subopts, D_NOALIGN, > D_SW); > dsw = getnum(value, 0, 0, false); > if (dsw < 0) > @@ -1332,40 +1565,37 @@ main( > break; > case D_NOALIGN: > if (dsu) > - conflict('d', dopts, D_SU, > + conflict('d', subopts, D_SU, > D_NOALIGN); > if (dsunit) > - conflict('d', dopts, D_SUNIT, > + conflict('d', subopts, D_SUNIT, > D_NOALIGN); > if (dsw) > - conflict('d', dopts, D_SW, > + conflict('d', subopts, D_SW, > D_NOALIGN); > if (dswidth) > - conflict('d', dopts, D_SWIDTH, > + conflict('d', subopts, D_SWIDTH, > D_NOALIGN); > nodsflag = 1; > break; > case D_SECTLOG: > if (slflag) > - respec('d', dopts, D_SECTLOG); > + respec('d', subopts, D_SECTLOG); > if (ssflag) > - conflict('d', dopts, D_SECTSIZE, > + conflict('d', subopts, D_SECTSIZE, > D_SECTLOG); > - sectorlog = getnum_checked(value, > - XFS_MIN_SECTORSIZE_LOG, > - XFS_MAX_SECTORSIZE_LOG, > - "d sectlog", 'd', dopts, > - D_SECTLOG); > + sectorlog = getnum_checked(value, &dopts, > + D_SECTLOG); > sectorsize = 1 << sectorlog; > slflag = 1; > break; > case D_SECTSIZE: > if (!value || *value == '\0') > - reqval('d', dopts, D_SECTSIZE); > + reqval('d', subopts, D_SECTSIZE); > if (ssflag) > - respec('d', dopts, D_SECTSIZE); > + respec('d', subopts, D_SECTSIZE); > if (slflag) > - conflict('d', dopts, D_SECTLOG, > + conflict('d', subopts, D_SECTLOG, > D_SECTSIZE); > sectorsize = getnum(value, blocksize, > sectorsize, true); > @@ -1382,14 +1612,14 @@ main( > break; > case D_PROJINHERIT: > if (!value || *value == '\0') > - reqval('d', dopts, D_PROJINHERIT); > + reqval('d', subopts, D_PROJINHERIT); > fsx.fsx_projid = atoi(value); > fsx.fsx_xflags |= \ > XFS_DIFLAG_PROJINHERIT; > break; > case D_EXTSZINHERIT: > if (!value || *value == '\0') > - reqval('d', dopts, D_EXTSZINHERIT); > + reqval('d', subopts, D_EXTSZINHERIT); > fsx.fsx_extsize = atoi(value); > fsx.fsx_xflags |= \ > XFS_DIFLAG_EXTSZINHERIT; > @@ -1402,37 +1632,34 @@ main( > case 'i': > p = optarg; > while (*p != '\0') { > + char **subopts = (char **)iopts.subopts; > char *value; > > - switch (getsubopt(&p, (constpp)iopts, &value)) { > + switch (getsubopt(&p, (constpp)subopts, > + &value)) { > case I_ALIGN: > sb_feat.inode_align = getbool( > value, "i align", true); > break; > case I_LOG: > - if (!value || *value == '\0') > - reqval('i', iopts, I_LOG); > if (ilflag) > - respec('i', iopts, I_LOG); > + respec('i', subopts, I_LOG); > if (ipflag) > - conflict('i', iopts, I_PERBLOCK, > + conflict('i', subopts, I_PERBLOCK, > I_LOG); > if (isflag) > - conflict('i', iopts, I_SIZE, > + conflict('i', subopts, I_SIZE, > I_LOG); > - inodelog = getnum_checked(value, > - XFS_DINODE_MIN_LOG, > - XFS_DINODE_MAX_LOG, > - "i log", 'i', iopts, > - I_LOG); > + inodelog = getnum_checked(value, &iopts, > + I_LOG); > isize = 1 << inodelog; > ilflag = 1; > break; > case I_MAXPCT: > if (!value || *value == '\0') > - reqval('i', iopts, I_MAXPCT); > + reqval('i', subopts, I_MAXPCT); > if (imflag) > - respec('i', iopts, I_MAXPCT); > + respec('i', subopts, I_MAXPCT); > imaxpct = getnum(value, 0, 0, false); > if (imaxpct < 0 || imaxpct > 100) > illegal(value, "i maxpct"); > @@ -1440,14 +1667,14 @@ main( > break; > case I_PERBLOCK: > if (!value || *value == '\0') > - reqval('i', iopts, I_PERBLOCK); > + reqval('i', subopts, I_PERBLOCK); > if (ilflag) > - conflict('i', iopts, I_LOG, > + conflict('i', subopts, I_LOG, > I_PERBLOCK); > if (ipflag) > - respec('i', iopts, I_PERBLOCK); > + respec('i', subopts, I_PERBLOCK); > if (isflag) > - conflict('i', iopts, I_SIZE, > + conflict('i', subopts, I_SIZE, > I_PERBLOCK); > inopblock = getnum(value, 0, 0, false); > if (inopblock < > @@ -1458,15 +1685,15 @@ main( > break; > case I_SIZE: > if (!value || *value == '\0') > - reqval('i', iopts, I_SIZE); > + reqval('i', subopts, I_SIZE); > if (ilflag) > - conflict('i', iopts, I_LOG, > + conflict('i', subopts, I_LOG, > I_SIZE); > if (ipflag) > - conflict('i', iopts, I_PERBLOCK, > + conflict('i', subopts, I_PERBLOCK, > I_SIZE); > if (isflag) > - respec('i', iopts, I_SIZE); > + respec('i', subopts, I_SIZE); > isize = getnum(value, 0, 0, true); > if (isize <= 0 || !ispow2(isize)) > illegal(value, "i size"); > @@ -1475,7 +1702,7 @@ main( > break; > case I_ATTR: > if (!value || *value == '\0') > - reqval('i', iopts, I_ATTR); > + reqval('i', subopts, I_ATTR); > c = getnum(value, 0, 0, false); > if (c < 0 || c > 2) > illegal(value, "i attr"); > @@ -1501,17 +1728,19 @@ main( > case 'l': > p = optarg; > while (*p != '\0') { > + char **subopts = (char **)lopts.subopts; > char *value; > long long tmp_num; > > - switch (getsubopt(&p, (constpp)lopts, &value)) { > + switch (getsubopt(&p, (constpp)subopts, > + &value)) { > case L_AGNUM: > if (!value || *value == '\0') > - reqval('l', lopts, L_AGNUM); > + reqval('l', subopts, L_AGNUM); > if (laflag) > - respec('l', lopts, L_AGNUM); > + respec('l', subopts, L_AGNUM); > if (ldflag) > - conflict('l', lopts, L_AGNUM, L_DEV); > + conflict('l', subopts, L_AGNUM, L_DEV); > tmp_num = getnum(value, 0, 0, false); > if (tmp_num < 0) > illegal(value, "l agno"); > @@ -1520,7 +1749,7 @@ main( > break; > case L_FILE: > if (loginternal) > - conflict('l', lopts, L_INTERNAL, > + conflict('l', subopts, L_INTERNAL, > L_FILE); > xi.lisfile = getbool(value, "l file", > true); > @@ -1529,12 +1758,12 @@ main( > break; > case L_INTERNAL: > if (ldflag) > - conflict('l', lopts, L_INTERNAL, L_DEV); > + conflict('l', subopts, L_INTERNAL, L_DEV); > if (xi.lisfile) > - conflict('l', lopts, L_FILE, > + conflict('l', subopts, L_FILE, > L_INTERNAL); > if (liflag) > - respec('l', lopts, L_INTERNAL); > + respec('l', subopts, L_INTERNAL); > > loginternal = getbool(value, > "l internal", true); > @@ -1542,9 +1771,9 @@ main( > break; > case L_SU: > if (!value || *value == '\0') > - reqval('l', lopts, L_SU); > + reqval('l', subopts, L_SU); > if (lsu) > - respec('l', lopts, L_SU); > + respec('l', subopts, L_SU); > lsu = getnum(value, blocksize, > sectorsize, true); > if (lsu < 0) > @@ -1553,9 +1782,9 @@ main( > break; > case L_SUNIT: > if (!value || *value == '\0') > - reqval('l', lopts, L_SUNIT); > + reqval('l', subopts, L_SUNIT); > if (lsunit) > - respec('l', lopts, L_SUNIT); > + respec('l', subopts, L_SUNIT); > lsunit = getnum(value, 0, 0, false); > if (lsunit < 0) > illegal(value, "l sunit"); > @@ -1564,13 +1793,13 @@ main( > case L_NAME: > case L_DEV: > if (laflag) > - conflict('l', lopts, L_AGNUM, L_DEV); > + conflict('l', subopts, L_AGNUM, L_DEV); > if (liflag) > - conflict('l', lopts, L_INTERNAL, L_DEV); > + conflict('l', subopts, L_INTERNAL, L_DEV); > if (!value || *value == '\0') > - reqval('l', lopts, L_NAME); > + reqval('l', subopts, L_NAME); > if (xi.logname) > - respec('l', lopts, L_NAME); > + respec('l', subopts, L_NAME); > ldflag = 1; > loginternal = 0; > logfile = value; > @@ -1578,9 +1807,9 @@ main( > break; > case L_VERSION: > if (!value || *value == '\0') > - reqval('l', lopts, L_VERSION); > + reqval('l', subopts, L_VERSION); > if (lvflag) > - respec('l', lopts, L_VERSION); > + respec('l', subopts, L_VERSION); > c = getnum(value, 0, 0, false); > if (c < 1 || c > 2) > illegal(value, "l version"); > @@ -1589,33 +1818,30 @@ main( > break; > case L_SIZE: > if (!value || *value == '\0') > - reqval('l', lopts, L_SIZE); > + reqval('l', subopts, L_SIZE); > if (logsize) > - respec('l', lopts, L_SIZE); > + respec('l', subopts, L_SIZE); > logsize = value; > lsflag = 1; > break; > case L_SECTLOG: > if (lslflag) > - respec('l', lopts, L_SECTLOG); > + respec('l', subopts, L_SECTLOG); > if (lssflag) > - conflict('l', lopts, L_SECTSIZE, > + conflict('l', subopts, L_SECTSIZE, > L_SECTLOG); > lsectorlog = getnum_checked(value, > - XFS_MIN_SECTORSIZE_LOG, > - XFS_MAX_SECTORSIZE_LOG, > - "l sectlog", 'l', lopts, > - L_SECTLOG); > + &lopts, L_SECTLOG); > lsectorsize = 1 << lsectorlog; > lslflag = 1; > break; > case L_SECTSIZE: > if (!value || *value == '\0') > - reqval('l', lopts, L_SECTSIZE); > + reqval('l', subopts, L_SECTSIZE); > if (lssflag) > - respec('l', lopts, L_SECTSIZE); > + respec('l', subopts, L_SECTSIZE); > if (lslflag) > - conflict('l', lopts, L_SECTLOG, > + conflict('l', subopts, L_SECTLOG, > L_SECTSIZE); > lsectorsize = getnum(value, blocksize, > sectorsize, true); > @@ -1644,9 +1870,11 @@ main( > case 'm': > p = optarg; > while (*p != '\0') { > + char **subopts = (char **)mopts.subopts; > char *value; > > - switch (getsubopt(&p, (constpp)mopts, &value)) { > + switch (getsubopt(&p, (constpp)subopts, > + &value)) { > case M_CRC: > sb_feat.crcs_enabled = getbool( > value, "m crc", true); > @@ -1665,7 +1893,7 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > break; > case M_UUID: > if (!value || *value == '\0') > - reqval('m', mopts, M_UUID); > + reqval('m', subopts, M_UUID); > if (platform_uuid_parse(value, &uuid)) > illegal(optarg, "m uuid"); > break; > @@ -1677,30 +1905,29 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > case 'n': > p = optarg; > while (*p != '\0') { > + char **subopts = (char **)nopts.subopts; > char *value; > > - switch (getsubopt(&p, (constpp)nopts, &value)) { > + switch (getsubopt(&p, (constpp)subopts, > + &value)) { > case N_LOG: > if (nlflag) > - respec('n', nopts, N_LOG); > + respec('n', subopts, N_LOG); > if (nsflag) > - conflict('n', nopts, N_SIZE, > + conflict('n', subopts, N_SIZE, > N_LOG); > dirblocklog = getnum_checked(value, > - XFS_MIN_REC_DIRSIZE, > - XFS_MAX_BLOCKSIZE_LOG, > - "n log", 'n', nopts, > - N_LOG); > + &nopts, N_LOG); > dirblocksize = 1 << dirblocklog; > nlflag = 1; > break; > case N_SIZE: > if (!value || *value == '\0') > - reqval('n', nopts, N_SIZE); > + reqval('n', subopts, N_SIZE); > if (nsflag) > - respec('n', nopts, N_SIZE); > + respec('n', subopts, N_SIZE); > if (nlflag) > - conflict('n', nopts, N_LOG, > + conflict('n', subopts, N_LOG, > N_SIZE); > dirblocksize = getnum(value, blocksize, > sectorsize, true); > @@ -1713,9 +1940,9 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > break; > case N_VERSION: > if (!value || *value == '\0') > - reqval('n', nopts, N_VERSION); > + reqval('n', subopts, N_VERSION); > if (nvflag) > - respec('n', nopts, N_VERSION); > + respec('n', subopts, N_VERSION); > if (!strcasecmp(value, "ci")) { > /* ASCII CI mode */ > sb_feat.nci = true; > @@ -1730,7 +1957,7 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > break; > case N_FTYPE: > if (nftype) > - respec('n', nopts, N_FTYPE); > + respec('n', subopts, N_FTYPE); > if (sb_feat.crcs_enabled) { > fprintf(stderr, > _("cannot specify both -m crc=1 and -n ftype\n")); > @@ -1762,14 +1989,16 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > case 'r': > p = optarg; > while (*p != '\0') { > + char **subopts = (char **)ropts.subopts; > char *value; > > - switch (getsubopt(&p, (constpp)ropts, &value)) { > + switch (getsubopt(&p, (constpp)subopts, > + &value)) { > case R_EXTSIZE: > if (!value || *value == '\0') > - reqval('r', ropts, R_EXTSIZE); > + reqval('r', subopts, R_EXTSIZE); > if (rtextsize) > - respec('r', ropts, R_EXTSIZE); > + respec('r', subopts, R_EXTSIZE); > rtextsize = value; > break; > case R_FILE: > @@ -1781,16 +2010,16 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > case R_NAME: > case R_DEV: > if (!value || *value == '\0') > - reqval('r', ropts, R_NAME); > + reqval('r', subopts, R_NAME); > if (xi.rtname) > - respec('r', ropts, R_NAME); > + respec('r', subopts, R_NAME); > xi.rtname = value; > break; > case R_SIZE: > if (!value || *value == '\0') > - reqval('r', ropts, R_SIZE); > + reqval('r', subopts, R_SIZE); > if (rtsize) > - respec('r', ropts, R_SIZE); > + respec('r', subopts, R_SIZE); > rtsize = value; > break; > case R_NOALIGN: > @@ -1804,21 +2033,20 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > case 's': > p = optarg; > while (*p != '\0') { > + char **subopts = (char **)sopts.subopts; > char *value; > > - switch (getsubopt(&p, (constpp)sopts, &value)) { > + switch (getsubopt(&p, (constpp)subopts, > + &value)) { > case S_LOG: > case S_SECTLOG: > if (slflag || lslflag) > - respec('s', sopts, S_SECTLOG); > + respec('s', subopts, S_SECTLOG); > if (ssflag || lssflag) > - conflict('s', sopts, S_SECTSIZE, > - S_SECTLOG); > - sectorlog = getnum_checked(value, > - XFS_MIN_SECTORSIZE_LOG, > - XFS_MAX_SECTORSIZE_LOG, > - "s sectlog", 's', sopts, > - S_SECTLOG); > + conflict('s', subopts, > + S_SECTSIZE, S_SECTLOG); > + sectorlog = getnum_checked(value, &sopts, > + S_SECTLOG); > lsectorlog = sectorlog; > sectorsize = 1 << sectorlog; > lsectorsize = sectorsize; > @@ -1827,11 +2055,11 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > case S_SIZE: > case S_SECTSIZE: > if (!value || *value == '\0') > - reqval('s', sopts, S_SECTSIZE); > + reqval('s', subopts, S_SECTSIZE); > if (ssflag || lssflag) > - respec('s', sopts, S_SECTSIZE); > + respec('s', subopts, S_SECTSIZE); > if (slflag || lslflag) > - conflict('s', sopts, S_SECTLOG, > + conflict('s', subopts, S_SECTLOG, > S_SECTSIZE); > sectorsize = getnum(value, blocksize, > sectorsize, true); > From zlang@redhat.com Wed Apr 6 22:37:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 250A77CA0 for ; Wed, 6 Apr 2016 22:37:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id ECB4B304032 for ; Wed, 6 Apr 2016 20:37:16 -0700 (PDT) X-ASG-Debug-ID: 1460000234-04cbb065b8287d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wM0zrVdTExDaIahH (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 06 Apr 2016 20:37:15 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CE51281F03 for ; Thu, 7 Apr 2016 03:37:14 +0000 (UTC) Received: from localhost (dhcp12-168.nay.redhat.com [10.66.12.168] (may be forged)) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u373bDK4026454; Wed, 6 Apr 2016 23:37:14 -0400 Date: Thu, 7 Apr 2016 11:37:13 +0800 From: Zorro Lang To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs_quota: print quota id number if the name can't be found Message-ID: <20160407033713.GA2947@dhcp12-237.nay.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs_quota: print quota id number if the name can't be found References: <1459964353-25151-1-git-send-email-zlang@redhat.com> <570556AE.7080306@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <570556AE.7080306@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460000235 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Apr 06, 2016 at 01:34:22PM -0500, Eric Sandeen wrote: > On 4/6/16 12:39 PM, Zorro Lang wrote: > > When use GETNEXTQUOTA ioctl to report project quota, it always > > report an unexpected quota: > > > > (null) 0 0 0 00 [--------] > > > > The ID 0 store the default quota, even if no one set default quota, > > it still have quota accounting, but not enforced. So GETNEXTQUOTA > > can find and report this undefined quota. > > > > From this problem, I thought if others' quota name miss, (null) will > > be printed too. e.g. > > > > # xfs_quota -xc "limit -u bsoft=300m bhard=400m test" $mnt > > # xfs_quota -xc "report -u" $mnt > > User ID Used Soft Hard Warn/Grace > > ---------- -------------------------------------------------- > > root 0 0 0 00 [--------] > > test 0 307200 409600 00 [--------] > > # userdel -r test > > # xfs_quota -xc "report -u" $mnt > > User ID Used Soft Hard Warn/Grace > > ---------- -------------------------------------------------- > > root 0 0 0 00 [--------] > > (null) 0 307200 409600 00 [--------] > > > > So this problem same with above id 0's problem. For deal with this, > > this patch will print id number if the name can't be found. > > > > But if use old GETQUOTA ioctl, it won't print project id 0 quota > > information(if it's not defined). That's different with GETNEXTQUOTA. > > For keep consistent, this patch also print project id 0 when use old > > GETQUOTA. > > > > Signed-off-by: Zorro Lang > > Thanks, I think this makes sense; so this solves 2 problems. > > 1) always print the id # if there is no name mapping during quota report, and > 2) always print default project quota information, even if no PRID 0 in in the projects map. > > UID & GID always (?) have an ID 0 defined (if the system has no root user or group, > something is very odd, but it is normal to have no PRID 0 defined) > > other comments below. > > > --- > > > > Hi, > > > > This's a problem from GETNEXTQUOTA feature. The original disscussion > > is as below: > > > > http://thread.gmane.org/gmane.comp.file-systems.fstests/1852/focus=1968 > > > > Then Eryu send a patch to xfstests, try to fix the test failure bring > > by this bug. The disscussion is as below: > > > > http://oss.sgi.com/archives/xfs/2016-04/msg00002.html > > > > Finally we decided to fix this problem in xfsprogs. After talked with > > Eric Sandeen, I wrote this patch. At first, Eric thought we shouldn't > > print project id 0 quota information, if no one set limit for it. > > > > Then he change his mind to always print "root" as project id 0's name, > > if no one define a name for it. But there's another problem, if we > > print "root" for project id 0, but we can't run: > > > > xfs_quota -xc "limit -p xxx xxx root" $mnt > > > > Because the "root" is a fake name. Then I suggest to print id number, > > if the name can't be found. This method not only used for project id > > 0, it used for all user/group/project IDs which no name defined. > > > > So this patch should be the V3 patch. We can't sure which one is the > > best idea. If anyone have better idea, please tell me. > > > > Thanks, > > Zorro > > > > quota/report.c | 11 ++++++++++- > > 1 file changed, 10 insertions(+), 1 deletion(-) > > > > diff --git a/quota/report.c b/quota/report.c > > index 48a3f29..557d667 100644 > > --- a/quota/report.c > > +++ b/quota/report.c > > @@ -389,7 +389,10 @@ report_mount( > > name = p->pr_name; > > } > > } > > - fprintf(fp, "%-10s", name); > > Could use a comment: > > + /* If no name is found, print the id # instead of (null) */ > > > + if (name != NULL) > > + fprintf(fp, "%-10s", name); > > + else > > + fprintf(fp, "#%-10u", d.d_id); There's one more problem. When we print id number we print #%-10u, but for name we print %-10s. There's one more "#" be printed for number. So if we print name and number both, the output will like this: User ID Used Soft Hard Warn/Grace ---------- -------------------------------------------------- root 512000 0 0 00 [--------] #1000 0 307200 409600 00 [--------] You can find the line of #1000 is not align at the line of "root". Because the name print 10 characters, but the number print 10 characters + #. Should we fix this problem? If fix it, should we make name print %-11s, or make number print #%-9u? Thanks, Zorro > > } > > > > if (form & XFS_BLOCK_QUOTA) { > > @@ -571,6 +574,12 @@ report_project_mount( > > id = oid + 1; > > } > > } else { > > Comment: > > + /* Print default project quota even if PRID 0 isn't defined */ > > > + if (!getprprid(0)) { > > + report_mount(fp, 0, "#0", NULL, form, XFS_PROJ_QUOTA, > > If you pass in NULL instead of "#0" does report_mount do the right thing? > If so, better to not hard-code "#0" here. > > -Eric > > > + mount, flags); > > + flags |= NO_HEADER_FLAG; > > + } > > + > > setprent(); > > while ((p = getprent()) != NULL) { > > if (report_mount(fp, p->pr_prid, p->pr_name, NULL, > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From esandeen@redhat.com Wed Apr 6 23:10:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2E0E97CA0 for ; Wed, 6 Apr 2016 23:10:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 00FE18F8035 for ; Wed, 6 Apr 2016 21:10:20 -0700 (PDT) X-ASG-Debug-ID: 1460002217-04cbb065b829ea0001-NocioJ Received: from mx3-phx2.redhat.com (mx3-phx2.redhat.com [209.132.183.24]) by cuda.sgi.com with ESMTP id k3PccW4VowKV8kJx (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 06 Apr 2016 21:10:18 -0700 (PDT) X-Barracuda-Envelope-From: esandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.24 Received: from zmail14.collab.prod.int.phx2.redhat.com (zmail14.collab.prod.int.phx2.redhat.com [10.5.83.16]) by mx3-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id u374AH8U020822; Thu, 7 Apr 2016 00:10:17 -0400 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit From: Eric Sandeen MIME-Version: 1.0 Subject: Re: [PATCH] xfs_quota: print quota id number if the name can't be found Message-Id: <99CDF6E9-2812-4D24-BB23-7145AD4ED6DF@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs_quota: print quota id number if the name can't be found Date: Thu, 7 Apr 2016 00:10:16 -0400 (EDT) References: <1459964353-25151-1-git-send-email-zlang@redhat.com> <570556AE.7080306@redhat.com> <20160407033713.GA2947@dhcp12-237.nay.redhat.com> To: Zorro Lang In-Reply-To: <20160407033713.GA2947@dhcp12-237.nay.redhat.com> Cc: Eric Sandeen , xfs@oss.sgi.com X-Mailer: Zimbra 8.0.6_GA_5922 (MobileSync - Apple-iPhone7C2/1305.238) Thread-Topic: xfs_quota: print quota id number if the name can't be found Thread-Index: Cu77t5HkOxWIgr6+teXuSw7sejnwUg== X-Barracuda-Connect: mx3-phx2.redhat.com[209.132.183.24] X-Barracuda-Start-Time: 1460002218 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.03 X-Barracuda-Spam-Status: No, SCORE=0.03 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28514 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain > On Apr 6, 2016, at 10:37 PM, Zorro Lang wrote: > >> >> >>> + if (name != NULL) >>> + fprintf(fp, "%-10s", name); >>> + else >>> + fprintf(fp, "#%-10u", d.d_id); > > There's one more problem. When we print id number we print #%-10u, but > for name we print %-10s. There's one more "#" be printed for number. > So if we print name and number both, the output will like this: > > User ID Used Soft Hard Warn/Grace > ---------- -------------------------------------------------- > root 512000 0 0 00 [--------] > #1000 0 307200 409600 00 [--------] > > You can find the line of #1000 is not align at the line of "root". > Because the name print 10 characters, but the number print 10 > characters + #. > > Should we fix this problem? > If fix it, should we make name print %-11s, or make number print > #%-9u? 9u I think. Leave the existing format unchanged. Thx, Eric > Thanks, > Zorro > >>> } >>> >>> if (form & XFS_BLOCK_QUOTA) { >>> @@ -571,6 +574,12 @@ report_project_mount( >>> id = oid + 1; >>> } >>> } else { >> >> Comment: >> >> + /* Print default project quota even if PRID 0 isn't defined */ >> >>> + if (!getprprid(0)) { >>> + report_mount(fp, 0, "#0", NULL, form, XFS_PROJ_QUOTA, >> >> If you pass in NULL instead of "#0" does report_mount do the right thing? >> If so, better to not hard-code "#0" here. >> >> -Eric >> >>> + mount, flags); >>> + flags |= NO_HEADER_FLAG; >>> + } >>> + >>> setprent(); >>> while ((p = getprent()) != NULL) { >>> if (report_mount(fp, p->pr_prid, p->pr_name, NULL, >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs From zlang@redhat.com Wed Apr 6 23:12:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AD2B37CA0 for ; Wed, 6 Apr 2016 23:12:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7E71B304039 for ; Wed, 6 Apr 2016 21:12:16 -0700 (PDT) X-ASG-Debug-ID: 1460002334-04cbb065b829fe0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 6mLItogzBa72pMkM (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 06 Apr 2016 21:12:15 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 581677F6C1 for ; Thu, 7 Apr 2016 04:12:14 +0000 (UTC) Received: from localhost (dhcp12-168.nay.redhat.com [10.66.12.168] (may be forged)) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u374CDCm031883; Thu, 7 Apr 2016 00:12:13 -0400 From: Zorro Lang To: xfs@oss.sgi.com Cc: sandeen@redhat.com, Zorro Lang Subject: [PATCH v2] xfs_quota: print quota id number if the name can't be found Date: Thu, 7 Apr 2016 12:12:11 +0800 X-ASG-Orig-Subj: [PATCH v2] xfs_quota: print quota id number if the name can't be found Message-Id: <1460002331-18278-1-git-send-email-zlang@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: 1460002335 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 When use GETNEXTQUOTA ioctl to report project quota, it always report an unexpected quota: (null) 0 0 0 00 [--------] The ID 0 store the default quota, even if no one set default quota, it still have quota accounting, but not enforced. So GETNEXTQUOTA can find and report this undefined quota. >From this problem, I thought if others' quota name miss, (null) will be printed too. e.g. # xfs_quota -xc "limit -u bsoft=300m bhard=400m test" $mnt # xfs_quota -xc "report -u" $mnt User ID Used Soft Hard Warn/Grace ---------- -------------------------------------------------- root 0 0 0 00 [--------] test 0 307200 409600 00 [--------] # userdel -r test # xfs_quota -xc "report -u" $mnt User ID Used Soft Hard Warn/Grace ---------- -------------------------------------------------- root 0 0 0 00 [--------] (null) 0 307200 409600 00 [--------] So this problem same with above id 0's problem. For deal with this, this patch will print id number if the name can't be found. But if use old GETQUOTA ioctl, it won't print project id 0 quota information(if it's not defined). That's different with GETNEXTQUOTA. For keep consistent, this patch also print project id 0 when use old GETQUOTA. Signed-off-by: Zorro Lang --- Hi, This V2 patch has below change: 1. Add some comments 2. Change the xfs_quota man page 3. For alignment, change "#%-10u" to "#%-9u" when print ID or name mixed. For reduce the impact on xfstests, I didn't change the original "#%-10u" when use "report -n": if (flags & NO_LOOKUP_FLAG) { fprintf(fp, "#%-10u", d.d_id); And didn't change "%-10s" when print quota name: fprintf(fp, "%-10s", name); Thanks, Zorro man/man8/xfs_quota.8 | 7 +++++-- quota/report.c | 16 +++++++++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/man/man8/xfs_quota.8 b/man/man8/xfs_quota.8 index 951252b..dc01804 100644 --- a/man/man8/xfs_quota.8 +++ b/man/man8/xfs_quota.8 @@ -357,9 +357,12 @@ option outputs the report to .I file instead of stdout. The .B \-a -option reports on all filesystems. The +option reports on all filesystems. As default, outputs the name of +the user/group/project. But if no name is defined, outputs the +numberic ID. The .B \-n -option outputs the numeric ID instead of the name. The +option outputs the numeric ID instead of the name, even the name is +defined. The .B \-L and .B \-U diff --git a/quota/report.c b/quota/report.c index 48a3f29..cc422d1 100644 --- a/quota/report.c +++ b/quota/report.c @@ -389,7 +389,11 @@ report_mount( name = p->pr_name; } } - fprintf(fp, "%-10s", name); + /* If no name is found, print the id #num instead of (null) */ + if (name != NULL) + fprintf(fp, "%-10s", name); + else + fprintf(fp, "#%-9u", d.d_id); } if (form & XFS_BLOCK_QUOTA) { @@ -571,6 +575,16 @@ report_project_mount( id = oid + 1; } } else { + if (!getprprid(0)) { + /* + * Print default project quota, even if projid 0 + * isn't defined + */ + report_mount(fp, 0, NULL, NULL, form, XFS_PROJ_QUOTA, + mount, flags); + flags |= NO_HEADER_FLAG; + } + setprent(); while ((p = getprent()) != NULL) { if (report_mount(fp, p->pr_prid, p->pr_name, NULL, -- 2.5.5 From jtulak@redhat.com Thu Apr 7 04:42:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 5D1B07CA0 for ; Thu, 7 Apr 2016 04:42:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id CEDA5AC009 for ; Thu, 7 Apr 2016 02:42:07 -0700 (PDT) X-ASG-Debug-ID: 1460022125-04bdf011032beb40001-NocioJ Received: from mail-ig0-f182.google.com (mail-ig0-f182.google.com [209.85.213.182]) by cuda.sgi.com with ESMTP id GylMGR6uG2elEaCg (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 07 Apr 2016 02:42:05 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.182 Received: by mail-ig0-f182.google.com with SMTP id ui10so65588315igc.1 for ; Thu, 07 Apr 2016 02:42:05 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=XO6LQZQiKlMZWDb+IF9YHQ5a63w9j4TlKEIIiqa/+mw=; b=BGUbyi39hwJRmgzdz+7cIIHqSP4AVPpsDnvWE6kuocCT/FZ7mXDpLMv/M/xeUpbpNa EsgRD08GLjodFxYeEM+bpr0QtM9w225J7V/kU2TIXzDiDd3MXSvAuYgeSipFSthbjn9q O9PrEovolyOViLBJ8QmvlACd2P9tymjBx7l6s4orxdQ6Q5J+TIPQfuparP/waGXHg8Rl 4watExL98tfW+B4kiV0uaFdqYngayonmPIAnp2baWtiRfy8bn1y1mOS6D9Qv2A0kNdcJ NF3llDIOJrlhlkIF38UFuR8f5/q2TcH255L4WA/cPKQPSkWmjoHfGSSCweKog0m84478 bQog== X-Gm-Message-State: AD7BkJJZsclWrXHXPjvacgwjD0T7SG/3qQoFDEZrh1m6jNg6jGGj2UEFkCSs1c4gggsz77urKfZ2wl/7wnrPpkhM X-Received: by 10.50.30.201 with SMTP id u9mr2186530igh.63.1460022125264; Thu, 07 Apr 2016 02:42:05 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.79 with HTTP; Thu, 7 Apr 2016 02:41:45 -0700 (PDT) In-Reply-To: <570582AA.9020909@sandeen.net> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-18-git-send-email-jtulak@redhat.com> <570582AA.9020909@sandeen.net> From: Jan Tulak Date: Thu, 7 Apr 2016 11:41:45 +0200 Message-ID: Subject: Re: [PATCH 17/19] xfsprogs: disable truncating of files To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH 17/19] xfsprogs: disable truncating of files Cc: xfs-oss Content-Type: multipart/alternative; boundary=047d7ba97ee0241f59052fe1e403 X-Barracuda-Connect: mail-ig0-f182.google.com[209.85.213.182] X-Barracuda-Start-Time: 1460022125 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28519 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 --047d7ba97ee0241f59052fe1e403 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Wed, Apr 6, 2016 at 11:42 PM, Eric Sandeen wrote: > On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > > From: Jan Tulak > > > > Unify mkfs.xfs behaviour a bit and never truncate files. If the user > > is trying to mkfs an existing file, we don't want to destroy anything > > he did with the file before (sparse file, allocations...) > > Hm, I guess so ... What motivated this change? I see that it > changes behavior, but I'm not sure what it unifies or fixes - > can you explain more? > > Both, I think. The non-truncating is a new change, a fix of undesired sid= e effects, where user lost his changes to the file, like sparse file... The rest should be unifying the behavior w.r.t. mkfs arguments. Do you think that the O_TRUNC change should be a separate patch? > > + if (*isfile && statres !=3D 0 && (no_size || no_name)) { > > statres !=3D0 doesn't imply ENOENT; it could be EACCES > or several other errors. You'd need to check errno to know > for sure. > > =E2=80=8BWell, then I need to print two errors. One if the file doesn't e= xists, but additional arguments will fix it, and one for other cases, where I will print the specific error... =E2=80=8BCheers, Jan=E2=80=8B --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --047d7ba97ee0241f59052fe1e403 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
On Wed, Ap= r 6, 2016 at 11:42 PM, Eric Sandeen <sandeen@sandeen.net> wrote:
On 3/24/= 16 6:15 AM, jtulak@redhat.com wrot= e:
> From: Jan Tulak <jtulak@redhat= .com>
>
> Unify mkfs.xfs behaviour a bit and never truncate files. If the user > is trying to mkfs an existing file, we don't want to destroy anyth= ing
> he did with the file before (sparse file, allocations...)

Hm, I guess so ...=C2=A0 What motivated this change?=C2=A0 I see tha= t it
changes behavior, but I'm not sure what it unifies or fixes -
can you explain more?

Both, I think. The non-truncating is a new change,= a fix of undesired side effects, where user lost his changes to the file, = like sparse file... The rest should be unifying the behavior w.r.t. mkfs ar= guments. Do you think that the O_TRUNC change should be a separate patch?


> +=C2=A0 =C2=A0 =C2=A0if (*isfile && statres !=3D 0 && = (no_size || no_name)) {

statres !=3D0 doesn't imply ENOENT; it could be EACCES
or several other errors.=C2=A0 You'd need to check errno to know
for sure.

=E2=80=8BWell, then I = need to print two errors. One if the file doesn't exists, but additiona= l arguments will fix it, and one for other cases, where I will print the sp= ecific error...=C2=A0

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


<= br>
--
--047d7ba97ee0241f59052fe1e403-- From jtulak@redhat.com Thu Apr 7 05:50:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 012EE7CA0 for ; Thu, 7 Apr 2016 05:50:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B448A304039 for ; Thu, 7 Apr 2016 03:50:44 -0700 (PDT) X-ASG-Debug-ID: 1460026243-04cb6c24623099f0001-NocioJ Received: from mail-io0-f173.google.com (mail-io0-f173.google.com [209.85.223.173]) by cuda.sgi.com with ESMTP id Cd8KcaPqF610Kj8Q (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 07 Apr 2016 03:50:43 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.173 Received: by mail-io0-f173.google.com with SMTP id 2so89078963ioy.1 for ; Thu, 07 Apr 2016 03:50:43 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=YvMMc1FjOcipySUWE0fx3vvDpkXWUjcQCWSg9e8ZjTc=; b=IX8CllH26d6ydsOVkzqsCROwYpGY5dADJNF1H3eSRFs/J5y8BNYuzgVnfsyDh2ZcC8 RbD0wyO09WvUjhCc2zbt0fRA43s/JqeCU2VJM+z7UOHIwdJIJZ5xMcLlyuzedCPO3OF9 bp6kFUqiYwVe14zPgVJWEeQfJ4VsFkIB4Jrzu0Cl8EZshRXDHlYuSn4IUcvOUPWoXftO 3muMov2EijTesO486ZDb2QbPcZo0TOGjSo8rnpezQDnPLG3IECJC+Wh9lTbzNQdC4+DQ B4MoxsQgdNu6q0tcGaEg7TR3h9n7VczJxDgjbz0PqesQo+UgLv0b1ynYvej/HQ7JiZuo erDw== X-Gm-Message-State: AD7BkJL7cfcV73uqmKIk5hOu/ecfS4iNpwhYV9CC0yku53+Bv/oes4rnSkP0p3f7ZabITNt171dr9Pd/LzD33MHg X-Received: by 10.107.170.17 with SMTP id t17mr3124904ioe.71.1460026242696; Thu, 07 Apr 2016 03:50:42 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.79 with HTTP; Thu, 7 Apr 2016 03:50:23 -0700 (PDT) In-Reply-To: <57057B2A.3000100@sandeen.net> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-19-git-send-email-jtulak@redhat.com> <57057B2A.3000100@sandeen.net> From: Jan Tulak Date: Thu, 7 Apr 2016 12:50:23 +0200 Message-ID: Subject: Re: [PATCH 18/19] mkfs: unit conversions are case insensitive To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH 18/19] mkfs: unit conversions are case insensitive Cc: xfs-oss Content-Type: multipart/alternative; boundary=001a11427d748f5ed0052fe2d998 X-Barracuda-Connect: mail-io0-f173.google.com[209.85.223.173] X-Barracuda-Start-Time: 1460026243 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28521 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 --001a11427d748f5ed0052fe2d998 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Wed, Apr 6, 2016 at 11:10 PM, Eric Sandeen wrote: > On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > > From: Jan Tulak > > > > Solves the question "Should I use 10g or 10G?" > > Might be nicer to do it like the cvtnum in libxcmd: > > c =3D tolower(*sp); > switch (c) { > case 'b': > return i * blocksize; > ... > =E2=80=8BYeah, changed. =E2=80=8B > > (hm, why do we have 3 copies of cvtnum?) > =E2=80=8BWhere? =E2=80=8B =E2=80=8B =E2=80=8B$ pwd =E2=80=8B/some/path/xfsprogs-dev $ grep -r "cvtnum(size_t" . |grep -v "^Binary" =E2=80=8B./include/input.h:extern long long cvtnum(size_t blocksize, size_t sectorsize, char *s); ./io/init.h:extern void init_cvtnum(size_t *blocksize, size_t *sectsize); --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --001a11427d748f5ed0052fe2d998 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
On Wed, Ap= r 6, 2016 at 11:10 PM, Eric Sandeen <sandeen@sandeen.net> wrote:
On 3/24/16 6:15 AM, jtulak@redhat.com wrote:
> From: Jan Tulak <jtulak@redhat= .com>
>
> Solves the question "Should I use 10g or 10G?"

Might be nicer to do it like the cvtnum in libxcmd:

=C2=A0 =C2=A0 =C2=A0 =C2=A0 c =3D tolower(*sp);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 switch (c) {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 case 'b':
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return i * blocksiz= e;
...
=E2=80=8BYeah, changed.
=E2=80=8B
=C2=A0

(hm, why do we have 3 copies of cvtnum?)

=E2=80=8BWhere? =E2=80=8B
=C2=A0=E2=80=8B

=E2=80= =8B$ pwd
=E2=80=8B/some/path/xfsprogs-dev

$ gre= p -r "cvtnum(size_t" . |grep -v "^Binary"
= =E2=80=8B./include/input.h:extern long long cvtnum(size_t blocksize, size_t= sectorsize, char *s);
./io/init.h:extern void init_cvtnum(size_t *= blocksize, size_t *sectsize);

--
--001a11427d748f5ed0052fe2d998-- From eguan@redhat.com Thu Apr 7 06:06:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0FE247CA0 for ; Thu, 7 Apr 2016 06:06:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 89D79AC008 for ; Thu, 7 Apr 2016 04:06:52 -0700 (PDT) X-ASG-Debug-ID: 1460027208-04bdf011022d5000001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 99o5yGLVYnEZwMVN (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 07 Apr 2016 04:06:48 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 20B8A7AEAC; Thu, 7 Apr 2016 11:06:48 +0000 (UTC) Received: from localhost (dhcp12-159.nay.redhat.com [10.66.12.159] (may be forged)) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u37B6kjo016386; Thu, 7 Apr 2016 07:06:47 -0400 From: Eryu Guan To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, Eryu Guan Subject: [PATCH] xfs/259: handle minimum block size more precisely Date: Thu, 7 Apr 2016 19:05:55 +0800 X-ASG-Orig-Subj: [PATCH] xfs/259: handle minimum block size more precisely Message-Id: <1460027155-4222-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460027208 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Currently xfs/259 checks $TEST_DIR for CRC support status to determine if 512 block size should be tested. But this doesn't always work. For example, when TEST_DEV is mkfs'ed with "-m crc=0" mkfs option, using mkfs.xfs binary with CRC being the default. What should be really checked is whether mkfs.xfs creates CRC enabled XFS by default. So introduce a new flag XFS_MKFS_CRC_DEFAULT for this purpose, and do the check based on it in xfs/259. Signed-off-by: Eryu Guan --- This is actually the second attempt to fix this issue, because Christoph was not satisfied with the first attempt, and me either (after thinking about it more :-)). Hope it works this time. common/config | 8 ++++++++ tests/xfs/259 | 4 +--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/common/config b/common/config index cacd815..13bd307 100644 --- a/common/config +++ b/common/config @@ -270,8 +270,16 @@ $MKFS_XFS_PROG -N -d file,name=/tmp/crc_check.img,size=32m -m crc=0 \ if [ $? -ne 0 ]; then XFS_MKFS_HAS_NO_META_SUPPORT=true fi +# check if v5 xfs is default +XFS_MKFS_CRC_DEFAULT=0 +$MKFS_XFS_PROG -N -d file,name=/tmp/crc_check.img,size=32m 2>&1 | grep -q crc=1 +if [ $? -eq 0 ]; then + XFS_MKFS_CRC_DEFAULT=1 +fi rm -f /tmp/crc_check.img + export XFS_MKFS_HAS_NO_META_SUPPORT +export XFS_MKFS_CRC_DEFAULT # new doesn't need config file parsed, we can stop here if [ "$iam" == "new" ]; then diff --git a/tests/xfs/259 b/tests/xfs/259 index 16c1935..3150ff3 100755 --- a/tests/xfs/259 +++ b/tests/xfs/259 @@ -51,9 +51,7 @@ testfile=$TEST_DIR/259.image # Test various sizes slightly less than 4 TB. Need to handle different # minimum block sizes for CRC enabled filesystems, but use a small log so we # don't write lots of zeros unnecessarily. -xfs_info $TEST_DIR | _filter_mkfs 2> $tmp.mkfs > /dev/null -. $tmp.mkfs -if [ $_fs_has_crcs -eq 1 ]; then +if [ $XFS_MKFS_CRC_DEFAULT -eq 1 ]; then blocksize=1024 sizes_to_check="1024 2048 4096" echo "Trying to make (4 TB - 512) B long xfs fs image" -- 2.5.5 From jtulak@redhat.com Thu Apr 7 06:16:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 422187CA0 for ; Thu, 7 Apr 2016 06:16:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id ABF82AC002 for ; Thu, 7 Apr 2016 04:16:12 -0700 (PDT) X-ASG-Debug-ID: 1460027770-04bdf011032d5880001-NocioJ Received: from mail-ig0-f174.google.com (mail-ig0-f174.google.com [209.85.213.174]) by cuda.sgi.com with ESMTP id 0bZaS68mfASsdJ3C (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 07 Apr 2016 04:16:11 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.174 Received: by mail-ig0-f174.google.com with SMTP id g8so67318436igr.0 for ; Thu, 07 Apr 2016 04:16:11 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=Lv1i0TLSBho03UUH/6UqleTlfDd9r3avvRPAhRUEbhk=; b=K98k/mwmdRV9bE5q7vRBKenpe3wMm+idW7GI2FM6LWehxgu664nzjDTXJyyBtQDrit 0CPnqWlD3lMKsfPgTorui+pFxjwvHrvdrrTQVGFZSlTsbVRuaUwOAvbEj51uiUIBahu9 6GC7Ho8Z09qemfL4Zzkwho+4vaCB/UQprFkio/T6R+/WxKFmEJmuN/zaBE0BcrriraU3 J+cN12aMlmTXIL7o7xqbCNRMOOH2GWeRTYRw1oDaLwhPTULctQ7XV1ijaIn1uhMoy9db WW0jbcZaz6u0+GHrr8qlnwFvqWP4lH5/YIHgbAbGj76/A4vyGTlVUwa9hOkqChMBd5uu AgLw== X-Gm-Message-State: AD7BkJIQeXAJjU7gupCDo0dPLll22DI7sfs5e43fnvW8P41iTD02QA1a8Dhc7MjgDzqAdBcqLgO2tJk+0hq84WVF X-Received: by 10.50.28.19 with SMTP id x19mr2689754igg.19.1460027770365; Thu, 07 Apr 2016 04:16:10 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.79 with HTTP; Thu, 7 Apr 2016 04:15:51 -0700 (PDT) In-Reply-To: <57059579.9090900@sandeen.net> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-5-git-send-email-jtulak@redhat.com> <57059579.9090900@sandeen.net> From: Jan Tulak Date: Thu, 7 Apr 2016 13:15:51 +0200 Message-ID: Subject: Re: [PATCH 04/19] mkfs: validate all input values To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH 04/19] mkfs: validate all input values Cc: xfs-oss Content-Type: multipart/alternative; boundary=089e01538da09d8d98052fe33436 X-Barracuda-Connect: mail-ig0-f174.google.com[209.85.213.174] X-Barracuda-Start-Time: 1460027770 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28521 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 --089e01538da09d8d98052fe33436 Content-Type: text/plain; charset=UTF-8 On Thu, Apr 7, 2016 at 1:02 AM, Eric Sandeen wrote: > On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > > From: Dave Chinner > > > > CHANGELOG > > o Fix an unsigned < 0 comparison - save getnum result to another variable > > and test it, before converting it to unsigned logagno. > > ... > > > @@ -1468,7 +1485,10 @@ main( > > respec('l', lopts, > L_AGNUM); > > if (ldflag) > > conflict('l', lopts, > L_AGNUM, L_DEV); > > - logagno = atoi(value); > > + tmp_num = getnum(value, 0, 0, > false); > > + if (tmp_num < 0) > > + illegal(value, "l agno"); > > + logagno = (xfs_agnumber_t)tmp_num; > > laflag = 1; > > break; > > case L_FILE: > > Why not cast to (__int64_t) like other variables do? i.e. > > > + logagno = getnum(value, 0, 0, > false); > + if ((__int64_t)logagno < 0) > + illegal(value, "l agno"); > > or am I missing something? > > Nothing I'm aware of. Replaced. > Thanks, > -Eric > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > -- Jan Tulak jtulak@redhat.com / jan@tulak.me --089e01538da09d8d98052fe33436 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
On Thu, Ap= r 7, 2016 at 1:02 AM, Eric Sandeen <sandeen@sandeen.net> wrote:
On 3/24/= 16 6:15 AM, jtulak@redhat.com wrot= e:
> From: Dave Chinner <dchinner= @redhat.com>
>
> CHANGELOG
> o Fix an unsigned < 0 comparison - save getnum result to another va= riable
>=C2=A0 =C2=A0and test it, before converting it to unsigned logagno.

...

> @@ -1468,7 +1485,10 @@ main(
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0respec('l', lopts, L_AGNUM);
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ld= flag)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0conflict('l', lopts, L_AGNUM, L_DEV);
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0logagno =3D = atoi(value);
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0tmp_num =3D = getnum(value, 0, 0, false);
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (tmp_num = < 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=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0illegal(value, "l agno");
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0logagno =3D = (xfs_agnumber_t)tmp_num;
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0laflag= =3D 1;
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=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=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0case L_FILE:

Why not cast to (__int64_t) like other variables do?=C2=A0 i.e.


+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0logagno = =3D getnum(value, 0, 0, false);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if ((__in= t64_t)logagno < 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=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0illegal(value, "l agno");
or am I missing something?

Nothing I'm aware of. Replaced.

=C2=A0
Thanks,
-Eric

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



--
=
--089e01538da09d8d98052fe33436-- From jtulak@redhat.com Thu Apr 7 06:43:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 AC5D87CA0 for ; Thu, 7 Apr 2016 06:43:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6105B8F8033 for ; Thu, 7 Apr 2016 04:43:34 -0700 (PDT) X-ASG-Debug-ID: 1460029411-04bdf011022d7920001-NocioJ Received: from mail-ig0-f175.google.com (mail-ig0-f175.google.com [209.85.213.175]) by cuda.sgi.com with ESMTP id dZLodQ0buTsb8TYX (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 07 Apr 2016 04:43:32 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.175 Received: by mail-ig0-f175.google.com with SMTP id gy3so11358768igb.1 for ; Thu, 07 Apr 2016 04:43:32 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=a8vUOfNfv7SuOKKDiXdihTv46enqv+KtXxs3SQwxCg0=; b=iZF+tGPjtrGZoxH/TBSIMaZp/pooP5nVzBoT/FhOuwaqG6fXfLZxleIwhRnWBItmuQ 8jlAWM5uBL2vLIA9RSGoHajL2BRVOVH+rumwjZmXu7rGx19enFPpJQp8x1/7ikxBjNEk 1yl42PydaU30jM7Df4NL2MkUEncRYlIpfA0PluAELoifWrAYFh6xevAkoQ0LXMTkKDxF JF3b1LPY/GBtmZPYF0JtEHV7zGT6KyU0rY5xWUh0k9fnZSdTSU5oxY0DoYyT807Ce/s0 radGnYmtYryCnx23hxCEPOCuS5A+lBnfkCdSPhdK2/3GeZa/Vlsz4BKFD4JLbwHVRkdm dxAw== X-Gm-Message-State: AD7BkJLxVWaG5KLiZyTSEBz2uvZfm0THO5R1R193D7PTEVhEQjB58DzEdDLxUdtDwl3+pbHOe9nXTTyFPm1CrlnR X-Received: by 10.50.30.201 with SMTP id u9mr2708213igh.63.1460029411571; Thu, 07 Apr 2016 04:43:31 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.79 with HTTP; Thu, 7 Apr 2016 04:43:12 -0700 (PDT) In-Reply-To: <5705D0AD.9060106@sandeen.net> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-8-git-send-email-jtulak@redhat.com> <5705D0AD.9060106@sandeen.net> From: Jan Tulak Date: Thu, 7 Apr 2016 13:43:12 +0200 Message-ID: Subject: Re: [PATCH 07/19] mkfs: structify input parameter passing To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH 07/19] mkfs: structify input parameter passing Cc: xfs-oss Content-Type: multipart/alternative; boundary=047d7ba97ee0707e5a052fe396c7 X-Barracuda-Connect: mail-ig0-f175.google.com[209.85.213.175] X-Barracuda-Start-Time: 1460029412 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28521 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 --047d7ba97ee0707e5a052fe396c7 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Thu, Apr 7, 2016 at 5:14 AM, Eric Sandeen wrote: > > > + * minval, maxval OPTIONAL > > + * These options are used for automatic range check and they have > to be > > + * always used together in pair. If you don't want to limit the ma= x > value, > > + * use something like UINT_MAX. If no value is given, then you > either has > > then you must either supply your own validation, or ... > > > + * to supply your own validation, or refuse any value in the 'case > > + * X_SOMETHING' block. If you forget to pass a min or max value > here, but > > forget to define a min and max value (?) > > > + * call a standard function for validating user's value, it will > cause an > > + * error message notifying you about this issue. > > + * > > + * (Said in another way, you can't have minval and maxval both equ= al > > + * to zero. But if one value is different: minval=3D0 and maxval= =3D1, > > + * then it is OK.) > > I think that makes sense ... by the time I got to the end of this I was a > little confused. ;) > > So you don't have to define min/max, but if you call getnum_checked(), th= en > min & max are required, and they can't both be zero - is that correct? > =E2=80=8BYes. I couldn't find any usecase, where an option would accept onl= y single hardcoded value (0, in this case) as an argument, and nothing else, because then it doesn't need the argument at all... =E2=80=8B And because forgetting the min/maxval is easy (I know it first hand :-) ), I added the check for minval=3D=3D0 && maxval =3D=3D 0 to raise an error if= you call getnum_checked() for this option. =E2=80=8BCheers,=E2=80=8B =E2=80=8BJan=E2=80=8B --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --047d7ba97ee0707e5a052fe396c7 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
On Thu, Ap= r 7, 2016 at 5:14 AM, Eric Sandeen <sandeen@sandeen.net> wrote:

> + *=C2=A0 =C2=A0minval, maxval OPTIONAL
> + *=C2=A0 =C2=A0 =C2=A0These options are used for automatic range chec= k and they have to be
> + *=C2=A0 =C2=A0 =C2=A0always used together in pair. If you don't = want to limit the max value,
> + *=C2=A0 =C2=A0 =C2=A0use something like UINT_MAX. If no value is giv= en, then you either has

then you must either supply your own validation, or ...

> + *=C2=A0 =C2=A0 =C2=A0to supply your own validation, or refuse any va= lue in the 'case
> + *=C2=A0 =C2=A0 =C2=A0X_SOMETHING' block. If you forget to pass a= min or max value here, but

forget to define a min and max value (?)

> + *=C2=A0 =C2=A0 =C2=A0call a standard function for validating user= 9;s value, it will cause an
> + *=C2=A0 =C2=A0 =C2=A0error message notifying you about this issue. > + *
> + *=C2=A0 =C2=A0 =C2=A0(Said in another way, you can't have minval= and maxval both equal
> + *=C2=A0 =C2=A0 =C2=A0to zero. But if one value is different: minval= =3D0 and maxval=3D1,
> + *=C2=A0 =C2=A0 =C2=A0then it is OK.)

I think that makes sense ... by the time I got to the end of this I = was a
little confused.=C2=A0 ;)

So you don't have to define min/max, but if you call getnum_checked(), = then
min & max are required, and they can't both be zero - is that corre= ct?

=E2=80=8BYes. I = couldn't find any usecase, where an option would accept only single har= dcoded value (0, in this case) as an argument, and nothing else, because th= en it doesn't need the argument at all...
=E2=80= =8B=C2=A0

And because forgetting the min/maxval is easy (I know it first hand= :-) ), I added the check for minval=3D=3D0 && maxval =3D=3D 0 to r= aise an error if you call=C2=A0getnum_checked() for this option.

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

=E2=80=8BJan=E2=80=8B

--
<= /div>
--047d7ba97ee0707e5a052fe396c7-- From jtulak@redhat.com Thu Apr 7 06:54:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 21FBF7CA0 for ; Thu, 7 Apr 2016 06:54:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id DE34E8F8033 for ; Thu, 7 Apr 2016 04:54:01 -0700 (PDT) X-ASG-Debug-ID: 1460030039-04cb6c246030f190001-NocioJ Received: from mail-ig0-f171.google.com (mail-ig0-f171.google.com [209.85.213.171]) by cuda.sgi.com with ESMTP id 3BlqiSTz8fV4R3yi (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 07 Apr 2016 04:54:00 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.171 Received: by mail-ig0-f171.google.com with SMTP id ui10so67989506igc.1 for ; Thu, 07 Apr 2016 04:54:00 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=vZhqm2HvQFXH7slVzps8ljXqUliZNAwlbrqHXRCHpzk=; b=EEq7uKCA5RdFFjwtVKjRXNcUnkuM+i6KDS4TCnytoRgx6ZUDFsKBDcbD2CB3fWymuA inT5aIe/De1c/Xb0Okk830fw4dqy0DKw1/u6yAsJdxoNS9G5KN1nWMrmGSWCauvc+Ohq WNy+8929xI2/RWjxCcq7i6y4GkOlRVyU06KxEimcr2yamoifz52l7g/5Q/5Hck5KivWV dsdGHGGF7AN9qR49t1v4cyDB6HqNwl2w/iuIsOSBFK0D+pqbLsirstLr6DVrO3hkStgr XRDDVmzwTJCgma+b4730suai7SyBsu7yz4GAksaQWTbtGg2U+M0rQTLrrS+OzZpHQpgb ijyg== X-Gm-Message-State: AD7BkJI9QLT/mzLAw7+R0OyFcUP6msdfl6B/41jMPsBjyTtl7TAL2vSuZ3I/fzLBX8bFLT9n7fAUYgkSaqaryHRn X-Received: by 10.50.28.19 with SMTP id x19mr2861822igg.19.1460030038849; Thu, 07 Apr 2016 04:53:58 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.79 with HTTP; Thu, 7 Apr 2016 04:53:39 -0700 (PDT) In-Reply-To: <20160406210128.GC13574@dastard> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-4-git-send-email-jtulak@redhat.com> <56FDD750.3040002@sandeen.net> <20160406210128.GC13574@dastard> From: Jan Tulak Date: Thu, 7 Apr 2016 13:53:39 +0200 Message-ID: Subject: Re: [PATCH 03/19] mkfs: Sanitise the superblock feature macros To: Dave Chinner X-ASG-Orig-Subj: Re: [PATCH 03/19] mkfs: Sanitise the superblock feature macros Cc: xfs-oss Content-Type: multipart/alternative; boundary=089e01538da0d3d817052fe3bb19 X-Barracuda-Connect: mail-ig0-f171.google.com[209.85.213.171] X-Barracuda-Start-Time: 1460030040 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28522 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 --089e01538da0d3d817052fe3bb19 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Wed, Apr 6, 2016 at 11:01 PM, Dave Chinner wrote: > On Wed, Apr 06, 2016 at 11:12:21AM +0200, Jan Tulak wrote: > > On Fri, Apr 1, 2016 at 4:05 AM, Eric Sandeen > wrote: > > > On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > > > if (sb_feat.finobt && sb_feat.finobtflag) { > > > fprintf(stderr, > > > _("warning: finobt not supported without CRC support, disabled.\n")); > > > } > > > sb_feat.finobt =3D 0; > > > > > > would suffice as before, no? Meh. Not a big deal I guess.... > > > > > > > =E2=80=8BChanged. Honestly, I don't like the strings starting at the be= ginning of > > the line, because it breaks the indentation flow, but the rest of the > code > > uses this style, so I should stick to it.=E2=80=8B > > There's good reason for doing this - it makes it easy to grep the > source code for a specific error that has been emitted. Indentation > is useful for demonstrating logic flow, but it's harmful when it > results in strings you might want to find being split up over > multiple lines. > =E2=80=8BMmm, yeah, a valid point. It is caused by the 80 chars limit, but = there are reasons for that too=E2=80=8B... > > Thank you for the review. I will wait a little longer if someone spots > > something more, before sending an updated patchset.=E2=80=8B :-) > > Just send it - I almost got to pulling in this version and > fixing the various comments directly myself yesterday.... > =E2=80=8BOK. I will fix what Eric submitted in the mean time, test it to be= sure I didn't broke anything and send. Cheers, Jan --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --089e01538da0d3d817052fe3bb19 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
On Wed, Ap= r 6, 2016 at 11:01 PM, Dave Chinner <david@fromorbit.com> wrote:
On Wed, = Apr 06, 2016 at 11:12:21AM +0200, Jan Tulak wrote:
> On Fri, Apr 1, 2016 at 4:05 AM, Eric Sandeen <sandeen@sandeen.net> wrote:
> > On 3/24/16 6:15 AM, jtulak@r= edhat.com wrote:
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0if (sb_feat.finobt && sb_feat.finobtflag) {
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr,
> > _("warning: finobt not supported without CRC support, disabl= ed.\n"));
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0} > >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0sb_f= eat.finobt =3D 0;
> >
> > would suffice as before, no? Meh.=C2=A0 Not a big deal I guess...= .
> >
>
> =E2=80=8BChanged. Honestly, I don't like the strings starting at t= he beginning of
> the line, because it breaks the indentation flow, but the rest of the = code
> uses this style, so I should stick to it.=E2=80=8B

There's good reason for doing this - it makes it easy to grep th= e
source code for a specific error that has been emitted. Indentation
is useful for demonstrating logic flow, but it's harmful when it
results in strings you might want to find being split up over
multiple lines.

=E2=80=8BMmm, yeah, = a valid point. It is caused by the 80 chars limit, but there are reasons fo= r that too=E2=80=8B...


> Thank you for the review. I will wait a little longer if someone spots=
> something more, before sending an updated patchset.=E2=80=8B :-)

Just send it - I almost got to pulling in this version and
fixing the various comments directly myself yesterday....
<= div>
=E2=80=8BOK. I will fix what Eric subm= itted in the mean time, test it to be sure I didn't broke anything and = send.

Cheers,
Jan


--
--089e01538da0d3d817052fe3bb19-- From jtulak@redhat.com Thu Apr 7 08:09:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 807707CA0 for ; Thu, 7 Apr 2016 08:09:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id ED46DAC004 for ; Thu, 7 Apr 2016 06:09:30 -0700 (PDT) X-ASG-Debug-ID: 1460034564-04bdf011022dc370001-NocioJ Received: from mail-ig0-f172.google.com (mail-ig0-f172.google.com [209.85.213.172]) by cuda.sgi.com with ESMTP id TGRtHRthDNZzZmLW (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 07 Apr 2016 06:09:25 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.172 Received: by mail-ig0-f172.google.com with SMTP id gy3so101168080igb.0 for ; Thu, 07 Apr 2016 06:09:25 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=OtnbE43etE9s+EwQno1/56PcVpe1O7vKcR/i+9YzOTc=; b=jQsihzin1K1bbCOKo3sIOJ7Gb0kp5HUOqnsHS1vmgCOe18oIxOkzBS1psNf3xmdQRQ hAARh6Ete8l9d4Rw1whk1F+N7gcHundTjedFZ7lvSbPGmQVhEb4t4vN3FVzGR7d4bZg/ uplgF9sR0F3L6qy53Y3iScVlPub2tSxcWfr41mmmgHSMGQe079W6YLXo0B0Sct0kdBCv OSCGxx8ixouzjMr7NQurJLaB7HfrNO3d5UNiCh3cThReET0XjINyNGHXHsx5t3X9+axs tkQBwv89gHC0auTvyv+/WLbk//JyEJbuzy0yP20s/QK6HVoNieGyd00tIg06bkzPjAis wsFg== X-Gm-Message-State: AD7BkJLCXgeMeZGdzRqOVYfKxMTGqGMwI9w/MUFTLi3hLolsw/i+46xuNWiiBMnk3Cd9zwITOPVYE22a6RZl1gTg X-Received: by 10.50.28.19 with SMTP id x19mr3312565igg.19.1460034564161; Thu, 07 Apr 2016 06:09:24 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.79 with HTTP; Thu, 7 Apr 2016 06:09:04 -0700 (PDT) In-Reply-To: <5705BB39.5010003@sandeen.net> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-4-git-send-email-jtulak@redhat.com> <5705BB39.5010003@sandeen.net> From: Jan Tulak Date: Thu, 7 Apr 2016 15:09:04 +0200 Message-ID: Subject: Re: [PATCH 03/19] mkfs: Sanitise the superblock feature macros To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH 03/19] mkfs: Sanitise the superblock feature macros Cc: xfs-oss Content-Type: multipart/alternative; boundary=089e01538da08ed1e6052fe4c993 X-Barracuda-Connect: mail-ig0-f172.google.com[209.85.213.172] X-Barracuda-Start-Time: 1460034565 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28523 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 --089e01538da08ed1e6052fe4c993 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable =E2=80=8B=E2=80=8B On Thu, Apr 7, 2016 at 2:12 AM, Eric Sandeen wrote: > On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > > @@ -1262,10 +1358,11 @@ main( > > switch (getsubopt(&p, (constpp)iopts, > &value)) { > > case I_ALIGN: > > if (!value || *value =3D=3D '\0') > > - value =3D "1"; > > - iaflag =3D atoi(value); > > - if (iaflag < 0 || iaflag > 1) > > + reqval('i', iopts, > I_ALIGN); > > + c =3D atoi(value); > > + if (c < 0 || c > 1) > > illegal(value, "i align")= ; > > + sb_feat.inode_align =3D c ? true = : > false; > > break; > > case I_LOG: > > if (!value || *value =3D=3D '\0') > > > Hm, this seems wrong, as well - per the man page: > > "If the value is omitted, 1 is assumed." > > but this change with the reqval() removes that, doesn't it? Why? > (it's fixed later, but there is no reason to break it mid-series...) =E2=80=8B Changed back to default 1. =E2=80=8BAs for the origin of the change, most l= ikely a copy&paste from some other place, where wasn't a default value, or it was there since I took over the patchset. On Thu, Apr 7, 2016 at 3:43 AM, Eric Sandeen wrote: > > > @@ -981,11 +1077,21 @@ main( > > int worst_freelist; > > libxfs_init_t xi; > > struct fs_topology ft; > > - int lazy_sb_counters; > > - int crcs_enabled; > > - int finobt; > > - bool finobtflag; > > - int spinodes; > > + struct sb_feat_args sb_feat =3D { > > + .finobt =3D 1, > > + .finobtflag =3D false, > > > should we really have "finobtflag" in this structure? > This structure should only carry feature selections, not feature > specification flags I think. Why is this the only such flag > in the structure? > > Pretty sure finobtflag should stay a variable for now > just like lvflag (which goes with log_version). > > =E2=80=8BIt might be right to move it out=E2=80=8B, but the flag is removed= few patches later entirely. Is it worth of the work? I would say nah, let it die where it is. :-) > ... > > > @@ -1517,7 +1617,14 @@ main( > > c =3D atoi(value); > > if (c < 0 || c > 1) > > illegal(value, "m crc"); > > - crcs_enabled =3D c; > > + if (c && nftype) { > > + fprintf(stderr, > > +_("cannot specify both crc and ftype\n")); > > + usage(); > > hm, why is conflict checking added? It's not what the commit says > the patch does. > > It also regresses the bug I fixed in > > commit b990de8ba4e2df2bc76a140799d3ddb4a0eac4ce > Author: Eric Sandeen > Date: Tue Aug 18 17:53:17 2015 +1000 > > mkfs.xfs: fix ftype-vs-crc option combination testing > > with this patch, it is broken again: > > # mkfs/mkfs.xfs -m crc=3D0 -n ftype=3D1 -dfile,name=3Dfsfile,size=3D16g > > # mkfs/mkfs.xfs -n ftype=3D1 -m crc=3D0 -dfile,name=3Dfsfile,size=3D16g > cannot specify both crc and ftype > Usage: mkfs.xfs > ... > > =E2=80=8BBecause the patch is much older than your fix, and at the time i= t was created, it is possible that there wasn't any such check... I would call it the risk of necromancy. :-)=E2=80=8B Anyway, I already fixed this issue in this cycle, and added the the ftype, crc order into a test checking for options sanity. Just I didn't submitted the change yet. ... > > > @@ -1879,23 +1988,25 @@ _("32 bit Project IDs always enabled on CRC > enabled filesytems\n")); > > } else { > > /* > > * The kernel doesn't currently support crc=3D0,finobt=3D= 1 > > - * filesystems. If crcs are not enabled and the user has > > - * explicitly turned them off then silently turn them off > > - * to avoid an unnecessary warning. If the user explicitl= y > > - * tried to use crc=3D0,finobt=3D1, then issue a warning = before > > - * turning them off. > > + * filesystems. If crcs are not enabled and the user has > not > > + * explicitly turned finobt on, then silently turn it off > to > > + * avoid an unnecessary warning. If the user explicitly > tried > > + * to use crc=3D0,finobt=3D1, then issue a warning before > turning > > + * them off. > > */ > > - if (finobt && finobtflag) { > > - fprintf(stderr, > > -_("warning: finobt not supported without CRC support, disabled.\n")); > > + if (sb_feat.finobt){ > > + if (sb_feat.finobtflag) { > > + fprintf(stderr, > > + _("warning: finobt not supported without CRC support, > disabled.\n")); > > + } > > + sb_feat.finobt =3D 0; > > like I mentioned, just this, I think (assuming we like the silent turning > off, but that would be a different patch): > =E2=80=8BMerging the conditions is indeed cleaner. And I will change it to failure, if the conflicting options are given explicitly. Just a small patch adding "usage();" and removing "warning"...= =E2=80=8B Cheers, Jan --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --089e01538da08ed1e6052fe4c993 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable

=E2=80=8B=E2=80= =8B

On Thu, Apr 7, 2016 at 2:12 AM, Eri= c Sandeen=C2=A0<sandeen@sandeen.net>=C2=A0wrote:
On 3/24/16 6:15 AM,=C2=A0jtulak@redhat.com=C2=A0wrote:
> @@ -1262,10 +1358,11 @@ main(
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0switch (getsubopt(&p, (constpp)iopts, &value)) {
>=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0case I_ALIGN:
>=C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (!value || *value =3D=3D &#= 39;\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=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0value =3D "1";
> -=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0iaflag =3D atoi(value);=
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ia= flag < 0 || iaflag > 1)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0reqval('i', iop= ts, I_ALIGN);
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0c =3D atoi(value);
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0if (c < 0 || c > 1)
>=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0illega= l(value, "i align");
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0sb_feat.inode_align =3D c ? true : false;
>= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=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=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0case I_LOG:
>=C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (!value || *value = =3D=3D '\0')


Hm, this seems wrong, as well - per = the man page:

"If the value is omitted, 1 is assumed."
=
but this change with the reqval() removes that, doesn't it?=C2=A0 W= hy?
(it's fixed later, but there is no reason to break it mid-series= ...)
=E2=80=8B
Changed back to default 1. =E2= =80=8BAs for the origin of the change, most likely a copy&paste from so= me other place, where wasn't a default value, or it was there since I t= ook over the patchset.=C2=A0

On Thu, Ap= r 7, 2016 at 3:43 AM, Eric Sandeen <sandeen@sandeen.net> w= rote:
> @@ -981,11 +1077,21 @@ main(
>=C2=A0 =C2=A0 =C2=A0 =C2=A0int=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0worst_freelist;
>=C2=A0 =C2=A0 =C2=A0 =C2=A0libxfs_init_t=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0xi;
>=C2=A0 =C2=A0 =C2=A0 =C2=A0struct fs_topology=C2=A0 =C2=A0 =C2=A0 ft; > -=C2=A0 =C2=A0 =C2=A0int=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0lazy_sb_counters;
> -=C2=A0 =C2=A0 =C2=A0int=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0crcs_enabled;
> -=C2=A0 =C2=A0 =C2=A0int=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0finobt;
> -=C2=A0 =C2=A0 =C2=A0bool=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 finobtflag;
> -=C2=A0 =C2=A0 =C2=A0int=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0spinodes;
> +=C2=A0 =C2=A0 =C2=A0struct sb_feat_args=C2=A0 =C2=A0 =C2=A0sb_feat = =3D {
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0.finobt =3D 1,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0.finobtflag =3D false= ,


should we really have "finobtflag" in this structure?
This structure should only carry feature selections, not feature
specification flags I think.=C2=A0 Why is this the only such flag
in the structure?

Pretty sure finobtflag should stay a variable for now
just like lvflag (which goes with log_version).

=C2=A0
=E2=80=8BIt might be right to m= ove it out=E2=80=8B, but the flag is removed few patches later entirely. Is= it worth of the work? I would say nah, let it die where it is. :-)
=C2=A0
...

> @@ -1517,7 +1617,14 @@ main(
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0c =3D = atoi(value);
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (c = < 0 || c > 1)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0illegal(value, "m crc");
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0crcs_enabled= =3D c;
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (c &&= amp; nftype) {
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0fprintf(stderr,
> +_("cannot specify both crc and ftype\n"));
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0usage();

hm, why is conflict checking added?=C2=A0 It's not what the comm= it says
the patch does.

It also regresses the bug I fixed in

commit b990de8ba4e2df2bc76a140799d3ddb4a0eac4ce
Author: Eric Sandeen <sandeen@san= deen.net>
Date:=C2=A0 =C2=A0Tue Aug 18 17:53:17 2015 +1000

=C2=A0 =C2=A0 mkfs.xfs: fix ftype-vs-crc option combination testing

with this patch, it is broken again:

# mkfs/mkfs.xfs -m crc=3D0 -n ftype=3D1 -dfile,name=3Dfsfile,size=3D16g
<success>
=C2=A0# mkfs/mkfs.xfs -n ftype=3D1 -m crc=3D0 -dfile,name=3Dfsfile,size=3D1= 6g
cannot specify both crc and ftype
Usage: mkfs.xfs
...

=E2=80=8BBecause the patch= is much older than your fix, and at the time it was created, it is possibl= e that there wasn't any such check... I would call it the risk of necro= mancy. :-)=E2=80=8B

Anyway, I already fixed this issue= in this cycle, and added the the ftype, crc order into a test checking for= options sanity. Just I didn't submitted the change yet.
=
...

> @@ -1879,23 +1988,25 @@ _("32 bit Project IDs always enabled on C= RC enabled filesytems\n"));
>=C2=A0 =C2=A0 =C2=A0 =C2=A0} else {
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/*
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * The kernel do= esn't currently support crc=3D0,finobt=3D1
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * filesystems. If cr= cs are not enabled and the user has
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * explicitly turned = them off then silently turn them off
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * to avoid an unnece= ssary warning. If the user explicitly
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * tried to use crc= =3D0,finobt=3D1, then issue a warning before
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * turning them off.<= br> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * filesystems. If cr= cs are not enabled and the user has not
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * explicitly turned = finobt on, then silently turn it off to
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * avoid an unnecessa= ry warning. If the user explicitly tried
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * to use crc=3D0,fin= obt=3D1, then issue a warning before turning
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * them off.
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 */
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (finobt &&= finobtflag) {
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0fprintf(stderr,
> -_("warning: finobt not supported without CRC support, disabled.\= n"));
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (sb_feat.finobt){<= br> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0if (sb_feat.finobtflag) {
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr,
> +=C2=A0 =C2=A0 =C2=A0_("warning: finobt not supported without CRC= support, disabled.\n"));
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0}
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0sb_feat.finobt =3D 0;

like I mentioned, just this, I think (assuming we like the silent tu= rning
off, but that would be a different patch):
=C2=A0
=E2=80=8BMerging the conditions is indeed cleaner.

And I will change it to failure, if the conflicting options are given= explicitly. Just a small patch adding "usage();" and removing &q= uot;warning"...=E2=80=8B

Cheers,
Ja= n

--
--089e01538da08ed1e6052fe4c993-- From sandeen@sandeen.net Thu Apr 7 08:18:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 36B637CA0 for ; Thu, 7 Apr 2016 08:18:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id AF19330404E for ; Thu, 7 Apr 2016 06:18:22 -0700 (PDT) X-ASG-Debug-ID: 1460035098-04bdf011052dca40001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id VYu4DLhZWYO4Pt5Z for ; Thu, 07 Apr 2016 06:18:19 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id EF1C316C154; Thu, 7 Apr 2016 08:18:17 -0500 (CDT) Subject: Re: [PATCH 03/19] mkfs: Sanitise the superblock feature macros To: Jan Tulak X-ASG-Orig-Subj: Re: [PATCH 03/19] mkfs: Sanitise the superblock feature macros References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-4-git-send-email-jtulak@redhat.com> <5705BB39.5010003@sandeen.net> Cc: xfs-oss From: Eric Sandeen Message-ID: <57065E19.9070401@sandeen.net> Date: Thu, 7 Apr 2016 08:18:17 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1460035098 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28523 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 4/7/16 8:09 AM, Jan Tulak wrote: > ... > On Thu, Apr 7, 2016 at 3:43 AM, Eric Sandeen > wrote: > > > @@ -981,11 +1077,21 @@ main( > > int worst_freelist; > > libxfs_init_t xi; > > struct fs_topology ft; > > - int lazy_sb_counters; > > - int crcs_enabled; > > - int finobt; > > - bool finobtflag; > > - int spinodes; > > + struct sb_feat_args sb_feat = { > > + .finobt = 1, > > + .finobtflag = false, > > > should we really have "finobtflag" in this structure? > This structure should only carry feature selections, not feature > specification flags I think. Why is this the only such flag > in the structure? > > Pretty sure finobtflag should stay a variable for now > just like lvflag (which goes with log_version). > > > ​It might be right to move it out​, but the flag is removed few > patches later entirely. Is it worth of the work? I would say nah, let > it die where it is. :-) Given that it doesn't seem to be a bug, I guess that might be ok, but in general introducing incorrect things and fixing them later in the series is strongly discouraged... > > > ... > > > @@ -1517,7 +1617,14 @@ main( > > c = atoi(value); > > if (c < 0 || c > 1) > > illegal(value, "m crc"); > > - crcs_enabled = c; > > + if (c && nftype) { > > + fprintf(stderr, > > +_("cannot specify both crc and ftype\n")); > > + usage(); > > hm, why is conflict checking added? It's not what the commit says > the patch does. > > It also regresses the bug I fixed in > > commit b990de8ba4e2df2bc76a140799d3ddb4a0eac4ce > Author: Eric Sandeen > > Date: Tue Aug 18 17:53:17 2015 +1000 > > mkfs.xfs: fix ftype-vs-crc option combination testing > > with this patch, it is broken again: > > # mkfs/mkfs.xfs -m crc=0 -n ftype=1 -dfile,name=fsfile,size=16g > > # mkfs/mkfs.xfs -n ftype=1 -m crc=0 -dfile,name=fsfile,size=16g > cannot specify both crc and ftype > Usage: mkfs.xfs > ... > > ​Because the patch is much older than your fix, and at the time it > was created, it is possible that there wasn't any such check... I > would call it the risk of necromancy. :-)​ Most likely a forward-port or merge error I think. > Anyway, I already fixed this issue in this cycle, and added the the > ftype, crc order into a test checking for options sanity. Just I > didn't submitted the change yet. Ok, so it is fixed in your new version of this patch? > > ... > > > @@ -1879,23 +1988,25 @@ _("32 bit Project IDs always enabled on CRC enabled filesytems\n")); > > } else { > > /* > > * The kernel doesn't currently support crc=0,finobt=1 > > - * filesystems. If crcs are not enabled and the user has > > - * explicitly turned them off then silently turn them off > > - * to avoid an unnecessary warning. If the user explicitly > > - * tried to use crc=0,finobt=1, then issue a warning before > > - * turning them off. > > + * filesystems. If crcs are not enabled and the user has not > > + * explicitly turned finobt on, then silently turn it off to > > + * avoid an unnecessary warning. If the user explicitly tried > > + * to use crc=0,finobt=1, then issue a warning before turning > > + * them off. > > */ > > - if (finobt && finobtflag) { > > - fprintf(stderr, > > -_("warning: finobt not supported without CRC support, disabled.\n")); > > + if (sb_feat.finobt){ > > + if (sb_feat.finobtflag) { > > + fprintf(stderr, > > + _("warning: finobt not supported without CRC support, disabled.\n")); > > + } > > + sb_feat.finobt = 0; > > like I mentioned, just this, I think (assuming we like the silent turning > off, but that would be a different patch): > > > ​Merging the conditions is indeed cleaner. > > And I will change it to failure, if the conflicting options are given > explicitly. Just a small patch adding "usage();" and removing > "warning"...​ Ok, so for this patch, nothing but the mechanical change matching all the others, right? If there is any change in behavior to be done, that should be a different patch. -Eric From jtulak@redhat.com Thu Apr 7 08:27:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 361BA7CA0 for ; Thu, 7 Apr 2016 08:27:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id CE8A530404E for ; Thu, 7 Apr 2016 06:27:28 -0700 (PDT) X-ASG-Debug-ID: 1460035645-04bdf011022dd180001-NocioJ Received: from mail-ig0-f180.google.com (mail-ig0-f180.google.com [209.85.213.180]) by cuda.sgi.com with ESMTP id slEfjRQn2qAdjG8L (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 07 Apr 2016 06:27:26 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.180 Received: by mail-ig0-f180.google.com with SMTP id gy3so13284819igb.1 for ; Thu, 07 Apr 2016 06:27:26 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=7UAMXFCaz9q7y0Zehpph73mwwc+T4mm9z2oI+AH1AdE=; b=lH4uxaao0zhEoYCq3URW9pPl8usC65eZSspkXDo5aTl4AXwmaNP9wISBH2zEvKq6jf 2p2D8DSmPMqpWEgOG/Z/SkMTjYhXORWGuUldNueUs58fFY5r8HBNqdLgmnLcPP7iIFMs cPbaOmcXV5fOSWIZ4jKBAU+yt7hFbda3YRAxOrFNoivZhK/WJ2dQeZtRlt40kUa11sIJ Z0lMVRYQJb5DCGfAfMsCzeX9oGIvpTnC/MLIp1bdeIEsb1kPg/T08/CH06OLNlQMEXeS V9mVlRrsQKk5FE8eB577aD14df7Q/6H8136A3WqQYN1yh2xA6K/QiVDe7kYowlnGWxF5 tmjw== X-Gm-Message-State: AD7BkJIzAl80ryBr8z/UO91wz38rANQ5p9dY/Xbe91mmbQlnuRNItAG8T/eEQv2K8XhbJkuImNgdILmLs3bJ9+YS X-Received: by 10.50.28.19 with SMTP id x19mr3425715igg.19.1460035645628; Thu, 07 Apr 2016 06:27:25 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.79 with HTTP; Thu, 7 Apr 2016 06:27:06 -0700 (PDT) In-Reply-To: <57065E19.9070401@sandeen.net> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-4-git-send-email-jtulak@redhat.com> <5705BB39.5010003@sandeen.net> <57065E19.9070401@sandeen.net> From: Jan Tulak Date: Thu, 7 Apr 2016 15:27:06 +0200 Message-ID: Subject: Re: [PATCH 03/19] mkfs: Sanitise the superblock feature macros To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH 03/19] mkfs: Sanitise the superblock feature macros Cc: xfs-oss Content-Type: multipart/alternative; boundary=089e01538da0048bf5052fe50a4d X-Barracuda-Connect: mail-ig0-f180.google.com[209.85.213.180] X-Barracuda-Start-Time: 1460035646 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28523 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 --089e01538da0048bf5052fe50a4d Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Thu, Apr 7, 2016 at 3:18 PM, Eric Sandeen wrote: > On 4/7/16 8:09 AM, Jan Tulak wrote: > > > ... > > > On Thu, Apr 7, 2016 at 3:43 AM, Eric Sandeen > wrote: > > > > > @@ -981,11 +1077,21 @@ main( > > > int worst_freelist; > > > libxfs_init_t xi; > > > struct fs_topology ft; > > > - int lazy_sb_counters; > > > - int crcs_enabled; > > > - int finobt; > > > - bool finobtflag; > > > - int spinodes; > > > + struct sb_feat_args sb_feat =3D { > > > + .finobt =3D 1, > > > + .finobtflag =3D false, > > > > > > should we really have "finobtflag" in this structure? > > This structure should only carry feature selections, not feature > > specification flags I think. Why is this the only such flag > > in the structure? > > > > Pretty sure finobtflag should stay a variable for now > > just like lvflag (which goes with log_version). > > > > > > =E2=80=8BIt might be right to move it out=E2=80=8B, but the flag is rem= oved few > > patches later entirely. Is it worth of the work? I would say nah, let > > it die where it is. :-) > > Given that it doesn't seem to be a bug, I guess that might be ok, > but in general introducing incorrect things and fixing them later > in the series is strongly discouraged... > > > > > > > ... > > > > > @@ -1517,7 +1617,14 @@ main( > > > c =3D atoi(value); > > > if (c < 0 || c > 1) > > > illegal(value, "m > crc"); > > > - crcs_enabled =3D c; > > > + if (c && nftype) { > > > + fprintf(stderr, > > > +_("cannot specify both crc and ftype\n")); > > > + usage(); > > > > hm, why is conflict checking added? It's not what the commit says > > the patch does. > > > > It also regresses the bug I fixed in > > > > commit b990de8ba4e2df2bc76a140799d3ddb4a0eac4ce > > Author: Eric Sandeen sandeen@sandeen.net>> > > Date: Tue Aug 18 17:53:17 2015 +1000 > > > > mkfs.xfs: fix ftype-vs-crc option combination testing > > > > with this patch, it is broken again: > > > > # mkfs/mkfs.xfs -m crc=3D0 -n ftype=3D1 -dfile,name=3Dfsfile,size= =3D16g > > > > # mkfs/mkfs.xfs -n ftype=3D1 -m crc=3D0 -dfile,name=3Dfsfile,size= =3D16g > > cannot specify both crc and ftype > > Usage: mkfs.xfs > > ... > > > > =E2=80=8BBecause the patch is much older than your fix, and at the time= it > > was created, it is possible that there wasn't any such check... I > > would call it the risk of necromancy. :-)=E2=80=8B > > Most likely a forward-port or merge error I think. > > > Anyway, I already fixed this issue in this cycle, and added the the > > ftype, crc order into a test checking for options sanity. Just I > > didn't submitted the change yet. > > Ok, so it is fixed in your new version of this patch? > =E2=80=8BYes. =E2=80=8B > > > > > ... > > > > > @@ -1879,23 +1988,25 @@ _("32 bit Project IDs always enabled on > CRC enabled filesytems\n")); > > > } else { > > > /* > > > * The kernel doesn't currently support > crc=3D0,finobt=3D1 > > > - * filesystems. If crcs are not enabled and the use= r > has > > > - * explicitly turned them off then silently turn > them off > > > - * to avoid an unnecessary warning. If the user > explicitly > > > - * tried to use crc=3D0,finobt=3D1, then issue a wa= rning > before > > > - * turning them off. > > > + * filesystems. If crcs are not enabled and the use= r > has not > > > + * explicitly turned finobt on, then silently turn > it off to > > > + * avoid an unnecessary warning. If the user > explicitly tried > > > + * to use crc=3D0,finobt=3D1, then issue a warning > before turning > > > + * them off. > > > */ > > > - if (finobt && finobtflag) { > > > - fprintf(stderr, > > > -_("warning: finobt not supported without CRC support, > disabled.\n")); > > > + if (sb_feat.finobt){ > > > + if (sb_feat.finobtflag) { > > > + fprintf(stderr, > > > + _("warning: finobt not supported without CRC support, > disabled.\n")); > > > + } > > > + sb_feat.finobt =3D 0; > > > > like I mentioned, just this, I think (assuming we like the silent > turning > > off, but that would be a different patch): > > > > > > =E2=80=8BMerging the conditions is indeed cleaner. > > > > And I will change it to failure, if the conflicting options are given > > explicitly. Just a small patch adding "usage();" and removing > > "warning"...=E2=80=8B > > Ok, so for this patch, nothing but the mechanical change matching all the > others, > right? If there is any change in behavior to be done, that should be a > different patch. > =E2=80=8BExactly. =E2=80=8B > > -Eric > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --089e01538da0048bf5052fe50a4d Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
On Thu, Ap= r 7, 2016 at 3:18 PM, Eric Sandeen <sandeen@sandeen.net> wrote:
On 4/7/16 8:09 AM, Jan Tu= lak wrote:
>
...

> On Thu, Apr 7, 2016 at 3:43 AM, Eric Sandeen <sandeen@sandeen.net <mailto:sandeen@sandeen.net>> wrote:
>
>=C2=A0 =C2=A0 =C2=A0> @@ -981,11 +1077,21 @@ main(
>=C2=A0 =C2=A0 =C2=A0>=C2=A0 =C2=A0 =C2=A0 =C2=A0int=C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0worst_freelist;<= br> >=C2=A0 =C2=A0 =C2=A0>=C2=A0 =C2=A0 =C2=A0 =C2=A0libxfs_init_t=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0xi;
>=C2=A0 =C2=A0 =C2=A0>=C2=A0 =C2=A0 =C2=A0 =C2=A0struct fs_topology= =C2=A0 =C2=A0 =C2=A0 ft;
>=C2=A0 =C2=A0 =C2=A0> -=C2=A0 =C2=A0 =C2=A0int=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0lazy_sb_counters; >=C2=A0 =C2=A0 =C2=A0> -=C2=A0 =C2=A0 =C2=A0int=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0crcs_enabled;
>=C2=A0 =C2=A0 =C2=A0> -=C2=A0 =C2=A0 =C2=A0int=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0finobt;
>=C2=A0 =C2=A0 =C2=A0> -=C2=A0 =C2=A0 =C2=A0bool=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 finobtflag;
>=C2=A0 =C2=A0 =C2=A0> -=C2=A0 =C2=A0 =C2=A0int=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0spinodes;
>=C2=A0 =C2=A0 =C2=A0> +=C2=A0 =C2=A0 =C2=A0struct sb_feat_args=C2=A0= =C2=A0 =C2=A0sb_feat =3D {
>=C2=A0 =C2=A0 =C2=A0> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0.finobt =3D 1,
>=C2=A0 =C2=A0 =C2=A0> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0.finobtflag =3D false,
>
>
>=C2=A0 =C2=A0 =C2=A0should we really have "finobtflag" in thi= s structure?
>=C2=A0 =C2=A0 =C2=A0This structure should only carry feature selections= , not feature
>=C2=A0 =C2=A0 =C2=A0specification flags I think.=C2=A0 Why is this the = only such flag
>=C2=A0 =C2=A0 =C2=A0in the structure?
>
>=C2=A0 =C2=A0 =C2=A0Pretty sure finobtflag should stay a variable for n= ow
>=C2=A0 =C2=A0 =C2=A0just like lvflag (which goes with log_version).
>
>
> =E2=80=8BIt might be right to move it out=E2=80=8B, but the flag is re= moved few
> patches later entirely. Is it worth of the work? I would say nah, let<= br> > it die where it is. :-)

Given that it doesn't seem to be a bug, I guess that might be ok= ,
but in general introducing incorrect things and fixing them later
in the series is strongly discouraged...

>
>
>=C2=A0 =C2=A0 =C2=A0...
>
>=C2=A0 =C2=A0 =C2=A0> @@ -1517,7 +1617,14 @@ main(
>=C2=A0 =C2=A0 =C2=A0>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0c =3D atoi(value);
>=C2=A0 =C2=A0 =C2=A0>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0if (c < 0 || c > 1)
>=C2=A0 =C2=A0 =C2=A0>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0illegal(value, "m crc&= quot;);
>=C2=A0 =C2=A0 =C2=A0> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0crcs_enabled =3D c;
>=C2=A0 =C2=A0 =C2=A0> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0if (c && nftype) {
>=C2=A0 =C2=A0 =C2=A0> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr,
>=C2=A0 =C2=A0 =C2=A0> +_("cannot specify both crc and ftype\n&q= uot;));
>=C2=A0 =C2=A0 =C2=A0> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0usage();
>
>=C2=A0 =C2=A0 =C2=A0hm, why is conflict checking added?=C2=A0 It's = not what the commit says
>=C2=A0 =C2=A0 =C2=A0the patch does.
>
>=C2=A0 =C2=A0 =C2=A0It also regresses the bug I fixed in
>
>=C2=A0 =C2=A0 =C2=A0commit b990de8ba4e2df2bc76a140799d3ddb4a0eac4ce
>=C2=A0 =C2=A0 =C2=A0Author: Eric Sandeen <sandeen@sandeen.net <mailto:sandeen@sandeen.net>>
>=C2=A0 =C2=A0 =C2=A0Date:=C2=A0 =C2=A0Tue Aug 18 17:53= :17 2015 +1000
>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0mkfs.xfs: fix ftype-vs-crc option com= bination testing
>
>=C2=A0 =C2=A0 =C2=A0with this patch, it is broken again:
>
>=C2=A0 =C2=A0 =C2=A0# mkfs/mkfs.xfs -m crc=3D0 -n ftype=3D1 -dfile,name= =3Dfsfile,size=3D16g
>=C2=A0 =C2=A0 =C2=A0<success>
>=C2=A0 =C2=A0 =C2=A0 # mkfs/mkfs.xfs -n ftype=3D1 -m crc=3D0 -dfile,nam= e=3Dfsfile,size=3D16g
>=C2=A0 =C2=A0 =C2=A0cannot specify both crc and ftype
>=C2=A0 =C2=A0 =C2=A0Usage: mkfs.xfs
>=C2=A0 =C2=A0 =C2=A0...
>
> =E2=80=8BBecause the patch is much older than your fix, and at the tim= e it
> was created, it is possible that there wasn't any such check... I<= br> > would call it the risk of necromancy. :-)=E2=80=8B

Most likely a forward-port or merge error I think.

> Anyway, I already fixed this issue in this cycle, and added the the > ftype, crc order into a test checking for options sanity. Just I
> didn't submitted the change yet.

Ok, so it is fixed in your new version of this patch?

=E2=80=8BYes.
=E2=80=8B
=C2=A0

>
>=C2=A0 =C2=A0 =C2=A0...
>
>=C2=A0 =C2=A0 =C2=A0> @@ -1879,23 +1988,25 @@ _("32 bit Project= IDs always enabled on CRC enabled filesytems\n"));
>=C2=A0 =C2=A0 =C2=A0>=C2=A0 =C2=A0 =C2=A0 =C2=A0} else {
>=C2=A0 =C2=A0 =C2=A0>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0/*
>=C2=A0 =C2=A0 =C2=A0>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 * The kernel doesn't currently support crc=3D0,finobt=3D1 >=C2=A0 =C2=A0 =C2=A0> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 * filesystems. If crcs are not enabled and the user has
>=C2=A0 =C2=A0 =C2=A0> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 * explicitly turned them off then silently turn them off
>=C2=A0 =C2=A0 =C2=A0> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 * to avoid an unnecessary warning. If the user explicitly
>=C2=A0 =C2=A0 =C2=A0> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 * tried to use crc=3D0,finobt=3D1, then issue a warning before
>=C2=A0 =C2=A0 =C2=A0> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 * turning them off.
>=C2=A0 =C2=A0 =C2=A0> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 * filesystems. If crcs are not enabled and the user has not
>=C2=A0 =C2=A0 =C2=A0> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 * explicitly turned finobt on, then silently turn it off to
>=C2=A0 =C2=A0 =C2=A0> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 * avoid an unnecessary warning. If the user explicitly tried
>=C2=A0 =C2=A0 =C2=A0> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 * to use crc=3D0,finobt=3D1, then issue a warning before turning
>=C2=A0 =C2=A0 =C2=A0> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 * them off.
>=C2=A0 =C2=A0 =C2=A0>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 */
>=C2=A0 =C2=A0 =C2=A0> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0if (finobt && finobtflag) {
>=C2=A0 =C2=A0 =C2=A0> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr,
>=C2=A0 =C2=A0 =C2=A0> -_("warning: finobt not supported without= CRC support, disabled.\n"));
>=C2=A0 =C2=A0 =C2=A0> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0if (sb_feat.finobt){
>=C2=A0 =C2=A0 =C2=A0> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (sb_feat.finobtflag) {
>=C2=A0 =C2=A0 =C2=A0> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr,<= br> >=C2=A0 =C2=A0 =C2=A0> +=C2=A0 =C2=A0 =C2=A0_("warning: finobt n= ot supported without CRC support, disabled.\n"));
>=C2=A0 =C2=A0 =C2=A0> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>=C2=A0 =C2=A0 =C2=A0> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0sb_feat.finobt =3D 0;
>
>=C2=A0 =C2=A0 =C2=A0like I mentioned, just this, I think (assuming we l= ike the silent turning
>=C2=A0 =C2=A0 =C2=A0off, but that would be a different patch):
>
>
> =E2=80=8BMerging the conditions is indeed cleaner.
>
> And I will change it to failure, if the conflicting options are given<= br> > explicitly. Just a small patch adding "usage();" and removin= g
> "warning"...=E2=80=8B

Ok, so for this patch, nothing but the mechanical change matchi= ng all the others,
right?=C2=A0 If there is any change in behavior to be done, that should be = a different patch.

= =E2=80=8BExactly.
=E2=80=8B
=C2=A0

-Eric

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



--
=
--089e01538da0048bf5052fe50a4d-- From sandeen@redhat.com Thu Apr 7 08:35:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 81E687CA0 for ; Thu, 7 Apr 2016 08:35:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3594730405F for ; Thu, 7 Apr 2016 06:35:35 -0700 (PDT) X-ASG-Debug-ID: 1460036132-04cb6c2460314ef0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id kItVFsCrpJGcJry9 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 07 Apr 2016 06:35:33 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 58C623B754 for ; Thu, 7 Apr 2016 13:35:32 +0000 (UTC) Received: from Liberator.local (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u37DZTcP026772 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 7 Apr 2016 09:35:31 -0400 Subject: Re: [PATCH v2] xfs_quota: print quota id number if the name can't be found To: Zorro Lang , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH v2] xfs_quota: print quota id number if the name can't be found References: <1460002331-18278-1-git-send-email-zlang@redhat.com> From: Eric Sandeen Message-ID: <57066221.3080003@redhat.com> Date: Thu, 7 Apr 2016 08:35:29 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.1 MIME-Version: 1.0 In-Reply-To: <1460002331-18278-1-git-send-email-zlang@redhat.com> Content-Type: text/plain; charset=windows-1252 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: 1460036133 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 4/6/16 11:12 PM, Zorro Lang wrote: > When use GETNEXTQUOTA ioctl to report project quota, it always > report an unexpected quota: > > (null) 0 0 0 00 [--------] > > The ID 0 store the default quota, even if no one set default quota, > it still have quota accounting, but not enforced. So GETNEXTQUOTA > can find and report this undefined quota. > > From this problem, I thought if others' quota name miss, (null) will > be printed too. e.g. > > # xfs_quota -xc "limit -u bsoft=300m bhard=400m test" $mnt > # xfs_quota -xc "report -u" $mnt > User ID Used Soft Hard Warn/Grace > ---------- -------------------------------------------------- > root 0 0 0 00 [--------] > test 0 307200 409600 00 [--------] > # userdel -r test > # xfs_quota -xc "report -u" $mnt > User ID Used Soft Hard Warn/Grace > ---------- -------------------------------------------------- > root 0 0 0 00 [--------] > (null) 0 307200 409600 00 [--------] > > So this problem same with above id 0's problem. For deal with this, > this patch will print id number if the name can't be found. > > But if use old GETQUOTA ioctl, it won't print project id 0 quota > information(if it's not defined). That's different with GETNEXTQUOTA. > For keep consistent, this patch also print project id 0 when use old > GETQUOTA. thanks Zorro, tiny little manpage nitpick below. Rest assured that your English is still much better than my Chinese. :) > Signed-off-by: Zorro Lang > --- > > Hi, > > This V2 patch has below change: > 1. Add some comments > 2. Change the xfs_quota man page > 3. For alignment, change "#%-10u" to "#%-9u" when print ID or name > mixed. > > For reduce the impact on xfstests, I didn't change the original > "#%-10u" when use "report -n": > > if (flags & NO_LOOKUP_FLAG) { > fprintf(fp, "#%-10u", d.d_id); > > And didn't change "%-10s" when print quota name: > > fprintf(fp, "%-10s", name); > > Thanks, > Zorro > > man/man8/xfs_quota.8 | 7 +++++-- > quota/report.c | 16 +++++++++++++++- > 2 files changed, 20 insertions(+), 3 deletions(-) > > diff --git a/man/man8/xfs_quota.8 b/man/man8/xfs_quota.8 > index 951252b..dc01804 100644 > --- a/man/man8/xfs_quota.8 > +++ b/man/man8/xfs_quota.8 > @@ -357,9 +357,12 @@ option outputs the report to > .I file > instead of stdout. The > .B \-a > -option reports on all filesystems. The > +option reports on all filesystems. As default, outputs the name of > +the user/group/project. But if no name is defined, outputs the > +numberic ID. The "numeric" - Maybe: "option reports on all filesystems. By default, outputs the name of the user/group/project. If no name is defined for a given ID, outputs the numeric ID instead. The" > .B \-n > -option outputs the numeric ID instead of the name. The > +option outputs the numeric ID instead of the name, even the name is > +defined. The Probably no need for this change; the number always exists, so just "The option outputs the numeric ID instead of the name." is enough. Thanks, -Eric > .B \-L > and > .B \-U > diff --git a/quota/report.c b/quota/report.c > index 48a3f29..cc422d1 100644 > --- a/quota/report.c > +++ b/quota/report.c > @@ -389,7 +389,11 @@ report_mount( > name = p->pr_name; > } > } > - fprintf(fp, "%-10s", name); > + /* If no name is found, print the id #num instead of (null) */ > + if (name != NULL) > + fprintf(fp, "%-10s", name); > + else > + fprintf(fp, "#%-9u", d.d_id); > } > > if (form & XFS_BLOCK_QUOTA) { > @@ -571,6 +575,16 @@ report_project_mount( > id = oid + 1; > } > } else { > + if (!getprprid(0)) { > + /* > + * Print default project quota, even if projid 0 > + * isn't defined > + */ > + report_mount(fp, 0, NULL, NULL, form, XFS_PROJ_QUOTA, > + mount, flags); > + flags |= NO_HEADER_FLAG; > + } > + > setprent(); > while ((p = getprent()) != NULL) { > if (report_mount(fp, p->pr_prid, p->pr_name, NULL, > From zlang@redhat.com Thu Apr 7 09:10:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 51E2D7CA0 for ; Thu, 7 Apr 2016 09:10:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 078398F8039 for ; Thu, 7 Apr 2016 07:09:57 -0700 (PDT) X-ASG-Debug-ID: 1460038196-04bdf011022dfc30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GpmoWUwz8By363Uk (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 07 Apr 2016 07:09:56 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 68E43C05681A for ; Thu, 7 Apr 2016 14:09:56 +0000 (UTC) Received: from localhost (vpn1-7-227.pek2.redhat.com [10.72.7.227]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u37E9tsZ022123; Thu, 7 Apr 2016 10:09:55 -0400 Date: Thu, 7 Apr 2016 22:09:54 +0800 From: Zorro Lang To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2] xfs_quota: print quota id number if the name can't be found Message-ID: <20160407140954.GA6471@dhcp12-237.nay.redhat.com> X-ASG-Orig-Subj: Re: [PATCH v2] xfs_quota: print quota id number if the name can't be found References: <1460002331-18278-1-git-send-email-zlang@redhat.com> <57066221.3080003@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <57066221.3080003@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460038196 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Apr 07, 2016 at 08:35:29AM -0500, Eric Sandeen wrote: > On 4/6/16 11:12 PM, Zorro Lang wrote: > > When use GETNEXTQUOTA ioctl to report project quota, it always > > report an unexpected quota: > > > > (null) 0 0 0 00 [--------] > > > > The ID 0 store the default quota, even if no one set default quota, > > it still have quota accounting, but not enforced. So GETNEXTQUOTA > > can find and report this undefined quota. > > > > From this problem, I thought if others' quota name miss, (null) will > > be printed too. e.g. > > > > # xfs_quota -xc "limit -u bsoft=300m bhard=400m test" $mnt > > # xfs_quota -xc "report -u" $mnt > > User ID Used Soft Hard Warn/Grace > > ---------- -------------------------------------------------- > > root 0 0 0 00 [--------] > > test 0 307200 409600 00 [--------] > > # userdel -r test > > # xfs_quota -xc "report -u" $mnt > > User ID Used Soft Hard Warn/Grace > > ---------- -------------------------------------------------- > > root 0 0 0 00 [--------] > > (null) 0 307200 409600 00 [--------] > > > > So this problem same with above id 0's problem. For deal with this, > > this patch will print id number if the name can't be found. > > > > But if use old GETQUOTA ioctl, it won't print project id 0 quota > > information(if it's not defined). That's different with GETNEXTQUOTA. > > For keep consistent, this patch also print project id 0 when use old > > GETQUOTA. > > thanks Zorro, tiny little manpage nitpick below. Rest assured that > your English is still much better than my Chinese. :) Thanks Eric. Sorry for my English problem, it still looks like Chinglish :-P . I'm trying to improve my English :) I will send V3 patch to fix these problems soon. Thanks, Zorro > > > Signed-off-by: Zorro Lang > > --- > > > > Hi, > > > > This V2 patch has below change: > > 1. Add some comments > > 2. Change the xfs_quota man page > > 3. For alignment, change "#%-10u" to "#%-9u" when print ID or name > > mixed. > > > > For reduce the impact on xfstests, I didn't change the original > > "#%-10u" when use "report -n": > > > > if (flags & NO_LOOKUP_FLAG) { > > fprintf(fp, "#%-10u", d.d_id); > > > > And didn't change "%-10s" when print quota name: > > > > fprintf(fp, "%-10s", name); > > > > Thanks, > > Zorro > > > > man/man8/xfs_quota.8 | 7 +++++-- > > quota/report.c | 16 +++++++++++++++- > > 2 files changed, 20 insertions(+), 3 deletions(-) > > > > diff --git a/man/man8/xfs_quota.8 b/man/man8/xfs_quota.8 > > index 951252b..dc01804 100644 > > --- a/man/man8/xfs_quota.8 > > +++ b/man/man8/xfs_quota.8 > > @@ -357,9 +357,12 @@ option outputs the report to > > .I file > > instead of stdout. The > > .B \-a > > -option reports on all filesystems. The > > +option reports on all filesystems. As default, outputs the name of > > +the user/group/project. But if no name is defined, outputs the > > +numberic ID. The > > "numeric" - > > Maybe: > > "option reports on all filesystems. By default, outputs the name of > the user/group/project. If no name is defined for a given ID, outputs > the numeric ID instead. The" > > > .B \-n > > -option outputs the numeric ID instead of the name. The > > +option outputs the numeric ID instead of the name, even the name is > > +defined. The > > Probably no need for this change; the number always exists, so just > "The option outputs the numeric ID instead of the name." is enough. > > Thanks, > -Eric > > > .B \-L > > and > > .B \-U > > diff --git a/quota/report.c b/quota/report.c > > index 48a3f29..cc422d1 100644 > > --- a/quota/report.c > > +++ b/quota/report.c > > @@ -389,7 +389,11 @@ report_mount( > > name = p->pr_name; > > } > > } > > - fprintf(fp, "%-10s", name); > > + /* If no name is found, print the id #num instead of (null) */ > > + if (name != NULL) > > + fprintf(fp, "%-10s", name); > > + else > > + fprintf(fp, "#%-9u", d.d_id); > > } > > > > if (form & XFS_BLOCK_QUOTA) { > > @@ -571,6 +575,16 @@ report_project_mount( > > id = oid + 1; > > } > > } else { > > + if (!getprprid(0)) { > > + /* > > + * Print default project quota, even if projid 0 > > + * isn't defined > > + */ > > + report_mount(fp, 0, NULL, NULL, form, XFS_PROJ_QUOTA, > > + mount, flags); > > + flags |= NO_HEADER_FLAG; > > + } > > + > > setprent(); > > while ((p = getprent()) != NULL) { > > if (report_mount(fp, p->pr_prid, p->pr_name, NULL, > > > From zlang@redhat.com Thu Apr 7 09:48:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 800307CA0 for ; Thu, 7 Apr 2016 09:48:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E931BAC006 for ; Thu, 7 Apr 2016 07:48:38 -0700 (PDT) X-ASG-Debug-ID: 1460040516-04cb6c246431ae10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DL5DzuFSU1rk41Bv (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 07 Apr 2016 07:48:37 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CFBA2155BA for ; Thu, 7 Apr 2016 14:48:36 +0000 (UTC) Received: from localhost (vpn1-7-227.pek2.redhat.com [10.72.7.227]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u37EmZZa031786; Thu, 7 Apr 2016 10:48:36 -0400 From: Zorro Lang To: xfs@oss.sgi.com Cc: sandeen@redhat.com, Zorro Lang Subject: [PATCH v3] xfs_quota: print quota id number if the name can't be found Date: Thu, 7 Apr 2016 22:48:34 +0800 X-ASG-Orig-Subj: [PATCH v3] xfs_quota: print quota id number if the name can't be found Message-Id: <1460040514-23834-1-git-send-email-zlang@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460040517 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 When use GETNEXTQUOTA ioctl to report project quota, it always report an unexpected quota: (null) 0 0 0 00 [--------] The ID 0 store the default quota, even if no one set default quota, it still have quota accounting, but not enforced. So GETNEXTQUOTA can find and report this undefined quota. >From this problem, I thought if others' quota name miss, (null) will be printed too. e.g. # xfs_quota -xc "limit -u bsoft=300m bhard=400m test" $mnt # xfs_quota -xc "report -u" $mnt User ID Used Soft Hard Warn/Grace ---------- -------------------------------------------------- root 0 0 0 00 [--------] test 0 307200 409600 00 [--------] # userdel -r test # xfs_quota -xc "report -u" $mnt User ID Used Soft Hard Warn/Grace ---------- -------------------------------------------------- root 0 0 0 00 [--------] (null) 0 307200 409600 00 [--------] So this problem same with above id 0's problem. For deal with this, this patch will print id number if the name can't be found. But if use old GETQUOTA ioctl, it won't print project id 0 quota information(if it's not defined). That's different with GETNEXTQUOTA. For keep consistent, this patch also print project id 0 when use old GETQUOTA. Signed-off-by: Zorro Lang --- Hi, This V3 patch fix some man page problems. Thanks for Eric specified my English syntax problems. Thanks, Zorro man/man8/xfs_quota.8 | 4 +++- quota/report.c | 16 +++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/man/man8/xfs_quota.8 b/man/man8/xfs_quota.8 index 951252b..a14568b 100644 --- a/man/man8/xfs_quota.8 +++ b/man/man8/xfs_quota.8 @@ -357,7 +357,9 @@ option outputs the report to .I file instead of stdout. The .B \-a -option reports on all filesystems. The +option reports on all filesystems. By default, outputs the name of +the user/group/project. If no name is defined for a given ID, outputs +the numeric ID instead. The .B \-n option outputs the numeric ID instead of the name. The .B \-L diff --git a/quota/report.c b/quota/report.c index 48a3f29..cc422d1 100644 --- a/quota/report.c +++ b/quota/report.c @@ -389,7 +389,11 @@ report_mount( name = p->pr_name; } } - fprintf(fp, "%-10s", name); + /* If no name is found, print the id #num instead of (null) */ + if (name != NULL) + fprintf(fp, "%-10s", name); + else + fprintf(fp, "#%-9u", d.d_id); } if (form & XFS_BLOCK_QUOTA) { @@ -571,6 +575,16 @@ report_project_mount( id = oid + 1; } } else { + if (!getprprid(0)) { + /* + * Print default project quota, even if projid 0 + * isn't defined + */ + report_mount(fp, 0, NULL, NULL, form, XFS_PROJ_QUOTA, + mount, flags); + flags |= NO_HEADER_FLAG; + } + setprent(); while ((p = getprent()) != NULL) { if (report_mount(fp, p->pr_prid, p->pr_name, NULL, -- 2.5.5 From sandeen@sandeen.net Thu Apr 7 09:51:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EEA867CA0 for ; Thu, 7 Apr 2016 09:51:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7F637AC007 for ; Thu, 7 Apr 2016 07:51:39 -0700 (PDT) X-ASG-Debug-ID: 1460040695-04bdf011032e1ec0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id LFrKrbxPEH3cNRR9 for ; Thu, 07 Apr 2016 07:51:36 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 94B2116C152 for ; Thu, 7 Apr 2016 09:51:35 -0500 (CDT) Subject: Re: [PATCH v3] xfs_quota: print quota id number if the name can't be found To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH v3] xfs_quota: print quota id number if the name can't be found References: <1460040514-23834-1-git-send-email-zlang@redhat.com> From: Eric Sandeen Message-ID: <570673F7.3040107@sandeen.net> Date: Thu, 7 Apr 2016 09:51:35 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.1 MIME-Version: 1.0 In-Reply-To: <1460040514-23834-1-git-send-email-zlang@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1460040695 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28525 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/7/16 9:48 AM, Zorro Lang wrote: > When use GETNEXTQUOTA ioctl to report project quota, it always > report an unexpected quota: > > (null) 0 0 0 00 [--------] > > The ID 0 store the default quota, even if no one set default quota, > it still have quota accounting, but not enforced. So GETNEXTQUOTA > can find and report this undefined quota. > > From this problem, I thought if others' quota name miss, (null) will > be printed too. e.g. > > # xfs_quota -xc "limit -u bsoft=300m bhard=400m test" $mnt > # xfs_quota -xc "report -u" $mnt > User ID Used Soft Hard Warn/Grace > ---------- -------------------------------------------------- > root 0 0 0 00 [--------] > test 0 307200 409600 00 [--------] > # userdel -r test > # xfs_quota -xc "report -u" $mnt > User ID Used Soft Hard Warn/Grace > ---------- -------------------------------------------------- > root 0 0 0 00 [--------] > (null) 0 307200 409600 00 [--------] > > So this problem same with above id 0's problem. For deal with this, > this patch will print id number if the name can't be found. > > But if use old GETQUOTA ioctl, it won't print project id 0 quota > information(if it's not defined). That's different with GETNEXTQUOTA. > For keep consistent, this patch also print project id 0 when use old > GETQUOTA. > > Signed-off-by: Zorro Lang Looks good to me, thanks Zorro! Reviewed-by: Eric Sandeen > --- > > Hi, > > This V3 patch fix some man page problems. Thanks for Eric specified my > English syntax problems. > > Thanks, > Zorro > > man/man8/xfs_quota.8 | 4 +++- > quota/report.c | 16 +++++++++++++++- > 2 files changed, 18 insertions(+), 2 deletions(-) > > diff --git a/man/man8/xfs_quota.8 b/man/man8/xfs_quota.8 > index 951252b..a14568b 100644 > --- a/man/man8/xfs_quota.8 > +++ b/man/man8/xfs_quota.8 > @@ -357,7 +357,9 @@ option outputs the report to > .I file > instead of stdout. The > .B \-a > -option reports on all filesystems. The > +option reports on all filesystems. By default, outputs the name of > +the user/group/project. If no name is defined for a given ID, outputs > +the numeric ID instead. The > .B \-n > option outputs the numeric ID instead of the name. The > .B \-L > diff --git a/quota/report.c b/quota/report.c > index 48a3f29..cc422d1 100644 > --- a/quota/report.c > +++ b/quota/report.c > @@ -389,7 +389,11 @@ report_mount( > name = p->pr_name; > } > } > - fprintf(fp, "%-10s", name); > + /* If no name is found, print the id #num instead of (null) */ > + if (name != NULL) > + fprintf(fp, "%-10s", name); > + else > + fprintf(fp, "#%-9u", d.d_id); > } > > if (form & XFS_BLOCK_QUOTA) { > @@ -571,6 +575,16 @@ report_project_mount( > id = oid + 1; > } > } else { > + if (!getprprid(0)) { > + /* > + * Print default project quota, even if projid 0 > + * isn't defined > + */ > + report_mount(fp, 0, NULL, NULL, form, XFS_PROJ_QUOTA, > + mount, flags); > + flags |= NO_HEADER_FLAG; > + } > + > setprent(); > while ((p = getprent()) != NULL) { > if (report_mount(fp, p->pr_prid, p->pr_name, NULL, > From poliryy@zoho.com Thu Apr 7 10:06:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A38217CA0 for ; Thu, 7 Apr 2016 10:06:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 741C28F8035 for ; Thu, 7 Apr 2016 08:06:15 -0700 (PDT) X-ASG-Debug-ID: 1460041570-04cbb065b84e2f0001-NocioJ Received: from fond.onigiri.cn (fond.onigiri.cn [45.58.114.187]) by cuda.sgi.com with ESMTP id J1FpujJ49t0LgmEb for ; Thu, 07 Apr 2016 08:06:11 -0700 (PDT) X-Barracuda-Envelope-From: poliryy@zoho.com X-Barracuda-Apparent-Source-IP: 45.58.114.187 To: xfs@oss.sgi.com Subject: Custom Shaped USB drives with your logo Message-ID: <4bfd5fc750335354148deda1e75fb7b2@fultonperformance.com> X-ASG-Orig-Subj: Custom Shaped USB drives with your logo Date: Thu, 07 Apr 2016 16:33:22 +0200 From: "Stacy Kingley" Reply-To: reginalde@aliyun.com MIME-Version: 1.0 X-Mailer-LID: 3 X-Mailer-RecptId: 4686092 X-Mailer-SID: 1288 X-Mailer-Sent-By: 1 Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: fond.onigiri.cn[45.58.114.187] X-Barracuda-Start-Time: 1460041570 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28525 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi, I wanted to follow up from last week. Did you receive the email I sent you? I would like to contact the person that does your buying of branded promotional products for your company? Our company manufactures USB Flash Drives, printed with your logo. They make the perfect marketing tool for your business or organization. We offer low minimum quantities, and all memory sizes. Over 150 Stock Models as well as 100 % custom shaped USB drives. We can pre-load your media files, images, presentations and files onto the drives for you. These are ideal handouts for trade shows, branding, corporate gifts and employees. Our USB Pricing is at an ALL TIME LOW - now is the time to get your USB drives. * Please reply back and let me know what quantity and memory size you need for a Fast Quote! * Let us send you a quote! We will EARN your business! Are you a school or nonprofit? Please let us know for even further discounts. We are always running a promotion, just ask! 1-888-779-8318 Thanks! Stacy Kingley National Account Rep Promo / Branded Flash Drives 1-888-779-8318 Email: abensho@sina.com From BATV+9c8718d1e17d2f6f8ba3+4610+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 7 10:35:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 876DE7CA0 for ; Thu, 7 Apr 2016 10:35:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 47D9C30405F for ; Thu, 7 Apr 2016 08:35:18 -0700 (PDT) X-ASG-Debug-ID: 1460043304-04cb6c246231d420001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id tkrt4Zs46kBEjl15 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 07 Apr 2016 08:35:05 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9c8718d1e17d2f6f8ba3+4610+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1aoBxY-0001Bo-0k; Thu, 07 Apr 2016 15:35:04 +0000 Date: Thu, 7 Apr 2016 08:35:04 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/4] xfs: reduce lock hold times in buffer writeback Message-ID: <20160407153503.GA2473@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/4] xfs: reduce lock hold times in buffer writeback References: <1459836310-12619-1-git-send-email-david@fromorbit.com> <1459836310-12619-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459836310-12619-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1460043305 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28525 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, but is the rename of __xfs_buf_delwri_submit really useful? Otherwise: Reviewed-by: Christoph Hellwig From BATV+ca2ecb86b0600dbceeab+4610+infradead.org+hch@casper.srs.infradead.org Thu Apr 7 10:45:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F04A17CA0 for ; Thu, 7 Apr 2016 10:45:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6D8E8AC004 for ; Thu, 7 Apr 2016 08:44:58 -0700 (PDT) X-ASG-Debug-ID: 1460043894-04bdf011022e41d0001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id bkRP5RYCNVDCMuFb (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 07 Apr 2016 08:44:55 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ca2ecb86b0600dbceeab+4610+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from ip-64-134-228-197.public.wayport.net ([64.134.228.197] helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1aoC73-0005EM-Uc for xfs@oss.sgi.com; Thu, 07 Apr 2016 15:44:54 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH] xfs: fix warning in xfs_finish_page_writeback for non-debug builds Date: Thu, 7 Apr 2016 08:44:51 -0700 X-ASG-Orig-Subj: [PATCH] xfs: fix warning in xfs_finish_page_writeback for non-debug builds Message-Id: <1460043891-5075-1-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1460043895 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28525 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- blockmask is unused if ASSERTs are disabled. Reported-by: kbuild test robot Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_aops.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 40645a4..1d6eca5 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -94,15 +94,14 @@ xfs_finish_page_writeback( struct bio_vec *bvec, int error) { - unsigned int blockmask = (1 << inode->i_blkbits) - 1; unsigned int end = bvec->bv_offset + bvec->bv_len - 1; struct buffer_head *head, *bh; unsigned int off = 0; ASSERT(bvec->bv_offset < PAGE_SIZE); - ASSERT((bvec->bv_offset & blockmask) == 0); + ASSERT((bvec->bv_offset & ((1 << inode->i_blkbits) - 1)) == 0); ASSERT(end < PAGE_SIZE); - ASSERT((bvec->bv_len & blockmask) == 0); + ASSERT((bvec->bv_len & ((1 << inode->i_blkbits) - 1)) == 0); bh = head = page_buffers(bvec->bv_page); -- 2.1.4 From BATV+9c8718d1e17d2f6f8ba3+4610+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 7 10:45:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D67EB7CA1 for ; Thu, 7 Apr 2016 10:45:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4A3E2AC006 for ; Thu, 7 Apr 2016 08:45:43 -0700 (PDT) X-ASG-Debug-ID: 1460043941-04cb6c246431da50001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id j6zQCNF4S8bDdhhD (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 07 Apr 2016 08:45:41 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9c8718d1e17d2f6f8ba3+4610+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1aoC7o-00078l-Oq; Thu, 07 Apr 2016 15:45:40 +0000 Date: Thu, 7 Apr 2016 08:45:40 -0700 From: Christoph Hellwig To: Zorro Lang Cc: xfs@oss.sgi.com, sandeen@redhat.com Subject: Re: [PATCH v3] xfs_quota: print quota id number if the name can't be found Message-ID: <20160407154540.GA23772@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v3] xfs_quota: print quota id number if the name can't be found References: <1460040514-23834-1-git-send-email-zlang@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460040514-23834-1-git-send-email-zlang@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1460043941 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28525 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+9c8718d1e17d2f6f8ba3+4610+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 7 10:46:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0AD177CA0 for ; Thu, 7 Apr 2016 10:46:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D23618F8033 for ; Thu, 7 Apr 2016 08:46:21 -0700 (PDT) X-ASG-Debug-ID: 1460043979-04cbb065b04fd00001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id UHn9X6pozgiZZEH1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 07 Apr 2016 08:46:19 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9c8718d1e17d2f6f8ba3+4610+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1aoC8P-0007X5-To; Thu, 07 Apr 2016 15:46:17 +0000 Date: Thu, 7 Apr 2016 08:46:17 -0700 From: Christoph Hellwig To: Eryu Guan Cc: fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs/259: handle minimum block size more precisely Message-ID: <20160407154617.GB23772@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs/259: handle minimum block size more precisely References: <1460027155-4222-1-git-send-email-eguan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460027155-4222-1-git-send-email-eguan@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1460043979 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28525 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+9c8718d1e17d2f6f8ba3+4610+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 7 10:47:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E22567CA0 for ; Thu, 7 Apr 2016 10:47:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 983D08F8049 for ; Thu, 7 Apr 2016 08:47:33 -0700 (PDT) X-ASG-Debug-ID: 1460044051-04bdf011042e43b0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id VD9vv9Nj6oKWrN8t (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 07 Apr 2016 08:47:32 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9c8718d1e17d2f6f8ba3+4610+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1aoC9b-0008LM-TX; Thu, 07 Apr 2016 15:47:31 +0000 Date: Thu, 7 Apr 2016 08:47:31 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/5] xfs: fix inode validity check in xfs_iflush_cluster Message-ID: <20160407154731.GC23772@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/5] xfs: fix inode validity check in xfs_iflush_cluster References: <1459934574-25543-1-git-send-email-david@fromorbit.com> <1459934574-25543-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459934574-25543-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1460044052 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28525 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Apr 06, 2016 at 07:22:50PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Some careless idiot wrote crap code in commit 1a3e8f3 ("xfs: convert > inode cache lookups to use RCU locking") back in late 2010, and so > xfs_iflush_cluster checks the wrong inode for whether it is still > valid under RCU protection. Fix it to lock and check the correct > inode. > > Part of the reason for the screwup was the unconventional naming of > the cluster inode variable - iq - so also rename all the cluster > inode variables to use a more conventional prefixes to reduce > potential future confusion (cilist, cilist_size, cip). Between all that renaming I didn't actually manage to find the fix :) Can you split the rename and the fix into separate patches? From BATV+9c8718d1e17d2f6f8ba3+4610+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 7 10:47:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6E72A7CAE for ; Thu, 7 Apr 2016 10:47:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 40E528F8035 for ; Thu, 7 Apr 2016 08:47:49 -0700 (PDT) X-ASG-Debug-ID: 1460044068-04cbb065ac4fdf0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id wpPAAUJpRRNtHVHD (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 07 Apr 2016 08:47:48 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9c8718d1e17d2f6f8ba3+4610+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1aoC9s-0008Nx-BS; Thu, 07 Apr 2016 15:47:48 +0000 Date: Thu, 7 Apr 2016 08:47:48 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/5] xfs: skip stale inodes in xfs_iflush_cluster Message-ID: <20160407154748.GD23772@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/5] xfs: skip stale inodes in xfs_iflush_cluster References: <1459934574-25543-1-git-send-email-david@fromorbit.com> <1459934574-25543-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459934574-25543-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1460044068 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28525 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+9c8718d1e17d2f6f8ba3+4610+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 7 10:48:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6B71D7CA6 for ; Thu, 7 Apr 2016 10:48:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E139AAC004 for ; Thu, 7 Apr 2016 08:48:20 -0700 (PDT) X-ASG-Debug-ID: 1460044099-04cb6c246431dc30001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id wgSf4RKvgRV6fdNy (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 07 Apr 2016 08:48:19 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9c8718d1e17d2f6f8ba3+4610+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1aoCAM-0008TY-Pg; Thu, 07 Apr 2016 15:48:18 +0000 Date: Thu, 7 Apr 2016 08:48:18 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/5] xfs: xfs_iflush_cluster has range issues Message-ID: <20160407154818.GE23772@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/5] xfs: xfs_iflush_cluster has range issues References: <1459934574-25543-1-git-send-email-david@fromorbit.com> <1459934574-25543-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459934574-25543-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1460044099 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28526 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+9c8718d1e17d2f6f8ba3+4610+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 7 10:50:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1F7567CA1 for ; Thu, 7 Apr 2016 10:50:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 88169AC007 for ; Thu, 7 Apr 2016 08:50:06 -0700 (PDT) X-ASG-Debug-ID: 1460044204-04cbb065b84ff90001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id yUPjflLAFVxn9sjl (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 07 Apr 2016 08:50:04 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9c8718d1e17d2f6f8ba3+4610+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1aoCC4-0000nc-1s; Thu, 07 Apr 2016 15:50:04 +0000 Date: Thu, 7 Apr 2016 08:50:04 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/5] xfs: xfs_inode_free() isn't RCU safe Message-ID: <20160407155004.GF23772@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/5] xfs: xfs_inode_free() isn't RCU safe References: <1459934574-25543-1-git-send-email-david@fromorbit.com> <1459934574-25543-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459934574-25543-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1460044204 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28526 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From sandeen@sandeen.net Thu Apr 7 12:25:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 27E6F7CA0 for ; Thu, 7 Apr 2016 12:25:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CA3D88F8033 for ; Thu, 7 Apr 2016 10:25:50 -0700 (PDT) X-ASG-Debug-ID: 1460049947-04cbb065b854000001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id b1pVns0A7OIykNDh for ; Thu, 07 Apr 2016 10:25:47 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 7F63116C152 for ; Thu, 7 Apr 2016 12:25:47 -0500 (CDT) Subject: Re: [PATCH 08/19] mkfs: getbool is redundant To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 08/19] mkfs: getbool is redundant References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-9-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <5706981A.9090904@sandeen.net> Date: Thu, 7 Apr 2016 12:25:46 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.1 MIME-Version: 1.0 In-Reply-To: <1458818136-56043-9-git-send-email-jtulak@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1460049947 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28527 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > From: Dave Chinner > > CHANGELOG: > o Add description of a new member of opt_params > o Fix in the subopts tables > o All boolean subopts should use getnum_checked > o Edit man8 page where it missed the information about optional value of a flag > > getbool() can be replaced with getnum_checked with appropriate > min/max values set for the boolean variables. Make boolean > arguments consistent - all accept 0 or 1 value now. > > Signed-off-by: Dave Chinner > Signed-off-by: Jan Tulak > --- > man/man8/mkfs.xfs.8 | 11 ++- > mkfs/xfs_mkfs.c | 223 ++++++++++++++++++++++++++++++++++++---------------- > 2 files changed, 164 insertions(+), 70 deletions(-) > > diff --git a/man/man8/mkfs.xfs.8 b/man/man8/mkfs.xfs.8 > index 8b068ef..5a2a20a 100644 > --- a/man/man8/mkfs.xfs.8 > +++ b/man/man8/mkfs.xfs.8 > @@ -118,6 +118,9 @@ option or the > option first needs to be added to the command line. > Failure to specify the size of the units will result in illegal value errors > when parameters are quantified in those units. > +.PP > +Many options allows for optional argument of value 0 or 1, to explicitly "Many options allow for an optional argument of 0 or 1, ..." > +disable or enable the functionality, in a forward-compatible syntax. What does "forward-compatible syntax" mean? I'm not sure that clarifies anything for the reader. Otherwise this looks ok to me; Dave explained that it is intentional to make every single option accept a value, whether it is now boolean or a numeric value, so there is no such thing as a bare "--flag" anymore; such flags are always "--flag [0|1]" now, right? > @@ -312,10 +315,12 @@ and > .B swidth > values. > .TP > -.BI noalign > -This option disables automatic geometry detection and creates the filesystem > +.BI noalign[= value ] > +If the > +.I value > +is 1, this option disables automatic geometry detection and creates the filesystem > without stripe geometry alignment even if the underlying storage device provides > -this information. > +this information. 0 disables this option, that is, enables automatic detection. > .RE > .TP > .B \-f The realtime section of the manpage needs this same fixup now too, I guess. Thanks, -Eric From newsletter@consulting-learning.eu Thu Apr 7 13:58:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY, MIME_QP_LONG_LINE,T_DKIM_INVALID,T_REMOTE_IMAGE,URI_DATA 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 918A07CA1 for ; Thu, 7 Apr 2016 13:58:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 65250304039 for ; Thu, 7 Apr 2016 11:58:47 -0700 (PDT) X-ASG-Debug-ID: 1460055517-04cb6c2464325f70001-NocioJ Received: from newsletter25.promotebusiness.gr (newsletter25.promotebusiness.gr [62.38.238.209]) by cuda.sgi.com with ESMTP id jlMe01MgvPJpRRuV (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 07 Apr 2016 11:58:39 -0700 (PDT) X-Barracuda-Envelope-From: newsletter@consulting-learning.eu X-Barracuda-Apparent-Source-IP: 62.38.238.209 Received: from marketing2 (unknown [192.168.1.210]) (using TLSv1 with cipher RC4-MD5 (128/128 bits)) (No client certificate requested) (Authenticated sender: newsletter@consulting-learning.eu) by newsletter14.promotebusiness.gr (Postfix) with ESMTPSA id 73705C140B for ; Thu, 7 Apr 2016 21:58:37 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=consulting-learning.eu; s=default; t=1460055517; bh=dzeMy9anUd1DoYo2/9Be0bFJXHIUwXT/g5RjY1dmQ5k=; h=Reply-To:From:To:Subject:Date; b=kuD3Q7nNZ6RLKBOQBfP9mUoIqJ7PVD5CDxPh3LTO/hfz/y7Y1Z7fuChLdm/+Qkjb9 AS0R2Xxuo4h9oOAFgfYVS47fZSq7Hue6+pqTNDmnhP+z3dH5zP/4lrDZO5U0HJkBrZ W7HxM9Y37m5VtnKQYGTKipIDjIiAUbFtxVJdd7gw= Organization: iBcl Reply-To: info@consulting-learning.eu Message-ID: <49c952a3ef888a441dbc101c0015dd58@consulting-learning.eu> From: "iBcl" To: Subject: =?windows-1253?Q?=C5=EA=F0=E1=DF=E4=E5=F5=F3=E7_=C5=F1=E3=EF=E4=E7=E3=FE=ED_=D0=E1=F1=E1=E3=F9=E3=DE=F2?= Date: Thu, 7 Apr 2016 21:06:26 +0300 X-ASG-Orig-Subj: =?windows-1253?Q?=C5=EA=F0=E1=DF=E4=E5=F5=F3=E7_=C5=F1=E3=EF=E4=E7=E3=FE=ED_=D0=E1=F1=E1=E3=F9=E3=DE=F2?= MIME-Version: 1.0 Content-Type: text/html; charset="windows-1253" Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: newsletter25.promotebusiness.gr[62.38.238.209] X-Barracuda-Start-Time: 1460055519 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.82 X-Barracuda-Spam-Status: No, SCORE=0.82 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, MIME_HTML_ONLY, MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28531 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 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
3D""=20=20
= =20
Turning Training into Learning=20
=
=D3=E5=EC=E9=ED=DC=F1=E9=EF=20
=C5=CA=D0=C1=C9=C4=C5=D5=D3=C7 = =C5=D1=C3=CF=C4=C7=C3=D9=CD=20 = =D0=C1=D1=C1=C3=D9=C3=C7=D3
=
=20 =
=C1=E8=DE=ED=E1, = =D4=F1=DF=F4=E7 17 =CC=E1=DF=EF=F5 (9:30 -=20 17:00), Crowne Plaza Hotel=20
=C8=E5=F3=F3=E1=EB=EF=ED=DF=EA=E7, = =D4=E5=F4=DC=F1=F4=E7 11 =CC=E1=DF=EF=F5=20 (9:30 - 17:00), Grand Hotel = Palace=20
=
=C1=ED=F4=E9=EA=E5=DF=EC=E5=ED=EF=20 =F4=EF=F5 =D3=E5=EC=E9=ED=E1=F1=DF=EF=F5 = =E5=DF=ED=E1=E9 =E7 =F0=E1=F1=EF=F7=DE = =E5=F6=E1=F1=EC=EF=F3=EC=DD=ED=E7=F2=20 =E5=EA=F0=E1=DF=E4=E5=F5=F3=E7=F2 =EC=E5 = workshop, =F0=E1=F1=E1=E4=E5=DF=E3=EC=E1=F4=E1 =EA=E1=E9 role=20 playing =F3=F4=EF=F5=F2 Managers =F4=E7=F2 = =F0=F1=FE=F4=E7=F2 =E2=E1=E8=EC=DF=E4=E1=F2 =F0=EF=F5=20 =E5=DF=ED=E1=E9 =EF=E9 = =C5=F1=E3=EF=E4=E7=E3=EF=DF, =F0=F1=EF=EA=E5=E9=EC=DD=ED=EF=F5 =ED=E1 = =E5=ED=E9=F3=F7=FD=F3=EF=F5=ED =F4=E9=F2=20 =E4=E5=EE=E9=FC=F4=E7=F4=E5=F2 =F0=EF=F5 = =E1=F0=E1=E9=F4=EF=FD=ED =EF=E9 =F3=FD=E3=F7=F1=EF=ED=E5=F2 = =F3=F5=E3=EA=F5=F1=DF=E5=F2 =E3=E9=E1=20 =F4=EF=ED =F1=FC=EB=EF =F4=EF=F5=F2. =C7 = =E5=F4=E1=E9=F1=E5=DF=E1 =EC=E1=F2, =EC=E5 =F4=EF = =F3=E5=EC=E9=ED=DC=F1=E9=EF=20 =E1=F5=F4=FC, =F0=F1=EF=F3=F6=DD=F1=E5=E9 = =DD=ED=E1 =F3=E7=EC=E1=ED=F4=E9=EA=FC =F0=F1=E1=EA=F4=E9=EA=FC = =E2=EF=DE=E8=E7=EC=E1 =E3=E9=E1=20 =F4=E7=ED =E1=ED=E1=E2=DC=E8=EC=E9=F3=E7 = =F4=EF=F5 =E5=F1=E3=EF=E4=E7=E3=EF=FD, =FE=F3=F4=E5 =ED=E1 = =EB=E5=E9=F4=EF=F5=F1=E3=E5=DF=20 =F9=F2 Manager = =E5=F6=E1=F1=EC=FC=E6o=ED=F4=E1=F2 =EC=E5 =E5=F0=E9=F4=F5=F7=DF=E1 = =F4=E7=ED =F0=EF=EB=E9=F4=E9=EA=DE=20 =F4=E7=F2 =C4=E9=EF=DF=EA=E7=F3=E7=F2 = =EA=E1=E9 =F4=E1=F5=F4=FC=F7=F1=EF=ED=E1 =ED=E1 = =E4=E9=E1=F7=E5=E9=F1=DF=E6=E5=F4=E1=E9 =EC=E5=20 =F5=F0=E5=F5=E8=F5=ED=FC=F4=E7=F4=E1 =F4=E1 = =F0=F1=EF=E2=EB=DE=EC=E1=F4=E1 =F4=EF=F5 =D0=F1=EF=F3=F9=F0=E9=EA=EF=FD = =EA=E1=E9 =F4=F9=ED=20 =CB=E5=E9=F4=EF=F5=F1=E3=E9=FE=ED. = =D4=E5=EB=E9=EA=FC =E6=E7=F4=EF=FD=EC=E5=ED=EF =E5=DF=ED=E1=E9 =ED=E1 = =E5=F0=E9=EA=EF=E9=ED=F9=ED=E5=DF=20 =E1=F0=EF=F4=E5=EB=E5=F3=EC=E1=F4=E9=EA=DC, = =ED=E1 =F0=F1=EF=E3=F1=E1=EC=EC=E1=F4=DF=E6=E5=E9 =DD=F1=E3=E1 =EA=E1=E9=20 =E4=F1=E1=F3=F4=E7=F1=E9=FC=F4=E7=F4=E5=F2 = =EC=E5 =F3=F9=F3=F4=DE =E4=E9=E1=F7=E5=DF=F1=E9=F3=E7 =F0=FC=F1=F9=ED -=20 =EA=FC=F3=F4=EF=F5=F2, =ED=E1 = =E1=F3=EA=E5=DF =F4=EF=ED =E1=F0=E1=E9=F4=EF=FD=EC=E5=ED=EF = =DD=EB=E5=E3=F7=EF =EA=E1=E9=20 =F3=F5=ED=F4=EF=ED=E9=F3=EC=FC =F3=F4=E7=ED = =F5=EB=EF=F0=EF=DF=E7=F3=E7 =F4=E7=F2 =EA=DC=E8=E5 =E4=F1=DC=F3=E7=F2 = =FE=F3=F4=E5 =ED=E1=20 =E5=F0=E9=F4=F5=E3=F7=DC=ED=E5=E9 = =F4=EF=F5=F2 =F3=F4=FC=F7=EF=F5=F2 =F4=E7=F2 = =F0=E1=F1=E1=E3=F9=E3=E9=EA=FC=F4=E7=F4=E1=F2 =EA=E1=E9=20 =F4=DD=EB=EF=F2 =ED=E1 = =E4=E9=E1=EC=EF=F1=F6=FE=ED=E5=E9 =EA=EB=DF=EC=E1 = =F0=E1=F1=E1=EA=DF=ED=E7=F3=E7=F2 =F3=F4=EF=20 =F0=F1=EF=F3=F9=F0=E9=EA=FC =E3=E9=E1 =ED=E1 = =E4=E9=E1=F7=E5=E9=F1=DF=E6=E5=F4=E1=E9 = =E1=F0=EF=F4=E5=EB=E5=F3=EC=E1=F4=E9=EA=DC =F4=EF=ED=20 =D7=F1=FC=ED=EF =EA=E1=E9 =F4=E7=ED = =CA=E1=E8=E7=EC=E5=F1=E9=ED=FC=F4=E7=F4=E1.

=D3=F4=EF=F5=F2=20 =F3=F5=EC=EC=E5=F4=DD=F7=EF=ED=F4=E5=F2 = =F0=E1=F1=DD=F7=EF=ED=F4=E1=E9 =F7=F9=F1=DF=F2 =F0=F1=FC=F3=E8=E5=F4=EF = =EA=FC=F3=F4=EF=F2 =F4=E1=20 =E5=EE=DE=F2 =C5=F1=E3=E1=EB=E5=DF=E1 = (=C5=F6=E1=F1=EC=EF=E3=DD=F2 =F3=E5 Excel):=20
  • =C5=F6=E1=F1=EC=EF=E3=DE=20 =E3=E9=E1 =F4=EF=ED = =D0=F1=EF=E3=F1=E1=EC=EC=E1=F4=E9=F3=EC=FC =F0=EF=F5 = =E2=E1=F3=DF=E6=E5=F4=E1=E9 =F3=F4=E7=ED=20 =EA=E1=F4=DC=F4=E1=EE=E7 =F4=F9=ED = =C5=F1=E3=E1=F3=E9=FE=ED =F3=E5 =D3=E7=EC=E1=ED=F4=E9=EA=DD=F2, =EC=E7=20 =D3=E7=EC=E1=ED=F4=E9=EA=DD=F2, = =C5=F0=E5=DF=E3=EF=F5=F3=E5=F2 =EA=E1=E9 =EC=E7 = =E5=F0=E5=DF=E3=EF=F5=F3=E5=F2=20
  • =C5=F6=E1=F1=EC=EF=E3=DE=20 =E3=E9=E1 =F4=EF=ED = =F5=F0=EF=EB=EF=E3=E9=F3=EC=FC =F4=EF=F5 =EA=FC=F3=F4=EF=F5=F2 = =C5=F1=E3=E1=F3=E9=FE=ED =EA=E1=E9=20 =B8=F1=E3=F9=ED=20
  • =CF=EB=EF=EA=EB=E7=F1=F9=EC=DD=ED=EF=20 =D3=FD=F3=F4=E7=EC=E1 = =C4=E9=E1=F7=E5=DF=F1=E9=F3=E7=F2 =B8=F1=E3=F9=ED=20
  • =C5=F6=E1=F1=EC=EF=E3=DE=20 =E3=E9=E1 =F4=E7=ED = =C5=F3=F9=F4=E5=F1=E9=EA=DE =C5=F0=E9=EA=EF=E9=ED=F9=ED=DF=E1 =EA=E1=E9 = =F4=E7 =C4=E9=E1=F7=E5=DF=F1=E9=F3=E7=20 =F4=E7=F2 = =CA=E1=E8=E7=EC=E5=F1=E9=ED=FC=F4=E7=F4=E1=F2
  • =C5=F6=E1=F1=EC=EF=E3=DE=20 =E3=E9=E1 =F4=E7=ED ABC Analysis=20
  • =CC=EF=ED=F4=DD=EB=E1=20 =D0=F1=FC=E2=EB=E5=F8=E7=F2=20
  • =C5=F1=E3=E1=EB=E5=DF=EF=20 =E3=E9=E1 =F4=E7=ED = =D0=E1=F1=E1=EA=EF=EB=EF=FD=E8=E7=F3=E7 =F4=F9=ED =C4=E5=E9=EA=F4=FE=ED=20 = =D0=E1=F1=E1=E3=F9=E3=E9=EA=FC=F4=E7=F4=E1=F2
  • =C4=E5= =DF=F4=E5=20 =F0=E5=F1=E9=F3=F3=FC=F4=E5=F1=E1 =BB =

    = =
    =20
    =D0=FE=F2=20 =E8=E1 =E2=EF=E7=E8=E7=E8=EF=FD=ED =EF=E9 = =D3=F5=EC=EC=E5=F4=DD=F7=EF=ED=F4=E5=F2=20
    =
    • =C8=E1=20 =DD=F7=EF=F5=ED =F3=F4=E7 = =E4=E9=DC=E8=E5=F3=DE =F4=EF=F5=F2 =C5=F1=E3=E1=EB=E5=DF=EF Pareto ABC=20 Analysis =EA=E1=E9 =E8=E1 = =E5=EA=F0=E1=E9=E4=E5=F5=F4=EF=FD=ED =F3=F4=EF=ED = =EA=E1=E8=EF=F1=E9=F3=EC=FC=20 =F0=F1=EF=F4=E5=F1=E1=E9=EF=F4=DE=F4=F9=ED = (=F0=F7. =F3=F4=E7 =C4=E9=E1=F7=E5=DF=F1=E9=F3=E7 = =E1=F0=FE=EB=E5=E9=E1=F2=20 =F7=F1=FC=ED=EF=F5 =CC=E7=F7=E1=ED=FE=ED - = =D0=F1=EF=F3=F9=F0=E9=EA=EF=FD).=20
    • =C8=E1=20 =F4=EF=F5=F2 =E4=EF=E8=EF=FD=ED = =EA=E1=F4=DC=EB=EB=E7=EB=EF=E9 =E1=EB=E3=FC=F1=E9=E8=EC=EF=E9 =E3=E9=E1 = =ED=E1=20 =EC=E5=E9=FE=ED=E5=F4=E1=E9 =F4=EF = =EA=FC=F3=F4=EF=F2 set up =F3=F4=E1 =EC=E7=F7=E1=ED=DE=EC=E1=F4=E1,=20 =E2=E5=EB=F4=E9=FE=ED=EF=ED=F4=E1=F2 = =F4=E7 =F3=E5=E9=F1=DC =F0=F1=EF=E3=F1=E1=EC=EC=E1=F4=E9=F3=EC=EF=FD = =F4=F9=ED=20 =EC=E7=F7=E1=ED=E7=EC=DC=F4=F9=ED.=20
    • =C8=E1=20 =EC=F0=EF=F1=EF=FD=ED =ED=E1 = =E1=EE=E9=EF=F0=EF=E9=EF=FD=ED =C5=F1=E3=E1=EB=E5=DF=EF Capacity Planning=20 =F0=EF=F5 =DD=F7=E5=E9 = =F3=F7=E5=E4=E9=DC=F3=E5=E9 =E7 =E5=F4=E1=E9=F1=DF=E1 =EC=E1=F2 =E3=E9=E1 = =F4=EF=ED=20 =D0=F1=EF=E3=F1=E1=EC=EC=E1=F4=E9=F3=EC=FC = =CC=E7=F7=E1=ED=E7=EC=DC=F4=F9=ED & =D0=F1=EF=F3=F9=F0=E9=EA=EF=FD = =F3=E5=20 =EA=E1=E8=E7=EC=E5=F1=E9=ED=DE = =E2=DC=F3=E7.=20
    • =C8=E1=20 =E3=ED=F9=F1=DF=F3=EF=F5=ED =F4=E7 = =F3=F9=F3=F4=DE =EC=E5=E8=EF=E4=EF=EB=EF=E3=DF=E1 = =C4=E5=E9=E3=EC=E1=F4=EF=EB=E7=F8=DF=E1=F2,=20 =E5=DF=F4=E5 =F0=F1=FC=EA=E5=E9=F4=E1=E9 = =E3=E9=E1 =EF=EB=EF=EA=EB=E7=F1=F9=EC=DD=ED=E5=F2 =F0=E1=F1=F4=DF=E4=E5=F2 = =E5=DF=F4=E5=20 =E3=E9=E1 = =F3=F5=ED=E5=F7=E9=E6=FC=EC=E5=ED=E7 =F0=E1=F1=E1=E3=F9=E3=DE = =F3=FD=EC=F6=F9=ED=E1 =EC=E5 =F4=E1 =D0=F1=FC=F4=F5=F0=E1=20 ISO 2859 =EA=E1=E9 MIL-STD 1916 = =E1=ED=F4=DF=F3=F4=EF=E9=F7=E1.=20
    • =C8=E1=20 =DD=F7=EF=F5=ED =F3=F4=E7 = =E4=E9=DC=E8=E5=F3=DE =F4=EF=F5=F2 =CF=EB=EF=EA=EB=E7=F1=F9=EC=DD=ED=EF = =D3=FD=F3=F4=E7=EC=E1 =E3=E9=E1=20 =F4=E7 =EC=DD=F4=F1=E7=F3=E7 = =F0=E1=F1=E1=E3=F9=E3=E9=EA=FC=F4=E7=F4=E1=F2.=20
    • =C8=E1=20 =F4=EF=F5=F2 =E4=EF=E8=EF=FD=ED = =C5=F1=E3=E1=EB=E5=DF=E1 =E3=E9=E1 =F4=EF=ED = =F5=F0=EF=EB=EF=E3=E9=F3=EC=FC =F4=E7=F2=20 =EF=E9=EA=EF=ED=EF=EC=E9=EA=DC = =DC=F1=E9=F3=F4=E7=F2 =F0=EF=F3=FC=F4=E7=F4=E1=F2 = =F0=E1=F1=F4=DF=E4=E1=F2.=20
    • =C8=E1=20 =F4=EF=F5=F2 =E4=EF=E8=E5=DF = =EF=EB=EF=EA=EB=E7=F1=F9=EC=DD=ED=EF =D3=FD=F3=F4=E7=EC=E1 =F3=E5 Access = =E3=E9=E1 =F4=E7=20 =C4=E9=E1=F7=E5=DF=F1=E9=F3=E7 = =D0=F1=EF=E2=EB=E7=EC=DC=F4=F9=ED =EC=E7 = =F3=F5=EC=EC=EF=F1=F6=FE=F3=E5=F9=ED =EA=E1=E9=20 =C4=E9=EF=F1=E8=F9=F4=E9=EA=FE=ED = =C5=ED=E5=F1=E3=E5=E9=FE=ED.=20
    • =C8=E1=20 =E5=EE=EF=E9=EA=E5=E9=F9=E8=EF=FD=ED = =EC=E5 =F4=EF=ED =F4=F1=FC=F0=EF =F0=EF=F5 = =F5=EB=EF=F0=EF=E9=E5=DF=F4=E1=E9 =F4=EF=20 Validation (=C5=F0=E9=EA=FD=F1=F9=F3=E7 = =C9=EA=E1=ED=FC=F4=E7=F4=E1=F2) =EC=E9=E1=F2=20 =E4=E9=E5=F1=E3=E1=F3=DF=E1=F2 =EC=E5 = =C1=F3=EA=DE=F3=E5=E9=F2, =D0=E1=F1=E1=E4=E5=DF=E3=EC=E1=F4=E1 =EA=E1=E9=20 =C5=F1=E3=E1=EB=E5=DF=E1.=20
    • =C8=E1=20 =DD=F7=EF=F5=ED =F3=F5=ED=E5=F7=DE = =F5=F0=EF=F3=F4=DE=F1=E9=EE=E7 =E3=E9=E1 =DD=ED=E1 =DD=F4=EF=F2 = =EC=E5=F4=DC =F4=EF=20 =F3=E5=EC=E9=ED=DC=F1=E9=EF =F3=F4=E7=ED = =E1=EE=E9=EF=F0=EF=DF=E7=F3=E7 =FC=EB=F9=ED =F4=F9=ED = =F0=E1=F1=E1=F0=DC=ED=F9=20 =C5=F1=E3=E1=EB=E5=DF=F9=ED. =
    =C4=E5= =DF=F4=E5=20 =F0=E5=F1=E9=F3=F3=FC=F4=E5=F1=E1 =BB=20 =

    =
    =20 =
    =C5=ED=FC=F4=E7=F4=E5=F2=20 =D3=E5=EC=E9=ED=E1=F1=DF=EF=F5 =
    =
    =C7=20 =C4=E9=E1=E4=E9=EA=E1=F3=DF=E1 =F4=E7=F2 = =C5=F0=E9=EA=EF=E9=ED=F9=ED=DF=E1=F2, =EA=DC=E8=E5=F4=E1 =EA=E1=E9=20 =EF=F1=E9=E6=FC=ED=F4=E9=E1=20 =C7=20 =CC=E5=E8=EF=E4=EF=EB=EF=E3=DF=E1 = =E5=F0=DF=EB=F5=F3=E7=F2 =F0=F1=EF=E2=EB=E7=EC=DC=F4=F9=ED=20 =D4=E1=20 =F0=DD=ED=F4=E5 =E3=E9=E1=F4=DF = =F3=F4=E7=ED =E1=ED=E1=E6=DE=F4=E7=F3=E7 =F4=EF=F5 = =E3=E5=ED=E5=F3=E9=EF=F5=F1=E3=EF=FD=20 =E1=E9=F4=DF=EF=F5=20 =D4=E1=20 =E5=F0=F4=DC =E2=DE=EC=E1=F4=E1 =F3=F4=E7 = =EB=DE=F8=E7 =F4=F9=ED =C1=F0=EF=F6=DC=F3=E5=F9=ED=20 =C7=20 =C4=E9=E1=F7=E5=DF=F1=E9=F3=E7 =F4=F9=ED = =EC=E9=EA=F1=EF=F3=F5=E3=EA=F1=EF=FD=F3=E5=F9=ED =F3=F4=EF =F7=FE=F1=EF = =F4=E7=F2=20 =E5=F1=E3=E1=F3=DF=E1=F2=20 Coaching=20 =EA=E1=E9 =F0=E1=F1=E1=EA=DF=ED=E7=F3=E7 = =F4=EF=F5 =D0=F1=EF=F3=F9=F0=E9=EA=EF=FD=20 =D0=F1=E1=EA=F4=E9=EA=DD=F2=20 =E1=ED=E1=E3=ED=FE=F1=E9=F3=E7=F2 = =EA=E1=E9 =E5=F0=E9=E2=F1=DC=E2=E5=F5=F3=E7=F2 =F0=F1=EF=F2 =F4=EF=F5=F2=20 =F5=F6=E9=F3=F4=E1=EC=DD=ED=EF=F5=F2=20 =C7=20 =C4=E9=E1=F7=E5=DF=F1=E9=F3=E7 =F4=EF=F5 = =D7=F1=FC=ED=EF=F5 & =F4=E7=F2 = =CA=E1=E8=E7=EC=E5=F1=E9=ED=FC=F4=E7=F4=E1=F2=20 =C4=E9=E1=F7=E5=DF=F1=E9=F3=E7=20 Stress, =E7 =E2=DC=F3=E7 =E3=E9=E1 = =F4=E7=ED =F0=E1=F1=E1=E3=F9=E3=E9=EA=FC=F4=E7=F4=E1 =96 = =D4=E5=F7=ED=E9=EA=DD=F2=20 =EA=E1=E9 =F0=F1=E1=EA=F4=E9=EA=DD=F2 = =C1=F3=EA=DE=F3=E5=E9=F2 =E3=E9=E1 =F4=E7=ED =E1=F0=E1=EB=EB=E1=E3=DE = =E1=F0=FC =F4=EF=20 stress=20 =CF=E9=20 =EA=E1=EB=DD=F2 = =F0=F1=E1=EA=F4=E9=EA=DD=F2 =F0=F1=EF=E3=F1=E1=EC=EC=E1=F4=E9=F3=EC=EF=FD = =C5=F1=E3=E1=F3=E9=FE=ED,=20 =D0=E1=F1=E1=E3=F9=E3=DE=F2 =EA=E1=E9 = =B8=F1=E3=F9=ED=20 100=20 =CA=F1=DF=F3=E9=EC=E1 = =D3=F4=EF=E9=F7=E5=DF=E1 =E3=E9=E1 =F4=E7 =E2=E5=EB=F4=DF=F9=F3=E7 = =D5=E3=E5=DF=E1=F2 =EA=E1=E9=20 =C1=F3=F6=DC=EB=E5=E9=E1=F2 =F3=F4=E7=ED = =D0=E1=F1=E1=E3=F9=E3=DE=20 =CA=E1=ED=FC=ED=E5=F2=20 =E3=E9=E1 =F4=E7 =EC=E5=DF=F9=F3=E7 = =CA=FC=F3=F4=EF=F5=F2 =EA=E1=E9 =F4=E7=ED =E2=E5=EB=F4=DF=F9=F3=E7 = =F4=E7=F2=20 = =D0=E1=F1=E1=E3=F9=E3=E9=EA=FC=F4=E7=F4=E1=F2=20 =C7=20 =C4=E9=E1=F7=E5=DF=F1=E9=F3=E7 =F4=E7=F2 = =D0=EF=E9=FC=F4=E7=F4=E1=F2 =F4=F9=ED =E5=ED=E4=E9=DC=EC=E5=F3=F9=ED = =EA=E1=E9=20 =F4=E5=EB=E9=EA=FE=ED = =F0=F1=EF=FA=FC=ED=F4=F9=ED =EA=E1=E9 =F5=F0=E7=F1=E5=F3=E9=FE=ED=20 =CF=E9=20 =F3=F9=F3=F4=DD=F2 = =F0=F1=E1=EA=F4=E9=EA=DD=F2 =C4=E5=E9=E3=EC=E1=F4=EF=EB=E7=F8=DF=E1=F2, = =F0=F9=F2 =E5=F0=E9=EB=DD=E3=EF=F5=EC=E5=20 =F4=EF =F3=F9=F3=F4=FC = =EC=DD=E3=E5=E8=EF=F2 =C4=E5=DF=E3=EC=E1=F4=EF=F2=20 =C5=F1=E3=E1=EB=E5=DF=E1=20 =E2=E5=EB=F4=DF=F9=F3=E7=F2 =F4=F9=ED = =C4=E9=E5=F1=E3=E1=F3=E9=FE=ED: Pareto, Control Chart=20 =C7=20 =E2=E5=EB=F4=DF=F9=F3=E7 =F4=E7=F2 = =E5=F5=F4=E1=EE=DF=E1=F2 =F3=F4=EF=ED =F7=FE=F1=EF =F4=E7=F2 = =D0=E1=F1=E1=E3=F9=E3=DE=F2=20 =EA=E1=E9 =F4=F9=ED = =C3=F1=E1=F6=E5=DF=F9=ED, =D3=FD=F3=F4=E7=EC=E1 5S. =D0=DF=ED=E1=EA=E1=F2 = =EC=E5 =D3=E7=EC=E5=DF=E1=20 =C5=EB=DD=E3=F7=EF=F5=20 =C7=20 =EC=DD=F4=F1=E7=F3=E7 =EA=E1=E9 =E7 = =E2=E5=EB=F4=DF=F9=F3=E7 =F4=E7=F2 = =D0=E1=F1=E1=E3=F9=E3=E9=EA=FC=F4=E7=F4=E1=F2=20 =C5=ED=F4=EF=F0=E9=F3=EC=FC=F2=20 Bottlenecking =F3=F4=E7 =F1=EF=DE = =F4=F9=ED =CB=E5=E9=F4=EF=F5=F1=E3=E9=FE=ED. =D0=FE=F2=20 =E2=E5=EB=F4=E9=FE=ED=EF=F5=EC=E5 = =F4=E7=ED =E1=F0=FC=E4=EF=F3=E7 =EC=E9=E1=F2 =C3=F1=E1=EC=EC=DE=F2 = =D0=E1=F1=E1=E3=F9=E3=DE=F2=20 =C7=20 =C4=E9=EF=DF=EA=E7=F3=E7 =F4=EF=F5 = =D0=F1=EF=F3=F9=F0=E9=EA=EF=FD =F4=E7=F2 =D0=E1=F1=E1=E3=F9=E3=DE=F2 = =C4=E5= =DF=F4=E5=20 =E1=ED=E1=EB=F5=F4=E9=EA=DC =F4=E9=F2 = =E5=ED=FC=F4=E7=F4=E5=F2 =F4=EF=F5 =D3=E5=EC=E9=ED=E1=F1=DF=EF=F5 =BB=20 =

    =
    =20 =
    =C5=E9=F3=E7=E3=E7=F4=DE=F2=20
    =20
    =CD=E9=EA=FC=EB=E1=EF=F2=20 =C9. = =CC=E9=F7=E1=EB=EF=EB=E9=DC=EA=EF=F2, =C4=E9=E5=F5=E8=FD=ED=F9=ED = =D3=FD=EC=E2=EF=F5=EB=EF=F2, =E5=F0=DF 20=20 =F7=F1=FC=ED=E9=E1 =E1=ED=FE=F4=E5=F1=EF = =EA=E1=E9 =E1=ED=FE=F4=E1=F4=EF =F3=F4=DD=EB=E5=F7=EF=F2 = =EC=E5=E3=DC=EB=F9=ED=20 =E4=E9=E5=E8=ED=FE=ED =EA=E1=E9 = =E5=EB=EB=E7=ED=E9=EA=FE=ED =E5=F0=E9=F7=E5=E9=F1=DE=F3=E5=F9=ED (MOTOR = OIL,=20 CIBA - GEIGY, NOVARTIS =EA=E1.) =EC=E5 = =EC=E5=E3=DC=EB=E7 =E5=EC=F0=E5=E9=F1=DF=E1=20 =F3=E5 = =E5=EA=F0=E1=E9=E4=E5=FD=F3=E5=E9=F2 =EA=E1=E9 =F3=E5 =E8=DD=EC=E1=F4=E1 = =F0=E1=F1=E1=E3=F9=E3=DE=F2 &=20 =E5=F6=EF=E4=E9=E1=F3=F4=E9=EA=DE=F2 = =E1=EB=F5=F3=DF=E4=E1=F2 =F9=F2 =E4=E9=E5=F5=E8=F5=ED=F4=E9=EA=FC = =D3=F4=DD=EB=E5=F7=EF=F2=20 =D0=E1=F1=E1=E3=F9=E3=DE=F2. =B8=F7=E5=E9 = =E4=E9=EF=E9=EA=DE=F3=E5=E9 =F3=F5=EC=E2=EF=F5=EB=E5=F5=F4=E9=EA=DC = =B8=F1=E3=E1 =E3=E9=E1=20 =F4=E7=ED =E1=EE=E9=EF=EB=FC=E3=E7=F3=E7 = =EA=E1=E9 =E2=E5=EB=F4=DF=F9=F3=E7 =F4=E7=F2 =F0=EF=E9=FC=F4=E7=F4=E1=F2 = =EA=E1=E9=20 =F4=E7=F2 = =E1=F0=EF=E4=EF=F4=E9=EA=FC=F4=E7=F4=E1=F2 =F4=F9=ED =E3=F1=E1=EC=EC=FE=ED = =F0=E1=F1=E1=E3=F9=E3=DE=F2 =EC=E5=E3=DC=EB=F9=ED=20 =E5=F0=E9=F7=E5=E9=F1=DE=F3=E5=F9=ED = =FC=F0=F9=F2 =E7 BIC =C2=C9=CF=CB=C5=CE =EA=E1=E9 =E7 Tosoh =F4=E7=F2=20 MITSUBISHI.

    =C4=E5= =DF=F4=E5=20 =F4=EF =E2=E9=EF=E3=F1=E1=F6=E9=EA=FC = =F4=EF=F5 =E5=E9=F3=E7=E3=E7=F4=DE =BB

    =

    =
    =20 =
    =D0=EB=E7=F1=EF=F6=EF=F1=DF=E5=F2=20
    =C3=E9=E1=20 =F0=E5=F1=E9=F3=F3=FC=F4=E5=F1=E5=F2 = =F0=EB=E7=F1=EF=F6=EF=F1=DF=E5=F2 =E5=F0=E9=EA=EF=E9=ED=F9=ED=DE=F3=F4=E5 = =EC=E1=E6=DF =EC=E1=F2=20 =F3=F4=EF 210 8145 518 =DE =F3=F4=EF = info(at)ibcl(dot)gr.=20 =D5=F0=E5=FD=E8=F5=ED=E7 = =C5=F0=E9=EA=EF=E9=ED=F9=ED=DF=E1=F2: =C5=F5=E3=E5=ED=DF=E1 = =CC=E9=F7=E1=EB=EF=F0=EF=FD=EB=EF=F5=20
    =20
    =CA=FC=F3=F4=EF=F2=20 =F3=F5=EC=EC=E5=F4=EF=F7=DE=F2: = 450 =C5=F5=F1=FE=20
    =B8=EA=F0=F4=F9=F3=E7 = 20% =F3=F4=E7=ED=20 =E4=E5=FD=F4=E5=F1=E7, 30% = =F3=F4=E7=ED =F4=F1=DF=F4=E7 =EA=E1=E9=20 =EA=DC=E8=E5 =E5=F0=FC=EC=E5=ED=E7 = =F3=F5=EC=EC=E5=F4=EF=F7=DE.
    =D4=EF =F3=E5=EC=E9=ED=DC=F1=E9=EF=20 =E5=F0=E9=E4=EF=F4=E5=DF=F4=E1=E9 = =EC=DD=F3=F9 =F4=EF=F5 =F0=F1=EF=E3=F1=DC=EC=EC=E1=F4=EF=F2 = =CB=C1=C5=CA=20 0,24% =F4=EF=F5 =CF.=C1.=C5.=C4.=20
    =C4=C7=CB=D9=D3=C7 = =D3=D5=CC=CC=C5=D4=CF=D7=C7=D3: =C1=E8= =DE=ED=E1=20 17/5 - =C8=E5= =F3=F3=E1=EB=EF=ED=DF=EA=E7=20 11/5=20 =
    Innovative Business = Consulting=20 & Learning =96 iBcl =
    =D4=E7=EB=DD=F6=F9=ED=EF: 210 8145 518,=20 Fax: 211 800 1004, e-mail: info(at)ibcl(dot)gr=20


    =D3=E5 = =F0=E5=F1=DF=F0=F4=F9=F3=E7 =FC=EC=F9=F2 =F0=EF=F5 =E7=20 =F0=EB=E7=F1=EF=F6=FC=F1=E7=F3=E7 =E1=F5=F4=DE =E4=E5=ED = =F3=E1=F2 =E5=ED=E4=E9=E1=F6=DD=F1=E5=E9 =F0=E1=F1=E1=EA=E1=EB=EF=FD=EC=E5 = =E1=F0=EB=FE=F2=20 =F0=E1=F4=DE=F3=F4=E5=20 =E5=E4=FE, =DE =F3=F4=E5=DF=EB=F4=E5 = =DD=ED=E1 e-mail =F3=F4=EF info(at)ibcl(dot)gr=20 =EC=E5 =F4=DF=F4=EB=EF "REMOVE ME"=20 =
    From sandeen@sandeen.net Thu Apr 7 14:02:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7E22E7CA3 for ; Thu, 7 Apr 2016 14:02:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4259E304039 for ; Thu, 7 Apr 2016 12:02:41 -0700 (PDT) X-ASG-Debug-ID: 1460055755-04cb6c24603261b0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id Q5dLYHb6te1da4MX for ; Thu, 07 Apr 2016 12:02:36 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 66C8D16C165 for ; Thu, 7 Apr 2016 14:02:34 -0500 (CDT) Subject: Re: [PATCH 09/19] mkfs: use getnum_checked for all ranged parameters To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 09/19] mkfs: use getnum_checked for all ranged parameters References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-10-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <5706AEC9.7030002@sandeen.net> Date: Thu, 7 Apr 2016 14:02:33 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: <1458818136-56043-10-git-send-email-jtulak@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: 1460055755 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28531 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > From: Dave Chinner > > Now that getnum_checked can handle min/max checking, use this for > all parameters that take straight numbers and don't require unit > conversions. > > Signed-off-by: Dave Chinner > Signed-off-by: Jan Tulak Looks ok. Signed-off-by: Eric Sandeen > --- > include/xfs_multidisk.h | 5 +- > mkfs/xfs_mkfs.c | 148 ++++++++++++++++++++++++------------------------ > 2 files changed, 76 insertions(+), 77 deletions(-) > > diff --git a/include/xfs_multidisk.h b/include/xfs_multidisk.h > index af35100..8e81d90 100644 > --- a/include/xfs_multidisk.h > +++ b/include/xfs_multidisk.h > @@ -42,8 +42,9 @@ > > #define XFS_AG_BYTES(bblog) ((long long)BBSIZE << (bblog)) > #define XFS_AG_MIN_BYTES ((XFS_AG_BYTES(15))) /* 16 MB */ > -#define XFS_AG_MIN_BLOCKS(blog) ((XFS_AG_BYTES(15)) >> (blog)) > -#define XFS_AG_MAX_BLOCKS(blog) ((XFS_AG_BYTES(31) - 1) >> (blog)) > +#define XFS_AG_MAX_BYTES ((XFS_AG_BYTES(31))) /* 1 TB */ > +#define XFS_AG_MIN_BLOCKS(blog) (XFS_AG_MIN_BYTES >> (blog)) > +#define XFS_AG_MAX_BLOCKS(blog) ((XFS_AG_MAX_BYTES - 1) >> (blog)) > > #define XFS_MAX_AGNUMBER ((xfs_agnumber_t)(NULLAGNUMBER - 1)) > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index 0e2cfac..021d682 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c > @@ -163,6 +163,8 @@ struct opt_params dopts = { > }, > .subopt_params = { > { .index = D_AGCOUNT, > + .minval = 1, > + .maxval = XFS_MAX_AGNUMBER, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = D_FILE, > @@ -177,18 +179,26 @@ struct opt_params dopts = { > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = D_SUNIT, > + .minval = 0, > + .maxval = UINT_MAX, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = D_SWIDTH, > + .minval = 0, > + .maxval = UINT_MAX, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = D_AGSIZE, > + .minval = XFS_AG_MIN_BYTES, > + .maxval = XFS_AG_MAX_BYTES, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = D_SU, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = D_SW, > + .minval = 0, > + .maxval = UINT_MAX, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = D_SECTLOG, > @@ -207,12 +217,18 @@ struct opt_params dopts = { > .defaultval = 1, > }, > { .index = D_RTINHERIT, > - .defaultval = SUBOPT_NEEDS_VAL, > + .minval = 1, > + .maxval = 1, > + .defaultval = 1, > }, > { .index = D_PROJINHERIT, > + .minval = 0, > + .maxval = UINT_MAX, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = D_EXTSZINHERIT, > + .minval = 0, > + .maxval = UINT_MAX, > .defaultval = SUBOPT_NEEDS_VAL, > }, > }, > @@ -252,15 +268,23 @@ struct opt_params iopts = { > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = I_MAXPCT, > + .minval = 0, > + .maxval = 100, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = I_PERBLOCK, > + .minval = XFS_MIN_INODE_PERBLOCK, > + .maxval = XFS_MAX_BLOCKSIZE / XFS_DINODE_MIN_SIZE, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = I_SIZE, > + .minval = XFS_DINODE_MIN_SIZE, > + .maxval = XFS_DINODE_MAX_SIZE, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = I_ATTR, > + .minval = 0, > + .maxval = 2, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = I_PROJID32BIT, > @@ -307,6 +331,8 @@ struct opt_params lopts = { > }, > .subopt_params = { > { .index = L_AGNUM, > + .minval = 0, > + .maxval = UINT_MAX, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = L_INTERNAL, > @@ -318,9 +344,13 @@ struct opt_params lopts = { > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = L_VERSION, > + .minval = 1, > + .maxval = 2, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = L_SUNIT, > + .minval = BTOBB(XLOG_MIN_RECORD_BSIZE), > + .maxval = BTOBB(XLOG_MAX_RECORD_BSIZE), > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = L_SU, > @@ -380,6 +410,8 @@ struct opt_params nopts = { > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = N_VERSION, > + .minval = 2, > + .maxval = 2, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = N_FTYPE, > @@ -1560,13 +1592,11 @@ main( > switch (getsubopt(&p, (constpp)subopts, > &value)) { > case D_AGCOUNT: > - if (!value || *value == '\0') > - reqval('d', subopts, D_AGCOUNT); > if (daflag) > respec('d', subopts, D_AGCOUNT); > - agcount = getnum(value, 0, 0, false); > - if ((__int64_t)agcount <= 0) > - illegal(value, "d agcount"); > + > + agcount = getnum_checked(value, &dopts, > + D_AGCOUNT); > daflag = 1; > break; > case D_AGSIZE: > @@ -1601,28 +1631,22 @@ main( > dsize = value; > break; > case D_SUNIT: > - if (!value || *value == '\0') > - reqval('d', subopts, D_SUNIT); > if (dsunit) > respec('d', subopts, D_SUNIT); > if (nodsflag) > conflict('d', subopts, D_NOALIGN, > D_SUNIT); > - dsunit = getnum(value, 0, 0, false); > - if (dsunit < 0) > - illegal(value, "d sunit"); > + dsunit = getnum_checked(value, &dopts, > + D_SUNIT); > break; > case D_SWIDTH: > - if (!value || *value == '\0') > - reqval('d', subopts, D_SWIDTH); > if (dswidth) > respec('d', subopts, D_SWIDTH); > if (nodsflag) > conflict('d', subopts, D_NOALIGN, > D_SWIDTH); > - dswidth = getnum(value, 0, 0, false); > - if (dswidth < 0) > - illegal(value, "d swidth"); > + dswidth = getnum_checked(value, &dopts, > + D_SWIDTH); > break; > case D_SU: > if (!value || *value == '\0') > @@ -1638,16 +1662,13 @@ main( > illegal(value, "d su"); > break; > case D_SW: > - if (!value || *value == '\0') > - reqval('d', subopts, D_SW); > if (dsw) > respec('d', subopts, D_SW); > if (nodsflag) > conflict('d', subopts, D_NOALIGN, > D_SW); > - dsw = getnum(value, 0, 0, false); > - if (dsw < 0) > - illegal(value, "d sw"); > + dsw = getnum_checked(value, &dopts, > + D_SW); > break; > case D_NOALIGN: > nodsflag = getnum_checked(value, > @@ -1696,21 +1717,22 @@ main( > ssflag = 1; > break; > case D_RTINHERIT: > - fsx.fsx_xflags |= \ > - XFS_DIFLAG_RTINHERIT; > + c = getnum_checked(value, &dopts, > + D_RTINHERIT); > + if (c) > + fsx.fsx_xflags |= > + XFS_DIFLAG_RTINHERIT; > break; > case D_PROJINHERIT: > - if (!value || *value == '\0') > - reqval('d', subopts, D_PROJINHERIT); > - fsx.fsx_projid = atoi(value); > - fsx.fsx_xflags |= \ > + fsx.fsx_projid = getnum_checked(value, > + &dopts, D_PROJINHERIT); > + fsx.fsx_xflags |= > XFS_DIFLAG_PROJINHERIT; > break; > case D_EXTSZINHERIT: > - if (!value || *value == '\0') > - reqval('d', subopts, D_EXTSZINHERIT); > - fsx.fsx_extsize = atoi(value); > - fsx.fsx_xflags |= \ > + fsx.fsx_extsize = getnum_checked(value, > + &dopts, D_EXTSZINHERIT); > + fsx.fsx_xflags |= > XFS_DIFLAG_EXTSZINHERIT; > break; > default: > @@ -1745,18 +1767,13 @@ main( > ilflag = 1; > break; > case I_MAXPCT: > - if (!value || *value == '\0') > - reqval('i', subopts, I_MAXPCT); > if (imflag) > respec('i', subopts, I_MAXPCT); > - imaxpct = getnum(value, 0, 0, false); > - if (imaxpct < 0 || imaxpct > 100) > - illegal(value, "i maxpct"); > + imaxpct = getnum_checked( > + value, &iopts, I_MAXPCT); > imflag = 1; > break; > case I_PERBLOCK: > - if (!value || *value == '\0') > - reqval('i', subopts, I_PERBLOCK); > if (ilflag) > conflict('i', subopts, I_LOG, > I_PERBLOCK); > @@ -1765,16 +1782,13 @@ main( > if (isflag) > conflict('i', subopts, I_SIZE, > I_PERBLOCK); > - inopblock = getnum(value, 0, 0, false); > - if (inopblock < > - XFS_MIN_INODE_PERBLOCK || > - !ispow2(inopblock)) > + inopblock = getnum_checked(value, &iopts, > + I_PERBLOCK); > + if (!ispow2(inopblock)) > illegal(value, "i perblock"); > ipflag = 1; > break; > case I_SIZE: > - if (!value || *value == '\0') > - reqval('i', subopts, I_SIZE); > if (ilflag) > conflict('i', subopts, I_LOG, > I_SIZE); > @@ -1783,19 +1797,16 @@ main( > I_SIZE); > if (isflag) > respec('i', subopts, I_SIZE); > - isize = getnum(value, 0, 0, true); > - if (isize <= 0 || !ispow2(isize)) > + isize = getnum_checked(value, &iopts, > + I_SIZE); > + if (!ispow2(isize)) > illegal(value, "i size"); > inodelog = libxfs_highbit32(isize); > isflag = 1; > break; > case I_ATTR: > - if (!value || *value == '\0') > - reqval('i', subopts, I_ATTR); > - c = getnum(value, 0, 0, false); > - if (c < 0 || c > 2) > - illegal(value, "i attr"); > - sb_feat.attr_version = c; > + sb_feat.attr_version = getnum_checked( > + value, &iopts, I_ATTR); > break; > case I_PROJID32BIT: > sb_feat.projid16bit = > @@ -1817,21 +1828,16 @@ main( > while (*p != '\0') { > char **subopts = (char **)lopts.subopts; > char *value; > - long long tmp_num; > > switch (getsubopt(&p, (constpp)subopts, > &value)) { > case L_AGNUM: > - if (!value || *value == '\0') > - reqval('l', subopts, L_AGNUM); > if (laflag) > respec('l', subopts, L_AGNUM); > if (ldflag) > conflict('l', subopts, L_AGNUM, L_DEV); > - tmp_num = getnum(value, 0, 0, false); > - if (tmp_num < 0) > - illegal(value, "l agno"); > - logagno = (xfs_agnumber_t)tmp_num; > + logagno = getnum_checked(value, &lopts, > + L_AGNUM); > laflag = 1; > break; > case L_FILE: > @@ -1868,13 +1874,10 @@ main( > lsuflag = 1; > break; > case L_SUNIT: > - if (!value || *value == '\0') > - reqval('l', subopts, L_SUNIT); > if (lsunit) > respec('l', subopts, L_SUNIT); > - lsunit = getnum(value, 0, 0, false); > - if (lsunit < 0) > - illegal(value, "l sunit"); > + lsunit = getnum_checked(value, &lopts, > + L_SUNIT); > lsunitflag = 1; > break; > case L_NAME: > @@ -1893,14 +1896,10 @@ main( > xi.logname = value; > break; > case L_VERSION: > - if (!value || *value == '\0') > - reqval('l', subopts, L_VERSION); > if (lvflag) > respec('l', subopts, L_VERSION); > - c = getnum(value, 0, 0, false); > - if (c < 1 || c > 2) > - illegal(value, "l version"); > - sb_feat.log_version = c; > + sb_feat.log_version = getnum_checked( > + value, &lopts, L_VERSION); > lvflag = 1; > break; > case L_SIZE: > @@ -2035,11 +2034,10 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > /* ASCII CI mode */ > sb_feat.nci = true; > } else { > - c = getnum(value, 0, 0, false); > - if (c != 2) > - illegal(value, > - "n version"); > - sb_feat.dir_version = c; > + sb_feat.dir_version = > + getnum_checked(value, > + &nopts, > + N_VERSION); > } > nvflag = 1; > break; > From sandeen@sandeen.net Thu Apr 7 14:06:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 719D67CA1 for ; Thu, 7 Apr 2016 14:06:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D8821AC002 for ; Thu, 7 Apr 2016 12:06:19 -0700 (PDT) X-ASG-Debug-ID: 1460055973-04cbb065ac58390001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id mG1FFsU9BJUZtgkD for ; Thu, 07 Apr 2016 12:06:13 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id A752F16C165 for ; Thu, 7 Apr 2016 14:06:12 -0500 (CDT) Subject: Re: [PATCH 10/19] mkfs: add respecification detection to generic parsing To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 10/19] mkfs: add respecification detection to generic parsing References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-11-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <5706AFA4.2060105@sandeen.net> Date: Thu, 7 Apr 2016 14:06:12 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: <1458818136-56043-11-git-send-email-jtulak@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: 1460055973 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28531 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > From: Dave Chinner > > CHANGE: > o Add description of new members in opt_params struct. > o Drop "const" from struct opt_params - a previous patch was changed to > not create it as const. > > Add flags to the generic input parameter tables so that > respecification can be detected in a generic manner. > > Signed-off-by: Dave Chinner > Signed-off-by: Jan Tulak Reviewed-by: Eric Sandeen > --- > mkfs/xfs_mkfs.c | 64 ++++++++++++++++----------------------------------------- > 1 file changed, 18 insertions(+), 46 deletions(-) > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index 021d682..a8dd304 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c > @@ -72,6 +72,10 @@ static long long cvtnum(unsigned int blocksize, > * it is. The index has to be the same as is the order in subopts list, > * so we can access the right item both in subopt_param and subopts. > * > + * seen INTERNAL > + * Do not set this flag when definning a subopt. It is used to remeber that > + * this subopt was already seen, for example for conflicts detection. > + * > * minval, maxval OPTIONAL > * These options are used for automatic range check and they have to be > * always used together in pair. If you don't want to limit the max value, > @@ -95,8 +99,10 @@ static long long cvtnum(unsigned int blocksize, > struct opt_params { > const char name; > const char *subopts[MAX_SUBOPTS]; > + > struct subopt_param { > int index; > + bool seen; > long long minval; > long long maxval; > long long defaultval; > @@ -1227,7 +1233,6 @@ struct sb_feat_args { > int dir_version; > int spinodes; > int finobt; > - bool finobtflag; > bool inode_align; > bool nci; > bool lazy_sb_counters; > @@ -1363,7 +1368,7 @@ getnum_checked( > struct opt_params *opts, > int index) > { > - const struct subopt_param *sp = &opts->subopt_params[index]; > + struct subopt_param *sp = &opts->subopt_params[index]; > long long c; > > if (sp->index != index) { > @@ -1373,6 +1378,11 @@ getnum_checked( > reqval(opts->name, (char **)opts->subopts, index); > } > > + /* check for respecification of the option */ > + if (sp->seen) > + respec(opts->name, (char **)opts->subopts, index); > + sp->seen = true; > + > if (!str || *str == '\0') { > if (sp->defaultval == SUBOPT_NEEDS_VAL) > reqval(opts->name, (char **)opts->subopts, index); > @@ -1490,7 +1500,6 @@ main( > struct fs_topology ft; > struct sb_feat_args sb_feat = { > .finobt = 1, > - .finobtflag = false, > .spinodes = 0, > .log_version = 2, > .attr_version = 2, > @@ -1552,8 +1561,6 @@ main( > switch (getsubopt(&p, (constpp)subopts, > &value)) { > case B_LOG: > - if (blflag) > - respec('b', subopts, B_LOG); > if (bsflag) > conflict('b', subopts, B_SIZE, > B_LOG); > @@ -1592,9 +1599,6 @@ main( > switch (getsubopt(&p, (constpp)subopts, > &value)) { > case D_AGCOUNT: > - if (daflag) > - respec('d', subopts, D_AGCOUNT); > - > agcount = getnum_checked(value, &dopts, > D_AGCOUNT); > daflag = 1; > @@ -1631,8 +1635,6 @@ main( > dsize = value; > break; > case D_SUNIT: > - if (dsunit) > - respec('d', subopts, D_SUNIT); > if (nodsflag) > conflict('d', subopts, D_NOALIGN, > D_SUNIT); > @@ -1640,8 +1642,6 @@ main( > D_SUNIT); > break; > case D_SWIDTH: > - if (dswidth) > - respec('d', subopts, D_SWIDTH); > if (nodsflag) > conflict('d', subopts, D_NOALIGN, > D_SWIDTH); > @@ -1662,8 +1662,6 @@ main( > illegal(value, "d su"); > break; > case D_SW: > - if (dsw) > - respec('d', subopts, D_SW); > if (nodsflag) > conflict('d', subopts, D_NOALIGN, > D_SW); > @@ -1689,8 +1687,6 @@ main( > } > break; > case D_SECTLOG: > - if (slflag) > - respec('d', subopts, D_SECTLOG); > if (ssflag) > conflict('d', subopts, D_SECTSIZE, > D_SECTLOG); > @@ -1753,8 +1749,6 @@ main( > value, &iopts, I_ALIGN); > break; > case I_LOG: > - if (ilflag) > - respec('i', subopts, I_LOG); > if (ipflag) > conflict('i', subopts, I_PERBLOCK, > I_LOG); > @@ -1767,18 +1761,14 @@ main( > ilflag = 1; > break; > case I_MAXPCT: > - if (imflag) > - respec('i', subopts, I_MAXPCT); > - imaxpct = getnum_checked( > - value, &iopts, I_MAXPCT); > + imaxpct = getnum_checked(value, &iopts, > + I_MAXPCT); > imflag = 1; > break; > case I_PERBLOCK: > if (ilflag) > conflict('i', subopts, I_LOG, > I_PERBLOCK); > - if (ipflag) > - respec('i', subopts, I_PERBLOCK); > if (isflag) > conflict('i', subopts, I_SIZE, > I_PERBLOCK); > @@ -1795,8 +1785,6 @@ main( > if (ipflag) > conflict('i', subopts, I_PERBLOCK, > I_SIZE); > - if (isflag) > - respec('i', subopts, I_SIZE); > isize = getnum_checked(value, &iopts, > I_SIZE); > if (!ispow2(isize)) > @@ -1832,8 +1820,6 @@ main( > switch (getsubopt(&p, (constpp)subopts, > &value)) { > case L_AGNUM: > - if (laflag) > - respec('l', subopts, L_AGNUM); > if (ldflag) > conflict('l', subopts, L_AGNUM, L_DEV); > logagno = getnum_checked(value, &lopts, > @@ -1855,8 +1841,6 @@ main( > if (xi.lisfile) > conflict('l', subopts, L_FILE, > L_INTERNAL); > - if (liflag) > - respec('l', subopts, L_INTERNAL); > > loginternal = getnum_checked(value, > &lopts, L_INTERNAL); > @@ -1874,8 +1858,6 @@ main( > lsuflag = 1; > break; > case L_SUNIT: > - if (lsunit) > - respec('l', subopts, L_SUNIT); > lsunit = getnum_checked(value, &lopts, > L_SUNIT); > lsunitflag = 1; > @@ -1896,10 +1878,9 @@ main( > xi.logname = value; > break; > case L_VERSION: > - if (lvflag) > - respec('l', subopts, L_VERSION); > - sb_feat.log_version = getnum_checked( > - value, &lopts, L_VERSION); > + sb_feat.log_version = > + getnum_checked(value, &lopts, > + L_VERSION); > lvflag = 1; > break; > case L_SIZE: > @@ -1911,8 +1892,6 @@ main( > lsflag = 1; > break; > case L_SECTLOG: > - if (lslflag) > - respec('l', subopts, L_SECTLOG); > if (lssflag) > conflict('l', subopts, L_SECTSIZE, > L_SECTLOG); > @@ -1974,7 +1953,6 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > sb_feat.dirftype = true; > break; > case M_FINOBT: > - sb_feat.finobtflag = true; > sb_feat.finobt = getnum_checked( > value, &mopts, M_FINOBT); > break; > @@ -1998,8 +1976,6 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > switch (getsubopt(&p, (constpp)subopts, > &value)) { > case N_LOG: > - if (nlflag) > - respec('n', subopts, N_LOG); > if (nsflag) > conflict('n', subopts, N_SIZE, > N_LOG); > @@ -2042,8 +2018,6 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > nvflag = 1; > break; > case N_FTYPE: > - if (nftype) > - respec('n', subopts, N_FTYPE); > if (sb_feat.crcs_enabled) { > fprintf(stderr, > _("cannot specify both -m crc=1 and -n ftype\n")); > @@ -2127,8 +2101,6 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > &value)) { > case S_LOG: > case S_SECTLOG: > - if (slflag || lslflag) > - respec('s', subopts, S_SECTLOG); > if (ssflag || lssflag) > conflict('s', subopts, > S_SECTSIZE, S_SECTLOG); > @@ -2340,7 +2312,7 @@ _("32 bit Project IDs always enabled on CRC enabled filesytems\n")); > * them off. > */ > if (sb_feat.finobt){ > - if (sb_feat.finobtflag) { > + if (mopts.subopt_params[M_FINOBT].seen) { > fprintf(stderr, > _("warning: finobt not supported without CRC support, disabled.\n")); > } > From sandeen@sandeen.net Thu Apr 7 14:08:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 601FF7CA0 for ; Thu, 7 Apr 2016 14:08:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 25B6D304039 for ; Thu, 7 Apr 2016 12:08:56 -0700 (PDT) X-ASG-Debug-ID: 1460056134-04cbb065b058460001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id dCFsmYpPZRuVKkYz for ; Thu, 07 Apr 2016 12:08:55 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 7928816C165 for ; Thu, 7 Apr 2016 14:08:54 -0500 (CDT) Subject: Re: [PATCH 11/19] mkfs: table based parsing for converted parameters To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 11/19] mkfs: table based parsing for converted parameters References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-12-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <5706B046.9020500@sandeen.net> Date: Thu, 7 Apr 2016 14:08:54 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: <1458818136-56043-12-git-send-email-jtulak@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: 1460056134 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28531 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > From: Dave Chinner > > CHANGE: > o Change getnum_checked type to long long to prevent int overflow > o Add description of new members in opt_params struct. > o L_SU maxval was a wrong number, fix it > > All the parameters that can be passed as block or sector sizes need > to be passed the block and sector sizes that they should be using > for conversion. For parameter parsing, it is always the same two > variables, so to make things easy just declare them as global > variables so we can avoid needing to pass them to getnum_checked(). > > We also need to mark these parameters are requiring conversion so > that we don't need to pass this information manually to > getnum_checked(). Further, some of these options are required to > have a power of 2 value, so add optional checking for that as well. > > Signed-off-by: Dave Chinner > Signed-off-by: Jan Tulak Reviewed-by: Eric Sandeen From sandeen@sandeen.net Thu Apr 7 14:15:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9E5AC7CA0 for ; Thu, 7 Apr 2016 14:15:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 66D5F8F804C for ; Thu, 7 Apr 2016 12:15:01 -0700 (PDT) X-ASG-Debug-ID: 1460056495-04cb6c24643269f0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id bTpvE65sEsDlNYqK for ; Thu, 07 Apr 2016 12:14:55 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id E481316C165 for ; Thu, 7 Apr 2016 14:14:54 -0500 (CDT) Subject: Re: [PATCH 12/19] mkfs: merge getnum To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 12/19] mkfs: merge getnum References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-13-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <5706B1AE.9080601@sandeen.net> Date: Thu, 7 Apr 2016 14:14:54 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: <1458818136-56043-13-git-send-email-jtulak@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: 1460056495 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28531 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > From: Dave Chinner > > CHANGELOG > o rename a variable to don't collide with existing local variable (and > to have a better meaning: sp -> str_end for detecting trailing garbage) > > getnum() is now only called by getnum_checked(). Move the two > together into a single getnum() function and change all the callers > back to getnum(). > > Signed-off-by: Dave Chinner > Signed-off-by: Jan Tulak This doesn't address hch's & brian's comments about 2 getnums in mkfs now, but they are both static; at this point let's just get this patchset moving & we can fix that later. Reviewed-by: Eric Sandeen > --- > include/xfs_multidisk.h | 4 +- > mkfs/proto.c | 20 +++++ > mkfs/xfs_mkfs.c | 213 ++++++++++++++++++++++-------------------------- > 3 files changed, 119 insertions(+), 118 deletions(-) > > diff --git a/include/xfs_multidisk.h b/include/xfs_multidisk.h > index 8e81d90..850a322 100644 > --- a/include/xfs_multidisk.h > +++ b/include/xfs_multidisk.h > @@ -57,8 +57,8 @@ > #define XFS_NOMULTIDISK_AGLOG 2 /* 4 AGs */ > #define XFS_MULTIDISK_AGCOUNT (1 << XFS_MULTIDISK_AGLOG) > > -extern long long getnum(const char *str, unsigned int blocksize, > - unsigned int sectorsize, bool convert); > +extern long long cvtnum(unsigned int blksize, unsigned int sectsize, > + const char *str); > > /* proto.c */ > extern char *setup_proto (char *fname); > diff --git a/mkfs/proto.c b/mkfs/proto.c > index 5930af8..3d3a8dc 100644 > --- a/mkfs/proto.c > +++ b/mkfs/proto.c > @@ -43,6 +43,26 @@ static long filesize(int fd); > ((uint)(MKFS_BLOCKRES_INODE + XFS_DA_NODE_MAXDEPTH + \ > (XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) - 1) + (rb))) > > +static long long > +getnum( > + const char *str, > + unsigned int blksize, > + unsigned int sectsize, > + bool convert) > +{ > + long long i; > + char *sp; > + > + if (convert) > + return cvtnum(blksize, sectsize, str); > + > + i = strtoll(str, &sp, 0); > + if (i == 0 && sp == str) > + return -1LL; > + if (*sp != '\0') > + return -1LL; /* trailing garbage */ > + return i; > +} > > char * > setup_proto( > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index acf420f..1f06110 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c > @@ -45,9 +45,6 @@ static void respec(char opt, char *tab[], int idx); > static void unknown(char opt, char *s); > static int ispow2(unsigned int i); > > -static long long cvtnum(unsigned int blocksize, > - unsigned int sectorsize, const char *s); > - > /* > * The configured block and sector sizes are defined as global variables so > * that they don't need to be passed to functions that require them. > @@ -1380,27 +1377,6 @@ sb_set_features( > > } > > -long long > -getnum( > - const char *str, > - unsigned int blksize, > - unsigned int sectsize, > - bool convert) > -{ > - long long i; > - char *sp; > - > - if (convert) > - return cvtnum(blksize, sectsize, str); > - > - i = strtoll(str, &sp, 0); > - if (i == 0 && sp == str) > - return -1LL; > - if (*sp != '\0') > - return -1LL; /* trailing garbage */ > - return i; > -} > - > static __attribute__((noreturn)) void > illegal_option( > const char *value, > @@ -1414,7 +1390,7 @@ illegal_option( > } > > static long long > -getnum_checked( > +getnum( > const char *str, > struct opt_params *opts, > int index) > @@ -1434,6 +1410,7 @@ getnum_checked( > respec(opts->name, (char **)opts->subopts, index); > sp->seen = true; > > + /* empty strings might just return a default value */ > if (!str || *str == '\0') { > if (sp->defaultval == SUBOPT_NEEDS_VAL) > reqval(opts->name, (char **)opts->subopts, index); > @@ -1448,7 +1425,25 @@ getnum_checked( > exit(1); > } > > - c = getnum(str, blocksize, sectorsize, sp->convert); > + /* > + * Some values are pure numbers, others can have suffixes that define > + * the units of the number. Those get passed to cvtnum(), otherwise we > + * convert it ourselves to guarantee there is no trailing garbage in the > + * number. > + */ > + if (sp->convert) > + c = cvtnum(blocksize, sectorsize, str); > + else { > + char *str_end; > + > + c = strtoll(str, &str_end, 0); > + if (c == 0 && str_end == str) > + illegal_option(str, opts, index); > + if (*str_end != '\0') > + illegal_option(str, opts, index); > + } > + > + /* Validity check the result. */ > if (c < sp->minval || c > sp->maxval) > illegal_option(str, opts, index); > if (sp->is_power_2 && !ispow2(c)) > @@ -1615,8 +1610,7 @@ main( > if (bsflag) > conflict('b', subopts, B_SIZE, > B_LOG); > - blocklog = getnum_checked(value, &bopts, > - B_LOG); > + blocklog = getnum(value, &bopts, B_LOG); > blocksize = 1 << blocklog; > blflag = 1; > break; > @@ -1624,8 +1618,8 @@ main( > if (blflag) > conflict('b', subopts, B_LOG, > B_SIZE); > - blocksize = getnum_checked(value, &bopts, > - B_SIZE); > + blocksize = getnum(value, &bopts, > + B_SIZE); > blocklog = libxfs_highbit32(blocksize); > bsflag = 1; > break; > @@ -1643,18 +1637,17 @@ main( > switch (getsubopt(&p, (constpp)subopts, > &value)) { > case D_AGCOUNT: > - agcount = getnum_checked(value, &dopts, > - D_AGCOUNT); > + agcount = getnum(value, &dopts, > + D_AGCOUNT); > daflag = 1; > break; > case D_AGSIZE: > - agsize = getnum_checked(value, &dopts, > - D_AGSIZE); > + agsize = getnum(value, &dopts, D_AGSIZE); > dasize = 1; > break; > case D_FILE: > - xi.disfile = getnum_checked(value, > - &dopts, D_FILE); > + xi.disfile = getnum(value, &dopts, > + D_FILE); > if (xi.disfile && !Nflag) > xi.dcreat = 1; > break; > @@ -1676,33 +1669,30 @@ main( > if (nodsflag) > conflict('d', subopts, D_NOALIGN, > D_SUNIT); > - dsunit = getnum_checked(value, &dopts, > - D_SUNIT); > + dsunit = getnum(value, &dopts, D_SUNIT); > break; > case D_SWIDTH: > if (nodsflag) > conflict('d', subopts, D_NOALIGN, > D_SWIDTH); > - dswidth = getnum_checked(value, &dopts, > - D_SWIDTH); > + dswidth = getnum(value, &dopts, > + D_SWIDTH); > break; > case D_SU: > if (nodsflag) > conflict('d', subopts, D_NOALIGN, > D_SU); > - dsu = getnum_checked(value, &dopts, > - D_SU); > + dsu = getnum(value, &dopts, D_SU); > break; > case D_SW: > if (nodsflag) > conflict('d', subopts, D_NOALIGN, > D_SW); > - dsw = getnum_checked(value, &dopts, > - D_SW); > + dsw = getnum(value, &dopts, D_SW); > break; > case D_NOALIGN: > - nodsflag = getnum_checked(value, > - &dopts, D_NOALIGN); > + nodsflag = getnum(value, &dopts, > + D_NOALIGN); > if (nodsflag) { > if (dsu) > conflict('d', subopts, D_SU, > @@ -1722,8 +1712,8 @@ main( > if (ssflag) > conflict('d', subopts, D_SECTSIZE, > D_SECTLOG); > - sectorlog = getnum_checked(value, &dopts, > - D_SECTLOG); > + sectorlog = getnum(value, &dopts, > + D_SECTLOG); > sectorsize = 1 << sectorlog; > slflag = 1; > break; > @@ -1731,28 +1721,27 @@ main( > if (slflag) > conflict('d', subopts, D_SECTLOG, > D_SECTSIZE); > - sectorsize = getnum_checked(value, > - &dopts, D_SECTSIZE); > + sectorsize = getnum(value, &dopts, > + D_SECTSIZE); > sectorlog = > libxfs_highbit32(sectorsize); > ssflag = 1; > break; > case D_RTINHERIT: > - c = getnum_checked(value, &dopts, > - D_RTINHERIT); > + c = getnum(value, &dopts, D_RTINHERIT); > if (c) > fsx.fsx_xflags |= > XFS_DIFLAG_RTINHERIT; > break; > case D_PROJINHERIT: > - fsx.fsx_projid = getnum_checked(value, > - &dopts, D_PROJINHERIT); > + fsx.fsx_projid = getnum(value, &dopts, > + D_PROJINHERIT); > fsx.fsx_xflags |= > XFS_DIFLAG_PROJINHERIT; > break; > case D_EXTSZINHERIT: > - fsx.fsx_extsize = getnum_checked(value, > - &dopts, D_EXTSZINHERIT); > + fsx.fsx_extsize = getnum(value, &dopts, > + D_EXTSZINHERIT); > fsx.fsx_xflags |= > XFS_DIFLAG_EXTSZINHERIT; > break; > @@ -1770,8 +1759,8 @@ main( > switch (getsubopt(&p, (constpp)subopts, > &value)) { > case I_ALIGN: > - sb_feat.inode_align = getnum_checked( > - value, &iopts, I_ALIGN); > + sb_feat.inode_align = getnum(value, > + &iopts, I_ALIGN); > break; > case I_LOG: > if (ipflag) > @@ -1780,14 +1769,13 @@ main( > if (isflag) > conflict('i', subopts, I_SIZE, > I_LOG); > - inodelog = getnum_checked(value, &iopts, > - I_LOG); > + inodelog = getnum(value, &iopts, I_LOG); > isize = 1 << inodelog; > ilflag = 1; > break; > case I_MAXPCT: > - imaxpct = getnum_checked(value, &iopts, > - I_MAXPCT); > + imaxpct = getnum(value, &iopts, > + I_MAXPCT); > imflag = 1; > break; > case I_PERBLOCK: > @@ -1797,8 +1785,8 @@ main( > if (isflag) > conflict('i', subopts, I_SIZE, > I_PERBLOCK); > - inopblock = getnum_checked(value, &iopts, > - I_PERBLOCK); > + inopblock = getnum(value, &iopts, > + I_PERBLOCK); > ipflag = 1; > break; > case I_SIZE: > @@ -1808,23 +1796,22 @@ main( > if (ipflag) > conflict('i', subopts, I_PERBLOCK, > I_SIZE); > - isize = getnum_checked(value, &iopts, > - I_SIZE); > + isize = getnum(value, &iopts, I_SIZE); > inodelog = libxfs_highbit32(isize); > isflag = 1; > break; > case I_ATTR: > - sb_feat.attr_version = getnum_checked( > - value, &iopts, I_ATTR); > + sb_feat.attr_version = > + getnum(value, &iopts, I_ATTR); > break; > case I_PROJID32BIT: > sb_feat.projid16bit = > - !getnum_checked(value, &iopts, > - I_PROJID32BIT); > + !getnum(value, &iopts, > + I_PROJID32BIT); > break; > case I_SPINODES: > sb_feat.spinodes = > - getnum_checked(value, &iopts, > + getnum(value, &iopts, > I_SPINODES); > break; > default: > @@ -1843,13 +1830,12 @@ main( > case L_AGNUM: > if (ldflag) > conflict('l', subopts, L_AGNUM, L_DEV); > - logagno = getnum_checked(value, &lopts, > - L_AGNUM); > + logagno = getnum(value, &lopts, L_AGNUM); > laflag = 1; > break; > case L_FILE: > - xi.lisfile = getnum_checked(value, > - &lopts, L_FILE); > + xi.lisfile = getnum(value, &lopts, > + L_FILE); > if (xi.lisfile && loginternal) > conflict('l', subopts, L_INTERNAL, > L_FILE); > @@ -1863,18 +1849,16 @@ main( > conflict('l', subopts, L_FILE, > L_INTERNAL); > > - loginternal = getnum_checked(value, > - &lopts, L_INTERNAL); > + loginternal = getnum(value, &lopts, > + L_INTERNAL); > liflag = 1; > break; > case L_SU: > - lsu = getnum_checked(value, &lopts, > - L_SU); > + lsu = getnum(value, &lopts, L_SU); > lsuflag = 1; > break; > case L_SUNIT: > - lsunit = getnum_checked(value, &lopts, > - L_SUNIT); > + lsunit = getnum(value, &lopts, L_SUNIT); > lsunitflag = 1; > break; > case L_NAME: > @@ -1894,8 +1878,7 @@ main( > break; > case L_VERSION: > sb_feat.log_version = > - getnum_checked(value, &lopts, > - L_VERSION); > + getnum(value, &lopts, L_VERSION); > lvflag = 1; > break; > case L_SIZE: > @@ -1910,8 +1893,8 @@ main( > if (lssflag) > conflict('l', subopts, L_SECTSIZE, > L_SECTLOG); > - lsectorlog = getnum_checked(value, > - &lopts, L_SECTLOG); > + lsectorlog = getnum(value, &lopts, > + L_SECTLOG); > lsectorsize = 1 << lsectorlog; > lslflag = 1; > break; > @@ -1919,15 +1902,15 @@ main( > if (lslflag) > conflict('l', subopts, L_SECTLOG, > L_SECTSIZE); > - lsectorsize = getnum_checked(value, > - &lopts, L_SECTSIZE); > + lsectorsize = getnum(value, &lopts, > + L_SECTSIZE); > lsectorlog = > libxfs_highbit32(lsectorsize); > lssflag = 1; > break; > case L_LAZYSBCNTR: > sb_feat.lazy_sb_counters = > - getnum_checked(value, &lopts, > + getnum(value, &lopts, > L_LAZYSBCNTR); > break; > default: > @@ -1950,8 +1933,7 @@ main( > &value)) { > case M_CRC: > sb_feat.crcs_enabled = > - getnum_checked(value, &mopts, > - M_CRC); > + getnum(value, &mopts, M_CRC); > if (sb_feat.crcs_enabled && nftype) { > fprintf(stderr, > _("cannot specify both -m crc=1 and -n ftype\n")); > @@ -1961,7 +1943,7 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > sb_feat.dirftype = true; > break; > case M_FINOBT: > - sb_feat.finobt = getnum_checked( > + sb_feat.finobt = getnum( > value, &mopts, M_FINOBT); > break; > case M_UUID: > @@ -1987,8 +1969,8 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > if (nsflag) > conflict('n', subopts, N_SIZE, > N_LOG); > - dirblocklog = getnum_checked(value, > - &nopts, N_LOG); > + dirblocklog = getnum(value, &nopts, > + N_LOG); > dirblocksize = 1 << dirblocklog; > nlflag = 1; > break; > @@ -1996,8 +1978,8 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > if (nlflag) > conflict('n', subopts, N_LOG, > N_SIZE); > - dirblocksize = getnum_checked(value, > - &nopts, N_SIZE); > + dirblocksize = getnum(value, &nopts, > + N_SIZE); > dirblocklog = > libxfs_highbit32(dirblocksize); > nsflag = 1; > @@ -2012,9 +1994,8 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > sb_feat.nci = true; > } else { > sb_feat.dir_version = > - getnum_checked(value, > - &nopts, > - N_VERSION); > + getnum(value, &nopts, > + N_VERSION); > } > nvflag = 1; > break; > @@ -2024,8 +2005,8 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > _("cannot specify both -m crc=1 and -n ftype\n")); > usage(); > } > - sb_feat.dirftype = getnum_checked(value, > - &nopts, N_FTYPE); > + sb_feat.dirftype = getnum(value, &nopts, > + N_FTYPE); > nftype = 1; > break; > default: > @@ -2063,8 +2044,8 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > rtextsize = value; > break; > case R_FILE: > - xi.risfile = getnum_checked(value, > - &ropts, R_FILE); > + xi.risfile = getnum(value, &ropts, > + R_FILE); > if (xi.risfile) > xi.rcreat = 1; > break; > @@ -2084,8 +2065,8 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > rtsize = value; > break; > case R_NOALIGN: > - norsflag = getnum_checked(value, > - &ropts, R_NOALIGN); > + norsflag = getnum(value, &ropts, > + R_NOALIGN); > break; > default: > unknown('r', value); > @@ -2105,8 +2086,8 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > if (ssflag || lssflag) > conflict('s', subopts, > S_SECTSIZE, S_SECTLOG); > - sectorlog = getnum_checked(value, &sopts, > - S_SECTLOG); > + sectorlog = getnum(value, &sopts, > + S_SECTLOG); > lsectorlog = sectorlog; > sectorsize = 1 << sectorlog; > lsectorsize = sectorsize; > @@ -2117,8 +2098,8 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > if (slflag || lslflag) > conflict('s', subopts, S_SECTLOG, > S_SECTSIZE); > - sectorsize = getnum_checked(value, > - &sopts, S_SECTSIZE); > + sectorsize = getnum(value, &sopts, > + S_SECTSIZE); > lsectorsize = sectorsize; > sectorlog = > libxfs_highbit32(sectorsize); > @@ -2349,7 +2330,7 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); > if (dsize) { > __uint64_t dbytes; > > - dbytes = getnum_checked(dsize, &dopts, D_SIZE); > + dbytes = getnum(dsize, &dopts, D_SIZE); > if (dbytes % XFS_MIN_BLOCKSIZE) { > fprintf(stderr, > _("illegal data length %lld, not a multiple of %d\n"), > @@ -2386,7 +2367,7 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); > if (logsize) { > __uint64_t logbytes; > > - logbytes = getnum_checked(logsize, &lopts, L_SIZE); > + logbytes = getnum(logsize, &lopts, L_SIZE); > if (logbytes % XFS_MIN_BLOCKSIZE) { > fprintf(stderr, > _("illegal log length %lld, not a multiple of %d\n"), > @@ -2408,7 +2389,7 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); > if (rtsize) { > __uint64_t rtbytes; > > - rtbytes = getnum_checked(rtsize, &ropts, R_SIZE); > + rtbytes = getnum(rtsize, &ropts, R_SIZE); > if (rtbytes % XFS_MIN_BLOCKSIZE) { > fprintf(stderr, > _("illegal rt length %lld, not a multiple of %d\n"), > @@ -2428,7 +2409,7 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); > if (rtextsize) { > __uint64_t rtextbytes; > > - rtextbytes = getnum_checked(rtextsize, &ropts, R_EXTSIZE); > + rtextbytes = getnum(rtextsize, &ropts, R_EXTSIZE); > if (rtextbytes % blocksize) { > fprintf(stderr, > _("illegal rt extent size %lld, not a multiple of %d\n"), > @@ -3531,8 +3512,8 @@ unknown( > > long long > cvtnum( > - unsigned int blocksize, > - unsigned int sectorsize, > + unsigned int blksize, > + unsigned int sectsize, > const char *s) > { > long long i; > @@ -3545,9 +3526,9 @@ cvtnum( > return i; > > if (*sp == 'b' && sp[1] == '\0') > - return i * blocksize; > + return i * blksize; > if (*sp == 's' && sp[1] == '\0') > - return i * sectorsize; > + return i * sectsize; > > if (*sp == 'k' && sp[1] == '\0') > return 1024LL * i; > From john_simpson@reyrey.com Thu Apr 7 15:17:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 396187CA0 for ; Thu, 7 Apr 2016 15:17:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0A78E304032 for ; Thu, 7 Apr 2016 13:17:00 -0700 (PDT) X-ASG-Debug-ID: 1460060217-04cb6c2464328e50001-NocioJ Received: from dayis01iron01.ad.reyrey.com ([192.112.245.69]) by cuda.sgi.com with ESMTP id rZ55BDrcp9aXQ7LU (version=TLSv1.2 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 07 Apr 2016 13:16:57 -0700 (PDT) X-Barracuda-Envelope-From: john_simpson@reyrey.com X-Barracuda-Apparent-Source-IP: 192.112.245.69 Received: from hc03.myoffice-test.reyrey.com (HELO IS-EXHC03-RP.ad.reyrey.com) ([168.207.82.35]) by dayis01iron01.ad.reyrey.com with ESMTP; 07 Apr 2016 16:16:57 -0400 Received: from is-exmb07-rp.ad.reyrey.com ([2002:a8cf:5237::a8cf:5237]) by IS-EXHC03-RP.ad.reyrey.com ([2002:a8cf:5223::a8cf:5223]) with mapi; Thu, 7 Apr 2016 16:16:56 -0400 From: "Simpson, John R" To: "xfs@oss.sgi.com" Date: Thu, 7 Apr 2016 16:16:55 -0400 Subject: Determining whether stripe unit and stripe size were detected correctly Thread-Topic: Determining whether stripe unit and stripe size were detected correctly X-ASG-Orig-Subj: Determining whether stripe unit and stripe size were detected correctly Thread-Index: AdGRCm44s2vJERfJS92avPOrEfOTWQ== Message-ID: <5BDD118B6525E24D82051EDA520EB5FC0105339D@IS-EXMB07-RP.ad.reyrey.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US Content-Type: multipart/alternative; boundary="_000_5BDD118B6525E24D82051EDA520EB5FC0105339DISEXMB07RPadrey_" MIME-Version: 1.0 X-Barracuda-Connect: UNKNOWN[192.112.245.69] X-Barracuda-Start-Time: 1460060217 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.12 X-Barracuda-Spam-Status: No, SCORE=0.12 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, RDNS_NONE, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28532 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS --_000_5BDD118B6525E24D82051EDA520EB5FC0105339DISEXMB07RPadrey_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Greetings, I'm in the process of tracking down lower than expected per= formance and occasional blocked tasks on some internal file servers with XF= S datastores. Several sources have pointed out the importance of using the= correct stripe unit and stripe size when formatting and mounting XFS files= ystems, and that XFS can detect these values for some, but not all, hardwar= e RAID controllers. The servers in question are PowerEdge R510b servers wi= th PERC H700 controllers. Datastores are RAID5 with a 128K stripe. Is there any way to determine if the stripe unit and stripe= size were detected correctly? These values were not specified when the fi= lesystems were formatted or mounted. If they were not detected, is there a= ny way to determine them programmatically? If this is not the correct forum for this question please p= oint me in the right direction. Best regards, John Simpson Format command: mkfs.xfs /dev/sdb1 Fstab entry: /dev/sdb1 /DS01 xfs defaults,logbufs=3D8 1 2 # uname -a Linux reyqa-ribs001 2.6.32-573.12.1.el6.x86_64 #1 SMP Tue Dec 15 21:19:08 U= TC 2015 x86_64 x86_64 x86_64 GNU/Linux # cat /etc/redhat-release CentOS release 6.7 (Final) # rpm -qi xfsprogs Name : xfsprogs Relocations: (not relocatable) Version : 3.1.1 Vendor: CentOS Release : 16.el6 Build Date: Wed 15 Oct 2014 10:= 16:05 AM EDT Install Date: Wed 25 Feb 2015 11:46:11 AM EST Build Host: c6b8.bsys.de= v.centos.org Group : System Environment/Base Source RPM: xfsprogs-3.1.1-16.e= l6.src.rpm Size : 3325667 License: GPL+ and LGPLv2+ Signature : RSA/SHA1, Fri 17 Oct 2014 04:00:19 PM EDT, Key ID 0946fca2c10= 5b9de Packager : CentOS BuildSystem URL : http://oss.sgi.com/projects/xfs/ Summary : Utilities for managing the XFS filesystem Description : A set of commands to use the XFS filesystem, including mkfs.xfs. XFS is a high performance journaling filesystem which originated on the SGI IRIX platform. It is completely multi-threaded, can support large files and large filesystems, extended attributes, variable block sizes, is extent based, and makes extensive use of Btrees (directories, extents, free space) to aid both performance and scalability. Refer to the documentation at http://oss.sgi.com/projects/xfs/ for complete details. This implementation is on-disk compatible with the IRIX version of XFS. # xfs_info /DS01 meta-data=3D/dev/sdb1 isize=3D256 agcount=3D5, agsize=3D268= 435455 blks =3D sectsz=3D512 attr=3D2, projid32bit=3D0 data =3D bsize=3D4096 blocks=3D1212415488, imax= pct=3D5 =3D sunit=3D0 swidth=3D0 blks naming =3Dversion 2 bsize=3D4096 ascii-ci=3D0 log =3Dinternal bsize=3D4096 blocks=3D521728, version= =3D2 =3D sectsz=3D512 sunit=3D0 blks, lazy-coun= t=3D1 realtime =3Dnone extsz=3D4096 blocks=3D0, rtextents=3D0 John Simpson --_000_5BDD118B6525E24D82051EDA520EB5FC0105339DISEXMB07RPadrey_ Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

    Greetings,<= /o:p>

     

    &nb= sp;            =    I’m in the process of tracking down lower than expected = performance and occasional blocked tasks on some internal file servers with= XFS datastores.  Several sources have pointed out the importance of u= sing the correct stripe unit and stripe size when formatting and mounting X= FS filesystems, and that XFS can detect these values for some, but not all,= hardware RAID controllers.  The servers in question are PowerEdge R51= 0b servers with PERC H700 controllers.  Datastores are RAID5 with a 12= 8K stripe.

     

              &n= bsp;     Is there any way to determine if the stripe un= it and stripe size were detected correctly?  These values were not spe= cified when the filesystems were formatted or mounted.  If they were n= ot detected, is there any way to determine them programmatically?

     

     &= nbsp;           &nbs= p;  If this is not the correct forum for this question please point me= in the right direction.

     

    Best regards,

     

    John Simpson

     

    Format command: m= kfs.xfs /dev/sdb1

    Fstab entry: /dev/sdb1=        /DS01   xfs   = ;  defaults,logbufs=3D8      1 2

     

    # uname -a

    Linux reyqa-ribs001 2.6.32-573.12= .1.el6.x86_64 #1 SMP Tue Dec 15 21:19:08 UTC 2015 x86_64 x86_64 x86_64 GNU/= Linux

     

    # cat /etc/redhat-release

    CentOS release 6.7 (Fina= l)

     

    # rpm -qi xfsprogs

    Name     =    : xfsprogs        &nbs= p;            Reloca= tions: (not relocatable)

    Version     : 3.1.1 &= nbsp;           &nbs= p;            &= nbsp;  Vendor: CentOS

    Release     : 16.el6&nbs= p;            &= nbsp;          Build Date: Wed= 15 Oct 2014 10:16:05 AM EDT

    Install Date: Wed 25 Feb 2015 11:46:11 AM = EST      Build Host: c6b8.bsys.dev.centos.org=

    = Group       : System Environment/Base &n= bsp;     Source RPM: xfsprogs-3.1.1-16.el6.src.rpm=

    = Size        : 3325667   &= nbsp;           &nbs= p;          License: GPL+ and = LGPLv2+

    Signature   : RSA/SHA1, Fri 17 Oct 2014 04:00:19 PM E= DT, Key ID 0946fca2c105b9de

    Packager    : CentOS BuildSy= stem <http://bugs.centos.org>

    URL     &n= bsp;   : http://oss.sgi.com/projects/xfs/

    Summary  =    : Utilities for managing the XFS filesystem<= /p>

    Description :<= o:p>

    A set of commands to use the XFS filesystem, including mkfs.xfs.

     

    XFS is a high performance journaling filesystem which originated

    on the SGI IRIX platform.  It is completely multi-threaded, can

    support large files and large filesystems, extended attributes,=

    variab= le block sizes, is extent based, and makes extensive use of

    Btrees (dir= ectories, extents, free space) to aid both performance

    and scalability.=

     

    Refer to the documentation at http://oss.sgi.com/projects/x= fs/

    for complete details.  This implementation is on-disk compatib= le

    with the IRIX version of XFS.

     

    # xfs_info /DS01

    me= ta-data=3D/dev/sdb1         &n= bsp;    isize=3D256    agcount=3D5, agsize=3D= 268435455 blks

             =3D&nbs= p;            &= nbsp;         sectsz=3D512 &nb= sp; attr=3D2, projid32bit=3D0

    data     =3D &nb= sp;            =          bsize=3D4096   b= locks=3D1212415488, imaxpct=3D5

    <= span style=3D'font-family:Consolas'>       &n= bsp; =3D          &n= bsp;            suni= t=3D0      swidth=3D0 blks

    naming   = =3Dversion 2          &nb= sp;   bsize=3D4096   ascii-ci=3D0

    =

    log  &n= bsp;   =3Dinternal        = ;       bsize=3D4096   blocks=3D521= 728, version=3D2

             =3D&n= bsp;            = ;          sectsz=3D512 &= nbsp; sunit=3D0 blks, lazy-count=3D1

    realtime =3Dnone   =             &nb= sp;   extsz=3D4096   blocks=3D0, rtextents=3D0

     

    John Sim= pson 

    = --_000_5BDD118B6525E24D82051EDA520EB5FC0105339DISEXMB07RPadrey_-- From sandeen@sandeen.net Thu Apr 7 15:21:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D6B8B7CA1 for ; Thu, 7 Apr 2016 15:21:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4D07BAC002 for ; Thu, 7 Apr 2016 13:21:54 -0700 (PDT) X-ASG-Debug-ID: 1460060507-04bdf011022eee90001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id cvBRD9GhTTB5hmZC for ; Thu, 07 Apr 2016 13:21:48 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 1A705142D for ; Thu, 7 Apr 2016 15:21:43 -0500 (CDT) Subject: Re: Determining whether stripe unit and stripe size were detected correctly To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Determining whether stripe unit and stripe size were detected correctly References: <5BDD118B6525E24D82051EDA520EB5FC0105339D@IS-EXMB07-RP.ad.reyrey.com> From: Eric Sandeen Message-ID: <5706C157.5070400@sandeen.net> Date: Thu, 7 Apr 2016 15:21:43 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: <5BDD118B6525E24D82051EDA520EB5FC0105339D@IS-EXMB07-RP.ad.reyrey.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: 1460060507 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28532 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/7/16 3:16 PM, Simpson, John R wrote: > Greetings, > > > > I’m in the process of tracking down lower than expected performance and occasional blocked tasks on some internal file servers with XFS datastores. Several sources have pointed out the importance of using the correct stripe unit and stripe size when formatting and mounting XFS filesystems, and that XFS can detect these values for some, but not all, hardware RAID controllers. The servers in question are PowerEdge R510b servers with PERC H700 controllers. Datastores are RAID5 with a 128K stripe. > Is there any way to determine if the stripe unit and stripe size were detected correctly? These values were not specified when the filesystems were formatted or mounted. If they were not detected, is there any way to determine them programmatically? > If this is not the correct forum for this question please point me in the right direction. > > > > Best regards, > # xfs_info /DS01 > > meta-data=/dev/sdb1 isize=256 agcount=5, agsize=268435455 blks > = sectsz=512 attr=2, projid32bit=0 > data = bsize=4096 blocks=1212415488, imaxpct=5 > = sunit=0 swidth=0 blks sunit == swidth == 0, so no geometry is present on this filesystem. > naming =version 2 bsize=4096 ascii-ci=0 > log =internal bsize=4096 blocks=521728, version=2 > = sectsz=512 sunit=0 blks, lazy-count=1 > realtime =none extsz=4096 blocks=0, rtextents=0 mkfs.xfs uses values exported by the block device, and can be seen by using blockdev to query them, i.e. blockdev --getiomin --getioopt /dev/sdb1 If it returns 0, no geometry is exported by the device, and you'd need to use your own knowledge of the device to set appropriate values (and to properly partition on aligned boundaries as well) -Eric From john_simpson@reyrey.com Thu Apr 7 15:49:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E4EFD7CA0 for ; Thu, 7 Apr 2016 15:49:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9479E30404E for ; Thu, 7 Apr 2016 13:49:23 -0700 (PDT) X-ASG-Debug-ID: 1460062160-04cbb065ac5bef0001-NocioJ Received: from dayis01iron02.ad.reyrey.com ([192.112.245.73]) by cuda.sgi.com with ESMTP id BzIgeGIiqVCAiijj (version=TLSv1.2 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 07 Apr 2016 13:49:21 -0700 (PDT) X-Barracuda-Envelope-From: john_simpson@reyrey.com X-Barracuda-Apparent-Source-IP: 192.112.245.73 Received: from is-exhc03-rp.ad.reyrey.com ([168.207.82.35]) by dayis01iron02.ad.reyrey.com with ESMTP; 07 Apr 2016 16:49:20 -0400 Received: from is-exmb07-rp.ad.reyrey.com ([2002:a8cf:5237::a8cf:5237]) by IS-EXHC03-RP.ad.reyrey.com ([2002:a8cf:5223::a8cf:5223]) with mapi; Thu, 7 Apr 2016 16:49:11 -0400 From: "Simpson, John R" To: Eric Sandeen , "xfs@oss.sgi.com" Date: Thu, 7 Apr 2016 16:49:10 -0400 Subject: RE: Determining whether stripe unit and stripe size were detected correctly Thread-Topic: Determining whether stripe unit and stripe size were detected correctly X-ASG-Orig-Subj: RE: Determining whether stripe unit and stripe size were detected correctly Thread-Index: AdGRCyVB26CFlu8OTkaVw4WcVNIqIQAAXq6Q Message-ID: <5BDD118B6525E24D82051EDA520EB5FC010533AE@IS-EXMB07-RP.ad.reyrey.com> References: <5BDD118B6525E24D82051EDA520EB5FC0105339D@IS-EXMB07-RP.ad.reyrey.com> <5706C157.5070400@sandeen.net> In-Reply-To: <5706C157.5070400@sandeen.net> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Barracuda-Connect: UNKNOWN[192.112.245.73] X-Barracuda-Start-Time: 1460062161 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.12 X-Barracuda-Spam-Status: No, SCORE=0.12 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28533 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > -----Original Message----- > From: xfs-bounces@oss.sgi.com [mailto:xfs-bounces@oss.sgi.com] On Behalf > Of Eric Sandeen > Sent: Thursday, April 07, 2016 4:22 PM > To: xfs@oss.sgi.com > Subject: Re: Determining whether stripe unit and stripe size were > detected correctly >=20 >=20 >=20 > On 4/7/16 3:16 PM, Simpson, John R wrote: > > Greetings, > > > > > > > > I'm in the process of tracking down lower than > expected performance and occasional blocked tasks on some internal file > servers with XFS datastores. Several sources have pointed out the > importance of using the correct stripe unit and stripe size when > formatting and mounting XFS filesystems, and that XFS can detect these > values for some, but not all, hardware RAID controllers. The servers in > question are PowerEdge R510b servers with PERC H700 controllers. > Datastores are RAID5 with a 128K stripe. > > Is there any way to determine if the stripe unit and > stripe size were detected correctly? These values were not specified > when the filesystems were formatted or mounted. If they were not > detected, is there any way to determine them programmatically? > > If this is not the correct forum for this question > please point me in the right direction. > > > > > > > > Best regards, >=20 > > # xfs_info /DS01 > > > > meta-data=3D/dev/sdb1 isize=3D256 agcount=3D5, > agsize=3D268435455 blks > > =3D sectsz=3D512 attr=3D2, projid32bit= =3D0 > > data =3D bsize=3D4096 blocks=3D1212415488, > imaxpct=3D5 > > =3D sunit=3D0 swidth=3D0 blks >=20 > sunit =3D=3D swidth =3D=3D 0, so no geometry is present on this filesyste= m. >=20 > > naming =3Dversion 2 bsize=3D4096 ascii-ci=3D0 > > log =3Dinternal bsize=3D4096 blocks=3D521728, vers= ion=3D2 > > =3D sectsz=3D512 sunit=3D0 blks, lazy- > count=3D1 > > realtime =3Dnone extsz=3D4096 blocks=3D0, rtextents= =3D0 >=20 > mkfs.xfs uses values exported by the block device, and can be seen by > using blockdev to query them, i.e. >=20 > blockdev --getiomin --getioopt /dev/sdb1 >=20 > If it returns 0, no geometry is exported by the device, and you'd need > to use your own knowledge of the device to set appropriate values (and > to properly partition on aligned boundaries as well) >=20 > -Eric >=20 Thank you, I was hoping sunit =3D=3D swidth =3D=3D 0 meant 'auto-detected' = but suspected that wasn't the case. It looks like blockdev is reporting 0 = for getioopt so we'll have to calculate and supply sunit and swidth. I bel= ieve the partition is properly aligned, I used the following. Any suggeste= d improvements are appreciated. parted --align optimal --script $device mklabel gpt mkpart -- primary 1 -1 Blockdev reports: # blockdev --getiomin --getioopt /dev/sdb1 512 0 Is there a way, other than testing, to determine the potential performance = improvement gained by providing the geometry? John > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Thu Apr 7 16:32:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id ADCD87CA1 for ; Thu, 7 Apr 2016 16:32:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 836C88F8049 for ; Thu, 7 Apr 2016 14:32:36 -0700 (PDT) X-ASG-Debug-ID: 1460064753-04cbb065b05ea20001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 9sM7f7gKWKXdiZl1 for ; Thu, 07 Apr 2016 14:32:33 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AvEQB00AZXPDGaLHldgzeBUIZrn0MBAQEBAQEGjBGFaIQQhgcCAgEBAoE9TQEBAQEBAQcBAQEBQkCEQQEBAQMBOhwjBQsIAw4KCSUPBSUDBxoTiB8HwiEBAQEBBgEBAQEcGYVAhROHaoIrBY1OijaOAo8YjySEWyowiTkBAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail04.adl6.internode.on.net with ESMTP; 08 Apr 2016 07:02:32 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aoHXT-0008Gv-Co; Fri, 08 Apr 2016 07:32:31 +1000 Date: Fri, 8 Apr 2016 07:32:31 +1000 From: Dave Chinner To: Eryu Guan Cc: fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs/259: handle minimum block size more precisely Message-ID: <20160407213231.GD761@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs/259: handle minimum block size more precisely References: <1460027155-4222-1-git-send-email-eguan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460027155-4222-1-git-send-email-eguan@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1460064753 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28534 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Apr 07, 2016 at 07:05:55PM +0800, Eryu Guan wrote: > Currently xfs/259 checks $TEST_DIR for CRC support status to determine > if 512 block size should be tested. But this doesn't always work. For > example, when TEST_DEV is mkfs'ed with "-m crc=0" mkfs option, using > mkfs.xfs binary with CRC being the default. > > What should be really checked is whether mkfs.xfs creates CRC enabled > XFS by default. So introduce a new flag XFS_MKFS_CRC_DEFAULT for this > purpose, and do the check based on it in xfs/259. > > Signed-off-by: Eryu Guan > --- > > This is actually the second attempt to fix this issue, because Christoph was > not satisfied with the first attempt, and me either (after thinking about it > more :-)). Hope it works this time. > > common/config | 8 ++++++++ > tests/xfs/259 | 4 +--- > 2 files changed, 9 insertions(+), 3 deletions(-) > > diff --git a/common/config b/common/config > index cacd815..13bd307 100644 > --- a/common/config > +++ b/common/config > @@ -270,8 +270,16 @@ $MKFS_XFS_PROG -N -d file,name=/tmp/crc_check.img,size=32m -m crc=0 \ > if [ $? -ne 0 ]; then > XFS_MKFS_HAS_NO_META_SUPPORT=true > fi > +# check if v5 xfs is default > +XFS_MKFS_CRC_DEFAULT=0 > +$MKFS_XFS_PROG -N -d file,name=/tmp/crc_check.img,size=32m 2>&1 | grep -q crc=1 > +if [ $? -eq 0 ]; then > + XFS_MKFS_CRC_DEFAULT=1 > +fi > rm -f /tmp/crc_check.img That tests the mkfs configuration that is applied to the scratch device.... > diff --git a/tests/xfs/259 b/tests/xfs/259 > index 16c1935..3150ff3 100755 > --- a/tests/xfs/259 > +++ b/tests/xfs/259 > @@ -51,9 +51,7 @@ testfile=$TEST_DIR/259.image > # Test various sizes slightly less than 4 TB. Need to handle different > # minimum block sizes for CRC enabled filesystems, but use a small log so we > # don't write lots of zeros unnecessarily. > -xfs_info $TEST_DIR | _filter_mkfs 2> $tmp.mkfs > /dev/null > -. $tmp.mkfs This tests the configuration of the test device, which is not controlled by the test harness, so can be different to the configuration being used for the scratch device. > -if [ $_fs_has_crcs -eq 1 ]; then > +if [ $XFS_MKFS_CRC_DEFAULT -eq 1 ]; then IOWs, this is not an not equivalent test. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Thu Apr 7 17:40:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5F0657CA1 for ; Thu, 7 Apr 2016 17:40:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 53B028F8049 for ; Thu, 7 Apr 2016 15:40:39 -0700 (PDT) X-ASG-Debug-ID: 1460068830-04bdf011032f4490001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 9889fnXFxp1UFUrb for ; Thu, 07 Apr 2016 15:40:32 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 4D0DA142D for ; Thu, 7 Apr 2016 17:40:28 -0500 (CDT) Subject: Re: [PATCH 13/19] mkfs: encode conflicts into parsing table To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 13/19] mkfs: encode conflicts into parsing table References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-14-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <5706E1DB.4040205@sandeen.net> Date: Thu, 7 Apr 2016 17:40:27 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: <1458818136-56043-14-git-send-email-jtulak@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: 1460068832 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28536 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > From: Dave Chinner > > CHANGELOG: > o Add .conflicts init where it was missing > o Add explanation of a new member of opt_params struct. > o A long line fix. > > Many options conflict, so we need to specify which options conflict > with each other in a generic manner. We already have a "seen" > variable used for respecification detection, so we can also use this > code conflict detection. Hence add a "conflicts" array to the sub > options parameter definition. > > Signed-off-by: Dave Chinner > Signed-off-by: Jan Tulak Reviewed-by: Eric Sandeen > --- > mkfs/xfs_mkfs.c | 258 +++++++++++++++++++++++++++++--------------------------- > 1 file changed, 134 insertions(+), 124 deletions(-) > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index 1f06110..d119580 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c > @@ -54,6 +54,9 @@ unsigned int sectorsize; > > #define MAX_SUBOPTS 16 > #define SUBOPT_NEEDS_VAL (-1LL) > +#define MAX_CONFLICTS 8 > +#define LAST_CONFLICT (-1) > + > /* > * Table for parsing mkfs parameters. > * > @@ -89,6 +92,11 @@ unsigned int sectorsize; > * An optional flag for subopts where the given value has to be a power > * of two. > * > + * conflicts MANDATORY > + * If your subopt is in a conflict with some other option, specify it. > + * Accepts the .index values of the conflicting subopts and the last > + * member of this list has to be LAST_CONFLICT. > + * > * minval, maxval OPTIONAL > * These options are used for automatic range check and they have to be > * always used together in pair. If you don't want to limit the max value, > @@ -118,6 +126,7 @@ struct opt_params { > bool seen; > bool convert; > bool is_power_2; > + int conflicts[MAX_CONFLICTS]; > long long minval; > long long maxval; > long long defaultval; > @@ -135,6 +144,8 @@ struct opt_params bopts = { > }, > .subopt_params = { > { .index = B_LOG, > + .conflicts = { B_SIZE, > + LAST_CONFLICT }, > .minval = XFS_MIN_BLOCKSIZE_LOG, > .maxval = XFS_MAX_BLOCKSIZE_LOG, > .defaultval = SUBOPT_NEEDS_VAL, > @@ -142,6 +153,8 @@ struct opt_params bopts = { > { .index = B_SIZE, > .convert = true, > .is_power_2 = true, > + .conflicts = { B_LOG, > + LAST_CONFLICT }, > .minval = XFS_MIN_BLOCKSIZE, > .maxval = XFS_MAX_BLOCKSIZE, > .defaultval = SUBOPT_NEEDS_VAL, > @@ -186,57 +199,84 @@ struct opt_params dopts = { > }, > .subopt_params = { > { .index = D_AGCOUNT, > + .conflicts = { D_AGSIZE, > + LAST_CONFLICT }, > .minval = 1, > .maxval = XFS_MAX_AGNUMBER, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = D_FILE, > + .conflicts = { LAST_CONFLICT }, > .minval = 0, > .maxval = 1, > .defaultval = 1, > }, > { .index = D_NAME, > + .conflicts = { LAST_CONFLICT }, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = D_SIZE, > + .conflicts = { LAST_CONFLICT }, > .convert = true, > .minval = XFS_AG_MIN_BYTES, > .maxval = LLONG_MAX, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = D_SUNIT, > + .conflicts = { D_NOALIGN, > + D_SU, > + D_SW, > + LAST_CONFLICT }, > .minval = 0, > .maxval = UINT_MAX, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = D_SWIDTH, > + .conflicts = { D_NOALIGN, > + D_SU, > + D_SW, > + LAST_CONFLICT }, > .minval = 0, > .maxval = UINT_MAX, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = D_AGSIZE, > + .conflicts = { D_AGCOUNT, > + LAST_CONFLICT }, > .convert = true, > .minval = XFS_AG_MIN_BYTES, > .maxval = XFS_AG_MAX_BYTES, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = D_SU, > + .conflicts = { D_NOALIGN, > + D_SUNIT, > + D_SWIDTH, > + LAST_CONFLICT }, > .convert = true, > .minval = 0, > .maxval = UINT_MAX, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = D_SW, > + .conflicts = { D_NOALIGN, > + D_SUNIT, > + D_SWIDTH, > + LAST_CONFLICT }, > .minval = 0, > .maxval = UINT_MAX, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = D_SECTLOG, > + .conflicts = { D_SECTSIZE, > + LAST_CONFLICT }, > .minval = XFS_MIN_SECTORSIZE_LOG, > .maxval = XFS_MAX_SECTORSIZE_LOG, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = D_SECTSIZE, > + .conflicts = { D_SECTLOG, > + LAST_CONFLICT }, > .convert = true, > .is_power_2 = true, > .minval = XFS_MIN_SECTORSIZE, > @@ -244,21 +284,29 @@ struct opt_params dopts = { > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = D_NOALIGN, > + .conflicts = { D_SU, > + D_SW, > + D_SUNIT, > + D_SWIDTH, > + LAST_CONFLICT }, > .minval = 0, > .maxval = 1, > .defaultval = 1, > }, > { .index = D_RTINHERIT, > + .conflicts = { LAST_CONFLICT }, > .minval = 1, > .maxval = 1, > .defaultval = 1, > }, > { .index = D_PROJINHERIT, > + .conflicts = { LAST_CONFLICT }, > .minval = 0, > .maxval = UINT_MAX, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = D_EXTSZINHERIT, > + .conflicts = { LAST_CONFLICT }, > .minval = 0, > .maxval = UINT_MAX, > .defaultval = SUBOPT_NEEDS_VAL, > @@ -290,43 +338,57 @@ struct opt_params iopts = { > }, > .subopt_params = { > { .index = I_ALIGN, > + .conflicts = { LAST_CONFLICT }, > .minval = 0, > .maxval = 1, > .defaultval = 1, > }, > { .index = I_LOG, > + .conflicts = { I_PERBLOCK, > + I_SIZE, > + LAST_CONFLICT }, > .minval = XFS_DINODE_MIN_LOG, > .maxval = XFS_DINODE_MAX_LOG, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = I_MAXPCT, > + .conflicts = { LAST_CONFLICT }, > .minval = 0, > .maxval = 100, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = I_PERBLOCK, > + .conflicts = { I_LOG, > + I_SIZE, > + LAST_CONFLICT }, > .is_power_2 = true, > .minval = XFS_MIN_INODE_PERBLOCK, > .maxval = XFS_MAX_BLOCKSIZE / XFS_DINODE_MIN_SIZE, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = I_SIZE, > + .conflicts = { I_PERBLOCK, > + I_LOG, > + LAST_CONFLICT }, > .is_power_2 = true, > .minval = XFS_DINODE_MIN_SIZE, > .maxval = XFS_DINODE_MAX_SIZE, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = I_ATTR, > + .conflicts = { LAST_CONFLICT }, > .minval = 0, > .maxval = 2, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = I_PROJID32BIT, > + .conflicts = { LAST_CONFLICT }, > .minval = 0, > .maxval = 1, > .defaultval = 1, > }, > { .index = I_SPINODES, > + .conflicts = { LAST_CONFLICT }, > .minval = 0, > .maxval = 1, > .defaultval = 1, > @@ -365,46 +427,64 @@ struct opt_params lopts = { > }, > .subopt_params = { > { .index = L_AGNUM, > + .conflicts = { L_DEV, > + LAST_CONFLICT }, > .minval = 0, > .maxval = UINT_MAX, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = L_INTERNAL, > + .conflicts = { L_FILE, > + L_DEV, > + LAST_CONFLICT }, > .minval = 0, > .maxval = 1, > .defaultval = 1, > }, > { .index = L_SIZE, > + .conflicts = { LAST_CONFLICT }, > .convert = true, > .minval = 2 * 1024 * 1024LL, /* XXX: XFS_MIN_LOG_BYTES */ > .maxval = XFS_MAX_LOG_BYTES, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = L_VERSION, > + .conflicts = { LAST_CONFLICT }, > .minval = 1, > .maxval = 2, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = L_SUNIT, > + .conflicts = { L_SU, > + LAST_CONFLICT }, > .minval = BTOBB(XLOG_MIN_RECORD_BSIZE), > .maxval = BTOBB(XLOG_MAX_RECORD_BSIZE), > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = L_SU, > + .conflicts = { L_SUNIT, > + LAST_CONFLICT }, > .convert = true, > .minval = XLOG_MIN_RECORD_BSIZE, > .maxval = UINT_MAX, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = L_DEV, > + .conflicts = { L_AGNUM, > + L_INTERNAL, > + LAST_CONFLICT }, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = L_SECTLOG, > + .conflicts = { L_SECTSIZE, > + LAST_CONFLICT }, > .minval = XFS_MIN_SECTORSIZE_LOG, > .maxval = XFS_MAX_SECTORSIZE_LOG, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = L_SECTSIZE, > + .conflicts = { L_SECTLOG, > + LAST_CONFLICT }, > .convert = true, > .is_power_2 = true, > .minval = XFS_MIN_SECTORSIZE, > @@ -412,14 +492,20 @@ struct opt_params lopts = { > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = L_FILE, > + .conflicts = { L_INTERNAL, > + LAST_CONFLICT }, > .minval = 0, > .maxval = 1, > .defaultval = 1, > }, > { .index = L_NAME, > + .conflicts = { L_AGNUM, > + L_INTERNAL, > + LAST_CONFLICT }, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = L_LAZYSBCNTR, > + .conflicts = { LAST_CONFLICT }, > .minval = 0, > .maxval = 1, > .defaultval = 1, > @@ -442,11 +528,15 @@ struct opt_params nopts = { > }, > .subopt_params = { > { .index = N_LOG, > + .conflicts = { N_SIZE, > + LAST_CONFLICT }, > .minval = XFS_MIN_REC_DIRSIZE, > .maxval = XFS_MAX_BLOCKSIZE_LOG, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = N_SIZE, > + .conflicts = { N_LOG, > + LAST_CONFLICT }, > .convert = true, > .is_power_2 = true, > .minval = 1 << XFS_MIN_REC_DIRSIZE, > @@ -454,11 +544,13 @@ struct opt_params nopts = { > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = N_VERSION, > + .conflicts = { LAST_CONFLICT }, > .minval = 2, > .maxval = 2, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = N_FTYPE, > + .conflicts = { LAST_CONFLICT }, > .minval = 0, > .maxval = 1, > .defaultval = 1, > @@ -485,32 +577,38 @@ struct opt_params ropts = { > }, > .subopt_params = { > { .index = R_EXTSIZE, > + .conflicts = { LAST_CONFLICT }, > .convert = true, > .minval = XFS_MIN_RTEXTSIZE, > .maxval = XFS_MAX_RTEXTSIZE, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = R_SIZE, > + .conflicts = { LAST_CONFLICT }, > .convert = true, > .minval = 0, > .maxval = LLONG_MAX, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = R_DEV, > + .conflicts = { LAST_CONFLICT }, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = R_FILE, > .minval = 0, > .maxval = 1, > .defaultval = 1, > + .conflicts = { LAST_CONFLICT }, > }, > { .index = R_NAME, > + .conflicts = { LAST_CONFLICT }, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = R_NOALIGN, > .minval = 0, > .maxval = 1, > .defaultval = 1, > + .conflicts = { LAST_CONFLICT }, > }, > }, > }; > @@ -530,16 +628,25 @@ struct opt_params sopts = { > }, > .subopt_params = { > { .index = S_LOG, > + .conflicts = { S_SIZE, > + S_SECTSIZE, > + LAST_CONFLICT }, > .minval = XFS_MIN_SECTORSIZE_LOG, > .maxval = XFS_MAX_SECTORSIZE_LOG, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = S_SECTLOG, > + .conflicts = { S_SIZE, > + S_SECTSIZE, > + LAST_CONFLICT }, > .minval = XFS_MIN_SECTORSIZE_LOG, > .maxval = XFS_MAX_SECTORSIZE_LOG, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = S_SIZE, > + .conflicts = { S_LOG, > + S_SECTLOG, > + LAST_CONFLICT }, > .convert = true, > .is_power_2 = true, > .minval = XFS_MIN_SECTORSIZE, > @@ -547,6 +654,9 @@ struct opt_params sopts = { > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = S_SECTSIZE, > + .conflicts = { S_LOG, > + S_SECTLOG, > + LAST_CONFLICT }, > .convert = true, > .is_power_2 = true, > .minval = XFS_MIN_SECTORSIZE, > @@ -569,16 +679,19 @@ struct opt_params mopts = { > }, > .subopt_params = { > { .index = M_CRC, > + .conflicts = { LAST_CONFLICT }, > .minval = 0, > .maxval = 1, > .defaultval = 1, > }, > { .index = M_FINOBT, > + .conflicts = { LAST_CONFLICT }, > .minval = 0, > .maxval = 1, > .defaultval = 1, > }, > { .index = M_UUID, > + .conflicts = { LAST_CONFLICT }, > .defaultval = SUBOPT_NEEDS_VAL, > }, > }, > @@ -620,30 +733,14 @@ calc_stripe_factors( > int *lsunit) > { > /* Handle data sunit/swidth options */ > - if (*dsunit || *dswidth) { > - if (dsu || dsw) { > - fprintf(stderr, > - _("data su/sw must not be used in " > - "conjunction with data sunit/swidth\n")); > - usage(); > - } > - > - if ((*dsunit && !*dswidth) || (!*dsunit && *dswidth)) { > - fprintf(stderr, > - _("both data sunit and data swidth options " > - "must be specified\n")); > - usage(); > - } > + if ((*dsunit && !*dswidth) || (!*dsunit && *dswidth)) { > + fprintf(stderr, > + _("both data sunit and data swidth options " > + "must be specified\n")); > + usage(); > } > > if (dsu || dsw) { > - if (*dsunit || *dswidth) { > - fprintf(stderr, > - _("data sunit/swidth must not be used in " > - "conjunction with data su/sw\n")); > - usage(); > - } > - > if ((dsu && !dsw) || (!dsu && dsw)) { > fprintf(stderr, > _("both data su and data sw options " > @@ -671,24 +768,8 @@ calc_stripe_factors( > > /* Handle log sunit options */ > > - if (*lsunit) { > - if (lsu) { > - fprintf(stderr, > - _("log su should not be used in " > - "conjunction with log sunit\n")); > - usage(); > - } > - } > - > - if (lsu) { > - if (*lsunit) { > - fprintf(stderr, > - _("log sunit should not be used in " > - "conjunction with log su\n")); > - usage(); > - } > + if (lsu) > *lsunit = (int)BTOBBT(lsu); > - } > } > > /* > @@ -1410,6 +1491,17 @@ getnum( > respec(opts->name, (char **)opts->subopts, index); > sp->seen = true; > > + /* check for conflicts with the option */ > + for (c = 0; c < MAX_CONFLICTS; c++) { > + int conflict_opt = sp->conflicts[c]; > + > + if (conflict_opt == LAST_CONFLICT) > + break; > + if (opts->subopt_params[conflict_opt].seen) > + conflict(opts->name, (char **)opts->subopts, > + conflict_opt, index); > + } > + > /* empty strings might just return a default value */ > if (!str || *str == '\0') { > if (sp->defaultval == SUBOPT_NEEDS_VAL) > @@ -1607,17 +1699,11 @@ main( > switch (getsubopt(&p, (constpp)subopts, > &value)) { > case B_LOG: > - if (bsflag) > - conflict('b', subopts, B_SIZE, > - B_LOG); > blocklog = getnum(value, &bopts, B_LOG); > blocksize = 1 << blocklog; > blflag = 1; > break; > case B_SIZE: > - if (blflag) > - conflict('b', subopts, B_LOG, > - B_SIZE); > blocksize = getnum(value, &bopts, > B_SIZE); > blocklog = libxfs_highbit32(blocksize); > @@ -1666,61 +1752,29 @@ main( > dsize = value; > break; > case D_SUNIT: > - if (nodsflag) > - conflict('d', subopts, D_NOALIGN, > - D_SUNIT); > dsunit = getnum(value, &dopts, D_SUNIT); > break; > case D_SWIDTH: > - if (nodsflag) > - conflict('d', subopts, D_NOALIGN, > - D_SWIDTH); > dswidth = getnum(value, &dopts, > D_SWIDTH); > break; > case D_SU: > - if (nodsflag) > - conflict('d', subopts, D_NOALIGN, > - D_SU); > dsu = getnum(value, &dopts, D_SU); > break; > case D_SW: > - if (nodsflag) > - conflict('d', subopts, D_NOALIGN, > - D_SW); > dsw = getnum(value, &dopts, D_SW); > break; > case D_NOALIGN: > nodsflag = getnum(value, &dopts, > - D_NOALIGN); > - if (nodsflag) { > - if (dsu) > - conflict('d', subopts, D_SU, > - D_NOALIGN); > - if (dsunit) > - conflict('d', subopts, D_SUNIT, > - D_NOALIGN); > - if (dsw) > - conflict('d', subopts, D_SW, > D_NOALIGN); > - if (dswidth) > - conflict('d', subopts, D_SWIDTH, > - D_NOALIGN); > - } > break; > case D_SECTLOG: > - if (ssflag) > - conflict('d', subopts, D_SECTSIZE, > - D_SECTLOG); > sectorlog = getnum(value, &dopts, > D_SECTLOG); > sectorsize = 1 << sectorlog; > slflag = 1; > break; > case D_SECTSIZE: > - if (slflag) > - conflict('d', subopts, D_SECTLOG, > - D_SECTSIZE); > sectorsize = getnum(value, &dopts, > D_SECTSIZE); > sectorlog = > @@ -1763,12 +1817,6 @@ main( > &iopts, I_ALIGN); > break; > case I_LOG: > - if (ipflag) > - conflict('i', subopts, I_PERBLOCK, > - I_LOG); > - if (isflag) > - conflict('i', subopts, I_SIZE, > - I_LOG); > inodelog = getnum(value, &iopts, I_LOG); > isize = 1 << inodelog; > ilflag = 1; > @@ -1779,23 +1827,11 @@ main( > imflag = 1; > break; > case I_PERBLOCK: > - if (ilflag) > - conflict('i', subopts, I_LOG, > - I_PERBLOCK); > - if (isflag) > - conflict('i', subopts, I_SIZE, > - I_PERBLOCK); > inopblock = getnum(value, &iopts, > I_PERBLOCK); > ipflag = 1; > break; > case I_SIZE: > - if (ilflag) > - conflict('i', subopts, I_LOG, > - I_SIZE); > - if (ipflag) > - conflict('i', subopts, I_PERBLOCK, > - I_SIZE); > isize = getnum(value, &iopts, I_SIZE); > inodelog = libxfs_highbit32(isize); > isflag = 1; > @@ -1810,9 +1846,8 @@ main( > I_PROJID32BIT); > break; > case I_SPINODES: > - sb_feat.spinodes = > - getnum(value, &iopts, > - I_SPINODES); > + sb_feat.spinodes = getnum(value, > + &iopts, I_SPINODES); > break; > default: > unknown('i', value); > @@ -1828,8 +1863,6 @@ main( > switch (getsubopt(&p, (constpp)subopts, > &value)) { > case L_AGNUM: > - if (ldflag) > - conflict('l', subopts, L_AGNUM, L_DEV); > logagno = getnum(value, &lopts, L_AGNUM); > laflag = 1; > break; > @@ -1843,12 +1876,6 @@ main( > xi.lcreat = 1; > break; > case L_INTERNAL: > - if (ldflag) > - conflict('l', subopts, L_INTERNAL, L_DEV); > - if (xi.lisfile) > - conflict('l', subopts, L_FILE, > - L_INTERNAL); > - > loginternal = getnum(value, &lopts, > L_INTERNAL); > liflag = 1; > @@ -1890,18 +1917,12 @@ main( > lsflag = 1; > break; > case L_SECTLOG: > - if (lssflag) > - conflict('l', subopts, L_SECTSIZE, > - L_SECTLOG); > lsectorlog = getnum(value, &lopts, > L_SECTLOG); > lsectorsize = 1 << lsectorlog; > lslflag = 1; > break; > case L_SECTSIZE: > - if (lslflag) > - conflict('l', subopts, L_SECTLOG, > - L_SECTSIZE); > lsectorsize = getnum(value, &lopts, > L_SECTSIZE); > lsectorlog = > @@ -1966,18 +1987,12 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > switch (getsubopt(&p, (constpp)subopts, > &value)) { > case N_LOG: > - if (nsflag) > - conflict('n', subopts, N_SIZE, > - N_LOG); > dirblocklog = getnum(value, &nopts, > N_LOG); > dirblocksize = 1 << dirblocklog; > nlflag = 1; > break; > case N_SIZE: > - if (nlflag) > - conflict('n', subopts, N_LOG, > - N_SIZE); > dirblocksize = getnum(value, &nopts, > N_SIZE); > dirblocklog = > @@ -2083,7 +2098,7 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > &value)) { > case S_LOG: > case S_SECTLOG: > - if (ssflag || lssflag) > + if (lssflag) > conflict('s', subopts, > S_SECTSIZE, S_SECTLOG); > sectorlog = getnum(value, &sopts, > @@ -2095,7 +2110,7 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > break; > case S_SIZE: > case S_SECTSIZE: > - if (slflag || lslflag) > + if (lslflag) > conflict('s', subopts, S_SECTLOG, > S_SECTSIZE); > sectorsize = getnum(value, &sopts, > @@ -2316,11 +2331,6 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); > dirblocksize = 1 << dirblocklog; > } > > - if (daflag && dasize) { > - fprintf(stderr, > - _("both -d agcount= and agsize= specified, use one or the other\n")); > - usage(); > - } > > if (xi.disfile && (!dsize || !xi.dname)) { > fprintf(stderr, > From sandeen@sandeen.net Thu Apr 7 17:49:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E0D037CA1 for ; Thu, 7 Apr 2016 17:49:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5F6A0AC004 for ; Thu, 7 Apr 2016 15:49:18 -0700 (PDT) X-ASG-Debug-ID: 1460069355-04bdf011042f48f0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id IRdUlVl1W8Z4lkaX for ; Thu, 07 Apr 2016 15:49:15 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 7F969142D for ; Thu, 7 Apr 2016 17:49:14 -0500 (CDT) Subject: Re: [PATCH 14/19] mkfs: add string options to generic parsing To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 14/19] mkfs: add string options to generic parsing References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-15-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <5706E3E8.8020007@sandeen.net> Date: Thu, 7 Apr 2016 17:49:12 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: <1458818136-56043-15-git-send-email-jtulak@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: 1460069355 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.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.28536 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > From: Dave Chinner > > CHANGELOG: > o Remove unused argument of check_opt. > o Add a comment to explain a new member of opt_params struct. > o A stray chunk moved from the following patch to this one. > > So that string options are correctly detected for conflicts and > respecification, add a getstr() function that modifies the option > tables appropriately. > > Signed-off-by: Dave Chinner > Signed-off-by: Jan Tulak Reviewed-by: Eric Sandeen > --- > mkfs/xfs_mkfs.c | 143 ++++++++++++++++++++++++++++++-------------------------- > 1 file changed, 78 insertions(+), 65 deletions(-) > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index d119580..9261ed5 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c > @@ -83,6 +83,10 @@ unsigned int sectorsize; > * Do not set this flag when definning a subopt. It is used to remeber that > * this subopt was already seen, for example for conflicts detection. > * > + * str_seen INTERNAL > + * Do not set. It is used internally for respecification, when some options > + * has to be parsed twice - at first as a string, then later as a number. > + * > * convert OPTIONAL > * A flag signalling whether the user-given value can use suffixes. > * If you want to allow the use of user-friendly values like 13k, 42G, > @@ -124,6 +128,7 @@ struct opt_params { > struct subopt_param { > int index; > bool seen; > + bool str_seen; > bool convert; > bool is_power_2; > int conflicts[MAX_CONFLICTS]; > @@ -1470,14 +1475,17 @@ illegal_option( > usage(); > } > > -static long long > -getnum( > - const char *str, > +/* > + * Check for conflicts and option respecification. > + */ > +static void > +check_opt( > struct opt_params *opts, > - int index) > + int index, > + bool str_seen) > { > - struct subopt_param *sp = &opts->subopt_params[index]; > - long long c; > + struct subopt_param *sp = &opts->subopt_params[index]; > + int i; > > if (sp->index != index) { > fprintf(stderr, > @@ -1486,22 +1494,47 @@ getnum( > reqval(opts->name, (char **)opts->subopts, index); > } > > - /* check for respecification of the option */ > - if (sp->seen) > - respec(opts->name, (char **)opts->subopts, index); > - sp->seen = true; > + /* > + * Check for respecification of the option. This is more complex than it > + * seems because some options are parsed twice - once as a string during > + * input parsing, then later the string is passed to getnum for > + * conversion into a number and bounds checking. Hence the two variables > + * used to track the different uses based on the @str parameter passed > + * to us. > + */ > + if (!str_seen) { > + if (sp->seen) > + respec(opts->name, (char **)opts->subopts, index); > + sp->seen = true; > + } else { > + if (sp->str_seen) > + respec(opts->name, (char **)opts->subopts, index); > + sp->str_seen = true; > + } > > /* check for conflicts with the option */ > - for (c = 0; c < MAX_CONFLICTS; c++) { > - int conflict_opt = sp->conflicts[c]; > + for (i = 0; i < MAX_CONFLICTS; i++) { > + int conflict_opt = sp->conflicts[i]; > > if (conflict_opt == LAST_CONFLICT) > break; > - if (opts->subopt_params[conflict_opt].seen) > + if (opts->subopt_params[conflict_opt].seen || > + opts->subopt_params[conflict_opt].str_seen) > conflict(opts->name, (char **)opts->subopts, > conflict_opt, index); > } > +} > > +static long long > +getnum( > + const char *str, > + struct opt_params *opts, > + int index) > +{ > + struct subopt_param *sp = &opts->subopt_params[index]; > + long long c; > + > + check_opt(opts, index, false); > /* empty strings might just return a default value */ > if (!str || *str == '\0') { > if (sp->defaultval == SUBOPT_NEEDS_VAL) > @@ -1543,6 +1576,26 @@ getnum( > return c; > } > > +/* > + * Option is a string - do all the option table work, and check there > + * is actually an option string. Otherwise we don't do anything with the string > + * here - validation will be done later when the string is converted to a value > + * or used as a file/device path. > + */ > +static char * > +getstr( > + char *str, > + struct opt_params *opts, > + int index) > +{ > + check_opt(opts, index, true); > + > + /* empty strings for string options are not valid */ > + if (!str || *str == '\0') > + reqval(opts->name, (char **)opts->subopts, index); > + return str; > +} > + > int > main( > int argc, > @@ -1738,18 +1791,10 @@ main( > xi.dcreat = 1; > break; > case D_NAME: > - if (!value || *value == '\0') > - reqval('d', subopts, D_NAME); > - if (xi.dname) > - respec('d', subopts, D_NAME); > - xi.dname = value; > + xi.dname = getstr(value, &dopts, D_NAME); > break; > case D_SIZE: > - if (!value || *value == '\0') > - reqval('d', subopts, D_SIZE); > - if (dsize) > - respec('d', subopts, D_SIZE); > - dsize = value; > + dsize = getstr(value, &dopts, D_SIZE); > break; > case D_SUNIT: > dsunit = getnum(value, &dopts, D_SUNIT); > @@ -1890,18 +1935,10 @@ main( > break; > case L_NAME: > case L_DEV: > - if (laflag) > - conflict('l', subopts, L_AGNUM, L_DEV); > - if (liflag) > - conflict('l', subopts, L_INTERNAL, L_DEV); > - if (!value || *value == '\0') > - reqval('l', subopts, L_NAME); > - if (xi.logname) > - respec('l', subopts, L_NAME); > + logfile = getstr(value, &lopts, L_NAME); > + xi.logname = logfile; > ldflag = 1; > loginternal = 0; > - logfile = value; > - xi.logname = value; > break; > case L_VERSION: > sb_feat.log_version = > @@ -1909,12 +1946,7 @@ main( > lvflag = 1; > break; > case L_SIZE: > - if (!value || *value == '\0') > - reqval('l', subopts, L_SIZE); > - if (logsize) > - respec('l', subopts, L_SIZE); > - logsize = value; > - lsflag = 1; > + logsize = getstr(value, &lopts, L_SIZE); > break; > case L_SECTLOG: > lsectorlog = getnum(value, &lopts, > @@ -2000,10 +2032,7 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > nsflag = 1; > break; > case N_VERSION: > - if (!value || *value == '\0') > - reqval('n', subopts, N_VERSION); > - if (nvflag) > - respec('n', subopts, N_VERSION); > + value = getstr(value, &nopts, N_VERSION); > if (!strcasecmp(value, "ci")) { > /* ASCII CI mode */ > sb_feat.nci = true; > @@ -2052,11 +2081,8 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > switch (getsubopt(&p, (constpp)subopts, > &value)) { > case R_EXTSIZE: > - if (!value || *value == '\0') > - reqval('r', subopts, R_EXTSIZE); > - if (rtextsize) > - respec('r', subopts, R_EXTSIZE); > - rtextsize = value; > + rtextsize = getstr(value, &ropts, > + R_EXTSIZE); > break; > case R_FILE: > xi.risfile = getnum(value, &ropts, > @@ -2066,18 +2092,11 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > break; > case R_NAME: > case R_DEV: > - if (!value || *value == '\0') > - reqval('r', subopts, R_NAME); > - if (xi.rtname) > - respec('r', subopts, R_NAME); > - xi.rtname = value; > + xi.rtname = getstr(value, &ropts, > + R_NAME); > break; > case R_SIZE: > - if (!value || *value == '\0') > - reqval('r', subopts, R_SIZE); > - if (rtsize) > - respec('r', subopts, R_SIZE); > - rtsize = value; > + rtsize = getstr(value, &ropts, R_SIZE); > break; > case R_NOALIGN: > norsflag = getnum(value, &ropts, > @@ -2137,13 +2156,7 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > fprintf(stderr, _("extra arguments\n")); > usage(); > } else if (argc - optind == 1) { > - dfile = xi.volname = argv[optind]; > - if (xi.dname) { > - fprintf(stderr, > - _("cannot specify both %s and -d name=%s\n"), > - xi.volname, xi.dname); > - usage(); > - } > + dfile = xi.volname = getstr(argv[optind], &dopts, D_NAME); > } else > dfile = xi.dname; > > From hch@lst.de Thu Apr 7 18:21:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B1B567CA0 for ; Thu, 7 Apr 2016 18:21:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2FCA1AC004 for ; Thu, 7 Apr 2016 16:21:39 -0700 (PDT) X-ASG-Debug-ID: 1460071296-04bdf011042f60e0001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id BSS0nxWpQE4CUCRL (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 07 Apr 2016 16:21:37 -0700 (PDT) X-Barracuda-Envelope-From: hch@lst.de X-Barracuda-Apparent-Source-IP: 213.95.11.211 Received: by newverein.lst.de (Postfix, from userid 2407) id EF36768BF0; Fri, 8 Apr 2016 01:21:35 +0200 (CEST) Date: Fri, 8 Apr 2016 01:21:35 +0200 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: support RCU lookups for inline symlinks Message-ID: <20160407232135.GA11502@lst.de> X-ASG-Orig-Subj: Re: support RCU lookups for inline symlinks References: <1458740935-31260-1-git-send-email-hch@lst.de> <20160405215508.GH11238@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160405215508.GH11238@dastard> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1460071297 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28537 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Apr 06, 2016 at 07:55:08AM +1000, Dave Chinner wrote: > On Wed, Mar 23, 2016 at 02:48:51PM +0100, Christoph Hellwig wrote: > > Return the inline link body in the inode to support RCU mode lookups. > > The series doesn't appear to cause any regressions and the code > looks good, so I've added the missing xfs_setup_iops() call in > xfs_rename_alloc_whiteout() (patch 2), and converted dentry->d_inode > to d_inode(dentry) in patch 3 for consistency withe the rest of the > code and committed this series. Thanks. After some pondering I think we should setup the iops for the quota inodes as well - if we ever do something like vfs_getattr on them now that we're using VFS inode everywhere we'll need it. And I'd better be prepared for that than finding bugs after I've forgotten about all this. I'll send an incremental patch. From dave@fromorbit.com Thu Apr 7 18:38:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7ADB37CAF for ; Thu, 7 Apr 2016 18:38:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 327A88F8049 for ; Thu, 7 Apr 2016 16:38:33 -0700 (PDT) X-ASG-Debug-ID: 1460072308-04bdf011042f6de0002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id JFkN05MdZ9qfEVOG for ; Thu, 07 Apr 2016 16:38:30 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2C5DgA27gZXPDGaLHldgzeBUIZrn0kBAQEBBo9gghmLXE0BAQEBAQEHAQEBAUJAhEIBBScvMwgYMTkDBxQZiCbCQ4VZjygFh3CQFI4OjwtFjl+CGAELQhmBXCowiTkBAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail04.adl6.internode.on.net with ESMTP; 08 Apr 2016 09:08:27 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1aoJVK-00004q-B4 for xfs@oss.sgi.com; Fri, 08 Apr 2016 09:38:26 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1aoJUo-0006Fy-6X for xfs@oss.sgi.com; Fri, 08 Apr 2016 09:37:54 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/6] xfs: rename variables in xfs_iflush_cluster for clarity Date: Fri, 8 Apr 2016 09:37:47 +1000 X-ASG-Orig-Subj: [PATCH 2/6] xfs: rename variables in xfs_iflush_cluster for clarity Message-Id: <1460072271-23923-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1460072271-23923-1-git-send-email-david@fromorbit.com> References: <1460072271-23923-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1460072310 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28537 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The cluster inode variable uses unconventional naming - iq - which makes it hard to distinguish it between the inode passed into the function - ip - and that is a vector for mistakes to be made. Rename all the cluster inode variables to use a more conventional prefixes to reduce potential future confusion (cilist, cilist_size, cip). Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 64 +++++++++++++++++++++++++++--------------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 32f11a9..2718d10 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -3149,16 +3149,16 @@ out_release_wip: STATIC int xfs_iflush_cluster( - xfs_inode_t *ip, - xfs_buf_t *bp) + struct xfs_inode *ip, + struct xfs_buf *bp) { - xfs_mount_t *mp = ip->i_mount; + struct xfs_mount *mp = ip->i_mount; struct xfs_perag *pag; unsigned long first_index, mask; unsigned long inodes_per_cluster; - int ilist_size; - xfs_inode_t **ilist; - xfs_inode_t *iq; + int cilist_size; + struct xfs_inode **cilist; + struct xfs_inode *cip; int nr_found; int clcount = 0; int bufwasdelwri; @@ -3167,23 +3167,23 @@ xfs_iflush_cluster( pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); inodes_per_cluster = mp->m_inode_cluster_size >> mp->m_sb.sb_inodelog; - ilist_size = inodes_per_cluster * sizeof(xfs_inode_t *); - ilist = kmem_alloc(ilist_size, KM_MAYFAIL|KM_NOFS); - if (!ilist) + cilist_size = inodes_per_cluster * sizeof(xfs_inode_t *); + cilist = kmem_alloc(cilist_size, KM_MAYFAIL|KM_NOFS); + if (!cilist) goto out_put; mask = ~(((mp->m_inode_cluster_size >> mp->m_sb.sb_inodelog)) - 1); first_index = XFS_INO_TO_AGINO(mp, ip->i_ino) & mask; rcu_read_lock(); /* really need a gang lookup range call here */ - nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void**)ilist, + nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void**)cilist, first_index, inodes_per_cluster); if (nr_found == 0) goto out_free; for (i = 0; i < nr_found; i++) { - iq = ilist[i]; - if (iq == ip) + cip = cilist[i]; + if (cip == ip) continue; /* @@ -3192,20 +3192,20 @@ xfs_iflush_cluster( * We need to check under the i_flags_lock for a valid inode * here. Skip it if it is not valid or the wrong inode. */ - spin_lock(&iq->i_flags_lock); - if (!iq->i_ino || - (XFS_INO_TO_AGINO(mp, iq->i_ino) & mask) != first_index) { - spin_unlock(&iq->i_flags_lock); + spin_lock(&cip->i_flags_lock); + if (!cip->i_ino || + (XFS_INO_TO_AGINO(mp, cip->i_ino) & mask) != first_index) { + spin_unlock(&cip->i_flags_lock); continue; } - spin_unlock(&iq->i_flags_lock); + spin_unlock(&cip->i_flags_lock); /* * Do an un-protected check to see if the inode is dirty and * is a candidate for flushing. These checks will be repeated * later after the appropriate locks are acquired. */ - if (xfs_inode_clean(iq) && xfs_ipincount(iq) == 0) + if (xfs_inode_clean(cip) && xfs_ipincount(cip) == 0) continue; /* @@ -3213,15 +3213,15 @@ xfs_iflush_cluster( * then this inode cannot be flushed and is skipped. */ - if (!xfs_ilock_nowait(iq, XFS_ILOCK_SHARED)) + if (!xfs_ilock_nowait(cip, XFS_ILOCK_SHARED)) continue; - if (!xfs_iflock_nowait(iq)) { - xfs_iunlock(iq, XFS_ILOCK_SHARED); + if (!xfs_iflock_nowait(cip)) { + xfs_iunlock(cip, XFS_ILOCK_SHARED); continue; } - if (xfs_ipincount(iq)) { - xfs_ifunlock(iq); - xfs_iunlock(iq, XFS_ILOCK_SHARED); + if (xfs_ipincount(cip)) { + xfs_ifunlock(cip); + xfs_iunlock(cip, XFS_ILOCK_SHARED); continue; } @@ -3229,18 +3229,18 @@ xfs_iflush_cluster( * arriving here means that this inode can be flushed. First * re-check that it's dirty before flushing. */ - if (!xfs_inode_clean(iq)) { + if (!xfs_inode_clean(cip)) { int error; - error = xfs_iflush_int(iq, bp); + error = xfs_iflush_int(cip, bp); if (error) { - xfs_iunlock(iq, XFS_ILOCK_SHARED); + xfs_iunlock(cip, XFS_ILOCK_SHARED); goto cluster_corrupt_out; } clcount++; } else { - xfs_ifunlock(iq); + xfs_ifunlock(cip); } - xfs_iunlock(iq, XFS_ILOCK_SHARED); + xfs_iunlock(cip, XFS_ILOCK_SHARED); } if (clcount) { @@ -3250,7 +3250,7 @@ xfs_iflush_cluster( out_free: rcu_read_unlock(); - kmem_free(ilist); + kmem_free(cilist); out_put: xfs_perag_put(pag); return 0; @@ -3293,8 +3293,8 @@ cluster_corrupt_out: /* * Unlocks the flush lock */ - xfs_iflush_abort(iq, false); - kmem_free(ilist); + xfs_iflush_abort(cip, false); + kmem_free(cilist); xfs_perag_put(pag); return -EFSCORRUPTED; } -- 2.7.0 From dave@fromorbit.com Thu Apr 7 18:38:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0D0EC7CB3 for ; Thu, 7 Apr 2016 18:38:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id CC30D30404E for ; Thu, 7 Apr 2016 16:38:36 -0700 (PDT) X-ASG-Debug-ID: 1460072308-04bdf011042f6de0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Nn8O5mvLrFpnXke7 for ; Thu, 07 Apr 2016 16:38:28 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BTDwA27gZXPDGaLHldgzdTfY01mGUCGAEBAQEGgQ+OUYIZhDGHK00BAQEBAQEHAQEBAUJAhR47gQIDB4hTD6AbohmFWYdxgi2FCgWYBIV3iBeBTwGNO0WOX4IYAQEBBwEBAQGCNSowAYk4AQEB Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail04.adl6.internode.on.net with ESMTP; 08 Apr 2016 09:08:27 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1aoJVK-0008WU-9R for xfs@oss.sgi.com; Fri, 08 Apr 2016 09:38:26 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1aoJUo-0006Fq-5J for xfs@oss.sgi.com; Fri, 08 Apr 2016 09:37:54 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/6 v2] xfs: xfs_iflush_cluster vs xfs_reclaim_inode Date: Fri, 8 Apr 2016 09:37:45 +1000 X-ASG-Orig-Subj: [PATCH 0/6 v2] xfs: xfs_iflush_cluster vs xfs_reclaim_inode Message-Id: <1460072271-23923-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1460072308 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA717 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28537 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_SA717 Custom Rule BSF_SC0_SA717 Hi folks, This is the second version of this patch set, first posted and described here: http://oss.sgi.com/archives/xfs/2016-04/msg00069.html The only change from the first version is splitting up the first patch into two as Christoph requested - one for the bug fix, the other for the variable renaming. Cheers, Dave. From dave@fromorbit.com Thu Apr 7 18:38:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 195D37CB7 for ; Thu, 7 Apr 2016 18:38:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 84ED6AC005 for ; Thu, 7 Apr 2016 16:38:49 -0700 (PDT) X-ASG-Debug-ID: 1460072310-04cb6c2462330930001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id YPL8LNwsZLmuQqCH for ; Thu, 07 Apr 2016 16:38:31 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2C5DgA27gZXPDGaLHldgzeBUIZrn0kBAQEBBo9gghmLXE0BAQEBAQEHAQEBAUJAhEIBBScvMwgYMTkDBxQZiCbCQ4VZiSB+hQoFmASODo8LRY5fghgBC4I3KjCHfIE9AQEB Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail04.adl6.internode.on.net with ESMTP; 08 Apr 2016 09:08:27 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1aoJVK-00004r-BR for xfs@oss.sgi.com; Fri, 08 Apr 2016 09:38:26 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1aoJUo-0006G3-7M for xfs@oss.sgi.com; Fri, 08 Apr 2016 09:37:54 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/6] xfs: skip stale inodes in xfs_iflush_cluster Date: Fri, 8 Apr 2016 09:37:48 +1000 X-ASG-Orig-Subj: [PATCH 3/6] xfs: skip stale inodes in xfs_iflush_cluster Message-Id: <1460072271-23923-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1460072271-23923-1-git-send-email-david@fromorbit.com> References: <1460072271-23923-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1460072310 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28537 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner We don't write back stale inodes so we should skip them in xfs_iflush_cluster, too. Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 2718d10..6598104 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -3190,10 +3190,11 @@ xfs_iflush_cluster( * because this is an RCU protected lookup, we could find a * recently freed or even reallocated inode during the lookup. * We need to check under the i_flags_lock for a valid inode - * here. Skip it if it is not valid or the wrong inode. + * here. Skip it if it is not valid, stale or the wrong inode. */ spin_lock(&cip->i_flags_lock); if (!cip->i_ino || + __xfs_iflags_test(ip, XFS_ISTALE) || (XFS_INO_TO_AGINO(mp, cip->i_ino) & mask) != first_index) { spin_unlock(&cip->i_flags_lock); continue; -- 2.7.0 From dave@fromorbit.com Thu Apr 7 18:38:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DB9FF7CB7 for ; Thu, 7 Apr 2016 18:38:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A21928F8049 for ; Thu, 7 Apr 2016 16:38:50 -0700 (PDT) X-ASG-Debug-ID: 1460072308-04bdf011042f6de0003-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id iF8kiVAFjUoA2kzH for ; Thu, 07 Apr 2016 16:38:48 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2C5DgA27gZXPDGaLHldgzeBUIZrn0kBAQEBBo9gghmLXE0BAQEBAQEHAQEBAUJAhEIBBScvMwgYMTkDBxQZiCbCQ4VZih6FCgWYBIhphSWPC0WOX4IYAQuCNyowiTkBAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail04.adl6.internode.on.net with ESMTP; 08 Apr 2016 09:08:27 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1aoJVK-00004s-Bo for xfs@oss.sgi.com; Fri, 08 Apr 2016 09:38:26 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1aoJUo-0006G8-7l for xfs@oss.sgi.com; Fri, 08 Apr 2016 09:37:54 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/6] xfs: xfs_iflush_cluster has range issues Date: Fri, 8 Apr 2016 09:37:49 +1000 X-ASG-Orig-Subj: [PATCH 4/6] xfs: xfs_iflush_cluster has range issues Message-Id: <1460072271-23923-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1460072271-23923-1-git-send-email-david@fromorbit.com> References: <1460072271-23923-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1460072312 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28537 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner xfs_iflush_cluster() does a gang lookup on the radix tree, meaning it can find inodes beyond the current cluster if there is sparse cache population. gang lookups return results in ascending index order, so stop trying to cluster inodes once the first inode outside the cluster mask is detected. Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 6598104..b984be4 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -3194,11 +3194,20 @@ xfs_iflush_cluster( */ spin_lock(&cip->i_flags_lock); if (!cip->i_ino || - __xfs_iflags_test(ip, XFS_ISTALE) || - (XFS_INO_TO_AGINO(mp, cip->i_ino) & mask) != first_index) { + __xfs_iflags_test(ip, XFS_ISTALE)) { spin_unlock(&cip->i_flags_lock); continue; } + + /* + * Once we fall off the end of the cluster, no point checking + * any more inodes in the list because they will also all be + * outside the cluster. + */ + if ((XFS_INO_TO_AGINO(mp, cip->i_ino) & mask) != first_index) { + spin_unlock(&cip->i_flags_lock); + break; + } spin_unlock(&cip->i_flags_lock); /* -- 2.7.0 From dave@fromorbit.com Thu Apr 7 18:38:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 966AD7CBA for ; Thu, 7 Apr 2016 18:38:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6B97F8F8049 for ; Thu, 7 Apr 2016 16:38:51 -0700 (PDT) X-ASG-Debug-ID: 1460072310-04cb6c2462330930002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id PZd76iWEuTiWtEhD for ; Thu, 07 Apr 2016 16:38:49 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2C5DgA27gZXPDGaLHldgzeBUIZrn0kBAQEBBo9gghmLXE0BAQEBAQEHAQEBAUJAhEIBBScvMwgYMTkDBxQZiCbCQ4VZih6FCgWYBI4OjwtFjl+CGAELgjcqMIk5AQEB Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail04.adl6.internode.on.net with ESMTP; 08 Apr 2016 09:08:27 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1aoJVK-0008WV-AD for xfs@oss.sgi.com; Fri, 08 Apr 2016 09:38:26 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1aoJUo-0006Ft-5m for xfs@oss.sgi.com; Fri, 08 Apr 2016 09:37:54 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/6] xfs: fix inode validity check in xfs_iflush_cluster Date: Fri, 8 Apr 2016 09:37:46 +1000 X-ASG-Orig-Subj: [PATCH 1/6] xfs: fix inode validity check in xfs_iflush_cluster Message-Id: <1460072271-23923-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1460072271-23923-1-git-send-email-david@fromorbit.com> References: <1460072271-23923-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1460072328 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28537 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Some careless idiot(*) wrote crap code in commit 1a3e8f3 ("xfs: convert inode cache lookups to use RCU locking") back in late 2010, and so xfs_iflush_cluster checks the wrong inode for whether it is still valid under RCU protection. Fix it to lock and check the correct inode. (*) Careless-idiot: Dave Chinner Discovered-by: Brain Foster Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index f79ea59..32f11a9 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -3192,13 +3192,13 @@ xfs_iflush_cluster( * We need to check under the i_flags_lock for a valid inode * here. Skip it if it is not valid or the wrong inode. */ - spin_lock(&ip->i_flags_lock); - if (!ip->i_ino || + spin_lock(&iq->i_flags_lock); + if (!iq->i_ino || (XFS_INO_TO_AGINO(mp, iq->i_ino) & mask) != first_index) { - spin_unlock(&ip->i_flags_lock); + spin_unlock(&iq->i_flags_lock); continue; } - spin_unlock(&ip->i_flags_lock); + spin_unlock(&iq->i_flags_lock); /* * Do an un-protected check to see if the inode is dirty and -- 2.7.0 From dave@fromorbit.com Thu Apr 7 18:38:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AD6A07CBA for ; Thu, 7 Apr 2016 18:38:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 825F28F8049 for ; Thu, 7 Apr 2016 16:38:52 -0700 (PDT) X-ASG-Debug-ID: 1460072328-04cbb065ac62c50001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id ka4hfIBUvVZnN9Ai for ; Thu, 07 Apr 2016 16:38:49 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2C6DgA27gZXPDGaLHlVCIM3gVCGa59JAQEBAQaReYodgT9NAQEBAQEBBwEBAQFCQIRCAQUnLx4VCBgxOQMHFBmIJsJDhVmJLkqFMAWYBI4OjwuPJIIYAQtCGYFcKjCJOQEBAQ Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail04.adl6.internode.on.net with ESMTP; 08 Apr 2016 09:08:27 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1aoJVK-00004u-Cf for xfs@oss.sgi.com; Fri, 08 Apr 2016 09:38:26 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1aoJUo-0006GI-8c for xfs@oss.sgi.com; Fri, 08 Apr 2016 09:37:54 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 6/6] xfs: mark reclaimed inodes invalid earlier Date: Fri, 8 Apr 2016 09:37:51 +1000 X-ASG-Orig-Subj: [PATCH 6/6] xfs: mark reclaimed inodes invalid earlier Message-Id: <1460072271-23923-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1460072271-23923-1-git-send-email-david@fromorbit.com> References: <1460072271-23923-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1460072328 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28537 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The last thing we do before using call_rcu() on an xfs_inode to be freed is mark it as invalid. This means there is a window between when we know for certain that the inode is going to be freed and when we do actually mark it as "freed". This is important in the context of RCU lookups - we can look up the inode, find that it is valid, and then use it as such not realising that it is in the final stages of being freed. As such, mark the inode as being invalid the moment we know it is going to be reclaimed. This can be done while we still hold the XFS_ILOCK_EXCL and the flush lock in xfs_inode_reclaim, meaning that it occurs well before we remove it from the radix tree, and that the i_flags_lock, the XFS_ILOCK and the inode flush lock all act as synchronisation points for detecting that an inode is about to go away. For defensive purposes, this allows us to add a further check to xfs_iflush_cluster to ensure we skip inodes that are being freed after we grab the XFS_ILOCK_SHARED and the flush lock - we know that if the inode number if valid while we have these locks held we know that it has not progressed through reclaim to the point where it is clean and is about to be freed. Signed-off-by: Dave Chinner --- fs/xfs/xfs_icache.c | 40 ++++++++++++++++++++++++++++++++-------- fs/xfs/xfs_inode.c | 14 +++++++++++++- 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index 0c94cde..a60db43 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -114,6 +114,18 @@ xfs_inode_free_callback( kmem_zone_free(xfs_inode_zone, ip); } +static void +__xfs_inode_free( + struct xfs_inode *ip) +{ + /* asserts to verify all state is correct here */ + ASSERT(atomic_read(&ip->i_pincount) == 0); + ASSERT(!xfs_isiflocked(ip)); + XFS_STATS_DEC(ip->i_mount, vn_active); + + call_rcu(&VFS_I(ip)->i_rcu, xfs_inode_free_callback); +} + void xfs_inode_free( struct xfs_inode *ip) @@ -129,12 +141,7 @@ xfs_inode_free( ip->i_ino = 0; spin_unlock(&ip->i_flags_lock); - /* asserts to verify all state is correct here */ - ASSERT(atomic_read(&ip->i_pincount) == 0); - ASSERT(!xfs_isiflocked(ip)); - XFS_STATS_DEC(ip->i_mount, vn_active); - - call_rcu(&VFS_I(ip)->i_rcu, xfs_inode_free_callback); + __xfs_inode_free(ip); } /* @@ -929,6 +936,7 @@ xfs_reclaim_inode( int sync_mode) { struct xfs_buf *bp = NULL; + xfs_ino_t ino = ip->i_ino; /* for radix_tree_delete */ int error; restart: @@ -993,6 +1001,22 @@ restart: xfs_iflock(ip); reclaim: + /* + * Because we use RCU freeing we need to ensure the inode always appears + * to be reclaimed with an invalid inode number when in the free state. + * We do this as early as possible under the ILOCK and flush lock so + * that xfs_iflush_cluster() can be guaranteed to detect races with us + * here. By doing this, we guarantee that once xfs_iflush_cluster has + * locked both the XFS_ILOCK and the flush lock that it will see either + * a valid, flushable inode that will serialise correctly against the + * locks below, or it will see a clean (and invalid) inode that it can + * skip. + */ + spin_lock(&ip->i_flags_lock); + ip->i_flags = XFS_IRECLAIM; + ip->i_ino = 0; + spin_unlock(&ip->i_flags_lock); + xfs_ifunlock(ip); xfs_iunlock(ip, XFS_ILOCK_EXCL); @@ -1006,7 +1030,7 @@ reclaim: */ spin_lock(&pag->pag_ici_lock); if (!radix_tree_delete(&pag->pag_ici_root, - XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino))) + XFS_INO_TO_AGINO(ip->i_mount, ino))) ASSERT(0); __xfs_inode_clear_reclaim(pag, ip); spin_unlock(&pag->pag_ici_lock); @@ -1023,7 +1047,7 @@ reclaim: xfs_qm_dqdetach(ip); xfs_iunlock(ip, XFS_ILOCK_EXCL); - xfs_inode_free(ip); + __xfs_inode_free(ip); return error; out_ifunlock: diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index b984be4..5b84bbc 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -3222,7 +3222,6 @@ xfs_iflush_cluster( * Try to get locks. If any are unavailable or it is pinned, * then this inode cannot be flushed and is skipped. */ - if (!xfs_ilock_nowait(cip, XFS_ILOCK_SHARED)) continue; if (!xfs_iflock_nowait(cip)) { @@ -3235,6 +3234,19 @@ xfs_iflush_cluster( continue; } + + /* + * Check the inode number again, just to be certain we are not + * racing with freeing in xfs_reclaim_inode(). See the comments + * in that function for more information as to why the initial + * check is not sufficient. + */ + if (!cip->i_ino) { + xfs_ifunlock(cip); + xfs_iunlock(cip, XFS_ILOCK_SHARED); + continue; + } + /* * arriving here means that this inode can be flushed. First * re-check that it's dirty before flushing. -- 2.7.0 From dave@fromorbit.com Thu Apr 7 18:38:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 29FC27CC7 for ; Thu, 7 Apr 2016 18:38:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id DE5E9304039 for ; Thu, 7 Apr 2016 16:38:52 -0700 (PDT) X-ASG-Debug-ID: 1460072308-04bdf011042f6de0004-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 94LFd2c0D1F4dCH2 for ; Thu, 07 Apr 2016 16:38:50 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2C5DgA27gZXPDGaLHldgzeBUIZrn0kBAQEBBpF5ih2BP00BAQEBAQEHAQEBAUJAhEIBBScvMwgYMTkDBxQZiCbCQ4VZiRhghTAFmASODoFlh3WFMUWOX4IYAQtCGYFcKjCHfgcXB4EWAQEB Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail04.adl6.internode.on.net with ESMTP; 08 Apr 2016 09:08:27 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1aoJVK-00004t-CF for xfs@oss.sgi.com; Fri, 08 Apr 2016 09:38:26 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1aoJUo-0006GD-89 for xfs@oss.sgi.com; Fri, 08 Apr 2016 09:37:54 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 5/6] xfs: xfs_inode_free() isn't RCU safe Date: Fri, 8 Apr 2016 09:37:50 +1000 X-ASG-Orig-Subj: [PATCH 5/6] xfs: xfs_inode_free() isn't RCU safe Message-Id: <1460072271-23923-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1460072271-23923-1-git-send-email-david@fromorbit.com> References: <1460072271-23923-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1460072329 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28537 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The xfs_inode freed in xfs_inode_free() has multiple allocated structures attached to it. We free these in xfs_inode_free() before we mark the inode as invalid, and before we run call_rcu() to queue the structure for freeing. Unfortunately, this freeing can race with other accesses that are in the RCU current grace period that have found the inode in the radix tree with a valid state. This includes xfs_iflush_cluster(), which calls xfs_inode_clean(), and that accesses the inode log item on the xfs_inode. The log item structure is freed in xfs_inode_free(), so there is the possibility we can be accessing freed memory in xfs_iflush_cluster() after validating the xfs_inode structure as being valid for this RCU context. Hence we can get spuriously incorrect clean state returned from such checks. This can lead to use thinking the inode is dirty when it is, in fact, clean, and so incorrectly attaching it to the buffer for IO and completion processing. This then leads to use-after-free situations on the xfs_inode itself if the IO completes after the current RCU grace period expires. The buffer callbacks will access the xfs_inode and try to do all sorts of things it shouldn't with freed memory. IOWs, xfs_iflush_cluster() only works correctly when racing with inode reclaim if the inode log item is present and correctly stating the inode is clean. If the inode is being freed, then reclaim has already made sure the inode is clean, and hence xfs_iflush_cluster can skip it. However, we are accessing the inode inode under RCU read lock protection and so also must ensure that all dynamically allocated memory we reference in this context is not freed until the RCU grace period expires. To fix this, move all the potential memory freeing into xfs_inode_free_callback() so that we are guarantee RCU protected lookup code will always have the memory structures it needs available during the RCU grace period that lookup races can occur in. Discovered-by: Brain Foster Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_icache.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index bf2d607..0c94cde 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -94,13 +94,6 @@ xfs_inode_free_callback( struct inode *inode = container_of(head, struct inode, i_rcu); struct xfs_inode *ip = XFS_I(inode); - kmem_zone_free(xfs_inode_zone, ip); -} - -void -xfs_inode_free( - struct xfs_inode *ip) -{ switch (VFS_I(ip)->i_mode & S_IFMT) { case S_IFREG: case S_IFDIR: @@ -118,6 +111,13 @@ xfs_inode_free( ip->i_itemp = NULL; } + kmem_zone_free(xfs_inode_zone, ip); +} + +void +xfs_inode_free( + struct xfs_inode *ip) +{ /* * Because we use RCU freeing we need to ensure the inode always * appears to be reclaimed with an invalid inode number when in the -- 2.7.0 From BATV+9c8718d1e17d2f6f8ba3+4610+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 7 18:43:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 940F27CB0 for ; Thu, 7 Apr 2016 18:43:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 548B28F8050 for ; Thu, 7 Apr 2016 16:43:20 -0700 (PDT) X-ASG-Debug-ID: 1460072597-04cb6c2460330e50001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id kEO5ddHv28DQCxFv (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 07 Apr 2016 16:43:17 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9c8718d1e17d2f6f8ba3+4610+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1aoJa1-00078D-3S; Thu, 07 Apr 2016 23:43:17 +0000 Date: Thu, 7 Apr 2016 16:43:17 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/6] xfs: fix inode validity check in xfs_iflush_cluster Message-ID: <20160407234317.GA26634@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfs: fix inode validity check in xfs_iflush_cluster References: <1460072271-23923-1-git-send-email-david@fromorbit.com> <1460072271-23923-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460072271-23923-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1460072597 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28537 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Apr 08, 2016 at 09:37:46AM +1000, Dave Chinner wrote: > From: Dave Chinner > > Some careless idiot(*) wrote crap code in commit 1a3e8f3 ("xfs: > convert inode cache lookups to use RCU locking") back in late 2010, > and so xfs_iflush_cluster checks the wrong inode for whether it is > still valid under RCU protection. Fix it to lock and check the > correct inode. Looks fine, Reviewed-by: Christoph Hellwig From BATV+9c8718d1e17d2f6f8ba3+4610+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 7 18:44:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 462A97CB4 for ; Thu, 7 Apr 2016 18:44:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1F2BB304039 for ; Thu, 7 Apr 2016 16:44:13 -0700 (PDT) X-ASG-Debug-ID: 1460072650-04cbb065b262ff0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id WVTszxsiWeyiK7kX (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 07 Apr 2016 16:44:11 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9c8718d1e17d2f6f8ba3+4610+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1aoJas-0007HK-Gd; Thu, 07 Apr 2016 23:44:10 +0000 Date: Thu, 7 Apr 2016 16:44:10 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/6] xfs: rename variables in xfs_iflush_cluster for clarity Message-ID: <20160407234410.GB26634@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfs: rename variables in xfs_iflush_cluster for clarity References: <1460072271-23923-1-git-send-email-david@fromorbit.com> <1460072271-23923-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460072271-23923-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1460072651 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28537 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+9c8718d1e17d2f6f8ba3+4610+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 7 18:46:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B5FEC7CAF for ; Thu, 7 Apr 2016 18:46:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6D6768F8049 for ; Thu, 7 Apr 2016 16:46:49 -0700 (PDT) X-ASG-Debug-ID: 1460072806-04bdf011042f7350001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id q9OuJ3CtmXRFXnAr (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 07 Apr 2016 16:46:46 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9c8718d1e17d2f6f8ba3+4610+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1aoJdE-0000LU-I1; Thu, 07 Apr 2016 23:46:36 +0000 Date: Thu, 7 Apr 2016 16:46:36 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 6/6] xfs: mark reclaimed inodes invalid earlier Message-ID: <20160407234636.GC26634@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 6/6] xfs: mark reclaimed inodes invalid earlier References: <1460072271-23923-1-git-send-email-david@fromorbit.com> <1460072271-23923-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460072271-23923-7-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1460072806 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28537 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > + spin_lock(&ip->i_flags_lock); > + ip->i_flags = XFS_IRECLAIM; > + ip->i_ino = 0; > + spin_unlock(&ip->i_flags_lock); It's just a tiny sniplet, but still duplicated from xfs_inode_free(). Maybe add another helper for this? Otherwise looks fine: Reviewed-by: Christoph Hellwig From BATV+9c8718d1e17d2f6f8ba3+4610+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 7 18:48:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2F5BB7CAF for ; Thu, 7 Apr 2016 18:48:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id EF7E08F8049 for ; Thu, 7 Apr 2016 16:48:58 -0700 (PDT) X-ASG-Debug-ID: 1460072918-04cbb02e1a001c0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id bq461arUwtseM2Ht (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 07 Apr 2016 16:48:38 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9c8718d1e17d2f6f8ba3+4610+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1aoJfB-0000dQ-6P; Thu, 07 Apr 2016 23:48:37 +0000 Date: Thu, 7 Apr 2016 16:48:37 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Eryu Guan , fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs/259: handle minimum block size more precisely Message-ID: <20160407234837.GA1439@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs/259: handle minimum block size more precisely References: <1460027155-4222-1-git-send-email-eguan@redhat.com> <20160407213231.GD761@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160407213231.GD761@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1460072918 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28538 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Apr 08, 2016 at 07:32:31AM +1000, Dave Chinner wrote: > > diff --git a/tests/xfs/259 b/tests/xfs/259 > > index 16c1935..3150ff3 100755 > > --- a/tests/xfs/259 > > +++ b/tests/xfs/259 > > @@ -51,9 +51,7 @@ testfile=$TEST_DIR/259.image > > # Test various sizes slightly less than 4 TB. Need to handle different > > # minimum block sizes for CRC enabled filesystems, but use a small log so we > > # don't write lots of zeros unnecessarily. > > -xfs_info $TEST_DIR | _filter_mkfs 2> $tmp.mkfs > /dev/null > > -. $tmp.mkfs > > This tests the configuration of the test device, which is not > controlled by the test harness, so can be different to the > configuration being used for the scratch device. > > > -if [ $_fs_has_crcs -eq 1 ]; then > > +if [ $XFS_MKFS_CRC_DEFAULT -eq 1 ]; then > > IOWs, this is not an not equivalent test. And I think that's the whole point of this change :) Previously it tested what the TEST_DIR did, which was wrong for this test. Now it tests what mkfs does by default (including for the scratch dev), which is what we really want here. From BATV+9c8718d1e17d2f6f8ba3+4610+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 7 18:50:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F2F057CB3 for ; Thu, 7 Apr 2016 18:50:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CBA91304039 for ; Thu, 7 Apr 2016 16:50:45 -0700 (PDT) X-ASG-Debug-ID: 1460073043-04cbb02e1d002b0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id ovamOmzEU6jm1gaK (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 07 Apr 2016 16:50:44 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9c8718d1e17d2f6f8ba3+4610+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1aoJhD-0002Io-9x; Thu, 07 Apr 2016 23:50:43 +0000 Date: Thu, 7 Apr 2016 16:50:43 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfs: Don't wrap growfs AGFL indexes Message-ID: <20160407235043.GB1439@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: Don't wrap growfs AGFL indexes References: <1459836310-12619-1-git-send-email-david@fromorbit.com> <1459836310-12619-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459836310-12619-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1460073043 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28538 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Apr 05, 2016 at 04:05:07PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Commit 96f859d ("libxfs: pack the agfl header structure so > XFS_AGFL_SIZE is correct") allowed the freelist to use the empty > slot at the end of the freelist on 64 bit systems that was not > being used due to sizeof() rounding up the structure size. > > This has caused versions of xfs_repair prior to 4.5.0 (which also > has the fix) to report this as a corruption once the filesystem has > been grown. Older kernels can also have problems (seen from a whacky > container/vm management environment) mounting filesystems grown on a > system with a newer kernel than the vm/container it is deployed on. > > To avoid this problem, change the initial free list indexes not to > wrap across the end of the AGFL, hence avoiding the initialisation > of agf_fllast to the last index in the AGFL. I have to admit that it's been a while that I looked at the AGFL code, but I simply don't understand what's happening in this patch. Diff slightly reorder: > - agf->agf_flfirst = 0; > + agf->agf_flfirst = cpu_to_be32(1); So flfirst moves from 0 to 1. > - agf->agf_fllast = cpu_to_be32(XFS_AGFL_SIZE(mp) - 1); > + agf->agf_fllast = 0; And last from size - 1 to 0. In my naive reading this introduces wrapping and doesn't remove it. What do I miss? From david@fromorbit.com Thu Apr 7 19:23:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 20D9D7CA0 for ; Thu, 7 Apr 2016 19:23:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 88FACAC005 for ; Thu, 7 Apr 2016 17:23:48 -0700 (PDT) X-ASG-Debug-ID: 1460075025-04cb6c2464332830001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id P3puvC4QRg2DZNLV for ; Thu, 07 Apr 2016 17:23:46 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BeDwCN+AZXPDGaLHldgzeBUIZrn0kBAQEBBowRhWiEEIYHAgIBAQKBPU0BAQEBAQEHAQEBAUJAhEEBAQEEOhwjEAgDFQMJJQ8FJQMHLYgmwhUBAQEBAQUBAQEBHBmFQIUThQuCX4IrBZgEjgKPF48kgmYZgVwqMIk5AQEB Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail04.adl6.internode.on.net with ESMTP; 08 Apr 2016 09:39:11 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aoJz4-00008w-Ts; Fri, 08 Apr 2016 10:09:10 +1000 Date: Fri, 8 Apr 2016 10:09:10 +1000 From: Dave Chinner To: jtulak@redhat.com Cc: xfs@oss.sgi.com Subject: Re: [PATCH 17/19] xfsprogs: disable truncating of files Message-ID: <20160408000910.GB21804@dastard> X-ASG-Orig-Subj: Re: [PATCH 17/19] xfsprogs: disable truncating of files References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-18-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1458818136-56043-18-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1460075025 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28539 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Mar 24, 2016 at 12:15:34PM +0100, jtulak@redhat.com wrote: > From: Jan Tulak > > Unify mkfs.xfs behaviour a bit and never truncate files. If the user > is trying to mkfs an existing file, we don't want to destroy anything > he did with the file before (sparse file, allocations...) Why not? We do that with discard-by-default to block devices, O_TRUNC is exactly the same situation with a file - we completely re-initialise the file from a known state if mkfs has been asked to create the file. > @@ -1059,9 +1063,9 @@ check_device_type( > } > > /* > - * We only want to completely truncate and recreate an existing file if > - * we were specifically told it was a file. Set the create flag only in > - * this case to trigger that behaviour. > + * We only want to create a file only if we were specifically told > + * we want a file. Set the create flag only in this case to trigger > + * that behaviour. > */ > if (S_ISREG(statbuf.st_mode)) { > if (!*isfile) i.e. this situation. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Thu Apr 7 19:25:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2E7F57CA0 for ; Thu, 7 Apr 2016 19:25:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7BA4CAC006 for ; Thu, 7 Apr 2016 17:25:39 -0700 (PDT) X-ASG-Debug-ID: 1460075133-04cbb02e1d01800001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 1u4aMj9GA6BHGZm3 for ; Thu, 07 Apr 2016 17:25:34 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id C76F8481A for ; Thu, 7 Apr 2016 19:25:32 -0500 (CDT) Subject: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-16-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <5706FA7C.7020103@sandeen.net> Date: Thu, 7 Apr 2016 19:25:32 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: <1458818136-56043-16-git-send-email-jtulak@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1460075133 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28539 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > From: Dave Chinner > > CHANGELOG > o Fix where xi.dname was incorrectly used instead of dfile > o Variable alignment (tabs) > o Added error handling for stat/statfs in init.c > o Remove a duplicate pread in zero_old_xfs_structures and for the > remaining call, save the return value in a more meaningful variable. > o A chunk moved to previous patch. > > If the device is actually a file, and "-d file" is not specified, > mkfs will try to treat it as a block device and get stuff wrong. > Image files don't necessarily have the same sector sizes as the > block device or filesystem underlying the image file, nor should we > be issuing discard ioctls on image files. > > To fix this sanely, only require "-d file" if the device name is > invalid to trigger creation of the file. Otherwise, use stat() to > determine if the device is a file or block device and deal with that > appropriately by setting the "isfile" variables and turning off > direct IO. Then ensure that we check the "isfile" options before > doing things that are specific to block devices. Also, as direct IO > is disabled for files, use statfs() for getting host FS blocksize, > not platform_findsizes(). > > These changes, however, can cause some tests to fail when the test > partition on which the file is created has blocksize bigger than 512. > Before, the underlying fs was ignored. Now, an attempt to create > a fs in a file with blocksize 512 on a 4096 underlying partition will > fail. > > Other file/blockdev issues fixed: > - use getstr to detect specifying the data device name > twice. > - check file/size/name parameters before anything else. > - overwrite checks need to be done before the image file is > opened and potentially truncated. > - blkid_get_topology() should not be called for image files, > so warn when it is called that way. > - zero_old_xfs_structures() emits a spurious error: > "existing superblock read failed: Success" > when it is run on a truncated image file. Don't warn if we > see this problem on an image file. > - Don't issue discards on image files. > - Use fsync() for image files, not BLKFLSBUF in > platform_flush_device() for Linux. This one causes at least one interesting issue: #mkfs/mkfs.xfs Error accessing specified device (null): Bad address Usage: mkfs.xfs ... because: check_device_type(dfile, &xi.disfile, !dsize, !dfile, Nflag ? NULL : &xi.dcreat, force_overwrite, "d"); so "dfile" can be NULL, but that function immediately tries to stat it. > Signed-off-by: Dave Chinner > Signed-off-by: Jan Tulak > --- > libxfs/init.c | 12 ++++ > libxfs/linux.c | 12 +++- > mkfs/xfs_mkfs.c | 181 ++++++++++++++++++++++++++++++++++++++------------------ > 3 files changed, 147 insertions(+), 58 deletions(-) > > diff --git a/libxfs/init.c b/libxfs/init.c > index 8d747e8..268136f 100644 > --- a/libxfs/init.c > +++ b/libxfs/init.c > @@ -246,6 +246,9 @@ libxfs_init(libxfs_init_t *a) > char rtpath[25]; > int rval = 0; > int flags; > + struct stat st; > + struct statfs stfs; > + int statres; > > dpath[0] = logpath[0] = rtpath[0] = '\0'; > dname = a->dname; > @@ -278,6 +281,15 @@ libxfs_init(libxfs_init_t *a) > a->ddev= libxfs_device_open(dname, a->dcreat, flags, > a->setblksize); > a->dfd = libxfs_device_to_fd(a->ddev); > + statres = stat(dname, &st); > + statres += statfs(dname, &stfs); > + if(statres){ ^space ^space > + fprintf(stderr, _("%s: stat failed.\n"), > + progname); > + goto done; > + } > + a->dsize = st.st_size/BBSIZE; > + a->dbsize = stfs.f_bsize; ok so for a file you choose ->dsize to be file size in 512-sector units, and ->dbsize to be the fs block size. This is all under if (a->disfile); if we didn't actually specify "-dfile" but it *is* a file, then we get to platform_findsizes() - which handles files. And handles them differently. Hm but you removed that (see below) and added more stat() calls...? What is the reason for adding these stats at this point? (and if there's a reason, why only for ->disfile but not ->lisfile?) > } else { > if (!check_open(dname, flags, &rawfile, &blockfile)) > goto done; > diff --git a/libxfs/linux.c b/libxfs/linux.c > index f6ea1b2..adb8ff1 100644 > --- a/libxfs/linux.c > +++ b/libxfs/linux.c > @@ -18,6 +18,7 @@ > > #define ustat __kernel_ustat > #include > +#include > #include > #undef ustat > #include > @@ -125,7 +126,16 @@ platform_set_blocksize(int fd, char *path, dev_t device, int blocksize, int fata > void > platform_flush_device(int fd, dev_t device) > { > - if (major(device) != RAMDISK_MAJOR) > + struct stat64 st; > + if (major(device) == RAMDISK_MAJOR) > + return; > + > + if (fstat64(fd, &st) < 0) > + return; > + > + if (S_ISREG(st.st_mode)) > + fsync(fd); > + else > ioctl(fd, BLKFLSBUF, 0); > } > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index 9261ed5..7bd9fd5 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c > @@ -787,7 +787,7 @@ calc_stripe_factors( > #ifdef ENABLE_BLKID > static int > check_overwrite( > - char *device) > + const char *device) > { > const char *type; > blkid_probe pr = NULL; > @@ -804,7 +804,7 @@ check_overwrite( > fd = open(device, O_RDONLY); > if (fd < 0) > goto out; > - platform_findsizes(device, fd, &size, &bsz); > + platform_findsizes((char *)device, fd, &size, &bsz); > close(fd); > > /* nothing to overwrite on a 0-length device */ > @@ -851,7 +851,6 @@ check_overwrite( > "according to blkid\n"), progname, device); > } > ret = 1; > - > out: > if (pr) > blkid_free_probe(pr); > @@ -877,8 +876,12 @@ static void blkid_get_topology( > struct stat statbuf; > > /* can't get topology info from a file */ > - if (!stat(device, &statbuf) && S_ISREG(statbuf.st_mode)) > + if (!stat(device, &statbuf) && S_ISREG(statbuf.st_mode)) { > + fprintf(stderr, > + _("%s: Warning: trying to probe topology of a file %s!\n"), > + progname, device); > return; > + } > > pr = blkid_new_probe_from_filename(device); > if (!pr) > @@ -976,35 +979,35 @@ static void get_topology( > struct fs_topology *ft, > int force_overwrite) > { > - struct stat statbuf; > char *dfile = xi->volname ? xi->volname : xi->dname; > + struct stat statbuf; > + struct statfs statfsbuf; > > /* > - * If our target is a regular file, use platform_findsizes > - * to try to obtain the underlying filesystem's requirements > - * for direct IO; we'll set our sector size to that if possible. > + * If our target is a regular file, use statfs > + * to try to obtain the underlying filesystem's blocksize. > */ > if (xi->disfile || > - (!stat(dfile, &statbuf) && S_ISREG(statbuf.st_mode))) { > + (!stat(dfile, &statbuf) && S_ISREG(statbuf.st_mode))) { dave pointed out that this indentation "fix" is incorrect, the line is fine as it is; it's part of the same conditional; it shouldn't be tabbed into the code block under the conditional. > int fd; > int flags = O_RDONLY; > - long long dummy; > > /* with xi->disfile we may not have the file yet! */ > if (xi->disfile) > flags |= O_CREAT; > > fd = open(dfile, flags, 0666); > + > if (fd >= 0) { > - platform_findsizes(dfile, fd, &dummy, &ft->lsectorsize); > + fstatfs(fd, &statfsbuf); no error checking on fstatfs, but... > + ft->lsectorsize = statfsbuf.f_bsize; Ok, platform_findsizes already explicitly handled regular files, and tries to find out via an xfs ioctl what the minimum DIO size is, and uses that for the sector size for the filesystem in the iamge. Now you stat & get the blocksize, and use that instead, but it's likely to be different: i.e. before: # mkfs/mkfs.xfs -f fsfile meta-data=fsfile isize=512 agcount=4, agsize=65536 blks = sectsz=512 attr=2, projid32bit=1 after: # mkfs/mkfs.xfs -f fsfile meta-data=fsfile isize=512 agcount=4, agsize=65536 blks = sectsz=4096 attr=2, projid32bit=1 and also, now: # mkfs/mkfs.xfs -f -dfile,name=fsfile,size=1g -b size=2048 block size 2048 cannot be smaller than logical sector size 4096 What prompted you to make this change, was there some other problem you needed to fix? > close(fd); > - ft->psectorsize = ft->lsectorsize; hm, now psectorsize isn't set at all? > } else > ft->psectorsize = ft->lsectorsize = BBSIZE; > } else { > blkid_get_topology(dfile, &ft->dsunit, &ft->dswidth, > - &ft->lsectorsize, &ft->psectorsize, > - force_overwrite); > + &ft->lsectorsize, &ft->psectorsize, > + force_overwrite); please don't change these lines, they line up w/ the function opening paren as they should. > } > > if (xi->rtname && !xi->risfile) { > @@ -1016,6 +1019,75 @@ static void get_topology( > } > > static void > +check_device_type( > + const char *name, > + int *isfile, > + bool no_size, > + bool no_name, > + int *create, > + bool force_overwrite, > + const char *optname) > +{ > + struct stat64 statbuf; > + > + if (*isfile && (no_size || no_name)) { > + fprintf(stderr, > + _("if -%s file then -%s name and -%s size are required\n"), > + optname, optname, optname); > + usage(); > + } > + > + if (stat64(name, &statbuf)) { > + if (errno == ENOENT && *isfile) { > + if (create) > + *create = 1; > + return; > + } > + > + fprintf(stderr, > + _("Error accessing specified device %s: %s\n"), > + name, strerror(errno)); > + usage(); > + return; > + } > + > + if (!force_overwrite && check_overwrite(name)) { > + fprintf(stderr, > + _("%s: Use the -f option to force overwrite.\n"), > + progname); > + exit(1); > + } > + > + /* > + * We only want to completely truncate and recreate an existing file if > + * we were specifically told it was a file. Set the create flag only in > + * this case to trigger that behaviour. > + */ > + if (S_ISREG(statbuf.st_mode)) { > + if (!*isfile) > + *isfile = 1; > + else if (create) > + *create = 1; > + return; > + } > + > + if (S_ISBLK(statbuf.st_mode)) { > + if (*isfile) { > + fprintf(stderr, > + _("specified \"-%s file\" on a block device %s\n"), > + optname, name); > + usage(); > + } > + return; > + } > + > + fprintf(stderr, > + _("specified device %s not a file or block device\n"), > + name); > + usage(); > +} > + > +static void > fixup_log_stripe_unit( > int lsflag, > int sunit, > @@ -1279,7 +1351,6 @@ zero_old_xfs_structures( > __uint32_t bsize; > int i; > xfs_off_t off; > - int tmp; > > /* > * We open regular files with O_TRUNC|O_CREAT. Nothing to do here... > @@ -1299,15 +1370,23 @@ zero_old_xfs_structures( > } > memset(buf, 0, new_sb->sb_sectsize); > > - tmp = pread(xi->dfd, buf, new_sb->sb_sectsize, 0); > - if (tmp < 0) { > + off = pread(xi->dfd, buf, new_sb->sb_sectsize, 0); > + if (off < 0) { > fprintf(stderr, _("existing superblock read failed: %s\n"), > strerror(errno)); > goto done; > } > - if (tmp != new_sb->sb_sectsize) { > - fprintf(stderr, > - _("warning: could not read existing superblock, skip zeroing\n")); > + /* > + * If we are creating an image file, it might be of zero length at this > + * point in time. Hence reading the existing superblock is going to > + * return zero bytes. It's not a failure we need to warn about in this > + * case. > + */ except you already did "if (off < 0) fail" above this. Ok, at this point I think it might be best to revert to Dave's original version. If there were specific problems you were trying to address, can you point them out? Thanks, -Eric > + if (off != new_sb->sb_sectsize) { > + if (!xi->disfile) > + fprintf(stderr, > + _("error reading existing superblock: %s\n"), > + strerror(errno)); > goto done; > } > libxfs_sb_from_disk(&sb, buf); > @@ -1787,8 +1866,6 @@ main( > case D_FILE: > xi.disfile = getnum(value, &dopts, > D_FILE); > - if (xi.disfile && !Nflag) > - xi.dcreat = 1; > break; > case D_NAME: > xi.dname = getstr(value, &dopts, D_NAME); > @@ -1914,11 +1991,6 @@ main( > case L_FILE: > xi.lisfile = getnum(value, &lopts, > L_FILE); > - if (xi.lisfile && loginternal) > - conflict('l', subopts, L_INTERNAL, > - L_FILE); > - if (xi.lisfile) > - xi.lcreat = 1; > break; > case L_INTERNAL: > loginternal = getnum(value, &lopts, > @@ -2087,8 +2159,6 @@ _("cannot specify both -m crc=1 and -n ftype\n")); > case R_FILE: > xi.risfile = getnum(value, &ropts, > R_FILE); > - if (xi.risfile) > - xi.rcreat = 1; > break; > case R_NAME: > case R_DEV: > @@ -2193,6 +2263,26 @@ _("Minimum block size for CRC enabled filesystems is %d bytes.\n"), > lsectorsize = sectorsize; > } > > + /* > + * Before anything else, verify that we are correctly operating on > + * files or block devices and set the control parameters correctly. > + * Explicitly disable direct IO for image files so we don't error out on > + * sector size mismatches between the new filesystem and the underlying > + * host filesystem. > + */ > + check_device_type(dfile, &xi.disfile, !dsize, !dfile, > + Nflag ? NULL : &xi.dcreat, force_overwrite, "d"); > + if (!loginternal) > + check_device_type(xi.logname, &xi.lisfile, !logsize, !xi.logname, > + Nflag ? NULL : &xi.lcreat, > + force_overwrite, "l"); > + if (xi.rtname) > + check_device_type(xi.rtname, &xi.risfile, !rtsize, !xi.rtname, > + Nflag ? NULL : &xi.rcreat, > + force_overwrite, "r"); > + if (xi.disfile || xi.lisfile || xi.risfile) > + xi.isdirect = 0; > + > memset(&ft, 0, sizeof(ft)); > get_topology(&xi, &ft, force_overwrite); > > @@ -2345,11 +2435,6 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); > } > > > - if (xi.disfile && (!dsize || !xi.dname)) { > - fprintf(stderr, > - _("if -d file then -d name and -d size are required\n")); > - usage(); > - } > if (dsize) { > __uint64_t dbytes; > > @@ -2382,11 +2467,6 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); > usage(); > } > > - if (xi.lisfile && (!logsize || !xi.logname)) { > - fprintf(stderr, > - _("if -l file then -l name and -l size are required\n")); > - usage(); > - } > if (logsize) { > __uint64_t logbytes; > > @@ -2404,11 +2484,6 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); > (long long)logbytes, blocksize, > (long long)(logblocks << blocklog)); > } > - if (xi.risfile && (!rtsize || !xi.rtname)) { > - fprintf(stderr, > - _("if -r file then -r name and -r size are required\n")); > - usage(); > - } > if (rtsize) { > __uint64_t rtbytes; > > @@ -2530,22 +2605,14 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); > xi.rtsize &= sector_mask; > xi.logBBsize &= (__uint64_t)-1 << (MAX(lsectorlog, 10) - BBSHIFT); > > - if (!force_overwrite) { > - if (check_overwrite(dfile) || > - check_overwrite(logfile) || > - check_overwrite(xi.rtname)) { > - fprintf(stderr, > - _("%s: Use the -f option to force overwrite.\n"), > - progname); > - exit(1); > - } > - } > > + /* don't do discards on print-only runs or on files */ > if (discard && !Nflag) { > - discard_blocks(xi.ddev, xi.dsize); > - if (xi.rtdev) > + if (!xi.disfile) > + discard_blocks(xi.ddev, xi.dsize); > + if (xi.rtdev && !xi.risfile) > discard_blocks(xi.rtdev, xi.rtsize); > - if (xi.logdev && xi.logdev != xi.ddev) > + if (xi.logdev && xi.logdev != xi.ddev && !xi.lisfile) > discard_blocks(xi.logdev, xi.logBBsize); > } > > From sandeen@sandeen.net Thu Apr 7 19:32:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BA7A27CA0 for ; Thu, 7 Apr 2016 19:32:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8D51D8F804C for ; Thu, 7 Apr 2016 17:32:39 -0700 (PDT) X-ASG-Debug-ID: 1460075557-04cb6c2464332e00001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id TWyCEWUFYpMfAe8C for ; Thu, 07 Apr 2016 17:32:37 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 9D860481A for ; Thu, 7 Apr 2016 19:32:36 -0500 (CDT) Subject: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-16-git-send-email-jtulak@redhat.com> <5706FA7C.7020103@sandeen.net> From: Eric Sandeen Message-ID: <5706FC23.9050507@sandeen.net> Date: Thu, 7 Apr 2016 19:32:35 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: <5706FA7C.7020103@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: 1460075557 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28539 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/7/16 7:25 PM, Eric Sandeen wrote: >> @@ -1299,15 +1370,23 @@ zero_old_xfs_structures( >> > } >> > memset(buf, 0, new_sb->sb_sectsize); >> > >> > - tmp = pread(xi->dfd, buf, new_sb->sb_sectsize, 0); >> > - if (tmp < 0) { >> > + off = pread(xi->dfd, buf, new_sb->sb_sectsize, 0); >> > + if (off < 0) { >> > fprintf(stderr, _("existing superblock read failed: %s\n"), >> > strerror(errno)); >> > goto done; >> > } >> > - if (tmp != new_sb->sb_sectsize) { >> > - fprintf(stderr, >> > - _("warning: could not read existing superblock, skip zeroing\n")); >> > + /* >> > + * If we are creating an image file, it might be of zero length at this >> > + * point in time. Hence reading the existing superblock is going to >> > + * return zero bytes. It's not a failure we need to warn about in this >> > + * case. >> > + */ > except you already did "if (off < 0) fail" above this. (oh, right, < 0 is different than == 0, sorry; so that part is ok) Possibly better as: if (off < 0 || (tmp != new_sb->sb_sectsize && !xi->disfile)) fprintf("error reading existing superblock ...") I still think this patch might need a reset though :) Thanks, -Eric > Ok, at this point I think it might be best to revert to Dave's original version. > > If there were specific problems you were trying to address, can you point them out? > > Thanks, > -Eric > From sandeen@sandeen.net Thu Apr 7 19:42:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 92C0F7CA0 for ; Thu, 7 Apr 2016 19:42:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 55FB2304039 for ; Thu, 7 Apr 2016 17:42:02 -0700 (PDT) X-ASG-Debug-ID: 1460076119-04bdf011032f9340001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id tEGkOd4MMIhQQaIW for ; Thu, 07 Apr 2016 17:42:00 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id EC292481A for ; Thu, 7 Apr 2016 19:41:58 -0500 (CDT) Subject: Re: [PATCH 18/19] mkfs: unit conversions are case insensitive To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 18/19] mkfs: unit conversions are case insensitive References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-19-git-send-email-jtulak@redhat.com> <57057B2A.3000100@sandeen.net> From: Eric Sandeen Message-ID: <5706FE56.7060308@sandeen.net> Date: Thu, 7 Apr 2016 19:41:58 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1460076119 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28539 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/7/16 5:50 AM, Jan Tulak wrote: > On Wed, Apr 6, 2016 at 11:10 PM, Eric Sandeen >wrote: > > On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > > From: Jan Tulak > > > > > Solves the question "Should I use 10g or 10G?" > > Might be nicer to do it like the cvtnum in libxcmd: > > c = tolower(*sp); > switch (c) { > case 'b': > return i * blocksize; > ... > > ​Yeah, changed. > ​ > > > > (hm, why do we have 3 copies of cvtnum?) > > > ​Where? ​ > ​ > > ​$ pwd > ​/some/path/xfsprogs-dev > > $ grep -r "cvtnum(size_t" . |grep -v "^Binary" > ​./include/input.h:extern long long cvtnum(size_t blocksize, size_t sectorsize, char *s); > ./io/init.h:extern void init_cvtnum(size_t *blocksize, size_t *sectsize); File Line 0 estimate/xfs_estimate.c 29 cvtnum(char *s) 1 libxcmd/input.c 147 cvtnum( 2 mkfs/xfs_mkfs.c 3618 cvtnum( -Eric From david@fromorbit.com Thu Apr 7 20:10:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 93C047CA0 for ; Thu, 7 Apr 2016 20:10:45 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1F252AC002 for ; Thu, 7 Apr 2016 18:10:41 -0700 (PDT) X-ASG-Debug-ID: 1460077836-04bdf011042fa4f0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Fat17B8bSOfHDAxh for ; Thu, 07 Apr 2016 18:10:36 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BgDwCGBAdXPDGaLHldgzeBUIZrn0kBAQEBBowRhWiEEIYHAgIBAQKBPE0BAQEBAQEHAQEBAUJAhEIBAQQjDwEjIxAIAxgCAgUeAwICDwUlAwcDFxOIJrALkhQBAQEBBgIBHRljhF2FE4c/K4IrBY1OijaOAo8XjySCZhmBXCowiTkBAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail04.adl6.internode.on.net with ESMTP; 08 Apr 2016 10:35:19 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aoKpS-0000IT-73; Fri, 08 Apr 2016 11:03:18 +1000 Date: Fri, 8 Apr 2016 11:03:18 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH 18/19] mkfs: unit conversions are case insensitive Message-ID: <20160408010318.GA567@dastard> X-ASG-Orig-Subj: Re: [PATCH 18/19] mkfs: unit conversions are case insensitive References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-19-git-send-email-jtulak@redhat.com> <57057B2A.3000100@sandeen.net> <5706FE56.7060308@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <5706FE56.7060308@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: 1460077836 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28540 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Apr 07, 2016 at 07:41:58PM -0500, Eric Sandeen wrote: > On 4/7/16 5:50 AM, Jan Tulak wrote: > > On Wed, Apr 6, 2016 at 11:10 PM, Eric Sandeen >wrote: > > (hm, why do we have 3 copies of cvtnum?) > > > > > > ​Where? ​ > > ​ > > > > ​$ pwd > > ​/some/path/xfsprogs-dev > > > > $ grep -r "cvtnum(size_t" . |grep -v "^Binary" > > ​./include/input.h:extern long long cvtnum(size_t blocksize, size_t sectorsize, char *s); > > ./io/init.h:extern void init_cvtnum(size_t *blocksize, size_t *sectsize); > > File Line > 0 estimate/xfs_estimate.c 29 cvtnum(char *s) > 1 libxcmd/input.c 147 cvtnum( > 2 mkfs/xfs_mkfs.c 3618 cvtnum( FWIW, here's why we put the function name at the start of the line, rather than the way that it is typically done in the kernel code (i.e. after the return type specification): $ git grep ^cvtnum estimate/xfs_estimate.c:cvtnum(char *s) libxcmd/input.c:cvtnum( mkfs/xfs_mkfs.c:cvtnum( Cheers, Dave. -- Dave Chinner david@fromorbit.com From eguan@redhat.com Thu Apr 7 22:28:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 387BA7CA0 for ; Thu, 7 Apr 2016 22:28:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 07B958F8039 for ; Thu, 7 Apr 2016 20:28:45 -0700 (PDT) X-ASG-Debug-ID: 1460086123-04cbb02e1d089e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id EOuctNThzLbP1aEW (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 07 Apr 2016 20:28:44 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 821747F080; Fri, 8 Apr 2016 03:28:43 +0000 (UTC) Received: from localhost (dhcp12-159.nay.redhat.com [10.66.12.159] (may be forged)) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u383SgLB024385; Thu, 7 Apr 2016 23:28:42 -0400 Date: Fri, 8 Apr 2016 11:28:41 +0800 From: Eryu Guan To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/6 v2] xfs: xfs_iflush_cluster vs xfs_reclaim_inode Message-ID: <20160408032841.GW10345@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH 0/6 v2] xfs: xfs_iflush_cluster vs xfs_reclaim_inode References: <1460072271-23923-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460072271-23923-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460086124 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Apr 08, 2016 at 09:37:45AM +1000, Dave Chinner wrote: > Hi folks, > > This is the second version of this patch set, first posted and > described here: > > http://oss.sgi.com/archives/xfs/2016-04/msg00069.html Just a quick note here, I'm testing the v1 patchset right now, v4.6-rc2 kernel + v1 patch, config file is based on rhel7 debug kernel config. The test is the same as the original reproducer (long term fsstress run on XFS, exported from NFS). The test on x86_64 host has been running for two days and everything looks fine. Test on ppc64 host has been running for a few hours and I noticed a lock issue and a few warnings, not sure if it's related to the patches or even to XFS yet(I need to run test on stock -rc2 kernel to be sure), but just post the logs here for reference [ 1911.626286] ====================================================== [ 1911.626291] [ INFO: possible circular locking dependency detected ] [ 1911.626297] 4.6.0-rc2.debug+ #1 Not tainted [ 1911.626301] ------------------------------------------------------- [ 1911.626306] nfsd/7402 is trying to acquire lock: [ 1911.626311] (&s->s_sync_lock){+.+.+.}, at: [] .sync_inodes_sb+0xe0/0x230 [ 1911.626327] [ 1911.626327] but task is already holding lock: [ 1911.626333] (sb_internal){.+.+.+}, at: [] .__sb_start_write+0x90/0x130 [ 1911.626346] [ 1911.626346] which lock already depends on the new lock. [ 1911.626346] [ 1911.626353] [ 1911.626353] the existing dependency chain (in reverse order) is: [ 1911.626358] -> #1 (sb_internal){.+.+.+}: [ 1911.626368] [] .__lock_acquire+0x3fc/0xee0 [ 1911.626377] [] .lock_acquire+0xf8/0x360 [ 1911.626384] [] .percpu_down_read+0x5c/0x110 [ 1911.626392] [] .__sb_start_write+0x100/0x130 [ 1911.626399] [] .xfs_trans_alloc+0x2c/0x70 [xfs] [ 1911.626461] [] .xfs_inactive_truncate+0x2c/0x1a0 [xfs] [ 1911.626521] [] .xfs_inactive+0x218/0x260 [xfs] [ 1911.626581] [] .xfs_fs_evict_inode+0x14c/0x370 [xfs] [ 1911.626640] [] .evict+0xdc/0x1f0 [ 1911.626647] [] .sync_inodes_sb+0x188/0x230 [ 1911.626654] [] .sync_inodes_one_sb+0x1c/0x30 [ 1911.626661] [] .iterate_supers+0x17c/0x190 [ 1911.626668] [] .sys_sync+0x48/0xd0 [ 1911.626675] [] system_call+0x38/0xec [ 1911.626682] -> #0 (&s->s_sync_lock){+.+.+.}: [ 1911.626692] [] .validate_chain.isra.35+0x918/0xc70 [ 1911.626699] [] .__lock_acquire+0x3fc/0xee0 [ 1911.626706] [] .lock_acquire+0xf8/0x360 [ 1911.626713] [] .mutex_lock_nested+0xb0/0x5e0 [ 1911.626721] [] .sync_inodes_sb+0xe0/0x230 [ 1911.626728] [] .xfs_flush_inodes+0x38/0x60 [xfs] [ 1911.626787] [] .xfs_create+0x898/0xb30 [xfs] [ 1911.626847] [] .xfs_generic_create+0x208/0x3a0 [xfs] [ 1911.626907] [] .vfs_create+0x15c/0x1f0 [ 1911.626913] [] .do_nfsd_create+0x444/0x580 [nfsd] [ 1911.626942] [] .nfsd4_open+0x388/0xa00 [nfsd] [ 1911.626972] [] .nfsd4_proc_compound+0x42c/0x720 [nfsd] [ 1911.626998] [] .nfsd_dispatch+0x118/0x2d0 [nfsd] [ 1911.627024] [] .svc_process_common+0x550/0x8b0 [sunrpc] [ 1911.627056] [] .svc_process+0x14c/0x610 [sunrpc] [ 1911.627088] [] .nfsd+0x238/0x380 [nfsd] [ 1911.627113] [] .kthread+0x114/0x140 [ 1911.627120] [] .ret_from_kernel_thread+0x58/0x60 [ 1911.627127] [ 1911.627127] other info that might help us debug this: [ 1911.627127] [ 1911.627134] Possible unsafe locking scenario: [ 1911.627134] [ 1911.627139] CPU0 CPU1 [ 1911.627143] ---- ---- [ 1911.627147] lock(sb_internal); [ 1911.627153] lock(&s->s_sync_lock); [ 1911.627160] lock(sb_internal); [ 1911.627166] lock(&s->s_sync_lock); [ 1911.627172] [ 1911.627172] *** DEADLOCK *** [ 1911.627172] [ 1911.627179] 4 locks held by nfsd/7402: [ 1911.627183] #0: (sb_writers#8){.+.+.+}, at: [] .__sb_start_write+0x100/0x130 [ 1911.627198] #1: (&type->i_mutex_dir_key#3/1){+.+.+.}, at: [] .do_nfsd_create+0x224/0x580 [nfsd] [ 1911.627234] #2: (sb_internal){.+.+.+}, at: [] .__sb_start_write+0x90/0x130 [ 1911.627248] #3: (&type->s_umount_key#44){++++++}, at: [] .xfs_flush_inodes+0x24/0x60 [xfs] [ 1911.627316] [ 1911.627316] stack backtrace: [ 1911.627323] CPU: 1 PID: 7402 Comm: nfsd Not tainted 4.6.0-rc2.debug+ #1 [ 1911.627328] Call Trace: [ 1911.627333] [c0000005f2c36d10] [c000000000938df8] .dump_stack+0xe0/0x14c (unreliable) [ 1911.627342] [c0000005f2c36da0] [c00000000092fd28] .print_circular_bug+0x354/0x388 [ 1911.627350] [c0000005f2c36e50] [c000000000137260] .check_prev_add+0x8d0/0x8e0 [ 1911.627357] [c0000005f2c36f60] [c000000000137b88] .validate_chain.isra.35+0x918/0xc70 [ 1911.627365] [c0000005f2c37050] [c00000000013947c] .__lock_acquire+0x3fc/0xee0 [ 1911.627372] [c0000005f2c37170] [c00000000013a998] .lock_acquire+0xf8/0x360 [ 1911.627379] [c0000005f2c37250] [c000000000922830] .mutex_lock_nested+0xb0/0x5e0 [ 1911.627386] [c0000005f2c37360] [c0000000003585f0] .sync_inodes_sb+0xe0/0x230 [ 1911.627445] [c0000005f2c37460] [d0000000066e48f8] .xfs_flush_inodes+0x38/0x60 [xfs] [ 1911.627505] [c0000005f2c374e0] [d0000000066d85c8] .xfs_create+0x898/0xb30 [xfs] [ 1911.627565] [c0000005f2c37600] [d0000000066d0ac8] .xfs_generic_create+0x208/0x3a0 [xfs] [ 1911.627573] [c0000005f2c376d0] [c0000000003293fc] .vfs_create+0x15c/0x1f0 [ 1911.627599] [c0000005f2c37770] [d00000000a60d7e4] .do_nfsd_create+0x444/0x580 [nfsd] [ 1911.627625] [c0000005f2c37850] [d00000000a61e0b8] .nfsd4_open+0x388/0xa00 [nfsd] [ 1911.627651] [c0000005f2c37910] [d00000000a61eb5c] .nfsd4_proc_compound+0x42c/0x720 [nfsd] [ 1911.627677] [c0000005f2c379f0] [d00000000a603178] .nfsd_dispatch+0x118/0x2d0 [nfsd] [ 1911.627709] [c0000005f2c37a90] [d000000006dfde90] .svc_process_common+0x550/0x8b0 [sunrpc] [ 1911.627741] [c0000005f2c37b70] [d000000006dfe33c] .svc_process+0x14c/0x610 [sunrpc] [ 1911.627768] [c0000005f2c37c10] [d00000000a602268] .nfsd+0x238/0x380 [nfsd] [ 1911.627775] [c0000005f2c37cb0] [c0000000000e9ac4] .kthread+0x114/0x140 [ 1911.627782] [c0000005f2c37e30] [c000000000009578] .ret_from_kernel_thread+0x58/0x60 [ 2046.852739] kworker/dying (399) used greatest stack depth: 4352 bytes left [ 2854.687381] XFS: Assertion failed: buffer_mapped(bh), file: fs/xfs/xfs_aops.c, line: 780 [ 2854.687434] ------------[ cut here ]------------ [ 2854.687488] WARNING: CPU: 5 PID: 28924 at fs/xfs/xfs_message.c:105 .asswarn+0x2c/0x40 [xfs] [ 2854.687493] Modules linked in: rpcsec_gss_krb5 nfsv4 dns_resolver nfs fscache dm_mod loop sg pseries_rng nfsd auth_rpcgss nfs_acl lockd sunrpc grace ip_tables xfs libcrc32c sd_mod ibmvscsi ibmveth scsi_transport_srp [ 2854.687530] CPU: 5 PID: 28924 Comm: kworker/u32:4 Not tainted 4.6.0-rc2.debug+ #1 [ 2854.687538] Workqueue: writeback .wb_workfn (flush-253:0) [ 2854.687545] task: c0000001e6d28380 ti: c0000000fe3ac000 task.ti: c0000000fe3ac000 [ 2854.687549] NIP: d0000000066ddafc LR: d0000000066ddafc CTR: c0000000004dd880 [ 2854.687554] REGS: c0000000fe3aeeb0 TRAP: 0700 Not tainted (4.6.0-rc2.debug+) [ 2854.687558] MSR: 8000000100029032 CR: 28002048 XER: 0000000d [ 2854.687577] CFAR: d0000000066dd890 SOFTE: 1 GPR00: d0000000066ddafc c0000000fe3af130 d000000006765850 ffffffffffffffea GPR04: 000000000000000a c0000000fe3aef50 00000000000000d1 ffffffffffffffc0 GPR08: 0000000000000000 0000000000000021 00000000ffffffd1 d000000006741dc0 GPR12: c0000000004dd880 c00000000e822d00 c0000000fe3af4e0 0000000000000001 GPR16: c0000000fe3af6f0 0000000000000002 0000000000000000 0000000000000007 GPR20: 0000000000000003 c0000000fe3af4f0 0000000000000000 c0000000fe3af210 GPR24: 0000000000000004 0000000000001000 0000000000160000 f000000000f0e100 GPR28: c0000004055d18c8 c000000016cde430 0000000000157000 c0000004055d15f0 [ 2854.687694] NIP [d0000000066ddafc] .asswarn+0x2c/0x40 [xfs] [ 2854.687742] LR [d0000000066ddafc] .asswarn+0x2c/0x40 [xfs] [ 2854.687746] Call Trace: [ 2854.687793] [c0000000fe3af130] [d0000000066ddafc] .asswarn+0x2c/0x40 [xfs] (unreliable) [ 2854.687846] [c0000000fe3af1a0] [d0000000066a9104] .xfs_do_writepage+0x414/0x930 [xfs] [ 2854.687854] [c0000000fe3af2b0] [c00000000025df6c] .write_cache_pages+0x5fc/0x820 [ 2854.687905] [c0000000fe3af470] [d0000000066a8a5c] .xfs_vm_writepages+0x8c/0xd0 [xfs] [ 2854.687912] [c0000000fe3af540] [c00000000025f62c] .do_writepages+0x3c/0x70 [ 2854.687918] [c0000000fe3af5b0] [c00000000035b1ec] .__writeback_single_inode+0x5bc/0xd50 [ 2854.687924] [c0000000fe3af680] [c00000000035c3c0] .writeback_sb_inodes+0x380/0x730 [ 2854.687930] [c0000000fe3af7f0] [c00000000035ca44] .wb_writeback+0x194/0x920 [ 2854.687935] [c0000000fe3af960] [c00000000035ddcc] .wb_workfn+0x19c/0xa40 [ 2854.687943] [c0000000fe3afad0] [c0000000000dfc74] .process_one_work+0x264/0x8f0 [ 2854.687949] [c0000000fe3afbc0] [c0000000000e0388] .worker_thread+0x88/0x520 [ 2854.687955] [c0000000fe3afcb0] [c0000000000e9ac4] .kthread+0x114/0x140 [ 2854.687961] [c0000000fe3afe30] [c000000000009578] .ret_from_kernel_thread+0x58/0x60 [ 2854.687966] Instruction dump: [ 2854.687970] 60420000 7c0802a6 3d420000 7c691b78 7c862378 e88abe38 7ca72b78 38600000 [ 2854.687983] 7d254b78 f8010010 f821ff91 4bfffcf9 <0fe00000> 38210070 e8010010 7c0803a6 [ 2854.687997] ---[ end trace 872ac2709186f780 ]--- [ 2854.688001] XFS: Assertion failed: buffer_mapped(bh), file: fs/xfs/xfs_aops.c, line: 780 [ 2854.688022] ------------[ cut here ]------------ [ 2854.688072] WARNING: CPU: 5 PID: 28924 at fs/xfs/xfs_message.c:105 .asswarn+0x2c/0x40 [xfs] [ 2854.688076] Modules linked in: rpcsec_gss_krb5 nfsv4 dns_resolver nfs fscache dm_mod loop sg pseries_rng nfsd auth_rpcgss nfs_acl lockd sunrpc grace ip_tables xfs libcrc32c sd_mod ibmvscsi ibmveth scsi_transport_srp [ 2854.688110] CPU: 5 PID: 28924 Comm: kworker/u32:4 Tainted: G W 4.6.0-rc2.debug+ #1 [ 2854.688116] Workqueue: writeback .wb_workfn (flush-253:0) [ 2854.688121] task: c0000001e6d28380 ti: c0000000fe3ac000 task.ti: c0000000fe3ac000 [ 2854.688126] NIP: d0000000066ddafc LR: d0000000066ddafc CTR: c0000000004dd880 [ 2854.688131] REGS: c0000000fe3aeeb0 TRAP: 0700 Tainted: G W (4.6.0-rc2.debug+) [ 2854.688135] MSR: 8000000100029032 CR: 48002048 XER: 0000000d [ 2854.688153] CFAR: d0000000066dd890 SOFTE: 1 GPR00: d0000000066ddafc c0000000fe3af130 d000000006765850 ffffffffffffffea GPR04: 000000000000000a c0000000fe3aef50 00000000000000d1 ffffffffffffffc0 GPR08: 0000000000000000 0000000000000021 00000000ffffffd1 d000000006741dc0 GPR12: c0000000004dd880 c00000000e822d00 c0000000fe3af4e0 0000000000000001 GPR16: c0000000fe3af6f0 0000000000000002 0000000000000000 0000000000000007 GPR20: 0000000000000003 c0000000fe3af4f0 0000000000000000 c0000000fe3af210 GPR24: 0000000000000004 0000000000001000 0000000000160000 f000000000f0e100 GPR28: c0000004055d18c8 c000000016cde430 0000000000158000 c0000004055d1588 [ 2854.688268] NIP [d0000000066ddafc] .asswarn+0x2c/0x40 [xfs] [ 2854.688318] LR [d0000000066ddafc] .asswarn+0x2c/0x40 [xfs] [ 2854.688321] Call Trace: [ 2854.688369] [c0000000fe3af130] [d0000000066ddafc] .asswarn+0x2c/0x40 [xfs] (unreliable) [ 2854.688423] [c0000000fe3af1a0] [d0000000066a9104] .xfs_do_writepage+0x414/0x930 [xfs] [ 2854.688430] [c0000000fe3af2b0] [c00000000025df6c] .write_cache_pages+0x5fc/0x820 [ 2854.688481] [c0000000fe3af470] [d0000000066a8a5c] .xfs_vm_writepages+0x8c/0xd0 [xfs] [ 2854.688487] [c0000000fe3af540] [c00000000025f62c] .do_writepages+0x3c/0x70 [ 2854.688493] [c0000000fe3af5b0] [c00000000035b1ec] .__writeback_single_inode+0x5bc/0xd50 [ 2854.688499] [c0000000fe3af680] [c00000000035c3c0] .writeback_sb_inodes+0x380/0x730 [ 2854.688505] [c0000000fe3af7f0] [c00000000035ca44] .wb_writeback+0x194/0x920 [ 2854.688510] [c0000000fe3af960] [c00000000035ddcc] .wb_workfn+0x19c/0xa40 [ 2854.688516] [c0000000fe3afad0] [c0000000000dfc74] .process_one_work+0x264/0x8f0 [ 2854.688522] [c0000000fe3afbc0] [c0000000000e0388] .worker_thread+0x88/0x520 [ 2854.688528] [c0000000fe3afcb0] [c0000000000e9ac4] .kthread+0x114/0x140 [ 2854.688534] [c0000000fe3afe30] [c000000000009578] .ret_from_kernel_thread+0x58/0x60 [ 2854.688539] Instruction dump: [ 2854.688543] 60420000 7c0802a6 3d420000 7c691b78 7c862378 e88abe38 7ca72b78 38600000 [ 2854.688555] 7d254b78 f8010010 f821ff91 4bfffcf9 <0fe00000> 38210070 e8010010 7c0803a6 [ 2854.688568] ---[ end trace 872ac2709186f781 ]--- [then the XFS warning repeated for a few times triggered by different pid] Thanks, Eryu From jtulak@redhat.com Fri Apr 8 04:09:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 50FDE7CA1 for ; Fri, 8 Apr 2016 04:09:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 24C128F8039 for ; Fri, 8 Apr 2016 02:09:11 -0700 (PDT) X-ASG-Debug-ID: 1460106549-04cb6c24643492b0001-NocioJ Received: from mail-io0-f182.google.com (mail-io0-f182.google.com [209.85.223.182]) by cuda.sgi.com with ESMTP id F3YKNhHdfWAA9tnx (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 08 Apr 2016 02:09:09 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.182 Received: by mail-io0-f182.google.com with SMTP id q128so124735041iof.3 for ; Fri, 08 Apr 2016 02:09:09 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=zdVXY0HEEbii3CM2vhbbQczZhBfim1m20ZRVgZnc6XY=; b=e5aLbElSJLCxroid5iE40Yq/30u5DpgMlZ8NdNyv9WLzeThYLyIubVk8Ga2GYUhplN Iq4XcaiAnTwwO8yjwltF4RVe/rBIRWUOXLAGutx/1A52Mh4gSxpPnDk6Yoabc6knfXx7 xEgAaVdIxCxC/KBt3ESAINgFJF4K4R47icW/nfNfIIgJ8cTlsz68wA36KcjY+k3kRYBj I+M9LEgB7FCq6LhbVf0r/ZBXeYdOf/lj44h5Cnv35yZtJU31wnpXfJMHz/bgpqAmv+7q 9PkNAdOJomG21j9HddPw6HmGLyysjXTOcdbD20JMTEgeRssN0rgQeOKZTJNKSVhzh0bo O1Gg== X-Gm-Message-State: AD7BkJKTO+gpBcJz4/BhJvgNdO0KmCPcov/8DjjTaEpoanAGhnzauI5jNyglugHqdkF1ypPvhzBpo3H9QbDoSvfI X-Received: by 10.107.170.17 with SMTP id t17mr9590768ioe.71.1460106548545; Fri, 08 Apr 2016 02:09:08 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.79 with HTTP; Fri, 8 Apr 2016 02:08:49 -0700 (PDT) In-Reply-To: <20160408010318.GA567@dastard> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-19-git-send-email-jtulak@redhat.com> <57057B2A.3000100@sandeen.net> <5706FE56.7060308@sandeen.net> <20160408010318.GA567@dastard> From: Jan Tulak Date: Fri, 8 Apr 2016 11:08:49 +0200 Message-ID: Subject: Re: [PATCH 18/19] mkfs: unit conversions are case insensitive To: Dave Chinner X-ASG-Orig-Subj: Re: [PATCH 18/19] mkfs: unit conversions are case insensitive Cc: Eric Sandeen , xfs-oss Content-Type: multipart/alternative; boundary=001a11427d742950a9052ff58cc1 X-Barracuda-Connect: mail-io0-f182.google.com[209.85.223.182] X-Barracuda-Start-Time: 1460106549 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28548 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 --001a11427d742950a9052ff58cc1 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Fri, Apr 8, 2016 at 3:03 AM, Dave Chinner wrote: > On Thu, Apr 07, 2016 at 07:41:58PM -0500, Eric Sandeen wrote: > > On 4/7/16 5:50 AM, Jan Tulak wrote: > > > On Wed, Apr 6, 2016 at 11:10 PM, Eric Sandeen >wrote: > > > (hm, why do we have 3 copies of cvtnum?) > > > > > > > > > =E2=80=8BWhere? =E2=80=8B > > > =E2=80=8B > > > > > > =E2=80=8B$ pwd > > > =E2=80=8B/some/path/xfsprogs-dev > > > > > > $ grep -r "cvtnum(size_t" . |grep -v "^Binary" > > > =E2=80=8B./include/input.h:extern long long cvtnum(size_t blocksize, = size_t > sectorsize, char *s); > > > ./io/init.h:extern void init_cvtnum(size_t *blocksize, size_t > *sectsize); > > > > File Line > > 0 estimate/xfs_estimate.c 29 cvtnum(char *s) > > 1 libxcmd/input.c 147 cvtnum( > > 2 mkfs/xfs_mkfs.c 3618 cvtnum( > > FWIW, here's why we put the function name at the start of the line, > rather than the way that it is typically done in the kernel code > (i.e. after the return type specification): > > $ git grep ^cvtnum > estimate/xfs_estimate.c:cvtnum(char *s) > libxcmd/input.c:cvtnum( > mkfs/xfs_mkfs.c:cvtnum( > > =E2=80=8BAh, I see. A nice trick. :-) It might be good to merge the three functions, but I think it can wait for when this patchset is done - or there is always going to be something more to add... Thanks, Jan =E2=80=8B --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --001a11427d742950a9052ff58cc1 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
    On Fri, Ap= r 8, 2016 at 3:03 AM, Dave Chinner <david@fromorbit.com> wrote:
    On Thu, = Apr 07, 2016 at 07:41:58PM -0500, Eric Sandeen wrote:
    > On 4/7/16 5:50 AM, Jan Tulak wrote:
    > > On Wed, Apr 6, 2016 at 11:10 PM, Eric Sandeen <sandeen@sandeen.net <mailto:sandeen@sandeen.net>>wrote:
    > >=C2=A0 =C2=A0 =C2=A0(hm, why do we have 3 = copies of cvtnum?)
    > >
    > >
    > > =E2=80=8BWhere? =E2=80=8B
    > >=C2=A0 =E2=80=8B
    > >
    > > =E2=80=8B$ pwd
    > > =E2=80=8B/some/path/xfsprogs-dev
    > >
    > > $ grep -r "cvtnum(size_t" . |grep -v "^Binary"= ;
    > > =E2=80=8B./include/input.h:extern long long cvtnum(size_t blocksi= ze, size_t sectorsize, char *s);
    > > ./io/init.h:extern void init_cvtnum(size_t *blocksize, size_t *se= ctsize);
    >
    >=C2=A0 =C2=A0File=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 Line
    > 0 estimate/xfs_estimate.c=C2=A0 =C2=A029 cvtnum(char *s)
    > 1 libxcmd/input.c=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 147 cvtnum(
    > 2 mkfs/xfs_mkfs.c=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A03618 cvtnum(

    FWIW, here's why we put the function name at the start of the li= ne,
    rather than the way that it is typically done in the kernel code
    (i.e. after the return type specification):

    $ git grep ^cvtnum
    estimate/xfs_estimate.c:cvtnum(char *s)
    libxcmd/input.c:cvtnum(
    mkfs/xfs_mkfs.c:cvtnum(


    =E2=80=8BAh, I see. = A nice trick. :-)

    It might be good to merge the three functions, but I think = it can wait for when this patchset is done - or there is always going to be= something more to add...=C2=A0

    Thanks,
    Jan= =E2=80=8B
    =C2=A0
    --
    --001a11427d742950a9052ff58cc1-- From jtulak@redhat.com Fri Apr 8 05:07:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BF5107CA3 for ; Fri, 8 Apr 2016 05:07:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3FA0AAC002 for ; Fri, 8 Apr 2016 03:06:57 -0700 (PDT) X-ASG-Debug-ID: 1460110015-04bdf0110433fd70001-NocioJ Received: from mail-io0-f175.google.com (mail-io0-f175.google.com [209.85.223.175]) by cuda.sgi.com with ESMTP id C0Gb9wfBeYHV2Cjh (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 08 Apr 2016 03:06:56 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.175 Received: by mail-io0-f175.google.com with SMTP id q128so126110273iof.3 for ; Fri, 08 Apr 2016 03:06:56 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=Wt3bbAB7IltaH59JzqfGr5iOJhT/UfMWhulhQipzMI4=; b=HXM2aU/SGJfIKrETRN6Jya+D983jMXZnXHSPWqm/pa4Lm5G4RhfJpw6WGJvV9ba9uM Lpet18YK9mZDwWIQp0j1PQzWt/YFB4csI3R0uOcHboKIfi1AE+oBkQwPG6tGh/aZ/j89 /OxFKPIfPaVqvO1p29wYT4fVYM21mR7PYSRmYhA93gHmYjpPaGOyg5DTra07B1PwFHcL Kgx1LwzbR6l6XJvPWcfN1IDBwvhhYRVT2oKuNnwn/O7VNjqLm2GPo0XgBeoHlCwPn8aB BFdO+Ji8+JkJ6Dx60jrw7SrEBGe5E/mB6bX8aT51vVqvBaMhB8mpp7cX0Ftx+YN+xHJe 9HZA== X-Gm-Message-State: AD7BkJKZRztGg6DOiCg4fQJCu2rh+Jc5x1QHbUjJq3k5u/YnII5ygYDVLPUlICfeGSYUjpYmHB9VoaAbjcZqI++n X-Received: by 10.107.9.202 with SMTP id 71mr9438205ioj.52.1460110015409; Fri, 08 Apr 2016 03:06:55 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.79 with HTTP; Fri, 8 Apr 2016 03:06:35 -0700 (PDT) In-Reply-To: <20160408000910.GB21804@dastard> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-18-git-send-email-jtulak@redhat.com> <20160408000910.GB21804@dastard> From: Jan Tulak Date: Fri, 8 Apr 2016 12:06:35 +0200 Message-ID: Subject: Re: [PATCH 17/19] xfsprogs: disable truncating of files To: Dave Chinner X-ASG-Orig-Subj: Re: [PATCH 17/19] xfsprogs: disable truncating of files Cc: xfs-oss Content-Type: multipart/alternative; boundary=001a113ebe20cd6509052ff65a7d X-Barracuda-Connect: mail-io0-f175.google.com[209.85.223.175] X-Barracuda-Start-Time: 1460110015 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28549 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 --001a113ebe20cd6509052ff65a7d Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Fri, Apr 8, 2016 at 2:09 AM, Dave Chinner wrote: > On Thu, Mar 24, 2016 at 12:15:34PM +0100, jtulak@redhat.com wrote: > > From: Jan Tulak > > > > Unify mkfs.xfs behaviour a bit and never truncate files. If the user > > is trying to mkfs an existing file, we don't want to destroy anything > > he did with the file before (sparse file, allocations...) > > Why not? We do that with discard-by-default to block devices, > O_TRUNC is exactly the same situation with a file - we completely > re-initialise the file from a known state if mkfs has been asked to > create the file. > > =E2=80=8BBut AFAIK, we don't zero-out entire spindle devices, we don't as= k if the drive skips some blocks (i.e. because they are bad),=E2=80=8B and we don't = care about what an underlaying layer (like LVM) did with the block device. From this point of view, we shouldn't care about the file either. I can be missing something, though. > > @@ -1059,9 +1063,9 @@ check_device_type( > > } > > > > /* > > - * We only want to completely truncate and recreate an existing > file if > > - * we were specifically told it was a file. Set the create flag > only in > > - * this case to trigger that behaviour. > > + * We only want to create a file only if we were specifically tol= d > > + * we want a file. Set the create flag only in this case to trigg= er > > + * that behaviour. > > */ > > if (S_ISREG(statbuf.st_mode)) { > > if (!*isfile) > > i.e. this situation. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --001a113ebe20cd6509052ff65a7d Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
    On Fri, Ap= r 8, 2016 at 2:09 AM, Dave Chinner <david@fromorbit.com> wrote:
    On Thu, = Mar 24, 2016 at 12:15:34PM +0100, jtul= ak@redhat.com wrote:
    > From: Jan Tulak <jtulak@redhat= .com>
    >
    > Unify mkfs.xfs behaviour a bit and never truncate files. If the user > is trying to mkfs an existing file, we don't want to destroy anyth= ing
    > he did with the file before (sparse file, allocations...)

    Why not? We do that with discard-by-default to block devices,
    O_TRUNC is exactly the same situation with a file - we completely
    re-initialise the file from a known state if mkfs has been asked to
    create the file.

    =E2=80=8BBut AFAIK, we don= 't zero-out entire spindle devices, we don't ask if the drive skips= some blocks (i.e. because they are bad),=E2=80=8B and we don't care ab= out what an underlaying layer (like LVM) did with the block device. From th= is point of view, we shouldn't care about the file either.

    =
    I can be missing something, though.


    > @@ -1059,9 +1063,9 @@ check_device_type(
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0}
    >
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0/*
    > -=C2=A0 =C2=A0 =C2=A0 * We only want to completely truncate and recrea= te an existing file if
    > -=C2=A0 =C2=A0 =C2=A0 * we were specifically told it was a file. Set t= he create flag only in
    > -=C2=A0 =C2=A0 =C2=A0 * this case to trigger that behaviour.
    > +=C2=A0 =C2=A0 =C2=A0 * We only want to create a file only if we were = specifically told
    > +=C2=A0 =C2=A0 =C2=A0 * we want a file. Set the create flag only in th= is case to trigger
    > +=C2=A0 =C2=A0 =C2=A0 * that behaviour.
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 */
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0if (S_ISREG(statbuf.st_mode)) {
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (!*isfile)
    i.e. this situation.

    Cheers,

    Dave.
    --
    Dave Chinner
    david@fromorbit.com



    --
    --001a113ebe20cd6509052ff65a7d-- From jtulak@redhat.com Fri Apr 8 05:31:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 5A61F7CA6 for ; Fri, 8 Apr 2016 05:31:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 12CC6304039 for ; Fri, 8 Apr 2016 03:31:04 -0700 (PDT) X-ASG-Debug-ID: 1460111460-04bdf01105340be0001-NocioJ Received: from mail-io0-f182.google.com (mail-io0-f182.google.com [209.85.223.182]) by cuda.sgi.com with ESMTP id XVRyPTvAuC99uvqR (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 08 Apr 2016 03:31:01 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.182 Received: by mail-io0-f182.google.com with SMTP id g185so126748641ioa.2 for ; Fri, 08 Apr 2016 03:31:01 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=zz0nl2qpGat2fAGoUR9Z5+uWAs9GEiIvIVaIoV8jXQY=; b=VRHz9EACv9N/M1QMGTt/G8Ce70/Ji5hDii42lob4R6a8TXrSchvFEMOojwNyJ4GOuu 6Il0rBoOgNa/sFTBHEXYVhKMOa5aHeXnKNpYem2T9xRFryl09he0irdWJAKvTvN9/JcH uowom/dWZZ11Z6XvKPtDbKwjfmmY9s+lqBXlNMYPdNxQW1j0TKp0/DXm4n4ktrUUukEr RwB53BKZD669AetvF0ocAf1O/DocbEBpfRz3PeEhvjVlhs5rRejtP1XL79rTv5N+Mzim OVNCGW3KA0sJqEJ0p/LBTrh10Za+3dgTuC/HPGA2/GWsxiejbQolQdXIxrToLiYthSXl utjQ== X-Gm-Message-State: AD7BkJIuxIixVvff7xSufyTsUiZc/mkDLRVPNCxLEMOTmHWGPv1Vn7iz0wOe3FpNZ1bEWEeQZnUZrQFU3M+0Gxzq X-Received: by 10.107.9.202 with SMTP id 71mr9560884ioj.52.1460111460335; Fri, 08 Apr 2016 03:31:00 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.79 with HTTP; Fri, 8 Apr 2016 03:30:40 -0700 (PDT) In-Reply-To: <5706981A.9090904@sandeen.net> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-9-git-send-email-jtulak@redhat.com> <5706981A.9090904@sandeen.net> From: Jan Tulak Date: Fri, 8 Apr 2016 12:30:40 +0200 Message-ID: Subject: Re: [PATCH 08/19] mkfs: getbool is redundant To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH 08/19] mkfs: getbool is redundant Cc: xfs-oss Content-Type: multipart/alternative; boundary=001a113ebe20ed1890052ff6b079 X-Barracuda-Connect: mail-io0-f182.google.com[209.85.223.182] X-Barracuda-Start-Time: 1460111460 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28549 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 --001a113ebe20ed1890052ff6b079 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Thu, Apr 7, 2016 at 7:25 PM, Eric Sandeen wrote: > > > "Many options allow for an optional argument of 0 or 1, ..." > > > +disable or enable the functionality, in a forward-compatible syntax. > > What does "forward-compatible syntax" mean? I'm not sure that clarifies > anything for the reader. > > =E2=80=8BYeah, I should reformulate it, I think. The meaning is that it w= on't matter what the defaults are now, or will be in the future. E.g., if you had a script creating a fs without crc before, when it was disabled by default, and we changed the default, you are now creating with the crc. But if you give it -m crc=3D0, then no matter what the default is, you have it always disabled. How about changing the line to "Boolean options allows for optional argument of value 0 or 1, to explicitly disable or enable the functionality," and dropping the forward-compatible part? > Otherwise this looks ok to me; Dave explained that it is intentional to > make every single option accept a value, whether it is now > boolean or a numeric value, so there is no such thing as a bare "--flag" > anymore; such flags are always "--flag [0|1]" now, right? > =E2=80=8BFor options inside of -m, -d and such, yes. Top-level flags, that = is -f, -q, -N, -K and -V, are still only flags, but these don't change the FS attributes. They are something different from the other. Still, I wonder whether they should accept [0|1] too... =E2=80=8B > > > @@ -312,10 +315,12 @@ and > > .B swidth > > values. > > .TP > > -.BI noalign > > -This option disables automatic geometry detection and creates the > filesystem > > +.BI noalign[=3D value ] > > +If the > > +.I value > > +is 1, this option disables automatic geometry detection and creates th= e > filesystem > > without stripe geometry alignment even if the underlying storage devic= e > provides > > -this information. > > +this information. 0 disables this option, that is, enables automatic > detection. > > .RE > > .TP > > .B \-f > > The realtime section of the manpage needs this same fixup now too, I gues= s. > > Done=E2=80=8B > Thanks, > -Eric > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > =E2=80=8BThanks, Jan=E2=80=8B --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --001a113ebe20ed1890052ff6b079 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
    On Thu, Ap= r 7, 2016 at 7:25 PM, Eric Sandeen <sandeen@sandeen.net> wrote:

    <= br>
    "Many options allow for an optional argument of 0 or 1, ..= ."

    > +disable or enable the functionality, in a forward-compatible syntax.<= br>
    What does "forward-compatible syntax" mean?=C2=A0 I'm = not sure that clarifies
    anything for the reader.

    =E2=80=8BYeah, I should reformulate it, I think. T= he meaning is that it won't matter what the defaults are now, or will b= e in the future. E.g., if you had a script creating a fs without crc before= , when it was disabled by default, and we changed the default, you are now = creating with the crc. But if you give it -m crc=3D0, then no matter what t= he default is, you have it always disabled.

    How about = changing the line to "Boolean options allows for optional argument of = value 0 or 1, to explicitly disable or enable the functionality," and = dropping the forward-compatible part?

    =C2=A0
    Otherwise this looks ok to me; Dave explained that it is intentional to
    make every single option accept a value, whether it is now
    boolean or a numeric value, so there is no such thing as a bare "--fla= g"
    anymore; such flags are always "--flag [0|1]" now, right?

    =E2=80=8BFor option= s inside of -m, -d and such, yes. Top-level flags, that is -f, -q, -N, -K a= nd -V, are still only flags, but these don't change the FS attributes. = They are something different from the other. Still, I wonder whether they s= hould accept [0|1] too...

    =E2=80=8B=C2=A0

    > @@ -312,10 +315,12 @@ and
    >=C2=A0 .B swidth
    >=C2=A0 values.
    >=C2=A0 .TP
    > -.BI noalign
    > -This option disables automatic geometry detection and creates the fil= esystem
    > +.BI noalign[=3D value ]
    > +If the
    > +.I value
    > +is 1, this option disables automatic geometry detection and creates t= he filesystem
    >=C2=A0 without stripe geometry alignment even if the underlying storage= device provides
    > -this information.
    > +this information. 0 disables this option, that is, enables automatic = detection.
    >=C2=A0 .RE
    >=C2=A0 .TP
    >=C2=A0 .B \-f

    The realtime section of the manpage needs this same fixup now too, I= guess.

    Done=E2=80=8B

    =C2=A0
    Thanks,
    -Eric

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

    =E2=80=8BThanks,
    Jan=E2=80=8B=


    --
    Jan Tulak
    jtulak@redhat.com=C2=A0/ <= a href=3D"mailto:jan@tulak.me" target=3D"_blank">jan@tulak.me
    --001a113ebe20ed1890052ff6b079-- From jtulak@redhat.com Fri Apr 8 05:48:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 4FF667CA3 for ; Fri, 8 Apr 2016 05:48:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1EC3B8F8035 for ; Fri, 8 Apr 2016 03:48:18 -0700 (PDT) X-ASG-Debug-ID: 1460112493-04cbb02e1a1b9c0001-NocioJ Received: from mail-io0-f176.google.com (mail-io0-f176.google.com [209.85.223.176]) by cuda.sgi.com with ESMTP id pASY5c85q7NzUFz4 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 08 Apr 2016 03:48:13 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.176 Received: by mail-io0-f176.google.com with SMTP id g185so127135475ioa.2 for ; Fri, 08 Apr 2016 03:48:13 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=GqoJCq66COzfIGRq0lhMo583POmFEADokjjeukO24E0=; b=fAvsUFAJFrXteFWXYVFQGIhix/IPEzGMFpftWHsyFusvyFx7XvrARyAjPo6CaGx9HA FJ21A+0nZOFglASkeC1aW+owwU5tTd9Z2NhL1t9+vFlW9Y6M293KIsHL0+nkuVLOwSIw OnNvt5A0yCL1Ru10OWXFh/2ebCR5SHzCYbPnOXpswfNreQuNr/wfNkhGAFazgqWJKRQ6 6kE7hyDOdhz+2nDnKFsJ0VBfLRKt1FpHkE8EDbrEKwHk1iRFx3kjknjpNY9CsBlEZWV2 /KmjA0+69iRKrK2mFFPxEdi3lqR+Hjz7Y+XUw+RM+KvYMbv478Xyu/Yt9GS8Go4gOIvU 9CJQ== X-Gm-Message-State: AD7BkJIzISjgnwhMrKzKN0U2oFvrApMA4f2VegtHeRrIErqj7q/lcNtYnpcdO98a0AzruLCKMPXYXIDxy+yvbVtW X-Received: by 10.107.3.149 with SMTP id e21mr7926617ioi.46.1460112493096; Fri, 08 Apr 2016 03:48:13 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.79 with HTTP; Fri, 8 Apr 2016 03:47:53 -0700 (PDT) In-Reply-To: <5706AEC9.7030002@sandeen.net> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-10-git-send-email-jtulak@redhat.com> <5706AEC9.7030002@sandeen.net> From: Jan Tulak Date: Fri, 8 Apr 2016 12:47:53 +0200 Message-ID: Subject: Re: [PATCH 09/19] mkfs: use getnum_checked for all ranged parameters To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH 09/19] mkfs: use getnum_checked for all ranged parameters Cc: xfs-oss Content-Type: multipart/alternative; boundary=001a113eb35e7bea82052ff6ee07 X-Barracuda-Connect: mail-io0-f176.google.com[209.85.223.176] X-Barracuda-Start-Time: 1460112493 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28549 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 --001a113eb35e7bea82052ff6ee07 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Thu, Apr 7, 2016 at 9:02 PM, Eric Sandeen wrote: > > > On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > > From: Dave Chinner > > > > Now that getnum_checked can handle min/max checking, use this for > > all parameters that take straight numbers and don't require unit > > conversions. > > > > Signed-off-by: Dave Chinner > > Signed-off-by: Jan Tulak > > Looks ok. > > Signed-off-by: Eric Sandeen > =E2=80=8BOr Reviewed-by? :-) =E2=80=8BThanks, Jan=E2=80=8B =E2=80=8B > > > --- > > include/xfs_multidisk.h | 5 +- > > mkfs/xfs_mkfs.c | 148 > ++++++++++++++++++++++++------------------------ > > 2 files changed, 76 insertions(+), 77 deletions(-) > > > > diff --git a/include/xfs_multidisk.h b/include/xfs_multidisk.h > > index af35100..8e81d90 100644 > > --- a/include/xfs_multidisk.h > > +++ b/include/xfs_multidisk.h > > @@ -42,8 +42,9 @@ > > > > #define XFS_AG_BYTES(bblog) ((long long)BBSIZE << (bblog)) > > #define XFS_AG_MIN_BYTES ((XFS_AG_BYTES(15))) /* 16 MB = */ > > -#define XFS_AG_MIN_BLOCKS(blog) ((XFS_AG_BYTES(15)) >> (blog)) > > -#define XFS_AG_MAX_BLOCKS(blog) ((XFS_AG_BYTES(31) - 1) >> (blog)= ) > > +#define XFS_AG_MAX_BYTES ((XFS_AG_BYTES(31))) /* 1 TB *= / > > +#define XFS_AG_MIN_BLOCKS(blog) (XFS_AG_MIN_BYTES >> (blog)) > > +#define XFS_AG_MAX_BLOCKS(blog) ((XFS_AG_MAX_BYTES - 1) >> (blog)= ) > > > > #define XFS_MAX_AGNUMBER ((xfs_agnumber_t)(NULLAGNUMBER - 1)) > > > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > > index 0e2cfac..021d682 100644 > > --- a/mkfs/xfs_mkfs.c > > +++ b/mkfs/xfs_mkfs.c > > @@ -163,6 +163,8 @@ struct opt_params dopts =3D { > > }, > > .subopt_params =3D { > > { .index =3D D_AGCOUNT, > > + .minval =3D 1, > > + .maxval =3D XFS_MAX_AGNUMBER, > > .defaultval =3D SUBOPT_NEEDS_VAL, > > }, > > { .index =3D D_FILE, > > @@ -177,18 +179,26 @@ struct opt_params dopts =3D { > > .defaultval =3D SUBOPT_NEEDS_VAL, > > }, > > { .index =3D D_SUNIT, > > + .minval =3D 0, > > + .maxval =3D UINT_MAX, > > .defaultval =3D SUBOPT_NEEDS_VAL, > > }, > > { .index =3D D_SWIDTH, > > + .minval =3D 0, > > + .maxval =3D UINT_MAX, > > .defaultval =3D SUBOPT_NEEDS_VAL, > > }, > > { .index =3D D_AGSIZE, > > + .minval =3D XFS_AG_MIN_BYTES, > > + .maxval =3D XFS_AG_MAX_BYTES, > > .defaultval =3D SUBOPT_NEEDS_VAL, > > }, > > { .index =3D D_SU, > > .defaultval =3D SUBOPT_NEEDS_VAL, > > }, > > { .index =3D D_SW, > > + .minval =3D 0, > > + .maxval =3D UINT_MAX, > > .defaultval =3D SUBOPT_NEEDS_VAL, > > }, > > { .index =3D D_SECTLOG, > > @@ -207,12 +217,18 @@ struct opt_params dopts =3D { > > .defaultval =3D 1, > > }, > > { .index =3D D_RTINHERIT, > > - .defaultval =3D SUBOPT_NEEDS_VAL, > > + .minval =3D 1, > > + .maxval =3D 1, > > + .defaultval =3D 1, > > }, > > { .index =3D D_PROJINHERIT, > > + .minval =3D 0, > > + .maxval =3D UINT_MAX, > > .defaultval =3D SUBOPT_NEEDS_VAL, > > }, > > { .index =3D D_EXTSZINHERIT, > > + .minval =3D 0, > > + .maxval =3D UINT_MAX, > > .defaultval =3D SUBOPT_NEEDS_VAL, > > }, > > }, > > @@ -252,15 +268,23 @@ struct opt_params iopts =3D { > > .defaultval =3D SUBOPT_NEEDS_VAL, > > }, > > { .index =3D I_MAXPCT, > > + .minval =3D 0, > > + .maxval =3D 100, > > .defaultval =3D SUBOPT_NEEDS_VAL, > > }, > > { .index =3D I_PERBLOCK, > > + .minval =3D XFS_MIN_INODE_PERBLOCK, > > + .maxval =3D XFS_MAX_BLOCKSIZE / XFS_DINODE_MIN_SIZE, > > .defaultval =3D SUBOPT_NEEDS_VAL, > > }, > > { .index =3D I_SIZE, > > + .minval =3D XFS_DINODE_MIN_SIZE, > > + .maxval =3D XFS_DINODE_MAX_SIZE, > > .defaultval =3D SUBOPT_NEEDS_VAL, > > }, > > { .index =3D I_ATTR, > > + .minval =3D 0, > > + .maxval =3D 2, > > .defaultval =3D SUBOPT_NEEDS_VAL, > > }, > > { .index =3D I_PROJID32BIT, > > @@ -307,6 +331,8 @@ struct opt_params lopts =3D { > > }, > > .subopt_params =3D { > > { .index =3D L_AGNUM, > > + .minval =3D 0, > > + .maxval =3D UINT_MAX, > > .defaultval =3D SUBOPT_NEEDS_VAL, > > }, > > { .index =3D L_INTERNAL, > > @@ -318,9 +344,13 @@ struct opt_params lopts =3D { > > .defaultval =3D SUBOPT_NEEDS_VAL, > > }, > > { .index =3D L_VERSION, > > + .minval =3D 1, > > + .maxval =3D 2, > > .defaultval =3D SUBOPT_NEEDS_VAL, > > }, > > { .index =3D L_SUNIT, > > + .minval =3D BTOBB(XLOG_MIN_RECORD_BSIZE), > > + .maxval =3D BTOBB(XLOG_MAX_RECORD_BSIZE), > > .defaultval =3D SUBOPT_NEEDS_VAL, > > }, > > { .index =3D L_SU, > > @@ -380,6 +410,8 @@ struct opt_params nopts =3D { > > .defaultval =3D SUBOPT_NEEDS_VAL, > > }, > > { .index =3D N_VERSION, > > + .minval =3D 2, > > + .maxval =3D 2, > > .defaultval =3D SUBOPT_NEEDS_VAL, > > }, > > { .index =3D N_FTYPE, > > @@ -1560,13 +1592,11 @@ main( > > switch (getsubopt(&p, (constpp)subopts, > > &value)) { > > case D_AGCOUNT: > > - if (!value || *value =3D=3D '\0') > > - reqval('d', subopts, > D_AGCOUNT); > > if (daflag) > > respec('d', subopts, > D_AGCOUNT); > > - agcount =3D getnum(value, 0, 0, > false); > > - if ((__int64_t)agcount <=3D 0) > > - illegal(value, "d > agcount"); > > + > > + agcount =3D getnum_checked(value, > &dopts, > > + > D_AGCOUNT); > > daflag =3D 1; > > break; > > case D_AGSIZE: > > @@ -1601,28 +1631,22 @@ main( > > dsize =3D value; > > break; > > case D_SUNIT: > > - if (!value || *value =3D=3D '\0') > > - reqval('d', subopts, > D_SUNIT); > > if (dsunit) > > respec('d', subopts, > D_SUNIT); > > if (nodsflag) > > conflict('d', subopts, > D_NOALIGN, > > D_SUNIT); > > - dsunit =3D getnum(value, 0, 0, > false); > > - if (dsunit < 0) > > - illegal(value, "d sunit")= ; > > + dsunit =3D getnum_checked(value, > &dopts, > > + D_SUNIT)= ; > > break; > > case D_SWIDTH: > > - if (!value || *value =3D=3D '\0') > > - reqval('d', subopts, > D_SWIDTH); > > if (dswidth) > > respec('d', subopts, > D_SWIDTH); > > if (nodsflag) > > conflict('d', subopts, > D_NOALIGN, > > D_SWIDTH); > > - dswidth =3D getnum(value, 0, 0, > false); > > - if (dswidth < 0) > > - illegal(value, "d swidth"= ); > > + dswidth =3D getnum_checked(value, > &dopts, > > + D_SWIDTH= ); > > break; > > case D_SU: > > if (!value || *value =3D=3D '\0') > > @@ -1638,16 +1662,13 @@ main( > > illegal(value, "d su"); > > break; > > case D_SW: > > - if (!value || *value =3D=3D '\0') > > - reqval('d', subopts, D_SW= ); > > if (dsw) > > respec('d', subopts, D_SW= ); > > if (nodsflag) > > conflict('d', subopts, > D_NOALIGN, > > D_SW); > > - dsw =3D getnum(value, 0, 0, false= ); > > - if (dsw < 0) > > - illegal(value, "d sw"); > > + dsw =3D getnum_checked(value, &do= pts, > > + D_SW); > > break; > > case D_NOALIGN: > > nodsflag =3D getnum_checked(value= , > > @@ -1696,21 +1717,22 @@ main( > > ssflag =3D 1; > > break; > > case D_RTINHERIT: > > - fsx.fsx_xflags |=3D \ > > - XFS_DIFLAG_RTINHERIT; > > + c =3D getnum_checked(value, &dopt= s, > > + D_RTINHERIT); > > + if (c) > > + fsx.fsx_xflags |=3D > > + > XFS_DIFLAG_RTINHERIT; > > break; > > case D_PROJINHERIT: > > - if (!value || *value =3D=3D '\0') > > - reqval('d', subopts, > D_PROJINHERIT); > > - fsx.fsx_projid =3D atoi(value); > > - fsx.fsx_xflags |=3D \ > > + fsx.fsx_projid =3D > getnum_checked(value, > > + &dopts, > D_PROJINHERIT); > > + fsx.fsx_xflags |=3D > > XFS_DIFLAG_PROJINHERIT; > > break; > > case D_EXTSZINHERIT: > > - if (!value || *value =3D=3D '\0') > > - reqval('d', subopts, > D_EXTSZINHERIT); > > - fsx.fsx_extsize =3D atoi(value); > > - fsx.fsx_xflags |=3D \ > > + fsx.fsx_extsize =3D > getnum_checked(value, > > + &dopts, > D_EXTSZINHERIT); > > + fsx.fsx_xflags |=3D > > XFS_DIFLAG_EXTSZINHERIT; > > break; > > default: > > @@ -1745,18 +1767,13 @@ main( > > ilflag =3D 1; > > break; > > case I_MAXPCT: > > - if (!value || *value =3D=3D '\0') > > - reqval('i', subopts, > I_MAXPCT); > > if (imflag) > > respec('i', subopts, > I_MAXPCT); > > - imaxpct =3D getnum(value, 0, 0, > false); > > - if (imaxpct < 0 || imaxpct > 100) > > - illegal(value, "i maxpct"= ); > > + imaxpct =3D getnum_checked( > > + value, &iopts, > I_MAXPCT); > > imflag =3D 1; > > break; > > case I_PERBLOCK: > > - if (!value || *value =3D=3D '\0') > > - reqval('i', subopts, > I_PERBLOCK); > > if (ilflag) > > conflict('i', subopts, > I_LOG, > > I_PERBLOCK); > > @@ -1765,16 +1782,13 @@ main( > > if (isflag) > > conflict('i', subopts, > I_SIZE, > > I_PERBLOCK); > > - inopblock =3D getnum(value, 0, 0, > false); > > - if (inopblock < > > - XFS_MIN_INODE_PERBLOCK || > > - !ispow2(inopblock)) > > + inopblock =3D getnum_checked(valu= e, > &iopts, > > + > I_PERBLOCK); > > + if (!ispow2(inopblock)) > > illegal(value, "i > perblock"); > > ipflag =3D 1; > > break; > > case I_SIZE: > > - if (!value || *value =3D=3D '\0') > > - reqval('i', subopts, > I_SIZE); > > if (ilflag) > > conflict('i', subopts, > I_LOG, > > I_SIZE); > > @@ -1783,19 +1797,16 @@ main( > > I_SIZE); > > if (isflag) > > respec('i', subopts, > I_SIZE); > > - isize =3D getnum(value, 0, 0, tru= e); > > - if (isize <=3D 0 || !ispow2(isize= )) > > + isize =3D getnum_checked(value, > &iopts, > > + I_SIZE); > > + if (!ispow2(isize)) > > illegal(value, "i size"); > > inodelog =3D libxfs_highbit32(isi= ze); > > isflag =3D 1; > > break; > > case I_ATTR: > > - if (!value || *value =3D=3D '\0') > > - reqval('i', subopts, > I_ATTR); > > - c =3D getnum(value, 0, 0, false); > > - if (c < 0 || c > 2) > > - illegal(value, "i attr"); > > - sb_feat.attr_version =3D c; > > + sb_feat.attr_version =3D > getnum_checked( > > + value, &iopts, > I_ATTR); > > break; > > case I_PROJID32BIT: > > sb_feat.projid16bit =3D > > @@ -1817,21 +1828,16 @@ main( > > while (*p !=3D '\0') { > > char **subopts =3D (char **)lopts.subo= pts; > > char *value; > > - long long tmp_num; > > > > switch (getsubopt(&p, (constpp)subopts, > > &value)) { > > case L_AGNUM: > > - if (!value || *value =3D=3D '\0') > > - reqval('l', subopts, > L_AGNUM); > > if (laflag) > > respec('l', subopts, > L_AGNUM); > > if (ldflag) > > conflict('l', subopts, > L_AGNUM, L_DEV); > > - tmp_num =3D getnum(value, 0, 0, > false); > > - if (tmp_num < 0) > > - illegal(value, "l agno"); > > - logagno =3D (xfs_agnumber_t)tmp_n= um; > > + logagno =3D getnum_checked(value, > &lopts, > > + L_AGNUM)= ; > > laflag =3D 1; > > break; > > case L_FILE: > > @@ -1868,13 +1874,10 @@ main( > > lsuflag =3D 1; > > break; > > case L_SUNIT: > > - if (!value || *value =3D=3D '\0') > > - reqval('l', subopts, > L_SUNIT); > > if (lsunit) > > respec('l', subopts, > L_SUNIT); > > - lsunit =3D getnum(value, 0, 0, > false); > > - if (lsunit < 0) > > - illegal(value, "l sunit")= ; > > + lsunit =3D getnum_checked(value, > &lopts, > > + L_SUNIT)= ; > > lsunitflag =3D 1; > > break; > > case L_NAME: > > @@ -1893,14 +1896,10 @@ main( > > xi.logname =3D value; > > break; > > case L_VERSION: > > - if (!value || *value =3D=3D '\0') > > - reqval('l', subopts, > L_VERSION); > > if (lvflag) > > respec('l', subopts, > L_VERSION); > > - c =3D getnum(value, 0, 0, false); > > - if (c < 1 || c > 2) > > - illegal(value, "l > version"); > > - sb_feat.log_version =3D c; > > + sb_feat.log_version =3D > getnum_checked( > > + value, &lopts, L_VERSION)= ; > > lvflag =3D 1; > > break; > > case L_SIZE: > > @@ -2035,11 +2034,10 @@ _("cannot specify both -m crc=3D1 and -n > ftype\n")); > > /* ASCII CI mode */ > > sb_feat.nci =3D true; > > } else { > > - c =3D getnum(value, 0, 0, > false); > > - if (c !=3D 2) > > - illegal(value, > > - "n > version"); > > - sb_feat.dir_version =3D c= ; > > + sb_feat.dir_version =3D > > + > getnum_checked(value, > > + &nopts, > > + N_VERSION= ); > > } > > nvflag =3D 1; > > break; > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --001a113eb35e7bea82052ff6ee07 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PGRpdiBjbGFzcz0iZ21haWxfZGVmYXVsdCIgc3R5bGU9ImZvbnQtZmFt aWx5OmFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6 YXJpYWwsc2Fucy1zZXJpZiI+T24gVGh1LCBBcHIgNywgMjAxNiBhdCA5OjAyIFBNLCBFcmljIFNh bmRlZW4gPC9zcGFuPjxzcGFuIGRpcj0ibHRyIiBzdHlsZT0iZm9udC1mYW1pbHk6YXJpYWwsc2Fu cy1zZXJpZiI+Jmx0OzxhIGhyZWY9Im1haWx0bzpzYW5kZWVuQHNhbmRlZW4ubmV0IiB0YXJnZXQ9 Il9ibGFuayI+c2FuZGVlbkBzYW5kZWVuLm5ldDwvYT4mZ3Q7PC9zcGFuPjxzcGFuIHN0eWxlPSJm b250LWZhbWlseTphcmlhbCxzYW5zLXNlcmlmIj4gd3JvdGU6PC9zcGFuPjxicj48L2Rpdj48ZGl2 IGNsYXNzPSJnbWFpbF9leHRyYSI+PGRpdiBjbGFzcz0iZ21haWxfcXVvdGUiPjxibG9ja3F1b3Rl IGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjowIDAgMCAuOGV4O2JvcmRlci1sZWZ0 OjFweCAjY2NjIHNvbGlkO3BhZGRpbmctbGVmdDoxZXgiPjxzcGFuIGNsYXNzPSIiPjxicj4NCjxi cj4NCk9uIDMvMjQvMTYgNjoxNSBBTSwgPGEgaHJlZj0ibWFpbHRvOmp0dWxha0ByZWRoYXQuY29t Ij5qdHVsYWtAcmVkaGF0LmNvbTwvYT4gd3JvdGU6PGJyPg0KJmd0OyBGcm9tOiBEYXZlIENoaW5u ZXIgJmx0OzxhIGhyZWY9Im1haWx0bzpkY2hpbm5lckByZWRoYXQuY29tIj5kY2hpbm5lckByZWRo YXQuY29tPC9hPiZndDs8YnI+DQomZ3Q7PGJyPg0KJmd0OyBOb3cgdGhhdCBnZXRudW1fY2hlY2tl ZCBjYW4gaGFuZGxlIG1pbi9tYXggY2hlY2tpbmcsIHVzZSB0aGlzIGZvcjxicj4NCiZndDsgYWxs IHBhcmFtZXRlcnMgdGhhdCB0YWtlIHN0cmFpZ2h0IG51bWJlcnMgYW5kIGRvbiYjMzk7dCByZXF1 aXJlIHVuaXQ8YnI+DQomZ3Q7IGNvbnZlcnNpb25zLjxicj4NCiZndDs8YnI+DQomZ3Q7IFNpZ25l ZC1vZmYtYnk6IERhdmUgQ2hpbm5lciAmbHQ7PGEgaHJlZj0ibWFpbHRvOmRjaGlubmVyQHJlZGhh dC5jb20iPmRjaGlubmVyQHJlZGhhdC5jb208L2E+Jmd0Ozxicj4NCiZndDsgU2lnbmVkLW9mZi1i eTogSmFuIFR1bGFrICZsdDs8YSBocmVmPSJtYWlsdG86anR1bGFrQHJlZGhhdC5jb20iPmp0dWxh a0ByZWRoYXQuY29tPC9hPiZndDs8YnI+DQo8YnI+DQo8L3NwYW4+TG9va3Mgb2suPGJyPg0KPGJy Pg0KU2lnbmVkLW9mZi1ieTogRXJpYyBTYW5kZWVuICZsdDs8YSBocmVmPSJtYWlsdG86c2FuZGVl bkByZWRoYXQuY29tIj5zYW5kZWVuQHJlZGhhdC5jb208L2E+Jmd0Ozxicj48L2Jsb2NrcXVvdGU+ PGRpdj48YnI+PC9kaXY+PGRpdj48ZGl2IGNsYXNzPSJnbWFpbF9kZWZhdWx0IiBzdHlsZT0iZm9u dC1mYW1pbHk6YXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWY7ZGlzcGxheTppbmxpbmUiPuKAi09y IFJldmlld2VkLWJ5PyA6LSk8L2Rpdj48L2Rpdj48ZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2RlZmF1 bHQiIHN0eWxlPSJmb250LWZhbWlseTphcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZjtkaXNwbGF5 OmlubGluZSI+PGJyPjwvZGl2PjwvZGl2PjxkaXY+PGRpdiBjbGFzcz0iZ21haWxfZGVmYXVsdCIg c3R5bGU9ImZvbnQtZmFtaWx5OmFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmIj7igItUaGFua3Ms PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZGVmYXVsdCIgc3R5bGU9ImZvbnQtZmFtaWx5OmFyaWFs LGhlbHZldGljYSxzYW5zLXNlcmlmIj5KYW7igIs8L2Rpdj48YnI+PC9kaXY+PGRpdj48ZGl2IGNs YXNzPSJnbWFpbF9kZWZhdWx0IiBzdHlsZT0iZm9udC1mYW1pbHk6YXJpYWwsaGVsdmV0aWNhLHNh bnMtc2VyaWY7ZGlzcGxheTppbmxpbmUiPuKAizwvZGl2PsKgPC9kaXY+PGJsb2NrcXVvdGUgY2xh c3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjAgMCAwIC44ZXg7Ym9yZGVyLWxlZnQ6MXB4 ICNjY2Mgc29saWQ7cGFkZGluZy1sZWZ0OjFleCI+DQo8ZGl2IGNsYXNzPSJIT0VuWmIiPjxkaXYg Y2xhc3M9Img1Ij48YnI+DQomZ3Q7IC0tLTxicj4NCiZndDvCoCBpbmNsdWRlL3hmc19tdWx0aWRp c2suaCB8wqAgwqA1ICstPGJyPg0KJmd0O8KgIG1rZnMveGZzX21rZnMuY8KgIMKgIMKgIMKgIMKg fCAxNDggKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPGJy Pg0KJmd0O8KgIDIgZmlsZXMgY2hhbmdlZCwgNzYgaW5zZXJ0aW9ucygrKSwgNzcgZGVsZXRpb25z KC0pPGJyPg0KJmd0Ozxicj4NCiZndDsgZGlmZiAtLWdpdCBhL2luY2x1ZGUveGZzX211bHRpZGlz ay5oIGIvaW5jbHVkZS94ZnNfbXVsdGlkaXNrLmg8YnI+DQomZ3Q7IGluZGV4IGFmMzUxMDAuLjhl ODFkOTAgMTAwNjQ0PGJyPg0KJmd0OyAtLS0gYS9pbmNsdWRlL3hmc19tdWx0aWRpc2suaDxicj4N CiZndDsgKysrIGIvaW5jbHVkZS94ZnNfbXVsdGlkaXNrLmg8YnI+DQomZ3Q7IEBAIC00Miw4ICs0 Miw5IEBAPGJyPg0KJmd0Ozxicj4NCiZndDvCoCAjZGVmaW5lIFhGU19BR19CWVRFUyhiYmxvZynC oCAoKGxvbmcgbG9uZylCQlNJWkUgJmx0OyZsdDsgKGJibG9nKSk8YnI+DQomZ3Q7wqAgI2RlZmlu ZcKgIMKgIMKgIFhGU19BR19NSU5fQllURVPCoCDCoCDCoCDCoCAoKFhGU19BR19CWVRFUygxNSkp KcKgIMKgIC8qIDE2IE1CICovPGJyPg0KJmd0OyAtI2RlZmluZSBYRlNfQUdfTUlOX0JMT0NLUyhi bG9nKcKgIMKgIMKgICgoWEZTX0FHX0JZVEVTKDE1KSkgJmd0OyZndDsgKGJsb2cpKTxicj4NCiZn dDsgLSNkZWZpbmUgWEZTX0FHX01BWF9CTE9DS1MoYmxvZynCoCDCoCDCoCAoKFhGU19BR19CWVRF UygzMSkgLSAxKSAmZ3Q7Jmd0OyAoYmxvZykpPGJyPg0KJmd0OyArI2RlZmluZcKgIMKgIMKgIFhG U19BR19NQVhfQllURVPCoCDCoCDCoCDCoCAoKFhGU19BR19CWVRFUygzMSkpKcKgIMKgIC8qIDEg VEIgKi88YnI+DQomZ3Q7ICsjZGVmaW5lIFhGU19BR19NSU5fQkxPQ0tTKGJsb2cpwqAgwqAgwqAg KFhGU19BR19NSU5fQllURVMgJmd0OyZndDsgKGJsb2cpKTxicj4NCiZndDsgKyNkZWZpbmUgWEZT X0FHX01BWF9CTE9DS1MoYmxvZynCoCDCoCDCoCAoKFhGU19BR19NQVhfQllURVMgLSAxKSAmZ3Q7 Jmd0OyAoYmxvZykpPGJyPg0KJmd0Ozxicj4NCiZndDvCoCAjZGVmaW5lIFhGU19NQVhfQUdOVU1C RVLCoCDCoCDCoCgoeGZzX2FnbnVtYmVyX3QpKE5VTExBR05VTUJFUiAtIDEpKTxicj4NCiZndDs8 YnI+DQomZ3Q7IGRpZmYgLS1naXQgYS9ta2ZzL3hmc19ta2ZzLmMgYi9ta2ZzL3hmc19ta2ZzLmM8 YnI+DQomZ3Q7IGluZGV4IDBlMmNmYWMuLjAyMWQ2ODIgMTAwNjQ0PGJyPg0KJmd0OyAtLS0gYS9t a2ZzL3hmc19ta2ZzLmM8YnI+DQomZ3Q7ICsrKyBiL21rZnMveGZzX21rZnMuYzxicj4NCiZndDsg QEAgLTE2Myw2ICsxNjMsOCBAQCBzdHJ1Y3Qgb3B0X3BhcmFtcyBkb3B0cyA9IHs8YnI+DQomZ3Q7 wqAgwqAgwqAgwqB9LDxicj4NCiZndDvCoCDCoCDCoCDCoC5zdWJvcHRfcGFyYW1zID0gezxicj4N CiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHsgLmluZGV4ID0gRF9BR0NPVU5ULDxicj4NCiZn dDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgLm1pbnZhbCA9IDEsPGJyPg0KJmd0OyArwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAubWF4dmFsID0gWEZTX01BWF9BR05VTUJFUiw8YnI+DQomZ3Q7wqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAuZGVmYXVsdHZhbCA9IFNVQk9QVF9ORUVEU19WQUwsPGJy Pg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfSw8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAg wqAgwqAgwqB7IC5pbmRleCA9IERfRklMRSw8YnI+DQomZ3Q7IEBAIC0xNzcsMTggKzE3OSwyNiBA QCBzdHJ1Y3Qgb3B0X3BhcmFtcyBkb3B0cyA9IHs8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAuZGVmYXVsdHZhbCA9IFNVQk9QVF9ORUVEU19WQUwsPGJyPg0KJmd0O8KgIMKgIMKg IMKgIMKgIMKgIMKgIMKgfSw8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB7IC5pbmRl eCA9IERfU1VOSVQsPGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAubWludmFsID0g MCw8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC5tYXh2YWwgPSBVSU5UX01BWCw8 YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAuZGVmYXVsdHZhbCA9IFNVQk9QVF9O RUVEU19WQUwsPGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfSw8YnI+DQomZ3Q7wqAg wqAgwqAgwqAgwqAgwqAgwqAgwqB7IC5pbmRleCA9IERfU1dJRFRILDxicj4NCiZndDsgK8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgLm1pbnZhbCA9IDAsPGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAubWF4dmFsID0gVUlOVF9NQVgsPGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgLmRlZmF1bHR2YWwgPSBTVUJPUFRfTkVFRFNfVkFMLDxicj4NCiZndDvCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoH0sPGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgeyAuaW5kZXgg PSBEX0FHU0laRSw8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC5taW52YWwgPSBY RlNfQUdfTUlOX0JZVEVTLDxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgLm1heHZh bCA9IFhGU19BR19NQVhfQllURVMsPGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg LmRlZmF1bHR2YWwgPSBTVUJPUFRfTkVFRFNfVkFMLDxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoH0sPGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgeyAuaW5kZXggPSBEX1NV LDxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC5kZWZhdWx0dmFsID0gU1VCT1BU X05FRURTX1ZBTCw8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9LDxicj4NCiZndDvC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoHsgLmluZGV4ID0gRF9TVyw8YnI+DQomZ3Q7ICvCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoC5taW52YWwgPSAwLDxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKg IMKgIMKgLm1heHZhbCA9IFVJTlRfTUFYLDxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoC5kZWZhdWx0dmFsID0gU1VCT1BUX05FRURTX1ZBTCw8YnI+DQomZ3Q7wqAgwqAgwqAgwqAg wqAgwqAgwqAgwqB9LDxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHsgLmluZGV4ID0g RF9TRUNUTE9HLDxicj4NCiZndDsgQEAgLTIwNywxMiArMjE3LDE4IEBAIHN0cnVjdCBvcHRfcGFy YW1zIGRvcHRzID0gezxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC5kZWZhdWx0 dmFsID0gMSw8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9LDxicj4NCiZndDvCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoHsgLmluZGV4ID0gRF9SVElOSEVSSVQsPGJyPg0KJmd0OyAtwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAuZGVmYXVsdHZhbCA9IFNVQk9QVF9ORUVEU19WQUwsPGJyPg0K Jmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAubWludmFsID0gMSw8YnI+DQomZ3Q7ICvCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoC5tYXh2YWwgPSAxLDxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKg IMKgIMKgIMKgLmRlZmF1bHR2YWwgPSAxLDxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oH0sPGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgeyAuaW5kZXggPSBEX1BST0pJTkhF UklULDxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgLm1pbnZhbCA9IDAsPGJyPg0K Jmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAubWF4dmFsID0gVUlOVF9NQVgsPGJyPg0KJmd0 O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgLmRlZmF1bHR2YWwgPSBTVUJPUFRfTkVFRFNfVkFM LDxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH0sPGJyPg0KJmd0O8KgIMKgIMKgIMKg IMKgIMKgIMKgIMKgeyAuaW5kZXggPSBEX0VYVFNaSU5IRVJJVCw8YnI+DQomZ3Q7ICvCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoC5taW52YWwgPSAwLDxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKg IMKgIMKgLm1heHZhbCA9IFVJTlRfTUFYLDxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoC5kZWZhdWx0dmFsID0gU1VCT1BUX05FRURTX1ZBTCw8YnI+DQomZ3Q7wqAgwqAgwqAgwqAg wqAgwqAgwqAgwqB9LDxicj4NCiZndDvCoCDCoCDCoCDCoH0sPGJyPg0KJmd0OyBAQCAtMjUyLDE1 ICsyNjgsMjMgQEAgc3RydWN0IG9wdF9wYXJhbXMgaW9wdHMgPSB7PGJyPg0KJmd0O8KgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgLmRlZmF1bHR2YWwgPSBTVUJPUFRfTkVFRFNfVkFMLDxicj4NCiZn dDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH0sPGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKg IMKgeyAuaW5kZXggPSBJX01BWFBDVCw8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oC5taW52YWwgPSAwLDxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgLm1heHZhbCA9 IDEwMCw8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAuZGVmYXVsdHZhbCA9IFNV Qk9QVF9ORUVEU19WQUwsPGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfSw8YnI+DQom Z3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB7IC5pbmRleCA9IElfUEVSQkxPQ0ssPGJyPg0KJmd0 OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAubWludmFsID0gWEZTX01JTl9JTk9ERV9QRVJCTE9D Syw8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC5tYXh2YWwgPSBYRlNfTUFYX0JM T0NLU0laRSAvIFhGU19ESU5PREVfTUlOX1NJWkUsPGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgLmRlZmF1bHR2YWwgPSBTVUJPUFRfTkVFRFNfVkFMLDxicj4NCiZndDvCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoH0sPGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgeyAuaW5k ZXggPSBJX1NJWkUsPGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAubWludmFsID0g WEZTX0RJTk9ERV9NSU5fU0laRSw8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC5t YXh2YWwgPSBYRlNfRElOT0RFX01BWF9TSVpFLDxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoC5kZWZhdWx0dmFsID0gU1VCT1BUX05FRURTX1ZBTCw8YnI+DQomZ3Q7wqAgwqAgwqAg wqAgwqAgwqAgwqAgwqB9LDxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHsgLmluZGV4 ID0gSV9BVFRSLDxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgLm1pbnZhbCA9IDAs PGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAubWF4dmFsID0gMiw8YnI+DQomZ3Q7 wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAuZGVmYXVsdHZhbCA9IFNVQk9QVF9ORUVEU19WQUws PGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfSw8YnI+DQomZ3Q7wqAgwqAgwqAgwqAg wqAgwqAgwqAgwqB7IC5pbmRleCA9IElfUFJPSklEMzJCSVQsPGJyPg0KJmd0OyBAQCAtMzA3LDYg KzMzMSw4IEBAIHN0cnVjdCBvcHRfcGFyYW1zIGxvcHRzID0gezxicj4NCiZndDvCoCDCoCDCoCDC oH0sPGJyPg0KJmd0O8KgIMKgIMKgIMKgLnN1Ym9wdF9wYXJhbXMgPSB7PGJyPg0KJmd0O8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgeyAuaW5kZXggPSBMX0FHTlVNLDxicj4NCiZndDsgK8KgIMKgIMKg IMKgIMKgIMKgIMKgIMKgLm1pbnZhbCA9IDAsPGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAubWF4dmFsID0gVUlOVF9NQVgsPGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgLmRlZmF1bHR2YWwgPSBTVUJPUFRfTkVFRFNfVkFMLDxicj4NCiZndDvCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoH0sPGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgeyAuaW5kZXggPSBM X0lOVEVSTkFMLDxicj4NCiZndDsgQEAgLTMxOCw5ICszNDQsMTMgQEAgc3RydWN0IG9wdF9wYXJh bXMgbG9wdHMgPSB7PGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgLmRlZmF1bHR2 YWwgPSBTVUJPUFRfTkVFRFNfVkFMLDxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH0s PGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgeyAuaW5kZXggPSBMX1ZFUlNJT04sPGJy Pg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAubWludmFsID0gMSw8YnI+DQomZ3Q7ICvC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoC5tYXh2YWwgPSAyLDxicj4NCiZndDvCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoC5kZWZhdWx0dmFsID0gU1VCT1BUX05FRURTX1ZBTCw8YnI+DQomZ3Q7wqAg wqAgwqAgwqAgwqAgwqAgwqAgwqB9LDxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHsg LmluZGV4ID0gTF9TVU5JVCw8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC5taW52 YWwgPSBCVE9CQihYTE9HX01JTl9SRUNPUkRfQlNJWkUpLDxicj4NCiZndDsgK8KgIMKgIMKgIMKg IMKgIMKgIMKgIMKgLm1heHZhbCA9IEJUT0JCKFhMT0dfTUFYX1JFQ09SRF9CU0laRSksPGJyPg0K Jmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgLmRlZmF1bHR2YWwgPSBTVUJPUFRfTkVFRFNf VkFMLDxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH0sPGJyPg0KJmd0O8KgIMKgIMKg IMKgIMKgIMKgIMKgIMKgeyAuaW5kZXggPSBMX1NVLDxicj4NCiZndDsgQEAgLTM4MCw2ICs0MTAs OCBAQCBzdHJ1Y3Qgb3B0X3BhcmFtcyBub3B0cyA9IHs8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAuZGVmYXVsdHZhbCA9IFNVQk9QVF9ORUVEU19WQUwsPGJyPg0KJmd0O8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgfSw8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB7IC5p bmRleCA9IE5fVkVSU0lPTiw8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC5taW52 YWwgPSAyLDxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgLm1heHZhbCA9IDIsPGJy Pg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgLmRlZmF1bHR2YWwgPSBTVUJPUFRfTkVF RFNfVkFMLDxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH0sPGJyPg0KJmd0O8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgeyAuaW5kZXggPSBOX0ZUWVBFLDxicj4NCiZndDsgQEAgLTE1NjAs MTMgKzE1OTIsMTEgQEAgbWFpbig8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBzd2l0Y2ggKGdldHN1Ym9wdCgmYW1wO3AsIChjb25zdHBwKXN1 Ym9wdHMsPGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJmFtcDt2YWx1ZSkpIHs8YnI+DQomZ3Q7 wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjYXNlIERfQUdD T1VOVDo8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGlmICghdmFsdWUgfHwgKnZhbHVlID09ICYjMzk7XDAmIzM5Oyk8YnI+ DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoHJlcXZhbCgmIzM5O2QmIzM5Oywgc3Vib3B0cywgRF9BR0NPVU5U KTs8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBpZiAoZGFmbGFnKTxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJlc3BlYygm IzM5O2QmIzM5Oywgc3Vib3B0cywgRF9BR0NPVU5UKTs8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGFnY291bnQgPSBnZXRu dW0odmFsdWUsIDAsIDAsIGZhbHNlKTs8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmICgoX19pbnQ2NF90KWFnY291bnQg Jmx0Oz0gMCk8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlsbGVnYWwodmFsdWUsICZxdW90O2QgYWdj b3VudCZxdW90Oyk7PGJyPg0KJmd0OyArPGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBhZ2NvdW50ID0gZ2V0bnVtX2NoZWNr ZWQodmFsdWUsICZhbXA7ZG9wdHMsPGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgRF9BR0NPVU5UKTs8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBkYWZsYWcgPSAxOzxicj4NCiZndDvC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oGJyZWFrOzxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoGNhc2UgRF9BR1NJWkU6PGJyPg0KJmd0OyBAQCAtMTYwMSwyOCArMTYzMSwyMiBAQCBt YWluKDxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGRzaXplID0gdmFsdWU7PGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgYnJlYWs7PGJyPg0KJmd0 O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY2FzZSBEX1NV TklUOjxicj4NCiZndDsgLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgaWYgKCF2YWx1ZSB8fCAqdmFsdWUgPT0gJiMzOTtcMCYjMzk7KTxicj4N CiZndDsgLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgcmVxdmFsKCYjMzk7ZCYjMzk7LCBzdWJvcHRzLCBEX1NVTklUKTs8 YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBpZiAoZHN1bml0KTxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJlc3BlYygmIzM5 O2QmIzM5Oywgc3Vib3B0cywgRF9TVU5JVCk7PGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG5vZHNmbGFnKTxicj4N CiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGNvbmZsaWN0KCYjMzk7ZCYjMzk7LCBzdWJvcHRzLCBEX05PQUxJ R04sPGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIERfU1VOSVQpOzxicj4NCiZn dDsgLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgZHN1bml0ID0gZ2V0bnVtKHZhbHVlLCAwLCAwLCBmYWxzZSk7PGJyPg0KJmd0OyAtwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAoZHN1 bml0ICZsdDsgMCk8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlsbGVnYWwodmFsdWUsICZxdW90O2Qg c3VuaXQmcXVvdDspOzxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZHN1bml0ID0gZ2V0bnVtX2NoZWNrZWQodmFsdWUsICZh bXA7ZG9wdHMsPGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg RF9TVU5JVCk7PGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgYnJlYWs7PGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY2FzZSBEX1NXSURUSDo8YnI+DQomZ3Q7IC3CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmICgh dmFsdWUgfHwgKnZhbHVlID09ICYjMzk7XDAmIzM5Oyk8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJl cXZhbCgmIzM5O2QmIzM5Oywgc3Vib3B0cywgRF9TV0lEVEgpOzxicj4NCiZndDvCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChkc3dp ZHRoKTxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJlc3BlYygmIzM5O2QmIzM5Oywgc3Vib3B0cywg RF9TV0lEVEgpOzxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChub2RzZmxhZyk8YnI+DQomZ3Q7wqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBjb25mbGljdCgmIzM5O2QmIzM5Oywgc3Vib3B0cywgRF9OT0FMSUdOLDxicj4NCiZndDvCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBEX1NXSURUSCk7PGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBkc3dpZHRoID0gZ2V0 bnVtKHZhbHVlLCAwLCAwLCBmYWxzZSk7PGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAoZHN3aWR0aCAmbHQ7IDApPGJy Pg0KJmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBpbGxlZ2FsKHZhbHVlLCAmcXVvdDtkIHN3aWR0aCZxdW90Oyk7 PGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBkc3dpZHRoID0gZ2V0bnVtX2NoZWNrZWQodmFsdWUsICZhbXA7ZG9wdHMsPGJy Pg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgRF9TV0lEVEgpOzxi cj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoGJyZWFrOzxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGNhc2UgRF9TVTo8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAoIXZhbHVlIHx8ICp2YWx1 ZSA9PSAmIzM5O1wwJiMzOTspPGJyPg0KJmd0OyBAQCAtMTYzOCwxNiArMTY2MiwxMyBAQCBtYWlu KDxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlsbGVnYWwodmFsdWUsICZxdW90O2Qgc3UmcXVvdDsp Ozxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoGJyZWFrOzxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGNhc2UgRF9TVzo8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmICghdmFsdWUgfHwgKnZh bHVlID09ICYjMzk7XDAmIzM5Oyk8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJlcXZhbCgmIzM5O2Qm IzM5Oywgc3Vib3B0cywgRF9TVyk7PGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKGRzdyk8YnI+DQomZ3Q7wqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqByZXNwZWMoJiMzOTtkJiMzOTssIHN1Ym9wdHMsIERfU1cpOzxicj4NCiZndDvCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlm IChub2RzZmxhZyk8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjb25mbGljdCgmIzM5O2QmIzM5Oywg c3Vib3B0cywgRF9OT0FMSUdOLDxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBE X1NXKTs8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGRzdyA9IGdldG51bSh2YWx1ZSwgMCwgMCwgZmFsc2UpOzxicj4NCiZn dDsgLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgaWYgKGRzdyAmbHQ7IDApPGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpbGxlZ2FsKHZhbHVlLCAm cXVvdDtkIHN3JnF1b3Q7KTs8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGRzdyA9IGdldG51bV9jaGVja2VkKHZhbHVlLCAm YW1wO2RvcHRzLDxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IERfU1cpOzxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGJyZWFrOzxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGNhc2UgRF9OT0FMSUdOOjxicj4NCiZndDvCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG5vZHNm bGFnID0gZ2V0bnVtX2NoZWNrZWQodmFsdWUsPGJyPg0KJmd0OyBAQCAtMTY5NiwyMSArMTcxNywy MiBAQCBtYWluKDxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoHNzZmxhZyA9IDE7PGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgYnJlYWs7PGJyPg0K Jmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY2FzZSBE X1JUSU5IRVJJVDo8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoGZzeC5mc3hfeGZsYWdzIHw9IFw8YnI+DQomZ3Q7IC3CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoFhGU19ESUZMQUdfUlRJTkhFUklUOzxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgYyA9IGdldG51bV9jaGVja2Vk KHZhbHVlLCAmYW1wO2RvcHRzLDxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IERfUlRJTkhFUklUKTs8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChjKTxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZnN4 LmZzeF94ZmxhZ3MgfD08YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFhGU19ESUZM QUdfUlRJTkhFUklUOzxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGJyZWFrOzxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGNhc2UgRF9QUk9KSU5IRVJJVDo8YnI+DQom Z3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGlmICghdmFsdWUgfHwgKnZhbHVlID09ICYjMzk7XDAmIzM5Oyk8YnI+DQomZ3Q7IC3CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoHJlcXZhbCgmIzM5O2QmIzM5Oywgc3Vib3B0cywgRF9QUk9KSU5IRVJJVCk7PGJyPg0K Jmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBmc3guZnN4X3Byb2ppZCA9IGF0b2kodmFsdWUpOzxicj4NCiZndDsgLcKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZnN4LmZzeF94Zmxh Z3MgfD0gXDxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgZnN4LmZzeF9wcm9qaWQgPSBnZXRudW1fY2hlY2tlZCh2YWx1ZSw8 YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZhbXA7ZG9wdHMsIERfUFJPSklOSEVS SVQpOzxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgZnN4LmZzeF94ZmxhZ3MgfD08YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBY RlNfRElGTEFHX1BST0pJTkhFUklUOzxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGJyZWFrOzxicj4NCiZndDvCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGNhc2UgRF9FWFRTWklOSEVS SVQ6PGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBpZiAoIXZhbHVlIHx8ICp2YWx1ZSA9PSAmIzM5O1wwJiMzOTspPGJyPg0K Jmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqByZXF2YWwoJiMzOTtkJiMzOTssIHN1Ym9wdHMsIERfRVhUU1pJTkhF UklUKTs8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGZzeC5mc3hfZXh0c2l6ZSA9IGF0b2kodmFsdWUpOzxicj4NCiZndDsg LcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg ZnN4LmZzeF94ZmxhZ3MgfD0gXDxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZnN4LmZzeF9leHRzaXplID0gZ2V0bnVtX2No ZWNrZWQodmFsdWUsPGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmYW1wO2RvcHRz LCBEX0VYVFNaSU5IRVJJVCk7PGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBmc3guZnN4X3hmbGFncyB8PTxicj4NCiZndDvC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoFhGU19ESUZMQUdfRVhUU1pJTkhFUklUOzxicj4NCiZndDvCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGJyZWFrOzxi cj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGRl ZmF1bHQ6PGJyPg0KJmd0OyBAQCAtMTc0NSwxOCArMTc2NywxMyBAQCBtYWluKDxicj4NCiZndDvC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oGlsZmxhZyA9IDE7PGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgYnJlYWs7PGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY2FzZSBJX01BWFBDVDo8YnI+DQomZ3Q7IC3C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlm ICghdmFsdWUgfHwgKnZhbHVlID09ICYjMzk7XDAmIzM5Oyk8YnI+DQomZ3Q7IC3CoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oHJlcXZhbCgmIzM5O2kmIzM5Oywgc3Vib3B0cywgSV9NQVhQQ1QpOzxicj4NCiZndDvCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChp bWZsYWcpPGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmVzcGVjKCYjMzk7aSYjMzk7LCBzdWJvcHRz LCBJX01BWFBDVCk7PGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpbWF4cGN0ID0gZ2V0bnVtKHZhbHVlLCAwLCAwLCBmYWxz ZSk7PGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBpZiAoaW1heHBjdCAmbHQ7IDAgfHwgaW1heHBjdCAmZ3Q7IDEwMCk8YnI+ DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGlsbGVnYWwodmFsdWUsICZxdW90O2kgbWF4cGN0JnF1b3Q7KTs8 YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoGltYXhwY3QgPSBnZXRudW1fY2hlY2tlZCg8YnI+DQomZ3Q7ICvCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoHZhbHVlLCAmYW1wO2lvcHRzLCBJX01BWFBDVCk7PGJyPg0KJmd0O8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaW1m bGFnID0gMTs8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBicmVhazs8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjYXNlIElfUEVSQkxPQ0s6PGJyPg0KJmd0OyAtwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAo IXZhbHVlIHx8ICp2YWx1ZSA9PSAmIzM5O1wwJiMzOTspPGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBy ZXF2YWwoJiMzOTtpJiMzOTssIHN1Ym9wdHMsIElfUEVSQkxPQ0spOzxicj4NCiZndDvCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChp bGZsYWcpPGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY29uZmxpY3QoJiMzOTtpJiMzOTssIHN1Ym9w dHMsIElfTE9HLDxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBJX1BFUkJMT0NL KTs8YnI+DQomZ3Q7IEBAIC0xNzY1LDE2ICsxNzgyLDEzIEBAIG1haW4oPGJyPg0KJmd0O8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYg KGlzZmxhZyk8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjb25mbGljdCgmIzM5O2kmIzM5Oywgc3Vi b3B0cywgSV9TSVpFLDxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBJX1BFUkJM T0NLKTs8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGlub3BibG9jayA9IGdldG51bSh2YWx1ZSwgMCwgMCwgZmFsc2UpOzxi cj4NCiZndDsgLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgaWYgKGlub3BibG9jayAmbHQ7PGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBYRlNfTUlO X0lOT0RFX1BFUkJMT0NLIHx8PGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAhaXNwb3cyKGlub3BibG9jaykpPGJy Pg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBpbm9wYmxvY2sgPSBnZXRudW1fY2hlY2tlZCh2YWx1ZSwgJmFtcDtpb3B0cyw8YnI+ DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBJX1BFUkJMT0NL KTs8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoGlmICghaXNwb3cyKGlub3BibG9jaykpPGJyPg0KJmd0O8KgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgaWxsZWdhbCh2YWx1ZSwgJnF1b3Q7aSBwZXJibG9jayZxdW90Oyk7PGJyPg0KJmd0O8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaXBm bGFnID0gMTs8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBicmVhazs8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjYXNlIElfU0laRTo8YnI+DQomZ3Q7IC3CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmICghdmFs dWUgfHwgKnZhbHVlID09ICYjMzk7XDAmIzM5Oyk8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJlcXZh bCgmIzM5O2kmIzM5Oywgc3Vib3B0cywgSV9TSVpFKTs8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAoaWxmbGFnKTxi cj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoGNvbmZsaWN0KCYjMzk7aSYjMzk7LCBzdWJvcHRzLCBJX0xP Ryw8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgSV9TSVpFKTs8YnI+DQomZ3Q7 IEBAIC0xNzgzLDE5ICsxNzk3LDE2IEBAIG1haW4oPGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIElfU0laRSk7PGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKGlzZmxhZyk8YnI+DQomZ3Q7wqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqByZXNwZWMoJiMzOTtpJiMzOTssIHN1Ym9wdHMsIElfU0laRSk7PGJyPg0KJmd0OyAt wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBp c2l6ZSA9IGdldG51bSh2YWx1ZSwgMCwgMCwgdHJ1ZSk7PGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAoaXNpemUgJmx0 Oz0gMCB8fCAhaXNwb3cyKGlzaXplKSk8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlzaXplID0gZ2V0bnVtX2NoZWNrZWQo dmFsdWUsICZhbXA7aW9wdHMsPGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgSV9TSVpFKTs8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmICghaXNwb3cyKGlzaXplKSk8YnI+DQomZ3Q7wqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBpbGxlZ2FsKHZhbHVlLCAmcXVvdDtpIHNpemUmcXVvdDspOzxicj4NCiZndDvC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oGlub2RlbG9nID0gbGlieGZzX2hpZ2hiaXQzMihpc2l6ZSk7PGJyPg0KJmd0O8KgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaXNmbGFnID0g MTs8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBicmVhazs8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBjYXNlIElfQVRUUjo8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmICghdmFsdWUgfHwg KnZhbHVlID09ICYjMzk7XDAmIzM5Oyk8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJlcXZhbCgmIzM5 O2kmIzM5Oywgc3Vib3B0cywgSV9BVFRSKTs8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGMgPSBnZXRudW0odmFsdWUsIDAs IDAsIGZhbHNlKTs8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChjICZsdDsgMCB8fCBjICZndDsgMik8YnI+DQomZ3Q7 IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoGlsbGVnYWwodmFsdWUsICZxdW90O2kgYXR0ciZxdW90Oyk7PGJyPg0KJmd0 OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBzYl9mZWF0LmF0dHJfdmVyc2lvbiA9IGM7PGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBzYl9mZWF0LmF0dHJfdmVyc2lv biA9IGdldG51bV9jaGVja2VkKDxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdmFs dWUsICZhbXA7aW9wdHMsIElfQVRUUik7PGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgYnJlYWs7PGJyPg0KJmd0O8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY2FzZSBJX1BST0pJRDMy QklUOjxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoHNiX2ZlYXQucHJvamlkMTZiaXQgPTxicj4NCiZndDsgQEAgLTE4MTcs MjEgKzE4MjgsMTYgQEAgbWFpbig8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqB3aGlsZSAoKnAgIT0gJiMzOTtcMCYjMzk7KSB7PGJyPg0KJmd0O8KgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY2hhcsKgIMKgICoqc3Vib3B0cyA9 IChjaGFyICoqKWxvcHRzLnN1Ym9wdHM7PGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY2hhcsKgIMKgICp2YWx1ZTs8YnI+DQomZ3Q7IC3CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGxvbmcgbG9uZyB0bXBfbnVt Ozxicj4NCiZndDs8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBzd2l0Y2ggKGdldHN1Ym9wdCgmYW1wO3AsIChjb25zdHBwKXN1Ym9wdHMsPGJy Pg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJmFtcDt2YWx1ZSkpIHs8YnI+DQomZ3Q7wqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjYXNlIExfQUdOVU06PGJyPg0K Jmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBpZiAoIXZhbHVlIHx8ICp2YWx1ZSA9PSAmIzM5O1wwJiMzOTspPGJyPg0KJmd0OyAtwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqByZXF2YWwoJiMzOTtsJiMzOTssIHN1Ym9wdHMsIExfQUdOVU0pOzxicj4NCiZndDvC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oGlmIChsYWZsYWcpPGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmVzcGVjKCYjMzk7bCYjMzk7LCBz dWJvcHRzLCBMX0FHTlVNKTs8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAobGRmbGFnKTxicj4NCiZndDvCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoGNvbmZsaWN0KCYjMzk7bCYjMzk7LCBzdWJvcHRzLCBMX0FHTlVNLCBMX0RFVik7PGJy Pg0KJmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqB0bXBfbnVtID0gZ2V0bnVtKHZhbHVlLCAwLCAwLCBmYWxzZSk7PGJyPg0KJmd0OyAt wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBp ZiAodG1wX251bSAmbHQ7IDApPGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpbGxlZ2FsKHZhbHVlLCAm cXVvdDtsIGFnbm8mcXVvdDspOzxicj4NCiZndDsgLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgbG9nYWdubyA9ICh4ZnNfYWdudW1iZXJfdCl0 bXBfbnVtOzxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgbG9nYWdubyA9IGdldG51bV9jaGVja2VkKHZhbHVlLCAmYW1wO2xv cHRzLDxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIExfQUdO VU0pOzxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGxhZmxhZyA9IDE7PGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgYnJlYWs7PGJyPg0KJmd0O8Kg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY2FzZSBMX0ZJTEU6 PGJyPg0KJmd0OyBAQCAtMTg2OCwxMyArMTg3NCwxMCBAQCBtYWluKDxicj4NCiZndDvCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGxzdWZs YWcgPSAxOzxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGJyZWFrOzxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGNhc2UgTF9TVU5JVDo8YnI+DQomZ3Q7IC3CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmICghdmFs dWUgfHwgKnZhbHVlID09ICYjMzk7XDAmIzM5Oyk8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJlcXZh bCgmIzM5O2wmIzM5Oywgc3Vib3B0cywgTF9TVU5JVCk7PGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKGxzdW5pdCk8 YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXNwZWMoJiMzOTtsJiMzOTssIHN1Ym9wdHMsIExfU1VO SVQpOzxicj4NCiZndDsgLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgbHN1bml0ID0gZ2V0bnVtKHZhbHVlLCAwLCAwLCBmYWxzZSk7PGJyPg0K Jmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBpZiAobHN1bml0ICZsdDsgMCk8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlsbGVnYWwodmFs dWUsICZxdW90O2wgc3VuaXQmcXVvdDspOzxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgbHN1bml0ID0gZ2V0bnVtX2NoZWNr ZWQodmFsdWUsICZhbXA7bG9wdHMsPGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgTF9TVU5JVCk7PGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgbHN1bml0ZmxhZyA9IDE7PGJyPg0KJmd0 O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgYnJlYWs7PGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgY2FzZSBMX05BTUU6PGJyPg0KJmd0OyBAQCAtMTg5MywxNCArMTg5NiwxMCBAQCBt YWluKDxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoHhpLmxvZ25hbWUgPSB2YWx1ZTs8YnI+DQomZ3Q7wqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBicmVhazs8YnI+ DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjYXNl IExfVkVSU0lPTjo8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmICghdmFsdWUgfHwgKnZhbHVlID09ICYjMzk7XDAmIzM5 Oyk8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJlcXZhbCgmIzM5O2wmIzM5Oywgc3Vib3B0cywgTF9W RVJTSU9OKTs8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAobHZmbGFnKTxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJl c3BlYygmIzM5O2wmIzM5Oywgc3Vib3B0cywgTF9WRVJTSU9OKTs8YnI+DQomZ3Q7IC3CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGMgPSBnZXRu dW0odmFsdWUsIDAsIDAsIGZhbHNlKTs8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChjICZsdDsgMSB8fCBjICZndDsg Mik8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlsbGVnYWwodmFsdWUsICZxdW90O2wgdmVyc2lvbiZx dW90Oyk7PGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBzYl9mZWF0LmxvZ192ZXJzaW9uID0gYzs8YnI+DQomZ3Q7ICvCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHNiX2Zl YXQubG9nX3ZlcnNpb24gPSBnZXRudW1fY2hlY2tlZCg8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHZh bHVlLCAmYW1wO2xvcHRzLCBMX1ZFUlNJT04pOzxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGx2ZmxhZyA9IDE7PGJyPg0K Jmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgYnJlYWs7PGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgY2FzZSBMX1NJWkU6PGJyPg0KJmd0OyBAQCAtMjAzNSwxMSArMjAzNCwxMCBA QCBfKCZxdW90O2Nhbm5vdCBzcGVjaWZ5IGJvdGggLW0gY3JjPTEgYW5kIC1uIGZ0eXBlXG4mcXVv dDspKTs8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAvKiBBU0NJSSBDSSBtb2RlICovPGJyPg0KJmd0 O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgc2JfZmVhdC5uY2kgPSB0cnVlOzxicj4NCiZndDvCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZSB7PGJy Pg0KJmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBjID0gZ2V0bnVtKHZhbHVlLCAwLCAwLCBmYWxzZSk7PGJyPg0K Jmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBpZiAoYyAhPSAyKTxicj4NCiZndDsgLcKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgaWxsZWdhbCh2YWx1ZSw8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCZxdW90O24gdmVyc2lvbiZxdW90Oyk7PGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBz Yl9mZWF0LmRpcl92ZXJzaW9uID0gYzs8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHNiX2ZlYXQuZGly X3ZlcnNpb24gPTxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2V0bnVtX2NoZWNr ZWQodmFsdWUsPGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAm YW1wO25vcHRzLDxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg Tl9WRVJTSU9OKTs8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9PGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgbnZmbGFnID0gMTs8YnI+DQomZ3Q7 wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBicmVhazs8YnI+DQomZ3Q7PGJyPg0KPGJyPg0KPC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iSE9F blpiIj48ZGl2IGNsYXNzPSJoNSI+X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX188YnI+DQp4ZnMgbWFpbGluZyBsaXN0PGJyPg0KPGEgaHJlZj0ibWFpbHRvOnhm c0Bvc3Muc2dpLmNvbSI+eGZzQG9zcy5zZ2kuY29tPC9hPjxicj4NCjxhIGhyZWY9Imh0dHA6Ly9v c3Muc2dpLmNvbS9tYWlsbWFuL2xpc3RpbmZvL3hmcyIgcmVsPSJub3JlZmVycmVyIiB0YXJnZXQ9 Il9ibGFuayI+aHR0cDovL29zcy5zZ2kuY29tL21haWxtYW4vbGlzdGluZm8veGZzPC9hPjxicj4N CjwvZGl2PjwvZGl2PjwvYmxvY2txdW90ZT48L2Rpdj48YnI+PGJyIGNsZWFyPSJhbGwiPjxkaXY+ PGJyPjwvZGl2Pi0tIDxicj48ZGl2IGNsYXNzPSJnbWFpbF9zaWduYXR1cmUiPjxkaXYgZGlyPSJs dHIiPjxkaXY+PGRpdiBkaXI9Imx0ciI+PGRpdj5KYW4gVHVsYWs8YnI+PC9kaXY+PGEgaHJlZj0i bWFpbHRvOmp0dWxha0ByZWRoYXQuY29tIiB0YXJnZXQ9Il9ibGFuayI+anR1bGFrQHJlZGhhdC5j b208L2E+wqAvIDxhIGhyZWY9Im1haWx0bzpqYW5AdHVsYWsubWUiIHRhcmdldD0iX2JsYW5rIj5q YW5AdHVsYWsubWU8L2E+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+DQo8L2Rpdj48L2Rpdj4NCg== --001a113eb35e7bea82052ff6ee07-- From shyam@zadarastorage.com Fri Apr 8 05:51:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CF6EA7CA6 for ; Fri, 8 Apr 2016 05:51:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 71B6B304039 for ; Fri, 8 Apr 2016 03:51:16 -0700 (PDT) X-ASG-Debug-ID: 1460112663-04bdf011033415f0001-NocioJ Received: from mail-wm0-f47.google.com (mail-wm0-f47.google.com [74.125.82.47]) by cuda.sgi.com with ESMTP id d2FNvqrBfGCApjbB (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 08 Apr 2016 03:51:04 -0700 (PDT) X-Barracuda-Envelope-From: shyam@zadarastorage.com X-Barracuda-Apparent-Source-IP: 74.125.82.47 Received: by mail-wm0-f47.google.com with SMTP id 191so14241551wmq.0 for ; Fri, 08 Apr 2016 03:51:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=from:references:in-reply-to:mime-version:thread-index:date :message-id:subject:to:cc; bh=iiaXrAvKBeeRnhvEB+fGA2WdU0OB5j5DVJ68x8emh0w=; b=FymHO6b9thRSCYZh1JiuGv5KJrHqcLvWNWpKbANptBunUyQooWmcbfEqtufSjO49Eb jKC3XUsl5RsoB3DHGmLv29dK1WagET7t7VMwv+Qvjdzul6isw7V3DwqSTL1qqq9Y9ZaW 5T+bBr8ABeeoxUFr7XPaJ4D/ndonYoks0CTXDCbzp9w5qqiWit45m+CLnv1BB15ZaOZW D7LIKtQTzxaHh1mAKs3xX+e07Wr4nQzJ9BB+amOym/2MVp7I2l5WBwTjVxmYBlv8/mq4 IZxjRRCV90JE8UXUZKoy8+2k0WwaSUEgfJlaEdinIMMgJVS5Y3Vyc/XvRNFUfX3qNrET bTSg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:references:in-reply-to:mime-version :thread-index:date:message-id:subject:to:cc; bh=iiaXrAvKBeeRnhvEB+fGA2WdU0OB5j5DVJ68x8emh0w=; b=l7J7bLlFjWuLPzPYf4B8zzcyr/rkdb88F3YpLPQ24hOLQ7AWJ+zSnxdON8cPn+o9E8 znT65OK7PlcOoYd4TAbKoRp6C+acfsBiiTQDRGDV7r5MZ/RXPHcenSHTX8piqOAlOxqe qgKH9u7f39wim3xtYcxDypdHXhd+OFq1D46THFZ+XMD0p2E+ktrAVOHmeH7zdYtCcQSa KqxGT/OK83guBInpqzP/BAAjDf/kuI1gY1pwQIQbC8sTV87JHrSsqA3r0ZRCrrnnuwAg GJ/Il3bnwUJduEtinBgKgGh4eNX0NioHzSUivYRBsEQQIXF04Ef9j6U9V/5vEe2T8gBy 7JRA== X-Gm-Message-State: AD7BkJKvUnm958CP7iTXNiFR695J0+FmncG6LEmnnoykC4l7DYgts7BFOz34wnuW5oJxRe6TIg57U2Bq5/miJQ== X-Received: by 10.28.184.194 with SMTP id i185mr3038650wmf.90.1460112662950; Fri, 08 Apr 2016 03:51:02 -0700 (PDT) From: Shyam Kaushik References: <20160322121922.GA53693@bfoster.bfoster> 6457b1d9de271ec6cca6bc2626aac161@mail.gmail.com 91068979ae9a5999b4774a06b8f1d14c@mail.gmail.com In-Reply-To: 91068979ae9a5999b4774a06b8f1d14c@mail.gmail.com MIME-Version: 1.0 X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AdGENRKPygQUtyusRzyfZh8lYSPNuwABVHnwACushLADJKlgUA== Date: Fri, 8 Apr 2016 16:21:02 +0530 Message-ID: <232dd85fde11d4ef1625f070eabfd167@mail.gmail.com> Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery To: david@fromorbit.com, Brian Foster , xfs@oss.sgi.com X-ASG-Orig-Subj: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Cc: Alex Lyakas Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wm0-f47.google.com[74.125.82.47] X-Barracuda-Start-Time: 1460112664 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28550 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi Dave, Brian, Carlos, While trying to reproduce this issue I have been running into different issues that are similar. Underlying issue remains the same when backend to XFS is failed & we unmount XFS, we run into hung-task timeout (180-secs) with stack like kernel: [14952.671131] [] xfs_ail_push_all_sync+0xa9/0xe0 [xfs] kernel: [14952.671139] [] ? prepare_to_wait_event+0x110/0x110 kernel: [14952.671181] [] xfs_unmountfs+0x61/0x1a0 [xfs] while running trace-events, XFS ail push keeps looping around xfsaild/dm-10-21143 [001] ...2 17878.555133: xfs_ilock_nowait: dev 253:10 ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-21143 [001] ...2 17878.555138: xfs_iunlock: dev 253:10 ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-21143 [001] ...2 17878.555138: xfs_ail_push: dev 253:10 lip 0xffff880031f6ae40 lsn 1/73448 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-21143 [001] ...2 17878.605136: xfs_ilock_nowait: dev 253:10 ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-21143 [001] ...2 17878.605141: xfs_iunlock: dev 253:10 ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-21143 [001] ...2 17878.605142: xfs_ail_push: dev 253:10 lip 0xffff880031f6ae40 lsn 1/73448 type XFS_LI_INODE flags IN_AIL observe ino==0x0 (its a freed inode) but the corresponding lip stays with xfsaild push. I had run a systemtap when this problem happened & the following keeps repeating. xfs_inode_item_push() - inode:0xffff88003d8ca000 m_flags:0x420118 flags:0x1 xfs_iflush() - inode:ffff88003d8ca000 aborting for forced shutdown xfs_iflush_abort() - iip:0x0 xfs_inode_item_push() is doing xfs_iflush() but it sees FS_SHUTDOWN flag marked & does an xfs_iflush_abort().xfs_iflush_abort() sees i_itemp==NULL on the lip & doesn't do anything. So we have this stale lip that is not associated to inode anymore that keeps xfs_ail_push_all_sync() busy. On few other occurrences, i have had NULL pointer/dereference or other sorts of crashes at this line xfsaild_push() lock_result = lip->li_ops->iop_push(lip, &ailp->xa_buf_list); with debug prints, in one of the occurrence lip->li_ops was NULL & in another lip->li_ops was pointing to a bad pointer that subsequent dereference crashed it. This also indicates that a bad/freed lip was inserted that xfsaild_push() is working. I hit upon Dave's patch "xfs: xfs_inode_free() isn't RCU safe" & realized that this could explain the above issue where a lip that has been freed is wrongly referenced & later we could even have the inode disconnected. What do you think? In any case I uploaded the full xfs trace events before this issue started & till the end. It is at https://www.dropbox.com/s/21qstz4ld1gn8yi/xfs_trace_pipe.gz?dl=0 Pls let me know. Thanks. --Shyam -----Original Message----- From: Shyam Kaushik [mailto:shyam@zadarastorage.com] Sent: 23 March 2016 15:23 To: 'Brian Foster' Cc: 'xfs@oss.sgi.com'; Alex Lyakas Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Hi Carlos, w.r.t. your question below >>> Shyam, after you reconnected the disks, the messages about failed async metadata >>> writes stops to be logged? After I reconnect the disks, messages about failed async metadata writes stops to be logged. But the key thing is messages like XFS (dm-29): xfs_log_force: error -5 returned Keeps repeating every 30-secs which indicates that there is some buf/io error status that is being carried forward. >>> Any chance you can reliably reproduce it? Yes I have a way to reproduce it, but its not reliable. What I do is setup a dm-linear over a disk. Create XFS, mount & trigger few copy threads to copy varying sized files into the FS. At this point pull out the drive (with scsi-remove-single-device in /proc/scsi/scsi) & in a short-while convert the dm-linear to dm-ioerror. Then I bring back the underlying drive, convert back dm-ioerror to dm-linear & try to unmount XFS. This problem somehow happens on a newly created XFS. If I copy several files into XFS/delete them & then copy them again, repeat the drive failure/recovery experiment it doesn't reproduce. Thanks. --Shyam Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery From: Carlos Maiolino Date: Tue, 22 Mar 2016 16:38:25 +0100 In-reply-to: <20160322140345.GA54245@bfoster.bfoster> Mail-followup-to: xfs@xxxxxxxxxxx User-agent: Mutt/1.5.24 (2015-08-30) Hi Brian, These traces, and the stack trace presented, looks quite similar with the one we were discussing a few days ago, using a dm-thin snapshot. Looks like with the same bug I've been hunting and Shyam confirmed my hypothesis of this bug be able to be reproduced with a regular device. If it's the same bug, yes, I reproduced it using upstream kernel. The difference between both (this bug and the one I've been working on) is how xfs actually behaves when async metadata writes fail. Other than that, it pretty much looks the same. Trying to unmount the filesystem hungs in xfs_log_force(), well, basically the reason I submitted the patch to include the caller into xfs_log_force trace. I'd like to see ftrace traces from this system with that patch if possible. I didn't have time to keep working on this for the past few days, but looks like it's time to come back to it. Shyam, after you reconnected the disks, the messages about failed async metadata writes stops to be logged? Any chance you can reliably reproduce it? I'm not a xfs journal expert, but it looks like the writeback of items in AIL got stuck due the IO errors, and were never completed, but I don't know what I should expect after the disk is reconnected. In my case though, with upstream kernel, I didn't get a XFS_SHUTDOWN until I tried to unmount the filesystem, which differs from this case, where xfs looks to have shutdown the filesystem after a few tries to writeback the metadata. Anyway, I can dig more into it this week, if nobody knows what is going on before I do it :) -----Original Message----- From: Shyam Kaushik [mailto:shyam@zadarastorage.com] Sent: 22 March 2016 18:32 To: 'Brian Foster' Cc: 'xfs@oss.sgi.com'; Alex Lyakas Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Hi Brian, Thanks for your quick reply. I repeated the test & trace-pipe is constantly filled with this: xfsaild/dm-10-3335 [003] ...2 24890.546491: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.546492: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.546493: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 24890.596491: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.596492: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.596494: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 24890.646497: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.646498: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.646500: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 24890.696467: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 24890.746548: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 24890.796479: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 24890.846467: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 24890.846468: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] while regular activity seems to happen on other inodes/kworker threads kworker/u8:4-27691 [001] ...1 24895.811474: xfs_writepage: dev 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811477: xfs_invalidatepage: dev 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811478: xfs_releasepage: dev 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 0 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811482: xfs_writepage: dev 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811482: xfs_invalidatepage: dev 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 1000 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811483: xfs_releasepage: dev 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 0 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811485: xfs_writepage: dev 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811486: xfs_invalidatepage: dev 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.811486: xfs_releasepage: dev 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 0 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.812381: xfs_writepage: dev 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.812382: xfs_invalidatepage: dev 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 1000 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.812382: xfs_releasepage: dev 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 0 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.812385: xfs_writepage: dev 253:10 ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 unwritten 0 kworker/u8:4-27691 [001] ...1 24895.812385: xfs_invalidatepage: dev 253:10 ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 1000 delalloc 1 unwritten 0 looks like xfsaild is not able to take lock until hung-task timeout kicks in xfsaild/dm-10-3335 [003] ...2 25247.649468: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 25247.699478: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 25247.699516: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 25247.699517: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL xfsaild/dm-10-3335 [003] ...2 25247.749471: xfs_ilock_nowait: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 25247.749478: xfs_iunlock: dev 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] xfsaild/dm-10-3335 [003] ...2 25247.749479: xfs_ail_flushing: dev 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL Please let me know how to debug this further. Thanks. --Shyam -----Original Message----- From: Brian Foster [mailto:bfoster@redhat.com] Sent: 22 March 2016 17:49 To: Shyam Kaushik Cc: xfs@oss.sgi.com; Alex Lyakas Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery On Tue, Mar 22, 2016 at 04:51:39PM +0530, Shyam Kaushik wrote: > Hi XFS developers, > > We are seeing the following issue with XFS on kernel 3.18.19. > > We have XFS mounted over a raw disk. Disk was pulled out manually. There > were async writes on files that were errored like this > ... > > And XFS hit metadata & Log IO errors that it decides to shutdown: > > Mar 16 16:03:22 host0 kernel: [ 4637.351841] XFS (dm-29): metadata I/O > error: block 0x3a27fbd0 ("xlog_iodone") error 5 numblks 64 > Mar 16 16:03:22 host0 kernel: [ 4637.352820] XFS(dm-29): SHUTDOWN!!! > old_flags=0x0 new_flags=0x2 > Mar 16 16:03:22 host0 kernel: [ 4637.353187] XFS (dm-29): Log I/O Error > Detected. Shutting down filesystem ... > Later the drive was re-inserted back. After the drive was re-inserted, XFS > was attempted to be unmounted > > Mar 16 16:16:53 host0 controld: [2557] [ ] umount[202] > : umount(/sdisk/vol5b0, xfs) > > But nothing happens except for the 30-secs xfs_log_force errors that keeps > repeating > ... > > This problem doesn't happen consistently, but happens periodically with a > drive failure/recovery followed by XFS unmount. I couldn't find this issue > fixed in later kernels. Can you please suggest how I can debug this issue > further? > Similar problems have been reproduced due to racy/incorrect EFI/EFD object tracking, which are internal data structures associated with freeing extents. What happens if you enable tracepoints while the fs is in this hung unmount state? # trace-cmd start -e "xfs:*" # cat /sys/kernel/debug/tracing/trace_pipe Brian > Thanks! > > --Shyam > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Apr 8 06:37:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7B8077CB2 for ; Fri, 8 Apr 2016 06:37:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3E386304048 for ; Fri, 8 Apr 2016 04:37:13 -0700 (PDT) X-ASG-Debug-ID: 1460115431-04cbb02e1c1db90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id lFbr8vFWY0ZTRZCs (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 08 Apr 2016 04:37:11 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2DAF5C049E17; Fri, 8 Apr 2016 11:37:11 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-153.bos.redhat.com [10.18.41.153]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u38BbAxb020594; Fri, 8 Apr 2016 07:37:10 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E7DDB125438; Fri, 8 Apr 2016 07:37:09 -0400 (EDT) Date: Fri, 8 Apr 2016 07:37:09 -0400 From: Brian Foster To: Eryu Guan Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 0/6 v2] xfs: xfs_iflush_cluster vs xfs_reclaim_inode Message-ID: <20160408113709.GA30614@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 0/6 v2] xfs: xfs_iflush_cluster vs xfs_reclaim_inode References: <1460072271-23923-1-git-send-email-david@fromorbit.com> <20160408032841.GW10345@eguan.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160408032841.GW10345@eguan.usersys.redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460115431 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Apr 08, 2016 at 11:28:41AM +0800, Eryu Guan wrote: > On Fri, Apr 08, 2016 at 09:37:45AM +1000, Dave Chinner wrote: > > Hi folks, > > > > This is the second version of this patch set, first posted and > > described here: > > > > http://oss.sgi.com/archives/xfs/2016-04/msg00069.html > > Just a quick note here, I'm testing the v1 patchset right now, v4.6-rc2 > kernel + v1 patch, config file is based on rhel7 debug kernel config. > > The test is the same as the original reproducer (long term fsstress run > on XFS, exported from NFS). The test on x86_64 host has been running for > two days and everything looks fine. Test on ppc64 host has been running > for a few hours and I noticed a lock issue and a few warnings, not sure > if it's related to the patches or even to XFS yet(I need to run test on > stock -rc2 kernel to be sure), but just post the logs here for reference > Had the original problem ever been reproduced on an upstream kernel? FWIW, my rhel kernel based test is still running well approaching ~48 hours. I've seen some lockdep messages (bad unlock balance), but IIRC I've been seeing those from the start so I haven't been paying much attention to it while digging into the core problem. > [ 1911.626286] ====================================================== > [ 1911.626291] [ INFO: possible circular locking dependency detected ] > [ 1911.626297] 4.6.0-rc2.debug+ #1 Not tainted > [ 1911.626301] ------------------------------------------------------- > [ 1911.626306] nfsd/7402 is trying to acquire lock: > [ 1911.626311] (&s->s_sync_lock){+.+.+.}, at: [] .sync_inodes_sb+0xe0/0x230 > [ 1911.626327] > [ 1911.626327] but task is already holding lock: > [ 1911.626333] (sb_internal){.+.+.+}, at: [] .__sb_start_write+0x90/0x130 > [ 1911.626346] > [ 1911.626346] which lock already depends on the new lock. > [ 1911.626346] > [ 1911.626353] > [ 1911.626353] the existing dependency chain (in reverse order) is: > [ 1911.626358] ... > [ 1911.627134] Possible unsafe locking scenario: > [ 1911.627134] > [ 1911.627139] CPU0 CPU1 > [ 1911.627143] ---- ---- > [ 1911.627147] lock(sb_internal); > [ 1911.627153] lock(&s->s_sync_lock); > [ 1911.627160] lock(sb_internal); > [ 1911.627166] lock(&s->s_sync_lock); > [ 1911.627172] > [ 1911.627172] *** DEADLOCK *** > [ 1911.627172] ... We actually have a report of this one on the list: http://oss.sgi.com/archives/xfs/2016-04/msg00001.html ... so I don't think it's related to this series. I believe I've seen this once or twice when testing something completely unrelated, as well. > [ 2046.852739] kworker/dying (399) used greatest stack depth: 4352 bytes left > [ 2854.687381] XFS: Assertion failed: buffer_mapped(bh), file: fs/xfs/xfs_aops.c, line: 780 > [ 2854.687434] ------------[ cut here ]------------ > [ 2854.687488] WARNING: CPU: 5 PID: 28924 at fs/xfs/xfs_message.c:105 .asswarn+0x2c/0x40 [xfs] ... > [ 2854.687997] ---[ end trace 872ac2709186f780 ]--- These asserts look new to me, however. It would be interesting to see if these reproduce independently. Brian > [ 2854.688001] XFS: Assertion failed: buffer_mapped(bh), file: fs/xfs/xfs_aops.c, line: 780 > [ 2854.688022] ------------[ cut here ]------------ > [ 2854.688072] WARNING: CPU: 5 PID: 28924 at fs/xfs/xfs_message.c:105 .asswarn+0x2c/0x40 [xfs] > [ 2854.688076] Modules linked in: rpcsec_gss_krb5 nfsv4 dns_resolver nfs fscache dm_mod loop sg pseries_rng nfsd auth_rpcgss nfs_acl lockd sunrpc grace ip_tables xfs libcrc32c sd_mod ibmvscsi ibmveth scsi_transport_srp > [ 2854.688110] CPU: 5 PID: 28924 Comm: kworker/u32:4 Tainted: G W 4.6.0-rc2.debug+ #1 > [ 2854.688116] Workqueue: writeback .wb_workfn (flush-253:0) > [ 2854.688121] task: c0000001e6d28380 ti: c0000000fe3ac000 task.ti: c0000000fe3ac000 > [ 2854.688126] NIP: d0000000066ddafc LR: d0000000066ddafc CTR: c0000000004dd880 > [ 2854.688131] REGS: c0000000fe3aeeb0 TRAP: 0700 Tainted: G W (4.6.0-rc2.debug+) > [ 2854.688135] MSR: 8000000100029032 CR: 48002048 XER: 0000000d > [ 2854.688153] CFAR: d0000000066dd890 SOFTE: 1 > GPR00: d0000000066ddafc c0000000fe3af130 d000000006765850 ffffffffffffffea > GPR04: 000000000000000a c0000000fe3aef50 00000000000000d1 ffffffffffffffc0 > GPR08: 0000000000000000 0000000000000021 00000000ffffffd1 d000000006741dc0 > GPR12: c0000000004dd880 c00000000e822d00 c0000000fe3af4e0 0000000000000001 > GPR16: c0000000fe3af6f0 0000000000000002 0000000000000000 0000000000000007 > GPR20: 0000000000000003 c0000000fe3af4f0 0000000000000000 c0000000fe3af210 > GPR24: 0000000000000004 0000000000001000 0000000000160000 f000000000f0e100 > GPR28: c0000004055d18c8 c000000016cde430 0000000000158000 c0000004055d1588 > [ 2854.688268] NIP [d0000000066ddafc] .asswarn+0x2c/0x40 [xfs] > [ 2854.688318] LR [d0000000066ddafc] .asswarn+0x2c/0x40 [xfs] > [ 2854.688321] Call Trace: > [ 2854.688369] [c0000000fe3af130] [d0000000066ddafc] .asswarn+0x2c/0x40 [xfs] (unreliable) > [ 2854.688423] [c0000000fe3af1a0] [d0000000066a9104] .xfs_do_writepage+0x414/0x930 [xfs] > [ 2854.688430] [c0000000fe3af2b0] [c00000000025df6c] .write_cache_pages+0x5fc/0x820 > [ 2854.688481] [c0000000fe3af470] [d0000000066a8a5c] .xfs_vm_writepages+0x8c/0xd0 [xfs] > [ 2854.688487] [c0000000fe3af540] [c00000000025f62c] .do_writepages+0x3c/0x70 > [ 2854.688493] [c0000000fe3af5b0] [c00000000035b1ec] .__writeback_single_inode+0x5bc/0xd50 > [ 2854.688499] [c0000000fe3af680] [c00000000035c3c0] .writeback_sb_inodes+0x380/0x730 > [ 2854.688505] [c0000000fe3af7f0] [c00000000035ca44] .wb_writeback+0x194/0x920 > [ 2854.688510] [c0000000fe3af960] [c00000000035ddcc] .wb_workfn+0x19c/0xa40 > [ 2854.688516] [c0000000fe3afad0] [c0000000000dfc74] .process_one_work+0x264/0x8f0 > [ 2854.688522] [c0000000fe3afbc0] [c0000000000e0388] .worker_thread+0x88/0x520 > [ 2854.688528] [c0000000fe3afcb0] [c0000000000e9ac4] .kthread+0x114/0x140 > [ 2854.688534] [c0000000fe3afe30] [c000000000009578] .ret_from_kernel_thread+0x58/0x60 > [ 2854.688539] Instruction dump: > [ 2854.688543] 60420000 7c0802a6 3d420000 7c691b78 7c862378 e88abe38 7ca72b78 38600000 > [ 2854.688555] 7d254b78 f8010010 f821ff91 4bfffcf9 <0fe00000> 38210070 e8010010 7c0803a6 > [ 2854.688568] ---[ end trace 872ac2709186f781 ]--- > > [then the XFS warning repeated for a few times triggered by different > pid] > > Thanks, > Eryu > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Apr 8 08:17:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9C3E47CA1 for ; Fri, 8 Apr 2016 08:17:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6FE07304032 for ; Fri, 8 Apr 2016 06:17:03 -0700 (PDT) X-ASG-Debug-ID: 1460121420-04cbb02e1d24180001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 3ITHoAia15oG6JMj (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 08 Apr 2016 06:17:01 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B70656C4; Fri, 8 Apr 2016 13:17:00 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-153.bos.redhat.com [10.18.41.153]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u38DH0XB010427; Fri, 8 Apr 2016 09:17:00 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 2F321125438; Fri, 8 Apr 2016 09:16:59 -0400 (EDT) Date: Fri, 8 Apr 2016 09:16:59 -0400 From: Brian Foster To: Shyam Kaushik Cc: david@fromorbit.com, xfs@oss.sgi.com, Alex Lyakas Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Message-ID: <20160408131658.GB30614@bfoster.bfoster> X-ASG-Orig-Subj: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery References: <20160322121922.GA53693@bfoster.bfoster> <232dd85fde11d4ef1625f070eabfd167@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <232dd85fde11d4ef1625f070eabfd167@mail.gmail.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460121421 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Apr 08, 2016 at 04:21:02PM +0530, Shyam Kaushik wrote: > Hi Dave, Brian, Carlos, > > While trying to reproduce this issue I have been running into different > issues that are similar. Underlying issue remains the same when backend to > XFS is failed & we unmount XFS, we run into hung-task timeout (180-secs) > with stack like > > kernel: [14952.671131] [] > xfs_ail_push_all_sync+0xa9/0xe0 [xfs] > kernel: [14952.671139] [] ? > prepare_to_wait_event+0x110/0x110 > kernel: [14952.671181] [] xfs_unmountfs+0x61/0x1a0 > [xfs] > > while running trace-events, XFS ail push keeps looping around > > xfsaild/dm-10-21143 [001] ...2 17878.555133: xfs_ilock_nowait: dev > 253:10 ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-21143 [001] ...2 17878.555138: xfs_iunlock: dev 253:10 > ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-21143 [001] ...2 17878.555138: xfs_ail_push: dev 253:10 > lip 0xffff880031f6ae40 lsn 1/73448 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-21143 [001] ...2 17878.605136: xfs_ilock_nowait: dev > 253:10 ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-21143 [001] ...2 17878.605141: xfs_iunlock: dev 253:10 > ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-21143 [001] ...2 17878.605142: xfs_ail_push: dev 253:10 > lip 0xffff880031f6ae40 lsn 1/73448 type XFS_LI_INODE flags IN_AIL > > observe ino==0x0 (its a freed inode) but the corresponding lip stays with > xfsaild push. I had run a systemtap when this problem happened & the > following keeps repeating. > That's interesting, and looks different from the original report in terms of the inode number being cleared. The original report looks like it has a valid inode and there's some problematic sequence where it's not being removed from the AIL in the event of errors. I think at this point we know that XFS attempts to retry these I/Os indefinitely. Dave has outstanding patches to deal with this issue. The question Dave raised above was whether the filesystem shut down, and if not, why (as a failed log I/O should cause a shutdown)? Carlos was looking into this it appears... > xfs_inode_item_push() - inode:0xffff88003d8ca000 m_flags:0x420118 > flags:0x1 > xfs_iflush() - inode:ffff88003d8ca000 aborting for forced shutdown > xfs_iflush_abort() - iip:0x0 > > xfs_inode_item_push() is doing xfs_iflush() but it sees FS_SHUTDOWN flag > marked & does an xfs_iflush_abort().xfs_iflush_abort() sees i_itemp==NULL > on the lip & doesn't do anything. So we have this stale lip that is not > associated to inode anymore that keeps xfs_ail_push_all_sync() busy. > > On few other occurrences, i have had NULL pointer/dereference or other > sorts of crashes at this line > > xfsaild_push() > lock_result = lip->li_ops->iop_push(lip, > &ailp->xa_buf_list); > > with debug prints, in one of the occurrence lip->li_ops was NULL & in > another lip->li_ops was pointing to a bad pointer that subsequent > dereference crashed it. This also indicates that a bad/freed lip was > inserted that xfsaild_push() is working. > > I hit upon Dave's patch "xfs: xfs_inode_free() isn't RCU safe" & realized > that this could explain the above issue where a lip that has been freed is > wrongly referenced & later we could even have the inode disconnected. What > do you think? > > In any case I uploaded the full xfs trace events before this issue started > & till the end. It is at > https://www.dropbox.com/s/21qstz4ld1gn8yi/xfs_trace_pipe.gz?dl=0 > It seems like it could be related. I didn't catch anything obvious from the trace, but there's a lot of data there. The RCU-unsafe issue was difficult to track down without instrumentation.. I'm not sure that will be evident from the trace. The best thing to do wrt to that might be to try with Dave's patches, as that so far appears to address the problem. (In fact, it might be worth it to try Dave's shutdown on umount patch he referred to up-thread to address the original problem as well). Brian > Pls let me know. Thanks. > > --Shyam > > -----Original Message----- > From: Shyam Kaushik [mailto:shyam@zadarastorage.com] > Sent: 23 March 2016 15:23 > To: 'Brian Foster' > Cc: 'xfs@oss.sgi.com'; Alex Lyakas > Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > after disk failure/recovery > > Hi Carlos, > > w.r.t. your question below > > >>> Shyam, after you reconnected the disks, the messages about failed > async metadata > >>> writes stops to be logged? > > After I reconnect the disks, messages about failed async metadata writes > stops to be logged. But the key thing is messages like > > XFS (dm-29): xfs_log_force: error -5 returned > > Keeps repeating every 30-secs which indicates that there is some buf/io > error status that is being carried forward. > > >>> Any chance you can reliably reproduce it? > > Yes I have a way to reproduce it, but its not reliable. What I do is setup > a dm-linear over a disk. Create XFS, mount & trigger few copy threads to > copy varying sized files into the FS. At this point pull out the drive > (with scsi-remove-single-device in /proc/scsi/scsi) & in a short-while > convert the dm-linear to dm-ioerror. Then I bring back the underlying > drive, convert back dm-ioerror to dm-linear & try to unmount XFS. > > This problem somehow happens on a newly created XFS. If I copy several > files into XFS/delete them & then copy them again, repeat the drive > failure/recovery experiment it doesn't reproduce. > > Thanks. > > --Shyam > > Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > after disk failure/recovery > From: Carlos Maiolino > Date: Tue, 22 Mar 2016 16:38:25 +0100 > In-reply-to: <20160322140345.GA54245@bfoster.bfoster> > Mail-followup-to: xfs@xxxxxxxxxxx > User-agent: Mutt/1.5.24 (2015-08-30) > > Hi Brian, > > These traces, and the stack trace presented, looks quite similar with the > one we were discussing a few days ago, using a dm-thin snapshot. > > Looks like with the same bug I've been hunting and Shyam confirmed my > hypothesis > of this bug be able to be reproduced with a regular device. > > If it's the same bug, yes, I reproduced it using upstream kernel. > > The difference between both (this bug and the one I've been working on) is > how > xfs actually behaves when async metadata writes fail. Other than that, it > pretty > much looks the same. > > Trying to unmount the filesystem hungs in xfs_log_force(), well, basically > the > reason I submitted the patch to include the caller into xfs_log_force > trace. I'd > like to see ftrace traces from this system with that patch if possible. > > I didn't have time to keep working on this for the past few days, but > looks like > it's time to come back to it. > > Shyam, after you reconnected the disks, the messages about failed async > metadata > writes stops to be logged? > > Any chance you can reliably reproduce it? > > I'm not a xfs journal expert, but it looks like the writeback of items in > AIL > got stuck due the IO errors, and were never completed, but I don't know > what I > should expect after the disk is reconnected. > > In my case though, with upstream kernel, I didn't get a XFS_SHUTDOWN until > I > tried to unmount the filesystem, which differs from this case, where xfs > looks > to have shutdown the filesystem after a few tries to writeback the > metadata. > > Anyway, I can dig more into it this week, if nobody knows what is going on > before I do it :) > > -----Original Message----- > From: Shyam Kaushik [mailto:shyam@zadarastorage.com] > Sent: 22 March 2016 18:32 > To: 'Brian Foster' > Cc: 'xfs@oss.sgi.com'; Alex Lyakas > Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > after disk failure/recovery > > Hi Brian, > > Thanks for your quick reply. I repeated the test & trace-pipe is > constantly filled with this: > > xfsaild/dm-10-3335 [003] ...2 24890.546491: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.546492: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.546493: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.596491: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.596492: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.596494: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.646497: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.646498: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.646500: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.696467: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.746548: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.796479: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.846467: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.846468: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > while regular activity seems to happen on other inodes/kworker threads > > kworker/u8:4-27691 [001] ...1 24895.811474: xfs_writepage: dev 253:10 > ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811477: xfs_invalidatepage: dev > 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > delalloc 1 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811478: xfs_releasepage: dev > 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 > delalloc 0 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811482: xfs_writepage: dev 253:10 > ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811482: xfs_invalidatepage: dev > 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > delalloc 1 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811483: xfs_releasepage: dev > 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 > delalloc 0 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811485: xfs_writepage: dev 253:10 > ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811486: xfs_invalidatepage: dev > 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > delalloc 1 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811486: xfs_releasepage: dev > 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 > delalloc 0 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812381: xfs_writepage: dev 253:10 > ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812382: xfs_invalidatepage: dev > 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 1000 > delalloc 1 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812382: xfs_releasepage: dev > 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc > 0 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812385: xfs_writepage: dev 253:10 > ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812385: xfs_invalidatepage: dev > 253:10 ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 1000 > delalloc 1 unwritten 0 > > > looks like xfsaild is not able to take lock until hung-task timeout kicks > in > > xfsaild/dm-10-3335 [003] ...2 25247.649468: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 25247.699478: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.699516: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.699517: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 25247.749471: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.749478: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.749479: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > Please let me know how to debug this further. Thanks. > > --Shyam > -----Original Message----- > From: Brian Foster [mailto:bfoster@redhat.com] > Sent: 22 March 2016 17:49 > To: Shyam Kaushik > Cc: xfs@oss.sgi.com; Alex Lyakas > Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > after disk failure/recovery > > On Tue, Mar 22, 2016 at 04:51:39PM +0530, Shyam Kaushik wrote: > > Hi XFS developers, > > > > We are seeing the following issue with XFS on kernel 3.18.19. > > > > We have XFS mounted over a raw disk. Disk was pulled out manually. There > > were async writes on files that were errored like this > > > ... > > > > And XFS hit metadata & Log IO errors that it decides to shutdown: > > > > Mar 16 16:03:22 host0 kernel: [ 4637.351841] XFS (dm-29): metadata I/O > > error: block 0x3a27fbd0 ("xlog_iodone") error 5 numblks 64 > > Mar 16 16:03:22 host0 kernel: [ 4637.352820] XFS(dm-29): SHUTDOWN!!! > > old_flags=0x0 new_flags=0x2 > > Mar 16 16:03:22 host0 kernel: [ 4637.353187] XFS (dm-29): Log I/O Error > > Detected. Shutting down filesystem > ... > > Later the drive was re-inserted back. After the drive was re-inserted, > XFS > > was attempted to be unmounted > > > > Mar 16 16:16:53 host0 controld: [2557] [ ] umount[202] > > : umount(/sdisk/vol5b0, xfs) > > > > But nothing happens except for the 30-secs xfs_log_force errors that > keeps > > repeating > > > ... > > > > This problem doesn't happen consistently, but happens periodically with > a > > drive failure/recovery followed by XFS unmount. I couldn't find this > issue > > fixed in later kernels. Can you please suggest how I can debug this > issue > > further? > > > > Similar problems have been reproduced due to racy/incorrect EFI/EFD > object tracking, which are internal data structures associated with > freeing extents. > > What happens if you enable tracepoints while the fs is in this hung > unmount state? > > # trace-cmd start -e "xfs:*" > # cat /sys/kernel/debug/tracing/trace_pipe > > Brian > > > Thanks! > > > > --Shyam > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From shyam@zadarastorage.com Fri Apr 8 08:35:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 78B5B7CA6 for ; Fri, 8 Apr 2016 08:35:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1422C8F8033 for ; Fri, 8 Apr 2016 06:35:45 -0700 (PDT) X-ASG-Debug-ID: 1460122525-04bdf01105348810001-NocioJ Received: from mail-wm0-f43.google.com (mail-wm0-f43.google.com [74.125.82.43]) by cuda.sgi.com with ESMTP id RB3cbDhUzTyWSaBF (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 08 Apr 2016 06:35:26 -0700 (PDT) X-Barracuda-Envelope-From: shyam@zadarastorage.com X-Barracuda-Apparent-Source-IP: 74.125.82.43 Received: by mail-wm0-f43.google.com with SMTP id u206so22857995wme.1 for ; Fri, 08 Apr 2016 06:35:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=from:references:in-reply-to:mime-version:thread-index:date :message-id:subject:to:cc; bh=tUq7PWCHodfFaaYvxfRH2roiFKb14TsECmXldWKZ1G4=; b=e42PeCctmTV7Jy73VCk8CQRdKMfMnELjLM8a0QXC5OST35Ft7u5JPqChsSyTN+S+zN NVxHByJtcz9CEfhD19lNMfbBPZSwU+R4AK8dDFBRH7mwHcNVVAPDVszEORNGDeWoAptU 9qALiFSNB1lHk2V+ZhY8cydZxdqmIZYhQm0M57FmG1bQxtBMLvNbtYwwW/vPGiqv/kKm P+H9W6uO+ULAkGWQlFVf/F2iCxbddMB6w975nTvgdIQe4pCI+YXsUn69Qs6uZnaoslMR kSlyX7Xo0++6Iu0Awv3ULXb/9elvtnv5G7QNDNcZYx9j4+1ukK0eTWmid18BuFI7q0T6 t5pw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:references:in-reply-to:mime-version :thread-index:date:message-id:subject:to:cc; bh=tUq7PWCHodfFaaYvxfRH2roiFKb14TsECmXldWKZ1G4=; b=awibcgWNBgm1tCuFRh6MIHNHfXvTl8dQTYR+i8ToHAxqlj3YPfFvDUdzA8IJDyqJyx 8z+NWEv5YRHso1J/QT5XrUh3FG4IRvB7NQsA4UvQkOEmEoyXVoc+uy4YRbWw8vav134L gbRCo2Ou47LP7ifQBZvwhSoWYmawy58crbG//jsyLVrCgtjFYGiFhTL2XRytMLNvVNWS nU5J1sgfxv6NT5FTIu7nI60B/bCDR34zvB6+kqG2crAw/m0dKE09yRO/tTm8kugDDGVt LQrOL+t7MyVM+8Fbh4CKwHA0CRKtrPcfdLJzHgAsQYbSVPv+3ftpclayqPjPadOHhE6d Hzfg== X-Gm-Message-State: AD7BkJKJb4+YAzkNiFqyaadosn4CCxovG3E9lFXJNTPCVKK/+14Y81OfODvmgQi4sNCx3ktZq9gcG5WU2nIWSg== X-Received: by 10.28.125.2 with SMTP id y2mr3922643wmc.90.1460122524695; Fri, 08 Apr 2016 06:35:24 -0700 (PDT) From: Shyam Kaushik References: <20160322121922.GA53693@bfoster.bfoster> <232dd85fde11d4ef1625f070eabfd167@mail.gmail.com> <20160408131658.GB30614@bfoster.bfoster> In-Reply-To: <20160408131658.GB30614@bfoster.bfoster> MIME-Version: 1.0 X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AdGRmO+FiKrbezRSShaLKSg5VNlyvQAAfzdA Date: Fri, 8 Apr 2016 19:05:24 +0530 Message-ID: <98e40e83fabf331b114fd6f41084d282@mail.gmail.com> Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery To: Brian Foster X-ASG-Orig-Subj: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Cc: david@fromorbit.com, xfs@oss.sgi.com, Alex Lyakas Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wm0-f43.google.com[74.125.82.43] X-Barracuda-Start-Time: 1460122525 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28552 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi Brian, Yes the below report is a bit different than the original report. I wanted to confirm if the new patches from Dave will see these odd crashes/hung-task. I applied Dave's patch & managed to recreate the original issue. With systemtap I do see that FS has been marked for shutdown (xfs_aildpush() - mp:0xffff880062d09800 m_flags:4325656), but still the infinite tries keep happening with xfsaild_push() seeing XFS_IFLOCK on the inode. Pls note that this issue happens only when I see XFS (dm-10): Detected failing async write on buffer block 0x368d76a0. Retrying async write. in the logs. In all other cases, this problem doesn't happen. So there is something with this async-write retries that is leaving the state of the inode with IFLOCK that rest of aildpush is not able to handle. --Shyam -----Original Message----- From: Brian Foster [mailto:bfoster@redhat.com] Sent: 08 April 2016 18:47 To: Shyam Kaushik Cc: david@fromorbit.com; xfs@oss.sgi.com; Alex Lyakas Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery On Fri, Apr 08, 2016 at 04:21:02PM +0530, Shyam Kaushik wrote: > Hi Dave, Brian, Carlos, > > While trying to reproduce this issue I have been running into different > issues that are similar. Underlying issue remains the same when backend to > XFS is failed & we unmount XFS, we run into hung-task timeout (180-secs) > with stack like > > kernel: [14952.671131] [] > xfs_ail_push_all_sync+0xa9/0xe0 [xfs] > kernel: [14952.671139] [] ? > prepare_to_wait_event+0x110/0x110 > kernel: [14952.671181] [] xfs_unmountfs+0x61/0x1a0 > [xfs] > > while running trace-events, XFS ail push keeps looping around > > xfsaild/dm-10-21143 [001] ...2 17878.555133: xfs_ilock_nowait: dev > 253:10 ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-21143 [001] ...2 17878.555138: xfs_iunlock: dev 253:10 > ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-21143 [001] ...2 17878.555138: xfs_ail_push: dev 253:10 > lip 0xffff880031f6ae40 lsn 1/73448 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-21143 [001] ...2 17878.605136: xfs_ilock_nowait: dev > 253:10 ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-21143 [001] ...2 17878.605141: xfs_iunlock: dev 253:10 > ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-21143 [001] ...2 17878.605142: xfs_ail_push: dev 253:10 > lip 0xffff880031f6ae40 lsn 1/73448 type XFS_LI_INODE flags IN_AIL > > observe ino==0x0 (its a freed inode) but the corresponding lip stays with > xfsaild push. I had run a systemtap when this problem happened & the > following keeps repeating. > That's interesting, and looks different from the original report in terms of the inode number being cleared. The original report looks like it has a valid inode and there's some problematic sequence where it's not being removed from the AIL in the event of errors. I think at this point we know that XFS attempts to retry these I/Os indefinitely. Dave has outstanding patches to deal with this issue. The question Dave raised above was whether the filesystem shut down, and if not, why (as a failed log I/O should cause a shutdown)? Carlos was looking into this it appears... > xfs_inode_item_push() - inode:0xffff88003d8ca000 m_flags:0x420118 > flags:0x1 > xfs_iflush() - inode:ffff88003d8ca000 aborting for forced shutdown > xfs_iflush_abort() - iip:0x0 > > xfs_inode_item_push() is doing xfs_iflush() but it sees FS_SHUTDOWN flag > marked & does an xfs_iflush_abort().xfs_iflush_abort() sees i_itemp==NULL > on the lip & doesn't do anything. So we have this stale lip that is not > associated to inode anymore that keeps xfs_ail_push_all_sync() busy. > > On few other occurrences, i have had NULL pointer/dereference or other > sorts of crashes at this line > > xfsaild_push() > lock_result = lip->li_ops->iop_push(lip, > &ailp->xa_buf_list); > > with debug prints, in one of the occurrence lip->li_ops was NULL & in > another lip->li_ops was pointing to a bad pointer that subsequent > dereference crashed it. This also indicates that a bad/freed lip was > inserted that xfsaild_push() is working. > > I hit upon Dave's patch "xfs: xfs_inode_free() isn't RCU safe" & realized > that this could explain the above issue where a lip that has been freed is > wrongly referenced & later we could even have the inode disconnected. What > do you think? > > In any case I uploaded the full xfs trace events before this issue started > & till the end. It is at > https://www.dropbox.com/s/21qstz4ld1gn8yi/xfs_trace_pipe.gz?dl=0 > It seems like it could be related. I didn't catch anything obvious from the trace, but there's a lot of data there. The RCU-unsafe issue was difficult to track down without instrumentation.. I'm not sure that will be evident from the trace. The best thing to do wrt to that might be to try with Dave's patches, as that so far appears to address the problem. (In fact, it might be worth it to try Dave's shutdown on umount patch he referred to up-thread to address the original problem as well). Brian > Pls let me know. Thanks. > > --Shyam > > -----Original Message----- > From: Shyam Kaushik [mailto:shyam@zadarastorage.com] > Sent: 23 March 2016 15:23 > To: 'Brian Foster' > Cc: 'xfs@oss.sgi.com'; Alex Lyakas > Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > after disk failure/recovery > > Hi Carlos, > > w.r.t. your question below > > >>> Shyam, after you reconnected the disks, the messages about failed > async metadata > >>> writes stops to be logged? > > After I reconnect the disks, messages about failed async metadata writes > stops to be logged. But the key thing is messages like > > XFS (dm-29): xfs_log_force: error -5 returned > > Keeps repeating every 30-secs which indicates that there is some buf/io > error status that is being carried forward. > > >>> Any chance you can reliably reproduce it? > > Yes I have a way to reproduce it, but its not reliable. What I do is setup > a dm-linear over a disk. Create XFS, mount & trigger few copy threads to > copy varying sized files into the FS. At this point pull out the drive > (with scsi-remove-single-device in /proc/scsi/scsi) & in a short-while > convert the dm-linear to dm-ioerror. Then I bring back the underlying > drive, convert back dm-ioerror to dm-linear & try to unmount XFS. > > This problem somehow happens on a newly created XFS. If I copy several > files into XFS/delete them & then copy them again, repeat the drive > failure/recovery experiment it doesn't reproduce. > > Thanks. > > --Shyam > > Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > after disk failure/recovery > From: Carlos Maiolino > Date: Tue, 22 Mar 2016 16:38:25 +0100 > In-reply-to: <20160322140345.GA54245@bfoster.bfoster> > Mail-followup-to: xfs@xxxxxxxxxxx > User-agent: Mutt/1.5.24 (2015-08-30) > > Hi Brian, > > These traces, and the stack trace presented, looks quite similar with the > one we were discussing a few days ago, using a dm-thin snapshot. > > Looks like with the same bug I've been hunting and Shyam confirmed my > hypothesis > of this bug be able to be reproduced with a regular device. > > If it's the same bug, yes, I reproduced it using upstream kernel. > > The difference between both (this bug and the one I've been working on) is > how > xfs actually behaves when async metadata writes fail. Other than that, it > pretty > much looks the same. > > Trying to unmount the filesystem hungs in xfs_log_force(), well, basically > the > reason I submitted the patch to include the caller into xfs_log_force > trace. I'd > like to see ftrace traces from this system with that patch if possible. > > I didn't have time to keep working on this for the past few days, but > looks like > it's time to come back to it. > > Shyam, after you reconnected the disks, the messages about failed async > metadata > writes stops to be logged? > > Any chance you can reliably reproduce it? > > I'm not a xfs journal expert, but it looks like the writeback of items in > AIL > got stuck due the IO errors, and were never completed, but I don't know > what I > should expect after the disk is reconnected. > > In my case though, with upstream kernel, I didn't get a XFS_SHUTDOWN until > I > tried to unmount the filesystem, which differs from this case, where xfs > looks > to have shutdown the filesystem after a few tries to writeback the > metadata. > > Anyway, I can dig more into it this week, if nobody knows what is going on > before I do it :) > > -----Original Message----- > From: Shyam Kaushik [mailto:shyam@zadarastorage.com] > Sent: 22 March 2016 18:32 > To: 'Brian Foster' > Cc: 'xfs@oss.sgi.com'; Alex Lyakas > Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > after disk failure/recovery > > Hi Brian, > > Thanks for your quick reply. I repeated the test & trace-pipe is > constantly filled with this: > > xfsaild/dm-10-3335 [003] ...2 24890.546491: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.546492: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.546493: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.596491: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.596492: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.596494: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.646497: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.646498: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.646500: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.696467: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.746548: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.796479: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.846467: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.846468: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > while regular activity seems to happen on other inodes/kworker threads > > kworker/u8:4-27691 [001] ...1 24895.811474: xfs_writepage: dev 253:10 > ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811477: xfs_invalidatepage: dev > 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > delalloc 1 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811478: xfs_releasepage: dev > 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 > delalloc 0 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811482: xfs_writepage: dev 253:10 > ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811482: xfs_invalidatepage: dev > 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > delalloc 1 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811483: xfs_releasepage: dev > 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 > delalloc 0 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811485: xfs_writepage: dev 253:10 > ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811486: xfs_invalidatepage: dev > 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > delalloc 1 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811486: xfs_releasepage: dev > 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 > delalloc 0 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812381: xfs_writepage: dev 253:10 > ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812382: xfs_invalidatepage: dev > 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 1000 > delalloc 1 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812382: xfs_releasepage: dev > 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc > 0 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812385: xfs_writepage: dev 253:10 > ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812385: xfs_invalidatepage: dev > 253:10 ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 1000 > delalloc 1 unwritten 0 > > > looks like xfsaild is not able to take lock until hung-task timeout kicks > in > > xfsaild/dm-10-3335 [003] ...2 25247.649468: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 25247.699478: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.699516: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.699517: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 25247.749471: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.749478: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.749479: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > Please let me know how to debug this further. Thanks. > > --Shyam > -----Original Message----- > From: Brian Foster [mailto:bfoster@redhat.com] > Sent: 22 March 2016 17:49 > To: Shyam Kaushik > Cc: xfs@oss.sgi.com; Alex Lyakas > Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > after disk failure/recovery > > On Tue, Mar 22, 2016 at 04:51:39PM +0530, Shyam Kaushik wrote: > > Hi XFS developers, > > > > We are seeing the following issue with XFS on kernel 3.18.19. > > > > We have XFS mounted over a raw disk. Disk was pulled out manually. There > > were async writes on files that were errored like this > > > ... > > > > And XFS hit metadata & Log IO errors that it decides to shutdown: > > > > Mar 16 16:03:22 host0 kernel: [ 4637.351841] XFS (dm-29): metadata I/O > > error: block 0x3a27fbd0 ("xlog_iodone") error 5 numblks 64 > > Mar 16 16:03:22 host0 kernel: [ 4637.352820] XFS(dm-29): SHUTDOWN!!! > > old_flags=0x0 new_flags=0x2 > > Mar 16 16:03:22 host0 kernel: [ 4637.353187] XFS (dm-29): Log I/O Error > > Detected. Shutting down filesystem > ... > > Later the drive was re-inserted back. After the drive was re-inserted, > XFS > > was attempted to be unmounted > > > > Mar 16 16:16:53 host0 controld: [2557] [ ] umount[202] > > : umount(/sdisk/vol5b0, xfs) > > > > But nothing happens except for the 30-secs xfs_log_force errors that > keeps > > repeating > > > ... > > > > This problem doesn't happen consistently, but happens periodically with > a > > drive failure/recovery followed by XFS unmount. I couldn't find this > issue > > fixed in later kernels. Can you please suggest how I can debug this > issue > > further? > > > > Similar problems have been reproduced due to racy/incorrect EFI/EFD > object tracking, which are internal data structures associated with > freeing extents. > > What happens if you enable tracepoints while the fs is in this hung > unmount state? > > # trace-cmd start -e "xfs:*" > # cat /sys/kernel/debug/tracing/trace_pipe > > Brian > > > Thanks! > > > > --Shyam > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From cmaiolino@redhat.com Fri Apr 8 09:31:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3B9267CB6 for ; Fri, 8 Apr 2016 09:31:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 944FAAC005 for ; Fri, 8 Apr 2016 07:31:39 -0700 (PDT) X-ASG-Debug-ID: 1460125896-04cb6c2462358d50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id FC6iOMKXSfh3U1Ta (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 08 Apr 2016 07:31:37 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0D5A5BB17 for ; Fri, 8 Apr 2016 14:31:36 +0000 (UTC) Received: from redhat.com (unused [10.10.50.39] (may be forged)) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u38EVVjF013297 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 8 Apr 2016 10:31:34 -0400 Date: Fri, 8 Apr 2016 16:31:31 +0200 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Message-ID: <20160408143131.GA24175@redhat.com> X-ASG-Orig-Subj: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Mail-Followup-To: xfs@oss.sgi.com References: <20160322121922.GA53693@bfoster.bfoster> <232dd85fde11d4ef1625f070eabfd167@mail.gmail.com> <20160408131658.GB30614@bfoster.bfoster> <98e40e83fabf331b114fd6f41084d282@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <98e40e83fabf331b114fd6f41084d282@mail.gmail.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460125896 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi Shyam, do you mind to share your systemtap script with us? I'd like to take a look on it, and probably Brian will be interested to. On Fri, Apr 08, 2016 at 07:05:24PM +0530, Shyam Kaushik wrote: > Hi Brian, > > Yes the below report is a bit different than the original report. I wanted > to confirm if the new patches from Dave will see these odd > crashes/hung-task. > > I applied Dave's patch & managed to recreate the original issue. With > systemtap I do see that FS has been marked for shutdown (xfs_aildpush() - > mp:0xffff880062d09800 m_flags:4325656), but still the infinite tries keep > happening with xfsaild_push() seeing XFS_IFLOCK on the inode. Pls note > that this issue happens only when I see > > XFS (dm-10): Detected failing async write on buffer block 0x368d76a0. > Retrying async write. > > in the logs. In all other cases, this problem doesn't happen. So there is > something with this async-write retries that is leaving the state of the > inode with IFLOCK that rest of aildpush is not able to handle. > > --Shyam > > -----Original Message----- > From: Brian Foster [mailto:bfoster@redhat.com] > Sent: 08 April 2016 18:47 > To: Shyam Kaushik > Cc: david@fromorbit.com; xfs@oss.sgi.com; Alex Lyakas > Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > after disk failure/recovery > > On Fri, Apr 08, 2016 at 04:21:02PM +0530, Shyam Kaushik wrote: > > Hi Dave, Brian, Carlos, > > > > While trying to reproduce this issue I have been running into different > > issues that are similar. Underlying issue remains the same when backend > to > > XFS is failed & we unmount XFS, we run into hung-task timeout (180-secs) > > with stack like > > > > kernel: [14952.671131] [] > > xfs_ail_push_all_sync+0xa9/0xe0 [xfs] > > kernel: [14952.671139] [] ? > > prepare_to_wait_event+0x110/0x110 > > kernel: [14952.671181] [] xfs_unmountfs+0x61/0x1a0 > > [xfs] > > > > while running trace-events, XFS ail push keeps looping around > > > > xfsaild/dm-10-21143 [001] ...2 17878.555133: xfs_ilock_nowait: dev > > 253:10 ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-21143 [001] ...2 17878.555138: xfs_iunlock: dev 253:10 > > ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-21143 [001] ...2 17878.555138: xfs_ail_push: dev 253:10 > > lip 0xffff880031f6ae40 lsn 1/73448 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-21143 [001] ...2 17878.605136: xfs_ilock_nowait: dev > > 253:10 ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-21143 [001] ...2 17878.605141: xfs_iunlock: dev 253:10 > > ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-21143 [001] ...2 17878.605142: xfs_ail_push: dev 253:10 > > lip 0xffff880031f6ae40 lsn 1/73448 type XFS_LI_INODE flags IN_AIL > > > > observe ino==0x0 (its a freed inode) but the corresponding lip stays > with > > xfsaild push. I had run a systemtap when this problem happened & the > > following keeps repeating. > > > > That's interesting, and looks different from the original report in > terms of the inode number being cleared. The original report looks like > it has a valid inode and there's some problematic sequence where it's > not being removed from the AIL in the event of errors. > > I think at this point we know that XFS attempts to retry these I/Os > indefinitely. Dave has outstanding patches to deal with this issue. The > question Dave raised above was whether the filesystem shut down, and if > not, why (as a failed log I/O should cause a shutdown)? Carlos was > looking into this it appears... > > > xfs_inode_item_push() - inode:0xffff88003d8ca000 m_flags:0x420118 > > flags:0x1 > > xfs_iflush() - inode:ffff88003d8ca000 aborting for forced shutdown > > xfs_iflush_abort() - iip:0x0 > > > > xfs_inode_item_push() is doing xfs_iflush() but it sees FS_SHUTDOWN flag > > marked & does an xfs_iflush_abort().xfs_iflush_abort() sees > i_itemp==NULL > > on the lip & doesn't do anything. So we have this stale lip that is not > > associated to inode anymore that keeps xfs_ail_push_all_sync() busy. > > > > On few other occurrences, i have had NULL pointer/dereference or other > > sorts of crashes at this line > > > > xfsaild_push() > > lock_result = lip->li_ops->iop_push(lip, > > &ailp->xa_buf_list); > > > > with debug prints, in one of the occurrence lip->li_ops was NULL & in > > another lip->li_ops was pointing to a bad pointer that subsequent > > dereference crashed it. This also indicates that a bad/freed lip was > > inserted that xfsaild_push() is working. > > > > I hit upon Dave's patch "xfs: xfs_inode_free() isn't RCU safe" & > realized > > that this could explain the above issue where a lip that has been freed > is > > wrongly referenced & later we could even have the inode disconnected. > What > > do you think? > > > > In any case I uploaded the full xfs trace events before this issue > started > > & till the end. It is at > > https://www.dropbox.com/s/21qstz4ld1gn8yi/xfs_trace_pipe.gz?dl=0 > > > > It seems like it could be related. I didn't catch anything obvious from > the trace, but there's a lot of data there. The RCU-unsafe issue was > difficult to track down without instrumentation.. I'm not sure that will > be evident from the trace. The best thing to do wrt to that might be to > try with Dave's patches, as that so far appears to address the problem. > (In fact, it might be worth it to try Dave's shutdown on umount patch > he referred to up-thread to address the original problem as well). > > Brian > > > Pls let me know. Thanks. > > > > --Shyam > > > > -----Original Message----- > > From: Shyam Kaushik [mailto:shyam@zadarastorage.com] > > Sent: 23 March 2016 15:23 > > To: 'Brian Foster' > > Cc: 'xfs@oss.sgi.com'; Alex Lyakas > > Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > > after disk failure/recovery > > > > Hi Carlos, > > > > w.r.t. your question below > > > > >>> Shyam, after you reconnected the disks, the messages about failed > > async metadata > > >>> writes stops to be logged? > > > > After I reconnect the disks, messages about failed async metadata writes > > stops to be logged. But the key thing is messages like > > > > XFS (dm-29): xfs_log_force: error -5 returned > > > > Keeps repeating every 30-secs which indicates that there is some buf/io > > error status that is being carried forward. > > > > >>> Any chance you can reliably reproduce it? > > > > Yes I have a way to reproduce it, but its not reliable. What I do is > setup > > a dm-linear over a disk. Create XFS, mount & trigger few copy threads to > > copy varying sized files into the FS. At this point pull out the drive > > (with scsi-remove-single-device in /proc/scsi/scsi) & in a short-while > > convert the dm-linear to dm-ioerror. Then I bring back the underlying > > drive, convert back dm-ioerror to dm-linear & try to unmount XFS. > > > > This problem somehow happens on a newly created XFS. If I copy several > > files into XFS/delete them & then copy them again, repeat the drive > > failure/recovery experiment it doesn't reproduce. > > > > Thanks. > > > > --Shyam > > > > Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > > after disk failure/recovery > > From: Carlos Maiolino > > Date: Tue, 22 Mar 2016 16:38:25 +0100 > > In-reply-to: <20160322140345.GA54245@bfoster.bfoster> > > Mail-followup-to: xfs@xxxxxxxxxxx > > User-agent: Mutt/1.5.24 (2015-08-30) > > > > Hi Brian, > > > > These traces, and the stack trace presented, looks quite similar with > the > > one we were discussing a few days ago, using a dm-thin snapshot. > > > > Looks like with the same bug I've been hunting and Shyam confirmed my > > hypothesis > > of this bug be able to be reproduced with a regular device. > > > > If it's the same bug, yes, I reproduced it using upstream kernel. > > > > The difference between both (this bug and the one I've been working on) > is > > how > > xfs actually behaves when async metadata writes fail. Other than that, > it > > pretty > > much looks the same. > > > > Trying to unmount the filesystem hungs in xfs_log_force(), well, > basically > > the > > reason I submitted the patch to include the caller into xfs_log_force > > trace. I'd > > like to see ftrace traces from this system with that patch if possible. > > > > I didn't have time to keep working on this for the past few days, but > > looks like > > it's time to come back to it. > > > > Shyam, after you reconnected the disks, the messages about failed async > > metadata > > writes stops to be logged? > > > > Any chance you can reliably reproduce it? > > > > I'm not a xfs journal expert, but it looks like the writeback of items > in > > AIL > > got stuck due the IO errors, and were never completed, but I don't know > > what I > > should expect after the disk is reconnected. > > > > In my case though, with upstream kernel, I didn't get a XFS_SHUTDOWN > until > > I > > tried to unmount the filesystem, which differs from this case, where xfs > > looks > > to have shutdown the filesystem after a few tries to writeback the > > metadata. > > > > Anyway, I can dig more into it this week, if nobody knows what is going > on > > before I do it :) > > > > -----Original Message----- > > From: Shyam Kaushik [mailto:shyam@zadarastorage.com] > > Sent: 22 March 2016 18:32 > > To: 'Brian Foster' > > Cc: 'xfs@oss.sgi.com'; Alex Lyakas > > Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > > after disk failure/recovery > > > > Hi Brian, > > > > Thanks for your quick reply. I repeated the test & trace-pipe is > > constantly filled with this: > > > > xfsaild/dm-10-3335 [003] ...2 24890.546491: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.546492: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.546493: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 24890.596491: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.596492: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.596494: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 24890.646497: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.646498: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.646500: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 24890.696467: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 24890.746548: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 24890.796479: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 24890.846467: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.846468: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > > > > while regular activity seems to happen on other inodes/kworker threads > > > > kworker/u8:4-27691 [001] ...1 24895.811474: xfs_writepage: dev > 253:10 > > ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > > unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811477: xfs_invalidatepage: dev > > 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > > delalloc 1 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811478: xfs_releasepage: dev > > 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 > > delalloc 0 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811482: xfs_writepage: dev > 253:10 > > ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > > unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811482: xfs_invalidatepage: dev > > 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > > delalloc 1 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811483: xfs_releasepage: dev > > 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 > > delalloc 0 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811485: xfs_writepage: dev > 253:10 > > ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > > unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811486: xfs_invalidatepage: dev > > 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > > delalloc 1 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811486: xfs_releasepage: dev > > 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 > > delalloc 0 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.812381: xfs_writepage: dev > 253:10 > > ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 > > unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.812382: xfs_invalidatepage: dev > > 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 1000 > > delalloc 1 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.812382: xfs_releasepage: dev > > 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 > delalloc > > 0 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.812385: xfs_writepage: dev > 253:10 > > ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 > > unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.812385: xfs_invalidatepage: dev > > 253:10 ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 1000 > > delalloc 1 unwritten 0 > > > > > > looks like xfsaild is not able to take lock until hung-task timeout > kicks > > in > > > > xfsaild/dm-10-3335 [003] ...2 25247.649468: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 25247.699478: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 25247.699516: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 25247.699517: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 25247.749471: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 25247.749478: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 25247.749479: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > > > Please let me know how to debug this further. Thanks. > > > > --Shyam > > -----Original Message----- > > From: Brian Foster [mailto:bfoster@redhat.com] > > Sent: 22 March 2016 17:49 > > To: Shyam Kaushik > > Cc: xfs@oss.sgi.com; Alex Lyakas > > Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > > after disk failure/recovery > > > > On Tue, Mar 22, 2016 at 04:51:39PM +0530, Shyam Kaushik wrote: > > > Hi XFS developers, > > > > > > We are seeing the following issue with XFS on kernel 3.18.19. > > > > > > We have XFS mounted over a raw disk. Disk was pulled out manually. > There > > > were async writes on files that were errored like this > > > > > ... > > > > > > And XFS hit metadata & Log IO errors that it decides to shutdown: > > > > > > Mar 16 16:03:22 host0 kernel: [ 4637.351841] XFS (dm-29): metadata I/O > > > error: block 0x3a27fbd0 ("xlog_iodone") error 5 numblks 64 > > > Mar 16 16:03:22 host0 kernel: [ 4637.352820] XFS(dm-29): SHUTDOWN!!! > > > old_flags=0x0 new_flags=0x2 > > > Mar 16 16:03:22 host0 kernel: [ 4637.353187] XFS (dm-29): Log I/O > Error > > > Detected. Shutting down filesystem > > ... > > > Later the drive was re-inserted back. After the drive was re-inserted, > > XFS > > > was attempted to be unmounted > > > > > > Mar 16 16:16:53 host0 controld: [2557] [ ] umount[202] > > > : umount(/sdisk/vol5b0, xfs) > > > > > > But nothing happens except for the 30-secs xfs_log_force errors that > > keeps > > > repeating > > > > > ... > > > > > > This problem doesn't happen consistently, but happens periodically > with > > a > > > drive failure/recovery followed by XFS unmount. I couldn't find this > > issue > > > fixed in later kernels. Can you please suggest how I can debug this > > issue > > > further? > > > > > > > Similar problems have been reproduced due to racy/incorrect EFI/EFD > > object tracking, which are internal data structures associated with > > freeing extents. > > > > What happens if you enable tracepoints while the fs is in this hung > > unmount state? > > > > # trace-cmd start -e "xfs:*" > > # cat /sys/kernel/debug/tracing/trace_pipe > > > > Brian > > > > > Thanks! > > > > > > --Shyam > > > > > > _______________________________________________ > > > xfs mailing list > > > xfs@oss.sgi.com > > > http://oss.sgi.com/mailman/listinfo/xfs > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From jtulak@redhat.com Fri Apr 8 09:58:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 8BEC67CB4 for ; Fri, 8 Apr 2016 09:58:45 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 135558F8033 for ; Fri, 8 Apr 2016 07:58:44 -0700 (PDT) X-ASG-Debug-ID: 1460127519-04bdf0110334e090001-NocioJ Received: from mail-io0-f171.google.com (mail-io0-f171.google.com [209.85.223.171]) by cuda.sgi.com with ESMTP id pNG0yl1RN3uMnkU7 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 08 Apr 2016 07:58:40 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.171 Received: by mail-io0-f171.google.com with SMTP id g185so134733151ioa.2 for ; Fri, 08 Apr 2016 07:58:40 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=Wa1+kR364pf2vp6UTCBD/UkHS0HPmDiwRdIESIEkBaU=; b=BB43hodxOa8HpdU/OCZNi6u0nX9sWzrDKxEaVPdWPrDRLr0n4nzy8T7L7isMFCGlmU I+s4rDK7Ss01wbwUvDNYx4NQNXwW4YIcpQmWKTkuUiDIWbVQymrEGkpsT4ZQOO2SDwNJ VP6J1M85+kFGS0PjfpX5noNaiy74IVHQCjVzozOzG1HEY3f9p73lK9rRWUveJ4r6T/e2 1C+avUhevO90Sz7xeSkpubrCOzP6YthE753UvaVUHSyw357jCnp6qSa/ywt7fCiLMajc GTPTw8YSRjm1gx/axLZweqXNtkV8KooiIkwwn9FKo9VOjzq0SbuHjZbe3tp2Rk7hVeQY ty+w== X-Gm-Message-State: AD7BkJLGZXLoKltyTwqbat1fIR3SllwWXfaOlbLfI6V6hX8oh2EKVAaV0xvZH6BPtqyH+9pRVA5yX+AycbPvsEeZ X-Received: by 10.107.9.202 with SMTP id 71mr11179271ioj.52.1460127519343; Fri, 08 Apr 2016 07:58:39 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.79 with HTTP; Fri, 8 Apr 2016 07:58:19 -0700 (PDT) In-Reply-To: <5706FA7C.7020103@sandeen.net> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-16-git-send-email-jtulak@redhat.com> <5706FA7C.7020103@sandeen.net> From: Jan Tulak Date: Fri, 8 Apr 2016 16:58:19 +0200 Message-ID: Subject: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices Cc: xfs-oss Content-Type: multipart/alternative; boundary=001a113ebe201e4c5c052ffa6eff X-Barracuda-Connect: mail-io0-f171.google.com[209.85.223.171] X-Barracuda-Start-Time: 1460127520 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28554 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 --001a113ebe201e4c5c052ffa6eff Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Fri, Apr 8, 2016 at 2:25 AM, Eric Sandeen wrote: > On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > > From: Dave Chinner > > > > CHANGELOG > > o Fix where xi.dname was incorrectly used instead of dfile > > o Variable alignment (tabs) > > o Added error handling for stat/statfs in init.c > > o Remove a duplicate pread in zero_old_xfs_structures and for the > > remaining call, save the return value in a more meaningful variable. > > o A chunk moved to previous patch. > > > > If the device is actually a file, and "-d file" is not specified, > > mkfs will try to treat it as a block device and get stuff wrong. > > Image files don't necessarily have the same sector sizes as the > > block device or filesystem underlying the image file, nor should we > > be issuing discard ioctls on image files. > > > > To fix this sanely, only require "-d file" if the device name is > > invalid to trigger creation of the file. Otherwise, use stat() to > > determine if the device is a file or block device and deal with that > > appropriately by setting the "isfile" variables and turning off > > direct IO. Then ensure that we check the "isfile" options before > > doing things that are specific to block devices. Also, as direct IO > > is disabled for files, use statfs() for getting host FS blocksize, > > not platform_findsizes(). > > > > These changes, however, can cause some tests to fail when the test > > partition on which the file is created has blocksize bigger than 512. > > Before, the underlying fs was ignored. Now, an attempt to create > > a fs in a file with blocksize 512 on a 4096 underlying partition will > > fail. > > > > Other file/blockdev issues fixed: > > - use getstr to detect specifying the data device name > > twice. > > - check file/size/name parameters before anything else. > > - overwrite checks need to be done before the image file is > > opened and potentially truncated. > > - blkid_get_topology() should not be called for image files, > > so warn when it is called that way. > > - zero_old_xfs_structures() emits a spurious error: > > "existing superblock read failed: Success" > > when it is run on a truncated image file. Don't warn if we > > see this problem on an image file. > > - Don't issue discards on image files. > > - Use fsync() for image files, not BLKFLSBUF in > > platform_flush_device() for Linux. > > This one causes at least one interesting issue: > > #mkfs/mkfs.xfs > Error accessing specified device (null): Bad address > Usage: mkfs.xfs > ... > > because: > > check_device_type(dfile, &xi.disfile, !dsize, !dfile, > Nflag ? NULL : &xi.dcreat, force_overwrite, "d"= ); > > so "dfile" can be NULL, but that function immediately tries to stat it. > =E2=80=8BA simple if NULL, then usage() should take care of this... > > Signed-off-by: Dave Chinner > > Signed-off-by: Jan Tulak > > --- > > libxfs/init.c | 12 ++++ > > libxfs/linux.c | 12 +++- > > mkfs/xfs_mkfs.c | 181 > ++++++++++++++++++++++++++++++++++++++------------------ > > 3 files changed, 147 insertions(+), 58 deletions(-) > > > > diff --git a/libxfs/init.c b/libxfs/init.c > > index 8d747e8..268136f 100644 > > --- a/libxfs/init.c > > +++ b/libxfs/init.c > > @@ -246,6 +246,9 @@ libxfs_init(libxfs_init_t *a) > > char rtpath[25]; > > int rval =3D 0; > > int flags; > > + struct stat st; > > + struct statfs stfs; > > + int statres; > > > > dpath[0] =3D logpath[0] =3D rtpath[0] =3D '\0'; > > dname =3D a->dname; > > @@ -278,6 +281,15 @@ libxfs_init(libxfs_init_t *a) > > a->ddev=3D libxfs_device_open(dname, a->dcreat, > flags, > > a->setblksize); > > a->dfd =3D libxfs_device_to_fd(a->ddev); > > + statres =3D stat(dname, &st); > > + statres +=3D statfs(dname, &stfs); > > + if(statres){ > ^space ^space > > + fprintf(stderr, _("%s: stat failed.\n"), > > + progname); > > + goto done; > > + } > > + a->dsize =3D st.st_size/BBSIZE; > > + a->dbsize =3D stfs.f_bsize; > > ok so for a file you choose ->dsize to be file size in 512-sector units, > and ->dbsize to be the fs block size. > > This is all under if (a->disfile); if we didn't actually specify "-dfile" > but it *is* a file, then we get to platform_findsizes() - which handles > files. And handles them differently. =E2=80=8BNo, a->disfile is set to 1 implicitly if the target is a file in check_device_type(): 1070 if (S_ISREG(statbuf.st_mode)) { 1071 if (!*isfile) 1072 *isfile =3D 1; > Hm but you removed that (see below) > and added more stat() calls...? > > What is the reason for adding these stats at this point? > =E2=80=8BWhat is removed? Where exactly? Or it should be "above"? > + statres =3D stat(dname, &st); > + statres +=3D statfs(dname, &stfs); This is to get dsize and dbsize values for the file. (and if there's a reason, why only for ->disfile but not ->lisfile?) > =E2=80=8BBecause I forgot or didn't noticed. :-) Adding to lisfile and rtfi= le too. =E2=80=8B > > > } else { > > if (!check_open(dname, flags, &rawfile, > &blockfile)) > > goto done; > > diff --git a/libxfs/linux.c b/libxfs/linux.c > > index f6ea1b2..adb8ff1 100644 > > --- a/libxfs/linux.c > > +++ b/libxfs/linux.c > > @@ -18,6 +18,7 @@ > > > > #define ustat __kernel_ustat > > #include > > +#include > > #include > > #undef ustat > > #include > > @@ -125,7 +126,16 @@ platform_set_blocksize(int fd, char *path, dev_t > device, int blocksize, int fata > > void > > platform_flush_device(int fd, dev_t device) > > { > > - if (major(device) !=3D RAMDISK_MAJOR) > > + struct stat64 st; > > + if (major(device) =3D=3D RAMDISK_MAJOR) > > + return; > > + > > + if (fstat64(fd, &st) < 0) > > + return; > > + > > + if (S_ISREG(st.st_mode)) > > + fsync(fd); > > + else > > ioctl(fd, BLKFLSBUF, 0); > > } > > > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > > index 9261ed5..7bd9fd5 100644 > > --- a/mkfs/xfs_mkfs.c > > +++ b/mkfs/xfs_mkfs.c > > @@ -787,7 +787,7 @@ calc_stripe_factors( > > #ifdef ENABLE_BLKID > > static int > > check_overwrite( > > - char *device) > > + const char *device) > > { > > const char *type; > > blkid_probe pr =3D NULL; > > @@ -804,7 +804,7 @@ check_overwrite( > > fd =3D open(device, O_RDONLY); > > if (fd < 0) > > goto out; > > - platform_findsizes(device, fd, &size, &bsz); > > + platform_findsizes((char *)device, fd, &size, &bsz); > > close(fd); > > > > /* nothing to overwrite on a 0-length device */ > > @@ -851,7 +851,6 @@ check_overwrite( > > "according to blkid\n"), progname, device); > > } > > ret =3D 1; > > - > > out: > > if (pr) > > blkid_free_probe(pr); > > @@ -877,8 +876,12 @@ static void blkid_get_topology( > > struct stat statbuf; > > > > /* can't get topology info from a file */ > > - if (!stat(device, &statbuf) && S_ISREG(statbuf.st_mode)) > > + if (!stat(device, &statbuf) && S_ISREG(statbuf.st_mode)) { > > + fprintf(stderr, > > + _("%s: Warning: trying to probe topology of a file %s!\n"), > > + progname, device); > > return; > > + } > > > > pr =3D blkid_new_probe_from_filename(device); > > if (!pr) > > @@ -976,35 +979,35 @@ static void get_topology( > > struct fs_topology *ft, > > int force_overwrite) > > { > > - struct stat statbuf; > > char *dfile =3D xi->volname ? xi->volname : xi->dname; > > + struct stat statbuf; > > + struct statfs statfsbuf; > > > > /* > > - * If our target is a regular file, use platform_findsizes > > - * to try to obtain the underlying filesystem's requirements > > - * for direct IO; we'll set our sector size to that if possible. > > + * If our target is a regular file, use statfs > > + * to try to obtain the underlying filesystem's blocksize. > > */ > > if (xi->disfile || > > - (!stat(dfile, &statbuf) && S_ISREG(statbuf.st_mode))) { > > + (!stat(dfile, &statbuf) && S_ISREG(statbuf.st_mode))) { > > dave pointed out that this indentation "fix" is incorrect, the line is > fine as > it is; it's part of the same conditional; it shouldn't be tabbed into the > code > block under the conditional. > =E2=80=8BI'm removing this change. > > int fd; > > int flags =3D O_RDONLY; > > - long long dummy; > > > > /* with xi->disfile we may not have the file yet! */ > > if (xi->disfile) > > flags |=3D O_CREAT; > > > > fd =3D open(dfile, flags, 0666); > > + > > if (fd >=3D 0) { > > - platform_findsizes(dfile, fd, &dummy, > &ft->lsectorsize); > > + fstatfs(fd, &statfsbuf); > > no error checking on fstatfs, but... > =E2=80=8BAdded.=E2=80=8B > > > + ft->lsectorsize =3D statfsbuf.f_bsize; > > Ok, platform_findsizes already explicitly handled regular files, and trie= s > to > find out via an xfs ioctl what the minimum DIO size is, and uses that for > the sector size for the filesystem in the iamge. > Now you stat & get the blocksize, and use that instead, but it's likely > to be different: > > i.e. before: > > # mkfs/mkfs.xfs -f fsfile > meta-data=3Dfsfile isize=3D512 agcount=3D4, agsize=3D6= 5536 blks > =3D sectsz=3D512 attr=3D2, projid32bit= =3D1 > > after: > > # mkfs/mkfs.xfs -f fsfile > meta-data=3Dfsfile isize=3D512 agcount=3D4, agsize=3D6= 5536 blks > =3D sectsz=3D4096 attr=3D2, projid32bit= =3D1 > > and also, now: > > # mkfs/mkfs.xfs -f -dfile,name=3Dfsfile,size=3D1g -b size=3D2048 > block size 2048 cannot be smaller than logical sector size 4096 > > What prompted you to make this change, was there some other problem you > needed to fix? > =E2=80=8BBut DIO is disabled for the files, per the commit message: [...] and turning off direct IO. Then ensure that we check the "isfile" options before doing things that are specific to block devices. Also, as direct IO is disabled for files, use statfs() for getting host FS blocksize, not platform_findsizes().=E2=80=8B So we have to use whatever the underlying fs tells us, not what the physical device has, right? =E2=80=8BRather, I wonder if there is any reason to keep the platform_finds= izes part about regular files - it shouldn't get into the branch ever. > > > close(fd); > > - ft->psectorsize =3D ft->lsectorsize; > > hm, now psectorsize isn't set at all? > =E2=80=8BThis looks like a bug, I think the assignment should stay here. =E2=80=8B > > > } else > > ft->psectorsize =3D ft->lsectorsize =3D BBSIZE; > > } else { > > blkid_get_topology(dfile, &ft->dsunit, &ft->dswidth, > > - &ft->lsectorsize, &ft->psectorsize, > > - force_overwrite); > > + &ft->lsectorsize, &ft->psectorsiz= e, > > + force_overwrite); > > please don't change these lines, they line up w/ the function opening > paren as > they should. > > =E2=80=8BSure. =E2=80=8B > > } > > > > if (xi->rtname && !xi->risfile) { > > @@ -1016,6 +1019,75 @@ static void get_topology( > > } > > > > static void > > +check_device_type( > > + const char *name, > > + int *isfile, > > + bool no_size, > > + bool no_name, > > + int *create, > > + bool force_overwrite, > > + const char *optname) > > +{ > > + struct stat64 statbuf; > > + > > + if (*isfile && (no_size || no_name)) { > > + fprintf(stderr, > > + _("if -%s file then -%s name and -%s size are required\n"), > > + optname, optname, optname); > > + usage(); > > + } > > + > > + if (stat64(name, &statbuf)) { > > + if (errno =3D=3D ENOENT && *isfile) { > > + if (create) > > + *create =3D 1; > > + return; > > + } > > + > > + fprintf(stderr, > > + _("Error accessing specified device %s: %s\n"), > > + name, strerror(errno)); > > + usage(); > > + return; > > + } > > + > > + if (!force_overwrite && check_overwrite(name)) { > > + fprintf(stderr, > > + _("%s: Use the -f option to force overwrite.\n"), > > + progname); > > + exit(1); > > + } > > + > > + /* > > + * We only want to completely truncate and recreate an existing > file if > > + * we were specifically told it was a file. Set the create flag > only in > > + * this case to trigger that behaviour. > > + */ > > + if (S_ISREG(statbuf.st_mode)) { > > + if (!*isfile) > > + *isfile =3D 1; > > + else if (create) > > + *create =3D 1; > > + return; > > + } > > + > > + if (S_ISBLK(statbuf.st_mode)) { > > + if (*isfile) { > > + fprintf(stderr, > > + _("specified \"-%s file\" on a block device %s\n"), > > + optname, name); > > + usage(); > > + } > > + return; > > + } > > + > > + fprintf(stderr, > > + _("specified device %s not a file or block device\n"), > > + name); > > + usage(); > > +} > > + > > +static void > > fixup_log_stripe_unit( > > int lsflag, > > int sunit, > > @@ -1279,7 +1351,6 @@ zero_old_xfs_structures( > > __uint32_t bsize; > > int i; > > xfs_off_t off; > > - int tmp; > > > > /* > > * We open regular files with O_TRUNC|O_CREAT. Nothing to do > here... > > @@ -1299,15 +1370,23 @@ zero_old_xfs_structures( > > } > > memset(buf, 0, new_sb->sb_sectsize); > > > > - tmp =3D pread(xi->dfd, buf, new_sb->sb_sectsize, 0); > > - if (tmp < 0) { > > + off =3D pread(xi->dfd, buf, new_sb->sb_sectsize, 0); > > + if (off < 0) { > > fprintf(stderr, _("existing superblock read failed: %s\n"= ), > > strerror(errno)); > > goto done; > > } > > - if (tmp !=3D new_sb->sb_sectsize) { > > - fprintf(stderr, > > - _("warning: could not read existing superblock, skip zeroing\n"))= ; > > + /* > > + * If we are creating an image file, it might be of zero length a= t > this > > + * point in time. Hence reading the existing superblock is going = to > > + * return zero bytes. It's not a failure we need to warn about in > this > > + * case. > > + */ > > except you already did "if (off < 0) fail" above this. > > Ok, at this point I think it might be best to revert to Dave's original > version. > > If there were specific problems you were trying to address, can you point > them out? > > Thanks, > -Eric > > =E2=80=8B(inserting your next email)=E2=80=8B > > On 4/7/16 7:25 PM, Eric Sandeen wrote: > >> @@ -1299,15 +1370,23 @@ zero_old_xfs_structures( > >> > } > >> > memset(buf, 0, new_sb->sb_sectsize); > >> > > >> > - tmp =3D pread(xi->dfd, buf, new_sb->sb_sectsize, 0); > >> > - if (tmp < 0) { > >> > + off =3D pread(xi->dfd, buf, new_sb->sb_sectsize, 0); > >> > + if (off < 0) { > >> > fprintf(stderr, _("existing superblock read failed: %s\n"= ), > >> > strerror(errno)); > >> > goto done; > >> > } > >> > - if (tmp !=3D new_sb->sb_sectsize) { > >> > - fprintf(stderr, > >> > - _("warning: could not read existing superblock, skip zeroing\n"))= ; > >> > + /* > >> > + * If we are creating an image file, it might be of zero length a= t > this > >> > + * point in time. Hence reading the existing superblock is going = to > >> > + * return zero bytes. It's not a failure we need to warn about in > this > >> > + * case. > >> > + */ > > except you already did "if (off < 0) fail" above this. > > (oh, right, < 0 is different than =3D=3D 0, sorry; so that part is ok) > > Possibly better as: > > if (off < 0 || (tmp !=3D new_sb->sb_sectsize && !xi->disfile)) > fprintf("error reading existing superblock ...") > =E2=80=8BOK, better to be sure. :-) =E2=80=8B > > > I still think this patch might need a reset though :) > > Thanks, > -Eric > > > Ok, at this point I think it might be best to revert to Dave's original > version. > > > > If there were specific problems you were trying to address, can you > point them out? > =E2=80=8BOn few places, the original patch looked as if files had direct IO= still enabled=E2=80=8B (using platform_findsize...), and I think it was causing s= ome failures - fixing issues is why I did most of the changes. I will revert to the original version and see what exactly fails. But with being Friday late afternoon, the results will be available the next week (Wednesday and further, all my courses at university are stuffed in Mon/Tue). Cheers, Jan --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --001a113ebe201e4c5c052ffa6eff Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
    On Fri, Ap= r 8, 2016 at 2:25 AM, Eric Sandeen <sandeen@sandeen.net> wrote:
    On 3/24/16 6:15 AM, jtulak@redhat.com<= /a> wrote:
    > From: Dave Chinner <
    dchinner= @redhat.com>
    >
    > CHANGELOG
    > o Fix where xi.dname was incorrectly used instead of dfile
    > o Variable alignment (tabs)
    > o Added error handling for stat/statfs in init.c
    > o Remove a duplicate pread in zero_old_xfs_structures and for the
    > remaining call, save the return value in a more meaningful variable. > o A chunk moved to previous patch.
    >
    > If the device is actually a file, and "-d file" is not speci= fied,
    > mkfs will try to treat it as a block device and get stuff wrong.
    > Image files don't necessarily have the same sector sizes as the > block device or filesystem underlying the image file, nor should we > be issuing discard ioctls on image files.
    >
    > To fix this sanely, only require "-d file" if the device nam= e is
    > invalid to trigger creation of the file. Otherwise, use stat() to
    > determine if the device is a file or block device and deal with that > appropriately by setting the "isfile" variables and turning = off
    > direct IO. Then ensure that we check the "isfile" options be= fore
    > doing things that are specific to block devices.=C2=A0 Also, as direct= IO
    > is disabled for files, use statfs() for getting host FS blocksize,
    > not platform_findsizes().
    >
    > These changes, however, can cause some tests to fail when the test
    > partition on which the file is created has blocksize bigger than 512.<= br> > Before, the underlying fs was ignored. Now, an attempt to create
    > a fs in a file with blocksize 512 on a 4096 underlying partition will<= br> > fail.
    >
    > Other file/blockdev issues fixed:
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0- use getstr to detect specifying the data d= evice name
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0twice.
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0- check file/size/name parameters before any= thing else.
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0- overwrite checks need to be done before th= e image file is
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0opened and potentially truncated.
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0- blkid_get_topology() should not be called = for image files,
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0so warn when it is called that way. >=C2=A0 =C2=A0 =C2=A0 =C2=A0- zero_old_xfs_structures() emits a spurious= error:
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"existing s= uperblock read failed: Success"
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0when it is run on a truncated image f= ile. Don't warn if we
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0see this problem on an image file. >=C2=A0 =C2=A0 =C2=A0 =C2=A0- Don't issue discards on image files. >=C2=A0 =C2=A0 =C2=A0 =C2=A0- Use fsync() for image files, not BLKFLSBUF= in
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0platform_flush_device() for Linux.
    This one causes at least one interesting issue:

    #mkfs/mkfs.xfs
    Error accessing specified device (null): Bad address
    Usage: mkfs.xfs
    ...

    because:

    =C2=A0 =C2=A0 =C2=A0 =C2=A0 check_device_type(dfile, &xi.disfile, !dsiz= e, !dfile,
    =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Nflag ? NULL : &xi.dcreat, force_ove= rwrite, "d");

    so "dfile" can be NULL, but that function immediately trie= s to stat it.

    =E2=80= =8BA simple if NULL, then usage() should take care of this...


    > Signed-off-by: Dave Chinner <dchinner@redhat.com>
    > Signed-off-by: Jan Tulak <jtul= ak@redhat.com>
    > ---
    >=C2=A0 libxfs/init.c=C2=A0 =C2=A0|=C2=A0 12 ++++
    >=C2=A0 libxfs/linux.c=C2=A0 |=C2=A0 12 +++-
    >=C2=A0 mkfs/xfs_mkfs.c | 181 ++++++++++++++++++++++++++++++++++++++----= --------------
    >=C2=A0 3 files changed, 147 insertions(+), 58 deletions(-)
    >
    > diff --git a/libxfs/init.c b/libxfs/init.c
    > index 8d747e8..268136f 100644
    > --- a/libxfs/init.c
    > +++ b/libxfs/init.c
    > @@ -246,6 +246,9 @@ libxfs_init(libxfs_init_t *a)
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0char=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 rtpath[25];
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0int=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0rval =3D 0;
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0int=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0flags;
    > +=C2=A0 =C2=A0 =C2=A0struct=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 stat st;=
    > +=C2=A0 =C2=A0 =C2=A0struct=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 statfs s= tfs;
    > +=C2=A0 =C2=A0 =C2=A0int=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0statres;
    >
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0dpath[0] =3D logpath[0] =3D rtpath[0] =3D &#= 39;\0';
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0dname =3D a->dname;
    > @@ -278,6 +281,15 @@ libxfs_init(libxfs_init_t *a)
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0a->ddev=3D libxfs_device_open(dname, a->dcreat, flags, >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0a->setblksize);
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0a->dfd =3D libxfs_device_to_fd(a->ddev);
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0statres =3D stat(dname, &st);
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0statres +=3D statfs(dname, &stfs);
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0if(statres){
    =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 ^space=C2=A0 =C2=A0^space
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr, _("= ;%s: stat failed.\n"),
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0progname); > +=C2=A0 =C2=A0 =C2=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 done;
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0}
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0a->dsize =3D st.st_size/BBSIZE;
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0a->dbsize =3D stfs.f_bsize;

    ok so for a file you choose ->dsize to be file size in 512-sector= units,
    and ->dbsize to be the fs block size.

    This is all under if (a->disfile); if we didn't actually specify &qu= ot;-dfile"
    but it *is* a file, then we get to platform_findsizes() - which handles
    files.=C2=A0 And handles them differently.=C2=A0 =C2=A0
    =E2=80=8BNo, a->disfile is set to 1 implicitly if the ta= rget is a file in=C2=A0check_device_type():
    1070 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (S_ISREG(statbuf.st_mode)) {
    =
    1071 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 if (!*isfile)
    1072 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*isfile =3D 1= ;


    =C2=A0
    Hm but you removed that (see below)
    and added more stat() calls...?

    What is the reason for adding these stats at this point?
    =E2=80=8BWhat is removed? Where exactly? Or it should = be "above"?
    > +=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0statres =3D stat(dname,= &st);
    > += =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0statres +=3D statfs(dname, &stfs);
    This is to = get dsize and dbsize values for the file.
    <= br>
    (and if there's a reason, why only for ->disfile but not ->lisfil= e?)
    =E2=80=8BBecause I forgot or did= n't noticed. :-) Adding to lisfile and rtfile too.
    =E2=80=8B
    =C2=A0

    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0} else {
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0if (!check_open(dname, flags, &rawfile, &blockfile)) >=C2=A0 =C2=A0 =C2=A0 =C2=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 done;
    > diff --git a/libxfs/linux.c b/libxfs/linux.c
    > index f6ea1b2..adb8ff1 100644
    > --- a/libxfs/linux.c
    > +++ b/libxfs/linux.c
    > @@ -18,6 +18,7 @@
    >
    >=C2=A0 #define ustat __kernel_ustat
    >=C2=A0 #include <mntent.h>
    > +#include <sys/vfs.h>
    >=C2=A0 #include <sys/stat.h>
    >=C2=A0 #undef ustat
    >=C2=A0 #include <sys/ustat.h>
    > @@ -125,7 +126,16 @@ platform_set_blocksize(int fd, char *path, dev_t = device, int blocksize, int fata
    >=C2=A0 void
    >=C2=A0 platform_flush_device(int fd, dev_t device)
    >=C2=A0 {
    > -=C2=A0 =C2=A0 =C2=A0if (major(device) !=3D RAMDISK_MAJOR)
    > +=C2=A0 =C2=A0 =C2=A0struct stat64=C2=A0 =C2=A0st;
    > +=C2=A0 =C2=A0 =C2=A0if (major(device) =3D=3D RAMDISK_MAJOR)
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return;
    > +
    > +=C2=A0 =C2=A0 =C2=A0if (fstat64(fd, &st) < 0)
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return;
    > +
    > +=C2=A0 =C2=A0 =C2=A0if (S_ISREG(st.st_mode))
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fsync(fd);
    > +=C2=A0 =C2=A0 =C2=A0else
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ioctl(fd, BLKFLS= BUF, 0);
    >=C2=A0 }
    >
    > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
    > index 9261ed5..7bd9fd5 100644
    > --- a/mkfs/xfs_mkfs.c
    > +++ b/mkfs/xfs_mkfs.c
    > @@ -787,7 +787,7 @@ calc_stripe_factors(
    >=C2=A0 #ifdef ENABLE_BLKID
    >=C2=A0 static int
    >=C2=A0 check_overwrite(
    > -=C2=A0 =C2=A0 =C2=A0char=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 *de= vice)
    > +=C2=A0 =C2=A0 =C2=A0const char=C2=A0 =C2=A0 =C2=A0 *device)
    >=C2=A0 {
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0const char=C2=A0 =C2=A0 =C2=A0 *type;
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0blkid_probe=C2=A0 =C2=A0 =C2=A0pr =3D NULL;<= br> > @@ -804,7 +804,7 @@ check_overwrite(
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0fd =3D open(device, O_RDONLY);
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0if (fd < 0)
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out;
    > -=C2=A0 =C2=A0 =C2=A0platform_findsizes(device, fd, &size, &bs= z);
    > +=C2=A0 =C2=A0 =C2=A0platform_findsizes((char *)device, fd, &size,= &bsz);
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0close(fd);
    >
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0/* nothing to overwrite on a 0-length device= */
    > @@ -851,7 +851,6 @@ check_overwrite(
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0"according to blkid\n"), progname, device);
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0}
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D 1;
    > -
    >=C2=A0 out:
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0if (pr)
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0blkid_free_probe= (pr);
    > @@ -877,8 +876,12 @@ static void blkid_get_topology(
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0struct stat statbuf;
    >
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0/* can't get topology info from a file *= /
    > -=C2=A0 =C2=A0 =C2=A0if (!stat(device, &statbuf) && S_ISRE= G(statbuf.st_mode))
    > +=C2=A0 =C2=A0 =C2=A0if (!stat(device, &statbuf) && S_ISRE= G(statbuf.st_mode)) {
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr,
    > +=C2=A0 =C2=A0 =C2=A0_("%s: Warning: trying to probe topology of = a file %s!\n"),
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0progname, device);
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return;
    > +=C2=A0 =C2=A0 =C2=A0}
    >
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0pr =3D blkid_new_probe_from_filename(device)= ;
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0if (!pr)
    > @@ -976,35 +979,35 @@ static void get_topology(
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0struct fs_topology=C2=A0 =C2=A0 =C2=A0 *ft,<= br> >=C2=A0 =C2=A0 =C2=A0 =C2=A0int=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0force_overwrite)
    >=C2=A0 {
    > -=C2=A0 =C2=A0 =C2=A0struct stat statbuf;
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0char *dfile =3D xi->volname ? xi->voln= ame : xi->dname;
    > +=C2=A0 =C2=A0 =C2=A0struct stat statbuf;
    > +=C2=A0 =C2=A0 =C2=A0struct statfs statfsbuf;
    >
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0/*
    > -=C2=A0 =C2=A0 =C2=A0 * If our target is a regular file, use platform_= findsizes
    > -=C2=A0 =C2=A0 =C2=A0 * to try to obtain the underlying filesystem'= ;s requirements
    > -=C2=A0 =C2=A0 =C2=A0 * for direct IO; we'll set our sector size t= o that if possible.
    > +=C2=A0 =C2=A0 =C2=A0 * If our target is a regular file, use statfs > +=C2=A0 =C2=A0 =C2=A0 * to try to obtain the underlying filesystem'= ;s blocksize.
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 */
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0if (xi->disfile ||
    > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(!stat(dfile, &statbuf) &&a= mp; S_ISREG(statbuf.st_mode))) {
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(!stat(dfile, &st= atbuf) && S_ISREG(statbuf.st_mode))) {

    dave pointed out that this indentation "fix" is incor= rect, the line is fine as
    it is; it's part of the same conditional; it shouldn't be tabbed in= to the code
    block under the conditional.

    =E2=80=8BI'm removing this change.



    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int fd;
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int flags =3D O_= RDONLY;
    > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0long long dummy;
    >
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* with xi->d= isfile we may not have the file yet! */
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (xi->disfi= le)
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0flags |=3D O_CREAT;
    >
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fd =3D open(dfil= e, flags, 0666);
    > +
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (fd >=3D 0= ) {
    > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0platform_findsizes(dfile, fd, &dummy, &ft->lsectorsize);<= br> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0fstatfs(fd, &statfsbuf);

    no error checking on fstatfs, but...
    =E2=80=8BAdded.=E2=80=8B
    =C2=A0

    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0ft->lsectorsize =3D statfsbuf.f_bsize;

    Ok, platform_findsizes already explicitly handled regular files, and= tries to
    find out via an xfs ioctl what the minimum DIO size is, and uses that for the sector size for the filesystem in the iamge.=C2=A0

    Now you stat & get the blocksize, and use that instead, but it's li= kely
    to be different:

    i.e. before:

    # mkfs/mkfs.xfs -f fsfile
    meta-data=3Dfsfile=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0isize=3D512=C2=A0 =C2=A0 agcount=3D4, agsize=3D65536 blks
    =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=3D=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0sectsz=3D512=C2=A0 =C2=A0attr= =3D2, projid32bit=3D1

    after:

    # mkfs/mkfs.xfs -f fsfile
    meta-data=3Dfsfile=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0isize=3D512=C2=A0 =C2=A0 agcount=3D4, agsize=3D65536 blks
    =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=3D=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0sectsz=3D4096=C2=A0 attr=3D2, = projid32bit=3D1

    and also, now:

    # mkfs/mkfs.xfs -f -dfile,name=3Dfsfile,size=3D1g -b size=3D2048
    block size 2048 cannot be smaller than logical sector size 4096

    What prompted you to make this change, was there some other problem you
    needed to fix?

    =E2=80=8BBut DIO is d= isabled for the files, per the commit message:
    [...] and turning of= f
    direct IO. Then ensure that we check the "isfile" optio= ns before
    doing things that are specific to block devices.=C2=A0 Al= so, as direct IO
    is disabled for files, use statfs() for getting ho= st FS blocksize,
    not platform_findsizes().=E2=80=8B

    So we have to use whatever the underlying fs tells us, not what the p= hysical device has, right?

    =E2=80=8BRather, I wonder= if there is any reason to keep the platform_findsizes part about regular f= iles - it shouldn't get into the branch ever.

    =C2= =A0

    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0close(fd);
    > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0ft->psectorsize =3D ft->lsectorsize;

    hm, now psectorsize isn't set at all?

    <= /div>
    =E2=80=8BThis looks like a bug, I think the ass= ignment should stay here.
    =E2=80=8B
    = =C2=A0

    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0} else
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0ft->psectorsize =3D ft->lsectorsize =3D BBSIZE;
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0} else {
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0blkid_get_topolo= gy(dfile, &ft->dsunit, &ft->dswidth,
    > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &ft->lsectorsize, &ft= ->psectorsize,
    > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 force_overwrite);
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&ft->= lsectorsize, &ft->psectorsize,
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0force_overwr= ite);

    please don't change these lines, they line up w/ the function op= ening paren as
    they should.

    =E2=80=8BSure. = =E2=80=8B

    =C2=A0
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0}
    >
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0if (xi->rtname && !xi->risfile= ) {
    > @@ -1016,6 +1019,75 @@ static void get_topology(
    >=C2=A0 }
    >
    >=C2=A0 static void
    > +check_device_type(
    > +=C2=A0 =C2=A0 =C2=A0const char=C2=A0 =C2=A0 =C2=A0 *name,
    > +=C2=A0 =C2=A0 =C2=A0int=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0*isfile,
    > +=C2=A0 =C2=A0 =C2=A0bool=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 no_= size,
    > +=C2=A0 =C2=A0 =C2=A0bool=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 no_= name,
    > +=C2=A0 =C2=A0 =C2=A0int=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0*create,
    > +=C2=A0 =C2=A0 =C2=A0bool=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 for= ce_overwrite,
    > +=C2=A0 =C2=A0 =C2=A0const char=C2=A0 =C2=A0 =C2=A0 *optname)
    > +{
    > +=C2=A0 =C2=A0 =C2=A0struct stat64 statbuf;
    > +
    > +=C2=A0 =C2=A0 =C2=A0if (*isfile && (no_size || no_name)) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr,
    > +=C2=A0 =C2=A0 =C2=A0_("if -%s file then -%s name and -%s size ar= e required\n"),
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0optname, optname, optname);
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0usage();
    > +=C2=A0 =C2=A0 =C2=A0}
    > +
    > +=C2=A0 =C2=A0 =C2=A0if (stat64(name, &statbuf)) {
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (errno =3D=3D ENOE= NT && *isfile) {
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0if (create)
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*create =3D 1;
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0return;
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
    > +
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr,
    > +=C2=A0 =C2=A0 =C2=A0_("Error accessing specified device %s: %s\n= "),
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0name, strerror(errno));
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0usage();
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return;
    > +=C2=A0 =C2=A0 =C2=A0}
    > +
    > +=C2=A0 =C2=A0 =C2=A0if (!force_overwrite && check_overwrite(n= ame)) {
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr,
    > +=C2=A0 =C2=A0 =C2=A0_("%s: Use the -f option to force overwrite.= \n"),
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0progname);
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0exit(1);
    > +=C2=A0 =C2=A0 =C2=A0}
    > +
    > +=C2=A0 =C2=A0 =C2=A0/*
    > +=C2=A0 =C2=A0 =C2=A0 * We only want to completely truncate and recrea= te an existing file if
    > +=C2=A0 =C2=A0 =C2=A0 * we were specifically told it was a file. Set t= he create flag only in
    > +=C2=A0 =C2=A0 =C2=A0 * this case to trigger that behaviour.
    > +=C2=A0 =C2=A0 =C2=A0 */
    > +=C2=A0 =C2=A0 =C2=A0if (S_ISREG(statbuf.st_mode)) {
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (!*isfile)
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0*isfile =3D 1;
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0else if (create)
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0*create =3D 1;
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return;
    > +=C2=A0 =C2=A0 =C2=A0}
    > +
    > +=C2=A0 =C2=A0 =C2=A0if (S_ISBLK(statbuf.st_mode)) {
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (*isfile) {
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0fprintf(stderr,
    > +=C2=A0 =C2=A0 =C2=A0_("specified \"-%s file\" on a blo= ck device %s\n"),
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0optname, name);
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0usage();
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return;
    > +=C2=A0 =C2=A0 =C2=A0}
    > +
    > +=C2=A0 =C2=A0 =C2=A0fprintf(stderr,
    > +=C2=A0 =C2=A0 =C2=A0_("specified device %s not a file or block d= evice\n"),
    > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0name);
    > +=C2=A0 =C2=A0 =C2=A0usage();
    > +}
    > +
    > +static void
    >=C2=A0 fixup_log_stripe_unit(
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0int=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0lsflag,
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0int=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0sunit,
    > @@ -1279,7 +1351,6 @@ zero_old_xfs_structures(
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0__uint32_t=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 bsize;
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0int=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0i;
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0xfs_off_t=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0off;
    > -=C2=A0 =C2=A0 =C2=A0int=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0tmp;
    >
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0/*
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 * We open regular files with O_TRUNC|O_CREA= T. Nothing to do here...
    > @@ -1299,15 +1370,23 @@ zero_old_xfs_structures(
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0}
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0memset(buf, 0, new_sb->sb_sectsize);
    >
    > -=C2=A0 =C2=A0 =C2=A0tmp =3D pread(xi->dfd, buf, new_sb->sb_sect= size, 0);
    > -=C2=A0 =C2=A0 =C2=A0if (tmp < 0) {
    > +=C2=A0 =C2=A0 =C2=A0off =3D pread(xi->dfd, buf, new_sb->sb_sect= size, 0);
    > +=C2=A0 =C2=A0 =C2=A0if (off < 0) {
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr, = _("existing superblock read failed: %s\n"),
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0strerror(errno));
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto done;
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0}
    > -=C2=A0 =C2=A0 =C2=A0if (tmp !=3D new_sb->sb_sectsize) {
    > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr,
    > -=C2=A0 =C2=A0 =C2=A0_("warning: could not read existing superblo= ck, skip zeroing\n"));
    > +=C2=A0 =C2=A0 =C2=A0/*
    > +=C2=A0 =C2=A0 =C2=A0 * If we are creating an image file, it might be = of zero length at this
    > +=C2=A0 =C2=A0 =C2=A0 * point in time. Hence reading the existing supe= rblock is going to
    > +=C2=A0 =C2=A0 =C2=A0 * return zero bytes. It's not a failure we n= eed to warn about in this
    > +=C2=A0 =C2=A0 =C2=A0 * case.
    > +=C2=A0 =C2=A0 =C2=A0 */

    =
    except you already did "if (off < 0) fail" above t= his.

    Ok, at this point I think it might be best to revert to Dave's original= version.

    If there were specific problems you were trying to address, can you point t= hem out?

    Thanks,
    -Eric

    <= /span>
    =E2=80=8B(inserting y= our next email)=E2=80=8B
    =C2=A0
    =

    On 4/7/16 7:25 PM= , Eric Sandeen wrote:
    >> @@ -1299,15 +1370,23 @@ zero_old_xfs_stru= ctures(
    >> >=C2=A0 =C2=A0 }
    >> >=C2=A0 =C2=A0 memse= t(buf, 0, new_sb->sb_sectsize);
    >> >
    >> > -=C2= =A0 tmp =3D pread(xi->dfd, buf, new_sb->sb_sectsize, 0);
    >> = > -=C2=A0 if (tmp < 0) {
    >> > +=C2=A0 off =3D pread(xi-&g= t;dfd, buf, new_sb->sb_sectsize, 0);
    >> > +=C2=A0 if (off &l= t; 0) {
    >> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(s= tderr, _("existing superblock read failed: %s\n"),
    >> &g= t;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 str= error(errno));
    >> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 go= to done;
    >> >=C2=A0 =C2=A0 }
    >> > -=C2=A0 if (tmp != =3D new_sb->sb_sectsize) {
    >> > -=C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 fprintf(stderr,
    >> > -=C2=A0 _("warning: could not= read existing superblock, skip zeroing\n"));
    >> > +=C2=A0= /*
    >> > +=C2=A0 =C2=A0* If we are creating an image file, it m= ight be of zero length at this
    >> > +=C2=A0 =C2=A0* point in ti= me. Hence reading the existing superblock is going to
    >> > +=C2= =A0 =C2=A0* return zero bytes. It's not a failure we need to warn about= in this
    >> > +=C2=A0 =C2=A0* case.
    >> > +=C2=A0 = =C2=A0*/
    > except you already did "if (off < 0) fail" ab= ove this.

    (oh, right, <= ; 0 is different than =3D=3D 0, sorry; so that part is ok)

    Possibly better as:

    = if (off < 0 || (tmp !=3D new_sb->sb_sectsize && !xi->disfi= le))
    =C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf("error reading existing supe= rblock ...")
    =E2= =80=8BOK, better to be sure. :-)
    =E2=80= =8B
    =C2=A0

    I still think this patch might need a reset thoug= h :)

    Thanks,
    -Eric

    > Ok, at thi= s point I think it might be best to revert to Dave's original version.<= br>>
    > If there were specific problems you were trying to address,= can you point them out?

    =
    =E2=80=8BOn few places, the original patch looked as if files had direct= IO still enabled=E2=80=8B (using platform_findsize...), and I think it was= causing some failures - fixing issues is why I did most of the changes.

    I will revert to the original version and see what exact= ly fails. But with being Friday late afternoon, the results will be availab= le the next week (Wednesday and further, all my courses at university are s= tuffed in Mon/Tue).

    Cheers,
    Jan
    =C2= =A0

    --
    <= /div>
    --001a113ebe201e4c5c052ffa6eff-- From angelaodum212@hotmail.com Fri Apr 8 10:49:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.5 required=5.0 tests=FORGED_HOTMAIL_RCVD2, FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,FREEMAIL_REPLYTO, FREEMAIL_REPLYTO_END_DIGIT,HTML_MESSAGE,LOTS_OF_MONEY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B86AE7CBB for ; Fri, 8 Apr 2016 10:49:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 793D8304059 for ; Fri, 8 Apr 2016 08:49:56 -0700 (PDT) X-ASG-Debug-ID: 1460130594-04cb6c246435e480001-NocioJ Received: from nh603-vm3.bullet.mail.ssk.yahoo.co.jp (nh603-vm3.bullet.mail.ssk.yahoo.co.jp [182.22.90.44]) by cuda.sgi.com with ESMTP id xYKvmSVoxAeDq01E for ; Fri, 08 Apr 2016 08:49:54 -0700 (PDT) X-Barracuda-Envelope-From: angelaodum212@hotmail.com X-Barracuda-Apparent-Source-IP: 182.22.90.44 Received: from [182.22.66.104] by nh603.bullet.mail.ssk.yahoo.co.jp with NNFMP; 08 Apr 2016 15:49:53 -0000 Received: from [182.22.91.130] by t602.bullet.mail.ssk.yahoo.co.jp with NNFMP; 08 Apr 2016 15:49:53 -0000 Received: from [127.0.0.1] by omp603.mail.ssk.yahoo.co.jp with NNFMP; 08 Apr 2016 15:49:53 -0000 X-Yahoo-Newman-Property: ymail-3 X-Yahoo-Newman-Id: 935817.52544.bm@omp603.mail.ssk.yahoo.co.jp Received: (qmail 27275 invoked by uid 60001); 8 Apr 2016 15:49:53 -0000 DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=yj20050223; d=yahoo.co.jp; h=Message-ID:X-YMail-OSG:Received:X-RocketYMMF:X-Mailer:X-YMail-JAS:Sender:References:Date:From:Reply-To:Subject:To:MIME-Version:Content-Type; b=YH6Bofim1qjh9wwRVRxJc1Ed/45Cy5TnrtaZKpykGorLrpmpno7oGf00cAIAWuwzL4jnJQjzVmXd2pRivh6O8zI4xjCQ3Lu9aYjFsvvSyalWgCJs0YDq2XfuBWZPqu6L ; Message-ID: <87263.95690.qm@web101402.mail.kks.yahoo.co.jp> X-YMail-OSG: uzuhGYsVM1nh0v2jqa2ICuZEpOf90YDYZOJ5PPxC0hpG6C3El38_4HDbHQamUXwPfDw6lWzyFN6n3MWz3R.fg1FVDXQgCBO5VUBb9rkTt44vZJbh0Hd6vRsygZJpynygL_fGA8WOuiNOBg3J1rniqusrBKTZMYFpWMGH9feMSImIzCVFFChAhOS6E6wREtGKO68Wi3f6UYTp8S0keRbLr.BmaHNHWbAi0rvElUWaWG1AEI2dXZlOzj_xoc80Ite734nNCutF7kc2VzRV.NGD844TT_MvSEfKqQOvJkTk5NjknVvwltMn_JXYYkshiAhPrQexEVmvqZ.4rXMRiCHIc_FAPxIb8D9Ssg4EBMPBk1BO.M1bMvLOVuOKvgiOH94LZNrUVl6nxgYwPsTB5h3oXsOOEtD1YN4YnX2QlcjGLE3mE70IG1Bt6Fv7v5yFo8p6y6VuIoahEm19CaZn4_Yg_oOuPLFCyIdPpzTHJloXbayV5ImalvIxk9Q8.3Q3T4TKqL3o3c.tMc2Q_CkLP.30kOzVT0GPvK6WD2rUGc5IduEGp1ewnJ_gsnUPIIXOHhkKX8M9FFoAFysy.5gCNNuA4aDoz..Rr4sRe2XLSfwIlPqcjcS3yFDndvgHA_9nfmvE.XO5X2gOREpNB1vRI2TCoFCrIB_4JFNrCc0YSLjEwRwQnpOnk8RvKawN9cM_61SuZW.lUA9oA0Egt426TtvmwhvaoHYnHtK2jOApqG965D_PVmi1Pch0XqQfSMiNmnQnTTYjnQA- Received: from [46.165.220.224] by web101402.mail.kks.yahoo.co.jp via HTTP; Sat, 09 Apr 2016 00:49:52 JST X-RocketYMMF: yonjajp X-Mailer: YahooMailWebService/0.8.111_69 X-YMail-JAS: 3RO3G3EVM1nK8z0afThkz7wgcXOKMnn1GHoUyfJitDAZAriRvpG8_ASpdeYK3VXDtZIj47YVTGio4xHeY42oUOvMmxb6L.s6JzgQeCpMNKHgEfny3QXGvgpi5zKs.hGMuRTL Sender: yonjajp@yahoo.co.jp References: Date: Sat, 9 Apr 2016 00:49:52 +0900 (JST) From: Angela Odum Reply-To: Angela Odum Subject: Ich bitte um Ihre Unterstuetzung!! To: undisclosed recipients: ; X-ASG-Orig-Subj: Ich bitte um Ihre Unterstuetzung!! MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="242930645-1936849971-1460130592=:95690" X-Barracuda-Connect: nh603-vm3.bullet.mail.ssk.yahoo.co.jp[182.22.90.44] X-Barracuda-Start-Time: 1460130594 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.62 X-Barracuda-Spam-Status: No, SCORE=2.62 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=ADVANCE_FEE_1, BSF_SC0_MISMATCH_TO, BSF_SC0_SA083, DKIM_SIGNED, DKIM_VERIFIED, FORGED_HOTMAIL_RCVD2, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28555 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 1.12 FORGED_HOTMAIL_RCVD2 hotmail.com 'From' address, but no 'Received:' -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 ADVANCE_FEE_1 Appears to be advance fee fraud (Nigerian 419) 1.50 BSF_SC0_SA083 Custom Rule SA083 --242930645-1936849971-1460130592=:95690 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable Sehr geehrter Damen und Herren,=0A=A0=0AVorname/ =A0Williams=0AName/ =A0 An= gela Odum=0ANationalitaet/ =A0Sierra Leonean=0A=A0=0AIch habe die Summe von= USD 3.7millionen von meinen verstorbenen Eltern geebrt. Meine Eltern wurde= n Diamanten Haendler.=0A=A0=0ADas Geld wurde von meinen Eltern in der Siche= rheitsfirma fuer sicheres Behalten deponiert.=0A=A0=0AMomentan lebe ich in = Bouake in Elfenbeinkueste und zwar gibt es Buergerkrieg bei uns, deswegen m= oechte ich das Geld in Ihrem Land per Ihre Hilfe investieren.=0A=A0=0AIch m= oechte in den gunstigen Branchen investieren wenn Sie mich unterstuetzen ko= ennen.=0A=A0=0AKoennen Sie mich unterstuetzen?=0A=A0=0AIch warte auf Ihre b= aldige Antwort!=0A=A0=0AMit freundlichen Gruessen,=0AFr=E4ulein Angela Odum= Williams --242930645-1936849971-1460130592=:95690 Content-Type: text/html; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable
    Sehr geehrter Damen und Herren,
     
    Vorname/  Williams
    Name/   Angela Odum
    Nationalitaet/  Sierra Leonean
     
    Ich habe die Summe von USD 3.7= millionen von meinen verstorbenen Eltern geebrt. Meine Eltern wurden Diaman= ten Haendler.
    &nbs= p;
    Das Geld wurde von meinen E= ltern in der Sicherheitsfirma fuer sicheres Behalten deponiert.
     
    Momentan lebe ich in Bouake in Elfenbein= kueste und zwar gibt es Buergerkrieg bei uns, deswegen moechte ich das Geld= in Ihrem Land per Ihre Hilfe investieren.
     
    Ich moechte in den gunstigen Branchen investieren wenn Sie mi= ch unterstuetzen koennen.
     
    Koe= nnen Sie mich unterstuetzen?
     
    = Ich warte auf Ihre baldige Antwort!
     
    Mit freundlichen Gruessen,
    Fr=E4ulein Angela Odum Willia= ms
    --242930645-1936849971-1460130592=:95690-- From sandeen@sandeen.net Fri Apr 8 10:50:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B2F087CBB for ; Fri, 8 Apr 2016 10:50:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 64618304039 for ; Fri, 8 Apr 2016 08:50:58 -0700 (PDT) X-ASG-Debug-ID: 1460130654-04bdf01105352850001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id XC1EJeJTOrFJlobT for ; Fri, 08 Apr 2016 08:50:54 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 7672916C16D; Fri, 8 Apr 2016 10:50:54 -0500 (CDT) Subject: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices To: Jan Tulak X-ASG-Orig-Subj: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-16-git-send-email-jtulak@redhat.com> <5706FA7C.7020103@sandeen.net> Cc: xfs-oss From: Eric Sandeen Message-ID: <5707D35E.7070703@sandeen.net> Date: Fri, 8 Apr 2016 10:50:54 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1460130654 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28555 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 4/8/16 9:58 AM, Jan Tulak wrote: > Ok, platform_findsizes already explicitly handled regular files, and tries to > find out via an xfs ioctl what the minimum DIO size is, and uses that for > the sector size for the filesystem in the iamge. > > > Now you stat & get the blocksize, and use that instead, but it's likely > to be different: > > i.e. before: > > # mkfs/mkfs.xfs -f fsfile > meta-data=fsfile isize=512 agcount=4, agsize=65536 blks > = sectsz=512 attr=2, projid32bit=1 > > after: > > # mkfs/mkfs.xfs -f fsfile > meta-data=fsfile isize=512 agcount=4, agsize=65536 blks > = sectsz=4096 attr=2, projid32bit=1 > > and also, now: > > # mkfs/mkfs.xfs -f -dfile,name=fsfile,size=1g -b size=2048 > block size 2048 cannot be smaller than logical sector size 4096 > > What prompted you to make this change, was there some other problem you > needed to fix? > > > ​But DIO is disabled for the files, per the commit message: > [...] and turning off > direct IO. Then ensure that we check the "isfile" options before > doing things that are specific to block devices. Also, as direct IO > is disabled for files, use statfs() for getting host FS blocksize, > not platform_findsizes().​ But doing DIO to the file during mkfs isn't the issue I'm talking about; For example a vm image hosted in a file will have direct IO done to it when it is in use, and filesystem block size is not the controlling factor there. With your change, we can no longer make i.e. a 2k fs image hosted on a 4k fs. i.e. your change regresses this commit: commit 98dd72d3b239050138cf9eb9373c83743878a7d2 Author: Eric Sandeen Date: Fri Dec 18 12:15:25 2015 +1100 mkfs: get sector size from host fs d_miniosz when mkfs'ing file Now that we allow logical-sector-sized DIOs even if our xfs filesystem is set to physical-sector-sized "sectors," we can allow the creation of filesystem images with block and sector sizes down to the host device's logical sector size, rather than the filesystem's sector size. So in platform_findsizes(), change our query of the filesystem to an XFS_IOC_DIOINFO query, and use the returned d_miniosz for sector size in the S_IFREG case. This allows the creation of i.e. a 2k block sized image on an xfs filesystem w/ 4k sector size created on a 4k/512 block device, which would otherwise fail today. Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner > So we have to use whatever the underlying fs tells us, not what the physical device has, right? Well, tells us about what? XFS can tell us its block size, but also can tell us about minimum size and alignment required for direct IO, which is more relevant to a filesystem image than the filesystem's block size. > ​ Rather, I wonder if there is any reason to keep the > platform_findsizes part about regular files - it shouldn't get into > the branch ever. In general, having a wrapper which finds sizes of a target, regardless of platform, device, or file, makes sense to me rather than having stat calls in various other places... -Eric From sandeen@sandeen.net Fri Apr 8 10:51:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 23FC47CBB for ; Fri, 8 Apr 2016 10:51:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8D24EAC004 for ; Fri, 8 Apr 2016 08:51:58 -0700 (PDT) X-ASG-Debug-ID: 1460130716-04cb6c246435e5c0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 8jJ7lhKvtiEgI9C1 for ; Fri, 08 Apr 2016 08:51:56 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id A3CFA16C16D for ; Fri, 8 Apr 2016 10:51:56 -0500 (CDT) Subject: Re: [PATCH 18/19] mkfs: unit conversions are case insensitive To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 18/19] mkfs: unit conversions are case insensitive References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-19-git-send-email-jtulak@redhat.com> <57057B2A.3000100@sandeen.net> <5706FE56.7060308@sandeen.net> <20160408010318.GA567@dastard> From: Eric Sandeen Message-ID: <5707D39C.20504@sandeen.net> Date: Fri, 8 Apr 2016 10:51:56 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1460130716 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28555 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/8/16 4:08 AM, Jan Tulak wrote: > On Fri, Apr 8, 2016 at 3:03 AM, Dave Chinner >wrote: > ... > $ git grep ^cvtnum > estimate/xfs_estimate.c:cvtnum(char *s) > libxcmd/input.c:cvtnum( > mkfs/xfs_mkfs.c:cvtnum( > > > ​Ah, I see. A nice trick. :-) > > It might be good to merge the three functions, but I think it can > wait for when this patchset is done - or there is always going to be > something more to add... Yeah, sorry, that was a tangent. Just something to clean up some day. -Eric From sandeen@sandeen.net Fri Apr 8 10:52:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CFF547CBB for ; Fri, 8 Apr 2016 10:52:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 52870AC002 for ; Fri, 8 Apr 2016 08:52:48 -0700 (PDT) X-ASG-Debug-ID: 1460130766-04cbb02e1c2c650001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id KJqHOABIwCNwiREr for ; Fri, 08 Apr 2016 08:52:46 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id CAE5216C16D for ; Fri, 8 Apr 2016 10:52:46 -0500 (CDT) Subject: Re: [PATCH 09/19] mkfs: use getnum_checked for all ranged parameters To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 09/19] mkfs: use getnum_checked for all ranged parameters References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-10-git-send-email-jtulak@redhat.com> <5706AEC9.7030002@sandeen.net> From: Eric Sandeen Message-ID: <5707D3CE.1010305@sandeen.net> Date: Fri, 8 Apr 2016 10:52:46 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1460130766 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28555 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/8/16 5:47 AM, Jan Tulak wrote: > On Thu, Apr 7, 2016 at 9:02 PM, Eric Sandeen >wrote: > > > > On 3/24/16 6:15 AM, jtulak@redhat.com wrote: > > From: Dave Chinner > > > > > Now that getnum_checked can handle min/max checking, use this for > > all parameters that take straight numbers and don't require unit > > conversions. > > > > Signed-off-by: Dave Chinner > > > Signed-off-by: Jan Tulak > > > Looks ok. > > Signed-off-by: Eric Sandeen > > > > ​Or Reviewed-by? :-) Yes, that :) Reviewed-by: Eric Sandeen From jtulak@redhat.com Fri Apr 8 10:57:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 97FBD7CC9 for ; Fri, 8 Apr 2016 10:57:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 28DC5AC002 for ; Fri, 8 Apr 2016 08:57:20 -0700 (PDT) X-ASG-Debug-ID: 1460131037-04bdf01103352d40001-NocioJ Received: from mail-ig0-f178.google.com (mail-ig0-f178.google.com [209.85.213.178]) by cuda.sgi.com with ESMTP id bwE5RasDDZHes1jZ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 08 Apr 2016 08:57:18 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.178 Received: by mail-ig0-f178.google.com with SMTP id f1so16324694igr.1 for ; Fri, 08 Apr 2016 08:57:18 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=w++FbQ7hSSJKZ9CGftTX+znlx36+foMDfLXcQwTontU=; b=D1Xj6Ia1LDJeF0c5Dny5oMRENlXckrZxjlcviXWcUYjx4D4oOYyHq/jdZqfWCosHze iztdumbvbTkWsvqjkrIw1juJZcvVddlndvUcyxOlgoywDaIlmL3mHnGijUbak9MZT1Tv NTvv4CeSM5GaVGIVyKatXJYz4IhtAoK2uNzq0ZOZ8tBZ9w0NPv3o0oujfgnaVaIJOCVt NcXXIWWiYQeKWPtXOpdx2mssW3sztrLVcC9roN/prI1i2ca+ySEVTgUyYA5w1RzdBIF/ kB0qR/Snnp/6fWN8n+fHqoprkG5QR5LEwZKEpg3E0DsDVbasFkQ7SOp69wxt4Nn62wII dkHQ== X-Gm-Message-State: AD7BkJIjxLJjByhR5NAfaPgDzk66b5S/+/TdGUMN6Zky9tcB3e3Z5IiszQpF6yKcJbei1m5kU10+caZXZj4A/4Of X-Received: by 10.50.112.10 with SMTP id im10mr4569712igb.93.1460131037508; Fri, 08 Apr 2016 08:57:17 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.79 with HTTP; Fri, 8 Apr 2016 08:56:58 -0700 (PDT) In-Reply-To: <5707D35E.7070703@sandeen.net> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-16-git-send-email-jtulak@redhat.com> <5706FA7C.7020103@sandeen.net> <5707D35E.7070703@sandeen.net> From: Jan Tulak Date: Fri, 8 Apr 2016 17:56:58 +0200 Message-ID: Subject: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices Cc: xfs-oss Content-Type: multipart/alternative; boundary=047d7b1637add1193e052ffb3f91 X-Barracuda-Connect: mail-ig0-f178.google.com[209.85.213.178] X-Barracuda-Start-Time: 1460131038 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28555 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 --047d7b1637add1193e052ffb3f91 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Fri, Apr 8, 2016 at 5:50 PM, Eric Sandeen wrote: > On 4/8/16 9:58 AM, Jan Tulak wrote: > > Ok, platform_findsizes already explicitly handled regular files, an= d > tries to > > find out via an xfs ioctl what the minimum DIO size is, and uses > that for > > the sector size for the filesystem in the iamge. > > > > > > Now you stat & get the blocksize, and use that instead, but it's > likely > > to be different: > > > > i.e. before: > > > > # mkfs/mkfs.xfs -f fsfile > > meta-data=3Dfsfile isize=3D512 agcount=3D4, > agsize=3D65536 blks > > =3D sectsz=3D512 attr=3D2, projid3= 2bit=3D1 > > > > after: > > > > # mkfs/mkfs.xfs -f fsfile > > meta-data=3Dfsfile isize=3D512 agcount=3D4, > agsize=3D65536 blks > > =3D sectsz=3D4096 attr=3D2, projid3= 2bit=3D1 > > > > and also, now: > > > > # mkfs/mkfs.xfs -f -dfile,name=3Dfsfile,size=3D1g -b size=3D2048 > > block size 2048 cannot be smaller than logical sector size 4096 > > > > What prompted you to make this change, was there some other problem > you > > needed to fix? > > > > > > =E2=80=8BBut DIO is disabled for the files, per the commit message: > > [...] and turning off > > direct IO. Then ensure that we check the "isfile" options before > > doing things that are specific to block devices. Also, as direct IO > > is disabled for files, use statfs() for getting host FS blocksize, > > not platform_findsizes().=E2=80=8B > > But doing DIO to the file during mkfs isn't the issue I'm talking about; > For example a vm image hosted in a file will have direct IO done to it > when it is in use, and filesystem block size is not the controlling > factor there. > > With your change, we can no longer make i.e. a 2k fs image hosted on a 4k > fs. i.e. your change regresses this commit: > > commit 98dd72d3b239050138cf9eb9373c83743878a7d2 > Author: Eric Sandeen > Date: Fri Dec 18 12:15:25 2015 +1100 > > mkfs: get sector size from host fs d_miniosz when mkfs'ing file > > Now that we allow logical-sector-sized DIOs even if our xfs > filesystem is set to physical-sector-sized "sectors," we can > allow the creation of filesystem images with block and sector > sizes down to the host device's logical sector size, rather > than the filesystem's sector size. > > So in platform_findsizes(), change our query of the filesystem > to an XFS_IOC_DIOINFO query, and use the returned d_miniosz for > sector size in the S_IFREG case. > > This allows the creation of i.e. a 2k block sized image on > an xfs filesystem w/ 4k sector size created on a 4k/512 > block device, which would otherwise fail today. > > Signed-off-by: Eric Sandeen > Reviewed-by: Dave Chinner > Signed-off-by: Dave Chinner > > > > So we have to use whatever the underlying fs tells us, not what the > physical device has, right? > > Well, tells us about what? XFS can tell us its block size, but also can > tell us about minimum size and alignment required for direct IO, which is > more relevant to a filesystem image than the filesystem's block size. > > > =E2=80=8B Rather, I wonder if there is any reason to keep the > > platform_findsizes part about regular files - it shouldn't get into > > the branch ever. > > In general, having a wrapper which finds sizes of a target, regardless of > platform, device, or file, makes sense to me rather than having stat call= s > in various other places... > > -Eric > It seems I misunderstood some things about what =E2=80=8Bhappens/what shoul= d happen with files. :-) I will see what happens with the tests, what difference in the results is with this patch in the original version. =E2=80=8BCheers, Jan=E2=80=8B --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --047d7b1637add1193e052ffb3f91 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
    On Fri, Ap= r 8, 2016 at 5:50 PM, Eric Sandeen <sandeen@sandeen.net> wrote:
    On 4/8/16 9:58 AM, Jan Tulak wrote:
    >=C2=A0 =C2=A0 =C2=A0Ok, platform_findsizes already explicitly handled r= egular files, and tries to
    >=C2=A0 =C2=A0 =C2=A0find out via an xfs ioctl what the minimum DIO size= is, and uses that for
    >=C2=A0 =C2=A0 =C2=A0the sector size for the filesystem in the iamge. >
    >
    >=C2=A0 =C2=A0 =C2=A0Now you stat & get the blocksize, and use that = instead, but it's likely
    >=C2=A0 =C2=A0 =C2=A0to be different:
    >
    >=C2=A0 =C2=A0 =C2=A0i.e. before:
    >
    >=C2=A0 =C2=A0 =C2=A0# mkfs/mkfs.xfs -f fsfile
    >=C2=A0 =C2=A0 =C2=A0meta-data=3Dfsfile=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0isize=3D512=C2=A0 =C2=A0 agcount=3D4, agsize= =3D65536 blks
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =3D=C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0sectsz=3D= 512=C2=A0 =C2=A0attr=3D2, projid32bit=3D1
    >
    >=C2=A0 =C2=A0 =C2=A0after:
    >
    >=C2=A0 =C2=A0 =C2=A0# mkfs/mkfs.xfs -f fsfile
    >=C2=A0 =C2=A0 =C2=A0meta-data=3Dfsfile=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0isize=3D512=C2=A0 =C2=A0 agcount=3D4, agsize= =3D65536 blks
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =3D=C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0sectsz=3D= 4096=C2=A0 attr=3D2, projid32bit=3D1
    >
    >=C2=A0 =C2=A0 =C2=A0and also, now:
    >
    >=C2=A0 =C2=A0 =C2=A0# mkfs/mkfs.xfs -f -dfile,name=3Dfsfile,size=3D1g -= b size=3D2048
    >=C2=A0 =C2=A0 =C2=A0block size 2048 cannot be smaller than logical sect= or size 4096
    >
    >=C2=A0 =C2=A0 =C2=A0What prompted you to make this change, was there so= me other problem you
    >=C2=A0 =C2=A0 =C2=A0needed to fix?
    >
    >
    > =E2=80=8BBut DIO is disabled for the files, per the commit message: > [...] and turning off
    > direct IO. Then ensure that we check the "isfile" options be= fore
    > doing things that are specific to block devices.=C2=A0 Also, as direct= IO
    > is disabled for files, use statfs() for getting host FS blocksize,
    > not platform_findsizes().=E2=80=8B

    But doing DIO to the file during mkfs isn't the issue I'= ;m talking about;
    For example a vm image hosted in a file will have direct IO done to it
    when it is in use, and filesystem block size is not the controlling
    factor there.

    With your change, we can no longer make i.e. a 2k fs image hosted on a 4k fs.=C2=A0 i.e. your change regresses this commit:

    commit 98dd72d3b239050138cf9eb9373c83743878a7d2
    Author: Eric Sandeen <sandeen@san= deen.net>
    Date:=C2=A0 =C2=A0Fri Dec 18 12:15:25 2015 +1100

    =C2=A0 =C2=A0 mkfs: get sector size from host fs d_miniosz when mkfs'in= g file

    =C2=A0 =C2=A0 Now that we allow logical-sector-sized DIOs even if our xfs =C2=A0 =C2=A0 filesystem is set to physical-sector-sized "sectors,&quo= t; we can
    =C2=A0 =C2=A0 allow the creation of filesystem images with block and sector=
    =C2=A0 =C2=A0 sizes down to the host device's logical sector size, rath= er
    =C2=A0 =C2=A0 than the filesystem's sector size.

    =C2=A0 =C2=A0 So in platform_findsizes(), change our query of the filesyste= m
    =C2=A0 =C2=A0 to an XFS_IOC_DIOINFO query, and use the returned d_miniosz f= or
    =C2=A0 =C2=A0 sector size in the S_IFREG case.

    =C2=A0 =C2=A0 This allows the creation of i.e. a 2k block sized image on =C2=A0 =C2=A0 an xfs filesystem w/ 4k sector size created on a 4k/512
    =C2=A0 =C2=A0 block device, which would otherwise fail today.

    =C2=A0 =C2=A0 Signed-off-by: Eric Sandeen <sandeen@redhat.com>
    =C2=A0 =C2=A0 Reviewed-by: Dave Chinner <dchinner@redhat.com>
    =C2=A0 =C2=A0 Signed-off-by: Dave Chinner <david@fromorbit.com>


    > So we have to use whatever the underlying fs tells us, not what the ph= ysical device has, right?

    Well, tells us about what?=C2=A0 XFS can tell us its block size, but= also can
    tell us about minimum size and alignment required for direct IO, which is more relevant to a filesystem image than the filesystem's block size.
    > =E2=80=8B Rather, I wonder if there is any reason to keep the
    > platform_findsizes part about regular files - it shouldn't get int= o
    > the branch ever.

    In general, having a wrapper which finds sizes of a target, regardle= ss of
    platform, device, or file, makes sense to me rather than having stat calls<= br> in various other places...

    -Eric

    I= t seems I misunderstood some things about what =E2=80=8Bhappens/what should= happen with files. :-)
    I will see what = happens with the tests, what difference in the results is with this patch i= n the original version.

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



    --
    --047d7b1637add1193e052ffb3f91-- From bfoster@redhat.com Fri Apr 8 12:18:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3311C7CB0 for ; Fri, 8 Apr 2016 12:18:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 824D1AC004 for ; Fri, 8 Apr 2016 10:18:47 -0700 (PDT) X-ASG-Debug-ID: 1460135925-04cbb02e1b30360001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id k6WVCwvQKJCihLrI (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 08 Apr 2016 10:18:46 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9FBC5C05E154; Fri, 8 Apr 2016 17:18:45 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-153.bos.redhat.com [10.18.41.153]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u38HIjpS020850; Fri, 8 Apr 2016 13:18:45 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 1FDD5125438; Fri, 8 Apr 2016 13:18:44 -0400 (EDT) Date: Fri, 8 Apr 2016 13:18:44 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/6 v2] xfs: xfs_iflush_cluster vs xfs_reclaim_inode Message-ID: <20160408171843.GC30614@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 0/6 v2] xfs: xfs_iflush_cluster vs xfs_reclaim_inode References: <1460072271-23923-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460072271-23923-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460135926 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Apr 08, 2016 at 09:37:45AM +1000, Dave Chinner wrote: > Hi folks, > > This is the second version of this patch set, first posted and > described here: > > http://oss.sgi.com/archives/xfs/2016-04/msg00069.html > > The only change from the first version is splitting up the first > patch into two as Christoph requested - one for the bug fix, the > other for the variable renaming. > Did your xfstests testing for this series include generic/233? I'm seeing a consistently reproducible test hang. The test is hanging on a "xfs_quota -x -c off -ug /mnt/scratch" command. The stack is as follows: [] xfs_qm_dquot_walk.isra.8+0x196/0x1b0 [xfs] [] xfs_qm_dqpurge_all+0x78/0x80 [xfs] [] xfs_qm_scall_quotaoff+0x148/0x640 [xfs] [] xfs_quota_disable+0x3d/0x50 [xfs] [] SyS_quotactl+0x3b3/0x8c0 [] do_syscall_64+0x67/0x190 [] return_from_SYSCALL_64+0x0/0x7a [] 0xffffffffffffffff ... and it looks like the kernel is spinning somehow or another between inode reclaim and xfsaild: ... kworker/1:2-210 [001] ...1 895.750591: xfs_perag_get_tag: dev 253:3 agno 1 refcount 1 caller xfs_reclaim_inodes_ag [xfs] kworker/1:2-210 [001] ...1 895.750609: xfs_perag_put: dev 253:3 agno 1 refcount 0 caller xfs_reclaim_inodes_ag [xfs] kworker/1:2-210 [001] ...1 895.750609: xfs_perag_get_tag: dev 253:3 agno 2 refcount 5 caller xfs_reclaim_inodes_ag [xfs] kworker/1:2-210 [001] ...1 895.750611: xfs_perag_put: dev 253:3 agno 2 refcount 4 caller xfs_reclaim_inodes_ag [xfs] kworker/1:2-210 [001] ...1 895.750612: xfs_perag_get_tag: dev 253:3 agno 3 refcount 1 caller xfs_reclaim_inodes_ag [xfs] kworker/1:2-210 [001] ...1 895.750613: xfs_perag_put: dev 253:3 agno 3 refcount 0 caller xfs_reclaim_inodes_ag [xfs] xfsaild/dm-3-12406 [003] ...2 895.760588: xfs_ail_locked: dev 253:3 lip 0xffff8801f8e65d80 lsn 2/5709 type XFS_LI_QUOTAOFF flags IN_AIL xfsaild/dm-3-12406 [003] ...2 895.810595: xfs_ail_locked: dev 253:3 lip 0xffff8801f8e65d80 lsn 2/5709 type XFS_LI_QUOTAOFF flags IN_AIL xfsaild/dm-3-12406 [003] ...2 895.860586: xfs_ail_locked: dev 253:3 lip 0xffff8801f8e65d80 lsn 2/5709 type XFS_LI_QUOTAOFF flags IN_AIL xfsaild/dm-3-12406 [003] ...2 895.910596: xfs_ail_locked: dev 253:3 lip 0xffff8801f8e65d80 lsn 2/5709 type XFS_LI_QUOTAOFF flags IN_AIL ... FWIW, this only occurs with patch 6 applied. The test and scratch devices are both 10GB lvm volumes formatted with mkfs defaults (v5). Brian > Cheers, > > Dave. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Fri Apr 8 12:41:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A93FB7CCC for ; Fri, 8 Apr 2016 12:41:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6EB988F8033 for ; Fri, 8 Apr 2016 10:41:47 -0700 (PDT) X-ASG-Debug-ID: 1460137304-04cb6c24643637f0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id RjV6Fv0jWZWr9RqX for ; Fri, 08 Apr 2016 10:41:44 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 939AC16C16D for ; Fri, 8 Apr 2016 12:41:44 -0500 (CDT) Subject: Re: [PATCH 08/19] mkfs: getbool is redundant To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 08/19] mkfs: getbool is redundant References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-9-git-send-email-jtulak@redhat.com> <5706981A.9090904@sandeen.net> From: Eric Sandeen Message-ID: <5707ED58.3060404@sandeen.net> Date: Fri, 8 Apr 2016 12:41:44 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1460137304 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28556 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/8/16 5:30 AM, Jan Tulak wrote: > On Thu, Apr 7, 2016 at 7:25 PM, Eric Sandeen >wrote: > > > > "Many options allow for an optional argument of 0 or 1, ..." > > > +disable or enable the functionality, in a forward-compatible syntax. > > What does "forward-compatible syntax" mean? I'm not sure that clarifies > anything for the reader. > > ​Yeah, I should reformulate it, I think. The meaning is that it won't > matter what the defaults are now, or will be in the future. E.g., if > you had a script creating a fs without crc before, when it was > disabled by default, and we changed the default, you are now creating > with the crc. But if you give it -m crc=0, then no matter what the > default is, you have it always disabled. Ok, I see. > How about changing the line to "Boolean options allows for optional > argument of value 0 or 1, to explicitly disable or enable the > functionality," and dropping the forward-compatible part? I think just: Many options accept an optional argument of value 0 or 1, to explicitly disable or enable the functionality. would suffice. > > > Otherwise this looks ok to me; Dave explained that it is intentional to > make every single option accept a value, whether it is now > boolean or a numeric value, so there is no such thing as a bare "--flag" > anymore; such flags are always "--flag [0|1]" now, right? > > > ​For options inside of -m, -d and such, yes. Top-level flags, that is > -f, -q, -N, -K and -V, are still only flags, but these don't change > the FS attributes. They are something different from the other. > Still, I wonder whether they should accept [0|1] too... Eh, not right now ;) Thanks, -Eric From shyam@zadarastorage.com Fri Apr 8 12:49:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C0AC87CCC for ; Fri, 8 Apr 2016 12:49:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 829708F8033 for ; Fri, 8 Apr 2016 10:49:03 -0700 (PDT) X-ASG-Debug-ID: 1460137724-04cbb02e1b32020001-NocioJ Received: from mail-wm0-f53.google.com (mail-wm0-f53.google.com [74.125.82.53]) by cuda.sgi.com with ESMTP id CdLs5qyDA5VJs5UH (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 08 Apr 2016 10:48:45 -0700 (PDT) X-Barracuda-Envelope-From: shyam@zadarastorage.com X-Barracuda-Apparent-Source-IP: 74.125.82.53 Received: by mail-wm0-f53.google.com with SMTP id u206so31421744wme.1 for ; Fri, 08 Apr 2016 10:48:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=from:references:in-reply-to:mime-version:thread-index:date :message-id:subject:to:cc; bh=XEWXmGsTqUO2B7kxD9KqJ9mtKfhuej0lpgG6MFN1dI4=; b=kP5Eais2knQgftXfldCYiXfCgFA6jB5D2g6nxx2gNZDITkZIxD0Qu91WQNJz9wKIW7 9OLpKZCZQ8DslNiMTyQMNMysxkmqPeYLZW12vZsFzO9lMX//yd1g9OF90D/obGXMQw8G IIWGHKXves1/Cy+FY+9KgCvhGDVsLC0db9/osWFpH/+SUjtShYyiQciscLehKGY48X4R Ji2xl/EwEc+sJFE7oyX0HsV30DQRswPStJAvmRyrKzK0mayNc4dlw14HTVBhnW1yKcZq v26E6RQX8rXL3h2yHGT6/WM+mFNtbqP4MiSOv/7JNfJAekSa/6ZkE326cSR3wN/olr0F 7HOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:references:in-reply-to:mime-version :thread-index:date:message-id:subject:to:cc; bh=XEWXmGsTqUO2B7kxD9KqJ9mtKfhuej0lpgG6MFN1dI4=; b=gArz84Km40n+vT2CD7rAR7guyqn/Le1nl4ByJEVuMk5fk2c0cw0XKRI2fNFpb7DdHW BxlXJ/VOWBkI76Iw2HKdY4a/FvbI3KLjwhMkdT8PAbVcZPjFbGhCDlNjqQk8GylPlLA3 YmsS+sV4k73W5Qbna2hz43h42wQkXut6ktM86szIqqRj7LNjLe+9KBeJ1vWMZyDAhyh6 yo8Ju7qNTwJa8u62Y6DDEaFV6WaJNxbNYx+HlozIG2G5GTSei5E7zejw2ztlbZ649uGD c98fts/KlCS+edW29/HHjJzffvVsjqXqY+KaJ1x/IqR7sPwwwC1c7JwXCmsld+4wSo0p QgEQ== X-Gm-Message-State: AD7BkJIy9hGQByo5FkdYXFfRTLsmzi6QXXbk0V19d7QKXk8+h5W6TYXd8McTjvCWx7bXUYAAwRD8b6cA1U2qbA== X-Received: by 10.28.184.194 with SMTP id i185mr5231731wmf.90.1460137724361; Fri, 08 Apr 2016 10:48:44 -0700 (PDT) From: Shyam Kaushik References: <20160322121922.GA53693@bfoster.bfoster> <232dd85fde11d4ef1625f070eabfd167@mail.gmail.com> <20160408131658.GB30614@bfoster.bfoster> 98e40e83fabf331b114fd6f41084d282@mail.gmail.com In-Reply-To: 98e40e83fabf331b114fd6f41084d282@mail.gmail.com MIME-Version: 1.0 X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AdGRmO+FiKrbezRSShaLKSg5VNlyvQAAfzdAAAiB25A= Date: Fri, 8 Apr 2016 23:18:42 +0530 Message-ID: Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery To: Brian Foster X-ASG-Orig-Subj: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Cc: david@fromorbit.com, xfs@oss.sgi.com, Alex Lyakas Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wm0-f53.google.com[74.125.82.53] X-Barracuda-Start-Time: 1460137725 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28557 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi Dave, Brian, Carlos, I think I see the problem. The problem is when the device just starts to return IO errors & not shutdown yet that buf could get returned with IO error. We mark it with XBF_WRITE_FAIL & re-submit the IO. But this IO could fail again & at this point since we already have XBF_WRITE_FAIL we dont submit the buf, but leave it in a bad state. w.r.t. trace-buffer we have xfs_buf_iodone_callbacks() called with bp->b_error & its an async IO. So we mark XBF_WRITE_FAIL on the buf & do xfs_buf_submit() kworker/2:1H-163 [002] ...1 7513.493658: xfs_buf_item_iodone_async: dev 253:11 bno 0x2571850 nblks 0x10 hold 2 pincount 0 lock 0 flags ASYNC|DONE|PAGES caller xfs_buf_ioend [xfs] but then this again fails & comes back to the same call, but this time with XBF_WRITE_FAIL set & in this case unfortunately we just do xfs_buf_relse() & there is no callback flow that is going through. kworker/2:1H-163 [002] ...1 7513.494385: xfs_buf_item_iodone_async: dev 253:11 bno 0x2571850 nblks 0x10 hold 2 pincount 0 lock 0 flags ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_ioend [xfs] Do you think this is the problem? There are several bufs that got hit like this. Here is complete trace for one such buf xfsaild/dm-11-22098 [002] ...2 7484.466616: xfs_buf_trylock: dev 253:11 bno 0x25718d0 nblks 0x10 hold 1 pincount 0 lock 0 flags DONE|PAGES caller xfs_buf_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7484.466616: xfs_buf_item_push: dev 253:11 bno 0x25718d0 len 0x2000 hold 1 pincount 0 lock 0 flags DONE|PAGES recur 0 refcount 0 bli flags DIRTY|INODE_ALLOC lidesc 0x (null) liflags IN_AIL xfsaild/dm-11-22098 [002] ...2 7484.466616: xfs_buf_delwri_queue: dev 253:11 bno 0x25718d0 nblks 0x10 hold 1 pincount 0 lock 0 flags DONE|PAGES caller xfs_buf_item _push [xfs] xfsaild/dm-11-22098 [002] ...2 7484.466617: xfs_buf_unlock: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 1 flags DONE|PAGES|DELWRI_Q caller xfs_buf_i tem_push [xfs] xfsaild/dm-11-22098 [002] ...1 7484.466765: xfs_buf_trylock: dev 253:11 bno 0x25718d0 nblks 0x10 hold 3 pincount 0 lock 0 flags DONE|PAGES|DELWRI_Q caller _xfs_buf _find [xfs] xfsaild/dm-11-22098 [002] ...1 7484.466765: xfs_buf_find: dev 253:11 bno 0x25718d0 len 0x2000 hold 3 pincount 0 lock 0 flags READ|TRYLOCK|UNMAPPED caller xfs_buf_g et_map [xfs] xfsaild/dm-11-22098 [002] ...1 7484.466766: xfs_buf_get: dev 253:11 bno 0x25718d0 len 0x2000 hold 3 pincount 0 lock 0 flags READ|TRYLOCK|UNMAPPED caller xfs_buf_re ad_map [xfs] xfsaild/dm-11-22098 [002] ...1 7484.466766: xfs_buf_read: dev 253:11 bno 0x25718d0 len 0x2000 hold 3 pincount 0 lock 0 flags READ|TRYLOCK|UNMAPPED caller xfs_trans _read_buf_map [xfs] xfsaild/dm-11-22098 [002] ...1 7484.466792: xfs_buf_delwri_queued: dev 253:11 bno 0x25718d0 nblks 0x10 hold 3 pincount 0 lock 0 flags DONE|PAGES|DELWRI_Q caller xf s_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...1 7484.466792: xfs_buf_unlock: dev 253:11 bno 0x25718d0 nblks 0x10 hold 3 pincount 0 lock 1 flags DONE|PAGES|DELWRI_Q caller xfs_inode _item_push [xfs] xfsaild/dm-11-22098 [002] ...1 7484.466792: xfs_buf_rele: dev 253:11 bno 0x25718d0 nblks 0x10 hold 3 pincount 0 lock 1 flags DONE|PAGES|DELWRI_Q caller xfs_inode_i tem_push [xfs] xfsaild/dm-11-22098 [002] ...1 7484.467962: xfs_buf_trylock: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags DONE|PAGES|DELWRI_Q caller __xfs_bu f_delwri_submit [xfs] xfsaild/dm-11-22098 [002] ...1 7484.467962: xfs_buf_delwri_split: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags DONE|PAGES|DELWRI_Q caller xfs _buf_delwri_submit_nowait [xfs] xfsaild/dm-11-22098 [002] ...1 7484.469864: xfs_buf_submit: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags WRITE|ASYNC|DONE|PAGES caller __xfs_buf_delwri_submit [xfs] xfsaild/dm-11-22098 [002] ...1 7484.469864: xfs_buf_hold: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags WRITE|ASYNC|DONE|PAGES caller xfs_buf_submit [xfs] xfsaild/dm-11-22098 [002] ...1 7484.469868: xfs_buf_rele: dev 253:11 bno 0x25718d0 nblks 0x10 hold 3 pincount 0 lock 0 flags WRITE|ASYNC|DONE|PAGES caller xfs_buf_submit [xfs] kworker/2:1H-163 [002] ...1 7513.493754: xfs_buf_iodone: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags WRITE|ASYNC|DONE|PAGES caller xfs_buf_ioend_work [xfs] kworker/2:1H-163 [002] ...1 7513.493754: xfs_buf_ioerror: dev 253:11 bno 0x25718d0 len 0x2000 hold 2 pincount 0 lock 0 error -5 flags ASYNC|DONE|PAGES caller xfs_buf_ioend_work [xfs] kworker/2:1H-163 [002] ...1 7513.493754: xfs_buf_item_iodone_async: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags ASYNC|DONE|PAGES caller xfs_buf_ioend [xfs] kworker/2:1H-163 [002] ...1 7513.493754: xfs_buf_ioerror: dev 253:11 bno 0x25718d0 len 0x2000 hold 2 pincount 0 lock 0 error 0 flags ASYNC|DONE|PAGES caller xfs_buf_iodone_callbacks [xfs] kworker/2:1H-163 [002] ...1 7513.493755: xfs_buf_submit: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags WRITE|ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_iodone_callbacks [xfs] kworker/2:1H-163 [002] ...1 7513.493755: xfs_buf_hold: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags WRITE|ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_submit [xfs] kworker/2:1H-163 [002] ...1 7513.493766: xfs_buf_rele: dev 253:11 bno 0x25718d0 nblks 0x10 hold 3 pincount 0 lock 0 flags WRITE|ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_submit [xfs] kworker/2:1H-163 [002] ...1 7513.494398: xfs_buf_iodone: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags WRITE|ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_ioend_work [xfs] kworker/2:1H-163 [002] ...1 7513.494398: xfs_buf_ioerror: dev 253:11 bno 0x25718d0 len 0x2000 hold 2 pincount 0 lock 0 error -5 flags ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_ioend_work [xfs] kworker/2:1H-163 [002] ...1 7513.494398: xfs_buf_item_iodone_async: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_ioend [xfs] kworker/2:1H-163 [002] ...1 7513.494398: xfs_buf_ioerror: dev 253:11 bno 0x25718d0 len 0x2000 hold 2 pincount 0 lock 0 error 0 flags ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_iodone_callbacks [xfs] kworker/2:1H-163 [002] ...1 7513.494399: xfs_buf_unlock: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 1 flags ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_iodone_callbacks [xfs] kworker/2:1H-163 [002] ...1 7513.494399: xfs_buf_rele: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 1 flags ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_iodone_callbacks [xfs] as seen above the first time buf hits ioerror we retry, but the 2nd time we give it up without finishing the buf. Its in a stuck state & this keeps xfsaild thread busy when unmounting trying to flush it out. Thanks. --Shyam -----Original Message----- From: Shyam Kaushik [mailto:shyam@zadarastorage.com] Sent: 08 April 2016 19:05 To: 'Brian Foster' Cc: 'david@fromorbit.com'; 'xfs@oss.sgi.com'; Alex Lyakas Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Hi Brian, Yes the below report is a bit different than the original report. I wanted to confirm if the new patches from Dave will see these odd crashes/hung-task. I applied Dave's patch & managed to recreate the original issue. With systemtap I do see that FS has been marked for shutdown (xfs_aildpush() - mp:0xffff880062d09800 m_flags:4325656), but still the infinite tries keep happening with xfsaild_push() seeing XFS_IFLOCK on the inode. Pls note that this issue happens only when I see XFS (dm-10): Detected failing async write on buffer block 0x368d76a0. Retrying async write. in the logs. In all other cases, this problem doesn't happen. So there is something with this async-write retries that is leaving the state of the inode with IFLOCK that rest of aildpush is not able to handle. --Shyam -----Original Message----- From: Brian Foster [mailto:bfoster@redhat.com] Sent: 08 April 2016 18:47 To: Shyam Kaushik Cc: david@fromorbit.com; xfs@oss.sgi.com; Alex Lyakas Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery On Fri, Apr 08, 2016 at 04:21:02PM +0530, Shyam Kaushik wrote: > Hi Dave, Brian, Carlos, > > While trying to reproduce this issue I have been running into different > issues that are similar. Underlying issue remains the same when backend to > XFS is failed & we unmount XFS, we run into hung-task timeout (180-secs) > with stack like > > kernel: [14952.671131] [] > xfs_ail_push_all_sync+0xa9/0xe0 [xfs] > kernel: [14952.671139] [] ? > prepare_to_wait_event+0x110/0x110 > kernel: [14952.671181] [] xfs_unmountfs+0x61/0x1a0 > [xfs] > > while running trace-events, XFS ail push keeps looping around > > xfsaild/dm-10-21143 [001] ...2 17878.555133: xfs_ilock_nowait: dev > 253:10 ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-21143 [001] ...2 17878.555138: xfs_iunlock: dev 253:10 > ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-21143 [001] ...2 17878.555138: xfs_ail_push: dev 253:10 > lip 0xffff880031f6ae40 lsn 1/73448 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-21143 [001] ...2 17878.605136: xfs_ilock_nowait: dev > 253:10 ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-21143 [001] ...2 17878.605141: xfs_iunlock: dev 253:10 > ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-21143 [001] ...2 17878.605142: xfs_ail_push: dev 253:10 > lip 0xffff880031f6ae40 lsn 1/73448 type XFS_LI_INODE flags IN_AIL > > observe ino==0x0 (its a freed inode) but the corresponding lip stays with > xfsaild push. I had run a systemtap when this problem happened & the > following keeps repeating. > That's interesting, and looks different from the original report in terms of the inode number being cleared. The original report looks like it has a valid inode and there's some problematic sequence where it's not being removed from the AIL in the event of errors. I think at this point we know that XFS attempts to retry these I/Os indefinitely. Dave has outstanding patches to deal with this issue. The question Dave raised above was whether the filesystem shut down, and if not, why (as a failed log I/O should cause a shutdown)? Carlos was looking into this it appears... > xfs_inode_item_push() - inode:0xffff88003d8ca000 m_flags:0x420118 > flags:0x1 > xfs_iflush() - inode:ffff88003d8ca000 aborting for forced shutdown > xfs_iflush_abort() - iip:0x0 > > xfs_inode_item_push() is doing xfs_iflush() but it sees FS_SHUTDOWN flag > marked & does an xfs_iflush_abort().xfs_iflush_abort() sees i_itemp==NULL > on the lip & doesn't do anything. So we have this stale lip that is not > associated to inode anymore that keeps xfs_ail_push_all_sync() busy. > > On few other occurrences, i have had NULL pointer/dereference or other > sorts of crashes at this line > > xfsaild_push() > lock_result = lip->li_ops->iop_push(lip, > &ailp->xa_buf_list); > > with debug prints, in one of the occurrence lip->li_ops was NULL & in > another lip->li_ops was pointing to a bad pointer that subsequent > dereference crashed it. This also indicates that a bad/freed lip was > inserted that xfsaild_push() is working. > > I hit upon Dave's patch "xfs: xfs_inode_free() isn't RCU safe" & realized > that this could explain the above issue where a lip that has been freed is > wrongly referenced & later we could even have the inode disconnected. What > do you think? > > In any case I uploaded the full xfs trace events before this issue started > & till the end. It is at > https://www.dropbox.com/s/21qstz4ld1gn8yi/xfs_trace_pipe.gz?dl=0 > It seems like it could be related. I didn't catch anything obvious from the trace, but there's a lot of data there. The RCU-unsafe issue was difficult to track down without instrumentation.. I'm not sure that will be evident from the trace. The best thing to do wrt to that might be to try with Dave's patches, as that so far appears to address the problem. (In fact, it might be worth it to try Dave's shutdown on umount patch he referred to up-thread to address the original problem as well). Brian > Pls let me know. Thanks. > > --Shyam > > -----Original Message----- > From: Shyam Kaushik [mailto:shyam@zadarastorage.com] > Sent: 23 March 2016 15:23 > To: 'Brian Foster' > Cc: 'xfs@oss.sgi.com'; Alex Lyakas > Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > after disk failure/recovery > > Hi Carlos, > > w.r.t. your question below > > >>> Shyam, after you reconnected the disks, the messages about failed > async metadata > >>> writes stops to be logged? > > After I reconnect the disks, messages about failed async metadata writes > stops to be logged. But the key thing is messages like > > XFS (dm-29): xfs_log_force: error -5 returned > > Keeps repeating every 30-secs which indicates that there is some buf/io > error status that is being carried forward. > > >>> Any chance you can reliably reproduce it? > > Yes I have a way to reproduce it, but its not reliable. What I do is setup > a dm-linear over a disk. Create XFS, mount & trigger few copy threads to > copy varying sized files into the FS. At this point pull out the drive > (with scsi-remove-single-device in /proc/scsi/scsi) & in a short-while > convert the dm-linear to dm-ioerror. Then I bring back the underlying > drive, convert back dm-ioerror to dm-linear & try to unmount XFS. > > This problem somehow happens on a newly created XFS. If I copy several > files into XFS/delete them & then copy them again, repeat the drive > failure/recovery experiment it doesn't reproduce. > > Thanks. > > --Shyam > > Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > after disk failure/recovery > From: Carlos Maiolino > Date: Tue, 22 Mar 2016 16:38:25 +0100 > In-reply-to: <20160322140345.GA54245@bfoster.bfoster> > Mail-followup-to: xfs@xxxxxxxxxxx > User-agent: Mutt/1.5.24 (2015-08-30) > > Hi Brian, > > These traces, and the stack trace presented, looks quite similar with the > one we were discussing a few days ago, using a dm-thin snapshot. > > Looks like with the same bug I've been hunting and Shyam confirmed my > hypothesis > of this bug be able to be reproduced with a regular device. > > If it's the same bug, yes, I reproduced it using upstream kernel. > > The difference between both (this bug and the one I've been working on) is > how > xfs actually behaves when async metadata writes fail. Other than that, it > pretty > much looks the same. > > Trying to unmount the filesystem hungs in xfs_log_force(), well, basically > the > reason I submitted the patch to include the caller into xfs_log_force > trace. I'd > like to see ftrace traces from this system with that patch if possible. > > I didn't have time to keep working on this for the past few days, but > looks like > it's time to come back to it. > > Shyam, after you reconnected the disks, the messages about failed async > metadata > writes stops to be logged? > > Any chance you can reliably reproduce it? > > I'm not a xfs journal expert, but it looks like the writeback of items in > AIL > got stuck due the IO errors, and were never completed, but I don't know > what I > should expect after the disk is reconnected. > > In my case though, with upstream kernel, I didn't get a XFS_SHUTDOWN until > I > tried to unmount the filesystem, which differs from this case, where xfs > looks > to have shutdown the filesystem after a few tries to writeback the > metadata. > > Anyway, I can dig more into it this week, if nobody knows what is going on > before I do it :) > > -----Original Message----- > From: Shyam Kaushik [mailto:shyam@zadarastorage.com] > Sent: 22 March 2016 18:32 > To: 'Brian Foster' > Cc: 'xfs@oss.sgi.com'; Alex Lyakas > Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > after disk failure/recovery > > Hi Brian, > > Thanks for your quick reply. I repeated the test & trace-pipe is > constantly filled with this: > > xfsaild/dm-10-3335 [003] ...2 24890.546491: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.546492: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.546493: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.596491: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.596492: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.596494: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.646497: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.646498: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.646500: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.696467: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.746548: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.796479: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.846467: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.846468: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > while regular activity seems to happen on other inodes/kworker threads > > kworker/u8:4-27691 [001] ...1 24895.811474: xfs_writepage: dev 253:10 > ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811477: xfs_invalidatepage: dev > 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > delalloc 1 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811478: xfs_releasepage: dev > 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 > delalloc 0 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811482: xfs_writepage: dev 253:10 > ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811482: xfs_invalidatepage: dev > 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > delalloc 1 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811483: xfs_releasepage: dev > 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 > delalloc 0 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811485: xfs_writepage: dev 253:10 > ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811486: xfs_invalidatepage: dev > 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > delalloc 1 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811486: xfs_releasepage: dev > 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 > delalloc 0 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812381: xfs_writepage: dev 253:10 > ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812382: xfs_invalidatepage: dev > 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 1000 > delalloc 1 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812382: xfs_releasepage: dev > 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc > 0 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812385: xfs_writepage: dev 253:10 > ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812385: xfs_invalidatepage: dev > 253:10 ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 1000 > delalloc 1 unwritten 0 > > > looks like xfsaild is not able to take lock until hung-task timeout kicks > in > > xfsaild/dm-10-3335 [003] ...2 25247.649468: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 25247.699478: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.699516: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.699517: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 25247.749471: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.749478: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.749479: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > Please let me know how to debug this further. Thanks. > > --Shyam > -----Original Message----- > From: Brian Foster [mailto:bfoster@redhat.com] > Sent: 22 March 2016 17:49 > To: Shyam Kaushik > Cc: xfs@oss.sgi.com; Alex Lyakas > Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > after disk failure/recovery > > On Tue, Mar 22, 2016 at 04:51:39PM +0530, Shyam Kaushik wrote: > > Hi XFS developers, > > > > We are seeing the following issue with XFS on kernel 3.18.19. > > > > We have XFS mounted over a raw disk. Disk was pulled out manually. There > > were async writes on files that were errored like this > > > ... > > > > And XFS hit metadata & Log IO errors that it decides to shutdown: > > > > Mar 16 16:03:22 host0 kernel: [ 4637.351841] XFS (dm-29): metadata I/O > > error: block 0x3a27fbd0 ("xlog_iodone") error 5 numblks 64 > > Mar 16 16:03:22 host0 kernel: [ 4637.352820] XFS(dm-29): SHUTDOWN!!! > > old_flags=0x0 new_flags=0x2 > > Mar 16 16:03:22 host0 kernel: [ 4637.353187] XFS (dm-29): Log I/O Error > > Detected. Shutting down filesystem > ... > > Later the drive was re-inserted back. After the drive was re-inserted, > XFS > > was attempted to be unmounted > > > > Mar 16 16:16:53 host0 controld: [2557] [ ] umount[202] > > : umount(/sdisk/vol5b0, xfs) > > > > But nothing happens except for the 30-secs xfs_log_force errors that > keeps > > repeating > > > ... > > > > This problem doesn't happen consistently, but happens periodically with > a > > drive failure/recovery followed by XFS unmount. I couldn't find this > issue > > fixed in later kernels. Can you please suggest how I can debug this > issue > > further? > > > > Similar problems have been reproduced due to racy/incorrect EFI/EFD > object tracking, which are internal data structures associated with > freeing extents. > > What happens if you enable tracepoints while the fs is in this hung > unmount state? > > # trace-cmd start -e "xfs:*" > # cat /sys/kernel/debug/tracing/trace_pipe > > Brian > > > Thanks! > > > > --Shyam > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From shyam@zadarastorage.com Fri Apr 8 12:51:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1AF647CCC for ; Fri, 8 Apr 2016 12:51:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CFDF3304048 for ; Fri, 8 Apr 2016 10:51:35 -0700 (PDT) X-ASG-Debug-ID: 1460137888-04cbb02e1d32310001-NocioJ Received: from mail-wm0-f44.google.com (mail-wm0-f44.google.com [74.125.82.44]) by cuda.sgi.com with ESMTP id tpJpgmUWNAn2F257 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 08 Apr 2016 10:51:29 -0700 (PDT) X-Barracuda-Envelope-From: shyam@zadarastorage.com X-Barracuda-Apparent-Source-IP: 74.125.82.44 Received: by mail-wm0-f44.google.com with SMTP id v188so25537836wme.1 for ; Fri, 08 Apr 2016 10:51:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=from:references:in-reply-to:mime-version:thread-index:date :message-id:subject:to:cc; bh=A9lPAlRHEcG3Pe35OG4Z3Pzl1B/fTi1GNJQKQVKmc6Y=; b=ySRu/Jz5CQS3kLWGFn+92+EDCOfY8qunR06J6Xs7AMF6skjDQWiCxQNg7vlCQvnjiY 55u17GWV9nto2+PZQoRrSFmBEFnXcp05POzsIiwg0HTY2UTHEI/87RXE7z2MVHTdjc82 Le2D0fby5jF6LELd83as7XNd0RQajbMROL79DHwx+aiWmIEj2Zc2jUyuPmrQURywHZUg ZDnmYh+3NOdvHPdUZUxdKBOHp1I7imF7Gt2+ZZDD6HydnqKx6cAjEAMH78Sc9SwmW48t XIjM32dGp2ZFyK5osYsRfVWwHkSHTc2ga0VoktEgWzfnKpA/eJ6+uutC8vpK8kfnhaAy NSQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:references:in-reply-to:mime-version :thread-index:date:message-id:subject:to:cc; bh=A9lPAlRHEcG3Pe35OG4Z3Pzl1B/fTi1GNJQKQVKmc6Y=; b=jMAR0wB1Q+9EhsVJ/R3CONa4TP35tGx9SUI4cqCYHhRTqDa68UK0NDGrELS88dFWm1 PlACbZqZqv8l1oubin7JrQRmop/dY+uWLHg0fqtSRHUbym3CsE4EK/My6YoViD4IHUQ/ 2Il4YU0aO+3wYOokay1L6Xngfg5CfB5tfFE/x2/7VXHrsRuzmrGnhCwXEncv3ZsWdwo2 bqHf45DAyh11XKpTFRxnXjtSaV9b4By8cp6rHJYUno0cTdw7BExbzb5oF+UtrRZFC6dh FQK82qWUh831mDUnbBh46dMeqFhv/YpNjOHXdEIeNPTRe1Ynr4oqPKNZRpNIMhwkkp4+ aUdA== X-Gm-Message-State: AD7BkJIUQ5mC8+/7Fm4RMgHKm0kLUodMl9yy3YW0ECf9pkvJKbVi4ByLpGUSmeM7q+JTw7GL4rQaDoW4LlhwxA== X-Received: by 10.28.158.202 with SMTP id h193mr5031586wme.35.1460137888116; Fri, 08 Apr 2016 10:51:28 -0700 (PDT) From: Shyam Kaushik References: <20160322121922.GA53693@bfoster.bfoster> <232dd85fde11d4ef1625f070eabfd167@mail.gmail.com> <20160408131658.GB30614@bfoster.bfoster> 98e40e83fabf331b114fd6f41084d282@mail.gmail.com becf3ca9bb578795adb60e1c2f2bbbba@mail.gmail.com In-Reply-To: becf3ca9bb578795adb60e1c2f2bbbba@mail.gmail.com MIME-Version: 1.0 X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AdGRmO+FiKrbezRSShaLKSg5VNlyvQAAfzdAAAiB25AAAIcbgA== Date: Fri, 8 Apr 2016 23:21:27 +0530 Message-ID: Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery To: Brian Foster X-ASG-Orig-Subj: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Cc: david@fromorbit.com, xfs@oss.sgi.com, Alex Lyakas Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wm0-f44.google.com[74.125.82.44] X-Barracuda-Start-Time: 1460137889 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28557 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Specific problematic flow in xfs_buf_iodone_callbacks() is this if (XFS_BUF_ISASYNC(bp)) { 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); } That in the else part we just do xfs_buf_relse(). I am not sure if this is alright. Pls let me know. Thanks. --Shyam -----Original Message----- From: Shyam Kaushik [mailto:shyam@zadarastorage.com] Sent: 08 April 2016 23:19 To: 'Brian Foster' Cc: 'david@fromorbit.com'; 'xfs@oss.sgi.com'; Alex Lyakas Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Hi Dave, Brian, Carlos, I think I see the problem. The problem is when the device just starts to return IO errors & not shutdown yet that buf could get returned with IO error. We mark it with XBF_WRITE_FAIL & re-submit the IO. But this IO could fail again & at this point since we already have XBF_WRITE_FAIL we dont submit the buf, but leave it in a bad state. w.r.t. trace-buffer we have xfs_buf_iodone_callbacks() called with bp->b_error & its an async IO. So we mark XBF_WRITE_FAIL on the buf & do xfs_buf_submit() kworker/2:1H-163 [002] ...1 7513.493658: xfs_buf_item_iodone_async: dev 253:11 bno 0x2571850 nblks 0x10 hold 2 pincount 0 lock 0 flags ASYNC|DONE|PAGES caller xfs_buf_ioend [xfs] but then this again fails & comes back to the same call, but this time with XBF_WRITE_FAIL set & in this case unfortunately we just do xfs_buf_relse() & there is no callback flow that is going through. kworker/2:1H-163 [002] ...1 7513.494385: xfs_buf_item_iodone_async: dev 253:11 bno 0x2571850 nblks 0x10 hold 2 pincount 0 lock 0 flags ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_ioend [xfs] Do you think this is the problem? There are several bufs that got hit like this. Here is complete trace for one such buf xfsaild/dm-11-22098 [002] ...2 7484.466616: xfs_buf_trylock: dev 253:11 bno 0x25718d0 nblks 0x10 hold 1 pincount 0 lock 0 flags DONE|PAGES caller xfs_buf_item_push [xfs] xfsaild/dm-11-22098 [002] ...2 7484.466616: xfs_buf_item_push: dev 253:11 bno 0x25718d0 len 0x2000 hold 1 pincount 0 lock 0 flags DONE|PAGES recur 0 refcount 0 bli flags DIRTY|INODE_ALLOC lidesc 0x (null) liflags IN_AIL xfsaild/dm-11-22098 [002] ...2 7484.466616: xfs_buf_delwri_queue: dev 253:11 bno 0x25718d0 nblks 0x10 hold 1 pincount 0 lock 0 flags DONE|PAGES caller xfs_buf_item _push [xfs] xfsaild/dm-11-22098 [002] ...2 7484.466617: xfs_buf_unlock: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 1 flags DONE|PAGES|DELWRI_Q caller xfs_buf_i tem_push [xfs] xfsaild/dm-11-22098 [002] ...1 7484.466765: xfs_buf_trylock: dev 253:11 bno 0x25718d0 nblks 0x10 hold 3 pincount 0 lock 0 flags DONE|PAGES|DELWRI_Q caller _xfs_buf _find [xfs] xfsaild/dm-11-22098 [002] ...1 7484.466765: xfs_buf_find: dev 253:11 bno 0x25718d0 len 0x2000 hold 3 pincount 0 lock 0 flags READ|TRYLOCK|UNMAPPED caller xfs_buf_g et_map [xfs] xfsaild/dm-11-22098 [002] ...1 7484.466766: xfs_buf_get: dev 253:11 bno 0x25718d0 len 0x2000 hold 3 pincount 0 lock 0 flags READ|TRYLOCK|UNMAPPED caller xfs_buf_re ad_map [xfs] xfsaild/dm-11-22098 [002] ...1 7484.466766: xfs_buf_read: dev 253:11 bno 0x25718d0 len 0x2000 hold 3 pincount 0 lock 0 flags READ|TRYLOCK|UNMAPPED caller xfs_trans _read_buf_map [xfs] xfsaild/dm-11-22098 [002] ...1 7484.466792: xfs_buf_delwri_queued: dev 253:11 bno 0x25718d0 nblks 0x10 hold 3 pincount 0 lock 0 flags DONE|PAGES|DELWRI_Q caller xf s_inode_item_push [xfs] xfsaild/dm-11-22098 [002] ...1 7484.466792: xfs_buf_unlock: dev 253:11 bno 0x25718d0 nblks 0x10 hold 3 pincount 0 lock 1 flags DONE|PAGES|DELWRI_Q caller xfs_inode _item_push [xfs] xfsaild/dm-11-22098 [002] ...1 7484.466792: xfs_buf_rele: dev 253:11 bno 0x25718d0 nblks 0x10 hold 3 pincount 0 lock 1 flags DONE|PAGES|DELWRI_Q caller xfs_inode_i tem_push [xfs] xfsaild/dm-11-22098 [002] ...1 7484.467962: xfs_buf_trylock: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags DONE|PAGES|DELWRI_Q caller __xfs_bu f_delwri_submit [xfs] xfsaild/dm-11-22098 [002] ...1 7484.467962: xfs_buf_delwri_split: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags DONE|PAGES|DELWRI_Q caller xfs _buf_delwri_submit_nowait [xfs] xfsaild/dm-11-22098 [002] ...1 7484.469864: xfs_buf_submit: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags WRITE|ASYNC|DONE|PAGES caller __xfs_buf_delwri_submit [xfs] xfsaild/dm-11-22098 [002] ...1 7484.469864: xfs_buf_hold: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags WRITE|ASYNC|DONE|PAGES caller xfs_buf_submit [xfs] xfsaild/dm-11-22098 [002] ...1 7484.469868: xfs_buf_rele: dev 253:11 bno 0x25718d0 nblks 0x10 hold 3 pincount 0 lock 0 flags WRITE|ASYNC|DONE|PAGES caller xfs_buf_submit [xfs] kworker/2:1H-163 [002] ...1 7513.493754: xfs_buf_iodone: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags WRITE|ASYNC|DONE|PAGES caller xfs_buf_ioend_work [xfs] kworker/2:1H-163 [002] ...1 7513.493754: xfs_buf_ioerror: dev 253:11 bno 0x25718d0 len 0x2000 hold 2 pincount 0 lock 0 error -5 flags ASYNC|DONE|PAGES caller xfs_buf_ioend_work [xfs] kworker/2:1H-163 [002] ...1 7513.493754: xfs_buf_item_iodone_async: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags ASYNC|DONE|PAGES caller xfs_buf_ioend [xfs] kworker/2:1H-163 [002] ...1 7513.493754: xfs_buf_ioerror: dev 253:11 bno 0x25718d0 len 0x2000 hold 2 pincount 0 lock 0 error 0 flags ASYNC|DONE|PAGES caller xfs_buf_iodone_callbacks [xfs] kworker/2:1H-163 [002] ...1 7513.493755: xfs_buf_submit: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags WRITE|ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_iodone_callbacks [xfs] kworker/2:1H-163 [002] ...1 7513.493755: xfs_buf_hold: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags WRITE|ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_submit [xfs] kworker/2:1H-163 [002] ...1 7513.493766: xfs_buf_rele: dev 253:11 bno 0x25718d0 nblks 0x10 hold 3 pincount 0 lock 0 flags WRITE|ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_submit [xfs] kworker/2:1H-163 [002] ...1 7513.494398: xfs_buf_iodone: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags WRITE|ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_ioend_work [xfs] kworker/2:1H-163 [002] ...1 7513.494398: xfs_buf_ioerror: dev 253:11 bno 0x25718d0 len 0x2000 hold 2 pincount 0 lock 0 error -5 flags ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_ioend_work [xfs] kworker/2:1H-163 [002] ...1 7513.494398: xfs_buf_item_iodone_async: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_ioend [xfs] kworker/2:1H-163 [002] ...1 7513.494398: xfs_buf_ioerror: dev 253:11 bno 0x25718d0 len 0x2000 hold 2 pincount 0 lock 0 error 0 flags ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_iodone_callbacks [xfs] kworker/2:1H-163 [002] ...1 7513.494399: xfs_buf_unlock: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 1 flags ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_iodone_callbacks [xfs] kworker/2:1H-163 [002] ...1 7513.494399: xfs_buf_rele: dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 1 flags ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_iodone_callbacks [xfs] as seen above the first time buf hits ioerror we retry, but the 2nd time we give it up without finishing the buf. Its in a stuck state & this keeps xfsaild thread busy when unmounting trying to flush it out. Thanks. --Shyam -----Original Message----- From: Shyam Kaushik [mailto:shyam@zadarastorage.com] Sent: 08 April 2016 19:05 To: 'Brian Foster' Cc: 'david@fromorbit.com'; 'xfs@oss.sgi.com'; Alex Lyakas Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Hi Brian, Yes the below report is a bit different than the original report. I wanted to confirm if the new patches from Dave will see these odd crashes/hung-task. I applied Dave's patch & managed to recreate the original issue. With systemtap I do see that FS has been marked for shutdown (xfs_aildpush() - mp:0xffff880062d09800 m_flags:4325656), but still the infinite tries keep happening with xfsaild_push() seeing XFS_IFLOCK on the inode. Pls note that this issue happens only when I see XFS (dm-10): Detected failing async write on buffer block 0x368d76a0. Retrying async write. in the logs. In all other cases, this problem doesn't happen. So there is something with this async-write retries that is leaving the state of the inode with IFLOCK that rest of aildpush is not able to handle. --Shyam -----Original Message----- From: Brian Foster [mailto:bfoster@redhat.com] Sent: 08 April 2016 18:47 To: Shyam Kaushik Cc: david@fromorbit.com; xfs@oss.sgi.com; Alex Lyakas Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery On Fri, Apr 08, 2016 at 04:21:02PM +0530, Shyam Kaushik wrote: > Hi Dave, Brian, Carlos, > > While trying to reproduce this issue I have been running into different > issues that are similar. Underlying issue remains the same when backend to > XFS is failed & we unmount XFS, we run into hung-task timeout (180-secs) > with stack like > > kernel: [14952.671131] [] > xfs_ail_push_all_sync+0xa9/0xe0 [xfs] > kernel: [14952.671139] [] ? > prepare_to_wait_event+0x110/0x110 > kernel: [14952.671181] [] xfs_unmountfs+0x61/0x1a0 > [xfs] > > while running trace-events, XFS ail push keeps looping around > > xfsaild/dm-10-21143 [001] ...2 17878.555133: xfs_ilock_nowait: dev > 253:10 ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-21143 [001] ...2 17878.555138: xfs_iunlock: dev 253:10 > ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-21143 [001] ...2 17878.555138: xfs_ail_push: dev 253:10 > lip 0xffff880031f6ae40 lsn 1/73448 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-21143 [001] ...2 17878.605136: xfs_ilock_nowait: dev > 253:10 ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-21143 [001] ...2 17878.605141: xfs_iunlock: dev 253:10 > ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-21143 [001] ...2 17878.605142: xfs_ail_push: dev 253:10 > lip 0xffff880031f6ae40 lsn 1/73448 type XFS_LI_INODE flags IN_AIL > > observe ino==0x0 (its a freed inode) but the corresponding lip stays with > xfsaild push. I had run a systemtap when this problem happened & the > following keeps repeating. > That's interesting, and looks different from the original report in terms of the inode number being cleared. The original report looks like it has a valid inode and there's some problematic sequence where it's not being removed from the AIL in the event of errors. I think at this point we know that XFS attempts to retry these I/Os indefinitely. Dave has outstanding patches to deal with this issue. The question Dave raised above was whether the filesystem shut down, and if not, why (as a failed log I/O should cause a shutdown)? Carlos was looking into this it appears... > xfs_inode_item_push() - inode:0xffff88003d8ca000 m_flags:0x420118 > flags:0x1 > xfs_iflush() - inode:ffff88003d8ca000 aborting for forced shutdown > xfs_iflush_abort() - iip:0x0 > > xfs_inode_item_push() is doing xfs_iflush() but it sees FS_SHUTDOWN flag > marked & does an xfs_iflush_abort().xfs_iflush_abort() sees i_itemp==NULL > on the lip & doesn't do anything. So we have this stale lip that is not > associated to inode anymore that keeps xfs_ail_push_all_sync() busy. > > On few other occurrences, i have had NULL pointer/dereference or other > sorts of crashes at this line > > xfsaild_push() > lock_result = lip->li_ops->iop_push(lip, > &ailp->xa_buf_list); > > with debug prints, in one of the occurrence lip->li_ops was NULL & in > another lip->li_ops was pointing to a bad pointer that subsequent > dereference crashed it. This also indicates that a bad/freed lip was > inserted that xfsaild_push() is working. > > I hit upon Dave's patch "xfs: xfs_inode_free() isn't RCU safe" & realized > that this could explain the above issue where a lip that has been freed is > wrongly referenced & later we could even have the inode disconnected. What > do you think? > > In any case I uploaded the full xfs trace events before this issue started > & till the end. It is at > https://www.dropbox.com/s/21qstz4ld1gn8yi/xfs_trace_pipe.gz?dl=0 > It seems like it could be related. I didn't catch anything obvious from the trace, but there's a lot of data there. The RCU-unsafe issue was difficult to track down without instrumentation.. I'm not sure that will be evident from the trace. The best thing to do wrt to that might be to try with Dave's patches, as that so far appears to address the problem. (In fact, it might be worth it to try Dave's shutdown on umount patch he referred to up-thread to address the original problem as well). Brian > Pls let me know. Thanks. > > --Shyam > > -----Original Message----- > From: Shyam Kaushik [mailto:shyam@zadarastorage.com] > Sent: 23 March 2016 15:23 > To: 'Brian Foster' > Cc: 'xfs@oss.sgi.com'; Alex Lyakas > Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > after disk failure/recovery > > Hi Carlos, > > w.r.t. your question below > > >>> Shyam, after you reconnected the disks, the messages about failed > async metadata > >>> writes stops to be logged? > > After I reconnect the disks, messages about failed async metadata writes > stops to be logged. But the key thing is messages like > > XFS (dm-29): xfs_log_force: error -5 returned > > Keeps repeating every 30-secs which indicates that there is some buf/io > error status that is being carried forward. > > >>> Any chance you can reliably reproduce it? > > Yes I have a way to reproduce it, but its not reliable. What I do is setup > a dm-linear over a disk. Create XFS, mount & trigger few copy threads to > copy varying sized files into the FS. At this point pull out the drive > (with scsi-remove-single-device in /proc/scsi/scsi) & in a short-while > convert the dm-linear to dm-ioerror. Then I bring back the underlying > drive, convert back dm-ioerror to dm-linear & try to unmount XFS. > > This problem somehow happens on a newly created XFS. If I copy several > files into XFS/delete them & then copy them again, repeat the drive > failure/recovery experiment it doesn't reproduce. > > Thanks. > > --Shyam > > Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > after disk failure/recovery > From: Carlos Maiolino > Date: Tue, 22 Mar 2016 16:38:25 +0100 > In-reply-to: <20160322140345.GA54245@bfoster.bfoster> > Mail-followup-to: xfs@xxxxxxxxxxx > User-agent: Mutt/1.5.24 (2015-08-30) > > Hi Brian, > > These traces, and the stack trace presented, looks quite similar with the > one we were discussing a few days ago, using a dm-thin snapshot. > > Looks like with the same bug I've been hunting and Shyam confirmed my > hypothesis > of this bug be able to be reproduced with a regular device. > > If it's the same bug, yes, I reproduced it using upstream kernel. > > The difference between both (this bug and the one I've been working on) is > how > xfs actually behaves when async metadata writes fail. Other than that, it > pretty > much looks the same. > > Trying to unmount the filesystem hungs in xfs_log_force(), well, basically > the > reason I submitted the patch to include the caller into xfs_log_force > trace. I'd > like to see ftrace traces from this system with that patch if possible. > > I didn't have time to keep working on this for the past few days, but > looks like > it's time to come back to it. > > Shyam, after you reconnected the disks, the messages about failed async > metadata > writes stops to be logged? > > Any chance you can reliably reproduce it? > > I'm not a xfs journal expert, but it looks like the writeback of items in > AIL > got stuck due the IO errors, and were never completed, but I don't know > what I > should expect after the disk is reconnected. > > In my case though, with upstream kernel, I didn't get a XFS_SHUTDOWN until > I > tried to unmount the filesystem, which differs from this case, where xfs > looks > to have shutdown the filesystem after a few tries to writeback the > metadata. > > Anyway, I can dig more into it this week, if nobody knows what is going on > before I do it :) > > -----Original Message----- > From: Shyam Kaushik [mailto:shyam@zadarastorage.com] > Sent: 22 March 2016 18:32 > To: 'Brian Foster' > Cc: 'xfs@oss.sgi.com'; Alex Lyakas > Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > after disk failure/recovery > > Hi Brian, > > Thanks for your quick reply. I repeated the test & trace-pipe is > constantly filled with this: > > xfsaild/dm-10-3335 [003] ...2 24890.546491: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.546492: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.546493: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.596491: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.596492: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.596494: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.646497: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.646498: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.646500: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.696467: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.746548: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.796479: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 24890.846467: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 24890.846468: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > while regular activity seems to happen on other inodes/kworker threads > > kworker/u8:4-27691 [001] ...1 24895.811474: xfs_writepage: dev 253:10 > ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811477: xfs_invalidatepage: dev > 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > delalloc 1 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811478: xfs_releasepage: dev > 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 > delalloc 0 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811482: xfs_writepage: dev 253:10 > ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811482: xfs_invalidatepage: dev > 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > delalloc 1 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811483: xfs_releasepage: dev > 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 > delalloc 0 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811485: xfs_writepage: dev 253:10 > ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811486: xfs_invalidatepage: dev > 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > delalloc 1 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.811486: xfs_releasepage: dev > 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 > delalloc 0 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812381: xfs_writepage: dev 253:10 > ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812382: xfs_invalidatepage: dev > 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 1000 > delalloc 1 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812382: xfs_releasepage: dev > 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc > 0 unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812385: xfs_writepage: dev 253:10 > ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 > unwritten 0 > kworker/u8:4-27691 [001] ...1 24895.812385: xfs_invalidatepage: dev > 253:10 ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 1000 > delalloc 1 unwritten 0 > > > looks like xfsaild is not able to take lock until hung-task timeout kicks > in > > xfsaild/dm-10-3335 [003] ...2 25247.649468: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 25247.699478: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.699516: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.699517: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > xfsaild/dm-10-3335 [003] ...2 25247.749471: xfs_ilock_nowait: dev > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.749478: xfs_iunlock: dev 253:10 > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > xfsaild/dm-10-3335 [003] ...2 25247.749479: xfs_ail_flushing: dev > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > Please let me know how to debug this further. Thanks. > > --Shyam > -----Original Message----- > From: Brian Foster [mailto:bfoster@redhat.com] > Sent: 22 March 2016 17:49 > To: Shyam Kaushik > Cc: xfs@oss.sgi.com; Alex Lyakas > Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > after disk failure/recovery > > On Tue, Mar 22, 2016 at 04:51:39PM +0530, Shyam Kaushik wrote: > > Hi XFS developers, > > > > We are seeing the following issue with XFS on kernel 3.18.19. > > > > We have XFS mounted over a raw disk. Disk was pulled out manually. There > > were async writes on files that were errored like this > > > ... > > > > And XFS hit metadata & Log IO errors that it decides to shutdown: > > > > Mar 16 16:03:22 host0 kernel: [ 4637.351841] XFS (dm-29): metadata I/O > > error: block 0x3a27fbd0 ("xlog_iodone") error 5 numblks 64 > > Mar 16 16:03:22 host0 kernel: [ 4637.352820] XFS(dm-29): SHUTDOWN!!! > > old_flags=0x0 new_flags=0x2 > > Mar 16 16:03:22 host0 kernel: [ 4637.353187] XFS (dm-29): Log I/O Error > > Detected. Shutting down filesystem > ... > > Later the drive was re-inserted back. After the drive was re-inserted, > XFS > > was attempted to be unmounted > > > > Mar 16 16:16:53 host0 controld: [2557] [ ] umount[202] > > : umount(/sdisk/vol5b0, xfs) > > > > But nothing happens except for the 30-secs xfs_log_force errors that > keeps > > repeating > > > ... > > > > This problem doesn't happen consistently, but happens periodically with > a > > drive failure/recovery followed by XFS unmount. I couldn't find this > issue > > fixed in later kernels. Can you please suggest how I can debug this > issue > > further? > > > > Similar problems have been reproduced due to racy/incorrect EFI/EFD > object tracking, which are internal data structures associated with > freeing extents. > > What happens if you enable tracepoints while the fs is in this hung > unmount state? > > # trace-cmd start -e "xfs:*" > # cat /sys/kernel/debug/tracing/trace_pipe > > Brian > > > Thanks! > > > > --Shyam > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Apr 8 14:00:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3CB1B7CA0 for ; Fri, 8 Apr 2016 14:00:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0E6FC8F8050 for ; Fri, 8 Apr 2016 12:00:21 -0700 (PDT) X-ASG-Debug-ID: 1460142015-04cb6c24623663a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YDNX3XC8gpUT65tf (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 08 Apr 2016 12:00:16 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B780065414; Fri, 8 Apr 2016 19:00:15 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-153.bos.redhat.com [10.18.41.153]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u38J0FJF020863; Fri, 8 Apr 2016 15:00:15 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id C4D43125438; Fri, 8 Apr 2016 15:00:13 -0400 (EDT) Date: Fri, 8 Apr 2016 15:00:13 -0400 From: Brian Foster To: Shyam Kaushik Cc: Alex Lyakas , xfs@oss.sgi.com Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Message-ID: <20160408190013.GD30614@bfoster.bfoster> X-ASG-Orig-Subj: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery References: <20160322121922.GA53693@bfoster.bfoster> <232dd85fde11d4ef1625f070eabfd167@mail.gmail.com> <20160408131658.GB30614@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Fri, 08 Apr 2016 19:00:15 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460142016 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Apr 08, 2016 at 11:18:42PM +0530, Shyam Kaushik wrote: > Hi Dave, Brian, Carlos, > > I think I see the problem. The problem is when the device just starts to > return IO errors & not shutdown yet that buf could get returned with IO > error. We mark it with XBF_WRITE_FAIL & re-submit the IO. But this IO > could fail again & at this point since we already have XBF_WRITE_FAIL we > dont submit the buf, but leave it in a bad state. > > w.r.t. trace-buffer > > we have xfs_buf_iodone_callbacks() called with bp->b_error & its an async > IO. So we mark XBF_WRITE_FAIL on the buf & do xfs_buf_submit() > > kworker/2:1H-163 [002] ...1 7513.493658: xfs_buf_item_iodone_async: > dev 253:11 bno 0x2571850 nblks 0x10 hold 2 pincount 0 lock 0 flags > ASYNC|DONE|PAGES caller xfs_buf_ioend [xfs] > > but then this again fails & comes back to the same call, but this time > with XBF_WRITE_FAIL set & in this case unfortunately we just do > xfs_buf_relse() & there is no callback flow that is going through. > > kworker/2:1H-163 [002] ...1 7513.494385: xfs_buf_item_iodone_async: > dev 253:11 bno 0x2571850 nblks 0x10 hold 2 pincount 0 lock 0 flags > ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_ioend [xfs] > > Do you think this is the problem? > No, there are two separate things going on here. The WRITE_FAIL thing stuck out to me as well when Carlos and I were reading through some of the code. IIRC, the write fail bit is intended to deal with transient storage errors. So if the I/O returns with an error, we resubmit it once before actually completing the I/O (and thus propagating the error up the stack). If the retry attempt still returns an error, we simply release the buffer and leave it on the AIL. The next go around sees the failed state on the buffer, warns about the repeatedly failing async write (see xfs_buf_item_push()) and starts the whole sequence over again. The question I have is why does this buffer remain on the AIL if the filesystem has indeed shutdown. IIRC, Dave's original patch addressed the umount hang due to failing I/O problem by forcing a shutdown in that context. I don't see how that helps us if the fs is already shutdown, however. :/ Brian > There are several bufs that got hit like this. Here is complete trace for > one such buf > > xfsaild/dm-11-22098 [002] ...2 7484.466616: xfs_buf_trylock: dev > 253:11 bno 0x25718d0 nblks 0x10 hold 1 pincount 0 lock 0 flags DONE|PAGES > caller xfs_buf_item_push > [xfs] > xfsaild/dm-11-22098 [002] ...2 7484.466616: xfs_buf_item_push: dev > 253:11 bno 0x25718d0 len 0x2000 hold 1 pincount 0 lock 0 flags DONE|PAGES > recur 0 refcount 0 bli > flags DIRTY|INODE_ALLOC lidesc 0x (null) liflags IN_AIL > xfsaild/dm-11-22098 [002] ...2 7484.466616: xfs_buf_delwri_queue: dev > 253:11 bno 0x25718d0 nblks 0x10 hold 1 pincount 0 lock 0 flags DONE|PAGES > caller xfs_buf_item > _push [xfs] > xfsaild/dm-11-22098 [002] ...2 7484.466617: xfs_buf_unlock: dev 253:11 > bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 1 flags > DONE|PAGES|DELWRI_Q caller xfs_buf_i > tem_push [xfs] > xfsaild/dm-11-22098 [002] ...1 7484.466765: xfs_buf_trylock: dev > 253:11 bno 0x25718d0 nblks 0x10 hold 3 pincount 0 lock 0 flags > DONE|PAGES|DELWRI_Q caller _xfs_buf > _find [xfs] > xfsaild/dm-11-22098 [002] ...1 7484.466765: xfs_buf_find: dev 253:11 > bno 0x25718d0 len 0x2000 hold 3 pincount 0 lock 0 flags > READ|TRYLOCK|UNMAPPED caller xfs_buf_g > et_map [xfs] > xfsaild/dm-11-22098 [002] ...1 7484.466766: xfs_buf_get: dev 253:11 > bno 0x25718d0 len 0x2000 hold 3 pincount 0 lock 0 flags > READ|TRYLOCK|UNMAPPED caller xfs_buf_re > ad_map [xfs] > xfsaild/dm-11-22098 [002] ...1 7484.466766: xfs_buf_read: dev 253:11 > bno 0x25718d0 len 0x2000 hold 3 pincount 0 lock 0 flags > READ|TRYLOCK|UNMAPPED caller xfs_trans > _read_buf_map [xfs] > xfsaild/dm-11-22098 [002] ...1 7484.466792: xfs_buf_delwri_queued: dev > 253:11 bno 0x25718d0 nblks 0x10 hold 3 pincount 0 lock 0 flags > DONE|PAGES|DELWRI_Q caller xf > s_inode_item_push [xfs] > xfsaild/dm-11-22098 [002] ...1 7484.466792: xfs_buf_unlock: dev 253:11 > bno 0x25718d0 nblks 0x10 hold 3 pincount 0 lock 1 flags > DONE|PAGES|DELWRI_Q caller xfs_inode > _item_push [xfs] > xfsaild/dm-11-22098 [002] ...1 7484.466792: xfs_buf_rele: dev 253:11 > bno 0x25718d0 nblks 0x10 hold 3 pincount 0 lock 1 flags > DONE|PAGES|DELWRI_Q caller xfs_inode_i > tem_push [xfs] > xfsaild/dm-11-22098 [002] ...1 7484.467962: xfs_buf_trylock: dev > 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags > DONE|PAGES|DELWRI_Q caller __xfs_bu > f_delwri_submit [xfs] > xfsaild/dm-11-22098 [002] ...1 7484.467962: xfs_buf_delwri_split: dev > 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags > DONE|PAGES|DELWRI_Q caller xfs > _buf_delwri_submit_nowait [xfs] > xfsaild/dm-11-22098 [002] ...1 7484.469864: xfs_buf_submit: dev 253:11 > bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags > WRITE|ASYNC|DONE|PAGES caller __xfs_buf_delwri_submit [xfs] > xfsaild/dm-11-22098 [002] ...1 7484.469864: xfs_buf_hold: dev 253:11 > bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags > WRITE|ASYNC|DONE|PAGES caller xfs_buf_submit [xfs] > xfsaild/dm-11-22098 [002] ...1 7484.469868: xfs_buf_rele: dev 253:11 > bno 0x25718d0 nblks 0x10 hold 3 pincount 0 lock 0 flags > WRITE|ASYNC|DONE|PAGES caller xfs_buf_submit [xfs] > kworker/2:1H-163 [002] ...1 7513.493754: xfs_buf_iodone: dev 253:11 > bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags > WRITE|ASYNC|DONE|PAGES caller xfs_buf_ioend_work [xfs] > kworker/2:1H-163 [002] ...1 7513.493754: xfs_buf_ioerror: dev > 253:11 bno 0x25718d0 len 0x2000 hold 2 pincount 0 lock 0 error -5 flags > ASYNC|DONE|PAGES caller xfs_buf_ioend_work [xfs] > kworker/2:1H-163 [002] ...1 7513.493754: xfs_buf_item_iodone_async: > dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags > ASYNC|DONE|PAGES caller xfs_buf_ioend [xfs] > kworker/2:1H-163 [002] ...1 7513.493754: xfs_buf_ioerror: dev > 253:11 bno 0x25718d0 len 0x2000 hold 2 pincount 0 lock 0 error 0 flags > ASYNC|DONE|PAGES caller xfs_buf_iodone_callbacks [xfs] > kworker/2:1H-163 [002] ...1 7513.493755: xfs_buf_submit: dev 253:11 > bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags > WRITE|ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_iodone_callbacks [xfs] > kworker/2:1H-163 [002] ...1 7513.493755: xfs_buf_hold: dev 253:11 > bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags > WRITE|ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_submit [xfs] > kworker/2:1H-163 [002] ...1 7513.493766: xfs_buf_rele: dev 253:11 > bno 0x25718d0 nblks 0x10 hold 3 pincount 0 lock 0 flags > WRITE|ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_submit [xfs] > kworker/2:1H-163 [002] ...1 7513.494398: xfs_buf_iodone: dev 253:11 > bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags > WRITE|ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_ioend_work [xfs] > kworker/2:1H-163 [002] ...1 7513.494398: xfs_buf_ioerror: dev > 253:11 bno 0x25718d0 len 0x2000 hold 2 pincount 0 lock 0 error -5 flags > ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_ioend_work [xfs] > kworker/2:1H-163 [002] ...1 7513.494398: xfs_buf_item_iodone_async: > dev 253:11 bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 0 flags > ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_ioend [xfs] > kworker/2:1H-163 [002] ...1 7513.494398: xfs_buf_ioerror: dev > 253:11 bno 0x25718d0 len 0x2000 hold 2 pincount 0 lock 0 error 0 flags > ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_iodone_callbacks [xfs] > kworker/2:1H-163 [002] ...1 7513.494399: xfs_buf_unlock: dev 253:11 > bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 1 flags > ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_iodone_callbacks [xfs] > kworker/2:1H-163 [002] ...1 7513.494399: xfs_buf_rele: dev 253:11 > bno 0x25718d0 nblks 0x10 hold 2 pincount 0 lock 1 flags > ASYNC|DONE|WRITE_FAIL|PAGES caller xfs_buf_iodone_callbacks [xfs] > > > as seen above the first time buf hits ioerror we retry, but the 2nd time > we give it up without finishing the buf. Its in a stuck state & this keeps > xfsaild thread busy when unmounting trying to flush it out. > > Thanks. > > --Shyam > -----Original Message----- > From: Shyam Kaushik [mailto:shyam@zadarastorage.com] > Sent: 08 April 2016 19:05 > To: 'Brian Foster' > Cc: 'david@fromorbit.com'; 'xfs@oss.sgi.com'; Alex Lyakas > Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > after disk failure/recovery > > Hi Brian, > > Yes the below report is a bit different than the original report. I wanted > to confirm if the new patches from Dave will see these odd > crashes/hung-task. > > I applied Dave's patch & managed to recreate the original issue. With > systemtap I do see that FS has been marked for shutdown (xfs_aildpush() - > mp:0xffff880062d09800 m_flags:4325656), but still the infinite tries keep > happening with xfsaild_push() seeing XFS_IFLOCK on the inode. Pls note > that this issue happens only when I see > > XFS (dm-10): Detected failing async write on buffer block 0x368d76a0. > Retrying async write. > > in the logs. In all other cases, this problem doesn't happen. So there is > something with this async-write retries that is leaving the state of the > inode with IFLOCK that rest of aildpush is not able to handle. > > --Shyam > > -----Original Message----- > From: Brian Foster [mailto:bfoster@redhat.com] > Sent: 08 April 2016 18:47 > To: Shyam Kaushik > Cc: david@fromorbit.com; xfs@oss.sgi.com; Alex Lyakas > Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > after disk failure/recovery > > On Fri, Apr 08, 2016 at 04:21:02PM +0530, Shyam Kaushik wrote: > > Hi Dave, Brian, Carlos, > > > > While trying to reproduce this issue I have been running into different > > issues that are similar. Underlying issue remains the same when backend > to > > XFS is failed & we unmount XFS, we run into hung-task timeout (180-secs) > > with stack like > > > > kernel: [14952.671131] [] > > xfs_ail_push_all_sync+0xa9/0xe0 [xfs] > > kernel: [14952.671139] [] ? > > prepare_to_wait_event+0x110/0x110 > > kernel: [14952.671181] [] xfs_unmountfs+0x61/0x1a0 > > [xfs] > > > > while running trace-events, XFS ail push keeps looping around > > > > xfsaild/dm-10-21143 [001] ...2 17878.555133: xfs_ilock_nowait: dev > > 253:10 ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-21143 [001] ...2 17878.555138: xfs_iunlock: dev 253:10 > > ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-21143 [001] ...2 17878.555138: xfs_ail_push: dev 253:10 > > lip 0xffff880031f6ae40 lsn 1/73448 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-21143 [001] ...2 17878.605136: xfs_ilock_nowait: dev > > 253:10 ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-21143 [001] ...2 17878.605141: xfs_iunlock: dev 253:10 > > ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-21143 [001] ...2 17878.605142: xfs_ail_push: dev 253:10 > > lip 0xffff880031f6ae40 lsn 1/73448 type XFS_LI_INODE flags IN_AIL > > > > observe ino==0x0 (its a freed inode) but the corresponding lip stays > with > > xfsaild push. I had run a systemtap when this problem happened & the > > following keeps repeating. > > > > That's interesting, and looks different from the original report in > terms of the inode number being cleared. The original report looks like > it has a valid inode and there's some problematic sequence where it's > not being removed from the AIL in the event of errors. > > I think at this point we know that XFS attempts to retry these I/Os > indefinitely. Dave has outstanding patches to deal with this issue. The > question Dave raised above was whether the filesystem shut down, and if > not, why (as a failed log I/O should cause a shutdown)? Carlos was > looking into this it appears... > > > xfs_inode_item_push() - inode:0xffff88003d8ca000 m_flags:0x420118 > > flags:0x1 > > xfs_iflush() - inode:ffff88003d8ca000 aborting for forced shutdown > > xfs_iflush_abort() - iip:0x0 > > > > xfs_inode_item_push() is doing xfs_iflush() but it sees FS_SHUTDOWN flag > > marked & does an xfs_iflush_abort().xfs_iflush_abort() sees > i_itemp==NULL > > on the lip & doesn't do anything. So we have this stale lip that is not > > associated to inode anymore that keeps xfs_ail_push_all_sync() busy. > > > > On few other occurrences, i have had NULL pointer/dereference or other > > sorts of crashes at this line > > > > xfsaild_push() > > lock_result = lip->li_ops->iop_push(lip, > > &ailp->xa_buf_list); > > > > with debug prints, in one of the occurrence lip->li_ops was NULL & in > > another lip->li_ops was pointing to a bad pointer that subsequent > > dereference crashed it. This also indicates that a bad/freed lip was > > inserted that xfsaild_push() is working. > > > > I hit upon Dave's patch "xfs: xfs_inode_free() isn't RCU safe" & > realized > > that this could explain the above issue where a lip that has been freed > is > > wrongly referenced & later we could even have the inode disconnected. > What > > do you think? > > > > In any case I uploaded the full xfs trace events before this issue > started > > & till the end. It is at > > https://www.dropbox.com/s/21qstz4ld1gn8yi/xfs_trace_pipe.gz?dl=0 > > > > It seems like it could be related. I didn't catch anything obvious from > the trace, but there's a lot of data there. The RCU-unsafe issue was > difficult to track down without instrumentation.. I'm not sure that will > be evident from the trace. The best thing to do wrt to that might be to > try with Dave's patches, as that so far appears to address the problem. > (In fact, it might be worth it to try Dave's shutdown on umount patch > he referred to up-thread to address the original problem as well). > > Brian > > > Pls let me know. Thanks. > > > > --Shyam > > > > -----Original Message----- > > From: Shyam Kaushik [mailto:shyam@zadarastorage.com] > > Sent: 23 March 2016 15:23 > > To: 'Brian Foster' > > Cc: 'xfs@oss.sgi.com'; Alex Lyakas > > Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > > after disk failure/recovery > > > > Hi Carlos, > > > > w.r.t. your question below > > > > >>> Shyam, after you reconnected the disks, the messages about failed > > async metadata > > >>> writes stops to be logged? > > > > After I reconnect the disks, messages about failed async metadata writes > > stops to be logged. But the key thing is messages like > > > > XFS (dm-29): xfs_log_force: error -5 returned > > > > Keeps repeating every 30-secs which indicates that there is some buf/io > > error status that is being carried forward. > > > > >>> Any chance you can reliably reproduce it? > > > > Yes I have a way to reproduce it, but its not reliable. What I do is > setup > > a dm-linear over a disk. Create XFS, mount & trigger few copy threads to > > copy varying sized files into the FS. At this point pull out the drive > > (with scsi-remove-single-device in /proc/scsi/scsi) & in a short-while > > convert the dm-linear to dm-ioerror. Then I bring back the underlying > > drive, convert back dm-ioerror to dm-linear & try to unmount XFS. > > > > This problem somehow happens on a newly created XFS. If I copy several > > files into XFS/delete them & then copy them again, repeat the drive > > failure/recovery experiment it doesn't reproduce. > > > > Thanks. > > > > --Shyam > > > > Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > > after disk failure/recovery > > From: Carlos Maiolino > > Date: Tue, 22 Mar 2016 16:38:25 +0100 > > In-reply-to: <20160322140345.GA54245@bfoster.bfoster> > > Mail-followup-to: xfs@xxxxxxxxxxx > > User-agent: Mutt/1.5.24 (2015-08-30) > > > > Hi Brian, > > > > These traces, and the stack trace presented, looks quite similar with > the > > one we were discussing a few days ago, using a dm-thin snapshot. > > > > Looks like with the same bug I've been hunting and Shyam confirmed my > > hypothesis > > of this bug be able to be reproduced with a regular device. > > > > If it's the same bug, yes, I reproduced it using upstream kernel. > > > > The difference between both (this bug and the one I've been working on) > is > > how > > xfs actually behaves when async metadata writes fail. Other than that, > it > > pretty > > much looks the same. > > > > Trying to unmount the filesystem hungs in xfs_log_force(), well, > basically > > the > > reason I submitted the patch to include the caller into xfs_log_force > > trace. I'd > > like to see ftrace traces from this system with that patch if possible. > > > > I didn't have time to keep working on this for the past few days, but > > looks like > > it's time to come back to it. > > > > Shyam, after you reconnected the disks, the messages about failed async > > metadata > > writes stops to be logged? > > > > Any chance you can reliably reproduce it? > > > > I'm not a xfs journal expert, but it looks like the writeback of items > in > > AIL > > got stuck due the IO errors, and were never completed, but I don't know > > what I > > should expect after the disk is reconnected. > > > > In my case though, with upstream kernel, I didn't get a XFS_SHUTDOWN > until > > I > > tried to unmount the filesystem, which differs from this case, where xfs > > looks > > to have shutdown the filesystem after a few tries to writeback the > > metadata. > > > > Anyway, I can dig more into it this week, if nobody knows what is going > on > > before I do it :) > > > > -----Original Message----- > > From: Shyam Kaushik [mailto:shyam@zadarastorage.com] > > Sent: 22 March 2016 18:32 > > To: 'Brian Foster' > > Cc: 'xfs@oss.sgi.com'; Alex Lyakas > > Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > > after disk failure/recovery > > > > Hi Brian, > > > > Thanks for your quick reply. I repeated the test & trace-pipe is > > constantly filled with this: > > > > xfsaild/dm-10-3335 [003] ...2 24890.546491: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.546492: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.546493: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 24890.596491: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.596492: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.596494: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 24890.646497: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.646498: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.646500: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 24890.696467: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.696468: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 24890.746548: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.746550: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 24890.796479: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.796480: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 24890.846467: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 24890.846468: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > > > > while regular activity seems to happen on other inodes/kworker threads > > > > kworker/u8:4-27691 [001] ...1 24895.811474: xfs_writepage: dev > 253:10 > > ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > > unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811477: xfs_invalidatepage: dev > > 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > > delalloc 1 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811478: xfs_releasepage: dev > > 253:10 ino 0x1801061 pgoff 0x29000 size 0x1aebbc offset 0 length 0 > > delalloc 0 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811482: xfs_writepage: dev > 253:10 > > ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > > unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811482: xfs_invalidatepage: dev > > 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > > delalloc 1 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811483: xfs_releasepage: dev > > 253:10 ino 0x4017bdf pgoff 0x29000 size 0x1aebbc offset 0 length 0 > > delalloc 0 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811485: xfs_writepage: dev > 253:10 > > ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 delalloc 1 > > unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811486: xfs_invalidatepage: dev > > 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 1000 > > delalloc 1 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.811486: xfs_releasepage: dev > > 253:10 ino 0x68048c3 pgoff 0x29000 size 0x1aebbc offset 0 length 0 > > delalloc 0 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.812381: xfs_writepage: dev > 253:10 > > ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 > > unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.812382: xfs_invalidatepage: dev > > 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 1000 > > delalloc 1 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.812382: xfs_releasepage: dev > > 253:10 ino 0x1805e37 pgoff 0x29000 size 0x68470 offset 0 length 0 > delalloc > > 0 unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.812385: xfs_writepage: dev > 253:10 > > ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 0 delalloc 1 > > unwritten 0 > > kworker/u8:4-27691 [001] ...1 24895.812385: xfs_invalidatepage: dev > > 253:10 ino 0x4019c95 pgoff 0x29000 size 0x68470 offset 0 length 1000 > > delalloc 1 unwritten 0 > > > > > > looks like xfsaild is not able to take lock until hung-task timeout > kicks > > in > > > > xfsaild/dm-10-3335 [003] ...2 25247.649468: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 25247.649469: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 25247.699478: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 25247.699516: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 25247.699517: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > xfsaild/dm-10-3335 [003] ...2 25247.749471: xfs_ilock_nowait: dev > > 253:10 ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 25247.749478: xfs_iunlock: dev 253:10 > > ino 0xc0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > xfsaild/dm-10-3335 [003] ...2 25247.749479: xfs_ail_flushing: dev > > 253:10 lip 0xffff8800a9f437b8 lsn 1/38624 type XFS_LI_INODE flags IN_AIL > > > > Please let me know how to debug this further. Thanks. > > > > --Shyam > > -----Original Message----- > > From: Brian Foster [mailto:bfoster@redhat.com] > > Sent: 22 March 2016 17:49 > > To: Shyam Kaushik > > Cc: xfs@oss.sgi.com; Alex Lyakas > > Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS > > after disk failure/recovery > > > > On Tue, Mar 22, 2016 at 04:51:39PM +0530, Shyam Kaushik wrote: > > > Hi XFS developers, > > > > > > We are seeing the following issue with XFS on kernel 3.18.19. > > > > > > We have XFS mounted over a raw disk. Disk was pulled out manually. > There > > > were async writes on files that were errored like this > > > > > ... > > > > > > And XFS hit metadata & Log IO errors that it decides to shutdown: > > > > > > Mar 16 16:03:22 host0 kernel: [ 4637.351841] XFS (dm-29): metadata I/O > > > error: block 0x3a27fbd0 ("xlog_iodone") error 5 numblks 64 > > > Mar 16 16:03:22 host0 kernel: [ 4637.352820] XFS(dm-29): SHUTDOWN!!! > > > old_flags=0x0 new_flags=0x2 > > > Mar 16 16:03:22 host0 kernel: [ 4637.353187] XFS (dm-29): Log I/O > Error > > > Detected. Shutting down filesystem > > ... > > > Later the drive was re-inserted back. After the drive was re-inserted, > > XFS > > > was attempted to be unmounted > > > > > > Mar 16 16:16:53 host0 controld: [2557] [ ] umount[202] > > > : umount(/sdisk/vol5b0, xfs) > > > > > > But nothing happens except for the 30-secs xfs_log_force errors that > > keeps > > > repeating > > > > > ... > > > > > > This problem doesn't happen consistently, but happens periodically > with > > a > > > drive failure/recovery followed by XFS unmount. I couldn't find this > > issue > > > fixed in later kernels. Can you please suggest how I can debug this > > issue > > > further? > > > > > > > Similar problems have been reproduced due to racy/incorrect EFI/EFD > > object tracking, which are internal data structures associated with > > freeing extents. > > > > What happens if you enable tracepoints while the fs is in this hung > > unmount state? > > > > # trace-cmd start -e "xfs:*" > > # cat /sys/kernel/debug/tracing/trace_pipe > > > > Brian > > > > > Thanks! > > > > > > --Shyam > > > > > > _______________________________________________ > > > xfs mailing list > > > xfs@oss.sgi.com > > > http://oss.sgi.com/mailman/listinfo/xfs > > > > _______________________________________________ > > 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 chris.m.moser@seagate.com Fri Apr 8 15:37:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 B727B7CA1 for ; Fri, 8 Apr 2016 15:37:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8DC4A304032 for ; Fri, 8 Apr 2016 13:37:15 -0700 (PDT) X-ASG-Debug-ID: 1460147833-04cb6c2462369fa0001-NocioJ Received: from mx0b-00003501.pphosted.com (mx0b-00003501.pphosted.com [67.231.152.68]) by cuda.sgi.com with ESMTP id b7JE1Q39dTC12CRM (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 08 Apr 2016 13:37:13 -0700 (PDT) X-Barracuda-Envelope-From: chris.m.moser@seagate.com X-Barracuda-Apparent-Source-IP: 67.231.152.68 Received: from pps.filterd (m0075033.ppops.net [127.0.0.1]) by mx0b-00003501.pphosted.com (8.16.0.11/8.16.0.11) with SMTP id u38KXhZg032926 for ; Fri, 8 Apr 2016 16:37:13 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=seagate.com; h=mime-version : date : message-id : subject : from : to : content-type; s=proofpoint; bh=oxOkev4Nxt818Wc7U4g69+OZ7pv+4YOVyO3hSY+vqS8=; b=IGgACpT8AxTKW0WJ2YOFjvXQ4FeuGXrrWYp++5w6sBZLj2SLrzMnWUmL7QBH8fw3smYi 93wHh/wPUNNTpigWZCYvfcim1G5nH7klcg/r7Lp2GoH1RU8WiKa8BZGKmb74j1r0MG3v GEl/aaUDxprO0W9sITs+ynQU7UqbdfR5aLsUig7Tne1Zx2iKdGozckXpzw5pnuzV1bfZ ZuyQcFpql4C8b1MEfP9NG9J4zdN+hC6qte7N7TUDe+izz8oSQDr8OObRY/qwdS0A0Dhx TDbCWeIkMpO9L8YA/9IOFihxUDNJJy0EVOwcvwVM6mBJ7Rt9WnSFoOStbYmpgiiZy0EJ Xg== Received: from mail-io0-f170.google.com (mail-io0-f170.google.com [209.85.223.170]) by mx0b-00003501.pphosted.com with ESMTP id 226ksgg1c2-3 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Fri, 08 Apr 2016 16:37:13 -0400 Received: by mail-io0-f170.google.com with SMTP id g185so145497547ioa.2 for ; Fri, 08 Apr 2016 13:37:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=seagate.com; s=google; h=mime-version:date:message-id:subject:from:to; bh=0pPEMkU8mt5hTCDsB3fi58yFDCwSEZmXynNl5XRPA0Y=; b=Cyfrx5MKuxhi50+/BPaIy8s5bJ9enHPVBCuiruZU4K6FWFJ5cbbUHH+dqnCR4CwY5t XEpuGNXb1K4mN3WaxSUQBBmFfYt7qmyzq22TjKm7c4BUMKTu4Sl7QI6MZGZ26YVOPhyj ZQLt4ZqKfRan7pwcU0Gpy+BNtQJe4lnV3NAeQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to; bh=0pPEMkU8mt5hTCDsB3fi58yFDCwSEZmXynNl5XRPA0Y=; b=arxRRFpyTxJkj2Vkz6BL4B7l/qJjs+ooKC048shxg3PFIRAibMDXb5xb6aCWjWtHfm ieAto59Q77V4RzEASdVD9Zo1K0wQPtGk/fD0xZI1+84YA086sX50TgoiNM23G6Qs77ya OEI0i5eZjJggOjsbZwxwOxYLdSIllMLNpjtNTY3YcCVzh+nsJFmJhJv9PYbrDhkrTnBC C49j+B1c7WeMkQ1Z0SoVKpXcXt4sVKVmzTWHbQPgWHkV2/NnULBsKKp+RvOMknaSMMIQ 1AHOs26ab5dnuCjE6imIW8PbUTm3/8VmRXcuE0R2VaTBifaZUCyQHtBq1AT9LaXUdcvv /WIw== X-Gm-Message-State: AD7BkJL5V/L0ETKhBL+6yXYJBV3Ga5Gia5AQQk16vKhN+Il3kRTzKY5Y99uOloobXz/tIlwL048aRi1rWXEGvAv+rRccrvqu0BrCuGPBDucjp1GOmnMOZ0edDnJofkvyXiNJlQkMq1nmyQMXhMFNHSKX7OCjoX41WcMU85Hwv8Y= X-Received: by 10.107.8.99 with SMTP id 96mr11919228ioi.60.1460147832918; Fri, 08 Apr 2016 13:37:12 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.107.8.99 with SMTP id 96mr11919219ioi.60.1460147832740; Fri, 08 Apr 2016 13:37:12 -0700 (PDT) Received: by 10.107.192.67 with HTTP; Fri, 8 Apr 2016 13:37:12 -0700 (PDT) Date: Fri, 8 Apr 2016 15:37:12 -0500 Message-ID: Subject: Use latest xfs_repair on older file systems From: Chris M Moser X-ASG-Orig-Subj: Use latest xfs_repair on older file systems To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a113f2b4ce3ffd8052fff285a X-Proofpoint-PolicyRoute: Outbound X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2016-04-08_11:,, signatures=0 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 suspectscore=3 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1603180000 definitions=main-1604080303 X-Proofpoint-Spam-Policy: Default Domain Policy X-Barracuda-Connect: mx0b-00003501.pphosted.com[67.231.152.68] X-Barracuda-Start-Time: 1460147833 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28560 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 --001a113f2b4ce3ffd8052fff285a Content-Type: text/plain; charset=UTF-8 Hello, I have a file system that experienced issues and would not mount. The system would not boot either as this file system was listed in /etc/fstab. I booted to a debian image with xfsprogs 3.2.1 and ran xfs_repair The host OS now boots and the file system mounts but has only a handful of the original files. I unmounted and ran xfs_repair 2.9.4 form the host OS a few more times. (I read somewhere that running xfs_repair multiple times can find more files) I still see the same handful of files. A previous thread (http://oss.sgi.com/archives/xfs/2014-06/msg00204.html) suggests running the latest xfs_repair as it may be able to reattach more files. I booted to a fedora 23 live image and updated xfsprogs to 4.5.0. (openSUSE Tumbleweed has xfsprogs 4.5.0 but I was not able to get their live image working) When running xfs_repair on the file system it complains: xfs_repair: V1 inodes unsupported. Please try an older xfsporgs. Is it reasonable to assume that xfs_repair has done all it can and I should now use photorec from the testdisk package to recover what I can? Thank you for your feedback. -Chris -- Christopher M Moser Seagate Technology LLC Cluster Lab Administrator NRM Bldg A/A1-3 chris.m.moser@seagate.com 952-402-8269 --001a113f2b4ce3ffd8052fff285a Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
    Hello,

    I h= ave a file system that experienced issues and would not mount. The system w= ould not boot either as this file system was listed in /etc/fstab.
    I booted to a debian image with xfsprogs 3.2.1 and ran xfs_repair

    <= /div>The host OS now boots and the file system mounts but has only a handfu= l of the original files.
    I unmounted and ran xfs_repair 2.9.4 form= the host OS a few more times. (I read somewhere that running xfs_repair mu= ltiple times can find more files) I still see the same handful of files.

    A previous thread (http://oss.sgi.com/archives/xfs/2014-06/msg00204= .html) suggests running the latest xfs_repair as it may be able to reat= tach more files.

    I booted to a fedora 23 live image and update= d xfsprogs to 4.5.0. (openSUSE Tumbleweed has xfsprogs 4.5.0 but I was not = able to get their live image working) When running xfs_repair on the file s= ystem it complains: xfs_repair: V1 inodes unsupported. Please try an older xfspor= gs.

    Is it= reasonable to assume that xfs_repair has done all it can and I should now = use photorec from the testdisk package to recover what I can?

    =
    Thank you for your feedback.

    -Chris
    --
    Christopher M Moser

    Seagate Technology LLCCluster Lab Administrator
    NRM Bldg A/A1-3
    chris.m.= moser@seagate.com
    952-402-8269

    --001a113f2b4ce3ffd8052fff285a-- From vapier@gentoo.org Fri Apr 8 15:43:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1BEB57CA7 for ; Fri, 8 Apr 2016 15:43:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E6E8B304059 for ; Fri, 8 Apr 2016 13:43:30 -0700 (PDT) X-ASG-Debug-ID: 1460148207-04cbb02e1a3a210001-NocioJ Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by cuda.sgi.com with ESMTP id EW6BXC6iCVs6jIPi (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 08 Apr 2016 13:43:27 -0700 (PDT) X-Barracuda-Envelope-From: vapier@gentoo.org X-Barracuda-Apparent-Source-IP: 140.211.166.183 Received: from localhost.localdomain (localhost [127.0.0.1]) by smtp.gentoo.org (Postfix) with ESMTP id 78DFC3405D5 for ; Fri, 8 Apr 2016 20:43:26 +0000 (UTC) From: Mike Frysinger To: xfs@oss.sgi.com Subject: [PATCH xfsprogs] po: respect LINGUAS build setting Date: Fri, 8 Apr 2016 16:43:23 -0400 X-ASG-Orig-Subj: [PATCH xfsprogs] po: respect LINGUAS build setting Message-Id: <1460148203-32442-1-git-send-email-vapier@gentoo.org> X-Mailer: git-send-email 2.7.4 X-Barracuda-Connect: smtp.gentoo.org[140.211.166.183] X-Barracuda-Start-Time: 1460148207 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28560 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- It is common gettext practice to limit the translations a particular package will include by setting the LINGUAS environment variable. Signed-off-by: Mike Frysinger --- po/Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/po/Makefile b/po/Makefile index edf92ad..a5250b3 100644 --- a/po/Makefile +++ b/po/Makefile @@ -6,7 +6,10 @@ TOPDIR = .. include $(TOPDIR)/include/builddefs POTHEAD = $(PKG_NAME).pot -LINGUAS = de pl +# If the user has requested a specific set of translations, only build those. +SUPPORTED_LINGUAS = $(patsubst %.po,%,$(wildcard *.po)) +LINGUAS ?= $(SUPPORTED_LINGUAS) +LINGUAS := $(filter $(SUPPORTED_LINGUAS),$(LINGUAS)) LSRCFILES = $(LINGUAS:%=%.po) LDIRT = $(POTHEAD) -- 2.7.4 From vapier@gentoo.org Fri Apr 8 15:44:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 508667CA7 for ; Fri, 8 Apr 2016 15:44:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id AAE16AC003 for ; Fri, 8 Apr 2016 13:44:02 -0700 (PDT) X-ASG-Debug-ID: 1460148237-04cbb02e1d3a260001-NocioJ Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by cuda.sgi.com with ESMTP id M3zlXr8I5aCiU3ua (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 08 Apr 2016 13:43:57 -0700 (PDT) X-Barracuda-Envelope-From: vapier@gentoo.org X-Barracuda-Apparent-Source-IP: 140.211.166.183 Received: from localhost.localdomain (localhost [127.0.0.1]) by smtp.gentoo.org (Postfix) with ESMTP id 1E0EB3405D5 for ; Fri, 8 Apr 2016 20:43:57 +0000 (UTC) From: Mike Frysinger To: xfs@oss.sgi.com Subject: [PATCH xfsprogs] configure: add mailing list contact Date: Fri, 8 Apr 2016 16:43:55 -0400 X-ASG-Orig-Subj: [PATCH xfsprogs] configure: add mailing list contact Message-Id: <1460148235-32611-1-git-send-email-vapier@gentoo.org> X-Mailer: git-send-email 2.7.4 X-Barracuda-Connect: smtp.gentoo.org[140.211.166.183] X-Barracuda-Start-Time: 1460148237 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28560 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Mike Frysinger --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index d44438f..7d4b155 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,4 @@ -AC_INIT([xfsprogs], [4.5.0]) +AC_INIT([xfsprogs], [4.5.0], [xfs@oss.sgi.com]) AC_PREREQ(2.50) AC_CONFIG_AUX_DIR([.]) AC_CONFIG_MACRO_DIR([m4]) -- 2.7.4 From sandeen@sandeen.net Fri Apr 8 15:49:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1BACA7CA7 for ; Fri, 8 Apr 2016 15:49:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E3BB98F8052 for ; Fri, 8 Apr 2016 13:49:20 -0700 (PDT) X-ASG-Debug-ID: 1460148558-04cb6c246436a780001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id HNjM8SQHYsHARC2R for ; Fri, 08 Apr 2016 13:49:18 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id A411316C16D for ; Fri, 8 Apr 2016 15:49:17 -0500 (CDT) Subject: Re: Use latest xfs_repair on older file systems To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Use latest xfs_repair on older file systems References: From: Eric Sandeen Message-ID: <5708194D.4080406@sandeen.net> Date: Fri, 8 Apr 2016 15:49:17 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1460148558 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28561 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/8/16 3:37 PM, Chris M Moser wrote: > Hello, > > I have a file system that experienced issues and would not mount. The > system would not boot either as this file system was listed in > /etc/fstab. I booted to a debian image with xfsprogs 3.2.1 and ran > xfs_repair > > The host OS now boots and the file system mounts but has only a > handful of the original files. I unmounted and ran xfs_repair 2.9.4 > form the host OS a few more times. (I read somewhere that running > xfs_repair multiple times can find more files) I still see the same > handful of files. > > A previous thread > (http://oss.sgi.com/archives/xfs/2014-06/msg00204.html) suggests > running the latest xfs_repair as it may be able to reattach more > files. > > I booted to a fedora 23 live image and updated xfsprogs to 4.5.0. > (openSUSE Tumbleweed has xfsprogs 4.5.0 but I was not able to get > their live image working) When running xfs_repair on the file system > it complains: xfs_repair: V1 inodes unsupported. Please try an older > xfsporgs. > > Is it reasonable to assume that xfs_repair has done all it can and I > should now use photorec from the testdisk package to recover what I > can? Yes, unfortunately. In general, using the latest xfs_repair is a good idea. And in general, a single pass of xfs_repair should be enough. In some cases, there are features which only newer xfs_repair understands - but older versions should simply refuse to run in that case. Obsolete features do occasionally get dropped upstream, as well - witness your V1 inode message. However, that was likely just some other form of corruption, seen as V1 inodes, unless this really was a very, very old filesystem (created prior to 2007), which seems unlikely. It sounds like you experienced some very severe corruption; if that is the case, you might start by making sure your storage devices are in decent shape. Oh, and look in lost+found, if most files seem to be "gone" - they may be there. -Eric > Thank you for your feedback. > > -Chris > > -- > Christopher M Moser > > Seagate Technology LLC > Cluster Lab Administrator > NRM Bldg A/A1-3 > chris.m.moser@seagate.com > 952-402-8269 > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From vapier@gentoo.org Fri Apr 8 15:51:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 802E07CAF for ; Fri, 8 Apr 2016 15:51:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4944D304032 for ; Fri, 8 Apr 2016 13:51:08 -0700 (PDT) X-ASG-Debug-ID: 1460148665-04bdf011033652f0001-NocioJ Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by cuda.sgi.com with ESMTP id xcoPmO1DtRDKHFUL (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 08 Apr 2016 13:51:06 -0700 (PDT) X-Barracuda-Envelope-From: vapier@gentoo.org X-Barracuda-Apparent-Source-IP: 140.211.166.183 Received: from localhost.localdomain (localhost [127.0.0.1]) by smtp.gentoo.org (Postfix) with ESMTP id 4BFF7340B3A for ; Fri, 8 Apr 2016 20:51:05 +0000 (UTC) From: Mike Frysinger To: xfs@oss.sgi.com Subject: [PATCH xfsdump] po: respect LINGUAS build setting Date: Fri, 8 Apr 2016 16:51:03 -0400 X-ASG-Orig-Subj: [PATCH xfsdump] po: respect LINGUAS build setting Message-Id: <1460148663-23227-1-git-send-email-vapier@gentoo.org> X-Mailer: git-send-email 2.7.4 X-Barracuda-Connect: smtp.gentoo.org[140.211.166.183] X-Barracuda-Start-Time: 1460148666 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28561 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- It is common gettext practice to limit the translations a particular package will include by setting the LINGUAS environment variable. Signed-off-by: Mike Frysinger --- po/Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/po/Makefile b/po/Makefile index 6d40324..48a19c1 100644 --- a/po/Makefile +++ b/po/Makefile @@ -6,7 +6,10 @@ TOPDIR = .. include $(TOPDIR)/include/builddefs POTHEAD = $(PKG_NAME).pot -LINGUAS = de pl +# If the user has requested a specific set of translations, only build those. +SUPPORTED_LINGUAS = $(patsubst %.po,%,$(wildcard *.po)) +LINGUAS ?= $(SUPPORTED_LINGUAS) +LINGUAS := $(filter $(SUPPORTED_LINGUAS),$(LINGUAS)) LSRCFILES = $(LINGUAS:%=%.po) LDIRT = $(POTHEAD) -- 2.7.4 From vapier@gentoo.org Fri Apr 8 15:51:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 058A27CAF for ; Fri, 8 Apr 2016 15:51:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CB82C8F8054 for ; Fri, 8 Apr 2016 13:51:09 -0700 (PDT) X-ASG-Debug-ID: 1460148668-04cbb02e1a3a550001-NocioJ Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by cuda.sgi.com with ESMTP id vhdfXWiiF7JTqCCr (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 08 Apr 2016 13:51:08 -0700 (PDT) X-Barracuda-Envelope-From: vapier@gentoo.org X-Barracuda-Apparent-Source-IP: 140.211.166.183 Received: from localhost.localdomain (localhost [127.0.0.1]) by smtp.gentoo.org (Postfix) with ESMTP id B76B8340BA2 for ; Fri, 8 Apr 2016 20:51:07 +0000 (UTC) From: Mike Frysinger To: xfs@oss.sgi.com Subject: [PATCH xfsdump] configure: add mailing list contact Date: Fri, 8 Apr 2016 16:51:06 -0400 X-ASG-Orig-Subj: [PATCH xfsdump] configure: add mailing list contact Message-Id: <1460148666-23271-1-git-send-email-vapier@gentoo.org> X-Mailer: git-send-email 2.7.4 X-Barracuda-Connect: smtp.gentoo.org[140.211.166.183] X-Barracuda-Start-Time: 1460148668 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28561 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Mike Frysinger --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 7bb6f1d..39aaf25 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,4 @@ -AC_INIT([xfsdump], [3.1.6]) +AC_INIT([xfsdump], [3.1.6], [xfs@oss.sgi.com]) AC_PREREQ(2.50) AC_CONFIG_AUX_DIR([.]) AC_CONFIG_MACRO_DIR([m4]) -- 2.7.4 From david@fromorbit.com Fri Apr 8 17:17:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 968227CB8 for ; Fri, 8 Apr 2016 17:17:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6B5C68F8052 for ; Fri, 8 Apr 2016 15:17:12 -0700 (PDT) X-ASG-Debug-ID: 1460153828-04cbb02e1a3d710001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id dM13wEBZvDynvQ1l for ; Fri, 08 Apr 2016 15:17:08 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AZFQB4LQhXPDGaLHlcgzdTfaY7AQEBAQEBBowRg0+CGYQQIYVmAgIBAQKBM00BAQEBAQEHAQEBAUJAhEEBAQEDAScTHCMFCwgDDgoJJQ8FJQMHGhOIHwcPwG4BAQEBAQUBAQEBHBmFP4UTgl6BRoNGgisFmASFd4gLjxdFjmCCZhmBXCowAYd8gTwBAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail05.adl6.internode.on.net with ESMTP; 09 Apr 2016 07:47:06 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aoeiA-0002M9-Ho; Sat, 09 Apr 2016 08:17:06 +1000 Date: Sat, 9 Apr 2016 08:17:06 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/6 v2] xfs: xfs_iflush_cluster vs xfs_reclaim_inode Message-ID: <20160408221706.GB567@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/6 v2] xfs: xfs_iflush_cluster vs xfs_reclaim_inode References: <1460072271-23923-1-git-send-email-david@fromorbit.com> <20160408171843.GC30614@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160408171843.GC30614@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: 1460153828 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28563 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Apr 08, 2016 at 01:18:44PM -0400, Brian Foster wrote: > On Fri, Apr 08, 2016 at 09:37:45AM +1000, Dave Chinner wrote: > > Hi folks, > > > > This is the second version of this patch set, first posted and > > described here: > > > > http://oss.sgi.com/archives/xfs/2016-04/msg00069.html > > > > The only change from the first version is splitting up the first > > patch into two as Christoph requested - one for the bug fix, the > > other for the variable renaming. > > > > Did your xfstests testing for this series include generic/233? I'm > seeing a consistently reproducible test hang. The test is hanging on a > "xfs_quota -x -c off -ug /mnt/scratch" command. The stack is as follows: > > [] xfs_qm_dquot_walk.isra.8+0x196/0x1b0 [xfs] > [] xfs_qm_dqpurge_all+0x78/0x80 [xfs] > [] xfs_qm_scall_quotaoff+0x148/0x640 [xfs] > [] xfs_quota_disable+0x3d/0x50 [xfs] > [] SyS_quotactl+0x3b3/0x8c0 > [] do_syscall_64+0x67/0x190 > [] return_from_SYSCALL_64+0x0/0x7a > [] 0xffffffffffffffff > > ... and it looks like the kernel is spinning somehow or another between > inode reclaim and xfsaild: > > ... > kworker/1:2-210 [001] ...1 895.750591: xfs_perag_get_tag: dev 253:3 agno 1 refcount 1 caller xfs_reclaim_inodes_ag [xfs] > kworker/1:2-210 [001] ...1 895.750609: xfs_perag_put: dev 253:3 agno 1 refcount 0 caller xfs_reclaim_inodes_ag [xfs] > kworker/1:2-210 [001] ...1 895.750609: xfs_perag_get_tag: dev 253:3 agno 2 refcount 5 caller xfs_reclaim_inodes_ag [xfs] > kworker/1:2-210 [001] ...1 895.750611: xfs_perag_put: dev 253:3 agno 2 refcount 4 caller xfs_reclaim_inodes_ag [xfs] > kworker/1:2-210 [001] ...1 895.750612: xfs_perag_get_tag: dev 253:3 agno 3 refcount 1 caller xfs_reclaim_inodes_ag [xfs] > kworker/1:2-210 [001] ...1 895.750613: xfs_perag_put: dev 253:3 agno 3 refcount 0 caller xfs_reclaim_inodes_ag [xfs] > xfsaild/dm-3-12406 [003] ...2 895.760588: xfs_ail_locked: dev 253:3 lip 0xffff8801f8e65d80 lsn 2/5709 type XFS_LI_QUOTAOFF flags IN_AIL > xfsaild/dm-3-12406 [003] ...2 895.810595: xfs_ail_locked: dev 253:3 lip 0xffff8801f8e65d80 lsn 2/5709 type XFS_LI_QUOTAOFF flags IN_AIL > xfsaild/dm-3-12406 [003] ...2 895.860586: xfs_ail_locked: dev 253:3 lip 0xffff8801f8e65d80 lsn 2/5709 type XFS_LI_QUOTAOFF flags IN_AIL > xfsaild/dm-3-12406 [003] ...2 895.910596: xfs_ail_locked: dev 253:3 lip 0xffff8801f8e65d80 lsn 2/5709 type XFS_LI_QUOTAOFF flags IN_AIL > ... No deadlock involving the AIL - it doesn't remove the XFS_LI_QUOTAOFF from the AIL - the quota code committing the quotaoff-end transactions is what removes that. IOWs, the dquot walk has not completed, so quotaoff has not completed, so the XFS_LI_QUOTAOFF is still in the AIL. IOWs, this looks like xfs_qm_dquot_walk() is skipping dquots because xfs_qm_dqpurge is hitting this: xfs_dqlock(dqp); if ((dqp->dq_flags & XFS_DQ_FREEING) || dqp->q_nrefs != 0) { xfs_dqunlock(dqp); return -EAGAIN; } So that means we've got an inode that probably hasn't been reclaimed, because the last thing that happens during reclaim is the dquots are detatched from the inode and hence the reference counts are dropped. > FWIW, this only occurs with patch 6 applied. The test and scratch > devices are both 10GB lvm volumes formatted with mkfs defaults (v5). I can't see how patch 6 would prevent an inode from being reclaimed, as all the changes occur *after* the reclaim decision has been made. More investigation needed, I guess... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Apr 8 17:27:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 408567CB9 for ; Fri, 8 Apr 2016 17:27:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 016628F8052 for ; Fri, 8 Apr 2016 15:27:46 -0700 (PDT) X-ASG-Debug-ID: 1460154463-04cb6c245f36e4b0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id Rgoy4W5G6HFvtV3V for ; Fri, 08 Apr 2016 15:27:44 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BAFQDPLwhXPDGaLHlcgzeBUIZrn1IBAQEBAQEGjBGJeIYHAgIBAQKBM00BAQEBAQEHAQEBAUJAhEEBAQEDATocIwULCAMUBAklDwUlAwcaE4gfB8B1AQEBAQEFAQEBARwZhT+FE4dqgisFmASOAo8XRY5ghFsqMIk5AQEB Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail05.adl6.internode.on.net with ESMTP; 09 Apr 2016 07:57:42 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aoesQ-0002NS-Ax; Sat, 09 Apr 2016 08:27:42 +1000 Date: Sat, 9 Apr 2016 08:27:42 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: Use latest xfs_repair on older file systems Message-ID: <20160408222742.GC567@dastard> X-ASG-Orig-Subj: Re: Use latest xfs_repair on older file systems References: <5708194D.4080406@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5708194D.4080406@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1460154463 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28564 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Apr 08, 2016 at 03:49:17PM -0500, Eric Sandeen wrote: > Obsolete features do occasionally get dropped upstream, as well - witness > your V1 inode message. However, that was likely just some other form of > corruption, seen as V1 inodes, unless this really was a very, very old > filesystem (created prior to 2007), which seems unlikely. That error does not come from inode number checking - it is emitted if the NLINK feature bit is missing from the superblock feature field. > On 4/8/16 3:37 PM, Chris M Moser wrote: > I unmounted and ran xfs_repair 2.9.4 form the host OS a few more > times. Is this filesystem was created with 2.9.4, we're talking about a filesystem that was released: xfsprogs-2.9.4 (7 Sep 2007) And, importantly: xfsprogs-2.9.5 (21 Jan 2008) - Updated mkfs.xfs defaults. It was then very next release that sets NLINK by default via: commit 8d537733f52a642d471f6781f32f306241dd4308 Author: Niv Sardi Date: Fri Nov 16 05:16:34 2007 +0000 .... - V2 inodes per default, and move DFL bits to XFS_DFL_SB_VERSION_BITS, Activate XFS_SB_VERSION_NLINKBIT per default, which will enable V2 INODES. refactor bits that we want everytime in XFS_DFL_SB_VERSION_BITS. - .... So, your host has the very last version of xfsprogs that defaulted to v1 inodes, and so recent xfsprogs versions will simply refuse to run on it. It does not imply there is any corruption, however, you just need to use a version of xfs_repair that supports v1 inodes... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Apr 8 17:47:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E1EF97CA7 for ; Fri, 8 Apr 2016 17:47:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5FF4FAC001 for ; Fri, 8 Apr 2016 15:47:08 -0700 (PDT) X-ASG-Debug-ID: 1460155624-04bdf0110536adf0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id tAr0jdVr5ClR9LgO for ; Fri, 08 Apr 2016 15:47:05 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BDFQCANAhXPDGaLHlcgzeBUIZrn1QBAQEBAQEGjBGDT4YphgcCAgEBAoEzTQEBAQEBAQcBAQEBQkCEQgEBBCcTHCMQCAMYCSUPBSUDBxoTiCbAcwEBAQEBBQEBAQEcGYU/hROHaoIrBYdlCIcTiQSOAo8XRY5ggxSBRyowiTkBAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail05.adl6.internode.on.net with ESMTP; 09 Apr 2016 08:16:48 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aofAu-0002Ou-BK; Sat, 09 Apr 2016 08:46:48 +1000 Date: Sat, 9 Apr 2016 08:46:48 +1000 From: Dave Chinner To: Shyam Kaushik Cc: Brian Foster , xfs@oss.sgi.com, Alex Lyakas Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Message-ID: <20160408224648.GD567@dastard> X-ASG-Orig-Subj: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery References: <20160322121922.GA53693@bfoster.bfoster> <232dd85fde11d4ef1625f070eabfd167@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <232dd85fde11d4ef1625f070eabfd167@mail.gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1460155625 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28564 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Apr 08, 2016 at 04:21:02PM +0530, Shyam Kaushik wrote: > Hi Dave, Brian, Carlos, > > While trying to reproduce this issue I have been running into different > issues that are similar. Underlying issue remains the same when backend to > XFS is failed & we unmount XFS, we run into hung-task timeout (180-secs) > with stack like > > kernel: [14952.671131] [] > xfs_ail_push_all_sync+0xa9/0xe0 [xfs] > kernel: [14952.671139] [] ? > prepare_to_wait_event+0x110/0x110 > kernel: [14952.671181] [] xfs_unmountfs+0x61/0x1a0 > [xfs] > > while running trace-events, XFS ail push keeps looping around > > xfsaild/dm-10-21143 [001] ...2 17878.555133: xfs_ilock_nowait: dev > 253:10 ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] Looks like either a stale inode (which should never reach the AIL) or it's an inode that's been reclaimed and this is a use after free situation. Given that we are failing IOs here, I'd suggest it's more likely to be an IO failure that's caused a writeback problem, not an interaction with stale inodes. So, look at xfs_iflush. If an IO fails, it is supposed to unlock the inode by calling xfs_iflush_abort(), which will also remove it from the AIL. This can also happen on reclaim of a dirty inode, and if so we'll still reclaim the inode because reclaim assumes xfs_iflush() cleans up properly. Which, apparently, it doesn't: /* * Get the buffer containing the on-disk inode. */ error = xfs_imap_to_bp(mp, NULL, &ip->i_imap, &dip, &bp, XBF_TRYLOCK, 0); if (error || !bp) { xfs_ifunlock(ip); return error; } This looks like a bug - xfs_iflush hasn't aborted the inode writeback on failure - it's just unlocked the flush lock. Hence it has left the inode dirty in the AIL, and then the inode has probably then been reclaimed, setting the inode number to zero. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Apr 8 18:08:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D3FF27CA0 for ; Fri, 8 Apr 2016 18:08:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 35D2BAC002 for ; Fri, 8 Apr 2016 16:08:48 -0700 (PDT) X-ASG-Debug-ID: 1460156924-04cbb02e1c3f240001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id TKo2CquCUFQm0dlH for ; Fri, 08 Apr 2016 16:08:45 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BFFQANOQhXPDGaLHlcgzeBUIZrn1QBAQEBAQEGjBGFaIQQhgcCAgEBAoEtTQEBAQEBAQcBAQEBQkCEQQEBAQMBOhwjBQsIAw4HAwklDwUlAwcaE4gfB8B2AQEBAQYCAR0ZhT+FE4Qpg0GCKwWYBI4CjxePJYJmGYFcKjCHfYE8AQEB Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail05.adl6.internode.on.net with ESMTP; 09 Apr 2016 08:38:43 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aofW7-0002Rl-Bb; Sat, 09 Apr 2016 09:08:43 +1000 Date: Sat, 9 Apr 2016 09:08:43 +1000 From: Dave Chinner To: Jan Tulak Cc: xfs-oss Subject: Re: [PATCH 17/19] xfsprogs: disable truncating of files Message-ID: <20160408230843.GE567@dastard> X-ASG-Orig-Subj: Re: [PATCH 17/19] xfsprogs: disable truncating of files References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-18-git-send-email-jtulak@redhat.com> <20160408000910.GB21804@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1460156924 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28565 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Apr 08, 2016 at 12:06:35PM +0200, Jan Tulak wrote: > On Fri, Apr 8, 2016 at 2:09 AM, Dave Chinner wrote: > > > On Thu, Mar 24, 2016 at 12:15:34PM +0100, jtulak@redhat.com wrote: > > > From: Jan Tulak > > > > > > Unify mkfs.xfs behaviour a bit and never truncate files. If the user > > > is trying to mkfs an existing file, we don't want to destroy anything > > > he did with the file before (sparse file, allocations...) > > > > Why not? We do that with discard-by-default to block devices, > > O_TRUNC is exactly the same situation with a file - we completely > > re-initialise the file from a known state if mkfs has been asked to > > create the file. > > > But AFAIK, we don't zero-out entire spindle devices, Unless the controller above them supports discard or whatever implementation the storage protocol uses (e.g. UNMAP or WRITE_SAME). e.g, the "spindle devices" often are big raid arrays that are using thin provisioning, compression and dedupe internally, so running discard on them does make a significant difference to their behaviour. > we don't ask if the drive skips some blocks (i.e. because they are bad), That's irrelevant to the issue at hand. > and we don't care > about what an underlaying layer (like LVM) did with the block device. Actually, we do, because users care about their storage stack doing sane management operations automatically. That's why we issued a discard - it tells the underlying devices to re-initialise the storage on this device *if they care about such things*. Stuff like thinly provisioned devices rely on mkfs behaviour like this to recycle used storage efficiently and transparently. The user expects things to "just work" and this is one of those things that makes it "just work". > From > this point of view, we shouldn't care about the file either. > > I can be missing something, though. I think you're missing the fact that we don't know what the *underlying storage* cares about, so we need to tell them in some way that a device or image file is being re-initialised from scratch. Whether that is by truncating the image file (so the filesytem can issue discards on the now unused space) or by issuing discard ioctls ourselves, it really doesn't matter. The key point is that we have a mechanism that allows us to notify the underlying storage of the "this is re-initialised storage" intent of mkfs. So from that perspective, the O_TRUNC behaviour should remain. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Fri Apr 8 23:12:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BFCD27CA0 for ; Fri, 8 Apr 2016 23:12:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 94283304032 for ; Fri, 8 Apr 2016 21:12:19 -0700 (PDT) X-ASG-Debug-ID: 1460175133-04cbb02e1a49690001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id TFcTfSJCaG17E49D for ; Fri, 08 Apr 2016 21:12:13 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 142EE56A for ; Fri, 8 Apr 2016 23:12:13 -0500 (CDT) Subject: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-16-git-send-email-jtulak@redhat.com> <5706FA7C.7020103@sandeen.net> From: Eric Sandeen Message-ID: <5708811C.5090909@sandeen.net> Date: Fri, 8 Apr 2016 23:12:12 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1460175133 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28573 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/8/16 9:58 AM, Jan Tulak wrote: > This one causes at least one interesting issue: > > #mkfs/mkfs.xfs > Error accessing specified device (null): Bad address > Usage: mkfs.xfs > ... > > because: > > check_device_type(dfile, &xi.disfile, !dsize, !dfile, > Nflag ? NULL : &xi.dcreat, force_overwrite, "d"); > > so "dfile" can be NULL, but that function immediately tries to stat it. > > > ​A simple if NULL, then usage() should take care of this... Well, think hard about that. If dfile == NULL and bails with usage(), then what is the point of having !dfile as a function argument? Validation of having a target specified as either -dfile= or as the last argument should probably happen before the call to check_device_type. -Eric From rich@racitup.com Sat Apr 9 12:55:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 115A97CA0 for ; Sat, 9 Apr 2016 12:55:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D8F698F8037 for ; Sat, 9 Apr 2016 10:55:40 -0700 (PDT) X-ASG-Debug-ID: 1460224537-04cb6c246038a2a0001-NocioJ Received: from mail-wm0-f43.google.com (mail-wm0-f43.google.com [74.125.82.43]) by cuda.sgi.com with ESMTP id 3WRgjqHwb4EgzkHK (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 09 Apr 2016 10:55:38 -0700 (PDT) X-Barracuda-Envelope-From: rich@racitup.com X-Barracuda-Apparent-Source-IP: 74.125.82.43 Received: by mail-wm0-f43.google.com with SMTP id v188so45941329wme.1 for ; Sat, 09 Apr 2016 10:55:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=racitup-com.20150623.gappssmtp.com; s=20150623; h=mime-version:sender:date:message-id:subject:from:to; bh=kTObtqFSdzp0ezmXLnTlUddK0g8Cs+Ownp8A84L5pN8=; b=xXNQwZIpuWQyAp0ig3XJ6Zj0hQwfZ7wL0FKztxsN5Dy42zytIksrI+5W7hoOkBgh9S C2gMZ/WSUbFfHYkkU6IAGprhqLCcGKtSRaU4Jtxfigs2JAx7nBcLLVAvN/zK52ucr+4u Kl4fbmAafAyJsjiIkQDbWjzC1oAKlQHpWG7zv4FMFaN47A/fNsybMwSPJI/LpOyYoL3b tiazor/JgAHdXlYbjYpoB36VWIgPWSkbSihKYIeGpof1+xXi67qvT4e8qYIB0uq6owhp gPODCk7yUcfc3A7xtGRlcfcCcYygBCFEwUxS5qtFwKenAcACH+gpuWA9jDqZdCVRQKXR 6A6Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:date:message-id:subject:from :to; bh=kTObtqFSdzp0ezmXLnTlUddK0g8Cs+Ownp8A84L5pN8=; b=mtsLTrBLoXo6zBTEiP48MDhW9uILcW7x8WEqtZcq6BrOserijP2I6Eo7xo/VucNdmE /JOS7TGS3oerhdE2rxk+zSuxR8QScdGoR0DAwQzAxhCoKaifIRGNwpxmnZQSlSRHY15y TpVL3TpQMDzhB+klHVIBY/e+14lasyHaIK1NDs9Ng0Ed5NL8W7IobpAtrK+ddH4mVFNK +/0BtjPr2Np9c1aEoZ2VecR/SAALdwstrnk+8G0P9spFSmJc3p9rw+ME7DrHBpi4yITC keXiP7rYNj8fcvBZbTEEetHybHuNAqTg0HMGueqrNtIFzCR1V040wf/8RtEy47U42drF JCgg== X-Gm-Message-State: AD7BkJLE9nQ6owR8DYjrtkslZdhwuzXMZMvq+tYeKRAVujct38jD6W8sqyvwa93/GoBuT24epC01YGuNqyiOZA== MIME-Version: 1.0 X-Received: by 10.194.234.101 with SMTP id ud5mr15278437wjc.34.1460224536808; Sat, 09 Apr 2016 10:55:36 -0700 (PDT) Sender: rich@racitup.com Received: by 10.28.5.145 with HTTP; Sat, 9 Apr 2016 10:55:36 -0700 (PDT) X-Originating-IP: [86.151.68.173] Date: Sat, 9 Apr 2016 18:55:36 +0100 X-Google-Sender-Auth: zlBHYOB8be7aUCSmEUy_1C9Hg94 Message-ID: Subject: Apparently successful xfs_copy gives "-9" returncode From: Richard C X-ASG-Orig-Subj: Apparently successful xfs_copy gives "-9" returncode To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=089e01493bbccf288a053011044f X-Barracuda-Connect: mail-wm0-f43.google.com[74.125.82.43] X-Barracuda-Start-Time: 1460224537 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28587 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 --089e01493bbccf288a053011044f Content-Type: text/plain; charset=UTF-8 Hi all, I'm writing a script that helps with hard disk cloning and am running into a problem whereby xfs_copy is returning -9 when there is nothing in the log and no indication on stdout or stderr, example below. I've had a search and couldn't find anything mentioned. Can anyone shed any light, maybe which version I should try if you suspect this has already been fixed? Dist: Ubuntu Trusty xfsprogs: 3.1.9 $ losetup /dev/loop2 ./disk.img $ xfs_copy /dev/loop1p6 /dev/loop2 0% ... 10% ... 20% ... 30% ... 40% ... 50% ... 60% ... 70% ... 80% ... 90% ... 100% All copies completed. $ echo $? -9 Cheers, Richard --089e01493bbccf288a053011044f Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
    Hi all,

    I'm writing a script that h= elps with hard disk cloning and am running into a problem whereby xfs_copy = is returning -9 when there is nothing in the log and no indication on stdou= t or stderr, example below.

    I've had a search = and couldn't find anything mentioned. Can anyone shed any light, maybe = which version I should try if you suspect this has already been fixed?
    Dist: Ubuntu Trusty
    xfsprogs: 3.1.9

    $ losetup /dev/loop2 ./disk.img
    $ xfs_copy /dev/loop1p6 /dev/lo= op2
    =C2=A00% =C2=A0... 10% =C2=A0... 20% =C2=A0... 30% =C2= =A0... 40% =C2=A0... 50% =C2=A0... 60% =C2=A0... 70% =C2=A0... 80% =C2=A0..= . 90% =C2=A0... 100%
    All copies completed.
    $= echo $?
    -9

    Cheers,
    Rich= ard
    --089e01493bbccf288a053011044f-- From sandeen@sandeen.net Sat Apr 9 18:24:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 409CB7CA0 for ; Sat, 9 Apr 2016 18:24:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B6998AC001 for ; Sat, 9 Apr 2016 16:24:35 -0700 (PDT) X-ASG-Debug-ID: 1460244272-04cbb02e1b69f10001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id M0S2J53czEr2I9Aq for ; Sat, 09 Apr 2016 16:24:32 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 12FE916C173 for ; Sat, 9 Apr 2016 18:24:31 -0500 (CDT) Subject: Re: Apparently successful xfs_copy gives "-9" returncode To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Apparently successful xfs_copy gives "-9" returncode References: From: Eric Sandeen Message-ID: <57098F2F.4080909@sandeen.net> Date: Sat, 9 Apr 2016 18:24:31 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1460244272 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28592 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/9/16 12:55 PM, Richard C wrote: > Hi all, > > I'm writing a script that helps with hard disk cloning and am running into a problem whereby xfs_copy is returning -9 when there is nothing in the log and no indication on stdout or stderr, example below. > > I've had a search and couldn't find anything mentioned. Can anyone shed any light, maybe which version I should try if you suspect this has already been fixed? > Dist: Ubuntu Trusty > xfsprogs: 3.1.9 # git show v3.1.9 tag v3.1.9 Tagger: Ben Myers Date: Wed Dec 12 14:51:24 2012 -0600 > $ losetup /dev/loop2 ./disk.img > $ xfs_copy /dev/loop1p6 /dev/loop2 > 0% ... 10% ... 20% ... 30% ... 40% ... 50% ... 60% ... 70% ... 80% ... 90% ... 100% > All copies completed. > $ echo $? > -9 Something not so ancient behaves as expected here: # copy/xfs_copy fsfile fsfile2 Creating file fsfile2 0% ... 10% ... 20% ... 30% ... 40% ... 50% ... 60% ... 70% ... 80% ... 90% ... 100% All copies completed. # echo $? 0 # copy/xfs_copy -V xfs_copy version 4.5.0 -Eric From eguan@redhat.com Sun Apr 10 04:22:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 920E37CA0 for ; Sun, 10 Apr 2016 04:22:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 668C18F8037 for ; Sun, 10 Apr 2016 02:22:39 -0700 (PDT) X-ASG-Debug-ID: 1460280157-04cbb02e1d7cdd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gOGqZvF0BkF4GCj1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 10 Apr 2016 02:22:38 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A730A3CF for ; Sun, 10 Apr 2016 09:22:37 +0000 (UTC) Received: from localhost (ovpn-12-19.pek2.redhat.com [10.72.12.19]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3A9Ma7Z002266; Sun, 10 Apr 2016 05:22:36 -0400 Date: Sun, 10 Apr 2016 17:22:35 +0800 From: Eryu Guan To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/6 v2] xfs: xfs_iflush_cluster vs xfs_reclaim_inode Message-ID: <20160410092235.GZ10345@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH 0/6 v2] xfs: xfs_iflush_cluster vs xfs_reclaim_inode References: <1460072271-23923-1-git-send-email-david@fromorbit.com> <20160408032841.GW10345@eguan.usersys.redhat.com> <20160408113709.GA30614@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160408113709.GA30614@bfoster.bfoster> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460280158 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Apr 08, 2016 at 07:37:09AM -0400, Brian Foster wrote: > On Fri, Apr 08, 2016 at 11:28:41AM +0800, Eryu Guan wrote: > > On Fri, Apr 08, 2016 at 09:37:45AM +1000, Dave Chinner wrote: > > > Hi folks, > > > > > > This is the second version of this patch set, first posted and > > > described here: > > > > > > http://oss.sgi.com/archives/xfs/2016-04/msg00069.html > > > > Just a quick note here, I'm testing the v1 patchset right now, v4.6-rc2 > > kernel + v1 patch, config file is based on rhel7 debug kernel config. > > > > The test is the same as the original reproducer (long term fsstress run > > on XFS, exported from NFS). The test on x86_64 host has been running for > > two days and everything looks fine. Test on ppc64 host has been running > > for a few hours and I noticed a lock issue and a few warnings, not sure > > if it's related to the patches or even to XFS yet(I need to run test on > > stock -rc2 kernel to be sure), but just post the logs here for reference > > > > Had the original problem ever been reproduced on an upstream kernel? No, I've never seen the original problem in my upstream kernel testings. Perhaps that's because I didn't run tests on debug kernels. But I didn't see it in RHEL7 debug kernel testings either. > > FWIW, my rhel kernel based test is still running well approaching ~48 > hours. I've seen some lockdep messages (bad unlock balance), but IIRC > I've been seeing those from the start so I haven't been paying much > attention to it while digging into the core problem. > > > [ 1911.626286] ====================================================== > > [ 1911.626291] [ INFO: possible circular locking dependency detected ] > > [ 1911.626297] 4.6.0-rc2.debug+ #1 Not tainted > > [ 1911.626301] ------------------------------------------------------- > > [ 1911.626306] nfsd/7402 is trying to acquire lock: > > [ 1911.626311] (&s->s_sync_lock){+.+.+.}, at: [] .sync_inodes_sb+0xe0/0x230 > > [ 1911.626327] > > [ 1911.626327] but task is already holding lock: > > [ 1911.626333] (sb_internal){.+.+.+}, at: [] .__sb_start_write+0x90/0x130 > > [ 1911.626346] > > [ 1911.626346] which lock already depends on the new lock. > > [ 1911.626346] > > [ 1911.626353] > > [ 1911.626353] the existing dependency chain (in reverse order) is: > > [ 1911.626358] > ... > > [ 1911.627134] Possible unsafe locking scenario: > > [ 1911.627134] > > [ 1911.627139] CPU0 CPU1 > > [ 1911.627143] ---- ---- > > [ 1911.627147] lock(sb_internal); > > [ 1911.627153] lock(&s->s_sync_lock); > > [ 1911.627160] lock(sb_internal); > > [ 1911.627166] lock(&s->s_sync_lock); > > [ 1911.627172] > > [ 1911.627172] *** DEADLOCK *** > > [ 1911.627172] > ... > > We actually have a report of this one on the list: > > http://oss.sgi.com/archives/xfs/2016-04/msg00001.html > > ... so I don't think it's related to this series. I believe I've seen > this once or twice when testing something completely unrelated, as well. > > > [ 2046.852739] kworker/dying (399) used greatest stack depth: 4352 bytes left > > [ 2854.687381] XFS: Assertion failed: buffer_mapped(bh), file: fs/xfs/xfs_aops.c, line: 780 > > [ 2854.687434] ------------[ cut here ]------------ > > [ 2854.687488] WARNING: CPU: 5 PID: 28924 at fs/xfs/xfs_message.c:105 .asswarn+0x2c/0x40 [xfs] > ... > > [ 2854.687997] ---[ end trace 872ac2709186f780 ]--- > > These asserts look new to me, however. It would be interesting to see if > these reproduce independently. I've seen just the assert failures in the same fsstress testing on ppc64 host (no lock warnings in the beginning). Will see if it's still reproducible on stock kernel. Thanks, Eryu From basko@ares.eonet.ne.jp Sun Apr 10 13:23:01 2016 Return-Path: X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 348CB7CA0 for ; Sun, 10 Apr 2016 13:23:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CF5948F8039 for ; Sun, 10 Apr 2016 11:23:00 -0700 (PDT) X-ASG-Debug-ID: 1460312570-04cbb02e1a8b820001-NocioJ Received: from mta01.eonet.ne.jp (mta01.eonet.ne.jp [203.140.81.46]) by cuda.sgi.com with ESMTP id Or31Ecro3rJhjvjx (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Sun, 10 Apr 2016 11:22:51 -0700 (PDT) X-Barracuda-Envelope-From: basko@ares.eonet.ne.jp X-Barracuda-Apparent-Source-IP: 203.140.81.46 Received: from User (58-190-247-194f1.hyg1.eonet.ne.jp [58.190.247.194]) by mailmsa11.mozu.eo.k-opti.ad.jp with SMTP id u3AICX9S006058; Mon, 11 Apr 2016 03:12:42 +0900 Message-Id: <201604101812.u3AICX9S006058@mailmsa11.mozu.eo.k-opti.ad.jp> Reply-To: From: "LOTTERIA INTERNATIONALE" Subject: Gewinnbenachrichtigung Date: Sun, 10 Apr 2016 11:12:55 -0700 X-ASG-Orig-Subj: Gewinnbenachrichtigung MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_005B_01C2A9A6.0513E2AA" 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 X-Barracuda-Connect: mta01.eonet.ne.jp[203.140.81.46] X-Barracuda-Start-Time: 1460312571 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Barracuda-BRTS-Evidence: 066d31b2386ab7e9b62c7b069dcbdfab-5468-htm X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: -1001.00 X-Barracuda-Spam-Status: No, SCORE=-1001.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 To: undisclosed-recipients:; This is a multi-part message in MIME format. ------=_NextPart_000_005B_01C2A9A6.0513E2AA Content-Type: text/html; charset="iso-8859-10" Content-Transfer-Encoding: 7bit

    INTERNATIONALE LOTTERIE-PROMOTION
    ONLINE LOTTERIE-ABTEILUNG
    Referenznummer: ES/0999/171/EU

    Batchnummer : LTO/2016-028 /EU




                                             Gewinnbenachrichtigung



    Wir sind verpflichtet, Ihnen mitteilen zu können das Ergebnis der gerechten abgeschlossen monatliche endgültig zieht der Internationale Online Lotterie Promotion und Ihre e-Mail unter den 14 glücklichen Gewinnern gewonnen €972,073.40 Euros (Dreizehn Milionen, sechs hundert und neun tausend siebenundzwanzig Euros).

    für Sicherheit Grund, Lesen Sie die Anlage in PDF Formant für weitere Informationen bezüglich Ihres Gewinns
     
    Bitte kontaktieren Sie Herr Fernándo Martínez über Ihren Gewinn auf 
    infinit.seguros@insurer.com &n


    Mit freundlichen Grüßen 

    HEAD, ONLINE LOTTERY DEPARTMENT
    INTERNATIONALE LOTTERY PROMOTIO

    ------=_NextPart_000_005B_01C2A9A6.0513E2AA Content-Type: application/octet-stream; name="Gewinn.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Gewinn.pdf" JVBERi0xLjMKJeLjz9MKMSAwIG9iago8PCAKL0NyZWF0b3IgKENhbm9uIFND MTAwMSkKL0NyZWF0aW9uRGF0ZSAoRDoyMDE2MDQwNzEyMjYyMyswMScwMCcp Ci9Qcm9kdWNlciAoSUogU2NhbiBVdGlsaXR5KQo+PiAKZW5kb2JqCjIgMCBv YmoKPDwgCi9QYWdlcyAzIDAgUiAKL1R5cGUgL0NhdGFsb2cgCj4+IAplbmRv YmoKNCAwIG9iago8PCAvV2lkdGggNzMgL0hlaWdodCAxMDYgCi9CaXRzUGVy Q29tcG9uZW50IDggL0NvbG9yU3BhY2UgL0RldmljZVJHQgovRmlsdGVyIC9E Q1REZWNvZGUgL0xlbmd0aCAxMjY0MiA+PiAKc3RyZWFtCv/Y/+AAEEpGSUYA AQEBASwBLAAA/+EBHEV4aWYAAE1NACoAAAAIAAkBDwACAAAABgAAAHoBEAAC AAAAAQAAAAABGgAFAAAAAQAAAIABGwAFAAAAAQAAAIgBKAADAAAAAQACAAAB MQACAAAAAQAAAAABMgACAAAAFAAAAJACEwADAAAAAQABAACHaQAEAAAAAQAA AKQAAAAAQ2Fub24AAAABLAAAAAEAAAEsAAAAATIwMTY6MDQ6MDcgMTI6MjY6 MjMAAAeQAAAHAAAABDAyMjGQBAACAAAAFAAAAP6RAQAHAAAABAECAwCgAAAH AAAABDAxMDCgAQADAAAAAQABAACgAgADAAAAAQBJAACgAwADAAAAAQBqAAAA AAAAMjAxNjowNDowNyAxMjoyNjoyMwAAAP/bAEMAAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAf/bAEMBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAGoASQMBIgACEQED EQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMD AgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQz YnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdo aWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6 wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQAD AQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAAB AncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXx FxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4 eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfI ycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/AP75 LHT9O0LTtL0bRrGx0fRtKs7PStL0rTLa30/TdN0+xjt7Ww07T7C1tltbOxtL OJbSztbdLeCCJYLS3jXdEYuN8d+IfEnhLwvr2uaDod54z1jS9DvrjSvDMV6m nXPiHWo7axOnaRa30Phi/t7a61OWG+gt72ZGsINSura2uYGjv7VdL7a6is5L mza4JNxF5zWke+ZgCTCss/2aN/LJjzHB9rkj3QR3UloJkh1G4hueQTUBFrsX h238MT6nZXmm6nJ4m8VWT+Fn0Sy1TT38GCz0PX7a68UL4tbVvEWl+K9R1fRk Xw9rum/2T4a1iTxHr+j3uo+ELHxv1YZ04VKdSpRjXhTqU51aFRVFTr01VipU 51KVWlVpwmrU5SpVaVS81y1KbSqR4sbGtVoV6NHEzwdWtSrUqGLo+xlVw1Z0 rwq06VelXo1a9N3q04VsPiKDVN+2o1oN0an56eFP2sfjr4j/AGh9f+FkFt4G /shPEni3T/BdjqMFvp93408PeFPjd4b8D+IdV8Paw+txXGq6xp3gjQvi3qGm +HR4eso4Lnwzqfi19d8Z6To934XseQ8a/tj/ALWHhfQP7V/4VHpWn2Nh4a8H 2HjbWPEM0Wm23gXxx4i0TTtat7TUNSkRI7HUdWt/EvheSPRfE/hfRb+yvdbs vDcGh6hNYR+IfF36VN4lS20g6z4V0mb4m382seCNDubPwhq/gyOe1sNev/C1 s2vXV3r/AIh0TT4vDPgnQfFB+JfiG1TVtT8V3HhaLW7jwD4a8ZeKNX8LeEfE HV2UiAXF5c209rcNcQyXInvWuBB/xLrBztxNNBp8ENscXNnFHZ2/25r2eGOa TURe6h9LhM8y/BVJSr8JcP5hJUaFOUMc84jzSjRhGVWNPBZzl8aUq8r4ipOF J2qtRpRp4WX1ePy2NyDH5ksJPCcacTZZCFatiF/Zssjq0KkJ1qlWnTq1MfkW ZTxNOknDD06TxCj9XTc6lWuo1p/CXwC/a28UfFLVdR8YeKrzwT4f+EHh34Xa 9r+r39vJcw6jceKvCPhb4S6147ltLa6S41W+0TwPqniPxtb6jf2VlDb3Wj3n ge7trWaKeDV/FFLw98ff2uk8QfChPHfw28A+HLXxx4uvNG8U+HLmabQdS8Ke ErPxf8K/CDeMrO613xH/AGj4im1XWPiNBpOjaRpmhyDS78Wn9pz61HrdiNM9 68Jz/tHaLN8G9Kv9M8IeOdE0rRfiVoHxd8b+LPjOtv4+1bTNIvLGz+CXxPtf B3gf9knwz4O8afEn4qaF4f8A+Eg+K/gzQNU/Z/8Ah98HPEfijxPoPgmz+NGm ab4a1ix7TwD4O+JsXi3XfGfjj4k+IJLC78R/FK30X4U6dqHw58TfD3TPDmo6 z4M0b4d6nB4hs/gP8M/iLba3o3hb4eX3ip/Duq+JPFEfhjxr8d/jD4N1vxx8 YvC/hL4La74LwjnGCw/1mU+GMhqLGQhyRrSzSccI6dDMMNL6usPmtOrRlUqY qnipRxE5t1sBgJqLw8sRDF9FXIMfiVgYri7iKhLBuo6ksL/ZFOWOhVxGArqO MVbKq0JOjDBTwsHh4UpRpY/MOf8Ae1MNLCfn74q/ao/bT0PVtE063+C8txqG oTyzESeFvEWi+H9U1C90jQbQ+BdAtb/QtUv7i98IeLrXxDpc/iWbxd5XjC2l fxLpej6foOpeF7QenaL8df2pbbwb4ovvFfhvRl8X6brvwX0qTw2+h6j4LvPD 7eP9b1qXVptNv/FenfYviHol9qGp+EPhZ4c1DTtN0K9k8SaV43sobTVD4Ysv HXjj9BLxYLp4LiSa+sZoXvrGF1toi86TJJ5qx291aXQmWO4soL+J44RIW0yK 5R5dJnnF9iahYF7W+3ajKk+oTaopvL64tY5bHy4tVntjY2j6SkU32KO0S0hi SMSRadb3Gpx3t1fzapqGqXRzfLlRp0qvDeSznDGyxftZf2pGpOLqzl9Tn7PH 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 uoSfEDxP4KSbTPFOr+CNL+Hemw6LqOt6qvjbxz4OutettA+Hdh4p+Ifw3rni k4xcFGUlO1npJcrvzTUuWUpLmbT1k3zN2SS9jJ78zUrxcOaMYKMowU/4Uacm m3UfLNyvOc37q9n7PrbJJLix01pLWGKSSS3E5nu7w3yWlhJPeaeskssX2y51 EbI/tunXVzItpJdakJr/AFXyJDqkP/CRaN/dg/8AArRf/k6vPNF+IXjvUfEd n4c1D4AfF/QdLuNdvtHuPHOreIPgFdeFbGzstR+L9lB4tubXQPjHqHjeXw9q sXwp8G6zptvYeD5PFMOlftJ/BaHUPDGi6tov7Qmi/s7+tbNV/wCe9j/4LJP/ AJc0KUG25JJN3jFVJpR1Wl+Wo3aPLFa6Rhu3qW+dO8Y3btzP2cO6e3tKdtXK X2tZS1XKalFFFcxuFFFFABRRRQAUUUUAFFFFAH//2QplbmRzdHJlYW0KZW5k b2JqCjUgMCBvYmoKPDwgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdl IC9XaWR0aCAyNDI4IC9IZWlnaHQgMzUwOCAKL0JpdHNQZXJDb21wb25lbnQg OCAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCi9GaWx0ZXIgL0RDVERlY29kZSAv TGVuZ3RoIDE1MDgyNzIgPj4gCnN0cmVhbQr/2P/gABBKRklGAAEBAQEsASwA AP/bAIQADQkKCwoIDQsKCw4ODQ8TIBUTEhITJxweFyAuKTEwLiktLDM6Sj4z NkY3LC1AV0FGTE5SU1IyPlphWlBgSlFSTwEODg4TERMmFRUmTzUtNU9PT09P T09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09P /8QBogAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoLAQADAQEBAQEBAQEB AAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFB BhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5 OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SV lpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk 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 YSo9A5/xpXAUaTYDOIOv+23+NL/ZdkP+WP8A4+3+NAB/Zdj/AM8B/wB9H/Gj +y7L/ngPzP8AjQAv9mWf/PAf99H/ABpP7LsT1t1/M0AL/Zlj/wA+6/maP7Ls f+fZKAD+zLH/AJ9Yv++aUabYj/l0i/75oAUafZD/AJdYf++BS/YbP/n1h/74 FO4B9gs/+fSD/v2KPsNn/wA+sP8A3wKLgL9itP8An1g/79ij7Faf8+sP/fsU XAPsVpnP2aH/AL4FL9jtf+faH/vgUrhYPslr/wA+0P8A3wKPslr/AM+0P/fA oCwv2W2/594v++BR9ltv+feL/vgUAH2a3/54Rf8AfAo+zQf88I/++BQAfZrf /nhF/wB8Cl+zwf8APGP/AL5FAB9ng/54x/8AfIo+zwf88Y/++RQAeRD/AM8o /wDvkUvlR/8APNP++RQAvlR/881/KgRoOiL+VAB5af3F/Kl2L/dH5UAGB6Cj aPQUABVT1A/Kjav90flQAbV9B+VLgegoAKKACigAIBxkA4ooAKKACigAooAK KACigAooAKKACigAooAKKACigAooA5WaTAPNRWVnNqVxtRysSn5moGdNbafa WqBYoU4/iIyfzqzQIKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKA CigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKA CigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKA CigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKA CigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKA CigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKA CigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKA CigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKA CigAooAKKACigAooAKKACigAooAKKACigAooA4+C0fVZjDGSsYILSjsM9Pxr q7W2itIFhgQKijpQBLRQAUUAI7bVJwT7AcmoPtEv/PnP+af/ABVAB9plIyLK 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 oZj+mKegDlF8QC0lsD3ARj+uaZ/xMtoOLQt3GWA/OkA7F/jlrYHHTa3X06/T mhft7cOLZPcFmz+HFAARf5XD2xHclGGP1pdt9g4ktiew2MM/rQAh/tALlTal s9CGAH407Zef894P+/J/+KoATbe44mt8+nlN/wDFUpW9BGJbcjv+6YY/8eoA Tbe8fvrf3/dN/wDFUu287zQf9+j/APFUAAW97zW4/wC2RP8A7NQVvQOJrcn/ AK5MP/ZqADbenGZrccc/umOD/wB9Uu28/wCe0H/fk/8AxVLUBAl73nt/p5Lf /FUn+nAf8uzHHT5l5/WmAoW9wCZLcHuPLY4/HdzSFb7PEluRxzsYfXv9KAFC 3uTmW3x2/dHn/wAepuNQ8vObbf8A3cNjr6/T2oAfZ2sVnbJBCoCqOw6n1qeg AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig ApMHcDnjHSgBaKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAo oAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAo oAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAo oAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAo oAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAo oAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAo oAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAo oAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAo oAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAo oAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAo oAKKACigAooAKKACigAooAKKACigAooAKCcDNAAORmigAooAKKACigAooAKK ACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKK ACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKK ACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKK ACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKK ACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKK ACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKK ACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKK ACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKK ACigAooAKKACigAooAKKACigAooAKKACigAooAKKAEBBJAIyOtLQAUZBOMjI oAKKAAEEZByKKACjr0oAKTIzjIzQAtFACblyBuGT0GaWgAJwMnpSBgSQCCR1 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 Y6dj70ErzHbV27dox6YqBnMZAyx8xuM9qFqErLUlU5UFg3OOopXRZFKOMqaB 2utSMs3mmPPOMoefxz69akA5O4ZJHJx19qGJO4pUE5HB6ZFUNUgmurCWGNA5 YZG72x2x35oXmErpaHJacG0rUFc2+6NfvJk8HaAMLg+/5D3qeENJ4jEv2V4n Z13YXJABA2kke/HTvVKLdwutxurWUyXzzzR3e0yFg8TtnnjIH3eBz/KprKxg mnSGCW4OFwWlIwoA5ycZPfryfahqwKSY6+jlGvOIkDfP0bt6cYIPf8q6pAzq jkgbc5Veh7UmCOJ1qGQ6lctFFgbyWyvH5Y7gnn/JtwXduluu/R9zFQPm9QeQ eOKdmtgutmaOu+U9moktpAWX928IPyDHYjn2xxVTw3Y3cd4JJYpmtyG5lbIB 9eeSSc+wx2oadrgt7FC+hmttWNwkW4JICAy53qGzkYHt/wDWrT1iS5uNGEkN tNGm9g8K8HAP4Dr0z3oafUUWuhn3du7WSiGxmV92WkY4Ynd2449D9Kgt9Nur pJplt5AUA2xHv098Z654FFrjvYs6PNeWKTWsVkZjIXJkIAI4PJwBz24zTtHs 7yS0uo5bbyhKvy8gHO4ZBwMfQ5Oc8gdy1guQw/adMgmD20sxkHMjLuPyA88L k9BwAOTVzw/pV2NRE9xDsgCn7xBBPHABGfxpNNAndXOokPl/NjcOMjv36U4K GOW5IJ78Uh+Q78BioJN8cm7ltx4AHT8fz496EKV9yVBgnOeTwM8CnMAQR+FA yMHaSmDlQOmTxUgUDpQwQ2QB1wDyCPw9f60yM70wykZ4OfXv0p9BdSbt0/Oo 5VO35M5+uBSQxUJdQ2PlIzj60/gUgWxBKGVtwdgoxwAPXpUqA7ehB+tU9hK9 xWGRjOM8dqiwN2NjdeuO3+H40kNk1FIYUUAFFABRQAUUAFFABRQAUUAFIenF ADcCQAFTt/LGKcTjk4A7k0/IXmDMFHJpgHmPuYcD7hBoB6knUcimB1LsoI3e mMev/wBegGwVDj5my2Me35U7POO/0oDYQEN0YEj0NAGMDk475oGKxwucgfWm /K4PRgeCM8YoFccBgYH60ZwBuwM0hiMMkZUFfXuD9KXH046cdKBWEZgpGehI FC5y24Ac8Y78UwAkKMAYwOB0/Cg5HAxyeOOlAAoPVvvY5x0p1IYzcrYUEZIJ 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 PndowHPbO4cj6ihAytpXhHQtNuI7u00xIZ0ztLSM+3Ppkn0/U+prV1Gws9Tt GtdQgSeB+qP6/wBDQ2HqZen+FND0i6+16dpqx3A6NvLkdjjcTjr2q5qWi6fr NuItWs4rhRnaWyGTOM4Ycjp2NDYJakeleHdG0WVpdNsI4JHXaXyWOOOMknHQ fWm32gaVe3DTy6baSzSAkyPAjZOMckg5oTsKauiVdB0gWrWx0yzEDMHMQhXY SO+MdeBSW+g6JbzLNbaVYRyp910gUEH6gUDIH8NaJPLJI+lWZaRtzE26HJP4 e+aTWYbPSfCWoxW0NvBClrKRFtAUkqc8cZyT+tDYoxscr4F0TQNa8JQJf2Vv NcLI4c5KycNkDcMHGCO9dPovhfSdIuXm0+wSBnGC5dmbGc4BJOB+XShMbRuO ivGUdQysMEHvXPTeCfDJuPtLaVAHznALBPb5c7f0oTBm19jhktGtJoke3ZQp jKDbjGMEVR/4Rjw+sgkGj2KsvIIhUY96GCG3PhvRZnZ/7IsWlY5ZmgU5z1J4 5pI/C2ghfn0axye3kKcfpRfQVtS5daRpl5YJZXVnDNbR/cR1yFwMZHoetZNr 4N8P2N0s1ppkfnKRtaQvIF5HPzEjIpp2G0S3fgzw7e3bXVxpiecxyzRyPHk5 zkhSOc96n/4RfQBlm0izcnlnkjDE+5J5J9z1qRkn9kae1odPFjbrYqd/lNED HnPUD8/zpv8AwjOgg7l0eyRhyGSFVIPqCBwab0EtRg8LeH1VR/Y1gQOObdSS P8fepbjRNOv9NisL2zje2iYFIgCoXbwMYx2ouKxes7WCxtIrS1Ty4YVCImSc AdOTzVLVNE0vVcPfafbXMnAV3TnGcgbuuKBsj0fw7pWjFzY2cMUjHJdclsem SSQOOnStfORxQ3cErGVrGiaZrCBdQsUuCuApIwV57Ecj35qXSdE03RojHpto kAPUjJLfUnk023awkkXnAkVlyCMEEcGsCfwdoUtx5/8AZVtu4/hwCQc8qMCi MrClG+zNu1t4bSBYLeJYo0GAqjAH0qrfaLpV/OtxeafaTyAffliVjjsMntya V9bsq2lkU08MaJvYf2TYdjj7ImP5VdttE0i0nW4tdLsYJkztkit0VhkYOCB6 GhsmEeVb3H6hptlqSCO/tYriMHgSIDg+3HHWqOl+GdH0u6M9jpsUMg6OTvPT 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 p5zWiI3th5nmhlJ3Nuz0+uT2q6m9vJfkZ01dX82WVcbfmG04ywz0pMb23Bmw MZXoP881nsa7g25QSdu30p3mJsLhgQOeKAuQXk7W1o1wIJpigyYoV3O3sBkV 554eu7y28Yalqlz4a1dUv2CxOLc5iXPO7IA5wD+Hei3YPUk8XRX+n+KYdU8O 6dqn2vav2kQ226GVeeCwz83YjB7EYxWpqN1qHiXwje2tvpmoWN5sUtHcQlBJ zkqpPUdRzjtQA3w5rFvo/h+2t5dE1eO5hjEbxx2LnzGA5I/hOTk8+9ZhbVh4 +g1zVdGu4rWSIpEYUMxiUDjcI88nng/3vah3erEuXZC+Pr2416xhsNN0TWJF jmEjStYuqsu0/dJGQefSumsvEbNon2mTRNWjmi2o1t9m/eMcDJUEjKj146dK EmxtpHMeCZr2y1e+W/0bWIkv7rzUf7M3lx5Lfe4yvUcgnpSeNZL2+1jTTp+g 6nLFpc+5n+ytiTlT8h5JHyn9KNdg8zsjq883h+W+sNNuluQjGO0uI/LkyPVc 9P8AGovCupalq+lPPq1kbO4DlNvlPHuHZgG/+v3+lILp6G1gq5PABp2e3U+1 MBjxJICJBuBP5UM3lhVAzn07Ub6BazuOY5yoPP16U1ogwUHJKnIJJoTsDVxE kAAVnDMOpIxTyN+MNjB7GjYNxHXncoAPck44oVgML17Zz/jQAI3mLnDLg9CM UwqIsMO3LY6nP/6zQuwnqrkispUEcCjD78g/KR0Paj1H6CD5A3U89OtO3DjF ADDFuGHIYZ7jpThuxhjyfTtRcEhpk3SGNc5AySD0pSjbcB8HjB60bC3DeACS COcc96AfMX5SQD370WHe4NHklk+V/wC9jr0/wpxYAZ/T1oDYQru6lgPQHFR/ LEcqflPUcnk980LsJrqPEqtHvT5h/s80pXIPPJ74o2He+wwZi4IypOFCjp/9 apM8456UMEJjaMHGOmaaGdAocgk4yewoDUdnPA79DihkBIP8Q6H0o2DcaHGT xz3OMUH95jaeBznt/jQF7ibCrFjx3OO/Tt+FL5qjqcH0J5o3EtB20kk5I9s0 1sRYYltuMYzmgb01FMg5xyR1pSgYfNz9aA3GbvKAUgkc9AcAZpfOThVPXAHF Fri5ktGKyZDYxyOlIH2kI5G7GTgHFG49hSd64jYeuetBQkEZ69x1FACeZg4Y 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 4knm03c8jFmPny8knJP3qjk8AeFEjJ/svHv9ol/+KpiOitbeK3hSGGMRJGAq qucADpUwGCeepz0oAR/lHHUn2GawtU8HaFq0/n3divnHq8bFCx9TgjPQUXBo gtPAXhq1nWZdOWRl6CV2dc+6k4P4it26t7e5tZbCVN0MsZjeMEqNpBGMjpnm gPUwB8PvC+MHSwf+28o/9mpT8P8AwsOmlZP/AF8y/wDxVIZJofhHStE1Oa+0 wSK0i7ArSb1QZ5A4zzgdSaLrwR4cvbuW6utNDyzOXkbzpBuY9TgNgc0xEbeA PCoUk6USAOguJf8A4qo7fwHoNvqsOo2sUkHkncsYk3oW55IcE557HtQgZvat JYQ6VcPqgT7HsPmhlyCuOeB1rA8C6TLplpfTtbLbwXdw0trb4O9I8fLuJ5yR jg9PxxSGdTgH5iCfTrj8qztW8P6XrQQanbtNszgCV0HPrtIz070ARaV4d0jQ 5XbS7IRPKApzI7ZHP94n1Na6qQDycn9KYjO1jQdN1ryTqFuJGgbdG4ZlZfoV INRW3h7S4LjzPsqzzK3D3LtMyDttLliPwxRpuJp99CsPBXh4STSR2TxecSZF iuJY1bn+6rAY9ulP0/wd4e068ivLGw8ueIko3nSNg9OhYikUJf8AhHQdUvZb 2+sPMmdhucyOCcDHQEVPF4W0SLS5tMSwjFnM2549zHLeuc5B+lO4rF6wsLbT bCKysoljt4lKon456/n9amZMMrBgqr2xRcLD8+pH51iar4T0DVbg3N9psckx 6urNGW+u0jP40hj9H8M6PpD+dY2EcMpGCxJdh7ZYk/ka2FUKMD+VNsSRnaxo mmazEItSs4p8H5Schh9CCD29aoWfgnw5YzrNBpcZcdC7u4B65AZiO31ouwsd Aqqq4UAAdABimE7mZB1HfrigY5U29Dx16Cs7VtA0nWV/4mNhFOwGA5yrD23D kUXCxnWvgbw1bTiWPSYywHHmO7r+TMR+ldEqKgAUBQOgAxRcBx6VSv8AS7HV Y0TULWKdEOVEigge9C0E9SSx0+z06DybG3jgiznZGMCp3YLgHv04pDECHJJJ ye47Vkar4U0PWbv7XqVl50+0Lu8514HTgMB3oAms9C0vTSv9m6fbQtxllQZ4 9+p/OtJUCg+p6mm2SlZiTwxXEDwzxrJHIpVlYZBB7Vhr4V8OuzbNKshtO0/u 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 47owPM0+Qeq9ABnPIPrmtbS9HtNW1eHUdQ8Tw609so8mMBECH+9tBPcenb2F PTqL0O4iQJGFXdt7A9qjvIjNZzQgFi6FfvFe3qOlIZwHw0MVl9v0a7lVLuGd mKAdVwo3DI5H/wBapvive240CGwS5jNwZ1cxeZ8xXDc7R2oA7CC9s00yK4a6 txD5Yw3mKFPHqDjpXG/CqRJLC+Z5IgXuiQAcHJVTxk5x/hQBV0x5dC+KV0uo ArFqG5YZX5DE4K/Mxz2I6+nGMV6Bqt/Bptk11cswC4CqoyXY9FA7k9BRsA6z 3NbLK0LwvKAzRtgspPYn1/OrXQU2B5k63HgzxncXM4J0nVHObjbuCMTn5uOx J49D3xXo1nNBcQJNazRzxOOJI2DKccduO1HkI888Z6laXvjrQLW2uA5tpwJS gDqjF14x6/Lz+HetL4q2dxeeHYmtYXl+zXAklCg5Vdrc47j1Pb86S1G9DpfD t9DqWi2t3byNIjxjlscHuOO46VJY6pDf3FwlsjtBB8puP4Gbuo9cdz07Z4NF wOHmubeb4wLmeLyxBs3BgwJC5wS2MH/dz2/2qPiQjWeqaHreGmt4HHmYO4YB U8A5AyM8/T2oWoHei9tUsku5LmIQMoZZWIA2kjBz+Irz/wCH15Zz+KPEMouV H2iXzIiWxvG9zkA9eCO3ftQmDRZ+KSywSaLqSopS1nJb7xI5U9OmPl789K6W fxT4etoPtMmr2ZVQM7Jd7nPT5Rk/pRewbnJfDqdbrxX4hnZZY5JX3hJOHTLt kEE9RkDv/jf+LhP/AAjEADYH2pcjnn5W9OPzoA6XSr+01PTIrixdJYGUEngE Hjg46H1ri7Jh4k+J5vrExtZWEex5Q33vkYAjI55Y9OMLnPIyXuA7wXImieMt b0rUZHgmvJA1uHJbzBlyDuJOTg9+vPcV1+sanDZtDAm+e5k+WO2jb55Omeew x1JIHPvRezsJ6oyPiRcwJ4OuYZJlSZ2iKxs4Dn5weB34B/I+laPgy5tZvDGn RwXMMskdrH5ipIrFTtAwQOnTHPpRcZoXVpHqVhPa3Ch454yrKzevAIx0rzTw udRuf+KMm/di2uWmuGwOYlI+TDLyGY557du1N6iRd8TXLeDvGx1eC3U299bM GVcZZx/IZ2Z/E4zXX6Zo5h8LHT5yszywsHZWK72YZJyMckk80Acv8L5004al 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 U5Ui2QHPscUXs9B7rUsPHIVKLjYB91hjA9DUdjpWl2kglttPs4Z8ctHAitj6 gdOlNsSLV3FFNEY5okkVuCHUNx9DVK00mz02Qy2dnawZHzGKBUJx64FCYNdT TDBvukH6Go5WfhY+p74zikMzW0XTJ5zLfaXZTSueZGtkYn6krn0q9Np9lcW3 2a4tLeWDj920QK8dOKbbEloVYdMs7UeVaWNrAhOWEcCqCeh6Dr0q1bwRQn/V KpB4IX+tF9LILa3JfLiY7/LjOec4GTVZY2xmLYkbEMy7MH8h1zQgfkW423qG wRkdDTZ0jdMSxiQA5wVz+lSUVBbqcuYANo+7s5z+gNW0WJWwoVXI/GqZMfMW TOMhckcjpxWddafZ3xSTUrO1uVTIVpolfA9fmHT6elCBlmz06wsd50+ytrXz MFjBEqbsdM4HP/16mkdwwADAEZ3Ae3Q8UlqNhEXAw6BST1ByDUOrPcppN29h EJrkRN5KHozY4HUUn5Ar21OJ+Hfhu90dL261C3MF3LiOMNtY7O5DDPc8/QV3 sPyjaMAKMYAwM1TWguo5ztUk9MdB1qlcWlvfxqby0jmCNlVnhVtp6cZBoS6g 3rYfZ6dYWWfsdjbWxOf9VEqe3YfSrMxYRkopZvQED+dLd6jei0Kd9ZxXiFLy 2iuo1+YRyxK4z9CPSltNO022+ez0+0gfAyEhVCPY4HuaYupZkchgqBuepUDA Pv6U2NZEcmRy3J6DAA7ZzR0DW5MSNv3sZ6GvPNT8M6vrXxBF9d2gXTI3XbIJ E+ZVGRxknluvHSpKO9tw0Y8tssRg5AwBn/8AVUzY6FsU3uJbFd0dh8nmL14z +R9f1qSEsI9r/eXjJ78UMSVmQx2tlbXE09ta2yXEgy7Roqu59yBk0rLMwyc7 eygAEfrTQO/QeYIJk/eQRndyQ6gmpMKiBY1GPReMUhkUgdSGJZgOwXJqYuqj 5nA+poYCOxOAnfuOaiiWVJfmJYMTyew/lQhO5OWTB3Fcd8mq7xo/MSgHqGUc f/XoWg2r6Do28tirKVUfxdun1qQmPcCSu7t0oAhlEjqyqCBkc9sU+GQ5KOpU jgE9/wBKfQV3cezDay5G7HTP5VW+y/vDIUG44wMDj8aE7A1fUtBxyNwyvXNM lXfjHI60loN6kRR0kAC4BPVcjH14qdwjjDbCOg3DPNDEiMquNkcY2vkZXGBx 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 sJO+x0VvClrbxwRlyiAKu9i7fiScmmxsZuW+5kjAHDD3oBvWxhQeEk0+5nl0 TVLzTo7h98kEYR4wcfwqynH+fbFC9+H9hNNBdvqV+LmFt7XDyBmc5yM5GAAe mAKWgXaNdtBh1PQBp+tzSXxb5vNkUI6t6rgDGO3t1zVaHwveW9kthD4k1JbI KU8vbGXC+gfbkcU3YFc1I7CGy0pdOsi9omNqNEfmUk8tkg857nPXmsKy8A2V lete22ravHcucyOJkBfnJBIXkE9aGGpb8ReELbxDOsl7qGoBFxthjkURr6kA qeetTpo8sWntYf2vqRMg2/aN6+YigcANs/8Ar8nmhJBeSfkVNE8F22iXT3Nl qmpK8pBmUvGVkI9fk9z+ddN04ApAr9TM1zSbXXtOk0698wRvht0fDKQeoJyP /rZqjbeErfTVxoV/eabu5dY2EiOfUrIG57cYpgDeFoLjUYb7V7yfU5oBiNbl UES9f4FAGffnoPSr+sSf8SXUnUhWS2fDBScYQn8fpQBx/wAPdBL+HodRsdSu 7K5nLpMY9jrIFYhcqwI4H8zW5aeEbWHVf7X1K7m1K+XGyS5ICIR0woGByfw6 jmjQNS3rnh+DxDbrFcXt9BAeTFBIoVvTIIPtx0qXQtBTQ7cW0F/eT2yrtSKd kKoM5OMKD3PWkMzl8Jpp+oXV9o2o3WnvdNuljj2Oh64IVlPcn8+1aWlaPHaX Mt9Pcz3l7MoVppyNyr/dUKAFXPOAPrmq06ErmvrsZmq+CbbVbpLm61bVmkhO YcTIBEc5+X5MjoOevFaUulxXWjtpl9JJqETZDtcEbzzwcqBjHOOMjFJDdyha eEZLGw/s6y1/UobLBAjAi3AE5OG2ZByTyK1rfS4bLTGstP3WwYH96pG/J6sS Qct7nNKyuNtmDbeCbSPVpNRi1nV/tbH5phPGSw44b5Ppx7D0qTUPAtnqOpDU LrV9XNwrbo2EyDy8dNvycYotYEzXn06Q6QLE6pfLjO66EiibGT3C474zj/Gs jR/BtrpeoNeWuq6qszsGmDTIwlOd3z/Jz3568nnmiyaFd3LGq+D9P1PWI9XF xeWl7GBiS3cLkjoTkH6fSm6h4aOoRBNZ1a+vraM7vs7bIlf/AHiiAnHUDPpT Bk2reGNO1uyt0k3wPbkGCaAhXi5zgHHTikn8MfbtseravqF9bgEeQzrErdPv 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 PXcn+KS3ltZ294mrXZglnC/Z0wqKMZGCBknjvnr7VozaHq2ubLjV9YnsU6RW tlJxETjG5/4z0z79PdpIbIPBV7e6d4k1LwzqF1JeNCPNimYkkjC5HJOOGHHr nmrfjPX9QttSs9B0Zkhvb0A+fJ0QZPT349P50gFPhREtCtrreprfL863DXTP ubBwCv3SPbrWX8KGnQavBOrb0nHmEnjd0OOOvHr6cU3boJEvi/xNdN4hXw5Y vPbpwbmeCNnkCkAkIFyeh64qjrI8q0gufDsviI3sDKwjliuXWcZ754HrSSBs 6PVZ9Q1LwfJfw3V1ptxHatJJCqAfNtztYsuRj2xXP+EYda1bwzCpv3sdP3SB 5Y33zzksehIOwDOM9ePcUJJjbaRHfR3/AIO8UaS9vql7e218/ltHdOTjkDnt 3yOAePrXpisCoIzg+tADJCQCNu4HvjP9aWEII8rjDc0+gjhvh1j+1fERZgJP tjDhv9pv4e3fn6+ldlduwgnUKTiM8AjcTj6/zpDOP+EqQ/8ACOTMhHmNMRJh yegGOMYHGOma2vHcMcvg7URJn5Ity/Lu5HI//XQBx+k6Jd694W0O9tZo/tun OzKkwwrhZOBuAyB8orf13SdY8Svp9tdWdvZwQSia4fztzkjPyoVOccnk49aY BrTjX9VTw3bySG1tcNfkAjdgcJu98gnHYHmr8OvwG6mtdP06+vlsztkkt9gR W7r8zjJHfGcUC6mtpGqWmsWEd5YyB4nH4g+hq07bVJYcZ+mBSWo3oedeL/t9 pr2is2pXjpc3Q3RDCxqNw4yoGfoc966vxmu/wdqRGOLdj8yZ7foaAOO8N2Os ax4dtbe91BrHTY1AjW1IMs/uWydoHTHHepYf7T8I+MLGwbU5r2w1D5cXTH5e e2SeRkegOcYptCvqdtr9pc3enSJa6jPZOqk5hVSTx3yCcfTFefeDbPWtc0KW 3Ory2lrJKziSMlpWfjOTnhc+nJ5/FJLqPU19Su7/AMCeGNjajJqV5cTbYZJU OE7nOW5/z26VvLtLrSxJcXfiWPVJYwxufs06hXx/cUbcZ7D8+9CQXNTwHqOr ahpz2ut290s1uciWaMqZF7dRyQf6da5ufWzqHjS5tPEmq3VhZQOywx25eEZy Au7AzyOcnj0IHUEbE2nanp+r6bqujareappJlCyQ/aWk2qRjdnOCvOcf5Haw 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 C4ubnRLWLywZZAyrIdpI7DOd4OB9aGGx0cnhXQgXaCxS3mJJ8yAsjgn3Ugge 2QOtS2HhzTdPvXvLSAmeUBZJZpXkcgdBlifb8hRcB+p+HdK1O6jvLq1zdRDC TRytE4/4EpBpLfw3otssgFhDI0obzJJh5juDjILNkkdOpoQNGPfaVY+FtHud S0uKdJLWJjDGZ5ZI8kHqu7GOfTjGazvCXhnw5rehRald20dzeSktcFJmUB85 xtXaq8EcY4z360MI3MnxVolr4cv7R/Cd5cQajO4UWkMu4leSGPOduQOuQfwN ehX+kWOs2iQatapMuMqhblOOoYc/iKPMPIhtvDGjwS28iQyym0P7lZbmSVYz jHCsxAOPan6x4d0jWJEl1GwW4kj+4dzL+eCP1oWgCaT4c0jRp2n02z+zySja +HZsj0wSRVS48E+G7id55dLj3McufMcZ9+GwKd7u4W0NS0061sLFLOzgxbqQ AhckYPXrnI9qzT4O0EmU/YTEJcGRIJpI0fHTKKQP0ouK2pry2Nm9gLGS2je1 CBBCUyoUDgY/CseLwXoMUbRJZMIC+8wi5lKOeDkru2noOCMcUhmnfaRYajYf Yb22WW1yCIySOR7g1Rt/CWgWdzHc2unJBPESySIzAqTnPf3ovqFiS+8NaRqd y1zf2EU0zArvbJ+XPHfj/wDXVnS9H0/R45I9MtVgSV9zqrHBPTPJPYUNiS6l 1nwcYJ/A1g3XhDRL+5a8u9Nia4k+/l27/QgZ98UJ2Bq7L1poOk2mnzWEFhEt rO5eSFhuVmOOxz6D8qzv+EP8Po8UaWQdI2LrC88jxg9fuFtv4Y5/CgZPN4X0 a5khnms1jmgXaskLGFlGAMZQrkAcVGfBfhstl9LSRixYu7uzMSckkk5P40Pe 4LaxZudC0y5tYLKawilt7YfukYAhPYD6fypNP8M6Nps6XFjp0EM8a4SQA5HX P86bYkiG98IaBd3322WwCT5JLwO0WTzydhHPJ561b0rSbHTY2j06FI4ixLYZ mYt3JJyWP1PYUrjsVZfCPh+W5a5l0u3eZ85LKSCTySRnGc96uS6NpbaV/Z8l lG1mvPlYOOKAKdv4T0KB0mh0m2SRMFDjlSPfrVvV9D0vWViGpWcc3knchORt 9uO3t0ouFi6yAReVETGAMDA6UsUexQM8gAUXAJUiliKSqrxsOjcg1zl14I8L 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 SM5C7+G2hXcplT7XagkkxwSgJnPUBlOPp04rS0bwXomjyJPb2pluUGBLNIXO fX0B+gpi1OgfJO3AIIOciqEGh6TBOJ49MsVnBJ8xbZA3PuBkUBbU0jgDJ4Ap r5Py4BBHOf8ACkMcKQAKMKAB6dKAGlVcHhSvXkdf8acue5/+vTAWolDeZ90q i8KBjBHv/nvQhMkAAGB24pHAONyhueOM4oCwoAyT3PWlpDEJ/WmrGFBC559a Yh9NPzHA6ZwfypDFCgKB1A9aD04I9qAGOgkPX5cY4NOJWNCzbVVR19BT8heZ zt54pSO5CWsW+LIUu6kfMT2/D1xTtO8RRXLrHewmHLfLIBlDnPX0rd4eSVzn WJjKVraHQ/UignjjrXOdI2NNg5OT6460+mxJWE7/AC4680iqFGB26ZpAO4I9 QaY2X4VgB3PoaYMVV2gAdAMUpyOaQxBnJ3Yx24p1ABRQAUUAFFABRQAUUAFF ABRQAUUAFMiYsDuXaw6jOcUCHnpTTn+HOevU0DFUhxkcj1paAIictk7lHfJ9 D6VIOgxwKbEgJwO/4VGpdZWDfdb7vPNCB3JaQ8dO59aQxqgBtpJPcZ5/KngA dBQBG+GXaGbP+yeeKWM8bNxYrwSeDT6C63HHtwOPWms5GNqlgTyR2xQgbsKj BlBXp9KUkAZPakMgLSGYZV1VepB4PH0qx16iqZMdb3EJwenP41GhZWIJG3ty Sev/AOqkNkg5+8BmsvVdah09xEEM039wHbj6mrp03OVkRUqKnHmZnweJkEm2 e2IBOco2W9sjHNdDDIssKyxMGRxuUgYBBp1aTpvUmjWVVXQrAsuFyOOvSkgL mIb+W4yex+lZ6WNdbknTJJ4qGRnByE3AHnBzjp2oQPREvysuTgj3owqDgAAf hSGY3iWHVn0959H1P7HLCjybfIWQS4HC/N9361geDJ/E+taWupya7CI2ZkWC SxVwAMc5Uoc9fb+gBpXz+LtMjFxANP1WGMZkjWNoZXAHY7mGf8jNW9B1/T9b s/tdpISC20pIDuRzg7SencdKaXQTa3YvibxDB4fsw5jM11MdlvbqMtI/bp2r P+w+LriNZZfEUNnJt+aC2sFlVSP9pjkmpWrG9EQ3Otat4Xe2bXnj1DTpn8s3 qR+VJE5yfmjGQR16Y6fTPQ3Zl1LSd+kalHA8uDFdLGJQBkdATg5HFV1Doec2 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 9aH5CPY72HTPFHhxmOy4tp4y0cgUZQ4OCM9GFePeB9QNh4osZAZPLmcQShCR kOcDoR3wfwpge8BcDgAc54pJCoQlsYHPNAhkaswHmclSCDjHNSjp6U2CIJzs O5QC3oT/AJ9K5jXNWMubWFmKL98qvX0H0xW9CKlLUwxE+SPqc7IFQNvfBV8A ljyvfj9MitbSNLe7IacN5AX5duAC3oAO3T8vauupLkjzI4acPaSUWjrFXCLs yTjGwjr7Zx9PyqRYzKCW2sufrkfTjB/OvNPVFXcHMa4O3lSW6A1YUYUDOcd/ WmxIRwCO+R0wajQhwDyenU9PSl0G9yamtjr3FIYyFQQHOCSB83r/AJzUjDPf H4U29RLYYUbzg64A/i9T6VJQwSCikMKKACigAooAKKACigAooAKKACmAiReR x3B6j6igB21f7o/KkZ9pAwck4HFPcT0BMlQX6+2R+lKeOe9IBrvg7RjcQSMg n0/xpQCDk4zjkjvTDqLj5vw9KYXZjiMAjdgk+nehA32HKiooRAQBR90cn5QO /WgLWQ3iUdflyMYGOQakwM570Au41nCrknvj8elNKLKAXGcHIweKBOz0JPem O5XgAFj0GetBQKpYKzgBscinY9KBIj80mQou3cCM9eB+VPCDAx8o9BRsJO46 o/M3SbVKjp1757Y+lCG3Yxtb1ZNNHlQbXnbjG3IQY78jP51yNxK8k3mTOxkY h8uBnI579u38q78PDlXN1Z5mKqXkorZC2ltNdzFC77ixz8u1UB46ED9T3/Ad lp+nw2kTJCqnduJc4brjjj6/lUYmenKaYSnZuVi5+8VflXa20qMnJznj/H8a mgi2KR0APy4OeO3WuPod+pKygjpyOR2prPhto64zyDigNhVXLB8sCR0zxS7f QkUXCw3zDu27SDn/ACaURqpbGfmOTz3o2DcXoeB15+tRBmdgFxsOd2c59sGh A32Hxp5ahQSQOme1PoeoJWViPDSffwFGOAec+9P2jOaAGl9oBOAD/npQU3MG YDjoCM0BuOx7nrmopZWRtiAFjgjPA60JXYpNpaEgUFt4JOR68UYCnIHagdhp cs+E+8CNwb0pViCknJbJzz2o2DcVVCjA6UiPv6AY70B5CqgBznP1AoZwqljw B1o3DZCKfMQ5HBz1p2B0H1o2Aa8gjUM/GTRt3EM3UZ9elGwXvoPpjvjIHWkD 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 0AIc4+UgH3GaFBA5bJ+lAC0hBOOcfSgA59R+VKfagA5z1ooAQ57etJtLMdwG 0dPXPNMWo6ikMKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigA ooAKKACigAooAKKACigAooAKKACigAOccDNFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFACHnjmgZKgkYOOnpQAtFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABSEkEDBPv6UALRQAUUAFFABRQAUUAFFAB RQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFAB RQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFAB RQAUUAFFABRQAUUAFFABRQAUUAQNO4vY7dIWZShd5DkKvoM4wSfTtj6VPQAU UAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAU UAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAU UAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAU UAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAU UAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAU UAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABQelAAM9wPzooAKKACigAooAK KACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAK KACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAK KACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAK KACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAK KACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAK KACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAK KACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAK KACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAK KACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAK KACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAK KACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAK KACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAK KACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAK KACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAK KACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAK KACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAK KACigAooAKKACigAooAKKACigAooAKKACigAooAKKAE53HkY7DFLQAUUAFFA BRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFA BRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFA BRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFA BRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQA0IwkLe YxGMbeMD9M06gAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKA CigAooAKKACigAooAKKACigAooAKKACigAooAQkL1z+AzS0AFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFF ABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUE4GTQAUUAFFABR QAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABR QAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABR QAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABR QAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABR QAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABR QAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABR QAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABR QAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABR QAUUAFFABRQAUUAFHpQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQA UUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQA UUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQA UUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQA UUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQA UUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQA UUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQA UUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQA UUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQA UUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQA UUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQA UUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQA UUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQA UUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQA UUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQA UUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQA UUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQA UUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQA UUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRmgAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig AooAKKACigAooAKKAGu+zkqxHqozj8BzSo6yLuRgynuDkUALRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQ AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQB//ZCmVuZHN0cmVhbQpl bmRvYmoKNiAwIG9iago8PCAvTGVuZ3RoIDI4ID4+CnN0cmVhbQolIENBTk9O X1BGSU5GX1RZUEUwX1RFWFRPRkYKCmVuZHN0cmVhbQplbmRvYmoKNyAwIG9i ago8PCAvRmlsdGVyIC9GbGF0ZURlY29kZSAvTGVuZ3RoIDQ1ID4+CnN0cmVh bQp4ASvkMrUw0jM3UjAAQgsTQz1LIFPPAMgDEcm5XPr+SVmmCi75XIFcAMO1 CRUKZW5kc3RyZWFtCmVuZG9iago4IDAgb2JqCjw8IAovVHlwZSAvUGFnZSAK L01lZGlhQm94IFsgMCAwIDU4Mi43MiA4NDEuOTIgXSAKL1BhcmVudCAzIDAg UiAKL1RodW1iIDQgMCBSCi9SZXNvdXJjZXMgPDwgL1hPYmplY3QgPDwgL09i ajUgNSAwIFIgPj4KL1Byb2NTZXQgWyAvUERGIC9UZXh0IC9JbWFnZUIgL0lt YWdlQyAvSW1hZ2VJIF0gPj4gCi9Db250ZW50cyBbIDYgMCBSIDcgMCBSIF0g Cj4+IAplbmRvYmoKMyAwIG9iago8PCAKL0tpZHMgWyA4IDAgUiBdIAovQ291 bnQgMSAKL1R5cGUgL1BhZ2VzIAo+PiAKZW5kb2JqCnhyZWYKMCA5IAowMDAw MDAwMDAwIDY1NTM1IGYgCjAwMDAwMDAwMTUgMDAwMDAgbiAKMDAwMDAwMDEz MCAwMDAwMCBuIAowMDAxNTIxODIyIDAwMDAwIG4gCjAwMDAwMDAxODMgMDAw MDAgbiAKMDAwMDAxMjk2NCAwMDAwMCBuIAowMDAxNTIxNDExIDAwMDAwIG4g CjAwMDE1MjE0ODkgMDAwMDAgbiAKMDAwMTUyMTYwNSAwMDAwMCBuIAp0cmFp bGVyCjw8Ci9TaXplIDkKL0luZm8gMSAwIFIgCi9Sb290IDIgMCBSIAovSUQg WzwwMGY1YTRmNTIyNWM1YTIxMDQyYmY2NTUzYTZhY2YwZT48MDBmNWE0ZjUy MjVjNWEyMTA0MmJmNjU1M2E2YWNmMGU+XQo+PgpzdGFydHhyZWYKMTUyMTg4 NgolJUVPRgo= ------=_NextPart_000_005B_01C2A9A6.0513E2AA-- From alex@zadarastorage.com Sun Apr 10 13:40:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 039D67CA0 for ; Sun, 10 Apr 2016 13:40:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A2C0E8F8033 for ; Sun, 10 Apr 2016 11:40:34 -0700 (PDT) X-ASG-Debug-ID: 1460313629-04bdf011053ab620001-NocioJ Received: from mail-yw0-f175.google.com (mail-yw0-f175.google.com [209.85.161.175]) by cuda.sgi.com with ESMTP id cB82ibu9yBK33DIX (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 10 Apr 2016 11:40:30 -0700 (PDT) X-Barracuda-Envelope-From: alex@zadarastorage.com X-Barracuda-Apparent-Source-IP: 209.85.161.175 Received: by mail-yw0-f175.google.com with SMTP id o66so94651111ywc.3 for ; Sun, 10 Apr 2016 11:40:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=Q1brdS2N1ldJ55rh7o5Ol0HQbwgTrbtAq+0DAwwoZ1s=; b=uKUoVkXXZlT5f6XBfUGTm+frzixuUVeJJ9QNuS20WElyONjdrWnQgC/PdRN4OO9hQw +DQiCvF4Q4UR71Wrl891d21QQ7tdtMzjqVzpHKXmrWXfUBHOmZaMZzf67Qa0u+5uAVGP 6ZzLx5VwXpXEQH07QlHNUMo9cBcwMNOCHtHIvoI2g5r+vcOBkRgRYfGlHaLAM+j7rVeP mi9Zfb9RCNJ8PfBxv8IrPLYal9PDPxB/1tbLtTgJu4q2qSeM2VV3BdRTGG/cmacVfXNg Du0Z9c8LCmhkFk+DETR2TpRtvidts7jIHBoaL71DJGmzXOxD0eu8sKHFji4EfXvXosHt StoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=Q1brdS2N1ldJ55rh7o5Ol0HQbwgTrbtAq+0DAwwoZ1s=; b=cT0YK5GjJywCQm3KOS46+pTOAFFewtQAyi7GCUNUH7FCnzAirL2lhc7mAiGG6irCiY h1UqNAEeo91OvvCowQxaH5kw6XbpC+h4k++6ZiqmT7bYmr1YPtKQp9CzJTp8pELVKlIn qdE1ibhs7PIeKRU6orbVVB/RDe1kNQIcLRe59LTwwyPrBv4hevklrDCtuT2POXYA+3h+ 955m1zmsqwQlUt/M0ctUhQfDHI7q5wOzdhsOeQtK3KKoAVVpoxMLpDA0/WFcOtQKiBEd wcSSx2RGhxV2UGS4yAYny+/qAEw/5RX4Mr7IrDpA4kRBEMQuw5SfVbA6LTr6I5onLo9v BvIQ== X-Gm-Message-State: AD7BkJI8Lqpj+KqLBfi9pOjlJEgna1NjiS1ibsUgCiw3cNJIj/+qgOUpodC8nX2IJ20dvQdugsr3di+6b0mnRg== MIME-Version: 1.0 X-Received: by 10.37.101.87 with SMTP id z84mr9870192ybb.101.1460313629462; Sun, 10 Apr 2016 11:40:29 -0700 (PDT) Received: by 10.37.19.6 with HTTP; Sun, 10 Apr 2016 11:40:29 -0700 (PDT) In-Reply-To: <20160408224648.GD567@dastard> References: <20160322121922.GA53693@bfoster.bfoster> <232dd85fde11d4ef1625f070eabfd167@mail.gmail.com> <20160408224648.GD567@dastard> Date: Sun, 10 Apr 2016 21:40:29 +0300 Message-ID: Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery From: Alex Lyakas X-ASG-Orig-Subj: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery To: Dave Chinner Cc: Shyam Kaushik , Brian Foster , xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-yw0-f175.google.com[209.85.161.175] X-Barracuda-Start-Time: 1460313630 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28611 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hello Dave, On Sat, Apr 9, 2016 at 1:46 AM, Dave Chinner wrote: > On Fri, Apr 08, 2016 at 04:21:02PM +0530, Shyam Kaushik wrote: >> Hi Dave, Brian, Carlos, >> >> While trying to reproduce this issue I have been running into different >> issues that are similar. Underlying issue remains the same when backend to >> XFS is failed & we unmount XFS, we run into hung-task timeout (180-secs) >> with stack like >> >> kernel: [14952.671131] [] >> xfs_ail_push_all_sync+0xa9/0xe0 [xfs] >> kernel: [14952.671139] [] ? >> prepare_to_wait_event+0x110/0x110 >> kernel: [14952.671181] [] xfs_unmountfs+0x61/0x1a0 >> [xfs] >> >> while running trace-events, XFS ail push keeps looping around >> >> xfsaild/dm-10-21143 [001] ...2 17878.555133: xfs_ilock_nowait: dev >> 253:10 ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > Looks like either a stale inode (which should never reach the AIL) > or it's an inode that's been reclaimed and this is a use after free > situation. Given that we are failing IOs here, I'd suggest it's more > likely to be an IO failure that's caused a writeback problem, not an > interaction with stale inodes. > > So, look at xfs_iflush. If an IO fails, it is supposed to unlock the > inode by calling xfs_iflush_abort(), which will also remove it from > the AIL. This can also happen on reclaim of a dirty inode, and if so > we'll still reclaim the inode because reclaim assumes xfs_iflush() > cleans up properly. > > Which, apparently, it doesn't: > > /* > * Get the buffer containing the on-disk inode. > */ > error = xfs_imap_to_bp(mp, NULL, &ip->i_imap, &dip, &bp, XBF_TRYLOCK, 0); > if (error || !bp) { > xfs_ifunlock(ip); > return error; > } > > This looks like a bug - xfs_iflush hasn't aborted the inode > writeback on failure - it's just unlocked the flush lock. Hence it > has left the inode dirty in the AIL, and then the inode has probably > then been reclaimed, setting the inode number to zero. In our case, we do not reach this call, because XFS is already marked as "shutdown", so in our case we do: /* * This may have been unpinned because the filesystem is shutting * down forcibly. If that's the case we must not write this inode * to disk, because the log record didn't make it to disk. * * We also have to remove the log item from the AIL in this case, * as we wait for an empty AIL as part of the unmount process. */ if (XFS_FORCED_SHUTDOWN(mp)) { error = -EIO; goto abort_out; } So we call xfs_iflush_abort, but due to "iip" being NULL (as Shyam mentioned earlier in this thread), we proceed directly to xfs_ifunlock(ip), which now becomes the same situation as you described above. The comment clearly says "We also have to remove the log item from the AIL in this case, as we wait for an empty AIL as part of the unmount process." Could you perhaps point us at the code that is supposed to remove the log item from the AIL? Apparently this is not happening. Thanks, Alex. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From david@fromorbit.com Sun Apr 10 19:05:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2348D7CA1 for ; Sun, 10 Apr 2016 19:05:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7FD93AC003 for ; Sun, 10 Apr 2016 17:04:57 -0700 (PDT) X-ASG-Debug-ID: 1460333093-04cbb02e1c95430001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id q17WUd7ZIK6et1jw for ; Sun, 10 Apr 2016 17:04:54 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DhDQDX6ApXPDGaLHlcgzeBUIJyg3mfWAEBAQEBAQaMEYVohBCGBwQCAoEfTQEBAQEBAQcBAQEBQkCEQgEBBDocIxAIAw4KCSUPBSUDBxoTiCa8UgEBAQEGAQEBARwZhUCFE4dqgisFmASOAo8XhAKLJIJmGYFcKjCKKwEBAQ Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail05.adl6.internode.on.net with ESMTP; 11 Apr 2016 09:32:39 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1apPJO-0006AB-R2; Mon, 11 Apr 2016 10:02:38 +1000 Date: Mon, 11 Apr 2016 10:02:38 +1000 From: Dave Chinner To: Christoph Hellwig Cc: Eryu Guan , fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs/259: handle minimum block size more precisely Message-ID: <20160411000238.GB9088@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs/259: handle minimum block size more precisely References: <1460027155-4222-1-git-send-email-eguan@redhat.com> <20160407213231.GD761@dastard> <20160407234837.GA1439@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160407234837.GA1439@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: 1460333094 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28623 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Apr 07, 2016 at 04:48:37PM -0700, Christoph Hellwig wrote: > On Fri, Apr 08, 2016 at 07:32:31AM +1000, Dave Chinner wrote: > > > diff --git a/tests/xfs/259 b/tests/xfs/259 > > > index 16c1935..3150ff3 100755 > > > --- a/tests/xfs/259 > > > +++ b/tests/xfs/259 > > > @@ -51,9 +51,7 @@ testfile=$TEST_DIR/259.image > > > # Test various sizes slightly less than 4 TB. Need to handle different > > > # minimum block sizes for CRC enabled filesystems, but use a small log so we > > > # don't write lots of zeros unnecessarily. > > > -xfs_info $TEST_DIR | _filter_mkfs 2> $tmp.mkfs > /dev/null > > > -. $tmp.mkfs > > > > This tests the configuration of the test device, which is not > > controlled by the test harness, so can be different to the > > configuration being used for the scratch device. > > > > > -if [ $_fs_has_crcs -eq 1 ]; then > > > +if [ $XFS_MKFS_CRC_DEFAULT -eq 1 ]; then > > > > IOWs, this is not an not equivalent test. > > And I think that's the whole point of this change :) > > Previously it tested what the TEST_DIR did, which was wrong for this > test. Now it tests what mkfs does by default (including for the scratch > dev), which is what we really want here. Which is not at all clear from the patch description. Seriously, though, this does not belong in common/config. We already have a helper function to check what mkfs supports (i.e. _scratch_mkfs_xfs_supported()), and if we just want a bare check then factor this into a _mkfs_xfs_supported() and supply the parameters specific to the test. Indeed, this is basically what we do with _require_xfs_mkfs_crc(); the same thing should be done, but without the "notrun" if -m crc s not supported... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Apr 10 20:21:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 873377CA0 for ; Sun, 10 Apr 2016 20:21:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 59CC8304048 for ; Sun, 10 Apr 2016 18:21:41 -0700 (PDT) X-ASG-Debug-ID: 1460337698-04cbb02e1a973d0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id pSs4ZWi084PqySfG for ; Sun, 10 Apr 2016 18:21:38 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AKDgCS+wpXPDGaLHlcgzeBUIJyg3mfWAECAQEBBowRg0+GKYYHAgIBAQKBIU0BAQEBAQEHAQEBAUJAhEEBAQEDAScTHCMFCwgDGAklDwUlAwcaE4gfB7xYAQEBAQEBBAEBAQEcGYVAhROHaoIrBYdlCIcTiQSOAo8XRY5hgxSBRyowiisBAQE Received: from ppp121-44-154-49.lns20.syd7.internode.on.net (HELO dastard) ([121.44.154.49]) by ipmail05.adl6.internode.on.net with ESMTP; 11 Apr 2016 10:51:28 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1apQXf-0006FY-Fb; Mon, 11 Apr 2016 11:21:27 +1000 Date: Mon, 11 Apr 2016 11:21:27 +1000 From: Dave Chinner To: Alex Lyakas Cc: Shyam Kaushik , Brian Foster , xfs@oss.sgi.com Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Message-ID: <20160411012127.GF567@dastard> X-ASG-Orig-Subj: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery References: <20160322121922.GA53693@bfoster.bfoster> <232dd85fde11d4ef1625f070eabfd167@mail.gmail.com> <20160408224648.GD567@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1460337698 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28624 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sun, Apr 10, 2016 at 09:40:29PM +0300, Alex Lyakas wrote: > Hello Dave, > > On Sat, Apr 9, 2016 at 1:46 AM, Dave Chinner wrote: > > On Fri, Apr 08, 2016 at 04:21:02PM +0530, Shyam Kaushik wrote: > >> Hi Dave, Brian, Carlos, > >> > >> While trying to reproduce this issue I have been running into different > >> issues that are similar. Underlying issue remains the same when backend to > >> XFS is failed & we unmount XFS, we run into hung-task timeout (180-secs) > >> with stack like > >> > >> kernel: [14952.671131] [] > >> xfs_ail_push_all_sync+0xa9/0xe0 [xfs] > >> kernel: [14952.671139] [] ? > >> prepare_to_wait_event+0x110/0x110 > >> kernel: [14952.671181] [] xfs_unmountfs+0x61/0x1a0 > >> [xfs] > >> > >> while running trace-events, XFS ail push keeps looping around > >> > >> xfsaild/dm-10-21143 [001] ...2 17878.555133: xfs_ilock_nowait: dev > >> 253:10 ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > > Looks like either a stale inode (which should never reach the AIL) > > or it's an inode that's been reclaimed and this is a use after free > > situation. Given that we are failing IOs here, I'd suggest it's more > > likely to be an IO failure that's caused a writeback problem, not an > > interaction with stale inodes. > > > > So, look at xfs_iflush. If an IO fails, it is supposed to unlock the > > inode by calling xfs_iflush_abort(), which will also remove it from > > the AIL. This can also happen on reclaim of a dirty inode, and if so > > we'll still reclaim the inode because reclaim assumes xfs_iflush() > > cleans up properly. > > > > Which, apparently, it doesn't: > > > > /* > > * Get the buffer containing the on-disk inode. > > */ > > error = xfs_imap_to_bp(mp, NULL, &ip->i_imap, &dip, &bp, XBF_TRYLOCK, 0); > > if (error || !bp) { > > xfs_ifunlock(ip); > > return error; > > } > > > > This looks like a bug - xfs_iflush hasn't aborted the inode > > writeback on failure - it's just unlocked the flush lock. Hence it > > has left the inode dirty in the AIL, and then the inode has probably > > then been reclaimed, setting the inode number to zero. > In our case, we do not reach this call, because XFS is already marked > as "shutdown", so in our case we do: > /* > * This may have been unpinned because the filesystem is shutting > * down forcibly. If that's the case we must not write this inode > * to disk, because the log record didn't make it to disk. > * > * We also have to remove the log item from the AIL in this case, > * as we wait for an empty AIL as part of the unmount process. > */ > if (XFS_FORCED_SHUTDOWN(mp)) { > error = -EIO; > goto abort_out; > } > > So we call xfs_iflush_abort, but due to "iip" being NULL (as Shyam > mentioned earlier in this thread), we proceed directly to > xfs_ifunlock(ip), which now becomes the same situation as you > described above. If you are getting this occuring, something else has already gone wrong as you can't have a dirty inode without a log item attached to it. So it appears to me that you are reporting a symptom of a problem after it has occured, not the root cause. Maybe it is the same root cause, maybe not. Either way, it doesn't help us solve any problem. > The comment clearly says "We also have to remove the log item from the > AIL in this case, as we wait for an empty AIL as part of the unmount > process." Could you perhaps point us at the code that is supposed to > remove the log item from the AIL? Apparently this is not happening. xfs_iflush_abort or xfs_iflush_done does that work. -Dave. -- Dave Chinner david@fromorbit.com From eguan@redhat.com Sun Apr 10 22:13:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8FC1B7CA0 for ; Sun, 10 Apr 2016 22:13:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 099AEAC001 for ; Sun, 10 Apr 2016 20:13:04 -0700 (PDT) X-ASG-Debug-ID: 1460344380-04cbb02e1c99850001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id KMwmVZW8RVVK3QEi (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 10 Apr 2016 20:13:00 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 127A580E42; Mon, 11 Apr 2016 03:13:00 +0000 (UTC) Received: from localhost (dhcp-12-159.nay.redhat.com [10.66.12.159]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3B3CwHQ000891; Sun, 10 Apr 2016 23:12:59 -0400 Date: Mon, 11 Apr 2016 11:12:58 +0800 From: Eryu Guan To: Dave Chinner Cc: Christoph Hellwig , fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs/259: handle minimum block size more precisely Message-ID: <20160411031258.GA10345@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs/259: handle minimum block size more precisely References: <1460027155-4222-1-git-send-email-eguan@redhat.com> <20160407213231.GD761@dastard> <20160407234837.GA1439@infradead.org> <20160411000238.GB9088@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160411000238.GB9088@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460344380 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Apr 11, 2016 at 10:02:38AM +1000, Dave Chinner wrote: > On Thu, Apr 07, 2016 at 04:48:37PM -0700, Christoph Hellwig wrote: > > On Fri, Apr 08, 2016 at 07:32:31AM +1000, Dave Chinner wrote: > > > > diff --git a/tests/xfs/259 b/tests/xfs/259 > > > > index 16c1935..3150ff3 100755 > > > > --- a/tests/xfs/259 > > > > +++ b/tests/xfs/259 > > > > @@ -51,9 +51,7 @@ testfile=$TEST_DIR/259.image > > > > # Test various sizes slightly less than 4 TB. Need to handle different > > > > # minimum block sizes for CRC enabled filesystems, but use a small log so we > > > > # don't write lots of zeros unnecessarily. > > > > -xfs_info $TEST_DIR | _filter_mkfs 2> $tmp.mkfs > /dev/null > > > > -. $tmp.mkfs > > > > > > This tests the configuration of the test device, which is not > > > controlled by the test harness, so can be different to the > > > configuration being used for the scratch device. > > > > > > > -if [ $_fs_has_crcs -eq 1 ]; then > > > > +if [ $XFS_MKFS_CRC_DEFAULT -eq 1 ]; then > > > > > > IOWs, this is not an not equivalent test. > > > > And I think that's the whole point of this change :) > > > > Previously it tested what the TEST_DIR did, which was wrong for this > > test. Now it tests what mkfs does by default (including for the scratch > > dev), which is what we really want here. > > Which is not at all clear from the patch description. > > Seriously, though, this does not belong in common/config. We already > have a helper function to check what mkfs supports (i.e. > _scratch_mkfs_xfs_supported()), and if we just want a bare check > then factor this into a _mkfs_xfs_supported() and supply the > parameters specific to the test. Will do. > > Indeed, this is basically what we do with _require_xfs_mkfs_crc(); > the same thing should be done, but without the "notrun" if -m crc > s not supported... Thanks for reviewing! Eryu From ming.lei@canonical.com Sun Apr 10 22:32:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A8A237CA0 for ; Sun, 10 Apr 2016 22:32:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3225AAC001 for ; Sun, 10 Apr 2016 20:32:01 -0700 (PDT) X-ASG-Debug-ID: 1460345517-04bdf011053bd710001-NocioJ Received: from youngberry.canonical.com (youngberry.canonical.com [91.189.89.112]) by cuda.sgi.com with ESMTP id qUPNGOnUVQ5juVgo (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 10 Apr 2016 20:31:59 -0700 (PDT) X-Barracuda-Envelope-From: ming.lei@canonical.com X-Barracuda-Apparent-Source-IP: 91.189.89.112 Received: from mail-yw0-f180.google.com ([209.85.161.180]) by youngberry.canonical.com with esmtpsa (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.76) (envelope-from ) id 1apSZx-0004cx-C2 for xfs@oss.sgi.com; Mon, 11 Apr 2016 03:31:57 +0000 Received: by mail-yw0-f180.google.com with SMTP id o66so102802122ywc.3 for ; Sun, 10 Apr 2016 20:31:57 -0700 (PDT) X-Gm-Message-State: AD7BkJJYMYI6eah/7gzIGVPpBAqIaijLihoozkRZHDmfStEMhZmVrbJjX5Bv7HQvlepwjnrCu1ZUbvnctx7nUA== MIME-Version: 1.0 X-Received: by 10.129.130.196 with SMTP id s187mr10406114ywf.315.1460345516477; Sun, 10 Apr 2016 20:31:56 -0700 (PDT) Received: by 10.37.36.197 with HTTP; Sun, 10 Apr 2016 20:31:56 -0700 (PDT) In-Reply-To: <1459752994-2205-1-git-send-email-ming.lei@canonical.com> References: <1459752994-2205-1-git-send-email-ming.lei@canonical.com> Date: Mon, 11 Apr 2016 11:31:56 +0800 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH v3 0/8] block: prepare for multipage bvecs From: Ming Lei X-ASG-Orig-Subj: Re: [PATCH v3 0/8] block: prepare for multipage bvecs To: Jens Axboe , Linux Kernel Mailing List Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Anton Altaparmakov , xfs@oss.sgi.com, Dave Chinner , "open list:DRBD DRIVER" , Philipp Reisner , Lars Ellenberg , Boaz Harrosh Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: youngberry.canonical.com[91.189.89.112] X-Barracuda-Start-Time: 1460345518 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28626 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Apr 4, 2016 at 2:56 PM, Ming Lei wrote: > Hi, > > Interests[1] have been shown in multipage bvecs, so this patchset > try to prepare for the support and do two things: > > 1) the 1st 4 patches use bvec iterator to implement iterate_bvec(), > then we can drop the non-standard way for iterating bvec, which > can be thought as a good cleanup for lib/iov_iter.c > > 2) remove BIO_MAX_SECTORS & BIO_MAX_SIZE, and now there is only > one user for each. Once multipage bvecs is introduced, one bio > may hold lots of sectors, and we should always use sort of BIO_MAX_VECS > which should be introduced in future and is similiar with current > BIO_MAX_PAGES. > > xfstests(-a auto) have been run and no regression found by this > patchset against linus v4.6-rc1-next-20160329. > > V3: > - include kenrel.h & bug.h in bvec.h for fix comiling failure on arm > as reported by 0day ktest > - build test on arm & arm64 > > V2: > - rename bvec_iter.h as bvec.h > - always include bvec.h into blk_types.h as suggested by Christoph > > V1: > - don't move BIO_MAX_* to bvec_iter.h as pointed out by Christoph > - run xfstests against v4.6-rc1-next-20160329 > - add Reviewed-by > - for 1,4 and 5, Reviewd-by not added, Christoph still expressed > 'this looks fine to me.' > > drivers/block/drbd/drbd_int.h | 4 +- > fs/xfs/xfs_buf.c | 4 +- > include/linux/bio.h | 52 ----------------------- > include/linux/blk_types.h | 22 +--------- > include/linux/bvec.h | 96 +++++++++++++++++++++++++++++++++++++++++++ > lib/iov_iter.c | 30 +++++--------- > 6 files changed, 110 insertions(+), 98 deletions(-) Gentle ping... Thanks, > > > Thanks, > Ming > > From eguan@redhat.com Mon Apr 11 01:25:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 83D5F7CA0 for ; Mon, 11 Apr 2016 01:25:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 57DC28F8033 for ; Sun, 10 Apr 2016 23:25:08 -0700 (PDT) X-ASG-Debug-ID: 1460355906-04cb6c24603ccb20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id pJWm1buZgqKDJpXU (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 10 Apr 2016 23:25:06 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 008C6804E5 for ; Mon, 11 Apr 2016 06:25:05 +0000 (UTC) Received: from localhost (dhcp-12-159.nay.redhat.com [10.66.12.159]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3B6P4FO006295; Mon, 11 Apr 2016 02:25:05 -0400 Date: Mon, 11 Apr 2016 14:25:04 +0800 From: Eryu Guan To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/6 v2] xfs: xfs_iflush_cluster vs xfs_reclaim_inode Message-ID: <20160411062504.GD10345@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH 0/6 v2] xfs: xfs_iflush_cluster vs xfs_reclaim_inode References: <1460072271-23923-1-git-send-email-david@fromorbit.com> <20160408032841.GW10345@eguan.usersys.redhat.com> <20160408113709.GA30614@bfoster.bfoster> <20160410092235.GZ10345@eguan.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160410092235.GZ10345@eguan.usersys.redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460355906 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sun, Apr 10, 2016 at 05:22:35PM +0800, Eryu Guan wrote: > On Fri, Apr 08, 2016 at 07:37:09AM -0400, Brian Foster wrote: > > On Fri, Apr 08, 2016 at 11:28:41AM +0800, Eryu Guan wrote: > > > On Fri, Apr 08, 2016 at 09:37:45AM +1000, Dave Chinner wrote: > > > > Hi folks, > > > > > > > > This is the second version of this patch set, first posted and > > > > described here: > > > > > > > > http://oss.sgi.com/archives/xfs/2016-04/msg00069.html > > > > > > Just a quick note here, I'm testing the v1 patchset right now, v4.6-rc2 > > > kernel + v1 patch, config file is based on rhel7 debug kernel config. > > > > > > The test is the same as the original reproducer (long term fsstress run > > > on XFS, exported from NFS). The test on x86_64 host has been running for > > > two days and everything looks fine. Test on ppc64 host has been running > > > for a few hours and I noticed a lock issue and a few warnings, not sure > > > if it's related to the patches or even to XFS yet(I need to run test on > > > stock -rc2 kernel to be sure), but just post the logs here for reference > > > > > > > Had the original problem ever been reproduced on an upstream kernel? > > No, I've never seen the original problem in my upstream kernel testings. > Perhaps that's because I didn't run tests on debug kernels. But I didn't > see it in RHEL7 debug kernel testings either. > > > > > FWIW, my rhel kernel based test is still running well approaching ~48 > > hours. I've seen some lockdep messages (bad unlock balance), but IIRC > > I've been seeing those from the start so I haven't been paying much > > attention to it while digging into the core problem. > > > > > [ 1911.626286] ====================================================== > > > [ 1911.626291] [ INFO: possible circular locking dependency detected ] > > > [ 1911.626297] 4.6.0-rc2.debug+ #1 Not tainted > > > [ 1911.626301] ------------------------------------------------------- > > > [ 1911.626306] nfsd/7402 is trying to acquire lock: > > > [ 1911.626311] (&s->s_sync_lock){+.+.+.}, at: [] .sync_inodes_sb+0xe0/0x230 > > > [ 1911.626327] > > > [ 1911.626327] but task is already holding lock: > > > [ 1911.626333] (sb_internal){.+.+.+}, at: [] .__sb_start_write+0x90/0x130 > > > [ 1911.626346] > > > [ 1911.626346] which lock already depends on the new lock. > > > [ 1911.626346] > > > [ 1911.626353] > > > [ 1911.626353] the existing dependency chain (in reverse order) is: > > > [ 1911.626358] > > ... > > > [ 1911.627134] Possible unsafe locking scenario: > > > [ 1911.627134] > > > [ 1911.627139] CPU0 CPU1 > > > [ 1911.627143] ---- ---- > > > [ 1911.627147] lock(sb_internal); > > > [ 1911.627153] lock(&s->s_sync_lock); > > > [ 1911.627160] lock(sb_internal); > > > [ 1911.627166] lock(&s->s_sync_lock); > > > [ 1911.627172] > > > [ 1911.627172] *** DEADLOCK *** > > > [ 1911.627172] > > ... > > > > We actually have a report of this one on the list: > > > > http://oss.sgi.com/archives/xfs/2016-04/msg00001.html > > > > ... so I don't think it's related to this series. I believe I've seen > > this once or twice when testing something completely unrelated, as well. > > > > > [ 2046.852739] kworker/dying (399) used greatest stack depth: 4352 bytes left > > > [ 2854.687381] XFS: Assertion failed: buffer_mapped(bh), file: fs/xfs/xfs_aops.c, line: 780 > > > [ 2854.687434] ------------[ cut here ]------------ > > > [ 2854.687488] WARNING: CPU: 5 PID: 28924 at fs/xfs/xfs_message.c:105 .asswarn+0x2c/0x40 [xfs] > > ... > > > [ 2854.687997] ---[ end trace 872ac2709186f780 ]--- > > > > These asserts look new to me, however. It would be interesting to see if > > these reproduce independently. > > I've seen just the assert failures in the same fsstress testing on ppc64 > host (no lock warnings in the beginning). Will see if it's still > reproducible on stock kernel. I saw the assert failures on stock kernel (v4.6-rc2) too, so at least it's not something introduced by this patchset. Thanks, Eryu From eguan@redhat.com Mon Apr 11 06:38:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7D1A17CA0 for ; Mon, 11 Apr 2016 06:38:18 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 01722AC001 for ; Mon, 11 Apr 2016 04:38:14 -0700 (PDT) X-ASG-Debug-ID: 1460374693-04bdf011023cb6e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id PU8dYPSzkQ0VhhDw (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 11 Apr 2016 04:38:14 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8D94A3B75D; Mon, 11 Apr 2016 11:38:13 +0000 (UTC) Received: from localhost (dhcp-12-159.nay.redhat.com [10.66.12.159]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3BBcCtr018643; Mon, 11 Apr 2016 07:38:13 -0400 Date: Mon, 11 Apr 2016 19:38:11 +0800 From: Eryu Guan To: Dave Chinner Cc: Christoph Hellwig , fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs/259: handle minimum block size more precisely Message-ID: <20160411113811.GH10345@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs/259: handle minimum block size more precisely References: <1460027155-4222-1-git-send-email-eguan@redhat.com> <20160407213231.GD761@dastard> <20160407234837.GA1439@infradead.org> <20160411000238.GB9088@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160411000238.GB9088@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460374693 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Apr 11, 2016 at 10:02:38AM +1000, Dave Chinner wrote: > On Thu, Apr 07, 2016 at 04:48:37PM -0700, Christoph Hellwig wrote: > > On Fri, Apr 08, 2016 at 07:32:31AM +1000, Dave Chinner wrote: > > > > diff --git a/tests/xfs/259 b/tests/xfs/259 > > > > index 16c1935..3150ff3 100755 > > > > --- a/tests/xfs/259 > > > > +++ b/tests/xfs/259 > > > > @@ -51,9 +51,7 @@ testfile=$TEST_DIR/259.image > > > > # Test various sizes slightly less than 4 TB. Need to handle different > > > > # minimum block sizes for CRC enabled filesystems, but use a small log so we > > > > # don't write lots of zeros unnecessarily. > > > > -xfs_info $TEST_DIR | _filter_mkfs 2> $tmp.mkfs > /dev/null > > > > -. $tmp.mkfs > > > > > > This tests the configuration of the test device, which is not > > > controlled by the test harness, so can be different to the > > > configuration being used for the scratch device. > > > > > > > -if [ $_fs_has_crcs -eq 1 ]; then > > > > +if [ $XFS_MKFS_CRC_DEFAULT -eq 1 ]; then > > > > > > IOWs, this is not an not equivalent test. > > > > And I think that's the whole point of this change :) > > > > Previously it tested what the TEST_DIR did, which was wrong for this > > test. Now it tests what mkfs does by default (including for the scratch > > dev), which is what we really want here. > > Which is not at all clear from the patch description. > > Seriously, though, this does not belong in common/config. We already > have a helper function to check what mkfs supports (i.e. > _scratch_mkfs_xfs_supported()), and if we just want a bare check > then factor this into a _mkfs_xfs_supported() and supply the > parameters specific to the test. > > Indeed, this is basically what we do with _require_xfs_mkfs_crc(); > the same thing should be done, but without the "notrun" if -m crc > s not supported... Looking into _require_xfs_mkfs_crc() and _scratch_mkfs_xfs_supported(), I noticed that they are not the helpers I want. They are testing whether mkfs.xfs supports CRC (or other mkfs options), what I want is what's the default behavior of mkfs.xfs (CRC enabled or not). Maybe I can just move the detection code to common/rc? Thanks, Eryu From bfoster@redhat.com Mon Apr 11 08:37:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4386B7CA0 for ; Mon, 11 Apr 2016 08:37:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9AE62AC002 for ; Mon, 11 Apr 2016 06:37:21 -0700 (PDT) X-ASG-Debug-ID: 1460381839-04cbb02e1caff20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ycAXtcPK47hF1O5C (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 11 Apr 2016 06:37:20 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CF9A980E47; Mon, 11 Apr 2016 13:37:19 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-153.bos.redhat.com [10.18.41.153]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3BDbJvg013538; Mon, 11 Apr 2016 09:37:19 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 6A693125438; Mon, 11 Apr 2016 09:37:18 -0400 (EDT) Date: Mon, 11 Apr 2016 09:37:18 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/6 v2] xfs: xfs_iflush_cluster vs xfs_reclaim_inode Message-ID: <20160411133716.GA47566@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 0/6 v2] xfs: xfs_iflush_cluster vs xfs_reclaim_inode References: <1460072271-23923-1-git-send-email-david@fromorbit.com> <20160408171843.GC30614@bfoster.bfoster> <20160408221706.GB567@dastard> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="ZPt4rx8FFjLCG7dd" Content-Disposition: inline In-Reply-To: <20160408221706.GB567@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460381840 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 --ZPt4rx8FFjLCG7dd Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Sat, Apr 09, 2016 at 08:17:06AM +1000, Dave Chinner wrote: > On Fri, Apr 08, 2016 at 01:18:44PM -0400, Brian Foster wrote: > > On Fri, Apr 08, 2016 at 09:37:45AM +1000, Dave Chinner wrote: > > > Hi folks, > > > > > > This is the second version of this patch set, first posted and > > > described here: > > > > > > http://oss.sgi.com/archives/xfs/2016-04/msg00069.html > > > > > > The only change from the first version is splitting up the first > > > patch into two as Christoph requested - one for the bug fix, the > > > other for the variable renaming. > > > > > > > Did your xfstests testing for this series include generic/233? I'm > > seeing a consistently reproducible test hang. The test is hanging on a > > "xfs_quota -x -c off -ug /mnt/scratch" command. The stack is as follows: > > > > [] xfs_qm_dquot_walk.isra.8+0x196/0x1b0 [xfs] > > [] xfs_qm_dqpurge_all+0x78/0x80 [xfs] > > [] xfs_qm_scall_quotaoff+0x148/0x640 [xfs] > > [] xfs_quota_disable+0x3d/0x50 [xfs] > > [] SyS_quotactl+0x3b3/0x8c0 > > [] do_syscall_64+0x67/0x190 > > [] return_from_SYSCALL_64+0x0/0x7a > > [] 0xffffffffffffffff > > > > ... and it looks like the kernel is spinning somehow or another between > > inode reclaim and xfsaild: > > > > ... > > kworker/1:2-210 [001] ...1 895.750591: xfs_perag_get_tag: dev 253:3 agno 1 refcount 1 caller xfs_reclaim_inodes_ag [xfs] > > kworker/1:2-210 [001] ...1 895.750609: xfs_perag_put: dev 253:3 agno 1 refcount 0 caller xfs_reclaim_inodes_ag [xfs] > > kworker/1:2-210 [001] ...1 895.750609: xfs_perag_get_tag: dev 253:3 agno 2 refcount 5 caller xfs_reclaim_inodes_ag [xfs] > > kworker/1:2-210 [001] ...1 895.750611: xfs_perag_put: dev 253:3 agno 2 refcount 4 caller xfs_reclaim_inodes_ag [xfs] > > kworker/1:2-210 [001] ...1 895.750612: xfs_perag_get_tag: dev 253:3 agno 3 refcount 1 caller xfs_reclaim_inodes_ag [xfs] > > kworker/1:2-210 [001] ...1 895.750613: xfs_perag_put: dev 253:3 agno 3 refcount 0 caller xfs_reclaim_inodes_ag [xfs] > > xfsaild/dm-3-12406 [003] ...2 895.760588: xfs_ail_locked: dev 253:3 lip 0xffff8801f8e65d80 lsn 2/5709 type XFS_LI_QUOTAOFF flags IN_AIL > > xfsaild/dm-3-12406 [003] ...2 895.810595: xfs_ail_locked: dev 253:3 lip 0xffff8801f8e65d80 lsn 2/5709 type XFS_LI_QUOTAOFF flags IN_AIL > > xfsaild/dm-3-12406 [003] ...2 895.860586: xfs_ail_locked: dev 253:3 lip 0xffff8801f8e65d80 lsn 2/5709 type XFS_LI_QUOTAOFF flags IN_AIL > > xfsaild/dm-3-12406 [003] ...2 895.910596: xfs_ail_locked: dev 253:3 lip 0xffff8801f8e65d80 lsn 2/5709 type XFS_LI_QUOTAOFF flags IN_AIL > > ... > > No deadlock involving the AIL - it doesn't remove the > XFS_LI_QUOTAOFF from the AIL - the quota code committing the > quotaoff-end transactions is what removes that. IOWs, the dquot walk > has not completed, so quotaoff has not completed, so the > XFS_LI_QUOTAOFF is still in the AIL. > > IOWs, this looks like xfs_qm_dquot_walk() is skipping dquots because > xfs_qm_dqpurge is hitting this: > > xfs_dqlock(dqp); > if ((dqp->dq_flags & XFS_DQ_FREEING) || dqp->q_nrefs != 0) { > xfs_dqunlock(dqp); > return -EAGAIN; > } > > So that means we've got an inode that probably hasn't been > reclaimed, because the last thing that happens during reclaim is the > dquots are detatched from the inode and hence the reference counts > are dropped. > > > FWIW, this only occurs with patch 6 applied. The test and scratch > > devices are both 10GB lvm volumes formatted with mkfs defaults (v5). > > I can't see how patch 6 would prevent an inode from being reclaimed, > as all the changes occur *after* the reclaim decision has been made. > More investigation needed, I guess... > The attached diff addresses the problem for me. Feel free to fold it into the original patch. The regression test I had running failed with an OOM over the weekend. I hadn't seen that before, but then again I haven't seen this test run to completion on this system either due to the original problem. I'll restart it today with this hunk included. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs --ZPt4rx8FFjLCG7dd Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="__xfs_inode_clear_reclaim.diff" diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index a60db43..749689c 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -818,14 +818,15 @@ xfs_inode_set_reclaim_tag( STATIC void __xfs_inode_clear_reclaim( xfs_perag_t *pag, - xfs_inode_t *ip) + xfs_inode_t *ip, + xfs_ino_t ino) { pag->pag_ici_reclaimable--; if (!pag->pag_ici_reclaimable) { /* clear the reclaim tag from the perag radix tree */ spin_lock(&ip->i_mount->m_perag_lock); radix_tree_tag_clear(&ip->i_mount->m_perag_tree, - XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), + XFS_INO_TO_AGNO(ip->i_mount, ino), XFS_ICI_RECLAIM_TAG); spin_unlock(&ip->i_mount->m_perag_lock); trace_xfs_perag_clear_reclaim(ip->i_mount, pag->pag_agno, @@ -841,7 +842,7 @@ __xfs_inode_clear_reclaim_tag( { radix_tree_tag_clear(&pag->pag_ici_root, XFS_INO_TO_AGINO(mp, ip->i_ino), XFS_ICI_RECLAIM_TAG); - __xfs_inode_clear_reclaim(pag, ip); + __xfs_inode_clear_reclaim(pag, ip, ip->i_ino); } /* @@ -1032,7 +1033,7 @@ reclaim: if (!radix_tree_delete(&pag->pag_ici_root, XFS_INO_TO_AGINO(ip->i_mount, ino))) ASSERT(0); - __xfs_inode_clear_reclaim(pag, ip); + __xfs_inode_clear_reclaim(pag, ip, ino); spin_unlock(&pag->pag_ici_lock); /* --ZPt4rx8FFjLCG7dd-- From hack.coo@gmail.com Mon Apr 11 09:14:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CBD197CA0 for ; Mon, 11 Apr 2016 09:14:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9E7DB30404E for ; Mon, 11 Apr 2016 07:14:13 -0700 (PDT) X-ASG-Debug-ID: 1460384046-04cb6c24643d9ec0001-NocioJ Received: from mail-yw0-f182.google.com (mail-yw0-f182.google.com [209.85.161.182]) by cuda.sgi.com with ESMTP id ren0VlzM4H3dCtzx (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 11 Apr 2016 07:14:07 -0700 (PDT) X-Barracuda-Envelope-From: hack.coo@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.161.182 Received: by mail-yw0-f182.google.com with SMTP id d68so210112914ywe.1 for ; Mon, 11 Apr 2016 07:14:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to; bh=c1MQRj4Ssnq0D693XT83n7SCQuuCrP6oZT0SUyDvRgI=; b=neLQhvoOGPB2Yr+8ezvUDGlIQSZUi18iODbp1y4p037CSYcGhlpON57a1eauwNh5Bp c0kgaV2xeJq44hCnNH0ULtjNDDytHrSp+JgrwGLdNIHg3Aoap3YFFchJfwERYnTUXQFm M7SkQICS9DFUcg9XFu2j8nd7o8hoWX9heifmREP44ag1lk1pqgX7bRFiysosWQhXnYP5 wp2Ud7unqMsoP85CWfYj1bJECp9KKHgerbMUhxo1smT59STHnJzsnmzZpAZ6f9p0Qg81 YJ4C6myz/odHCo6jfHUCfqbnVVWjWvWt7f9GdGBAqwCnfFvJtRFku9QjDM9e27J0aW8O aylg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to; bh=c1MQRj4Ssnq0D693XT83n7SCQuuCrP6oZT0SUyDvRgI=; b=eibiafR30xpluX3mH/R+CXJnAptBAPehQR7xHqXUV0hEJO0OcxwLZrdGTJYIHHkbj0 +GW7qlx7JvzJh1TJPL2pXLJ6gbt6hWHCbk8GlIu/7z1BTBFMEX5WpIeFasIMiEbsRkO0 bI5GCs+zK/JtHR0rvDkRGYR3tN6oQ9PlTgqYNxMbVQWXgBtj1fXWUaLpeDS4zdqLs7DT 0QnqjkKl2Gh7Jw+ysiajExrMImk/vXEZ3S3f0WJZR/NlZaPJp7pEIgCTZ8JTTEZF4yBf /d9lV8759mcmYRwO3YYH2PppVyVgU3K9dlO/mMnzo7UsIU9Afv7qPNX7/jK5GeUgNf90 Ca3A== X-Gm-Message-State: AD7BkJKAcGFUXw7QjMs4mD4H18pmZ9Gbivy8/SkXnJaOD81pRzF8LdVjgswFm/A5PbTS1Vti3WvfGTMbUzuW2A== MIME-Version: 1.0 X-Received: by 10.129.54.15 with SMTP id d15mr10710864ywa.17.1460384046446; Mon, 11 Apr 2016 07:14:06 -0700 (PDT) Received: by 10.37.89.10 with HTTP; Mon, 11 Apr 2016 07:14:06 -0700 (PDT) Date: Mon, 11 Apr 2016 22:14:06 +0800 Message-ID: Subject: about the xfs performance From: Songbo Wang X-ASG-Orig-Subj: about the xfs performance To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a114272e45301b605303628a6 X-Barracuda-Connect: mail-yw0-f182.google.com[209.85.161.182] X-Barracuda-Start-Time: 1460384047 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28637 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 --001a114272e45301b605303628a6 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hi xfsers: I got some troubles on the performance of xfs. The environment is , xfs version is 3.2.1, centos 7.1, kernel version:3.10.0-229.el7.x86_64. pcie-ssd card, mkfs: mkfs.xfs /dev/hioa2 -f -n size=3D64k -i size=3D512 -d agcount=3D= 40 -l size=3D1024m. mount: mount /dev/hioa2 /mnt/ -t xfs -o rw,noexec,nodev,noatime,nodiratime,nobarrier,discard,inode64,logbsize=3D256= k,delaylog I use the following command to test iops: fio -ioengine=3Dlibaio -bs=3D4k -direct=3D1 -thread -rw=3Drandwrite -size=3D50G -filename=3D/mnt/test -name= =3D"EBS 4KB randwrite test" -iodepth=3D64 -runtime=3D60 The results is normal at the beginning which is about 210k=C2=B1=EF=BC=8Cbu= t some seconds later, the results down to 19k=C2=B1. I did a senond test , umount the /dev/hioa2, fio -ioengine=3Dlibaio -bs=3D4k -direct=3D1 -thread -rw=3Drandwrite -filename=3D/dev/hioa2 -name=3D"EBS 8KB randwrite test" -iodepth=3D64 -run= time=3D60 The results was normal, the iops is about 210k=C2=B1 all the time. Then I use perf-tools to trace xfs: # ./funccount -i 1 'xfs*' In the first test case , when the iops seems normal , the results is as follows: FUNC COUNT xfs_free_eofblocks 1 xfs_attr_get 5 xfs_attr_get_int 5 xfs_attr_name_to_xname 5 xfs_attr_shortform_getvalue 5 xfs_da_hashname 5 xfs_ilock_attr_map_shared 5 xfs_xattr_get 5 xfs_fs_statfs 7 xfs_icsb_count 7 xfs_icsb_sync_counters 7 xfs_icsb_sync_counters_locked 7 xfs_can_free_eofblocks 9 xfs_file_release 9 xfs_release 9 xfs_icsb_counter_disabled 21 xfs_file_open 30 xfs_file_aio_read 33 xfs_readlink 37 xfs_vn_follow_link 37 xfs_vn_put_link 37 xfs_buf_delwri_submit_nowait 41 xfs_trans_ail_cursor_first 41 xfs_trans_ail_cursor_init 41 xfs_vn_getattr 44 xfs_file_mmap 48 xfs_cil_prepare_item.isra.1 1004 xfs_extent_busy_clear 1004 xfs_inode_item_committing 1004 xfs_inode_item_data_fork_size. 1004 xfs_inode_item_format 1004 xfs_inode_item_format_data_for 1004 xfs_inode_item_size 1004 xfs_inode_item_unlock 1004 xfs_log_calc_unit_res 1004 xfs_log_commit_cil 1004 xfs_log_done 1004 xfs_log_reserve 1004 xfs_log_space_wake 1004 xfs_log_ticket_put 1004 xfs_trans_add_item 1004 xfs_trans_alloc 1004 xfs_trans_apply_dquot_deltas 1004 xfs_trans_commit 1004 xfs_trans_free 1004 xfs_trans_free_dqinfo 1004 xfs_trans_free_item_desc 1004 xfs_trans_free_items 1004 xfs_trans_ijoin 1004 xfs_trans_log_inode 1004 xfs_trans_reserve 1004 xfs_trans_unreserve_and_mod_sb 1004 xfs_vn_update_time 1004 xfs_destroy_ioend 84845 xfs_end_io_direct_write 84845 xfs_finish_ioend 84845 xfs_file_aio_write 84880 xfs_file_dio_aio_write 84882 xfs_vm_direct_IO 84882 xfs_get_blocks_direct 84883 xfs_bmapi_read 84885 xfs_bmap_search_extents 84886 xfs_bmap_search_multi_extents 84886 xfs_iext_bno_to_ext 84887 xfs_iext_bno_to_irec 84887 xfs_iext_get_ext 84890 xfs_iext_idx_to_irec 84890 xfs_ilock_data_map_shared 84891 xfs_map_buffer.isra.9 84892 xfs_file_aio_write_checks 84893 xfs_alloc_ioend 84895 xfs_bmapi_trim_map.isra.11 84900 xfs_fsb_to_db 84902 xfs_bmapi_update_map 84903 xfs_bmbt_get_all 169793 xfs_find_bdev_for_inode 169794 xfs_ilock 170868 xfs_iunlock 170872 xfs_bmbt_get_blockcount 555016 xfs_bmbt_get_startoff 2277490 when the results down to 19k=C2=B1=EF=BC=8C the trace results are: FUNC COUNT xfs_bitmap_empty 1 xfs_free_eofblocks 1 xfs_attr_get 5 xfs_attr_get_int 5 xfs_attr_name_to_xname 5 xfs_attr_shortform_getvalue 5 xfs_da_hashname 5 xfs_ilock_attr_map_shared 5 xfs_xattr_get 5 xfs_fs_statfs 7 xfs_icsb_count 7 xfs_icsb_sync_counters 7 xfs_icsb_sync_counters_locked 7 xfs_can_free_eofblocks 9 xfs_file_release 9 xfs_release 9 xfs_file_open 30 xfs_file_aio_read 33 xfs_readlink 37 xfs_vn_follow_link 37 xfs_vn_put_link 37 xfs_buf_delwri_submit_nowait 41 xfs_trans_ail_cursor_first 41 xfs_trans_ail_cursor_init 41 xfs_alloc_ag_vextent 43 xfs_alloc_ag_vextent_near 43 xfs_alloc_find_best_extent 43 xfs_alloc_fix_freelist 43 xfs_alloc_fixup_trees 43 xfs_alloc_read_agf 43 xfs_alloc_read_agfl 43 xfs_alloc_update 43 xfs_alloc_update_counters.isra 43 xfs_alloc_vextent 43 xfs_bmbt_alloc_block 43 xfs_btree_get_buf_block.constp 43 xfs_btree_reada_bufs 43 xfs_btree_readahead_sblock.isr 43 xfs_btree_split 43 xfs_btree_split_worker 43 xfs_read_agf 43 xfs_trans_get_buf_map 43 xfs_allocbt_dup_cursor 44 xfs_allocbt_get_minrecs 44 xfs_allocbt_init_rec_from_cur 44 xfs_allocbt_update_lastrec 44 xfs_alloc_fix_minleft 44 xfs_alloc_log_agf 44 xfs_alloc_longest_free_extent 44 xfs_bmbt_init_rec_from_key 44 xfs_bmbt_update_cursor 44 xfs_btree_buf_to_ptr.isra.17 44 xfs_btree_check_sblock 44 xfs_btree_init_block_cur.isra. 44 xfs_btree_init_block_int 44 xfs_btree_islastblock 44 xfs_trans_mod_dquot_byino 44 xfs_trans_mod_sb 44 xfs_vn_getattr 44 xfs_file_mmap 48 xfs_iext_irec_new 57 xfs_iext_realloc_indirect 57 xfs_btree_copy_ptrs 66 xfs_btree_shift_keys.isra.23 66 xfs_btree_shift_ptrs 66 xfs_btree_log_ptrs 72 xfs_alloc_get_rec 86 xfs_alloc_lookup_eq 86 xfs_alloc_compute_aligned 88 xfs_btree_get_rec 88 xfs_extent_busy_trim 88 xfs_iext_add_indirect_multi 108 xfs_alloc_compute_diff 110 xfs_alloc_fix_len 110 xfs_allocbt_init_cursor 132 xfs_iext_irec_compact 163 xfs_iext_remove 163 xfs_iext_remove_indirect 163 xfs_buf_item_relse 173 xfs_allocbt_init_ptr_from_cur 176 xfs_btree_set_sibling.isra.12 176 xfs_buf_item_free 177 xfs_buf_item_free_format 177 xfs_buf_hold 248 xfs_buf_item_get_format 248 xfs_log_item_init 248 xfs_allocbt_get_maxrecs 264 xfs_bmbt_get_minrecs 326 xfs_btree_dec_cursor 369 xfs_btree_delete 369 xfs_btree_delrec 369 xfs_bmbt_set_allf 633 xfs_bmbt_set_startblock 1007 xfs_bmbt_set_startoff 1007 xfs_trans_alloc 1029 xfs_vn_update_time 1029 xfs_btree_lshift 1048 xfs_btree_decrement 1332 xfs_allocbt_init_key_from_rec 1481 xfs_allocbt_key_diff 2427 xfs_btree_check_lblock 3653 xfs_btree_lastrec 3653 xfs_buf_free 3660 xfs_bmbt_dup_cursor 3696 xfs_btree_check_block 3696 xfs_buf_allocate_memory 3703 xfs_btree_dup_cursor 3738 xfs_btree_increment 4324 xfs_btree_make_block_unfull 4699 xfs_btree_rshift 4699 xfs_btree_updkey 4738 xfs_btree_copy_keys.isra.22 4824 xfs_btree_log_keys 4832 xfs_iext_add 4876 xfs_iext_insert 4876 xfs_btree_reada_bufl 5465 xfs_btree_readahead_lblock.isr 5465 xfs_buf_readahead_map 5508 xfs_btree_readahead 5670 xfs_inode_item_format 6071 xfs_inode_item_format_data_for 6072 xfs_inode_item_size 6072 xfs_inode_item_data_fork_size. 6073 xfs_trans_log_inode 6115 xfs_buf_item_pin 6315 xfs_bmapi_write 6674 xfs_end_io 6674 xfs_iomap_write_unwritten 6674 xfs_bmap_add_extent_unwritten_ 6675 xfs_bmapi_convert_unwritten 6675 xfs_destroy_ioend 6675 xfs_end_io_direct_write 6676 xfs_finish_ioend 6677 xfs_bmap_finish 6683 xfs_file_aio_write 6784 xfs_bmapi_read 6785 xfs_file_aio_write_checks 6785 xfs_file_dio_aio_write 6785 xfs_get_blocks_direct 6785 xfs_ilock_data_map_shared 6785 xfs_map_buffer.isra.9 6785 xfs_vm_direct_IO 6785 xfs_alloc_ioend 6786 xfs_fsb_to_db 6786 xfs_bmbt_set_blockcount 7691 xfs_log_commit_cil 7704 xfs_trans_commit 7704 xfs_trans_free_items 7704 xfs_trans_reserve 7705 xfs_trans_unreserve_and_mod_sb 7705 xfs_log_done 7706 xfs_trans_free 7706 xfs_log_reserve 7708 xfs_trans_ijoin 7708 xfs_extent_busy_clear 7712 xfs_inode_item_unlock 7712 xfs_log_space_wake 7712 xfs_log_ticket_put 7712 xfs_trans_apply_dquot_deltas 7712 xfs_inode_item_committing 7713 xfs_log_calc_unit_res 7713 xfs_trans_free_dqinfo 7713 xfs_bmbt_update 8311 xfs_btree_update 8354 xfs_bmbt_init_rec_from_cur 9758 xfs_bmbt_disk_set_all 9760 xfs_bmbt_set_all 9760 xfs_btree_insert 9795 xfs_btree_insrec 9838 xfs_bmbt_init_cursor 10379 xfs_btree_del_cursor 10498 xfs_trans_del_item 11101 xfs_buf_item_dirty 11109 xfs_bmbt_lookup_eq 11551 xfs_bmbt_init_ptr_from_cur 11563 xfs_btree_get_iroot.isra.8 11563 xfs_buf_item_format 11690 xfs_buf_item_size 11690 xfs_buf_item_size_segment.isra 11690 xfs_btree_lookup 11723 xfs_btree_get_sibling.isra.11 11974 xfs_buf_item_unlock 12229 xfs_buf_item_committing 12237 xfs_icsb_modify_counters 13351 xfs_icsb_lock_cntr 13365 xfs_icsb_unlock_cntr 13365 xfs_iext_bno_to_irec 13458 xfs_bmap_search_extents 13459 xfs_bmap_search_multi_extents 13459 xfs_iext_bno_to_ext 13459 xfs_bmapi_trim_map.isra.11 13469 xfs_bmapi_update_map 13469 xfs_find_bdev_for_inode 13573 xfs_btree_shift_recs.isra.24 14798 xfs_cil_prepare_item.isra.1 17769 xfs_bmbt_disk_set_allf 18126 xfs_btree_is_lastrec 18581 xfs_btree_log_block 19648 xfs_btree_set_ptr_null.isra.10 19649 xfs_btree_offsets 19703 xfs_iunlock 21348 xfs_ilock 21349 xfs_btree_copy_recs.isra.21 22849 xfs_buf_item_init 23331 xfs_buf_unlock 23345 xfs_btree_setbuf 23948 xfs_btree_log_recs 24190 xfs_icsb_counter_disabled 26751 xfs_buf_read_map 28786 xfs_buf_get_map 28829 xfs_btree_ptr_is_null.isra.9 29274 xfs_btree_read_buf_block.isra. 29684 xfs_btree_set_refs.isra.13 29712 xfs_trans_add_item 31037 xfs_trans_free_item_desc 31052 xfs_buf_trylock 32463 xfs_perag_put 32606 xfs_perag_get 32633 xfs_buf_rele 32693 xfs_trans_brelse 35148 xfs_btree_ptr_addr 38591 xfs_btree_ptr_offset 38738 xfs_trans_read_buf_map 40938 xfs_trans_buf_item_match 41000 xfs_btree_ptr_to_daddr 44562 xfs_btree_lookup_get_block 46548 xfs_trans_log_buf 48783 xfs_buf_item_log 48806 xfs_trans_buf_set_type 48815 xfs_iext_get_ext 51712 xfs_bmbt_get_all 53669 xfs_btree_get_block 54424 xfs_iext_idx_to_irec 56768 xfs_bmbt_get_maxrecs 57774 xfs_bmbt_get_blockcount 89650 xfs_bmbt_disk_get_startoff 98285 xfs_bmbt_init_key_from_rec 98285 xfs_btree_rec_addr 115199 xfs_btree_rec_offset 163635 xfs_btree_key_addr 176837 xfs_btree_key_offset 186525 xfs_bmbt_key_diff 254763 xfs_lookup_get_search_key 257190 xfs_bmbt_get_startoff 363158 xfs_next_bit 631334 xfs_buf_offset 1166477 Compare with the two results above, I found when the iops down to 19k=C2= =B1, lots of functions were traced, such as xfs_buf_trylock, xfs_iext_insert, xfs_btree_insert, etc. I cannot find what cause the iops down to 19k=C2=B1, any suggestion ? --001a114272e45301b605303628a6 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+SGkgeGZzZXJzOjxkaXY+PGJyPjwvZGl2PjxkaXY+SSBnb3Qgc29tZSB0 cm91YmxlcyBvbiB0aGUgcGVyZm9ybWFuY2Ugb2YgwqB4ZnMuwqA8ZGl2PlRoZSBlbnZpcm9ubWVu dCBpcyAswqA8L2Rpdj48ZGl2PsKgIMKgIMKgeGZzIHZlcnNpb24gaXMgMy4yLjEswqA8L2Rpdj48 ZGl2PsKgIMKgIMKgY2VudG9zIDcuMSzCoDwvZGl2PjxkaXY+wqAgwqAgwqBrZXJuZWwgdmVyc2lv bjozLjEwLjAtMjI5LmVsNy54ODZfNjQuPC9kaXY+PGRpdj7CoCDCoCDCoHBjaWUtc3NkIGNhcmQs wqA8L2Rpdj48ZGl2PsKgIMKgIMKgbWtmczogbWtmcy54ZnMgL2Rldi9oaW9hMiAtZiAtbiBzaXpl PTY0ayAtaSBzaXplPTUxMiAtZCBhZ2NvdW50PTQwIC1sIHNpemU9MTAyNG0uPC9kaXY+PC9kaXY+ PGRpdj7CoCDCoCDCoG1vdW50OsKgbW91bnQgL2Rldi9oaW9hMiAvbW50LyDCoC10IHhmcyAtbyBy dyxub2V4ZWMsbm9kZXYsbm9hdGltZSxub2RpcmF0aW1lLG5vYmFycmllcixkaXNjYXJkLGlub2Rl NjQsbG9nYnNpemU9MjU2ayxkZWxheWxvZzwvZGl2PjxkaXY+SSB1c2UgdGhlIGZvbGxvd2luZyBj b21tYW5kIHRvIHRlc3QgaW9wczrCoGZpbyAtaW9lbmdpbmU9bGliYWlvIC1icz00ayAtZGlyZWN0 PTEgLXRocmVhZCAtcnc9cmFuZHdyaXRlIC1zaXplPTUwRyAtZmlsZW5hbWU9L21udC90ZXN0IC1u YW1lPSZxdW90O0VCUyA0S0IgcmFuZHdyaXRlIHRlc3QmcXVvdDsgLWlvZGVwdGg9NjQgLXJ1bnRp bWU9NjA8L2Rpdj48ZGl2PlRoZSByZXN1bHRzIGlzIG5vcm1hbCBhdCB0aGUgYmVnaW5uaW5nIHdo aWNoIGlzIGFib3V0IDIxMGvCse+8jGJ1dCBzb21lIHNlY29uZHMgbGF0ZXIsIHRoZSByZXN1bHRz IGRvd24gdG8gMTlrwrEuPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5JIGRpZCBhIHNlbm9uZCB0 ZXN0ICzCoDwvZGl2PjxkaXY+wqAgwqAgwqB1bW91bnQgdGhlIC9kZXYvaGlvYTIswqA8L2Rpdj48 ZGl2PsKgIMKgIMKgZmlvIC1pb2VuZ2luZT1saWJhaW8gLWJzPTRrIC1kaXJlY3Q9MSDCoC10aHJl YWQgLXJ3PXJhbmR3cml0ZSAtZmlsZW5hbWU9L2Rldi9oaW9hMiDCoC1uYW1lPSZxdW90O0VCUyA4 S0IgcmFuZHdyaXRlIHRlc3QmcXVvdDsgLWlvZGVwdGg9NjQgLXJ1bnRpbWU9NjA8L2Rpdj48ZGl2 PlRoZSByZXN1bHRzIHdhcyBub3JtYWwsIHRoZSBpb3BzIGlzIGFib3V0IDIxMGvCsSBhbGwgdGhl IHRpbWUuPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5UaGVuIEkgdXNlIHBlcmYtdG9vbHMgdG8g dHJhY2UgeGZzOjwvZGl2PjxkaXY+wqAgwqAgwqAjIC4vZnVuY2NvdW50IC1pIDEgJiMzOTt4ZnMq JiMzOTs8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PkluIHRoZSBmaXJzdCB0ZXN0IGNhc2UgLCB3 aGVuIHRoZSBpb3BzIHNlZW1zIG5vcm1hbCAsIHRoZSByZXN1bHRzIGlzIGFzIGZvbGxvd3M6PC9k aXY+PGRpdj48ZGl2PjxkaXY+PGRpdj5GVU5DIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgQ09VTlQ8L2Rpdj48ZGl2Pnhmc19mcmVlX2VvZmJsb2NrcyDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoDE8L2Rpdj48ZGl2Pnhmc19hdHRyX2dldCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDU8L2Rpdj48ZGl2Pnhmc19hdHRyX2dldF9pbnQg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA1PC9kaXY+PGRpdj54ZnNfYXR0cl9uYW1l X3RvX3huYW1lIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgNTwvZGl2PjxkaXY+eGZzX2F0dHJfc2hv cnRmb3JtX2dldHZhbHVlIMKgIMKgIMKgIMKgIMKgIDU8L2Rpdj48ZGl2Pnhmc19kYV9oYXNobmFt ZSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA1PC9kaXY+PGRpdj54ZnNfaWxvY2tf YXR0cl9tYXBfc2hhcmVkIMKgIMKgIMKgIMKgIMKgIMKgIDU8L2Rpdj48ZGl2Pnhmc194YXR0cl9n ZXQgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgNTwvZGl2PjxkaXY+eGZzX2Zz X3N0YXRmcyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA3PC9kaXY+PGRpdj54 ZnNfaWNzYl9jb3VudCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDc8L2Rpdj48 ZGl2Pnhmc19pY3NiX3N5bmNfY291bnRlcnMgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA3PC9kaXY+ PGRpdj54ZnNfaWNzYl9zeW5jX2NvdW50ZXJzX2xvY2tlZCDCoCDCoCDCoCDCoCA3PC9kaXY+PGRp dj54ZnNfY2FuX2ZyZWVfZW9mYmxvY2tzIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgOTwvZGl2Pjxk aXY+eGZzX2ZpbGVfcmVsZWFzZSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDk8L2Rp dj48ZGl2Pnhmc19yZWxlYXNlIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IDk8L2Rpdj48ZGl2Pnhmc19pY3NiX2NvdW50ZXJfZGlzYWJsZWQgwqAgwqAgwqAgwqAgwqAgwqAy MTwvZGl2PjxkaXY+eGZzX2ZpbGVfb3BlbiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoDMwPC9kaXY+PGRpdj54ZnNfZmlsZV9haW9fcmVhZCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoDMzPC9kaXY+PGRpdj54ZnNfcmVhZGxpbmsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgMzc8L2Rpdj48ZGl2Pnhmc192bl9mb2xsb3dfbGluayDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCAzNzwvZGl2PjxkaXY+eGZzX3ZuX3B1dF9saW5rIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgMzc8L2Rpdj48ZGl2Pnhmc19idWZfZGVsd3JpX3N1Ym1pdF9ub3dh aXQgwqAgwqAgwqAgwqAgNDE8L2Rpdj48ZGl2Pnhmc190cmFuc19haWxfY3Vyc29yX2ZpcnN0IMKg IMKgIMKgIMKgIMKgIDQxPC9kaXY+PGRpdj54ZnNfdHJhbnNfYWlsX2N1cnNvcl9pbml0IMKgIMKg IMKgIMKgIMKgIMKgNDE8L2Rpdj48ZGl2Pnhmc192bl9nZXRhdHRyIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIDQ0PC9kaXY+PGRpdj54ZnNfZmlsZV9tbWFwIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgNDg8L2Rpdj48ZGl2Pnhmc19jaWxfcHJlcGFyZV9pdGVtLmlz cmEuMSDCoCDCoCDCoCDCoDEwMDQ8L2Rpdj48ZGl2Pnhmc19leHRlbnRfYnVzeV9jbGVhciDCoCDC oCDCoCDCoCDCoCDCoCDCoDEwMDQ8L2Rpdj48ZGl2Pnhmc19pbm9kZV9pdGVtX2NvbW1pdHRpbmcg wqAgwqAgwqAgwqAgwqAxMDA0PC9kaXY+PGRpdj54ZnNfaW5vZGVfaXRlbV9kYXRhX2Zvcmtfc2l6 ZS4gwqAgwqAgMTAwNDwvZGl2PjxkaXY+eGZzX2lub2RlX2l0ZW1fZm9ybWF0IMKgIMKgIMKgIMKg IMKgIMKgIMKgMTAwNDwvZGl2PjxkaXY+eGZzX2lub2RlX2l0ZW1fZm9ybWF0X2RhdGFfZm9yIMKg IMKgIDEwMDQ8L2Rpdj48ZGl2Pnhmc19pbm9kZV9pdGVtX3NpemUgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAxMDA0PC9kaXY+PGRpdj54ZnNfaW5vZGVfaXRlbV91bmxvY2sgwqAgwqAgwqAgwqAgwqAg wqAgwqAxMDA0PC9kaXY+PGRpdj54ZnNfbG9nX2NhbGNfdW5pdF9yZXMgwqAgwqAgwqAgwqAgwqAg wqAgwqAxMDA0PC9kaXY+PGRpdj54ZnNfbG9nX2NvbW1pdF9jaWwgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgMTAwNDwvZGl2PjxkaXY+eGZzX2xvZ19kb25lIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIDEwMDQ8L2Rpdj48ZGl2Pnhmc19sb2dfcmVzZXJ2ZSDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoDEwMDQ8L2Rpdj48ZGl2Pnhmc19sb2dfc3BhY2Vfd2FrZSDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCAxMDA0PC9kaXY+PGRpdj54ZnNfbG9nX3RpY2tldF9wdXQgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgMTAwNDwvZGl2PjxkaXY+eGZzX3RyYW5zX2FkZF9pdGVtIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIDEwMDQ8L2Rpdj48ZGl2Pnhmc190cmFuc19hbGxvYyDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoDEwMDQ8L2Rpdj48ZGl2Pnhmc190cmFuc19hcHBseV9kcXVvdF9k ZWx0YXMgwqAgwqAgwqAgMTAwNDwvZGl2PjxkaXY+eGZzX3RyYW5zX2NvbW1pdCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCAxMDA0PC9kaXY+PGRpdj54ZnNfdHJhbnNfZnJlZSDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCAxMDA0PC9kaXY+PGRpdj54ZnNfdHJhbnNfZnJlZV9kcWluZm8g wqAgwqAgwqAgwqAgwqAgwqAgwqAxMDA0PC9kaXY+PGRpdj54ZnNfdHJhbnNfZnJlZV9pdGVtX2Rl c2MgwqAgwqAgwqAgwqAgwqAgMTAwNDwvZGl2PjxkaXY+eGZzX3RyYW5zX2ZyZWVfaXRlbXMgwqAg wqAgwqAgwqAgwqAgwqAgwqAgMTAwNDwvZGl2PjxkaXY+eGZzX3RyYW5zX2lqb2luIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgMTAwNDwvZGl2PjxkaXY+eGZzX3RyYW5zX2xvZ19pbm9kZSDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoDEwMDQ8L2Rpdj48ZGl2Pnhmc190cmFuc19yZXNlcnZlIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMTAwNDwvZGl2PjxkaXY+eGZzX3RyYW5zX3VucmVzZXJ2 ZV9hbmRfbW9kX3NiIMKgIMKgIDEwMDQ8L2Rpdj48ZGl2Pnhmc192bl91cGRhdGVfdGltZSDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCAxMDA0PC9kaXY+PGRpdj54ZnNfZGVzdHJveV9pb2VuZCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCA4NDg0NTwvZGl2PjxkaXY+eGZzX2VuZF9pb19kaXJlY3Rfd3Jp dGUgwqAgwqAgwqAgwqAgwqAgODQ4NDU8L2Rpdj48ZGl2Pnhmc19maW5pc2hfaW9lbmQgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqA4NDg0NTwvZGl2PjxkaXY+eGZzX2ZpbGVfYWlvX3dyaXRlIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgODQ4ODA8L2Rpdj48ZGl2Pnhmc19maWxlX2Rpb19haW9fd3Jp dGUgwqAgwqAgwqAgwqAgwqAgwqA4NDg4MjwvZGl2PjxkaXY+eGZzX3ZtX2RpcmVjdF9JTyDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoDg0ODgyPC9kaXY+PGRpdj54ZnNfZ2V0X2Jsb2Nrc19kaXJl Y3QgwqAgwqAgwqAgwqAgwqAgwqAgODQ4ODM8L2Rpdj48ZGl2Pnhmc19ibWFwaV9yZWFkIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgODQ4ODU8L2Rpdj48ZGl2Pnhmc19ibWFwX3NlYXJjaF9l eHRlbnRzIMKgIMKgIMKgIMKgIMKgIDg0ODg2PC9kaXY+PGRpdj54ZnNfYm1hcF9zZWFyY2hfbXVs dGlfZXh0ZW50cyDCoCDCoCA4NDg4NjwvZGl2PjxkaXY+eGZzX2lleHRfYm5vX3RvX2V4dCDCoCDC oCDCoCDCoCDCoCDCoCDCoCA4NDg4NzwvZGl2PjxkaXY+eGZzX2lleHRfYm5vX3RvX2lyZWMgwqAg wqAgwqAgwqAgwqAgwqAgwqA4NDg4NzwvZGl2PjxkaXY+eGZzX2lleHRfZ2V0X2V4dCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoDg0ODkwPC9kaXY+PGRpdj54ZnNfaWV4dF9pZHhfdG9faXJlYyDC oCDCoCDCoCDCoCDCoCDCoCDCoDg0ODkwPC9kaXY+PGRpdj54ZnNfaWxvY2tfZGF0YV9tYXBfc2hh cmVkIMKgIMKgIMKgIMKgIDg0ODkxPC9kaXY+PGRpdj54ZnNfbWFwX2J1ZmZlci5pc3JhLjkgwqAg wqAgwqAgwqAgwqAgwqAgODQ4OTI8L2Rpdj48ZGl2Pnhmc19maWxlX2Fpb193cml0ZV9jaGVja3Mg wqAgwqAgwqAgwqAgODQ4OTM8L2Rpdj48ZGl2Pnhmc19hbGxvY19pb2VuZCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCA4NDg5NTwvZGl2PjxkaXY+eGZzX2JtYXBpX3RyaW1fbWFwLmlzcmEuMTEg wqAgwqAgwqAgwqA4NDkwMDwvZGl2PjxkaXY+eGZzX2ZzYl90b19kYiDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCA4NDkwMjwvZGl2PjxkaXY+eGZzX2JtYXBpX3VwZGF0ZV9tYXAgwqAgwqAg wqAgwqAgwqAgwqAgwqA4NDkwMzwvZGl2PjxkaXY+eGZzX2JtYnRfZ2V0X2FsbCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCAxNjk3OTM8L2Rpdj48ZGl2Pnhmc19maW5kX2JkZXZfZm9yX2lub2RlIMKg IMKgIMKgIMKgIMKgMTY5Nzk0PC9kaXY+PGRpdj54ZnNfaWxvY2sgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAxNzA4Njg8L2Rpdj48ZGl2Pnhmc19pdW5sb2NrIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgMTcwODcyPC9kaXY+PGRpdj54ZnNfYm1idF9nZXRfYmxvY2tj b3VudCDCoCDCoCDCoCDCoCDCoDU1NTAxNjwvZGl2PjxkaXY+eGZzX2JtYnRfZ2V0X3N0YXJ0b2Zm IMKgIMKgIMKgIMKgIMKgIDIyNzc0OTA8L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2Pjxicj48 L2Rpdj48ZGl2PndoZW4gdGhlIHJlc3VsdHMgZG93biB0byAxOWvCse+8jCB0aGUgdHJhY2UgcmVz dWx0cyBhcmU6PC9kaXY+PGRpdj48ZGl2PkZVTkMgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBDT1VOVDwvZGl2PjxkaXY+eGZzX2JpdG1hcF9lbXB0eSDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDE8L2Rpdj48ZGl2Pnhmc19mcmVlX2VvZmJsb2NrcyDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDE8L2Rpdj48ZGl2Pnhmc19hdHRyX2dldCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDU8L2Rpdj48ZGl2Pnhmc19hdHRyX2dl dF9pbnQgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA1PC9kaXY+PGRpdj54ZnNfYXR0 cl9uYW1lX3RvX3huYW1lIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgNTwvZGl2PjxkaXY+eGZzX2F0 dHJfc2hvcnRmb3JtX2dldHZhbHVlIMKgIMKgIMKgIMKgIMKgIDU8L2Rpdj48ZGl2Pnhmc19kYV9o YXNobmFtZSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA1PC9kaXY+PGRpdj54ZnNf aWxvY2tfYXR0cl9tYXBfc2hhcmVkIMKgIMKgIMKgIMKgIMKgIMKgIDU8L2Rpdj48ZGl2Pnhmc194 YXR0cl9nZXQgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgNTwvZGl2PjxkaXY+ eGZzX2ZzX3N0YXRmcyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA3PC9kaXY+ PGRpdj54ZnNfaWNzYl9jb3VudCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDc8 L2Rpdj48ZGl2Pnhmc19pY3NiX3N5bmNfY291bnRlcnMgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA3 PC9kaXY+PGRpdj54ZnNfaWNzYl9zeW5jX2NvdW50ZXJzX2xvY2tlZCDCoCDCoCDCoCDCoCA3PC9k aXY+PGRpdj54ZnNfY2FuX2ZyZWVfZW9mYmxvY2tzIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgOTwv ZGl2PjxkaXY+eGZzX2ZpbGVfcmVsZWFzZSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oDk8L2Rpdj48ZGl2Pnhmc19yZWxlYXNlIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIDk8L2Rpdj48ZGl2Pnhmc19maWxlX29wZW4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAzMDwvZGl2PjxkaXY+eGZzX2ZpbGVfYWlvX3JlYWQgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAzMzwvZGl2PjxkaXY+eGZzX3JlYWRsaW5rIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIDM3PC9kaXY+PGRpdj54ZnNfdm5fZm9sbG93X2xpbmsgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgMzc8L2Rpdj48ZGl2Pnhmc192bl9wdXRfbGluayDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDM3PC9kaXY+PGRpdj54ZnNfYnVmX2RlbHdyaV9zdWJt aXRfbm93YWl0IMKgIMKgIMKgIMKgIDQxPC9kaXY+PGRpdj54ZnNfdHJhbnNfYWlsX2N1cnNvcl9m aXJzdCDCoCDCoCDCoCDCoCDCoCA0MTwvZGl2PjxkaXY+eGZzX3RyYW5zX2FpbF9jdXJzb3JfaW5p dCDCoCDCoCDCoCDCoCDCoCDCoDQxPC9kaXY+PGRpdj54ZnNfYWxsb2NfYWdfdmV4dGVudCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCA0MzwvZGl2PjxkaXY+eGZzX2FsbG9jX2FnX3ZleHRlbnRfbmVh ciDCoCDCoCDCoCDCoCDCoCDCoDQzPC9kaXY+PGRpdj54ZnNfYWxsb2NfZmluZF9iZXN0X2V4dGVu dCDCoCDCoCDCoCDCoCDCoCA0MzwvZGl2PjxkaXY+eGZzX2FsbG9jX2ZpeF9mcmVlbGlzdCDCoCDC oCDCoCDCoCDCoCDCoCDCoCA0MzwvZGl2PjxkaXY+eGZzX2FsbG9jX2ZpeHVwX3RyZWVzIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgNDM8L2Rpdj48ZGl2Pnhmc19hbGxvY19yZWFkX2FnZiDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCA0MzwvZGl2PjxkaXY+eGZzX2FsbG9jX3JlYWRfYWdmbCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoDQzPC9kaXY+PGRpdj54ZnNfYWxsb2NfdXBkYXRlIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIDQzPC9kaXY+PGRpdj54ZnNfYWxsb2NfdXBkYXRlX2Nv dW50ZXJzLmlzcmEgwqAgwqAgwqAgNDM8L2Rpdj48ZGl2Pnhmc19hbGxvY192ZXh0ZW50IMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgNDM8L2Rpdj48ZGl2Pnhmc19ibWJ0X2FsbG9jX2Jsb2Nr IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIDQzPC9kaXY+PGRpdj54ZnNfYnRyZWVfZ2V0X2J1Zl9i bG9jay5jb25zdHAgwqAgwqAgwqAgNDM8L2Rpdj48ZGl2Pnhmc19idHJlZV9yZWFkYV9idWZzIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIDQzPC9kaXY+PGRpdj54ZnNfYnRyZWVfcmVhZGFoZWFkX3Ni bG9jay5pc3IgwqAgwqAgwqAgNDM8L2Rpdj48ZGl2Pnhmc19idHJlZV9zcGxpdCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoDQzPC9kaXY+PGRpdj54ZnNfYnRyZWVfc3BsaXRfd29ya2Vy IMKgIMKgIMKgIMKgIMKgIMKgIMKgIDQzPC9kaXY+PGRpdj54ZnNfcmVhZF9hZ2YgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgNDM8L2Rpdj48ZGl2Pnhmc190cmFuc19nZXRfYnVm X21hcCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDQzPC9kaXY+PGRpdj54ZnNfYWxsb2NidF9kdXBf Y3Vyc29yIMKgIMKgIMKgIMKgIMKgIMKgIMKgIDQ0PC9kaXY+PGRpdj54ZnNfYWxsb2NidF9nZXRf bWlucmVjcyDCoCDCoCDCoCDCoCDCoCDCoCDCoDQ0PC9kaXY+PGRpdj54ZnNfYWxsb2NidF9pbml0 X3JlY19mcm9tX2N1ciDCoCDCoCDCoCDCoDQ0PC9kaXY+PGRpdj54ZnNfYWxsb2NidF91cGRhdGVf bGFzdHJlYyDCoCDCoCDCoCDCoCDCoCA0NDwvZGl2PjxkaXY+eGZzX2FsbG9jX2ZpeF9taW5sZWZ0 IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgNDQ8L2Rpdj48ZGl2Pnhmc19hbGxvY19sb2dfYWdmIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgNDQ8L2Rpdj48ZGl2Pnhmc19hbGxvY19sb25nZXN0 X2ZyZWVfZXh0ZW50IMKgIMKgIMKgIMKgNDQ8L2Rpdj48ZGl2Pnhmc19ibWJ0X2luaXRfcmVjX2Zy b21fa2V5IMKgIMKgIMKgIMKgIMKgIDQ0PC9kaXY+PGRpdj54ZnNfYm1idF91cGRhdGVfY3Vyc29y IMKgIMKgIMKgIMKgIMKgIMKgIMKgIDQ0PC9kaXY+PGRpdj54ZnNfYnRyZWVfYnVmX3RvX3B0ci5p c3JhLjE3IMKgIMKgIMKgIMKgIDQ0PC9kaXY+PGRpdj54ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrIMKg IMKgIMKgIMKgIMKgIMKgIMKgIDQ0PC9kaXY+PGRpdj54ZnNfYnRyZWVfaW5pdF9ibG9ja19jdXIu aXNyYS4gwqAgwqAgwqAgNDQ8L2Rpdj48ZGl2Pnhmc19idHJlZV9pbml0X2Jsb2NrX2ludCDCoCDC oCDCoCDCoCDCoCDCoCA0NDwvZGl2PjxkaXY+eGZzX2J0cmVlX2lzbGFzdGJsb2NrIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgNDQ8L2Rpdj48ZGl2Pnhmc190cmFuc19tb2RfZHF1b3RfYnlpbm8gwqAg wqAgwqAgwqAgwqAgwqA0NDwvZGl2PjxkaXY+eGZzX3RyYW5zX21vZF9zYiDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCA0NDwvZGl2PjxkaXY+eGZzX3ZuX2dldGF0dHIgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgNDQ8L2Rpdj48ZGl2Pnhmc19maWxlX21tYXAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA0ODwvZGl2PjxkaXY+eGZzX2lleHRfaXJlY19uZXcg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA1NzwvZGl2PjxkaXY+eGZzX2lleHRfcmVhbGxv Y19pbmRpcmVjdCDCoCDCoCDCoCDCoCDCoCDCoDU3PC9kaXY+PGRpdj54ZnNfYnRyZWVfY29weV9w dHJzIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgNjY8L2Rpdj48ZGl2Pnhmc19idHJlZV9zaGlm dF9rZXlzLmlzcmEuMjMgwqAgwqAgwqAgwqAgNjY8L2Rpdj48ZGl2Pnhmc19idHJlZV9zaGlmdF9w dHJzIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIDY2PC9kaXY+PGRpdj54ZnNfYnRyZWVfbG9nX3B0 cnMgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgNzI8L2Rpdj48ZGl2Pnhmc19hbGxvY19nZXRf cmVjIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgODY8L2Rpdj48ZGl2Pnhmc19hbGxvY19s b29rdXBfZXEgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA4NjwvZGl2PjxkaXY+eGZzX2FsbG9j X2NvbXB1dGVfYWxpZ25lZCDCoCDCoCDCoCDCoCDCoCDCoDg4PC9kaXY+PGRpdj54ZnNfYnRyZWVf Z2V0X3JlYyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDg4PC9kaXY+PGRpdj54ZnNfZXh0 ZW50X2J1c3lfdHJpbSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA4ODwvZGl2PjxkaXY+eGZzX2ll eHRfYWRkX2luZGlyZWN0X211bHRpIMKgIMKgIMKgIMKgIDEwODwvZGl2PjxkaXY+eGZzX2FsbG9j X2NvbXB1dGVfZGlmZiDCoCDCoCDCoCDCoCDCoCDCoCDCoDExMDwvZGl2PjxkaXY+eGZzX2FsbG9j X2ZpeF9sZW4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgMTEwPC9kaXY+PGRpdj54ZnNfYWxs b2NidF9pbml0X2N1cnNvciDCoCDCoCDCoCDCoCDCoCDCoCAxMzI8L2Rpdj48ZGl2Pnhmc19pZXh0 X2lyZWNfY29tcGFjdCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAxNjM8L2Rpdj48ZGl2Pnhmc19pZXh0 X3JlbW92ZSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAxNjM8L2Rpdj48ZGl2Pnhmc19p ZXh0X3JlbW92ZV9pbmRpcmVjdCDCoCDCoCDCoCDCoCDCoCDCoDE2MzwvZGl2PjxkaXY+eGZzX2J1 Zl9pdGVtX3JlbHNlIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMTczPC9kaXY+PGRpdj54ZnNf YWxsb2NidF9pbml0X3B0cl9mcm9tX2N1ciDCoCDCoCDCoCAxNzY8L2Rpdj48ZGl2Pnhmc19idHJl ZV9zZXRfc2libGluZy5pc3JhLjEyIMKgIMKgIMKgIDE3NjwvZGl2PjxkaXY+eGZzX2J1Zl9pdGVt X2ZyZWUgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgMTc3PC9kaXY+PGRpdj54ZnNfYnVmX2l0 ZW1fZnJlZV9mb3JtYXQgwqAgwqAgwqAgwqAgwqAgwqAxNzc8L2Rpdj48ZGl2Pnhmc19idWZfaG9s ZCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDI0ODwvZGl2PjxkaXY+eGZzX2J1 Zl9pdGVtX2dldF9mb3JtYXQgwqAgwqAgwqAgwqAgwqAgwqAgMjQ4PC9kaXY+PGRpdj54ZnNfbG9n X2l0ZW1faW5pdCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAyNDg8L2Rpdj48ZGl2Pnhmc19h bGxvY2J0X2dldF9tYXhyZWNzIMKgIMKgIMKgIMKgIMKgIMKgIDI2NDwvZGl2PjxkaXY+eGZzX2Jt YnRfZ2V0X21pbnJlY3MgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAzMjY8L2Rpdj48ZGl2Pnhmc19i dHJlZV9kZWNfY3Vyc29yIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMzY5PC9kaXY+PGRpdj54ZnNf YnRyZWVfZGVsZXRlIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMzY5PC9kaXY+PGRpdj54 ZnNfYnRyZWVfZGVscmVjIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMzY5PC9kaXY+PGRp dj54ZnNfYm1idF9zZXRfYWxsZiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA2MzM8L2Rpdj48 ZGl2Pnhmc19ibWJ0X3NldF9zdGFydGJsb2NrIMKgIMKgIMKgIMKgIMKgIMKgMTAwNzwvZGl2Pjxk aXY+eGZzX2JtYnRfc2V0X3N0YXJ0b2ZmIMKgIMKgIMKgIMKgIMKgIMKgIMKgMTAwNzwvZGl2Pjxk aXY+eGZzX3RyYW5zX2FsbG9jIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMTAyOTwvZGl2 PjxkaXY+eGZzX3ZuX3VwZGF0ZV90aW1lIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIDEwMjk8L2Rp dj48ZGl2Pnhmc19idHJlZV9sc2hpZnQgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgMTA0ODwv ZGl2PjxkaXY+eGZzX2J0cmVlX2RlY3JlbWVudCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDEzMzI8 L2Rpdj48ZGl2Pnhmc19hbGxvY2J0X2luaXRfa2V5X2Zyb21fcmVjIMKgIMKgIMKgMTQ4MTwvZGl2 PjxkaXY+eGZzX2FsbG9jYnRfa2V5X2RpZmYgwqAgwqAgwqAgwqAgwqAgwqAgwqAgMjQyNzwvZGl2 PjxkaXY+eGZzX2J0cmVlX2NoZWNrX2xibG9jayDCoCDCoCDCoCDCoCDCoCDCoCAzNjUzPC9kaXY+ PGRpdj54ZnNfYnRyZWVfbGFzdHJlYyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDM2NTM8L2Rp dj48ZGl2Pnhmc19idWZfZnJlZSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAzNjYw PC9kaXY+PGRpdj54ZnNfYm1idF9kdXBfY3Vyc29yIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMzY5 NjwvZGl2PjxkaXY+eGZzX2J0cmVlX2NoZWNrX2Jsb2NrIMKgIMKgIMKgIMKgIMKgIMKgIMKgMzY5 NjwvZGl2PjxkaXY+eGZzX2J1Zl9hbGxvY2F0ZV9tZW1vcnkgwqAgwqAgwqAgwqAgwqAgwqAzNzAz PC9kaXY+PGRpdj54ZnNfYnRyZWVfZHVwX2N1cnNvciDCoCDCoCDCoCDCoCDCoCDCoCDCoCAzNzM4 PC9kaXY+PGRpdj54ZnNfYnRyZWVfaW5jcmVtZW50IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgNDMy NDwvZGl2PjxkaXY+eGZzX2J0cmVlX21ha2VfYmxvY2tfdW5mdWxsIMKgIMKgIMKgIMKgNDY5OTwv ZGl2PjxkaXY+eGZzX2J0cmVlX3JzaGlmdCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA0Njk5 PC9kaXY+PGRpdj54ZnNfYnRyZWVfdXBka2V5IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIDQ3 Mzg8L2Rpdj48ZGl2Pnhmc19idHJlZV9jb3B5X2tleXMuaXNyYS4yMiDCoCDCoCDCoCDCoDQ4MjQ8 L2Rpdj48ZGl2Pnhmc19idHJlZV9sb2dfa2V5cyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA0ODMy PC9kaXY+PGRpdj54ZnNfaWV4dF9hZGQgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg NDg3NjwvZGl2PjxkaXY+eGZzX2lleHRfaW5zZXJ0IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgNDg3NjwvZGl2PjxkaXY+eGZzX2J0cmVlX3JlYWRhX2J1ZmwgwqAgwqAgwqAgwqAgwqAgwqAg wqAgNTQ2NTwvZGl2PjxkaXY+eGZzX2J0cmVlX3JlYWRhaGVhZF9sYmxvY2suaXNyIMKgIMKgIDU0 NjU8L2Rpdj48ZGl2Pnhmc19idWZfcmVhZGFoZWFkX21hcCDCoCDCoCDCoCDCoCDCoCDCoCDCoDU1 MDg8L2Rpdj48ZGl2Pnhmc19idHJlZV9yZWFkYWhlYWQgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA1 NjcwPC9kaXY+PGRpdj54ZnNfaW5vZGVfaXRlbV9mb3JtYXQgwqAgwqAgwqAgwqAgwqAgwqAgwqA2 MDcxPC9kaXY+PGRpdj54ZnNfaW5vZGVfaXRlbV9mb3JtYXRfZGF0YV9mb3IgwqAgwqAgNjA3Mjwv ZGl2PjxkaXY+eGZzX2lub2RlX2l0ZW1fc2l6ZSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDYwNzI8 L2Rpdj48ZGl2Pnhmc19pbm9kZV9pdGVtX2RhdGFfZm9ya19zaXplLiDCoCDCoCA2MDczPC9kaXY+ PGRpdj54ZnNfdHJhbnNfbG9nX2lub2RlIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgNjExNTwvZGl2 PjxkaXY+eGZzX2J1Zl9pdGVtX3BpbiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA2MzE1PC9k aXY+PGRpdj54ZnNfYm1hcGlfd3JpdGUgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA2Njc0 PC9kaXY+PGRpdj54ZnNfZW5kX2lvIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IDY2NzQ8L2Rpdj48ZGl2Pnhmc19pb21hcF93cml0ZV91bndyaXR0ZW4gwqAgwqAgwqAgwqAgwqA2 Njc0PC9kaXY+PGRpdj54ZnNfYm1hcF9hZGRfZXh0ZW50X3Vud3JpdHRlbl8gwqAgwqAgNjY3NTwv ZGl2PjxkaXY+eGZzX2JtYXBpX2NvbnZlcnRfdW53cml0dGVuIMKgIMKgIMKgIMKgNjY3NTwvZGl2 PjxkaXY+eGZzX2Rlc3Ryb3lfaW9lbmQgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA2Njc1PC9k aXY+PGRpdj54ZnNfZW5kX2lvX2RpcmVjdF93cml0ZSDCoCDCoCDCoCDCoCDCoCDCoDY2NzY8L2Rp dj48ZGl2Pnhmc19maW5pc2hfaW9lbmQgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgNjY3Nzwv ZGl2PjxkaXY+eGZzX2JtYXBfZmluaXNoIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgNjY4 MzwvZGl2PjxkaXY+eGZzX2ZpbGVfYWlvX3dyaXRlIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIDY3 ODQ8L2Rpdj48ZGl2Pnhmc19ibWFwaV9yZWFkIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IDY3ODU8L2Rpdj48ZGl2Pnhmc19maWxlX2Fpb193cml0ZV9jaGVja3MgwqAgwqAgwqAgwqAgwqA2 Nzg1PC9kaXY+PGRpdj54ZnNfZmlsZV9kaW9fYWlvX3dyaXRlIMKgIMKgIMKgIMKgIMKgIMKgIDY3 ODU8L2Rpdj48ZGl2Pnhmc19nZXRfYmxvY2tzX2RpcmVjdCDCoCDCoCDCoCDCoCDCoCDCoCDCoDY3 ODU8L2Rpdj48ZGl2Pnhmc19pbG9ja19kYXRhX21hcF9zaGFyZWQgwqAgwqAgwqAgwqAgwqA2Nzg1 PC9kaXY+PGRpdj54ZnNfbWFwX2J1ZmZlci5pc3JhLjkgwqAgwqAgwqAgwqAgwqAgwqAgwqA2Nzg1 PC9kaXY+PGRpdj54ZnNfdm1fZGlyZWN0X0lPIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIDY3 ODU8L2Rpdj48ZGl2Pnhmc19hbGxvY19pb2VuZCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oDY3ODY8L2Rpdj48ZGl2Pnhmc19mc2JfdG9fZGIgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqA2Nzg2PC9kaXY+PGRpdj54ZnNfYm1idF9zZXRfYmxvY2tjb3VudCDCoCDCoCDCoCDCoCDC oCDCoDc2OTE8L2Rpdj48ZGl2Pnhmc19sb2dfY29tbWl0X2NpbCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCA3NzA0PC9kaXY+PGRpdj54ZnNfdHJhbnNfY29tbWl0IMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIDc3MDQ8L2Rpdj48ZGl2Pnhmc190cmFuc19mcmVlX2l0ZW1zIMKgIMKgIMKgIMKgIMKg IMKgIMKgIDc3MDQ8L2Rpdj48ZGl2Pnhmc190cmFuc19yZXNlcnZlIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgNzcwNTwvZGl2PjxkaXY+eGZzX3RyYW5zX3VucmVzZXJ2ZV9hbmRfbW9kX3NiIMKg IMKgIDc3MDU8L2Rpdj48ZGl2Pnhmc19sb2dfZG9uZSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCA3NzA2PC9kaXY+PGRpdj54ZnNfdHJhbnNfZnJlZSDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCA3NzA2PC9kaXY+PGRpdj54ZnNfbG9nX3Jlc2VydmUgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqA3NzA4PC9kaXY+PGRpdj54ZnNfdHJhbnNfaWpvaW4gwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqA3NzA4PC9kaXY+PGRpdj54ZnNfZXh0ZW50X2J1c3lfY2xlYXIgwqAg wqAgwqAgwqAgwqAgwqAgwqA3NzEyPC9kaXY+PGRpdj54ZnNfaW5vZGVfaXRlbV91bmxvY2sgwqAg wqAgwqAgwqAgwqAgwqAgwqA3NzEyPC9kaXY+PGRpdj54ZnNfbG9nX3NwYWNlX3dha2UgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgNzcxMjwvZGl2PjxkaXY+eGZzX2xvZ190aWNrZXRfcHV0IMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIDc3MTI8L2Rpdj48ZGl2Pnhmc190cmFuc19hcHBseV9kcXVvdF9k ZWx0YXMgwqAgwqAgwqAgNzcxMjwvZGl2PjxkaXY+eGZzX2lub2RlX2l0ZW1fY29tbWl0dGluZyDC oCDCoCDCoCDCoCDCoDc3MTM8L2Rpdj48ZGl2Pnhmc19sb2dfY2FsY191bml0X3JlcyDCoCDCoCDC oCDCoCDCoCDCoCDCoDc3MTM8L2Rpdj48ZGl2Pnhmc190cmFuc19mcmVlX2RxaW5mbyDCoCDCoCDC oCDCoCDCoCDCoCDCoDc3MTM8L2Rpdj48ZGl2Pnhmc19ibWJ0X3VwZGF0ZSDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoDgzMTE8L2Rpdj48ZGl2Pnhmc19idHJlZV91cGRhdGUgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgODM1NDwvZGl2PjxkaXY+eGZzX2JtYnRfaW5pdF9yZWNfZnJvbV9j dXIgwqAgwqAgwqAgwqAgOTc1ODwvZGl2PjxkaXY+eGZzX2JtYnRfZGlza19zZXRfYWxsIMKgIMKg IMKgIMKgIMKgIMKgIMKgOTc2MDwvZGl2PjxkaXY+eGZzX2JtYnRfc2V0X2FsbCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCA5NzYwPC9kaXY+PGRpdj54ZnNfYnRyZWVfaW5zZXJ0IMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIDk3OTU8L2Rpdj48ZGl2Pnhmc19idHJlZV9pbnNyZWMgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgOTgzODwvZGl2PjxkaXY+eGZzX2JtYnRfaW5pdF9jdXJzb3Ig wqAgwqAgwqAgwqAgwqAgwqAgwqAxMDM3OTwvZGl2PjxkaXY+eGZzX2J0cmVlX2RlbF9jdXJzb3Ig wqAgwqAgwqAgwqAgwqAgwqAgwqAxMDQ5ODwvZGl2PjxkaXY+eGZzX3RyYW5zX2RlbF9pdGVtIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgMTExMDE8L2Rpdj48ZGl2Pnhmc19idWZfaXRlbV9kaXJ0eSDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoDExMTA5PC9kaXY+PGRpdj54ZnNfYm1idF9sb29rdXBfZXEg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAxMTU1MTwvZGl2PjxkaXY+eGZzX2JtYnRfaW5pdF9wdHJf ZnJvbV9jdXIgwqAgwqAgwqAgwqAxMTU2MzwvZGl2PjxkaXY+eGZzX2J0cmVlX2dldF9pcm9vdC5p c3JhLjggwqAgwqAgwqAgwqAxMTU2MzwvZGl2PjxkaXY+eGZzX2J1Zl9pdGVtX2Zvcm1hdCDCoCDC oCDCoCDCoCDCoCDCoCDCoCAxMTY5MDwvZGl2PjxkaXY+eGZzX2J1Zl9pdGVtX3NpemUgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgMTE2OTA8L2Rpdj48ZGl2Pnhmc19idWZfaXRlbV9zaXplX3NlZ21l bnQuaXNyYSDCoCDCoDExNjkwPC9kaXY+PGRpdj54ZnNfYnRyZWVfbG9va3VwIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgMTE3MjM8L2Rpdj48ZGl2Pnhmc19idHJlZV9nZXRfc2libGluZy5pc3Jh LjExIMKgIMKgIDExOTc0PC9kaXY+PGRpdj54ZnNfYnVmX2l0ZW1fdW5sb2NrIMKgIMKgIMKgIMKg IMKgIMKgIMKgIDEyMjI5PC9kaXY+PGRpdj54ZnNfYnVmX2l0ZW1fY29tbWl0dGluZyDCoCDCoCDC oCDCoCDCoCAxMjIzNzwvZGl2PjxkaXY+eGZzX2ljc2JfbW9kaWZ5X2NvdW50ZXJzIMKgIMKgIMKg IMKgIMKgMTMzNTE8L2Rpdj48ZGl2Pnhmc19pY3NiX2xvY2tfY250ciDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoDEzMzY1PC9kaXY+PGRpdj54ZnNfaWNzYl91bmxvY2tfY250ciDCoCDCoCDCoCDCoCDC oCDCoCDCoDEzMzY1PC9kaXY+PGRpdj54ZnNfaWV4dF9ibm9fdG9faXJlYyDCoCDCoCDCoCDCoCDC oCDCoCDCoDEzNDU4PC9kaXY+PGRpdj54ZnNfYm1hcF9zZWFyY2hfZXh0ZW50cyDCoCDCoCDCoCDC oCDCoCAxMzQ1OTwvZGl2PjxkaXY+eGZzX2JtYXBfc2VhcmNoX211bHRpX2V4dGVudHMgwqAgwqAg MTM0NTk8L2Rpdj48ZGl2Pnhmc19pZXh0X2Jub190b19leHQgwqAgwqAgwqAgwqAgwqAgwqAgwqAg MTM0NTk8L2Rpdj48ZGl2Pnhmc19ibWFwaV90cmltX21hcC5pc3JhLjExIMKgIMKgIMKgIMKgMTM0 Njk8L2Rpdj48ZGl2Pnhmc19ibWFwaV91cGRhdGVfbWFwIMKgIMKgIMKgIMKgIMKgIMKgIMKgMTM0 Njk8L2Rpdj48ZGl2Pnhmc19maW5kX2JkZXZfZm9yX2lub2RlIMKgIMKgIMKgIMKgIMKgIDEzNTcz PC9kaXY+PGRpdj54ZnNfYnRyZWVfc2hpZnRfcmVjcy5pc3JhLjI0IMKgIMKgIMKgMTQ3OTg8L2Rp dj48ZGl2Pnhmc19jaWxfcHJlcGFyZV9pdGVtLmlzcmEuMSDCoCDCoCDCoCAxNzc2OTwvZGl2Pjxk aXY+eGZzX2JtYnRfZGlza19zZXRfYWxsZiDCoCDCoCDCoCDCoCDCoCDCoDE4MTI2PC9kaXY+PGRp dj54ZnNfYnRyZWVfaXNfbGFzdHJlYyDCoCDCoCDCoCDCoCDCoCDCoCDCoDE4NTgxPC9kaXY+PGRp dj54ZnNfYnRyZWVfbG9nX2Jsb2NrIMKgIMKgIMKgIMKgIMKgIMKgIMKgIDE5NjQ4PC9kaXY+PGRp dj54ZnNfYnRyZWVfc2V0X3B0cl9udWxsLmlzcmEuMTAgwqAgwqAxOTY0OTwvZGl2PjxkaXY+eGZz X2J0cmVlX29mZnNldHMgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgMTk3MDM8L2Rpdj48ZGl2Pnhm c19pdW5sb2NrIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIDIxMzQ4PC9kaXY+PGRp dj54ZnNfaWxvY2sgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgMjEzNDk8L2Rp dj48ZGl2Pnhmc19idHJlZV9jb3B5X3JlY3MuaXNyYS4yMSDCoCDCoCDCoCAyMjg0OTwvZGl2Pjxk aXY+eGZzX2J1Zl9pdGVtX2luaXQgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgMjMzMzE8L2Rpdj48 ZGl2Pnhmc19idWZfdW5sb2NrIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMjMzNDU8L2Rp dj48ZGl2Pnhmc19idHJlZV9zZXRidWYgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAyMzk0ODwv ZGl2PjxkaXY+eGZzX2J0cmVlX2xvZ19yZWNzIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMjQxOTA8 L2Rpdj48ZGl2Pnhmc19pY3NiX2NvdW50ZXJfZGlzYWJsZWQgwqAgwqAgwqAgwqAgMjY3NTE8L2Rp dj48ZGl2Pnhmc19idWZfcmVhZF9tYXAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAyODc4Njwv ZGl2PjxkaXY+eGZzX2J1Zl9nZXRfbWFwIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIDI4ODI5 PC9kaXY+PGRpdj54ZnNfYnRyZWVfcHRyX2lzX251bGwuaXNyYS45IMKgIMKgIMKgMjkyNzQ8L2Rp dj48ZGl2Pnhmc19idHJlZV9yZWFkX2J1Zl9ibG9jay5pc3JhLiDCoCDCoDI5Njg0PC9kaXY+PGRp dj54ZnNfYnRyZWVfc2V0X3JlZnMuaXNyYS4xMyDCoCDCoCDCoCDCoDI5NzEyPC9kaXY+PGRpdj54 ZnNfdHJhbnNfYWRkX2l0ZW0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAzMTAzNzwvZGl2PjxkaXY+ eGZzX3RyYW5zX2ZyZWVfaXRlbV9kZXNjIMKgIMKgIMKgIMKgIMKgMzEwNTI8L2Rpdj48ZGl2Pnhm c19idWZfdHJ5bG9jayDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAzMjQ2MzwvZGl2PjxkaXY+ eGZzX3BlcmFnX3B1dCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAzMjYwNjwvZGl2Pjxk aXY+eGZzX3BlcmFnX2dldCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAzMjYzMzwvZGl2 PjxkaXY+eGZzX2J1Zl9yZWxlIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMzI2OTM8 L2Rpdj48ZGl2Pnhmc190cmFuc19icmVsc2UgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAzNTE0 ODwvZGl2PjxkaXY+eGZzX2J0cmVlX3B0cl9hZGRyIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMzg1 OTE8L2Rpdj48ZGl2Pnhmc19idHJlZV9wdHJfb2Zmc2V0IMKgIMKgIMKgIMKgIMKgIMKgIMKgMzg3 Mzg8L2Rpdj48ZGl2Pnhmc190cmFuc19yZWFkX2J1Zl9tYXAgwqAgwqAgwqAgwqAgwqAgwqA0MDkz ODwvZGl2PjxkaXY+eGZzX3RyYW5zX2J1Zl9pdGVtX21hdGNoIMKgIMKgIMKgIMKgIMKgNDEwMDA8 L2Rpdj48ZGl2Pnhmc19idHJlZV9wdHJfdG9fZGFkZHIgwqAgwqAgwqAgwqAgwqAgwqA0NDU2Mjwv ZGl2PjxkaXY+eGZzX2J0cmVlX2xvb2t1cF9nZXRfYmxvY2sgwqAgwqAgwqAgwqA0NjU0ODwvZGl2 PjxkaXY+eGZzX3RyYW5zX2xvZ19idWYgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgNDg3ODM8L2Rp dj48ZGl2Pnhmc19idWZfaXRlbV9sb2cgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA0ODgwNjwv ZGl2PjxkaXY+eGZzX3RyYW5zX2J1Zl9zZXRfdHlwZSDCoCDCoCDCoCDCoCDCoCDCoDQ4ODE1PC9k aXY+PGRpdj54ZnNfaWV4dF9nZXRfZXh0IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgNTE3MTI8 L2Rpdj48ZGl2Pnhmc19ibWJ0X2dldF9hbGwgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA1MzY2 OTwvZGl2PjxkaXY+eGZzX2J0cmVlX2dldF9ibG9jayDCoCDCoCDCoCDCoCDCoCDCoCDCoCA1NDQy NDwvZGl2PjxkaXY+eGZzX2lleHRfaWR4X3RvX2lyZWMgwqAgwqAgwqAgwqAgwqAgwqAgwqA1Njc2 ODwvZGl2PjxkaXY+eGZzX2JtYnRfZ2V0X21heHJlY3MgwqAgwqAgwqAgwqAgwqAgwqAgwqA1Nzc3 NDwvZGl2PjxkaXY+eGZzX2JtYnRfZ2V0X2Jsb2NrY291bnQgwqAgwqAgwqAgwqAgwqAgODk2NTA8 L2Rpdj48ZGl2Pnhmc19ibWJ0X2Rpc2tfZ2V0X3N0YXJ0b2ZmIMKgIMKgIMKgIMKgOTgyODU8L2Rp dj48ZGl2Pnhmc19ibWJ0X2luaXRfa2V5X2Zyb21fcmVjIMKgIMKgIMKgIMKgOTgyODU8L2Rpdj48 ZGl2Pnhmc19idHJlZV9yZWNfYWRkciDCoCDCoCDCoCDCoCDCoCDCoCDCoCAxMTUxOTk8L2Rpdj48 ZGl2Pnhmc19idHJlZV9yZWNfb2Zmc2V0IMKgIMKgIMKgIMKgIMKgIMKgIDE2MzYzNTwvZGl2Pjxk aXY+eGZzX2J0cmVlX2tleV9hZGRyIMKgIMKgIMKgIMKgIMKgIMKgIMKgIDE3NjgzNzwvZGl2Pjxk aXY+eGZzX2J0cmVlX2tleV9vZmZzZXQgwqAgwqAgwqAgwqAgwqAgwqAgMTg2NTI1PC9kaXY+PGRp dj54ZnNfYm1idF9rZXlfZGlmZiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDI1NDc2MzwvZGl2Pjxk aXY+eGZzX2xvb2t1cF9nZXRfc2VhcmNoX2tleSDCoCDCoCDCoCDCoDI1NzE5MDwvZGl2PjxkaXY+ eGZzX2JtYnRfZ2V0X3N0YXJ0b2ZmIMKgIMKgIMKgIMKgIMKgIMKgMzYzMTU4PC9kaXY+PGRpdj54 ZnNfbmV4dF9iaXQgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgNjMxMzM0PC9kaXY+PGRp dj54ZnNfYnVmX29mZnNldCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDExNjY0Nzc8L2Rpdj48 L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PkNvbXBhcmUgd2l0aCB0aGUg dHdvIHJlc3VsdHMgYWJvdmUsIEkgZm91bmQgwqB3aGVuIHRoZSBpb3BzIGRvd24gdG8gMTlrwrEs IGxvdHMgb2YgZnVuY3Rpb25zIHdlcmUgdHJhY2VkLCBzdWNoIGFzwqB4ZnNfYnVmX3RyeWxvY2ss wqB4ZnNfaWV4dF9pbnNlcnQswqB4ZnNfYnRyZWVfaW5zZXJ0LCBldGMuPC9kaXY+PGRpdj48YnI+ PC9kaXY+PGRpdj5JIGNhbm5vdCBmaW5kIHdoYXQgY2F1c2UgdGhlIGlvcHMgZG93biB0byAxOWvC sSwgYW55IHN1Z2dlc3Rpb24gPzxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2Pjxicj48L2Rp dj48L2Rpdj4NCg== --001a114272e45301b605303628a6-- From shyam@zadarastorage.com Mon Apr 11 09:52:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 43E707CA0 for ; Mon, 11 Apr 2016 09:52:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 06EA58F8033 for ; Mon, 11 Apr 2016 07:52:17 -0700 (PDT) X-ASG-Debug-ID: 1460386334-04cbb02e1db2980001-NocioJ Received: from mail-wm0-f49.google.com (mail-wm0-f49.google.com [74.125.82.49]) by cuda.sgi.com with ESMTP id mkkNoVMzT2w1PLPB (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 11 Apr 2016 07:52:15 -0700 (PDT) X-Barracuda-Envelope-From: shyam@zadarastorage.com X-Barracuda-Apparent-Source-IP: 74.125.82.49 Received: by mail-wm0-f49.google.com with SMTP id u206so107978779wme.1 for ; Mon, 11 Apr 2016 07:52:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=from:references:in-reply-to:mime-version:thread-index:date :message-id:subject:to:cc; bh=+3bpwAD0EYdfGHDLKI2uRaanpag6xIbUlbrkxYgNPyw=; b=w2ZGXaj7uSHpDRMcUz/bfJ8CmXkwINA0gTHur9sjpqLtYvIA4+RtVOm6k3fI2KOrln FqoJfwoKvDjfm3p1ftQQBafnY0cwdNoEazreV0nmnELa6K1boD9QQd+YSjMN8nFOmfU3 TUbvmpbxccmGa9YeKH17SzfHZ333AK5YvMqKVkabhLD2724QAOQ9RZ0xeoks6Fb4MSfG +lXbl66S7230AdgYbUXRi2VunQmwVowXxmZ2yMvlYTEDstm6d46fyQARrt73Vl0IPLQY EztzWkUjhjLFgnVtjedd30rPZsSlFv+Ma2V3OFsNuvXFugi0FRoDJ6kyA+WH46Oy9p0O 53cA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:references:in-reply-to:mime-version :thread-index:date:message-id:subject:to:cc; bh=+3bpwAD0EYdfGHDLKI2uRaanpag6xIbUlbrkxYgNPyw=; b=b5yZ+4gKgC7EGG4rfDynb1Nrc7egu7CN5Dg2xZMd8aj9bxFUxReCTigXmZe3FIEDdn PkfTmyzZdjcAhDY4w0ySd/J7zXBDN46dAiGfUfGwBkTWcWy8fwtcc1mqkj9AP7HLke7c Bq4Pon1scsYtCyDqAzz/Gbi8gIzGBX+TZbCMfvcnCicifJPaWGa9AEv+zI5D/061I7bM Zqnd/ryEe4mPoKqXnRXd2ZHn01w8xlVO6ZKi4LaXFEkd39LGh+AIsHkjgmJdnYqFPzjA CR5fm/Clcojx2+IxSfrlsvwz3QhlSuH+1cQ30s6PfFg9Bbs75yLExd8yySTW8ju+ZLue Dnog== X-Gm-Message-State: AD7BkJLGkduJZGN5bnQidabbi4Y6mmK0a7dxDoJBTGxMGEHaLR6TduffyRnJg+am63e9RGS8A+zEO10bl4QR2w== X-Received: by 10.28.184.194 with SMTP id i185mr19302221wmf.90.1460386334444; Mon, 11 Apr 2016 07:52:14 -0700 (PDT) From: Shyam Kaushik References: <20160322121922.GA53693@bfoster.bfoster> <232dd85fde11d4ef1625f070eabfd167@mail.gmail.com> <20160408224648.GD567@dastard> <20160411012127.GF567@dastard> In-Reply-To: <20160411012127.GF567@dastard> MIME-Version: 1.0 X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AdGTkH/Z4umH15ffTqq0wVMyHRNp8AAcNprA Date: Mon, 11 Apr 2016 20:22:14 +0530 Message-ID: <1aa4e955d78e6932260fdfc55c83bb8e@mail.gmail.com> Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery To: Dave Chinner , Alex Lyakas X-ASG-Orig-Subj: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Cc: Brian Foster , xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wm0-f49.google.com[74.125.82.49] X-Barracuda-Start-Time: 1460386335 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28638 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi Dave, Do you plan to post a patch for the bug you discovered in xfs_iflush() to goto abort_out when xfs_imap_to_bp() fails? We can include this patch & see we can hit a recreate of this issue. Thanks. --Shyam -----Original Message----- From: Dave Chinner [mailto:david@fromorbit.com] Sent: 11 April 2016 06:51 To: Alex Lyakas Cc: Shyam Kaushik; Brian Foster; xfs@oss.sgi.com Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery On Sun, Apr 10, 2016 at 09:40:29PM +0300, Alex Lyakas wrote: > Hello Dave, > > On Sat, Apr 9, 2016 at 1:46 AM, Dave Chinner wrote: > > On Fri, Apr 08, 2016 at 04:21:02PM +0530, Shyam Kaushik wrote: > >> Hi Dave, Brian, Carlos, > >> > >> While trying to reproduce this issue I have been running into different > >> issues that are similar. Underlying issue remains the same when backend to > >> XFS is failed & we unmount XFS, we run into hung-task timeout (180-secs) > >> with stack like > >> > >> kernel: [14952.671131] [] > >> xfs_ail_push_all_sync+0xa9/0xe0 [xfs] > >> kernel: [14952.671139] [] ? > >> prepare_to_wait_event+0x110/0x110 > >> kernel: [14952.671181] [] xfs_unmountfs+0x61/0x1a0 > >> [xfs] > >> > >> while running trace-events, XFS ail push keeps looping around > >> > >> xfsaild/dm-10-21143 [001] ...2 17878.555133: xfs_ilock_nowait: dev > >> 253:10 ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > > Looks like either a stale inode (which should never reach the AIL) > > or it's an inode that's been reclaimed and this is a use after free > > situation. Given that we are failing IOs here, I'd suggest it's more > > likely to be an IO failure that's caused a writeback problem, not an > > interaction with stale inodes. > > > > So, look at xfs_iflush. If an IO fails, it is supposed to unlock the > > inode by calling xfs_iflush_abort(), which will also remove it from > > the AIL. This can also happen on reclaim of a dirty inode, and if so > > we'll still reclaim the inode because reclaim assumes xfs_iflush() > > cleans up properly. > > > > Which, apparently, it doesn't: > > > > /* > > * Get the buffer containing the on-disk inode. > > */ > > error = xfs_imap_to_bp(mp, NULL, &ip->i_imap, &dip, &bp, XBF_TRYLOCK, 0); > > if (error || !bp) { > > xfs_ifunlock(ip); > > return error; > > } > > > > This looks like a bug - xfs_iflush hasn't aborted the inode > > writeback on failure - it's just unlocked the flush lock. Hence it > > has left the inode dirty in the AIL, and then the inode has probably > > then been reclaimed, setting the inode number to zero. > In our case, we do not reach this call, because XFS is already marked > as "shutdown", so in our case we do: > /* > * This may have been unpinned because the filesystem is shutting > * down forcibly. If that's the case we must not write this inode > * to disk, because the log record didn't make it to disk. > * > * We also have to remove the log item from the AIL in this case, > * as we wait for an empty AIL as part of the unmount process. > */ > if (XFS_FORCED_SHUTDOWN(mp)) { > error = -EIO; > goto abort_out; > } > > So we call xfs_iflush_abort, but due to "iip" being NULL (as Shyam > mentioned earlier in this thread), we proceed directly to > xfs_ifunlock(ip), which now becomes the same situation as you > described above. If you are getting this occuring, something else has already gone wrong as you can't have a dirty inode without a log item attached to it. So it appears to me that you are reporting a symptom of a problem after it has occured, not the root cause. Maybe it is the same root cause, maybe not. Either way, it doesn't help us solve any problem. > The comment clearly says "We also have to remove the log item from the > AIL in this case, as we wait for an empty AIL as part of the unmount > process." Could you perhaps point us at the code that is supposed to > remove the log item from the AIL? Apparently this is not happening. xfs_iflush_abort or xfs_iflush_done does that work. -Dave. -- Dave Chinner david@fromorbit.com From eflorac@intellique.com Mon Apr 11 11:10:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A0F3D7CA0 for ; Mon, 11 Apr 2016 11:10:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 73A5B8F8033 for ; Mon, 11 Apr 2016 09:10:00 -0700 (PDT) X-ASG-Debug-ID: 1460390997-04cbb02e1bb5810001-NocioJ Received: from mail1.g1.pair.com (mail1.g1.pair.com [66.39.3.162]) by cuda.sgi.com with ESMTP id 5tjkPAwiFNjJaTJc (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 11 Apr 2016 09:09:58 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 66.39.3.162 Received: from localhost (localhost [127.0.0.1]) by mail1.g1.pair.com (Postfix) with SMTP id 5D5992CA1B; Mon, 11 Apr 2016 12:09:57 -0400 (EDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail1.g1.pair.com (Postfix) with ESMTPSA id C95DF2C9B7; Mon, 11 Apr 2016 12:09:56 -0400 (EDT) Date: Mon, 11 Apr 2016 18:10:01 +0200 From: Emmanuel Florac To: Songbo Wang Cc: xfs@oss.sgi.com Subject: Re: about the xfs performance Message-ID: <20160411181001.2760439b@harpe.intellique.com> X-ASG-Orig-Subj: Re: about the xfs performance In-Reply-To: References: Organization: Intellique X-Mailer: Claws Mail 3.13.1 (GTK+ 2.24.30; i486-slackware-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Start-Time: 1460390998 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.20 X-Barracuda-Spam-Status: No, SCORE=0.20 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC7_SA298e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28639 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.20 BSF_SC7_SA298e Custom Rule SA298e Le Mon, 11 Apr 2016 22:14:06 +0800 Songbo Wang =C3=A9crivait: > mkfs: mkfs.xfs /dev/hioa2 -f -n size=3D64k -i size=3D512 -d > agcount=3D40 -l size=3D1024m. > mount: mount /dev/hioa2 /mnt/ -t xfs -o > rw,noexec,nodev,noatime,nodiratime,nobarrier,discard,inode64,logbsize=3D2= 56k,delaylog > I use the following command to test iops: fio -ioengine=3Dlibaio -bs=3D4k > -direct=3D1 -thread -rw=3Drandwrite -size=3D50G -filename=3D/mnt/test > -name=3D"EBS 4KB randwrite test" -iodepth=3D64 -runtime=3D60 > The results is normal at the beginning which is about 210k=C2=B1=EF=BC=8C= but some > seconds later, the results down to 19k=C2=B1. You should first try default mkfs settings, with default mount options. Normally mkfs.xfs should initiate a TRIM on the SSD, therefore performance should remain predictable. What model of SSD card are you using? With an HGST NVMe SN1x0 I've got very consistent results (no degradation with time). --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From chris.m.moser@seagate.com Mon Apr 11 12:15:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 296667CA0 for ; Mon, 11 Apr 2016 12:15:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0219F304048 for ; Mon, 11 Apr 2016 10:15:46 -0700 (PDT) X-ASG-Debug-ID: 1460394944-04cb6c24623e4030001-NocioJ Received: from mx0b-00003501.pphosted.com (mx0b-00003501.pphosted.com [67.231.152.68]) by cuda.sgi.com with ESMTP id GLMcyoAFO2Sxu2Xz (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 11 Apr 2016 10:15:44 -0700 (PDT) X-Barracuda-Envelope-From: chris.m.moser@seagate.com X-Barracuda-Apparent-Source-IP: 67.231.152.68 Received: from pps.filterd (m0075030.ppops.net [127.0.0.1]) by mx0b-00003501.pphosted.com (8.16.0.11/8.16.0.11) with SMTP id u3BHFVB0024844 for ; Mon, 11 Apr 2016 13:15:44 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=seagate.com; h=mime-version : date : message-id : subject : from : to : content-type; s=proofpoint; bh=jZ/PnXpSiR6CPgfo0Wg0diX4pwbn4o7F+JCANYf+Trk=; b=PM/VAlWVdLcs+k99zolky7YCQh5iJTNfi3vO9A2uUxczfxRMB+ZvQ4z8H3IkBFRvMt8Y lk61VXiGBW3C1jPZGFVjlsHJkJKIe+TiDu3T8fkWN3KceezFZ2pf1za5aIqSKdTViZc1 wh7dvUa9B00Qmzyv8H6kvNM7YDnCXve0pcyIsrP3B/xCUeQUThhtJE/XTIoQqII4g6Nh oZJ9/5NoVMjpEo4TNxFetzq6odpv4qbfCqq0sgi/Z3m/WKcAUequCIKkxZSzX0iK0vnf 6XL46Zfl8Znz3J29kshjhSzFsjtupLDETPA+8lvX4DALLmaATGXmuphOYeyYnlaKy8f4 jA== Received: from mail-ig0-f176.google.com (mail-ig0-f176.google.com [209.85.213.176]) by mx0b-00003501.pphosted.com with ESMTP id 228g5rg04f-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Mon, 11 Apr 2016 13:15:43 -0400 Received: by mail-ig0-f176.google.com with SMTP id ui10so79775101igc.1 for ; Mon, 11 Apr 2016 10:15:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=seagate.com; s=google; h=mime-version:date:message-id:subject:from:to; bh=s/wExnKlMwvXn6Vl0UIHPx94s+f3lkgW8PsLsNAPjpI=; b=SqVckyNzZa8DkDuSP71/iBSsPrdjfVeABNI0B+NohApcRb7Ox+c6M+bdhajn3wIrJK bF4QQ1NnN9F25gPbmxFwb2npxXOlT2NstgOBp4fEIfbeHz5zZDrS/+edU29Ager23qUa 3sgAp1H9ATf0/cT0pc4nIKX6sZC8u9ijkGAe8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to; bh=s/wExnKlMwvXn6Vl0UIHPx94s+f3lkgW8PsLsNAPjpI=; b=BroqrQUZmZa1dz6QZs52p463b5cjB4oIv/WP2d8lgs5LHq3BM98wWZ/OdUy2kxfOQ9 uC5skx50P7MUqCq7gZNeoS1Fztma8lyn6uqBK0KsBd5YooE9F7g92kaWsCT2VP0NgL1g B4haVLBFRLStl9UqoNToy2mtDb6t7XsHrlYaagSerqWoYghHbeA6EyW1D/VV5LkGkolX YereaxcWD1dylHQVrxeuXHq4n5mhO/ahEfvBVHMIXegw1drWudLzIi98+eBONJySAN1E AqCr5Ol6pJR83gRfgJ8o1YYrYwiavbybb0kBPSGhm3R5bBxB8c+3Her8PEmQkHTa0B+R S4BA== X-Gm-Message-State: AD7BkJJHoli6Ns6nBKxJGjchsHjXNd/Y7mypgY0rlRcCKJhP4IfEiELm2IOtlGjJ6eirlcnh0uTcD+hmm6pU/tzDoK4qFI3p/RFF4I9jFWRZRfv6D/GiYy+4VknNVqbKURJOTn/yIOXdSU7cdYbCnK/SUji63RKYTZf2aN9gNgA= X-Received: by 10.50.112.98 with SMTP id ip2mr20197718igb.14.1460394942117; Mon, 11 Apr 2016 10:15:42 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.50.112.98 with SMTP id ip2mr20197689igb.14.1460394941785; Mon, 11 Apr 2016 10:15:41 -0700 (PDT) Received: by 10.107.192.67 with HTTP; Mon, 11 Apr 2016 10:15:41 -0700 (PDT) Date: Mon, 11 Apr 2016 12:15:41 -0500 Message-ID: Subject: Re: Use latest xfs_repair on older file systems From: Chris M Moser X-ASG-Orig-Subj: Re: Use latest xfs_repair on older file systems To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=047d7b414162bcdab2053038b18f X-Proofpoint-PolicyRoute: Outbound X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2016-04-11_12:,, signatures=0 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 suspectscore=3 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1603180000 definitions=main-1604110250 X-Proofpoint-Spam-Policy: Default Domain Policy X-Barracuda-Connect: mx0b-00003501.pphosted.com[67.231.152.68] X-Barracuda-Start-Time: 1460394944 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28640 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 --047d7b414162bcdab2053038b18f Content-Type: text/plain; charset=UTF-8 Thank you kindly for you responses. -Chris On Fri, Apr 8, 2016 at 3:37 PM, Chris M Moser wrote: > Hello, > > I have a file system that experienced issues and would not mount. The > system would not boot either as this file system was listed in /etc/fstab. > I booted to a debian image with xfsprogs 3.2.1 and ran xfs_repair > > The host OS now boots and the file system mounts but has only a handful of > the original files. > I unmounted and ran xfs_repair 2.9.4 form the host OS a few more times. (I > read somewhere that running xfs_repair multiple times can find more files) > I still see the same handful of files. > > A previous thread (http://oss.sgi.com/archives/xfs/2014-06/msg00204.html) > suggests running the latest xfs_repair as it may be able to reattach more > files. > > I booted to a fedora 23 live image and updated xfsprogs to 4.5.0. > (openSUSE Tumbleweed has xfsprogs 4.5.0 but I was not able to get their > live image working) When running xfs_repair on the file system it > complains: xfs_repair: V1 inodes unsupported. Please try an older > xfsporgs. > > Is it reasonable to assume that xfs_repair has done all it can and I > should now use photorec from the testdisk package to recover what I can? > > Thank you for your feedback. > > -Chris > > -- > Christopher M Moser > > Seagate Technology LLC > Cluster Lab Administrator > NRM Bldg A/A1-3 > chris.m.moser@seagate.com > 952-402-8269 > > -- Christopher M Moser Seagate Technology LLC Cluster Lab Administrator NRM Bldg A/A1-3 chris.m.moser@seagate.com 952-402-8269 --047d7b414162bcdab2053038b18f Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
    Thank you kindly for you responses.

    -Chr= is


    On Fri, Apr 8, 2016 at 3:37 PM, Chris M Moser <chris.m.moser@se= agate.com> wrote:
    Hello,

    I have a fi= le system that experienced issues and would not mount. The system would not= boot either as this file system was listed in /etc/fstab.
    I boote= d to a debian image with xfsprogs 3.2.1 and ran xfs_repair

    The= host OS now boots and the file system mounts but has only a handful of the= original files.
    I unmounted and ran xfs_repair 2.9.4 form the hos= t OS a few more times. (I read somewhere that running xfs_repair multiple t= imes can find more files) I still see the same handful of files.
    <= br>
    A previous thread (http://oss.sgi.com/archives/xfs/2014-0= 6/msg00204.html) suggests running the latest xfs_repair as it may be ab= le to reattach more files.

    I booted to a fedora 23 live image = and updated xfsprogs to 4.5.0. (openSUSE Tumbleweed has xfsprogs 4.5.0 but = I was not able to get their live image working) When running xfs_repair on = the file system it complains: x= fs_repair: V1 inodes unsupported. Please try an older xfsporgs.
    =

    Is it reasonable to = assume that xfs_repair has done all it can and I should now use photorec fr= om the testdisk package to recover what I can?

    Thank you = for your feedback.

    -Chri= s

    --
    = Christopher M Moser
    =
    Seagate Technology LLC
    Cluste= r Lab Administrator
    = NRM Bldg A/A1-3
    chris.m.moser@se= agate.com
    952-402-8269


    <= /div>



    --
    Christopher M Moser

    Seagate Technology LLC
    Cluster Lab Administrator
    NRM Bldg A/A1-3
    chris.m.moser@seagate.com
    952-402-8269

    --047d7b414162bcdab2053038b18f-- From live-cell-xfs=oss.sgi.com@wamhomes.com Mon Apr 11 12:43:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_IMAGE_RATIO_06, HTML_MESSAGE,MIME_QP_LONG_LINE,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 C19127CA0 for ; Mon, 11 Apr 2016 12:43:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 97E488F8039 for ; Mon, 11 Apr 2016 10:43:34 -0700 (PDT) X-ASG-Debug-ID: 1460396606-04cb6c24643e4ab0002-NocioJ Received: from mail.wamhomes.com (til3.members.turizmtic.com [94.156.145.3]) by cuda.sgi.com with ESMTP id ZBPkzyl920M8DLVy for ; Mon, 11 Apr 2016 10:43:32 -0700 (PDT) X-Barracuda-Envelope-From: live-cell-xfs=oss.sgi.com@wamhomes.com X-Barracuda-Apparent-Source-IP: 94.156.145.3 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=dkim; d=wamhomes.com; h=Date:From:To:Subject:MIME-Version:Content-Type:Message-ID; i=live-cell@wamhomes.com; bh=1LdjBNdRxqvOLH+DmshyRmJPutw=; b=pn91I5z71BDQLYKoTTDKnyF1jXvJcmTT/Mqo7IDK6JexEv4YyrHCbQ5QP7nTP0xdPHO09dpULAIV feBaJU43EBSbJylvL9pIhKmfpwl2ZIhRBXfugfLLQGewU/OU54WVn2Paks8fC1LY/Uv1Gej5HtoV 3dXb0BqPPl7jh9cQiZw= DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=dkim; d=wamhomes.com; b=HZafOVzoqbLiOSju3oFmlH3Qzfh32EqB/waNpqfMaMoLKJzK23OGDgrjQRbacFCVrY3Vjkg+g7bZ ckj5CQP0LYjDFsvQGPZ5zQItcRVogKvbIaG6GGw0twIdm7oQPWWmr6yCCwzAeOtp4PsZc/X02gV4 vuvtzPWART780y0ABe0=; Received: by mail.wamhomes.com id h1fgv20001g3 for ; Mon, 11 Apr 2016 12:39:09 -0500 (envelope-from ) Date: Mon, 11 Apr 2016 12:39:09 -0500 From: "Live Cell" To: Subject: Harvard scientist conquers death? MIME-Version: 1.0 X-ASG-Orig-Subj: Harvard scientist conquers death? Content-Type: multipart/alternative; boundary="----=_Part_328_1992451209.1460396248750" Message-ID: <0.0.0.24.1D194190DF03B00.E65A1@mail.wamhomes.com> X-Barracuda-Connect: til3.members.turizmtic.com[94.156.145.3] X-Barracuda-Start-Time: 1460396612 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.82 X-Barracuda-Spam-Status: No, SCORE=0.82 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e, DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_RATIO_06, HTML_MESSAGE, MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28641 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_IMAGE_RATIO_06 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 0.00 BSF_SC5_SA210e Custom Rule SA210e ------=_Part_328_1992451209.1460396248750 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Harvard scientist conquers death? http://www.wamhomes.com/yellow/high/d6fo8D64fbdZsnFjnn0ntv0Mjh1c0 Update Preferences- http://www.wamhomes.com/blue/was/f138ql64Jfc2ZsnFjnn0ntv0Mjh473 ------=_Part_328_1992451209.1460396248750 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: quoted-printable =20 =20 Is There A CURE For Aging?=20 =20 =20
    =20

    Harvard scientist conquers death?

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

    Is There A CURE For Aging?

    xfs,

    Is THIS t= he single most important healthcare breakthrough in the past 30 years?

    I = recently stumbled upon a video, which could completely tr= ansform the way you think about aging.

    This video descr= ibes radical new research done at Harvard and Cornell Universities into wha= t actually causes the biological process of aging.

    3D""

    Scientists have discovered a new molecule that may hold the = key to significantly slowing down or even reversing the main symptoms of ag= ing:

    -Chronic Fatigue
    -Weight Gain
    -Joint Pain & = Inflammation
    -Muscle Decay
    -Weak Libido
    -Poor Immune Func= tion
    -Anxiety/Stress/Depression
    -Bad Complexion / Saggy Skin -Brain Fog

    The cutting-edge research revealed in this vid= eo shows that these symptoms all stem from a problem at the cellular level.= .a condition which starts in your 30' s and worsens as you get older.

    =

    If you= ' ve suffered from the physical deterioration and loss of energy once thoug= ht to be a ? natural? part of getting older, you' ll benefit from the infor= mation contained in this remarkable free presentation.

     

    <= p>Click here to watch the video... it might be the most impor= tant thing you do all year for your health.

    Stay Healthy,


    Bill Sharpe
    Live Cell Research Staff

    P.S. This research is pote= ntially life-changing for almost every American over the age of 30...so I' = d encourage you to share the the link to thi= s video with any friends or loved ones who could benefi= t from this free information.




     

    Update Preferences

    Live Cell Research
    8391 Beverly Blvd #271 Los Angeles, CA. 90048

     

     

     

     

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

    =20

    =20
    =20
    =20 ------=_Part_328_1992451209.1460396248750-- From sandeen@sandeen.net Mon Apr 11 14:15:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3FD447CA0 for ; Mon, 11 Apr 2016 14:15:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A673EAC004 for ; Mon, 11 Apr 2016 12:15:48 -0700 (PDT) X-ASG-Debug-ID: 1460402142-04cb6c245f3e7a70001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id H4qxbxp0uqCYMRFW for ; Mon, 11 Apr 2016 12:15:42 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 3D61C142F for ; Mon, 11 Apr 2016 14:15:42 -0500 (CDT) Subject: Re: BUG: unable to handle kernel paging request at ffffffff82200000 (xlog_recover_buffer_pass2) To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: BUG: unable to handle kernel paging request at ffffffff82200000 (xlog_recover_buffer_pass2) References: <565EA0DF.609@oracle.com> <56FAA2B9.9060606@gmail.com> From: Eric Sandeen Message-ID: <570BF7DD.8070309@sandeen.net> Date: Mon, 11 Apr 2016 14:15:41 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: <56FAA2B9.9060606@gmail.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1460402142 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.13 X-Barracuda-Spam-Status: No, SCORE=0.13 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=SUBJECT_NOVOWEL X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28646 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.13 SUBJECT_NOVOWEL Subject: has long non-vowel letter sequence FWIW, testing it on 4.6.0-rc1 passes for me. [10756.548578] XFS (loop0): Mounting V4 Filesystem [10756.555109] XFS (loop0): Torn write (CRC failure) detected at log block 0x2. Truncating head block from 0x9. [10756.583561] XFS (loop0): Metadata corruption detected at xfs_inode_buf_verify+0x8e/0x160 [xfs], xfs_inode block 0x25c0 [10756.594245] XFS (loop0): Unmount and run xfs_repair [10756.599117] XFS (loop0): First 64 bytes of corrupted metadata buffer: [10756.605545] ffff88018945f000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ [10756.614225] ffff88018945f010: 00 01 78 25 b7 33 94 b6 41 dd 8f e4 9f f6 af ef ..x%.3..A....... [10756.622906] ffff88018945f020: 02 82 49 4e 41 ed 02 01 00 00 00 00 00 03 00 00 ..INA........... [10756.631586] ffff88018945f030: 00 00 00 00 00 00 00 00 00 01 56 5e 15 4f 03 14 ..........V^.O.. [10756.640267] XFS (loop0): bad inode magic/vsn daddr 9664 #0 (magic=0) [10758.604767] XFS (loop0): Detected bogus zero next_unlinked field in inode 5 buffer 0x25c0. [10758.613032] XFS (loop0): metadata I/O error: block 0x25c0 ("xfs_trans_read_buf_map") error 117 numblks 16 [10758.622601] XFS (loop0): xfs_imap_to_bp: xfs_trans_read_buf() returned error -117. [10758.630162] XFS (loop0): failed to read root inode -Eric On 3/29/16 10:43 AM, Jia He wrote: > Hi Vegard > Does this commit fix the crash? > > commit 7088c4136fa1cba26531fde40bdcfcf3d2ccd533 (patch) > xfs: detect and trim torn writes during log recovery > > B.R. > > > 在 12/2/15 3:42 PM, Vegard Nossum 写é“: >> Hi, >> >> Mounting the attached XFS image (fuzzed) gives me the following invalid >> memory dereference on latest linus/master: >> >> XFS (vda): Mounting V4 Filesystem >> XFS (vda): Starting recovery (logdev: internal) >> XFS (vda): log record CRC mismatch: found 0x9f534964, expected 0xd46d59ce. >> ffffc90000442000: 00 00 00 01 00 00 00 00 69 01 00 00 e6 33 18 19 ........i....3.. >> ffffc90000442010: 00 00 00 10 69 00 00 00 4e 41 52 54 2a 00 00 00 ....i...NART*... >> XFS (vda): log record CRC mismatch: found 0xedba28e, expected 0x9f019b73. >> ffffc90000442000: 00 00 00 01 00 00 00 00 69 01 00 00 5c 47 88 1e ........i...\G.. >> ffffc90000442010: 00 00 00 10 69 00 00 00 4e 41 52 54 2a 00 00 00 ....i...NART*... >> XFS (vda): log record CRC mismatch: found 0x9f534964, expected 0xd46d59ce. >> ffffc9000044a000: 00 00 00 01 00 00 00 00 69 01 00 00 e6 33 18 19 ........i....3.. >> ffffc9000044a010: 00 00 00 10 69 00 00 00 4e 41 52 54 2a 00 00 00 ....i...NART*... >> BUG: unable to handle kernel paging request at ffffffff82200000 >> IP: [] memcpy_erms+0x6/0x10 >> PGD 1e10067 PUD 1e11063 PMD 0 >> Oops: 0000 [#1] SMP KASAN >> CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.4.0-rc3+ #245 >> task: ffff880016e28000 ti: ffff880016e30000 task.ti: ffff880016e30000 >> RIP: 0010:[] [] memcpy_erms+0x6/0x10 >> RSP: 0000:ffff880016e377b8 EFLAGS: 00010287 >> RAX: ffff88001494e380 RBX: 0000000000000027 RCX: ffffffff80285761 >> RDX: ffffffff81150400 RSI: ffffffff82200000 RDI: ffff88001581901f >> RBP: ffff880016e37808 R08: ffff880016429ba8 R09: 0000000000000018 >> R10: 0000000000000000 R11: 0000000000000000 R12: ffff880016429b90 >> R13: 0000000000000002 R14: 00000000ff022a08 R15: ffffffff81335361 >> FS: 0000000000000000(0000) GS:ffff880017200000(0000) knlGS:0000000000000000 >> CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 >> CR2: ffffffff82200000 CR3: 0000000001e0f000 CR4: 00000000001406b0 >> Stack: >> ffffffff8133eb74 ffff880000079b80 ffff880015bf6e40 ffff880016429ba4 >> ffff880000108470 ffff880016429b90 ffff880014c26290 ffff880015bf6e40 >> ffff880000108450 ffff880000079b80 ffff880016e37870 ffffffff8133f02a >> Call Trace: >> [] ? xlog_recover_do_reg_buffer.isra.23+0x124/0x1b0 >> [] xlog_recover_buffer_pass2+0x35a/0x450 >> [] xlog_recover_commit_pass2+0xe9/0x160 >> [] xlog_recover_items_pass2+0x3c/0x60 >> [] xlog_recover_commit_trans+0x206/0x230 >> [] xlog_recovery_process_trans+0x7a/0xb0 >> [] xlog_recover_process_ophdr+0x5e/0xc0 >> [] xlog_recover_process_data+0x9a/0xc0 >> [] xlog_do_recovery_pass+0x440/0x540 >> [] ? kasan_poison_shadow+0x2f/0x40 >> [] xlog_do_log_recovery+0x79/0xc0 >> [] xlog_do_recover+0x11/0xe0 >> [] xlog_recover+0xa3/0x140 >> [] xfs_log_mount+0x24e/0x2c0 >> [] xfs_mountfs+0x499/0x7d0 >> [] ? xfs_mru_cache_create+0x121/0x180 >> [] xfs_fs_fill_super+0x38d/0x4a0 >> [] mount_bdev+0x185/0x1c0 >> [] ? xfs_parseargs+0xaa0/0xaa0 >> [] xfs_fs_mount+0x10/0x20 >> [] mount_fs+0x34/0x160 >> [] ? __alloc_percpu+0x10/0x20 >> [] vfs_kern_mount+0x62/0x110 >> [] do_mount+0x21b/0xdd0 >> >> $ addr2line -e vmlinux -i ffffffff81475616 # memcpy_erms+0x6/0x10 >> arch/x86/lib/memcpy_64.S:50 >> >> $ addr2line -e vmlinux -i ffffffff8133eb74 # xlog_recover_do_reg_buffer.isra.23+0x124/0x1b0 >> fs/xfs/xfs_log_recover.c:2238 >> >> $ addr2line -e vmlinux -i ffffffff8133f02a # xlog_recover_buffer_pass2+0x35a/0x450 >> fs/xfs/xfs_log_recover.c:2397 >> >> which is this bit: >> >> memcpy(xfs_buf_offset(bp, >> (uint)bit << XFS_BLF_SHIFT), /* dest */ >> item->ri_buf[i].i_addr, /* source */ >> nbits<> >> Because of the memory corruption the bug manifests in different ways, >> but the stacktrace above is by far the most common. >> >> I can test patches. Thanks, >> >> >> Vegard >> >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Mon Apr 11 14:33:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B746D7CA0 for ; Mon, 11 Apr 2016 14:33:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3AFA0AC004 for ; Mon, 11 Apr 2016 12:33:13 -0700 (PDT) X-ASG-Debug-ID: 1460403191-04bdf011053e1e50001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id f50kaPUjmdfhobhd for ; Mon, 11 Apr 2016 12:33:11 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id E7285142F for ; Mon, 11 Apr 2016 14:33:10 -0500 (CDT) Subject: Re: about the xfs performance To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: about the xfs performance References: <20160411181001.2760439b@harpe.intellique.com> From: Eric Sandeen Message-ID: <570BFBF6.8020403@sandeen.net> Date: Mon, 11 Apr 2016 14:33:10 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: <20160411181001.2760439b@harpe.intellique.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1460403191 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28646 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/11/16 11:10 AM, Emmanuel Florac wrote: > Le Mon, 11 Apr 2016 22:14:06 +0800 > Songbo Wang écrivait: > >> mkfs: mkfs.xfs /dev/hioa2 -f -n size=64k -i size=512 -d >> agcount=40 -l size=1024m. >> mount: mount /dev/hioa2 /mnt/ -t xfs -o >> rw,noexec,nodev,noatime,nodiratime,nobarrier,discard,inode64,logbsize=256k,delaylog >> I use the following command to test iops: fio -ioengine=libaio -bs=4k >> -direct=1 -thread -rw=randwrite -size=50G -filename=/mnt/test >> -name="EBS 4KB randwrite test" -iodepth=64 -runtime=60 >> The results is normal at the beginning which is about 210k±,but some >> seconds later, the results down to 19k±. > > You should first try default mkfs settings, with default mount options. Agreed. Where did that set of options come from, in any case? -Eric > Normally mkfs.xfs should initiate a TRIM on the SSD, therefore > performance should remain predictable. > > What model of SSD card are you using? With an HGST NVMe SN1x0 I've got > very consistent results (no degradation with time). > From david@fromorbit.com Mon Apr 11 17:48:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DD3357CA0 for ; Mon, 11 Apr 2016 17:48:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B2B60304059 for ; Mon, 11 Apr 2016 15:48:30 -0700 (PDT) X-ASG-Debug-ID: 1460414907-04cb6c24623ef3f0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 1p5dKjJxmt2salFI for ; Mon, 11 Apr 2016 15:48:28 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2B1DAB1KQxXPKAZLHlcgzeBUIZrn2oGjBGDT4YohgcEAgKBLU0BAQEBAQEHAQEBAUJAhEIBAQQ6HCMQCAMYCSUPBSUDBxoTiCbAAwEBAQcCAR0ZhUCFE4dqgisFmASOAoFbjTxFjmGDFIFHKjCKBQEBAQ Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail06.adl6.internode.on.net with ESMTP; 12 Apr 2016 08:17:58 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1apkcd-0000KD-Fe; Tue, 12 Apr 2016 08:47:55 +1000 Date: Tue, 12 Apr 2016 08:47:55 +1000 From: Dave Chinner To: Shyam Kaushik Cc: Alex Lyakas , Brian Foster , xfs@oss.sgi.com Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Message-ID: <20160411224755.GC9088@dastard> X-ASG-Orig-Subj: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery References: <20160322121922.GA53693@bfoster.bfoster> <232dd85fde11d4ef1625f070eabfd167@mail.gmail.com> <20160408224648.GD567@dastard> <20160411012127.GF567@dastard> <1aa4e955d78e6932260fdfc55c83bb8e@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1aa4e955d78e6932260fdfc55c83bb8e@mail.gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1460414907 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28650 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Apr 11, 2016 at 08:22:14PM +0530, Shyam Kaushik wrote: > Hi Dave, > > Do you plan to post a patch for the bug you discovered in xfs_iflush() to > goto abort_out when xfs_imap_to_bp() fails? I'll get to it, but I can't do everything for everyone at once. There is enough information in this thread that it shoul dbe straight forward to write the two line patch to jump to the correct error handling code, so the fact I haven't written the trivial change yet should not be holding anyone up... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Apr 11 18:11:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B674D7CA0 for ; Mon, 11 Apr 2016 18:11:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6DD79304053 for ; Mon, 11 Apr 2016 16:11:00 -0700 (PDT) X-ASG-Debug-ID: 1460416257-04bdf011043f1770001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id fYcfPH3Lgk5cfIC9 for ; Mon, 11 Apr 2016 16:10:58 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2B2DADgLQxXPKAZLHldgzeBUIZrn2oGjBGJd4YHBAICgS5NAQEBAQEBBwEBAQFCQIRBAQEBAwEjDwEjIwULCAECDgoCAgUhAgIPBSUDBxoTiB8HkD6dF5IfAQEBAQYCAR0ZY4RdhROHPyuCKwWNToo2jgKPF48mgmYZgVwqMIoFAQEB Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail06.adl6.internode.on.net with ESMTP; 12 Apr 2016 08:40:57 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1apkyu-0000Mm-C6; Tue, 12 Apr 2016 09:10:56 +1000 Date: Tue, 12 Apr 2016 09:10:56 +1000 From: Dave Chinner To: Songbo Wang Cc: xfs@oss.sgi.com Subject: Re: about the xfs performance Message-ID: <20160411231056.GD9088@dastard> X-ASG-Orig-Subj: Re: about the xfs performance References: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1460416257 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28651 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 BSF_SC5_SA210e Custom Rule SA210e On Mon, Apr 11, 2016 at 10:14:06PM +0800, Songbo Wang wrote: > Hi xfsers: > > I got some troubles on the performance of xfs. > The environment is , > xfs version is 3.2.1, > centos 7.1, > kernel version:3.10.0-229.el7.x86_64. > pcie-ssd card, > mkfs: mkfs.xfs /dev/hioa2 -f -n size=64k -i size=512 -d agcount=40 -l > size=1024m. > mount: mount /dev/hioa2 /mnt/ -t xfs -o > rw,noexec,nodev,noatime,nodiratime,nobarrier,discard,inode64,logbsize=256k,delaylog > I use the following command to test iops: fio -ioengine=libaio -bs=4k > -direct=1 -thread -rw=randwrite -size=50G -filename=/mnt/test -name="EBS > 4KB randwrite test" -iodepth=64 -runtime=60 > The results is normal at the beginning which is about 210k±,but some > seconds later, the results down to 19k±. Looks like the workload runs out of log space due to all the allocation transactions being logged, which then causes new transactions to start tail pushing the log to flush dirty metadata. This is needed to to make more space in the log for on incoming dio writes that require allocation transactions. This will block IO submission until there is space available in the log. Let's face it, all that test does is create a massively fragmented 50GB file, so you're going to have a lot of metadata to log. Do the maths - if it runs at 200kiops for a few seconds, it's created a million extents. And it's doing random insert on the extent btree, so it's repeatedly dirtying the entire extent btree. This will trigger journal commits quite frequently as this is a large amount of metadata that is being dirtied. e.g. at 500 extent records per 4k block, a million extents will require 2000 leaf blocks to store them all. That's 80MB of metadata per million extents that this workload is generating and repeatedly dirtying. Then there's also other metadata, like the free space btrees, that is also being repeatedly dirtied, etc, so it would not be unexpected to see a workload like this on high IOPS devices allocating 100MB of metadata every few seconds and the amount being journalled steadily increasing until the file is fully populated. > I did a senond test , > umount the /dev/hioa2, > fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=randwrite > -filename=/dev/hioa2 -name="EBS 8KB randwrite test" -iodepth=64 -runtime=60 > The results was normal, the iops is about 210k± all the time. That's not an equivalent test - it's being run direct to the block device, not to a file on the filesytem on the block device, and so you won't see artifacts taht are a result of creating worst case file fragmentation.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Mon Apr 11 18:23:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1EEAE7CA0 for ; Mon, 11 Apr 2016 18:23:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 97CBDAC002 for ; Mon, 11 Apr 2016 16:23:52 -0700 (PDT) X-ASG-Debug-ID: 1460417027-04bdf011043f1e10001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id u3tdkhHORISuN3V3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 11 Apr 2016 16:23:47 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u3BNNjwn018484 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 11 Apr 2016 23:23:45 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u3BNNiYr009826 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 11 Apr 2016 23:23:45 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u3BNNfow002242; Mon, 11 Apr 2016 23:23:43 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 11 Apr 2016 16:23:41 -0700 Date: Mon, 11 Apr 2016 16:23:36 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 16/16] xfs: piggyback rmapbt update intents in the bmap free structure Message-ID: <20160411232336.GA18517@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 16/16] xfs: piggyback rmapbt update intents in the bmap free structure References: <1457410578-30233-1-git-send-email-david@fromorbit.com> <1457410578-30233-17-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1457410578-30233-17-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1460417027 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28651 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Mar 08, 2016 at 03:16:18PM +1100, Dave Chinner wrote: > From: "Darrick J. Wong" > > Extend the xfs_bmap_free structure to track a list of rmapbt update > intents. Record the changes being made in the new rmapbt intent list > and add hooks to process the changes to xfs_bmap_finish(). > > Subsequent patches will implement the rmapbt updates recorded in > the intents, allowing us to re-order the rmapbt changes to avoid > deadlocks (e.g. AG ordering rules) and sanely log the changes > without blowing out transaction reservation sizes. > > This patch is derived from a couple of original patches from > Darrick, split and merged by me, with a minor change to use > list_head for the linked list. > > Signed-off-by: Darrick J. Wong > Signed-off-by: Dave Chinner > --- > fs/xfs/libxfs/xfs_bmap.c | 179 +++++++++++++++++++++++++++++++- > fs/xfs/libxfs/xfs_bmap.h | 16 ++- > fs/xfs/libxfs/xfs_rmap.c | 228 +++++++++++++++++++++++++++++++++++++++++ > fs/xfs/libxfs/xfs_rmap_btree.h | 57 +++++++++++ > fs/xfs/xfs_bmap_util.c | 6 ++ > 5 files changed, 479 insertions(+), 7 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c > index f8d33c5..3ee3b8c 100644 > --- a/fs/xfs/libxfs/xfs_bmap.c > +++ b/fs/xfs/libxfs/xfs_bmap.c > @@ -45,6 +45,7 @@ > #include "xfs_symlink.h" > #include "xfs_attr_leaf.h" > #include "xfs_filestream.h" > +#include "xfs_rmap_btree.h" > > > kmem_zone_t *xfs_bmap_free_item_zone; > @@ -648,6 +649,8 @@ xfs_bmap_cancel( > xfs_bmap_free_item_t *free; /* free list item */ > xfs_bmap_free_item_t *next; > > + xfs_rmap_cancel(&flist->xbf_rlist); > + > if (flist->xbf_count == 0) > return; > ASSERT(flist->xbf_first != NULL); > @@ -1869,6 +1872,10 @@ xfs_bmap_add_extent_delay_real( > if (error) > goto done; > } > + error = xfs_rmap_combine(mp, bma->rlist, bma->ip->i_ino, > + whichfork, &LEFT, &RIGHT, &PREV); soft-NAK on this, because I'm reworking the code to use the btree interval query code, which will make it possible to collapse all the inode fork block mapping/unmapping into three deferred rmap operation types: map, unmap, and convert (unwritten <-> real). This will reduce the size of the rmapbt when a file manages to map an extent that's more than 2^20 blocks long. (The code itself looks fine, I'm just making a declaration of what I'm working on for LSF.) --D > + if (error) > + goto done; > break; > > case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: > @@ -1901,6 +1908,10 @@ xfs_bmap_add_extent_delay_real( > if (error) > goto done; > } > + error = xfs_rmap_resize(mp, bma->rlist, bma->ip->i_ino, > + whichfork, &LEFT, PREV.br_blockcount); > + if (error) > + goto done; > break; > > case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: > @@ -1932,6 +1943,10 @@ xfs_bmap_add_extent_delay_real( > if (error) > goto done; > } > + error = xfs_rmap_move(mp, bma->rlist, bma->ip->i_ino, > + whichfork, &RIGHT, -PREV.br_blockcount); > + if (error) > + goto done; > break; > > case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING: > @@ -1961,6 +1976,10 @@ xfs_bmap_add_extent_delay_real( > goto done; > XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); > } > + error = xfs_rmap_insert(mp, bma->rlist, bma->ip->i_ino, > + whichfork, new); > + if (error) > + goto done; > break; > > case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG: > @@ -1996,6 +2015,10 @@ xfs_bmap_add_extent_delay_real( > if (error) > goto done; > } > + error = xfs_rmap_resize(mp, bma->rlist, bma->ip->i_ino, > + whichfork, &LEFT, new->br_blockcount); > + if (error) > + goto done; > da_new = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(bma->ip, temp), > startblockval(PREV.br_startblock)); > xfs_bmbt_set_startblock(ep, nullstartblock(da_new)); > @@ -2031,6 +2054,10 @@ xfs_bmap_add_extent_delay_real( > goto done; > XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); > } > + error = xfs_rmap_insert(mp, bma->rlist, bma->ip->i_ino, > + whichfork, new); > + if (error) > + goto done; > > if (xfs_bmap_needs_btree(bma->ip, whichfork)) { > error = xfs_bmap_extents_to_btree(bma->tp, bma->ip, > @@ -2079,6 +2106,8 @@ xfs_bmap_add_extent_delay_real( > if (error) > goto done; > } > + error = xfs_rmap_move(mp, bma->rlist, bma->ip->i_ino, > + whichfork, &RIGHT, -new->br_blockcount); > > da_new = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(bma->ip, temp), > startblockval(PREV.br_startblock)); > @@ -2115,6 +2144,10 @@ xfs_bmap_add_extent_delay_real( > goto done; > XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); > } > + error = xfs_rmap_insert(mp, bma->rlist, bma->ip->i_ino, > + whichfork, new); > + if (error) > + goto done; > > if (xfs_bmap_needs_btree(bma->ip, whichfork)) { > error = xfs_bmap_extents_to_btree(bma->tp, bma->ip, > @@ -2184,6 +2217,10 @@ xfs_bmap_add_extent_delay_real( > goto done; > XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); > } > + error = xfs_rmap_insert(mp, bma->rlist, bma->ip->i_ino, > + whichfork, new); > + if (error) > + goto done; > > if (xfs_bmap_needs_btree(bma->ip, whichfork)) { > error = xfs_bmap_extents_to_btree(bma->tp, bma->ip, > @@ -2425,6 +2462,10 @@ xfs_bmap_add_extent_unwritten_real( > RIGHT.br_blockcount, LEFT.br_state))) > goto done; > } > + error = xfs_rmap_combine(mp, &flist->xbf_rlist, ip->i_ino, > + XFS_DATA_FORK, &LEFT, &RIGHT, &PREV); > + if (error) > + goto done; > break; > > case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: > @@ -2462,6 +2503,10 @@ xfs_bmap_add_extent_unwritten_real( > LEFT.br_state))) > goto done; > } > + error = xfs_rmap_lcombine(mp, &flist->xbf_rlist, ip->i_ino, > + XFS_DATA_FORK, &LEFT, &PREV); > + if (error) > + goto done; > break; > > case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: > @@ -2497,6 +2542,10 @@ xfs_bmap_add_extent_unwritten_real( > newext))) > goto done; > } > + error = xfs_rmap_rcombine(mp, &flist->xbf_rlist, ip->i_ino, > + XFS_DATA_FORK, &RIGHT, &PREV); > + if (error) > + goto done; > break; > > case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING: > @@ -2523,6 +2572,11 @@ xfs_bmap_add_extent_unwritten_real( > newext))) > goto done; > } > + > + error = xfs_rmap_resize(mp, &flist->xbf_rlist, ip->i_ino, > + XFS_DATA_FORK, new, 0); > + if (error) > + goto done; > break; > > case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG: > @@ -2570,6 +2624,14 @@ xfs_bmap_add_extent_unwritten_real( > if (error) > goto done; > } > + error = xfs_rmap_move(mp, &flist->xbf_rlist, ip->i_ino, > + XFS_DATA_FORK, &PREV, new->br_blockcount); > + if (error) > + goto done; > + error = xfs_rmap_resize(mp, &flist->xbf_rlist, ip->i_ino, > + XFS_DATA_FORK, &LEFT, new->br_blockcount); > + if (error) > + goto done; > break; > > case BMAP_LEFT_FILLING: > @@ -2608,6 +2670,14 @@ xfs_bmap_add_extent_unwritten_real( > goto done; > XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); > } > + error = xfs_rmap_move(mp, &flist->xbf_rlist, ip->i_ino, > + XFS_DATA_FORK, &PREV, new->br_blockcount); > + if (error) > + goto done; > + error = xfs_rmap_insert(mp, &flist->xbf_rlist, ip->i_ino, > + XFS_DATA_FORK, new); > + if (error) > + goto done; > break; > > case BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: > @@ -2650,6 +2720,14 @@ xfs_bmap_add_extent_unwritten_real( > newext))) > goto done; > } > + error = xfs_rmap_resize(mp, &flist->xbf_rlist, ip->i_ino, > + XFS_DATA_FORK, &PREV, -new->br_blockcount); > + if (error) > + goto done; > + error = xfs_rmap_move(mp, &flist->xbf_rlist, ip->i_ino, > + XFS_DATA_FORK, &RIGHT, -new->br_blockcount); > + if (error) > + goto done; > break; > > case BMAP_RIGHT_FILLING: > @@ -2690,6 +2768,14 @@ xfs_bmap_add_extent_unwritten_real( > goto done; > XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); > } > + error = xfs_rmap_resize(mp, &flist->xbf_rlist, ip->i_ino, > + XFS_DATA_FORK, &PREV, -new->br_blockcount); > + if (error) > + goto done; > + error = xfs_rmap_insert(mp, &flist->xbf_rlist, ip->i_ino, > + XFS_DATA_FORK, new); > + if (error) > + goto done; > break; > > case 0: > @@ -2751,6 +2837,19 @@ xfs_bmap_add_extent_unwritten_real( > goto done; > XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); > } > + error = xfs_rmap_resize(mp, &flist->xbf_rlist, ip->i_ino, > + XFS_DATA_FORK, &PREV, new->br_startoff - > + PREV.br_startoff - PREV.br_blockcount); > + if (error) > + goto done; > + error = xfs_rmap_insert(mp, &flist->xbf_rlist, ip->i_ino, > + XFS_DATA_FORK, new); > + if (error) > + goto done; > + error = xfs_rmap_insert(mp, &flist->xbf_rlist, ip->i_ino, > + XFS_DATA_FORK, &r[1]); > + if (error) > + goto done; > break; > > case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: > @@ -2954,6 +3053,7 @@ xfs_bmap_add_extent_hole_real( > int rval=0; /* return value (logging flags) */ > int state; /* state bits, accessed thru macros */ > struct xfs_mount *mp; > + struct xfs_bmbt_irec prev; /* fake previous extent entry */ > > mp = bma->ip->i_mount; > ifp = XFS_IFORK_PTR(bma->ip, whichfork); > @@ -3061,6 +3161,12 @@ xfs_bmap_add_extent_hole_real( > if (error) > goto done; > } > + prev = *new; > + prev.br_startblock = nullstartblock(0); > + error = xfs_rmap_combine(mp, bma->rlist, bma->ip->i_ino, > + whichfork, &left, &right, &prev); > + if (error) > + goto done; > break; > > case BMAP_LEFT_CONTIG: > @@ -3093,6 +3199,10 @@ xfs_bmap_add_extent_hole_real( > if (error) > goto done; > } > + error = xfs_rmap_resize(mp, bma->rlist, bma->ip->i_ino, > + whichfork, &left, new->br_blockcount); > + if (error) > + goto done; > break; > > case BMAP_RIGHT_CONTIG: > @@ -3127,6 +3237,10 @@ xfs_bmap_add_extent_hole_real( > if (error) > goto done; > } > + error = xfs_rmap_move(mp, bma->rlist, bma->ip->i_ino, > + whichfork, &right, -new->br_blockcount); > + if (error) > + goto done; > break; > > case 0: > @@ -3155,6 +3269,10 @@ xfs_bmap_add_extent_hole_real( > goto done; > XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); > } > + error = xfs_rmap_insert(mp, bma->rlist, bma->ip->i_ino, > + whichfork, new); > + if (error) > + goto done; > break; > } > > @@ -4289,7 +4407,6 @@ xfs_bmapi_delay( > return 0; > } > > - > static int > xfs_bmapi_allocate( > struct xfs_bmalloca *bma) > @@ -4603,6 +4720,7 @@ xfs_bmapi_write( > bma.userdata = 0; > bma.flist = flist; > bma.firstblock = firstblock; > + bma.rlist = &flist->xbf_rlist; > > while (bno < end && n < *nmap) { > inhole = eof || bma.got.br_startoff > bno; > @@ -4861,6 +4979,10 @@ xfs_bmap_del_extent( > XFS_IFORK_NEXT_SET(ip, whichfork, > XFS_IFORK_NEXTENTS(ip, whichfork) - 1); > flags |= XFS_ILOG_CORE; > + error = xfs_rmap_delete(mp, &flist->xbf_rlist, ip->i_ino, > + whichfork, &got); > + if (error) > + goto done; > if (!cur) { > flags |= xfs_ilog_fext(whichfork); > break; > @@ -4888,6 +5010,10 @@ xfs_bmap_del_extent( > } > xfs_bmbt_set_startblock(ep, del_endblock); > trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); > + error = xfs_rmap_move(mp, &flist->xbf_rlist, ip->i_ino, > + whichfork, &got, del->br_blockcount); > + if (error) > + goto done; > if (!cur) { > flags |= xfs_ilog_fext(whichfork); > break; > @@ -4914,6 +5040,10 @@ xfs_bmap_del_extent( > break; > } > trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); > + error = xfs_rmap_resize(mp, &flist->xbf_rlist, ip->i_ino, > + whichfork, &got, -del->br_blockcount); > + if (error) > + goto done; > if (!cur) { > flags |= xfs_ilog_fext(whichfork); > break; > @@ -4939,6 +5069,15 @@ xfs_bmap_del_extent( > if (!delay) { > new.br_startblock = del_endblock; > flags |= XFS_ILOG_CORE; > + error = xfs_rmap_resize(mp, &flist->xbf_rlist, > + ip->i_ino, whichfork, &got, > + temp - got.br_blockcount); > + if (error) > + goto done; > + error = xfs_rmap_insert(mp, &flist->xbf_rlist, > + ip->i_ino, whichfork, &new); > + if (error) > + goto done; > if (cur) { > if ((error = xfs_bmbt_update(cur, > got.br_startoff, > @@ -5175,6 +5314,7 @@ xfs_bunmapi( > got.br_startoff + got.br_blockcount - 1); > if (bno < start) > break; > + > /* > * Then deal with the (possibly delayed) allocated space > * we found. > @@ -5477,7 +5617,8 @@ xfs_bmse_merge( > struct xfs_bmbt_rec_host *gotp, /* extent to shift */ > struct xfs_bmbt_rec_host *leftp, /* preceding extent */ > struct xfs_btree_cur *cur, > - int *logflags) /* output */ > + int *logflags, /* output */ > + struct xfs_rmap_list *rlist) /* rmap intent list */ > { > struct xfs_bmbt_irec got; > struct xfs_bmbt_irec left; > @@ -5508,6 +5649,13 @@ xfs_bmse_merge( > XFS_IFORK_NEXT_SET(ip, whichfork, > XFS_IFORK_NEXTENTS(ip, whichfork) - 1); > *logflags |= XFS_ILOG_CORE; > + error = xfs_rmap_resize(mp, rlist, ip->i_ino, whichfork, &left, > + blockcount - left.br_blockcount); > + if (error) > + return error; > + error = xfs_rmap_delete(mp, rlist, ip->i_ino, whichfork, &got); > + if (error) > + return error; > if (!cur) { > *logflags |= XFS_ILOG_DEXT; > return 0; > @@ -5550,7 +5698,8 @@ xfs_bmse_shift_one( > struct xfs_bmbt_rec_host *gotp, > struct xfs_btree_cur *cur, > int *logflags, > - enum shift_direction direction) > + enum shift_direction direction, > + struct xfs_rmap_list *rlist) > { > struct xfs_ifork *ifp; > struct xfs_mount *mp; > @@ -5600,7 +5749,7 @@ xfs_bmse_shift_one( > offset_shift_fsb)) { > return xfs_bmse_merge(ip, whichfork, offset_shift_fsb, > *current_ext, gotp, adj_irecp, > - cur, logflags); > + cur, logflags, rlist); > } > } else { > startoff = got.br_startoff + offset_shift_fsb; > @@ -5637,6 +5786,10 @@ update_current_ext: > (*current_ext)--; > xfs_bmbt_set_startoff(gotp, startoff); > *logflags |= XFS_ILOG_CORE; > + error = xfs_rmap_slide(mp, rlist, ip->i_ino, whichfork, > + &got, startoff - got.br_startoff); > + if (error) > + return error; > if (!cur) { > *logflags |= XFS_ILOG_DEXT; > return 0; > @@ -5776,9 +5929,11 @@ xfs_bmap_shift_extents( > } > > while (nexts++ < num_exts) { > + xfs_bmbt_get_all(gotp, &got); > + > error = xfs_bmse_shift_one(ip, whichfork, offset_shift_fsb, > ¤t_ext, gotp, cur, &logflags, > - direction); > + direction, &flist->xbf_rlist); > if (error) > goto del_cursor; > /* > @@ -5831,6 +5986,7 @@ xfs_bmap_split_extent_at( > int whichfork = XFS_DATA_FORK; > struct xfs_btree_cur *cur = NULL; > struct xfs_bmbt_rec_host *gotp; > + struct xfs_bmbt_irec rgot; > struct xfs_bmbt_irec got; > struct xfs_bmbt_irec new; /* split extent */ > struct xfs_mount *mp = ip->i_mount; > @@ -5840,6 +5996,7 @@ xfs_bmap_split_extent_at( > int error = 0; > int logflags = 0; > int i = 0; > + long adj; > > if (unlikely(XFS_TEST_ERROR( > (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && > @@ -5879,6 +6036,7 @@ xfs_bmap_split_extent_at( > if (got.br_startoff >= split_fsb) > return 0; > > + rgot = got; > gotblkcnt = split_fsb - got.br_startoff; > new.br_startoff = split_fsb; > new.br_startblock = got.br_startblock + gotblkcnt; > @@ -5934,6 +6092,17 @@ xfs_bmap_split_extent_at( > XFS_WANT_CORRUPTED_GOTO(mp, i == 1, del_cursor); > } > > + /* update rmapbt */ > + adj = -(long)rgot.br_blockcount + gotblkcnt; > + error = xfs_rmap_resize(mp, &free_list->xbf_rlist, ip->i_ino, > + whichfork, &rgot, adj); > + if (error) > + goto del_cursor; > + error = xfs_rmap_insert(mp, &free_list->xbf_rlist, ip->i_ino, > + whichfork, &new); > + if (error) > + goto del_cursor; > + > /* > * Convert to a btree if necessary. > */ > diff --git a/fs/xfs/libxfs/xfs_bmap.h b/fs/xfs/libxfs/xfs_bmap.h > index 06dbe08..38cd9b5 100644 > --- a/fs/xfs/libxfs/xfs_bmap.h > +++ b/fs/xfs/libxfs/xfs_bmap.h > @@ -56,6 +56,7 @@ struct xfs_bmalloca { > bool conv; /* overwriting unwritten extents */ > char userdata;/* userdata mask */ > int flags; > + struct xfs_rmap_list *rlist; > }; > > /* > @@ -70,6 +71,11 @@ typedef struct xfs_bmap_free_item > struct xfs_bmap_free_item *xbfi_next; /* link to next entry */ > } xfs_bmap_free_item_t; > > +struct xfs_rmap_list { > + struct list_head rl_list; > + int rl_count; > +}; > + > /* > * Header for free extent list. > * > @@ -89,6 +95,7 @@ typedef struct xfs_bmap_free > xfs_bmap_free_item_t *xbf_first; /* list of to-be-free extents */ > int xbf_count; /* count of items on list */ > int xbf_low; /* alloc in low mode */ > + struct xfs_rmap_list xbf_rlist; /* rmap intent list */ > } xfs_bmap_free_t; > > #define XFS_BMAP_MAX_NMAP 4 > @@ -142,8 +149,13 @@ static inline int xfs_bmapi_aflag(int w) > > static inline void xfs_bmap_init(xfs_bmap_free_t *flp, xfs_fsblock_t *fbp) > { > - ((flp)->xbf_first = NULL, (flp)->xbf_count = 0, \ > - (flp)->xbf_low = 0, *(fbp) = NULLFSBLOCK); > + flp->xbf_first = NULL; > + flp->xbf_count = 0; > + flp->xbf_low = 0; > + *fbp = NULLFSBLOCK; > + > + INIT_LIST_HEAD(&flp->xbf_rlist.rl_list); > + flp->xbf_rlist.rl_count = 0; > } > > /* > diff --git a/fs/xfs/libxfs/xfs_rmap.c b/fs/xfs/libxfs/xfs_rmap.c > index 479cb73..a7130c5 100644 > --- a/fs/xfs/libxfs/xfs_rmap.c > +++ b/fs/xfs/libxfs/xfs_rmap.c > @@ -35,6 +35,7 @@ > #include "xfs_trace.h" > #include "xfs_error.h" > #include "xfs_extent_busy.h" > +#include "xfs_bmap.h" > > /* > * Lookup the first record less than or equal to [bno, len, owner, offset] > @@ -542,3 +543,230 @@ out_error: > xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); > return error; > } > + > + > +/* > + * Free up any items left in the list. > + */ > +void > +xfs_rmap_cancel( > + struct xfs_rmap_list *rlist) /* list of bmap_free_items */ > +{ > + if (list_empty(&rlist->rl_list)) > + return; > + while (!list_empty(&rlist->rl_list)) { > + struct xfs_rmap_intent *free; > + > + free = list_first_entry(&rlist->rl_list, struct xfs_rmap_intent, > + ri_list); > + list_del(&free->ri_list); > + kmem_free(free); > + } > + rlist->rl_count = 0; > +} > + > +/* > + * Free up any items left in the intent list. > + */ > +int > +xfs_rmap_finish( > + struct xfs_mount *mp, > + struct xfs_trans **tpp, > + struct xfs_inode *ip, > + struct xfs_rmap_list *rlist) > +{ > + /* Not yet implemented, just cancel until implemented */ > + xfs_rmap_cancel(rlist); > + return 0; > +} > + > +/* > + * Record a rmap intent; the list is kept sorted first by AG and then by > + * increasing age. > + */ > +static int > +__xfs_rmap_add( > + struct xfs_mount *mp, > + struct xfs_rmap_list *rlist, > + struct xfs_rmap_intent *ri) > +{ > + struct xfs_rmap_intent *new; > + > + if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) > + return 0; > + > + new = kmem_zalloc(sizeof(struct xfs_rmap_intent), KM_SLEEP | KM_NOFS); > + *new = *ri; > + INIT_LIST_HEAD(&new->ri_list); > + > + /* XXX: ordering will be needed */ > + list_add(&new->ri_list, &rlist->rl_list); > + rlist->rl_count++; > + return 0; > +} > + > +/* Combine two adjacent rmap extents */ > +int > +xfs_rmap_combine( > + struct xfs_mount *mp, > + struct xfs_rmap_list *rlist, > + xfs_ino_t ino, > + int whichfork, > + struct xfs_bmbt_irec *left, > + struct xfs_bmbt_irec *right, > + struct xfs_bmbt_irec *prev) > +{ > + struct xfs_rmap_intent ri; > + > + ri.ri_type = XFS_RMAP_COMBINE; > + ri.ri_ino = ino; > + ri.ri_whichfork = whichfork; > + ri.ri_prev = *prev; > + ri.ri_u.a.left = *left; > + ri.ri_u.a.right = *right; > + > + return __xfs_rmap_add(mp, rlist, &ri); > +} > + > +/* Extend a left rmap extent */ > +int > +xfs_rmap_lcombine( > + struct xfs_mount *mp, > + struct xfs_rmap_list *rlist, > + xfs_ino_t ino, > + int whichfork, > + struct xfs_bmbt_irec *LEFT, > + struct xfs_bmbt_irec *PREV) > +{ > + struct xfs_rmap_intent ri; > + > + ri.ri_type = XFS_RMAP_LCOMBINE; > + ri.ri_ino = ino; > + ri.ri_whichfork = whichfork; > + ri.ri_prev = *PREV; > + ri.ri_u.a.left = *LEFT; > + > + return __xfs_rmap_add(mp, rlist, &ri); > +} > + > +/* Extend a right rmap extent */ > +int > +xfs_rmap_rcombine( > + struct xfs_mount *mp, > + struct xfs_rmap_list *rlist, > + xfs_ino_t ino, > + int whichfork, > + struct xfs_bmbt_irec *RIGHT, > + struct xfs_bmbt_irec *PREV) > +{ > + struct xfs_rmap_intent ri; > + > + ri.ri_type = XFS_RMAP_RCOMBINE; > + ri.ri_ino = ino; > + ri.ri_whichfork = whichfork; > + ri.ri_prev = *PREV; > + ri.ri_u.a.right = *RIGHT; > + > + return __xfs_rmap_add(mp, rlist, &ri); > +} > + > +/* Insert a rmap extent */ > +int > +xfs_rmap_insert( > + struct xfs_mount *mp, > + struct xfs_rmap_list *rlist, > + xfs_ino_t ino, > + int whichfork, > + struct xfs_bmbt_irec *new) > +{ > + struct xfs_rmap_intent ri; > + > + ri.ri_type = XFS_RMAP_INSERT; > + ri.ri_ino = ino; > + ri.ri_whichfork = whichfork; > + ri.ri_prev = *new; > + > + return __xfs_rmap_add(mp, rlist, &ri); > +} > + > +/* Delete a rmap extent */ > +int > +xfs_rmap_delete( > + struct xfs_mount *mp, > + struct xfs_rmap_list *rlist, > + xfs_ino_t ino, > + int whichfork, > + struct xfs_bmbt_irec *new) > +{ > + struct xfs_rmap_intent ri; > + > + ri.ri_type = XFS_RMAP_DELETE; > + ri.ri_ino = ino; > + ri.ri_whichfork = whichfork; > + ri.ri_prev = *new; > + > + return __xfs_rmap_add(mp, rlist, &ri); > +} > + > +/* Change the start of an rmap */ > +int > +xfs_rmap_move( > + struct xfs_mount *mp, > + struct xfs_rmap_list *rlist, > + xfs_ino_t ino, > + int whichfork, > + struct xfs_bmbt_irec *PREV, > + long start_adj) > +{ > + struct xfs_rmap_intent ri; > + > + ri.ri_type = XFS_RMAP_MOVE; > + ri.ri_ino = ino; > + ri.ri_whichfork = whichfork; > + ri.ri_prev = *PREV; > + ri.ri_u.b.adj = start_adj; > + > + return __xfs_rmap_add(mp, rlist, &ri); > +} > + > +/* Change the logical offset of an rmap */ > +int > +xfs_rmap_slide( > + struct xfs_mount *mp, > + struct xfs_rmap_list *rlist, > + xfs_ino_t ino, > + int whichfork, > + struct xfs_bmbt_irec *PREV, > + long start_adj) > +{ > + struct xfs_rmap_intent ri; > + > + ri.ri_type = XFS_RMAP_SLIDE; > + ri.ri_ino = ino; > + ri.ri_whichfork = whichfork; > + ri.ri_prev = *PREV; > + ri.ri_u.b.adj = start_adj; > + > + return __xfs_rmap_add(mp, rlist, &ri); > +} > + > +/* Change the size of an rmap */ > +int > +xfs_rmap_resize( > + struct xfs_mount *mp, > + struct xfs_rmap_list *rlist, > + xfs_ino_t ino, > + int whichfork, > + struct xfs_bmbt_irec *PREV, > + long size_adj) > +{ > + struct xfs_rmap_intent ri; > + > + ri.ri_type = XFS_RMAP_RESIZE; > + ri.ri_ino = ino; > + ri.ri_whichfork = whichfork; > + ri.ri_prev = *PREV; > + ri.ri_u.b.adj = size_adj; > + > + return __xfs_rmap_add(mp, rlist, &ri); > +} > diff --git a/fs/xfs/libxfs/xfs_rmap_btree.h b/fs/xfs/libxfs/xfs_rmap_btree.h > index d7c9722..599fa3a 100644 > --- a/fs/xfs/libxfs/xfs_rmap_btree.h > +++ b/fs/xfs/libxfs/xfs_rmap_btree.h > @@ -21,6 +21,7 @@ > struct xfs_buf; > struct xfs_btree_cur; > struct xfs_mount; > +struct xfs_rmap_list; > > /* rmaps only exist on crc enabled filesystems */ > #define XFS_RMAP_BLOCK_LEN XFS_BTREE_SBLOCK_CRC_LEN > @@ -68,4 +69,60 @@ int xfs_rmap_free(struct xfs_trans *tp, struct xfs_buf *agbp, > xfs_agnumber_t agno, xfs_agblock_t bno, xfs_extlen_t len, > struct xfs_owner_info *oinfo); > > +/* functions for updating the rmapbt based on bmbt map/unmap operations */ > +int xfs_rmap_combine(struct xfs_mount *mp, struct xfs_rmap_list *rlist, > + xfs_ino_t ino, int whichfork, struct xfs_bmbt_irec *LEFT, > + struct xfs_bmbt_irec *RIGHT, struct xfs_bmbt_irec *PREV); > +int xfs_rmap_lcombine(struct xfs_mount *mp, struct xfs_rmap_list *rlist, > + xfs_ino_t ino, int whichfork, struct xfs_bmbt_irec *LEFT, > + struct xfs_bmbt_irec *PREV); > +int xfs_rmap_rcombine(struct xfs_mount *mp, struct xfs_rmap_list *rlist, > + xfs_ino_t ino, int whichfork, struct xfs_bmbt_irec *RIGHT, > + struct xfs_bmbt_irec *PREV); > +int xfs_rmap_insert(struct xfs_mount *mp, struct xfs_rmap_list *rlist, > + xfs_ino_t ino, int whichfork, struct xfs_bmbt_irec *rec); > +int xfs_rmap_delete(struct xfs_mount *mp, struct xfs_rmap_list *rlist, > + xfs_ino_t ino, int whichfork, struct xfs_bmbt_irec *rec); > +int xfs_rmap_move(struct xfs_mount *mp, struct xfs_rmap_list *rlist, > + xfs_ino_t ino, int whichfork, struct xfs_bmbt_irec *PREV, > + long start_adj); > +int xfs_rmap_slide(struct xfs_mount *mp, struct xfs_rmap_list *rlist, > + xfs_ino_t ino, int whichfork, struct xfs_bmbt_irec *PREV, > + long start_adj); > +int xfs_rmap_resize(struct xfs_mount *mp, struct xfs_rmap_list *rlist, > + xfs_ino_t ino, int whichfork, struct xfs_bmbt_irec *PREV, > + long size_adj); > + > +enum xfs_rmap_intent_type { > + XFS_RMAP_COMBINE, > + XFS_RMAP_LCOMBINE, > + XFS_RMAP_RCOMBINE, > + XFS_RMAP_INSERT, > + XFS_RMAP_DELETE, > + XFS_RMAP_MOVE, > + XFS_RMAP_SLIDE, > + XFS_RMAP_RESIZE, > +}; > + > +struct xfs_rmap_intent { > + struct list_head ri_list; > + enum xfs_rmap_intent_type ri_type; > + xfs_ino_t ri_ino; > + int ri_whichfork; > + struct xfs_bmbt_irec ri_prev; > + union { > + struct { > + struct xfs_bmbt_irec left; > + struct xfs_bmbt_irec right; > + } a; > + struct { > + long adj; > + } b; > + } ri_u; > +}; > + > +void xfs_rmap_cancel(struct xfs_rmap_list *rlist); > +int xfs_rmap_finish(struct xfs_mount *mp, struct xfs_trans **tpp, > + struct xfs_inode *ip, struct xfs_rmap_list *rlist); > + > #endif /* __XFS_RMAP_BTREE_H__ */ > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > index 834639d..a9cf94e 100644 > --- a/fs/xfs/xfs_bmap_util.c > +++ b/fs/xfs/xfs_bmap_util.c > @@ -40,6 +40,7 @@ > #include "xfs_trace.h" > #include "xfs_icache.h" > #include "xfs_log.h" > +#include "xfs_rmap_btree.h" > > /* Kernel only BMAP related definitions and functions */ > > @@ -109,6 +110,11 @@ xfs_bmap_finish( > struct xfs_bmap_free_item *next; /* next item on free list */ > > ASSERT((*tp)->t_flags & XFS_TRANS_PERM_LOG_RES); > + > + error = xfs_rmap_finish((*tp)->t_mountp, tp, ip, &flist->xbf_rlist); > + if (error) > + return error; > + > if (flist->xbf_count == 0) > return 0; > > -- > 2.7.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Mon Apr 11 18:32:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0D3907CA0 for ; Mon, 11 Apr 2016 18:32:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id ACF2B8F8037 for ; Mon, 11 Apr 2016 16:32:00 -0700 (PDT) X-ASG-Debug-ID: 1460417517-04bdf011033f2110001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id Frrf5bb9CUSrJABk for ; Mon, 11 Apr 2016 16:31:58 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DHDADWMgxXPKAZLHldgzdTfaZVBowRg0+CGYQPIYVmAgIBAQKBL00BAQEBAQEHAQEBAUJAhEIBAQQnExwjEAgDDgoJJQ8FJQMHGhOIJg+/dQEBAQEBAQQBAQEBHBmFQIUTgl6FDIIrBZgEhXeIC48XRY5hgmYZgVwqMAGKBAEBAQ Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail06.adl6.internode.on.net with ESMTP; 12 Apr 2016 09:01:57 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aplJE-0000Oc-K6; Tue, 12 Apr 2016 09:31:56 +1000 Date: Tue, 12 Apr 2016 09:31:56 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/6 v2] xfs: xfs_iflush_cluster vs xfs_reclaim_inode Message-ID: <20160411233156.GE9088@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/6 v2] xfs: xfs_iflush_cluster vs xfs_reclaim_inode References: <1460072271-23923-1-git-send-email-david@fromorbit.com> <20160408171843.GC30614@bfoster.bfoster> <20160408221706.GB567@dastard> <20160411133716.GA47566@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160411133716.GA47566@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1460417517 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28651 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Apr 11, 2016 at 09:37:18AM -0400, Brian Foster wrote: > On Sat, Apr 09, 2016 at 08:17:06AM +1000, Dave Chinner wrote: > > On Fri, Apr 08, 2016 at 01:18:44PM -0400, Brian Foster wrote: > > > On Fri, Apr 08, 2016 at 09:37:45AM +1000, Dave Chinner wrote: > > > > Hi folks, > > > > > > > > This is the second version of this patch set, first posted and > > > > described here: > > > > > > > > http://oss.sgi.com/archives/xfs/2016-04/msg00069.html > > > > > > > > The only change from the first version is splitting up the first > > > > patch into two as Christoph requested - one for the bug fix, the > > > > other for the variable renaming. > > > > > > > > > > Did your xfstests testing for this series include generic/233? I'm > > > seeing a consistently reproducible test hang. The test is hanging on a > > > "xfs_quota -x -c off -ug /mnt/scratch" command. The stack is as follows: > > > > > > [] xfs_qm_dquot_walk.isra.8+0x196/0x1b0 [xfs] > > > [] xfs_qm_dqpurge_all+0x78/0x80 [xfs] > > > [] xfs_qm_scall_quotaoff+0x148/0x640 [xfs] > > > [] xfs_quota_disable+0x3d/0x50 [xfs] > > > [] SyS_quotactl+0x3b3/0x8c0 > > > [] do_syscall_64+0x67/0x190 > > > [] return_from_SYSCALL_64+0x0/0x7a > > > [] 0xffffffffffffffff .... > > IOWs, this looks like xfs_qm_dquot_walk() is skipping dquots because > > xfs_qm_dqpurge is hitting this: > > > > xfs_dqlock(dqp); > > if ((dqp->dq_flags & XFS_DQ_FREEING) || dqp->q_nrefs != 0) { > > xfs_dqunlock(dqp); > > return -EAGAIN; > > } > > > > So that means we've got an inode that probably hasn't been > > reclaimed, because the last thing that happens during reclaim is the > > dquots are detatched from the inode and hence the reference counts > > are dropped. > > > > > FWIW, this only occurs with patch 6 applied. The test and scratch > > > devices are both 10GB lvm volumes formatted with mkfs defaults (v5). > > > > I can't see how patch 6 would prevent an inode from being reclaimed, > > as all the changes occur *after* the reclaim decision has been made. > > More investigation needed, I guess... > > > > The attached diff addresses the problem for me. Feel free to fold it > into the original patch. .... > diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c > index a60db43..749689c 100644 > --- a/fs/xfs/xfs_icache.c > +++ b/fs/xfs/xfs_icache.c > @@ -818,14 +818,15 @@ xfs_inode_set_reclaim_tag( > STATIC void > __xfs_inode_clear_reclaim( > xfs_perag_t *pag, > - xfs_inode_t *ip) > + xfs_inode_t *ip, > + xfs_ino_t ino) > { > pag->pag_ici_reclaimable--; > if (!pag->pag_ici_reclaimable) { > /* clear the reclaim tag from the perag radix tree */ > spin_lock(&ip->i_mount->m_perag_lock); > radix_tree_tag_clear(&ip->i_mount->m_perag_tree, > - XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), > + XFS_INO_TO_AGNO(ip->i_mount, ino), > XFS_ICI_RECLAIM_TAG); > spin_unlock(&ip->i_mount->m_perag_lock); > trace_xfs_perag_clear_reclaim(ip->i_mount, pag->pag_agno, Yeah, that'll do it. Though I think the fix should be something different - why do we need ip->i_ino to find the agno or the xfs_mount when we've already got pag->pag_agno and pag->pag_mount? I'll clean up all these per-ag tag functions to only take xfs_perag and an xfs_ino_t where needed and repost once i've tested it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Mon Apr 11 20:16:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B47F37CA0 for ; Mon, 11 Apr 2016 20:16:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 64048304059 for ; Mon, 11 Apr 2016 18:16:33 -0700 (PDT) X-ASG-Debug-ID: 1460423790-04bdf011033f4730001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id efxK50ijjAUMfb5x (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 11 Apr 2016 18:16:30 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u3C1GSIq022411 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 12 Apr 2016 01:16:28 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u3C1GSoP022824 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 12 Apr 2016 01:16:28 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u3C1GROb007729; Tue, 12 Apr 2016 01:16:28 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 11 Apr 2016 18:16:27 -0700 Date: Mon, 11 Apr 2016 18:16:26 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: xfs Subject: Re: [PATCH] xfs: bmap btree changes should update rmap btree Message-ID: <20160412011626.GA11156@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: bmap btree changes should update rmap btree References: <1459201425-31773-1-git-send-email-david@fromorbit.com> <20160411233407.GA7967@birch.djwong.org> <20160412000901.GI567@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160412000901.GI567@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1460423790 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28653 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 [should have kicked this onto the lists...] (This is a thread that started from a reposting of one of the rmap patches ("xfs: bmap btree changes should update rmap btree"), with the change that xfs_rmap_intent should use list_head instead of an open-coded list.) On Tue, Apr 12, 2016 at 10:09:01AM +1000, Dave Chinner wrote: > On Mon, Apr 11, 2016 at 04:34:07PM -0700, Darrick J. Wong wrote: > > On Tue, Mar 29, 2016 at 08:43:45AM +1100, Dave Chinner wrote: > > > From: "Darrick J. Wong" > > > > > > Any update to a file's bmap should make the corresponding change to > > > the rmapbt. On a reflink filesystem, this is absolutely required > > > because a given (file data) physical block can have multiple owners > > > and the only sane way to find an rmap given a bmap is if there is a > > > 1:1 correspondence. > > > > > > (At some point we can optimize this for non-reflink filesystems > > > because regular merge still works there.) > > > > > > Signed-off-by: Darrick J. Wong > > > --- > > > fs/xfs/libxfs/xfs_alloc.c | 73 +++++--- > > > fs/xfs/libxfs/xfs_alloc.h | 3 + > > > fs/xfs/libxfs/xfs_rmap.c | 467 +++++++++++++++++++++++++++++++++++++++++++++- > > > 3 files changed, 512 insertions(+), 31 deletions(-) > > > > > > diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c > > > index 585ebfa..1d82e65 100644 > > > --- a/fs/xfs/libxfs/xfs_alloc.c > > > +++ b/fs/xfs/libxfs/xfs_alloc.c > > > @@ -2766,35 +2766,30 @@ error0: > > > return error; > > > } > > > > > > -/* > > > - * Free an extent. > > > - * Just break up the extent address and hand off to xfs_free_ag_extent > > > - * after fixing up the freelist. > > > - */ > > > -int /* error */ > > > -xfs_free_extent( > > > - xfs_trans_t *tp, /* transaction pointer */ > > > - xfs_fsblock_t bno, /* starting block number of extent */ > > > - xfs_extlen_t len, /* length of extent */ > > > - struct xfs_owner_info *oinfo) /* extent owner */ > > > +int > > > +xfs_free_extent_fix_freelist( > > > + struct xfs_trans *tp, > > > + xfs_agnumber_t agno, > > > + xfs_agblock_t agbno, > > > + xfs_extlen_t len, > > > + struct xfs_buf **agbp) > > > > Does xfs_alloc_fix_freelist() need to have args.agbno set? AFAICT it doesn't, > > and the function works fine if we leave out agbno/len args and keep the > > range checks in xfs_free_extent. > > It doesn't right now, but it could conceivably be used as a target > block for allocation that adds blocks to the free list. There are > also other functions that the args are passed through to, so I'd > prefer to have the agbno set than have code that assumes it is valid > do something unexpected.... > > > OTOH maybe we want the checks to happen before we touch anything? > > That too. > > > > - /* Not yet implemented, just cancel until implemented */ > > > + struct xfs_rmap_intent *free = NULL; > > > + struct xfs_btree_cur *rcur = NULL; > > > + struct xfs_buf *agbp = NULL; > > > + int error = 0; > > > + xfs_agnumber_t agno; > > > + > > > + if (rlist->rl_count == 0) > > > + return 0; > > > + > > > + /* sort the list into ascending AG order */ > > > + list_sort(mp, &rlist->rl_list, xfs_rmap_free_list_cmp); > > > + > > > + while (list_empty(&rlist->rl_list)) { > ..... > > > @@ -599,7 +1059,6 @@ __xfs_rmap_add( > > > *new = *ri; > > > INIT_LIST_HEAD(&new->ri_list); > > > > > > - /* XXX: ordering will be needed */ > > > list_add(&new->ri_list, &rlist->rl_list); > > > > This needs to be list_add_tail so that the rmap operations happen in order. > > Ah, no, it doesn't. The list_sort() before we process it destroys > any order we create here. I think list_sort() is supposed to maintain list order if the compare fn returns zero. From lib/list_sort.c: /* * The comparison function @cmp must return a negative value if @a * should sort before @b, and a positive value if @a should sort after * @b. If @a and @b are equivalent, and their original relative * ordering is to be preserved, @cmp must return 0. */ >From my (admittedly flimsy) testing of list_sort() it looks like it does preserve the order of rmap_intents that have the same agno. I looked at the source code and I think that assertion should hold. I could be wrong about that, however... > > If > > we do a collapse range of 2 blocks at offset 32, say, then we end up with > > unmap($pblk, $ino, 32, 16) and map($pblk-2, $ino, 30, 16) in the deferred list. > > We don't want the map to happen before the unmap because that results in two > > rmaps covering the same range of logical offset, which causes problems in > > generic/145. I forgot to mention this, but the ordering requirement only applies within a single rmapbt -- if the map/unmap operations apply to different AGs, no confusion will result from out-of-order execution. > Then we have a problem here, because now you have two dimensions of > ordering - by agno and by operational order. There were no comments > about this list requiring operational ordering, so I didn't take > that into account when changing the way this worked. To be fair, the ordering requirement didn't exist until I got rid of the 'rmap mirrors bmbt' thing a couple of days ago. I hadn't planned out how this thing would work until after the last patch posting, so it's no wonder that neither of us were aware. :) > I'd suggest that the list_sort compare function could take this into > account, and order overlapping operations appropriately (e.g. unmap > before map). You could even put a sequence number in the rmap list > entry so that when sorting we know what order they were added to the > rmap list and then overlaps could be resolved in the sort function > easily... I /think/ we're fine with just the list_add_tail... ...if not, /me wonders if we could skip the list_sort and just roll the transaction every time we have to go from a higher AG to a lower AG. I think the rmap update intent log items will help us to redo the metadata operations if we crash. Doesn't /seem/ to be causing any extra problems with the test suite. Anyway I'll keep squinting at list_sort. --D > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From david@fromorbit.com Mon Apr 11 21:50:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DDB237CA2 for ; Mon, 11 Apr 2016 21:50:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A1931304066 for ; Mon, 11 Apr 2016 19:50:20 -0700 (PDT) X-ASG-Debug-ID: 1460429414-04cb6c24643f5fd0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id jEgZFKXYK9VKNJ2K for ; Mon, 11 Apr 2016 19:50:14 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AsDQC3YQxXNaAZLHldgzeBUIJyg3mfZAEBAQEBAQaMEYVohA+GBwICAQECgS5NAQEBAQEBBwEBAQFBAUCEQQEBAQMBOhwjEAgDGAkMGQ8FJQMHGhOIHwfAHQEBAQEGAgEdGYVAhROEfoJsgisFmAeIaoUZgXGNKYYgiQeCZhmBXCowigUBAQE Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail06.adl6.internode.on.net with ESMTP; 12 Apr 2016 12:11:36 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1apoGl-0000h7-2S; Tue, 12 Apr 2016 12:41:35 +1000 Date: Tue, 12 Apr 2016 12:41:35 +1000 From: Dave Chinner To: "Darrick J. Wong" Cc: xfs Subject: Re: [PATCH] xfs: bmap btree changes should update rmap btree Message-ID: <20160412024135.GF9088@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: bmap btree changes should update rmap btree References: <1459201425-31773-1-git-send-email-david@fromorbit.com> <20160411233407.GA7967@birch.djwong.org> <20160412000901.GI567@dastard> <20160412011626.GA11156@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160412011626.GA11156@birch.djwong.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: 1460429414 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28655 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Apr 11, 2016 at 06:16:26PM -0700, Darrick J. Wong wrote: > [should have kicked this onto the lists...] > > > This needs to be list_add_tail so that the rmap operations happen in order. > > > > Ah, no, it doesn't. The list_sort() before we process it destroys > > any order we create here. > > I think list_sort() is supposed to maintain list order if the compare fn > returns zero. From lib/list_sort.c: > > /* > > * The comparison function @cmp must return a negative value if @a > * should sort before @b, and a positive value if @a should sort after > * @b. If @a and @b are equivalent, and their original relative > * ordering is to be preserved, @cmp must return 0. > */ > > From my (admittedly flimsy) testing of list_sort() it looks like it does > preserve the order of rmap_intents that have the same agno. I looked at > the source code and I think that assertion should hold. If what I did is maintaining order, then it's simply by chance, not intent. :/ > > > we do a collapse range of 2 blocks at offset 32, say, then we end up with > > > unmap($pblk, $ino, 32, 16) and map($pblk-2, $ino, 30, 16) in the deferred list. > > > We don't want the map to happen before the unmap because that results in two > > > rmaps covering the same range of logical offset, which causes problems in > > > generic/145. > > I forgot to mention this, but the ordering requirement only applies within a > single rmapbt -- if the map/unmap operations apply to different AGs, no > confusion will result from out-of-order execution. *nod* > > I'd suggest that the list_sort compare function could take this into > > account, and order overlapping operations appropriately (e.g. unmap > > before map). You could even put a sequence number in the rmap list > > entry so that when sorting we know what order they were added to the > > rmap list and then overlaps could be resolved in the sort function > > easily... > > I /think/ we're fine with just the list_add_tail... Yeah, it seems that way, but it'll need "here be dragons" comment around it... > ...if not, /me wonders if we could skip the list_sort and just roll the > transaction every time we have to go from a higher AG to a lower AG. I think > the rmap update intent log items will help us to redo the metadata operations > if we crash. I think that would work, but we want to keep the number of transactions to a minimum. Trying to keep everything grouped by AG definitely helps wiht that. What would be nice to know is how many operations we are expecting to see here will actually have extents from multiple AGs in them, and hence how many transactions are the likely common case... Cheers, Dave. -- Dave Chinner david@fromorbit.com From shyam@zadarastorage.com Tue Apr 12 00:20:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A3D717CA4 for ; Tue, 12 Apr 2016 00:20:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0C1F2AC004 for ; Mon, 11 Apr 2016 22:20:22 -0700 (PDT) X-ASG-Debug-ID: 1460438406-04bdf011033fa2a0001-NocioJ Received: from mail-wm0-f44.google.com (mail-wm0-f44.google.com [74.125.82.44]) by cuda.sgi.com with ESMTP id IQoCvCjGImTZk1jV (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 11 Apr 2016 22:20:08 -0700 (PDT) X-Barracuda-Envelope-From: shyam@zadarastorage.com X-Barracuda-Apparent-Source-IP: 74.125.82.44 Received: by mail-wm0-f44.google.com with SMTP id f198so171629633wme.0 for ; Mon, 11 Apr 2016 22:20:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=from:references:in-reply-to:mime-version:thread-index:date :message-id:subject:to; bh=g+0o6dglPFDirpTk7qhc75a/ZR+iKdqpl1rUpHKTdsg=; b=duf0ZM0Fkg/FiYw442EpAxNwmkYVPCd7HXrKKOEp3O3E6ewKO0mJPxXdWufSsJ2G2D puCa6l3kPyj6t746TuxVkcBp3sXn4RXOt7A9bO15DYvCUgcaFmWoJ1jchPGeAt3/uevw ZMWo4fVPnSwZ4qqmEOzn3O/a7r2tCqkWqh6oot9mHz1GT+vYiZb63kI1XISoDbjx0jX1 0Sk8MTuj2dhlXUFn/lP77jEqvXC49irrNvaF03EpxBupFsdGhjehRcxG+GFnWEvrsK6p PoyHsuiFiEqShUp8hmRNtN6wFlja+GacMzcawAuy6W5FCmhbuR2BIEb6J+vRlLZWTwyW D9jw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:references:in-reply-to:mime-version :thread-index:date:message-id:subject:to; bh=g+0o6dglPFDirpTk7qhc75a/ZR+iKdqpl1rUpHKTdsg=; b=jizSWZsp7EYju5fPcFdqyFJx8BdkYDE7lybdWV+R+XaqaxwZ9NS7svrUqodqexMT+/ Q/fFKocsB+a/nEiCPjEttmtcML7YBGRMMnyL8bVw5Rm6NcwpR591TIJOFhys4vC4nGym oz7TozxFg787dFjff+nRMmJv2N4PnZAbdmu16YOnSQd30ZNR+d0r2Hqf67Ta5NBQ98t0 9v2E3LiA0lE8pcifsOJwOy3T5yqku2ftePRNUwCTnDXhmimE29dTsrj5BClkPpj3ybo+ /CT+Jwhwi1ujEBiWq2TMwKX9SDKt68MyzNuadrJyyOwZ59Eliz0YgJ7R48qAbtlSFcRP V7aw== X-Gm-Message-State: AOPr4FXHgtSsQPI5xXDCdhbglxciKegBj4G65P2JUxvojuTpjXz7iPKGgaMIO1wTbNpnvGxrtVCrjGDqMjPNTw== X-Received: by 10.28.30.86 with SMTP id e83mr1638958wme.18.1460438406485; Mon, 11 Apr 2016 22:20:06 -0700 (PDT) From: Shyam Kaushik References: <20160322121922.GA53693@bfoster.bfoster> <232dd85fde11d4ef1625f070eabfd167@mail.gmail.com> <20160408224648.GD567@dastard> <20160411012127.GF567@dastard> 1aa4e955d78e6932260fdfc55c83bb8e@mail.gmail.com In-Reply-To: 1aa4e955d78e6932260fdfc55c83bb8e@mail.gmail.com MIME-Version: 1.0 X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AdGTkH/Z4umH15ffTqq0wVMyHRNp8AAcNprAAB46G/A= Date: Tue, 12 Apr 2016 10:50:06 +0530 Message-ID: <695a5148d01ba43e96cb89736da6c1ad@mail.gmail.com> Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery To: xfs@oss.sgi.com X-ASG-Orig-Subj: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wm0-f44.google.com[74.125.82.44] X-Barracuda-Start-Time: 1460438407 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28657 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi Carlos, xfs.stap that I have been using is here (https://www.dropbox.com/s/dluse4s3a1c7dj3/xfs.stap?dl=0). It has line-numbers matching xfs with printks I added. You will have to tweak it a bit. Thanks. --Shyam -----Original Message----- From: Carlos Maiolino Sent: Fri Apr 8 09:31:31 CDT 2016 > Hi Shyam, > > do you mind to share your systemtap script with us? > > I'd like to take a look on it, and probably Brian will be interested to. -----Original Message----- From: Dave Chinner [mailto:david@fromorbit.com] Sent: 11 April 2016 06:51 To: Alex Lyakas Cc: Shyam Kaushik; Brian Foster; xfs@oss.sgi.com Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery On Sun, Apr 10, 2016 at 09:40:29PM +0300, Alex Lyakas wrote: > Hello Dave, > > On Sat, Apr 9, 2016 at 1:46 AM, Dave Chinner wrote: > > On Fri, Apr 08, 2016 at 04:21:02PM +0530, Shyam Kaushik wrote: > >> Hi Dave, Brian, Carlos, > >> > >> While trying to reproduce this issue I have been running into different > >> issues that are similar. Underlying issue remains the same when backend to > >> XFS is failed & we unmount XFS, we run into hung-task timeout (180-secs) > >> with stack like > >> > >> kernel: [14952.671131] [] > >> xfs_ail_push_all_sync+0xa9/0xe0 [xfs] > >> kernel: [14952.671139] [] ? > >> prepare_to_wait_event+0x110/0x110 > >> kernel: [14952.671181] [] xfs_unmountfs+0x61/0x1a0 > >> [xfs] > >> > >> while running trace-events, XFS ail push keeps looping around > >> > >> xfsaild/dm-10-21143 [001] ...2 17878.555133: xfs_ilock_nowait: dev > >> 253:10 ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > > Looks like either a stale inode (which should never reach the AIL) > > or it's an inode that's been reclaimed and this is a use after free > > situation. Given that we are failing IOs here, I'd suggest it's more > > likely to be an IO failure that's caused a writeback problem, not an > > interaction with stale inodes. > > > > So, look at xfs_iflush. If an IO fails, it is supposed to unlock the > > inode by calling xfs_iflush_abort(), which will also remove it from > > the AIL. This can also happen on reclaim of a dirty inode, and if so > > we'll still reclaim the inode because reclaim assumes xfs_iflush() > > cleans up properly. > > > > Which, apparently, it doesn't: > > > > /* > > * Get the buffer containing the on-disk inode. > > */ > > error = xfs_imap_to_bp(mp, NULL, &ip->i_imap, &dip, &bp, XBF_TRYLOCK, 0); > > if (error || !bp) { > > xfs_ifunlock(ip); > > return error; > > } > > > > This looks like a bug - xfs_iflush hasn't aborted the inode > > writeback on failure - it's just unlocked the flush lock. Hence it > > has left the inode dirty in the AIL, and then the inode has probably > > then been reclaimed, setting the inode number to zero. > In our case, we do not reach this call, because XFS is already marked > as "shutdown", so in our case we do: > /* > * This may have been unpinned because the filesystem is shutting > * down forcibly. If that's the case we must not write this inode > * to disk, because the log record didn't make it to disk. > * > * We also have to remove the log item from the AIL in this case, > * as we wait for an empty AIL as part of the unmount process. > */ > if (XFS_FORCED_SHUTDOWN(mp)) { > error = -EIO; > goto abort_out; > } > > So we call xfs_iflush_abort, but due to "iip" being NULL (as Shyam > mentioned earlier in this thread), we proceed directly to > xfs_ifunlock(ip), which now becomes the same situation as you > described above. If you are getting this occuring, something else has already gone wrong as you can't have a dirty inode without a log item attached to it. So it appears to me that you are reporting a symptom of a problem after it has occured, not the root cause. Maybe it is the same root cause, maybe not. Either way, it doesn't help us solve any problem. > The comment clearly says "We also have to remove the log item from the > AIL in this case, as we wait for an empty AIL as part of the unmount > process." Could you perhaps point us at the code that is supposed to > remove the log item from the AIL? Apparently this is not happening. xfs_iflush_abort or xfs_iflush_done does that work. -Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Tue Apr 12 00:29:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 57F287CA7 for ; Tue, 12 Apr 2016 00:29:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A3B07AC001 for ; Mon, 11 Apr 2016 22:29:46 -0700 (PDT) X-ASG-Debug-ID: 1460438983-04cb6c24643fe760001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id xuUivuRTlFZcrD4s (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 11 Apr 2016 22:29:43 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u3C5TfQx006146 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 12 Apr 2016 05:29:41 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u3C5TeXX019846 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 12 Apr 2016 05:29:40 GMT Received: from abhmp0010.oracle.com (abhmp0010.oracle.com [141.146.116.16]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u3C5TdL6023361; Tue, 12 Apr 2016 05:29:39 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 11 Apr 2016 22:29:39 -0700 Date: Mon, 11 Apr 2016 22:29:38 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: xfs Subject: Re: [PATCH] xfs: bmap btree changes should update rmap btree Message-ID: <20160412052938.GB11156@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: bmap btree changes should update rmap btree References: <1459201425-31773-1-git-send-email-david@fromorbit.com> <20160411233407.GA7967@birch.djwong.org> <20160412000901.GI567@dastard> <20160412011626.GA11156@birch.djwong.org> <20160412024135.GF9088@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160412024135.GF9088@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1460438983 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28657 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Apr 12, 2016 at 12:41:35PM +1000, Dave Chinner wrote: > On Mon, Apr 11, 2016 at 06:16:26PM -0700, Darrick J. Wong wrote: > > [should have kicked this onto the lists...] > > > > This needs to be list_add_tail so that the rmap operations happen in order. > > > > > > Ah, no, it doesn't. The list_sort() before we process it destroys > > > any order we create here. > > > > I think list_sort() is supposed to maintain list order if the compare fn > > returns zero. From lib/list_sort.c: > > > > /* > > > > * The comparison function @cmp must return a negative value if @a > > * should sort before @b, and a positive value if @a should sort after > > * @b. If @a and @b are equivalent, and their original relative > > * ordering is to be preserved, @cmp must return 0. > > */ > > > > From my (admittedly flimsy) testing of list_sort() it looks like it does > > preserve the order of rmap_intents that have the same agno. I looked at > > the source code and I think that assertion should hold. > > If what I did is maintaining order, then it's simply by chance, not > intent. :/ :) I guess the scary part is what if list_sort ever fails to maintain order amongst the cmp() == 0 items, but I'll put in a generous HBD note before the list_add_tail and the list_sort. > > > > we do a collapse range of 2 blocks at offset 32, say, then we end up with > > > > unmap($pblk, $ino, 32, 16) and map($pblk-2, $ino, 30, 16) in the deferred list. > > > > We don't want the map to happen before the unmap because that results in two > > > > rmaps covering the same range of logical offset, which causes problems in > > > > generic/145. > > > > I forgot to mention this, but the ordering requirement only applies within a > > single rmapbt -- if the map/unmap operations apply to different AGs, no > > confusion will result from out-of-order execution. > > *nod* > > > > I'd suggest that the list_sort compare function could take this into > > > account, and order overlapping operations appropriately (e.g. unmap > > > before map). You could even put a sequence number in the rmap list > > > entry so that when sorting we know what order they were added to the > > > rmap list and then overlaps could be resolved in the sort function > > > easily... > > > > I /think/ we're fine with just the list_add_tail... > > Yeah, it seems that way, but it'll need "here be dragons" comment > around it... Will do. > > ...if not, /me wonders if we could skip the list_sort and just roll the > > transaction every time we have to go from a higher AG to a lower AG. I think > > the rmap update intent log items will help us to redo the metadata operations > > if we crash. > > I think that would work, but we want to keep the number of > transactions to a minimum. Trying to keep everything grouped by AG > definitely helps wiht that. What would be nice to know is how many > operations we are expecting to see here will actually have extents > from multiple AGs in them, and hence how many transactions are the > likely common case... Ok, I'll add some instrumentation so I can keep tabs on the number of intents per freelist and the number of AGs that get touched per freelist. My current guess is that we usually only have one or two rmaps to update per transaction. (I'm not even sure doing a xfs_trans_roll per AG is necessary; so far in my testing I've never come close to exceeding the log reservation for the rmap step. But that's before we start logging rmap intents. :)) Ok sleep now. --D > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From tireman@shaw.ca Tue Apr 12 00:53:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E5FEE7CAF for ; Tue, 12 Apr 2016 00:52:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3592BAC004 for ; Mon, 11 Apr 2016 22:52:59 -0700 (PDT) X-ASG-Debug-ID: 1460440375-04cb6c245f3fef30001-NocioJ Received: from smtp-out-no.shaw.ca (smtp-out-no.shaw.ca [64.59.134.9]) by cuda.sgi.com with ESMTP id lbSeCPUHb56YUPMT (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 11 Apr 2016 22:52:55 -0700 (PDT) X-Barracuda-Envelope-From: tireman@shaw.ca X-Barracuda-Apparent-Source-IP: 64.59.134.9 Received: from [192.168.0.2] ([174.5.126.242]) by shaw.ca with SMTP id prFta3xssxBbzprFuaiNuJ; Mon, 11 Apr 2016 23:52:55 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=shaw.ca; s=s20150330; t=1460440375; bh=Mm6UkHu03y0iYIZvZN+5WIC6DsJAk5rf5wq16SHcmcU=; h=Subject:To:References:Cc:From:Date:In-Reply-To; b=CdGQMD71WDzbYxf71YcKLt8JRtA3Mm5Y9il93oqT6STdUBdZ1uzitjlAZkPLwjHbj 1IBG8trSBWl0vUdEcV1I8eags+UfMDUQ6FqfepHnwkBDizq57SSjZeBhYQ0ZRRcFW8 fuhdInhzNP9kOP3ka2ktcgP3AG3T3d0nJZhLTpH44RcZvzKslwMDAqHWZAWV++71gc ccYKxBj1daF84rnB0kX38CEK9t3vhX4aNEZK+edjZNXelQXXLMF6oPFi+4tlJ6aTs7 i7ZvQSO7rgBClLUdevOAacR7PdzAclJEPkzRgJTkRwaAJUz2t+DNTz0wAKVyjPq4ul hpG+xZg4x+q6g== X-Authority-Analysis: v=2.2 cv=KYaQikQD c=1 sm=1 tr=0 a=YUpam8ogUlPMk4SS6ACeKg==:117 a=YUpam8ogUlPMk4SS6ACeKg==:17 a=N659UExz7-8A:10 a=eJfxgxciAAAA:8 a=vKnXrkE3XCv9SqbuiJMA:9 a=pVTWZcwbULKeNgH0:21 a=FNz-qHnOH3nry9xr:21 Subject: Re: xfs_repair fails after trying to format log cycle? To: Brian Foster X-ASG-Orig-Subj: Re: xfs_repair fails after trying to format log cycle? References: <56F6DE67.60403@shaw.ca> <20160328085541.GA27040@bfoster.bfoster> Cc: xfs@oss.sgi.com From: Andrew Ryder Message-ID: <570C8D4D.3060304@shaw.ca> Date: Tue, 12 Apr 2016 01:53:17 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <20160328085541.GA27040@bfoster.bfoster> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-CMAE-Envelope: MS4wfOE5xrXRN0mAMI7WyNfQYgRy0N987Iz0m44Gsd6oC9mT2jpADw8ZNN8FTjpFbBynXrUhzbfo56kWc/QjPoqJB6GvXAPL4O+bY6/F8gVfbDZlQGK0sz82 HDyIY9dnIDkTl/Fw46W5YR0TJIpgqi+jCBVzdKmx2DR4DdmzbyvMSRa1xND8MjF03U5wLDi4dvDetA== X-Barracuda-Connect: smtp-out-no.shaw.ca[64.59.134.9] X-Barracuda-Start-Time: 1460440375 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28658 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 03/28/2016 04:55 AM, Brian Foster wrote: > On Sat, Mar 26, 2016 at 03:09:27PM -0400, Andrew Ryder wrote: >> Hello, >> >> I have an mdadm array with a xfs v5 filesystem on it and its begun to give >> me issues when trying to mount it as well as complete xfs_repair. Not sure >> if anyone might be able to shed some light on what is going on or how to >> correct the issue? >> >> When I try and mount the fs, it complains with: >> >> [ 388.479847] XFS (md2): Mounting V5 Filesystem >> [ 388.494686] XFS (md2): metadata I/O error: block 0x15d6d39c0 >> ("xlog_bread_noalign") error 5 numblks 8192 >> [ 388.495013] XFS (md2): failed to find log head >> [ 388.495018] XFS (md2): log mount/recovery failed: error -5 >> [ 388.495090] XFS (md2): log mount failed >> > > So a read I/O error from the kernel... > >> >> This is where its not making any sense for me, If I try and run "xfs_repair >> /dev/md2" it fails with: >> >> Phase 1 - find and verify superblock... >> - reporting progress in intervals of 15 minutes >> Phase 2 - using internal log >> - zero log... >> xfs_repair: read failed: Input/output error >> failed to find log head >> zero_log: cannot find log head/tail (xlog_find_tail=-5) >> >> fatal error -- ERROR: The log head and/or tail cannot be discovered. Attempt >> to mount the >> filesystem to replay the log or use the -L option to destroy the log and >> attempt a repair. >> > > ... similar read error from xfsprogs... > >> >> But if I run "xfs_repair -L /dev/md2" which gives: >> >> Phase 1 - find and verify superblock... >> - reporting progress in intervals of 15 minutes >> Phase 2 - using internal log >> - zero log... >> xfs_repair: read failed: Input/output error >> failed to find log head >> zero_log: cannot find log head/tail (xlog_find_tail=-5) >> xfs_repair: libxfs_device_zero write failed: Input/output error >> > > ... and it looks like it fails to write as well when trying to zero the > log... > >> then try and re-run "xfs_repair /dev/md2" it starts traversing the >> filesystem all the way to "Phase 7" then errors with: >> >> Phase 7 - verify and correct link counts... >> - 14:36:55: verify and correct link counts - 33 of 33 allocation >> groups done >> Maximum metadata LSN (64:2230592) is ahead of log (0:0). >> Format log to cycle 67. >> xfs_repair: libxfs_device_zero write failed: Input/output error >> >> >> Yet at this point I can now mount the filesystem.. >> > > ... and this is effectively a repeat of the write error as we try to > format the log with a correct LSN based on the metadata LSN tracked by > the repair process. Your kernel is old enough that runtime probably > won't complain either way (note that 3.19 might be considered a fairly > early kernel for using CRC support). Perhaps the first write attempt > zeroed enough of the log before it failed that log recovery wasn't > required, and thus these problematic I/Os were avoided. > > What's the history of this fs? Has it been working for some time, just > recently formatted? What lead to the need for log recovery? What's the > mdadm --detail info, member device size, total array size, xfs_info of > the filesystem, etc..? > > Does xfs_repair run clean at this point? If so, does 'xfs_repair -L' > still reproduce the write error (note that I'm assuming you have a clean > log such that this command will not cause data loss). If so, an strace > of the repair process might be interesting... > > Brian The filesystem is about a year old as I had one of the Addonics backplane boards go bad and after the replacement all was good again.. until the RocketRaid 2722 card and its obscure "Task File error" error message came up again. Everything up to this point had been working smoothly since end of Sept 2015 after the rebuild. All disks are 2TB in size, partitioned via 'parted' with 0% and 100% used for partition boundaries on each drive. Everything had been working wonderfully long before but the array was taken out due to some issues I had with 3 hitachi drives that refused to work on the RR2722 card/drivers. Long story. I've swapped out two drives in the array and no luck yet as it doesn't seem to be hardware failure related.. I've not had any signs of data corruption, just meta-data corruption/errors. If I remember correct, the format applied to the array was done under 3.6.11 kernel as I'm still going through the same xfs_repair as above to get the array to mount. It keeps failing after it tries to format the log to cycle 67. I'll see if I can get you an strace of things. This all began when the RR2722 driver running under 3.18.15 complained and .. Mar 14 07:23:07 Bigmouth kernel: [7177248.090541] /dev/vmnet: port on hub 0 successfully opened Mar 14 07:26:03 Bigmouth kernel: [7177424.552323] device eth1 left promiscuous mode Mar 14 07:26:03 Bigmouth kernel: [7177424.552786] bridge-eth1: disabled promiscuous mode Mar 14 20:10:20 Bigmouth kernel: [7223317.069464] rr272x_1x:Task file error, StatusReg=0x51, ErrReg=0x84, LBA[0-3]=0x747dc92f,LBA[4-7]=0x0. Mar 14 20:10:20 Bigmouth kernel: [7223317.179811] sd 5:0:1:0: [sdg] Mar 14 20:10:21 Bigmouth kernel: [7223317.690439] Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK Mar 14 20:10:21 Bigmouth kernel: [7223317.700480] sd 5:0:1:0: [sdg] CDB: Mar 14 20:10:21 Bigmouth kernel: [7223318.211147] Write(10): 2a 00 74 7d c9 00 00 00 40 00 Mar 14 20:10:21 Bigmouth kernel: [7223318.211167] blk_update_request: I/O error, dev sdg, sector 1954400512 Mar 14 20:10:21 Bigmouth kernel: [7223318.211203] sd 5:0:3:0: [sdi] Mar 14 20:10:21 Bigmouth kernel: [7223318.211206] Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK Mar 14 20:10:21 Bigmouth kernel: [7223318.211209] sd 5:0:3:0: [sdi] CDB: Mar 14 20:10:21 Bigmouth kernel: [7223318.211211] Write(10): 2a 00 74 7d c9 00 00 00 40 00 Mar 14 20:10:21 Bigmouth kernel: [7223318.211223] blk_update_request: I/O error, dev sdi, sector 1954400512 Mar 14 20:10:23 Bigmouth kernel: [7223319.957052] XFS (md2): metadata I/O error: block 0x15d6d4900 ("xlog_iodone") error 5 numblks 64 Mar 14 20:10:23 Bigmouth kernel: [7223319.957064] XFS (md2): xfs_do_force_shutdown(0x2) called from line 1181 of file fs/xfs/xfs_log.c. Return address = 0xffffffff812fdf96 Mar 14 20:10:23 Bigmouth kernel: [7223319.957080] XFS (md2): Log I/O Error Detected. Shutting down filesystem Mar 14 20:10:23 Bigmouth kernel: [7223319.957083] XFS (md2): Please umount the filesystem and rectify the problem(s) Mar 14 20:10:23 Bigmouth kernel: [7223319.957093] XFS (md2): xfs_log_force: error -5 returned. Mar 14 20:10:50 Bigmouth kernel: [7223347.087272] XFS (md2): xfs_log_force: error -5 returned. Mar 14 20:11:20 Bigmouth kernel: [7223377.190469] XFS (md2): xfs_log_force: error -5 returned. Mar 14 20:11:50 Bigmouth kernel: [7223407.293952] XFS (md2): xfs_log_force: error -5 returned. Mar 14 20:12:20 Bigmouth kernel: [7223437.397444] XFS (md2): xfs_log_force: error -5 returned. Mar 14 20:12:23 Bigmouth kernel: [7223439.791407] nfsd: last server has exited, flushing export cache Mar 14 20:12:50 Bigmouth kernel: [7223467.500928] XFS (md2): xfs_log_force: error -5 returned. Mar 14 20:13:20 Bigmouth kernel: [7223497.604420] XFS (md2): xfs_log_force: error -5 returned. Mar 14 20:13:50 Bigmouth kernel: [7223527.707899] XFS (md2): xfs_log_force: error -5 returned. Mar 14 20:14:21 Bigmouth kernel: [7223557.811399] XFS (md2): xfs_log_force: error -5 returned. Mar 14 20:14:51 Bigmouth kernel: [7223587.914932] XFS (md2): xfs_log_force: error -5 returned. Mar 14 20:15:21 Bigmouth kernel: [7223618.018362] XFS (md2): xfs_log_force: error -5 returned. Mar 14 20:15:51 Bigmouth kernel: [7223648.121779] XFS (md2): xfs_log_force: error -5 returned. Mar 14 20:16:19 Bigmouth kernel: [7223676.401069] XFS (md2): xfs_log_force: error -5 returned. Mar 14 20:16:21 Bigmouth kernel: [7223678.225334] XFS (md2): xfs_log_force: error -5 returned. Mar 14 20:16:27 Bigmouth kernel: [7223684.541305] XFS (md2): xfs_log_force: error -5 returned. Mar 14 20:16:27 Bigmouth kernel: [7223684.572176] XFS (md2): xfs_log_force: error -5 returned. Mar 14 20:16:38 Bigmouth kernel: [7223694.918565] md2: unknown partition table Mar 14 20:16:43 Bigmouth kernel: [7223700.425290] XFS (md2): Mounting V5 Filesystem Mar 14 20:16:43 Bigmouth kernel: [7223700.545669] XFS (md2): Starting recovery (logdev: internal) Mar 14 20:16:44 Bigmouth kernel: [7223701.874245] XFS (md2): Ending recovery (logdev: internal) Mar 14 20:30:31 Bigmouth kernel: [7224529.528678] md2: unknown partition table /dev/md2: Version : 1.2 Creation Time : Tue Oct 13 22:21:27 2015 Raid Level : raid5 Array Size : 5860147200 (5588.67 GiB 6000.79 GB) Used Dev Size : 1953382400 (1862.89 GiB 2000.26 GB) Raid Devices : 4 Total Devices : 4 Persistence : Superblock is persistent Intent Bitmap : Internal Update Time : Tue Apr 12 01:19:43 2016 State : clean Active Devices : 4 Working Devices : 4 Failed Devices : 0 Spare Devices : 0 Layout : left-symmetric Chunk Size : 512K Name : Bigmouth:2 (local to host Bigmouth) UUID : ed979276:3459155c:a32f63da:0c684042 Events : 62846 Number Major Minor RaidDevice State 5 8 193 0 active sync /dev/sdm1 6 8 129 1 active sync /dev/sdi1 2 8 177 2 active sync /dev/sdl1 4 8 113 3 active sync /dev/sdh1 meta-data=/dev/md2 isize=512 agcount=33, agsize=45782272 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1 spinodes=0 data = bsize=4096 blocks=1465036800, imaxpct=5 = sunit=128 swidth=384 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=521728, version=2 = sectsz=512 sunit=8 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 > >> >> Checking the drives with smartctl shows no errors nor does 'dmesg' show any >> hardware i/o or controller related errors... >> >> I've tried scrubbing the array and no bad sectors are found either.. >> >> I'm running kernel 3.19.8 with xfsprogs 4.5. >> >> Thanks, >> Andrew >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs > From tireman@shaw.ca Tue Apr 12 01:54:18 2016 Return-Path: X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 889B47CB1 for ; Tue, 12 Apr 2016 01:54:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4E2C930405F for ; Mon, 11 Apr 2016 23:54:15 -0700 (PDT) X-ASG-Debug-ID: 1460444049-04cb6c2460400620001-NocioJ Received: from smtp-out-no.shaw.ca (smtp-out-no.shaw.ca [64.59.134.12]) by cuda.sgi.com with ESMTP id 7aWEAGY4uWgqTiWB (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 11 Apr 2016 23:54:10 -0700 (PDT) X-Barracuda-Envelope-From: tireman@shaw.ca X-Barracuda-Apparent-Source-IP: 64.59.134.12 Received: from [192.168.0.2] ([174.5.126.242]) by shaw.ca with SMTP id psD5acAKtQeympsD6azw3T; Tue, 12 Apr 2016 00:54:08 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=shaw.ca; s=s20150330; t=1460444049; bh=KpablPIG80SuJVHEYf/MEMVom81NXGsebj4a4yCoXpM=; h=Subject:To:References:Cc:From:Date:In-Reply-To; b=NuulD8JxgSe3zkdRTPccOVrMHYZC+0bnaBDWgNKYsUaLGB2dDyHaYS0uWWXHgvUUi HyuFdDLcGHzPGHRQEkC6nYDVSNJ8zvUnSRvpWFN5RzFGTEIY7INxT/AW7ZzW5Lmb2+ 3kg40R7zDRdMJNd6Hry9Dco6gLOPCIJsesPksgivgaLOHcGtAR7QvRSnNPcZclKMCj aWcCciJEOrZizAJ7wcJVHqVqUQ5gjE8XoPA8HmVVmNacPJiinjkDAvihGkQvLTognC QyorOEMLeLW68p5jMg0dvMZYlIePPWHbyBK4/JGwUcsSPCEL4/0eAkcouz/96Bk+e8 RFYLfbuJUq3tA== X-Authority-Analysis: v=2.2 cv=H9KZ+KQi c=1 sm=1 tr=0 a=YUpam8ogUlPMk4SS6ACeKg==:117 a=YUpam8ogUlPMk4SS6ACeKg==:17 a=r77TgQKjGQsHNAKrUKIA:9 a=eJfxgxciAAAA:8 a=SN7nh8UWN6AeNvhSSgwA:9 a=2Dr06bNaV2mIpZHCcpAA:9 a=7AJ42EW16M9Ha3Ad7DAA:9 a=rI_P-44R43zLiusJMqkA:9 a=aMr-WpV0x9R6lMNM:21 a=AZ4UtELQEAOeWAM-:21 a=XFsRseRo82cA:10 a=060HzbMcaFUA:10 a=tof_mlZw7KYA:10 Subject: Re: xfs_repair fails after trying to format log cycle? To: Brian Foster X-ASG-Orig-Subj: Re: xfs_repair fails after trying to format log cycle? References: <56F6DE67.60403@shaw.ca> <20160328085541.GA27040@bfoster.bfoster> Cc: xfs@oss.sgi.com From: Andrew Ryder Message-ID: <570C9BA3.6090504@shaw.ca> Date: Tue, 12 Apr 2016 02:54:27 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <20160328085541.GA27040@bfoster.bfoster> Content-Type: multipart/mixed; boundary="------------040608040302020006050206" X-CMAE-Envelope: MS4wfNTBjzPugy9Dfz8a1NFk0prA2gHyxpBat2gOSVkkdsXrIpV/1qUxiwVH7iY8QpFVuo3181rwBXWM90dZXgPYcy5hpXAtY3/+HBOXWD6s79K1cQv6ANgE cpLowlXcvl7pQnFr0GW3XRy94A2qH82H82pEdxEaV2vfVQXXOlNdQavvvx9QQZn4Y40lE+FeVOz6/A== X-Barracuda-Connect: smtp-out-no.shaw.ca[64.59.134.12] X-Barracuda-Start-Time: 1460444050 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: -1001.00 X-Barracuda-Spam-Status: No, SCORE=-1001.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 This is a multi-part message in MIME format. --------------040608040302020006050206 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Attached are the outputs of strace for the 3 runs required of xfs_repair to get he fs to mount again. On 03/28/2016 04:55 AM, Brian Foster wrote: > On Sat, Mar 26, 2016 at 03:09:27PM -0400, Andrew Ryder wrote: >> Hello, >> >> I have an mdadm array with a xfs v5 filesystem on it and its begun to give >> me issues when trying to mount it as well as complete xfs_repair. Not sure >> if anyone might be able to shed some light on what is going on or how to >> correct the issue? >> >> When I try and mount the fs, it complains with: >> >> [ 388.479847] XFS (md2): Mounting V5 Filesystem >> [ 388.494686] XFS (md2): metadata I/O error: block 0x15d6d39c0 >> ("xlog_bread_noalign") error 5 numblks 8192 >> [ 388.495013] XFS (md2): failed to find log head >> [ 388.495018] XFS (md2): log mount/recovery failed: error -5 >> [ 388.495090] XFS (md2): log mount failed >> > > So a read I/O error from the kernel... > >> >> This is where its not making any sense for me, If I try and run "xfs_repair >> /dev/md2" it fails with: >> >> Phase 1 - find and verify superblock... >> - reporting progress in intervals of 15 minutes >> Phase 2 - using internal log >> - zero log... >> xfs_repair: read failed: Input/output error >> failed to find log head >> zero_log: cannot find log head/tail (xlog_find_tail=-5) >> >> fatal error -- ERROR: The log head and/or tail cannot be discovered. Attempt >> to mount the >> filesystem to replay the log or use the -L option to destroy the log and >> attempt a repair. >> > > ... similar read error from xfsprogs... > >> >> But if I run "xfs_repair -L /dev/md2" which gives: >> >> Phase 1 - find and verify superblock... >> - reporting progress in intervals of 15 minutes >> Phase 2 - using internal log >> - zero log... >> xfs_repair: read failed: Input/output error >> failed to find log head >> zero_log: cannot find log head/tail (xlog_find_tail=-5) >> xfs_repair: libxfs_device_zero write failed: Input/output error >> > > ... and it looks like it fails to write as well when trying to zero the > log... > >> then try and re-run "xfs_repair /dev/md2" it starts traversing the >> filesystem all the way to "Phase 7" then errors with: >> >> Phase 7 - verify and correct link counts... >> - 14:36:55: verify and correct link counts - 33 of 33 allocation >> groups done >> Maximum metadata LSN (64:2230592) is ahead of log (0:0). >> Format log to cycle 67. >> xfs_repair: libxfs_device_zero write failed: Input/output error >> >> >> Yet at this point I can now mount the filesystem.. >> > > ... and this is effectively a repeat of the write error as we try to > format the log with a correct LSN based on the metadata LSN tracked by > the repair process. Your kernel is old enough that runtime probably > won't complain either way (note that 3.19 might be considered a fairly > early kernel for using CRC support). Perhaps the first write attempt > zeroed enough of the log before it failed that log recovery wasn't > required, and thus these problematic I/Os were avoided. > > What's the history of this fs? Has it been working for some time, just > recently formatted? What lead to the need for log recovery? What's the > mdadm --detail info, member device size, total array size, xfs_info of > the filesystem, etc..? > > Does xfs_repair run clean at this point? If so, does 'xfs_repair -L' > still reproduce the write error (note that I'm assuming you have a clean > log such that this command will not cause data loss). If so, an strace > of the repair process might be interesting... > > Brian > >> >> Checking the drives with smartctl shows no errors nor does 'dmesg' show any >> hardware i/o or controller related errors... >> >> I've tried scrubbing the array and no bad sectors are found either.. >> >> I'm running kernel 3.19.8 with xfsprogs 4.5. >> >> Thanks, >> Andrew >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs > --------------040608040302020006050206 Content-Type: text/plain; charset=UTF-8; name="strace_2.1.txt" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="strace_2.1.txt" 02:34:35.712989 execve("/sbin/xfs_repair", ["xfs_repair", "/dev/md2"], [/* 51 vars */]) = 0 02:34:35.714024 brk(NULL) = 0xcd7000 02:34:35.714158 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe777d37000 02:34:35.714253 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) 02:34:35.714395 open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 02:34:35.714482 fstat(3, {st_mode=S_IFREG|0644, st_size=246250, ...}) = 0 02:34:35.714569 mmap(NULL, 246250, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fe777cf0000 02:34:35.714638 close(3) = 0 02:34:35.714727 open("/lib64/libxfs.so.0", O_RDONLY|O_CLOEXEC) = 3 02:34:35.714802 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300\325\0\0\0\0\0\0"..., 832) = 832 02:34:35.714874 fstat(3, {st_mode=S_IFREG|0755, st_size=370168, ...}) = 0 02:34:35.714949 mmap(NULL, 2466056, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fe7778b0000 02:34:35.715018 mprotect(0x7fe777906000, 2097152, PROT_NONE) = 0 02:34:35.715088 mmap(0x7fe777b06000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x56000) = 0x7fe777b06000 02:34:35.715169 mmap(0x7fe777b0a000, 264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fe777b0a000 02:34:35.715248 close(3) = 0 02:34:35.715326 open("/lib64/libxlog.so.0", O_RDONLY|O_CLOEXEC) = 3 02:34:35.715414 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\360\21\0\0\0\0\0\0"..., 832) = 832 02:34:35.715485 fstat(3, {st_mode=S_IFREG|0755, st_size=22512, ...}) = 0 02:34:35.715556 mmap(NULL, 2118192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fe7776a8000 02:34:35.715624 mprotect(0x7fe7776ad000, 2093056, PROT_NONE) = 0 02:34:35.715692 mmap(0x7fe7778ac000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x4000) = 0x7fe7778ac000 02:34:35.715777 close(3) = 0 02:34:35.715851 open("/lib64/libuuid.so.1", O_RDONLY|O_CLOEXEC) = 3 02:34:35.715925 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@\26\0\0\0\0\0\0"..., 832) = 832 02:34:35.715993 fstat(3, {st_mode=S_IFREG|0755, st_size=18816, ...}) = 0 02:34:35.716062 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe777d36000 02:34:35.716135 mmap(NULL, 2113952, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fe7774a0000 02:34:35.716203 mprotect(0x7fe7774a4000, 2093056, PROT_NONE) = 0 02:34:35.716271 mmap(0x7fe7776a3000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0x7fe7776a3000 02:34:35.716426 close(3) = 0 02:34:35.716518 open("/lib64/librt.so.1", O_RDONLY|O_CLOEXEC) = 3 02:34:35.716595 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260!\0\0\0\0\0\0"..., 832) = 832 02:34:35.716665 fstat(3, {st_mode=S_IFREG|0755, st_size=31432, ...}) = 0 02:34:35.716734 mmap(NULL, 2128864, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fe777298000 02:34:35.716804 mprotect(0x7fe77729e000, 2097152, PROT_NONE) = 0 02:34:35.716873 mmap(0x7fe77749e000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x7fe77749e000 02:34:35.716961 close(3) = 0 02:34:35.717036 open("/lib64/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3 02:34:35.717109 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340`\0\0\0\0\0\0"..., 832) = 832 02:34:35.717190 fstat(3, {st_mode=S_IFREG|0755, st_size=133920, ...}) = 0 02:34:35.717259 mmap(NULL, 2208976, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fe777078000 02:34:35.717327 mprotect(0x7fe77708f000, 2093056, PROT_NONE) = 0 02:34:35.717412 mmap(0x7fe77728e000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16000) = 0x7fe77728e000 02:34:35.717493 mmap(0x7fe777290000, 13520, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fe777290000 02:34:35.717572 close(3) = 0 02:34:35.717657 open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 02:34:35.717731 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\7\2\0\0\0\0\0"..., 832) = 832 02:34:35.717821 fstat(3, {st_mode=S_IFREG|0755, st_size=1664768, ...}) = 0 02:34:35.717893 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe777d35000 02:34:35.717967 mmap(NULL, 3771992, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fe776cd8000 02:34:35.718035 mprotect(0x7fe776e67000, 2097152, PROT_NONE) = 0 02:34:35.718104 mmap(0x7fe777067000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x18f000) = 0x7fe777067000 02:34:35.718182 mmap(0x7fe77706d000, 15960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fe77706d000 02:34:35.718262 close(3) = 0 02:34:35.718398 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe777d34000 02:34:35.718487 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe777d2f000 02:34:35.718563 arch_prctl(ARCH_SET_FS, 0x7fe777d2f780) = 0 02:34:35.718772 mprotect(0x7fe777067000, 16384, PROT_READ) = 0 02:34:35.718860 mprotect(0x7fe77728e000, 4096, PROT_READ) = 0 02:34:35.718937 mprotect(0x7fe77749e000, 4096, PROT_READ) = 0 02:34:35.719008 mprotect(0x7fe7776a3000, 4096, PROT_READ) = 0 02:34:35.719117 mprotect(0x7fe777b06000, 4096, PROT_READ) = 0 02:34:35.719188 mprotect(0x7fe7778ac000, 4096, PROT_READ) = 0 02:34:35.719285 mprotect(0x639000, 4096, PROT_READ) = 0 02:34:35.719356 mprotect(0x7fe777d31000, 4096, PROT_READ) = 0 02:34:35.719446 munmap(0x7fe777cf0000, 246250) = 0 02:34:35.719541 set_tid_address(0x7fe777d2fa50) = 31570 02:34:35.719604 set_robust_list(0x7fe777d2fa60, 24) = 0 02:34:35.719677 rt_sigaction(SIGRTMIN, {0x7fe77707db88, [], SA_RESTORER|SA_SIGINFO, 0x7fe777088ae0}, NULL, 8) = 0 02:34:35.719748 rt_sigaction(SIGRT_1, {0x7fe77707dc10, [], SA_RESTORER|SA_RESTART|SA_SIGINFO, 0x7fe777088ae0}, NULL, 8) = 0 02:34:35.719820 rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0 02:34:35.719902 getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0 02:34:35.720145 brk(NULL) = 0xcd7000 02:34:35.720208 brk(0xcf8000) = 0xcf8000 02:34:35.720283 open("/usr/lib64/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3 02:34:35.720359 fstat(3, {st_mode=S_IFREG|0644, st_size=3832592, ...}) = 0 02:34:35.720450 mmap(NULL, 3832592, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fe776930000 02:34:35.720531 close(3) = 0 02:34:35.720708 open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3 02:34:35.720784 fstat(3, {st_mode=S_IFREG|0644, st_size=2997, ...}) = 0 02:34:35.720854 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe777d2e000 02:34:35.720927 read(3, "# Locale name alias data base.\n#"..., 4096) = 2997 02:34:35.721038 read(3, "", 4096) = 0 02:34:35.721103 close(3) = 0 02:34:35.721168 munmap(0x7fe777d2e000, 4096) = 0 02:34:35.721268 open("/usr/share/locale/en_US.utf8/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 02:34:35.721344 open("/usr/share/locale/en_US/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 02:34:35.721439 open("/usr/share/locale/en.utf8/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 02:34:35.721513 open("/usr/share/locale/en/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 02:34:35.721630 getcwd("/root/HPT/makeself-22854-20150421040904/product/rr272x/linux", 4096) = 61 02:34:35.721725 stat("/dev/md2", {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 02:34:35.721808 stat("/dev/md2", {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 02:34:35.721890 ustat(0x902, 0x7ffc89b36730) = -1 EINVAL (Invalid argument) 02:34:35.721964 open("/dev/md2", O_RDONLY) = 3 02:34:35.722043 stat("/dev/md2", {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 02:34:35.722117 stat("/dev/md2", {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 02:34:35.722191 ustat(0x902, 0x7ffc89b36730) = -1 EINVAL (Invalid argument) 02:34:35.722259 open("/dev/md2", O_RDWR|O_EXCL|O_DIRECT) = 4 02:34:35.722338 fstat(4, {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 02:34:35.722432 fstat(4, {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 02:34:35.722504 ioctl(4, BLKGETSIZE64, [6000790732800]) = 0 02:34:35.722575 ioctl(4, BLKSSZGET, [512]) = 0 02:34:35.722646 chdir("/root/HPT/makeself-22854-20150421040904/product/rr272x/linux") = 0 02:34:35.722851 close(3) = 0 02:34:35.722921 getrlimit(RLIMIT_FSIZE, {rlim_cur=RLIM64_INFINITY, rlim_max=RLIM64_INFINITY}) = 0 02:34:35.723026 write(2, "Phase 1 - find and verify superb"..., 40) = 40 02:34:35.723127 mmap(NULL, 528384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe777cae000 02:34:35.723206 mmap(NULL, 528384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe777c2d000 02:34:35.723848 lseek(4, 0, SEEK_SET) = 0 02:34:35.723928 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 524288) = 524288 02:34:35.729568 munmap(0x7fe777c2d000, 528384) = 0 02:34:35.729728 brk(0xd2a000) = 0xd2a000 02:34:35.729936 lseek(4, 187524186112, SEEK_SET) = 187524186112 02:34:35.730002 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:35.758064 lseek(4, 375048372224, SEEK_SET) = 375048372224 02:34:35.758154 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:35.770887 lseek(4, 562572558336, SEEK_SET) = 562572558336 02:34:35.770975 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:35.782523 lseek(4, 750096744448, SEEK_SET) = 750096744448 02:34:35.782600 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:35.793031 lseek(4, 937620930560, SEEK_SET) = 937620930560 02:34:35.793117 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:35.803937 lseek(4, 1125145116672, SEEK_SET) = 1125145116672 02:34:35.804022 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:35.816341 lseek(4, 1312669302784, SEEK_SET) = 1312669302784 02:34:35.816482 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:35.829677 lseek(4, 1500193488896, SEEK_SET) = 1500193488896 02:34:35.829767 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:35.848454 lseek(4, 1687717675008, SEEK_SET) = 1687717675008 02:34:35.848549 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:35.857313 lseek(4, 1875241861120, SEEK_SET) = 1875241861120 02:34:35.857423 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:35.874437 lseek(4, 2062766047232, SEEK_SET) = 2062766047232 02:34:35.874529 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:35.890445 lseek(4, 2250290233344, SEEK_SET) = 2250290233344 02:34:35.890537 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:35.900051 lseek(4, 2437814419456, SEEK_SET) = 2437814419456 02:34:35.900138 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:35.908831 lseek(4, 2625338605568, SEEK_SET) = 2625338605568 02:34:35.908924 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:35.927329 lseek(4, 2812862791680, SEEK_SET) = 2812862791680 02:34:35.927442 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:35.942968 lseek(4, 3000386977792, SEEK_SET) = 3000386977792 02:34:35.943055 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:35.957518 lseek(4, 3187911163904, SEEK_SET) = 3187911163904 02:34:35.957604 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:35.972228 lseek(4, 3375435350016, SEEK_SET) = 3375435350016 02:34:35.972313 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:35.984244 lseek(4, 3562959536128, SEEK_SET) = 3562959536128 02:34:35.984332 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:35.994832 lseek(4, 3750483722240, SEEK_SET) = 3750483722240 02:34:35.994917 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:36.012634 lseek(4, 3938007908352, SEEK_SET) = 3938007908352 02:34:36.012721 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:36.023234 lseek(4, 4125532094464, SEEK_SET) = 4125532094464 02:34:36.023322 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:36.035349 lseek(4, 4313056280576, SEEK_SET) = 4313056280576 02:34:36.035464 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:36.047799 lseek(4, 4500580466688, SEEK_SET) = 4500580466688 02:34:36.047886 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:36.057676 lseek(4, 4688104652800, SEEK_SET) = 4688104652800 02:34:36.057764 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:36.074092 lseek(4, 4875628838912, SEEK_SET) = 4875628838912 02:34:36.074168 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:36.087112 lseek(4, 5063153025024, SEEK_SET) = 5063153025024 02:34:36.087200 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:36.101378 lseek(4, 5250677211136, SEEK_SET) = 5250677211136 02:34:36.101471 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:36.112903 lseek(4, 5438201397248, SEEK_SET) = 5438201397248 02:34:36.112990 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:36.123140 lseek(4, 5625725583360, SEEK_SET) = 5625725583360 02:34:36.123229 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:36.141351 lseek(4, 5813249769472, SEEK_SET) = 5813249769472 02:34:36.141478 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:36.155848 lseek(4, 6000773955584, SEEK_SET) = 6000773955584 02:34:36.155940 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:36.174574 munmap(0x7fe777cae000, 528384) = 0 02:34:36.174701 lseek(4, 0, SEEK_SET) = 0 02:34:36.174773 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 32768) = 32768 02:34:36.207817 fstat(4, {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 02:34:36.207943 pread64(4, "\0\200P\271\0\210\377\377\0\0\0\0\0\0\0\0\1\0M$\0\0\0\0\1\0\0\0\0\0\0\0"..., 512, 6000790732288) = 512 02:34:36.208253 open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3 02:34:36.208352 read(3, "0-31\n", 8192) = 5 02:34:36.208462 close(3) = 0 02:34:36.208536 rt_sigprocmask(SIG_BLOCK, [HUP ALRM], NULL, 8) = 0 02:34:36.208614 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fe77612f000 02:34:36.208704 mprotect(0x7fe77612f000, 4096, PROT_NONE) = 0 02:34:36.208780 clone(child_stack=0x7fe77692ef70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fe77692f9d0, tls=0x7fe77692f700, child_tidptr=0x7fe77692f9d0) = 31571 02:34:36.208924 write(2, " - reporting progress in "..., 56) = 56 02:34:36.209161 sysinfo({uptime=352176, loads=[39808, 52512, 92416], totalram=67543732224, freeram=64590979072, sharedram=1269760, bufferram=3579904, totalswap=10737414144, freeswap=10737414144, procs=659, totalhigh=0, freehigh=0, mem_unit=1}) = 0 02:34:36.209239 getrlimit(RLIMIT_AS, {rlim_cur=RLIM64_INFINITY, rlim_max=RLIM64_INFINITY}) = 0 02:34:36.209310 mmap(NULL, 48685056, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe7732c1000 02:34:36.239807 write(2, "Phase 2 - using internal log\n", 29) = 29 02:34:36.239993 write(2, " - zero log...\n", 22) = 22 02:34:36.240079 pread64(4, "\376\355\272\276\0\0\0\1\0\0\0\2\0\0~\0\0\0\0\1\0\0\0\0\0\0\0\1\0\0\0\0"..., 512, 3000387010560) = 512 02:34:36.240847 pread64(4, "\0\0\0?l\320\320,00E5E3E08D86D7730F06CA96"..., 512, 3002524007936) = 512 02:34:36.262373 pread64(4, "\376\355\272\276\0\0\0\1\0\0\0\2\0\0~\0\0\0\0\1\0\0\0\0\0\0\0\1\0\0\0\0"..., 512, 3000387010560) = 512 02:34:36.262640 pread64(4, "\0\0\0?l\320\320,00E5E3E08D86D7730F06CA96"..., 512, 3002524007936) = 512 02:34:36.272579 pread64(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512, 3001455508992) = 512 02:34:36.288933 pread64(4, "\0\0\0?\0\0\0>\0\376\33B\0\0\0>\3y\207\v\0\0\0008i\0\0\0;\22\3\0"..., 512, 3001989758464) = 512 02:34:36.289266 pread64(4, "\0\0\0?\f\210\377\377\315s\36l\0\0\0\0\1\0\0\0\0\0\0\0\26t\303\276\0\0\0 "..., 512, 3001722633728) = 512 02:34:36.289974 pread64(4, "\0\0\0?\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2007\34Z\2\0\0\0"..., 512, 3001589071360) = 512 02:34:36.295651 pread64(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512, 3001522290176) = 512 02:34:36.295920 pread64(4, "\376\355\272\276\0\0\0?\0\0\0\2\0\0\0\0\0\0\0?\0\"\324?\0\0\0@\0\"\304\200"..., 512, 3001555680768) = 512 02:34:36.296130 pread64(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512, 3001538985472) = 512 02:34:36.296328 pread64(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512, 3001547333120) = 512 02:34:36.296524 pread64(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512, 3001551506944) = 512 02:34:36.296714 pread64(4, "\0\0\0@0EF9670491193E275D0E55263E01"..., 512, 3001553593856) = 512 02:34:36.296901 pread64(4, "\376\355\272\276\0\0\0?\0\0\0\2\0\0\0\0\0\0\0?\0\"\314I\0\0\0@\0\"\304\200"..., 512, 3001554637312) = 512 02:34:36.297635 pread64(4, "\0\0\0@\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \204aN\2\0\0\0 \0\0\0"..., 512, 3001554115584) = 512 02:34:36.305076 pread64(4, "\376\355\272\276\0\0\0?\0\0\0\2\0\0\0\0\0\0\0?\0\"\312K\0\0\0@\0\"\304\200"..., 512, 3001554376192) = 512 02:34:36.306433 pread64(4, "\0\0\0@\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512, 3001554245632) = 512 02:34:36.306615 pread64(4, "\376\355\272\276\0\0\0?\0\0\0\2\0\0\0\0\0\0\0?\0\"\311\313\0\0\0@\0\"\304\200"..., 512, 3001554310656) = 512 02:34:36.306756 pread64(4, "\376\355\272\276\0\0\0?\0\0\0\2\0\0\0\0\0\0\0?\0\"\311\213\0\0\0@\0\"\304\200"..., 512, 3001554277888) = 512 02:34:36.306893 pread64(4, "\0\0\0@vzS\361\305;oOz.\4[\16Ozn\316\17\25>\3147\353J\27\nE\27"..., 512, 3001554261504) = 512 02:34:36.307030 pread64(4, "\0\0\0@\335\216\30\3\214\217~\237\230\255EM\240\347\333\360\244\225\214\t1\306s\203\317N9\246"..., 512, 3001554269696) = 512 02:34:36.307166 pread64(4, "\376\355\272\276\0\0\0?\0\0\0\2\0\0\0\0\0\0\0?\0\"\311\203\0\0\0@\0\"\304\200"..., 512, 3001554273792) = 512 02:34:36.307300 pread64(4, "\0\0\0@\376\264\320\231\317\251\352\177\306\242\305\24d\267\334\300.\334\347\200{\377\0\236\177_\301\213"..., 512, 3001554271744) = 512 02:34:36.307441 pread64(4, "\376\355\272\276\0\0\0?\0\0\0\2\0\0\0\0\0\0\0?\0\"\311\201\0\0\0@\0\"\304\200"..., 512, 3001554272768) = 512 02:34:36.307589 pread64(4, "\376\355\272\276\0\0\0?\0\0\0\2\0\0\0\0\0\0\0?\0\"\311\200\0\0\0@\0\"\304\200"..., 512, 3001554272256) = 512 02:34:36.307727 mmap(NULL, 4198400, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe772ec0000 02:34:36.309704 pread64(4, 0x7fe772ec0200, 2097152, 3001552175104) = -1 EIO (Input/output error) 02:34:36.326254 open("/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 02:34:36.326382 open("/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 02:34:36.326488 open("/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 02:34:36.326568 open("/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 02:34:36.326688 write(2, "xfs_repair: read failed: Input/o"..., 44) = 44 02:34:36.326793 write(2, "failed to find log head", 23) = 23 02:34:36.326869 write(2, "\n", 1) = 1 02:34:36.326951 write(2, "zero_log: cannot find log head/t"..., 56) = 56 02:34:36.327042 write(2, "\nfatal error -- ", 16) = 16 02:34:36.327116 write(2, "ERROR: The log head and/or tail "..., 166) = 166 02:34:36.327212 exit_group(1) = ? 02:34:36.328656 +++ exited with 1 +++ --------------040608040302020006050206 Content-Type: text/plain; charset=UTF-8; name="strace_2.2.txt" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="strace_2.2.txt" 02:34:43.294850 execve("/sbin/xfs_repair", ["xfs_repair", "-L", "/dev/md2"], [/* 51 vars */]) = 0 02:34:43.295795 brk(NULL) = 0x2258000 02:34:43.295937 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb8fa25a000 02:34:43.296033 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) 02:34:43.296158 open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 02:34:43.296240 fstat(3, {st_mode=S_IFREG|0644, st_size=246250, ...}) = 0 02:34:43.296337 mmap(NULL, 246250, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fb8fa210000 02:34:43.296585 close(3) = 0 02:34:43.296761 open("/lib64/libxfs.so.0", O_RDONLY|O_CLOEXEC) = 3 02:34:43.296950 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300\325\0\0\0\0\0\0"..., 832) = 832 02:34:43.297070 fstat(3, {st_mode=S_IFREG|0755, st_size=370168, ...}) = 0 02:34:43.297178 mmap(NULL, 2466056, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb8f9dd0000 02:34:43.297285 mprotect(0x7fb8f9e26000, 2097152, PROT_NONE) = 0 02:34:43.297479 mmap(0x7fb8fa026000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x56000) = 0x7fb8fa026000 02:34:43.297609 mmap(0x7fb8fa02a000, 264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fb8fa02a000 02:34:43.297697 close(3) = 0 02:34:43.297785 open("/lib64/libxlog.so.0", O_RDONLY|O_CLOEXEC) = 3 02:34:43.297878 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\360\21\0\0\0\0\0\0"..., 832) = 832 02:34:43.297953 fstat(3, {st_mode=S_IFREG|0755, st_size=22512, ...}) = 0 02:34:43.298030 mmap(NULL, 2118192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb8f9bc8000 02:34:43.298102 mprotect(0x7fb8f9bcd000, 2093056, PROT_NONE) = 0 02:34:43.298175 mmap(0x7fb8f9dcc000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x4000) = 0x7fb8f9dcc000 02:34:43.298266 close(3) = 0 02:34:43.298349 open("/lib64/libuuid.so.1", O_RDONLY|O_CLOEXEC) = 3 02:34:43.298453 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@\26\0\0\0\0\0\0"..., 832) = 832 02:34:43.298526 fstat(3, {st_mode=S_IFREG|0755, st_size=18816, ...}) = 0 02:34:43.298598 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb8fa259000 02:34:43.298677 mmap(NULL, 2113952, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb8f99c0000 02:34:43.298750 mprotect(0x7fb8f99c4000, 2093056, PROT_NONE) = 0 02:34:43.298823 mmap(0x7fb8f9bc3000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0x7fb8f9bc3000 02:34:43.298913 close(3) = 0 02:34:43.298990 open("/lib64/librt.so.1", O_RDONLY|O_CLOEXEC) = 3 02:34:43.299069 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260!\0\0\0\0\0\0"..., 832) = 832 02:34:43.299140 fstat(3, {st_mode=S_IFREG|0755, st_size=31432, ...}) = 0 02:34:43.299212 mmap(NULL, 2128864, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb8f97b8000 02:34:43.299285 mprotect(0x7fb8f97be000, 2097152, PROT_NONE) = 0 02:34:43.299359 mmap(0x7fb8f99be000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x7fb8f99be000 02:34:43.299473 close(3) = 0 02:34:43.299553 open("/lib64/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3 02:34:43.299631 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340`\0\0\0\0\0\0"..., 832) = 832 02:34:43.299702 fstat(3, {st_mode=S_IFREG|0755, st_size=133920, ...}) = 0 02:34:43.299773 mmap(NULL, 2208976, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb8f9598000 02:34:43.299845 mprotect(0x7fb8f95af000, 2093056, PROT_NONE) = 0 02:34:43.299918 mmap(0x7fb8f97ae000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16000) = 0x7fb8f97ae000 02:34:43.300004 mmap(0x7fb8f97b0000, 13520, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fb8f97b0000 02:34:43.300089 close(3) = 0 02:34:43.300181 open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 02:34:43.300260 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\7\2\0\0\0\0\0"..., 832) = 832 02:34:43.300352 fstat(3, {st_mode=S_IFREG|0755, st_size=1664768, ...}) = 0 02:34:43.300462 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb8fa258000 02:34:43.300548 mmap(NULL, 3771992, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb8f91f8000 02:34:43.300622 mprotect(0x7fb8f9387000, 2097152, PROT_NONE) = 0 02:34:43.300697 mmap(0x7fb8f9587000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x18f000) = 0x7fb8f9587000 02:34:43.300782 mmap(0x7fb8f958d000, 15960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fb8f958d000 02:34:43.300869 close(3) = 0 02:34:43.300988 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb8fa257000 02:34:43.301064 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb8fa255000 02:34:43.301146 arch_prctl(ARCH_SET_FS, 0x7fb8fa255780) = 0 02:34:43.301410 mprotect(0x7fb8f9587000, 16384, PROT_READ) = 0 02:34:43.301509 mprotect(0x7fb8f97ae000, 4096, PROT_READ) = 0 02:34:43.301591 mprotect(0x7fb8f99be000, 4096, PROT_READ) = 0 02:34:43.301666 mprotect(0x7fb8f9bc3000, 4096, PROT_READ) = 0 02:34:43.301782 mprotect(0x7fb8fa026000, 4096, PROT_READ) = 0 02:34:43.301857 mprotect(0x7fb8f9dcc000, 4096, PROT_READ) = 0 02:34:43.301963 mprotect(0x639000, 4096, PROT_READ) = 0 02:34:43.302040 mprotect(0x7fb8fa251000, 4096, PROT_READ) = 0 02:34:43.302110 munmap(0x7fb8fa210000, 246250) = 0 02:34:43.302202 set_tid_address(0x7fb8fa255a50) = 31579 02:34:43.302264 set_robust_list(0x7fb8fa255a60, 24) = 0 02:34:43.302334 rt_sigaction(SIGRTMIN, {0x7fb8f959db88, [], SA_RESTORER|SA_SIGINFO, 0x7fb8f95a8ae0}, NULL, 8) = 0 02:34:43.302421 rt_sigaction(SIGRT_1, {0x7fb8f959dc10, [], SA_RESTORER|SA_RESTART|SA_SIGINFO, 0x7fb8f95a8ae0}, NULL, 8) = 0 02:34:43.302496 rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0 02:34:43.302577 getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0 02:34:43.302827 brk(NULL) = 0x2258000 02:34:43.302890 brk(0x2279000) = 0x2279000 02:34:43.302965 open("/usr/lib64/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3 02:34:43.303042 fstat(3, {st_mode=S_IFREG|0644, st_size=3832592, ...}) = 0 02:34:43.303111 mmap(NULL, 3832592, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fb8f8e50000 02:34:43.303193 close(3) = 0 02:34:43.303394 open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3 02:34:43.303477 fstat(3, {st_mode=S_IFREG|0644, st_size=2997, ...}) = 0 02:34:43.303547 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb8fa254000 02:34:43.303617 read(3, "# Locale name alias data base.\n#"..., 4096) = 2997 02:34:43.303729 read(3, "", 4096) = 0 02:34:43.303795 close(3) = 0 02:34:43.303858 munmap(0x7fb8fa254000, 4096) = 0 02:34:43.303960 open("/usr/share/locale/en_US.utf8/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 02:34:43.304037 open("/usr/share/locale/en_US/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 02:34:43.304110 open("/usr/share/locale/en.utf8/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 02:34:43.304182 open("/usr/share/locale/en/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 02:34:43.304308 getcwd("/root/HPT/makeself-22854-20150421040904/product/rr272x/linux", 4096) = 61 02:34:43.304440 stat("/dev/md2", {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 02:34:43.304555 stat("/dev/md2", {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 02:34:43.304669 ustat(0x902, 0x7fff9bde6020) = -1 EINVAL (Invalid argument) 02:34:43.304754 open("/dev/md2", O_RDONLY) = 3 02:34:43.304847 stat("/dev/md2", {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 02:34:43.304930 stat("/dev/md2", {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 02:34:43.305009 ustat(0x902, 0x7fff9bde6020) = -1 EINVAL (Invalid argument) 02:34:43.305085 open("/dev/md2", O_RDWR|O_EXCL|O_DIRECT) = 4 02:34:43.305167 fstat(4, {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 02:34:43.305253 fstat(4, {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 02:34:43.305327 ioctl(4, BLKGETSIZE64, [6000790732800]) = 0 02:34:43.305421 ioctl(4, BLKSSZGET, [512]) = 0 02:34:43.305495 chdir("/root/HPT/makeself-22854-20150421040904/product/rr272x/linux") = 0 02:34:43.305710 close(3) = 0 02:34:43.305785 getrlimit(RLIMIT_FSIZE, {rlim_cur=RLIM64_INFINITY, rlim_max=RLIM64_INFINITY}) = 0 02:34:43.305896 write(2, "Phase 1 - find and verify superb"..., 40) = 40 02:34:43.306008 mmap(NULL, 528384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb8fa1d0000 02:34:43.306091 mmap(NULL, 528384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb8fa14f000 02:34:43.306741 lseek(4, 0, SEEK_SET) = 0 02:34:43.306798 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 524288) = 524288 02:34:43.322953 munmap(0x7fb8fa14f000, 528384) = 0 02:34:43.323102 brk(0x22ab000) = 0x22ab000 02:34:43.323311 lseek(4, 187524186112, SEEK_SET) = 187524186112 02:34:43.323400 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.343570 lseek(4, 375048372224, SEEK_SET) = 375048372224 02:34:43.343690 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.356544 lseek(4, 562572558336, SEEK_SET) = 562572558336 02:34:43.356635 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.367852 lseek(4, 750096744448, SEEK_SET) = 750096744448 02:34:43.367943 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.378658 lseek(4, 937620930560, SEEK_SET) = 937620930560 02:34:43.378750 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.389263 lseek(4, 1125145116672, SEEK_SET) = 1125145116672 02:34:43.389393 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.401827 lseek(4, 1312669302784, SEEK_SET) = 1312669302784 02:34:43.401913 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.415164 lseek(4, 1500193488896, SEEK_SET) = 1500193488896 02:34:43.415252 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.423679 lseek(4, 1687717675008, SEEK_SET) = 1687717675008 02:34:43.423755 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.434352 lseek(4, 1875241861120, SEEK_SET) = 1875241861120 02:34:43.434473 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.449736 lseek(4, 2062766047232, SEEK_SET) = 2062766047232 02:34:43.449826 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.459132 lseek(4, 2250290233344, SEEK_SET) = 2250290233344 02:34:43.459222 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.475404 lseek(4, 2437814419456, SEEK_SET) = 2437814419456 02:34:43.475481 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.485968 lseek(4, 2625338605568, SEEK_SET) = 2625338605568 02:34:43.486068 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.502892 lseek(4, 2812862791680, SEEK_SET) = 2812862791680 02:34:43.502985 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.511712 lseek(4, 3000386977792, SEEK_SET) = 3000386977792 02:34:43.511808 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.513807 lseek(4, 3187911163904, SEEK_SET) = 3187911163904 02:34:43.513881 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.524210 lseek(4, 3375435350016, SEEK_SET) = 3375435350016 02:34:43.524294 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.539490 lseek(4, 3562959536128, SEEK_SET) = 3562959536128 02:34:43.539590 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.555268 lseek(4, 3750483722240, SEEK_SET) = 3750483722240 02:34:43.555359 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.567909 lseek(4, 3938007908352, SEEK_SET) = 3938007908352 02:34:43.568000 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.583616 lseek(4, 4125532094464, SEEK_SET) = 4125532094464 02:34:43.583708 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.600733 lseek(4, 4313056280576, SEEK_SET) = 4313056280576 02:34:43.600821 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.616614 lseek(4, 4500580466688, SEEK_SET) = 4500580466688 02:34:43.616705 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.633212 lseek(4, 4688104652800, SEEK_SET) = 4688104652800 02:34:43.633314 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.642887 lseek(4, 4875628838912, SEEK_SET) = 4875628838912 02:34:43.642978 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.662468 lseek(4, 5063153025024, SEEK_SET) = 5063153025024 02:34:43.662550 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.678470 lseek(4, 5250677211136, SEEK_SET) = 5250677211136 02:34:43.678570 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.698416 lseek(4, 5438201397248, SEEK_SET) = 5438201397248 02:34:43.698511 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.708639 lseek(4, 5625725583360, SEEK_SET) = 5625725583360 02:34:43.708734 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.726868 lseek(4, 5813249769472, SEEK_SET) = 5813249769472 02:34:43.726959 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.741267 lseek(4, 6000773955584, SEEK_SET) = 6000773955584 02:34:43.741382 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:34:43.760238 munmap(0x7fb8fa1d0000, 528384) = 0 02:34:43.760407 lseek(4, 0, SEEK_SET) = 0 02:34:43.760487 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 32768) = 32768 02:34:43.761294 fstat(4, {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 02:34:43.761475 pread64(4, "\0\200P\271\0\210\377\377\0\0\0\0\0\0\0\0\1\0M$\0\0\0\0\1\0\0\0\0\0\0\0"..., 512, 6000790732288) = 512 02:34:43.761880 open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3 02:34:43.761990 read(3, "0-31\n", 8192) = 5 02:34:43.762074 close(3) = 0 02:34:43.762152 rt_sigprocmask(SIG_BLOCK, [HUP ALRM], NULL, 8) = 0 02:34:43.762234 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fb8f864f000 02:34:43.762333 mprotect(0x7fb8f864f000, 4096, PROT_NONE) = 0 02:34:43.762441 clone(child_stack=0x7fb8f8e4ef70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fb8f8e4f9d0, tls=0x7fb8f8e4f700, child_tidptr=0x7fb8f8e4f9d0) = 31580 02:34:43.762590 write(2, " - reporting progress in "..., 56) = 56 02:34:43.762808 sysinfo({uptime=352183, loads=[33664, 50784, 91424], totalram=67543732224, freeram=64590716928, sharedram=1269760, bufferram=3579904, totalswap=10737414144, freeswap=10737414144, procs=659, totalhigh=0, freehigh=0, mem_unit=1}) = 0 02:34:43.762891 getrlimit(RLIMIT_AS, {rlim_cur=RLIM64_INFINITY, rlim_max=RLIM64_INFINITY}) = 0 02:34:43.762969 mmap(NULL, 48685056, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb8f57e1000 02:34:43.795734 write(2, "Phase 2 - using internal log\n", 29) = 29 02:34:43.795997 write(2, " - zero log...\n", 22) = 22 02:34:43.796130 pread64(4, "\376\355\272\276\0\0\0\1\0\0\0\2\0\0~\0\0\0\0\1\0\0\0\0\0\0\0\1\0\0\0\0"..., 512, 3000387010560) = 512 02:34:43.796844 pread64(4, "\0\0\0?l\320\320,00E5E3E08D86D7730F06CA96"..., 512, 3002524007936) = 512 02:34:43.817604 pread64(4, "\376\355\272\276\0\0\0\1\0\0\0\2\0\0~\0\0\0\0\1\0\0\0\0\0\0\0\1\0\0\0\0"..., 512, 3000387010560) = 512 02:34:43.817892 pread64(4, "\0\0\0?l\320\320,00E5E3E08D86D7730F06CA96"..., 512, 3002524007936) = 512 02:34:43.827756 pread64(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512, 3001455508992) = 512 02:34:43.849339 pread64(4, "\0\0\0?\0\0\0>\0\376\33B\0\0\0>\3y\207\v\0\0\0008i\0\0\0;\22\3\0"..., 512, 3001989758464) = 512 02:34:43.849718 pread64(4, "\0\0\0?\f\210\377\377\315s\36l\0\0\0\0\1\0\0\0\0\0\0\0\26t\303\276\0\0\0 "..., 512, 3001722633728) = 512 02:34:43.849945 pread64(4, "\0\0\0?\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2007\34Z\2\0\0\0"..., 512, 3001589071360) = 512 02:34:43.861025 pread64(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512, 3001522290176) = 512 02:34:43.861313 pread64(4, "\376\355\272\276\0\0\0?\0\0\0\2\0\0\0\0\0\0\0?\0\"\324?\0\0\0@\0\"\304\200"..., 512, 3001555680768) = 512 02:34:43.861549 pread64(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512, 3001538985472) = 512 02:34:43.861759 pread64(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512, 3001547333120) = 512 02:34:43.861960 pread64(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512, 3001551506944) = 512 02:34:43.872360 pread64(4, "\0\0\0@0EF9670491193E275D0E55263E01"..., 512, 3001553593856) = 512 02:34:43.874920 pread64(4, "\376\355\272\276\0\0\0?\0\0\0\2\0\0\0\0\0\0\0?\0\"\314I\0\0\0@\0\"\304\200"..., 512, 3001554637312) = 512 02:34:43.875756 pread64(4, "\0\0\0@\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \204aN\2\0\0\0 \0\0\0"..., 512, 3001554115584) = 512 02:34:43.882165 pread64(4, "\376\355\272\276\0\0\0?\0\0\0\2\0\0\0\0\0\0\0?\0\"\312K\0\0\0@\0\"\304\200"..., 512, 3001554376192) = 512 02:34:43.883473 pread64(4, "\0\0\0@\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512, 3001554245632) = 512 02:34:43.883670 pread64(4, "\376\355\272\276\0\0\0?\0\0\0\2\0\0\0\0\0\0\0?\0\"\311\313\0\0\0@\0\"\304\200"..., 512, 3001554310656) = 512 02:34:43.883827 pread64(4, "\376\355\272\276\0\0\0?\0\0\0\2\0\0\0\0\0\0\0?\0\"\311\213\0\0\0@\0\"\304\200"..., 512, 3001554277888) = 512 02:34:43.883979 pread64(4, "\0\0\0@vzS\361\305;oOz.\4[\16Ozn\316\17\25>\3147\353J\27\nE\27"..., 512, 3001554261504) = 512 02:34:43.884129 pread64(4, "\0\0\0@\335\216\30\3\214\217~\237\230\255EM\240\347\333\360\244\225\214\t1\306s\203\317N9\246"..., 512, 3001554269696) = 512 02:34:43.884278 pread64(4, "\376\355\272\276\0\0\0?\0\0\0\2\0\0\0\0\0\0\0?\0\"\311\203\0\0\0@\0\"\304\200"..., 512, 3001554273792) = 512 02:34:43.884432 pread64(4, "\0\0\0@\376\264\320\231\317\251\352\177\306\242\305\24d\267\334\300.\334\347\200{\377\0\236\177_\301\213"..., 512, 3001554271744) = 512 02:34:43.884583 pread64(4, "\376\355\272\276\0\0\0?\0\0\0\2\0\0\0\0\0\0\0?\0\"\311\201\0\0\0@\0\"\304\200"..., 512, 3001554272768) = 512 02:34:43.884733 pread64(4, "\376\355\272\276\0\0\0?\0\0\0\2\0\0\0\0\0\0\0?\0\"\311\200\0\0\0@\0\"\304\200"..., 512, 3001554272256) = 512 02:34:43.884891 mmap(NULL, 4198400, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb8f53e0000 02:34:43.887528 pread64(4, 0x7fb8f53e0200, 2097152, 3001552175104) = -1 EIO (Input/output error) 02:34:43.900655 open("/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 02:34:43.900757 open("/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 02:34:43.900832 open("/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 02:34:43.900901 open("/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 02:34:43.901002 write(2, "xfs_repair: read failed: Input/o"..., 44) = 44 02:34:43.901104 write(2, "failed to find log head", 23) = 23 02:34:43.901183 write(2, "\n", 1) = 1 02:34:43.901312 write(2, "zero_log: cannot find log head/t"..., 56) = 56 02:34:43.901478 brk(0x22cc000) = 0x22cc000 02:34:43.901810 lseek(4, 3000387010560, SEEK_SET) = 3000387010560 02:34:43.901901 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:43.917563 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:43.922055 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:43.944326 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:43.955987 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:43.960586 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:43.964550 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:43.969595 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.008680 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.013656 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.018263 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.022903 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.027333 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.031055 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.075669 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.080517 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.085169 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.089351 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.094146 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.098033 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.136550 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.141508 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.152751 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.157216 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.161751 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.165313 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.187935 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.192776 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.206171 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.210588 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.215512 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.219301 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.231449 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.236306 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.249726 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.253923 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.258008 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.261792 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.294174 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.298947 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.310712 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.315128 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.319648 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.323460 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.356696 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.372153 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.377052 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.381121 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.384887 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.388282 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.421198 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.426081 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.430885 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.435483 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.439703 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.443812 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.448816 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.453714 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.458245 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.462779 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.466809 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.470496 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.523449 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.536772 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.541491 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.546495 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.557859 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.561644 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.575993 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.580994 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.591201 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.595506 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.600093 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.604205 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.608836 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.613646 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.618337 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.622513 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.626628 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.629867 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.652084 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.657073 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.661747 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.666014 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.670153 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.674433 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.700671 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.705529 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.710182 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.714591 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.719433 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.723084 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.755494 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.760574 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.769030 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.773240 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.777890 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.781868 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.786628 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.791626 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.801250 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.805718 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.810263 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.815060 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.830438 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.835208 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.840070 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.844478 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.851982 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.856078 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.890485 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.895154 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.900013 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.904286 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.909162 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.913251 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.944316 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.949226 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.963650 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.968013 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.972459 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:44.976485 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.007665 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.012582 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.017588 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.021432 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.025667 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.029207 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.053981 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.065023 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.070245 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.074647 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.079297 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.083646 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.112340 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.117327 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.121996 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.126349 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.131258 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.135079 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.164702 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.169696 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.182823 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.187099 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.191617 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.195460 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.216195 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.227931 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.232549 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.236384 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.240157 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.245035 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.274339 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.278685 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.282895 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.286753 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.291337 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.295103 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.322784 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.327732 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.332416 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.336604 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.340990 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.345146 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.374706 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.379707 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.395306 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.399628 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.404114 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.408042 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.422613 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.427829 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.437812 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.442390 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.447261 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.451085 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.471766 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.476824 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.483549 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.487804 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.492264 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.495982 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.531835 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.544451 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.549048 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.552935 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.557219 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.560957 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.593941 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.599203 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.614028 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.618664 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.625537 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.629442 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.642442 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.647596 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.657712 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.662508 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.666949 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.670863 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.689850 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.694994 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.699789 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.703997 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.708303 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.712446 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.741615 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.748645 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.752986 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.757462 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.762040 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.766491 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.804125 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.820172 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.825187 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.829496 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.833983 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.837847 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.851887 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.862981 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.868473 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.873142 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.877791 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.882620 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.897837 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.902862 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.907538 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.911979 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.916559 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.920499 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.971918 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.976913 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.987304 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:45.991485 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.000153 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.004015 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.023050 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.027976 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.036682 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.041055 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.045905 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.049963 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.054871 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.059877 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.064972 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.069139 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.073730 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.077703 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.099512 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.110923 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.115822 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.120382 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.124207 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.127833 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.179498 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.184529 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.189326 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.193681 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.198768 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.202604 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.233342 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.238276 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.247493 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.252292 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.256965 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.261309 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.273433 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.278822 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.286884 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.291684 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.296063 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.299668 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.320779 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.325699 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.330284 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.334662 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.338676 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.343207 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.368309 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.373264 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.378196 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.382442 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.386881 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.390679 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.423177 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.428246 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.441811 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.446487 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.451266 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.455279 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.485592 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.490197 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.495027 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.498788 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.503254 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.507443 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.545489 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.550622 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.563559 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.568212 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.572652 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.576497 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.608291 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.622079 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.626816 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.631145 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.636071 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.640070 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.672679 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.677838 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.686448 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.691077 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.695830 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.699759 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.704493 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.715319 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.720571 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.724545 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.728606 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.732945 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.763767 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.768781 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.773470 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.778045 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.782768 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.786631 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.820226 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.827847 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.832336 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.837028 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.841821 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.846322 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.882728 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.898918 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.903905 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.908259 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.913454 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.917550 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.930693 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.935637 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.950136 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.954539 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.958646 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.962581 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.978173 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.983568 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.988311 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.992654 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:46.996862 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.000698 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.040803 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.046453 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.057123 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.061497 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.066260 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.070239 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.101889 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.106983 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.116781 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.121151 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.125611 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.129547 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.134633 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.139605 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.153257 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.157840 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.175976 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.180589 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.192948 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.207406 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.212057 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.216585 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.221077 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.224588 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.259741 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.264602 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.269185 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.273482 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.278552 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.282609 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.311851 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.318492 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.326940 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.331271 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.335487 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.339990 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.345179 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.350143 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.365961 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.371005 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.375349 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.379687 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.400569 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.409460 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.414126 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.418666 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.422595 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.426628 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.466846 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.471692 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.476778 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.481424 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.486490 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.490530 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.521935 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.526678 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.538924 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.543851 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.548352 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.552520 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.572393 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.577505 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.582558 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.586058 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.590731 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.594684 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.617139 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.628329 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.642440 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.646947 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.651035 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.654213 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.696831 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.709354 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.714304 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.718731 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.723610 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.727453 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.761325 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.766245 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.774878 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.779399 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.784023 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.787995 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.793042 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.797854 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.806317 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.810778 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.815360 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.820071 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.836847 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.847584 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.852108 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.856263 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.860651 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.864235 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.899031 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.906750 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.911550 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.916511 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.920753 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.924200 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.961417 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.966482 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.977237 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.981811 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.986468 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.990332 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.995303 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:47.999966 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.010880 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.015060 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.020164 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.023840 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.032798 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.043092 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.047967 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.051924 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.055580 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.059207 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.085933 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.090677 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.102119 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.106374 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.111253 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.115312 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.150113 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.155072 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.163067 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.167220 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.171913 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.175920 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.181261 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.185974 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.198721 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.202926 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.207486 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.211798 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.224729 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.236500 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.240968 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.245467 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.249624 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.253308 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.288789 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.293670 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.301056 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.305381 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.310386 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.314590 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.350077 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.356779 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.365024 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.369500 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.373551 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.377859 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.383179 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.388219 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.404320 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.411094 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.416055 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.419892 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.441257 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.446528 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.458926 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.463360 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.467615 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.471249 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.515229 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.527446 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.531886 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.535961 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.540276 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.545176 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.580517 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.585487 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.595730 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.599970 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.604077 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.607965 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.613188 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.618033 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.624190 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.629052 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.633279 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.638204 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.654979 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.660049 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.665021 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.669462 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.673737 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.678273 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.705051 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.709953 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.722679 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.727103 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.731738 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.735607 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.769440 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.774564 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.781483 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.785501 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.789515 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.793290 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.798047 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.810118 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.817325 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.821787 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.826026 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.829814 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.843983 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.848862 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.865490 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.869604 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.873331 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.877846 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.924248 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.929448 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.963042 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.967583 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.976612 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:48.980971 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.009902 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.025774 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.030573 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.035133 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.039777 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.044025 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.055088 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.060219 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.079487 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.083890 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.089661 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.094050 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.112093 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.117030 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.121762 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.125842 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.130042 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.134045 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.187794 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.192961 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.197472 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.201838 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.206690 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.211111 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.249188 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.254284 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.263407 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.268037 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.272350 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.276323 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.281639 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.291919 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.297874 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.302161 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.310357 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.314731 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.359183 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.363931 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.368584 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.372676 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.377075 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.381236 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.417055 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.422173 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.426800 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.431527 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.436228 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.440159 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.469251 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.476080 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.482016 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.486005 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.489811 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.493182 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.500396 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.505106 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.518894 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.523511 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.528843 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.532784 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.549192 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.581259 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.585852 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.590441 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.594867 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.598589 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.644453 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.649600 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.654172 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.659274 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.672518 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.676495 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.709860 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.715091 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.726980 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.731272 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.735532 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.739332 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.759261 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.764023 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.768628 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.773004 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.777924 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.782081 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.805336 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.830836 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.843744 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.848461 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.852977 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.856921 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.905118 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.918737 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.923461 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.927852 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.943016 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.947454 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:49.979413 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.002740 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.007748 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.011974 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.016431 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.019990 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.025025 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.029836 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.049486 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.054073 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.058950 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.062857 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.068978 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.085812 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.090777 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.095704 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.100020 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.104055 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.154869 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.159999 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.174391 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.179701 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.216783 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.220886 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.249977 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.266595 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.273532 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.278420 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.282906 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.286968 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.298986 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.304041 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.318786 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.323147 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.328273 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.332217 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.340875 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.352946 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.373988 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.379081 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.383682 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.388196 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.438229 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.450353 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.455177 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.459582 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.464449 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.468663 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.499563 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.523845 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.528640 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.532679 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.537071 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.541048 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.546484 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.551341 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.563345 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.567947 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.584370 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.588019 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.614787 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.619835 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.624565 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.629032 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.633092 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.636895 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.665501 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.670431 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.675214 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.680450 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.716612 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.720071 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.749956 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.756681 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.763574 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.768064 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.772499 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.776324 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.781686 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.786093 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.809104 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.813821 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.818502 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.822433 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.845300 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.850297 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.854958 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.859483 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.864075 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.867971 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.914972 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.938106 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.942780 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.947418 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.951725 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.955085 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:50.990203 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.013776 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.018623 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.022920 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.027179 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.030930 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.036120 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.040727 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.052084 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.056543 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.074336 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.079608 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.095620 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.105779 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.110603 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.115505 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.119743 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.122875 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.175629 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.180606 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.185384 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.189966 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.194106 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.197395 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.229644 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.273240 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.278114 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.282320 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.286222 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.290052 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.296381 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.301075 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.313202 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.318294 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.334870 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.338879 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.366150 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.370563 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.374855 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.379036 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.383326 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.387274 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.414874 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.419760 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.424719 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.429451 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.443322 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.447549 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.480204 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.503737 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.508596 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.513295 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.517771 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.521674 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.532598 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.537354 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.549900 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.554475 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.559879 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.563860 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.578975 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.595597 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.600451 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.604801 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.609171 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.613774 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.665464 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.688579 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.693294 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.697793 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.702663 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.706691 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.739755 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.824720 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.829668 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.833948 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.838244 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.842116 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.852214 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.857079 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.869453 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.873953 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.879213 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.883225 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.900038 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.904854 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.909485 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.913757 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.918111 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.921878 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:51.966423 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.008797 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.013560 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.018060 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.022535 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.026294 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.060967 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.084480 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.089161 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.093497 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.097985 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.101728 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.106724 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.111806 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.123895 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.128441 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.159286 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.163115 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.174352 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.203326 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.207887 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.212174 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.216791 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.220383 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.266350 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.271207 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.276019 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.280205 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.284743 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.288846 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.321481 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.345107 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.349932 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.354412 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.358774 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.362256 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.378801 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.383811 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.388504 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.392479 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.396724 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.401037 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.414565 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.419310 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.432834 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.437414 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.441487 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.445157 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.496868 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.539799 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.552090 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.556595 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.561474 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.565764 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.601390 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.624959 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.629996 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.634189 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.638462 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.642234 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.646991 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.652124 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.665873 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.670727 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.689854 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.694257 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.705283 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.716733 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.721879 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.726230 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.731124 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.735175 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.786663 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.810058 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.814675 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.819334 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.824043 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.828436 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.861974 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.885490 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.890256 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.894651 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.898931 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.902591 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.907720 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.912487 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.917294 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.921258 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.925537 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.930576 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.951602 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.956471 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.962191 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.966613 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.970771 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:52.974783 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.037189 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.060138 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.064856 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.069263 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.073477 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.076907 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.111405 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.155966 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.160733 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.165359 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.170023 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.173458 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.183616 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.188129 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.193317 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.197669 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.202567 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.205809 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.235787 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.240713 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.245345 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.249699 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.254473 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.258251 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.307657 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.350919 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.355455 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.359754 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.363742 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.367587 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.402247 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.425686 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.430379 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.434654 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.439060 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.443104 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.452506 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.457066 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.473415 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.477510 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.482263 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.485947 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.504664 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.509322 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.513849 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.517956 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.522410 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.526263 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.587587 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.610533 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.615000 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.619107 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.623628 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.628233 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.662863 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.686383 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.691116 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.695708 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.700492 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.703928 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.713258 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.718291 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.724015 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.728605 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.733584 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.737018 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.764082 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.769156 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.780913 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.785295 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.789596 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.793607 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.848156 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.871215 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.875978 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.880519 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.885243 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.889245 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.922563 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.966068 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.970697 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.975242 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.979805 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.983823 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.990786 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:53.995753 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.001966 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.006455 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.011852 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.015602 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.020893 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.025960 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.030795 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.034814 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.039202 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.042825 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.087768 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.141624 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.146242 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.150560 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.155089 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.159000 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.193192 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.216557 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.221427 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.225680 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.230489 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.234393 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.243198 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.247908 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.256845 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.261936 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.266621 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.271203 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.292844 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.297815 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.302448 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.306605 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.310908 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.314682 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.378458 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.401574 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.406204 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.410690 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.415597 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.419797 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.452677 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.497469 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.502127 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.506126 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.510603 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.514558 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.521030 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.525957 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.530814 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.534914 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.539074 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.543253 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.577479 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.582562 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.587296 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.591697 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.596058 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.600113 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.649118 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.671877 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.676540 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.680926 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.685452 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.689275 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.723349 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.747001 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.751881 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.756696 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.761586 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.765585 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.773470 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.778536 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.787919 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.793154 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.808508 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.812623 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.823119 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.833625 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.838178 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.842566 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.846494 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.850463 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.908677 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.931847 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.936350 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.940070 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.944064 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.947746 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:54.984025 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.007449 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.012058 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.016623 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.020763 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.024553 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.034098 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.038874 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.049139 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.053612 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.071401 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.075159 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.131751 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.136638 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.141723 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.145998 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.150074 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.154540 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.179349 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.184398 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.189191 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.193458 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.197918 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.201887 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.233481 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.242606 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.251737 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.256274 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.261272 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.265745 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.278295 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.283162 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.300308 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.305004 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.309462 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.313851 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.327598 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.355676 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.360507 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.365308 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.370261 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.373693 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.428854 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.433939 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.438619 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.442769 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.447403 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.451421 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.484045 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.507493 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.512496 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.517095 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.521701 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.525608 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.530942 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.535944 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.540961 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.545400 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.549880 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.553806 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.560902 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.595928 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.610782 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.615809 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.619923 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.623747 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.669277 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.692397 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.697600 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.701796 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.706025 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.709778 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.743491 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.788152 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.792998 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.797830 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.801931 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.805760 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.810545 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.815617 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.822923 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.827720 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.832809 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.836313 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.853506 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.858294 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.863326 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.868082 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.872544 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.876653 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.929831 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.972763 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.977385 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.981310 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.985506 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:55.989247 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.024463 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.047604 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.052519 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.057266 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.061997 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.065541 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.071678 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.076313 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.087215 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.092134 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.097179 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.101837 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.115361 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.120451 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.125257 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.129607 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.133510 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.137007 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.199721 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.223007 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.227879 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.232233 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.236556 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.240288 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.274732 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.298217 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.302782 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.307058 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.311510 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.315699 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.325126 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.330542 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.339729 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.344548 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.349391 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.353845 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.374554 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.379399 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.383902 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.388477 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.393076 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.397443 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.460279 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.483103 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.487912 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.492590 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.497706 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.501646 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.534382 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.577932 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.582691 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.587080 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.591686 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.595815 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.602375 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.607052 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.618432 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.623222 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.627727 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.631855 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.654298 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.659270 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.673952 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.678382 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.682272 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.686011 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.749790 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.773273 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.777925 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.782326 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.786798 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.790888 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.825247 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.848713 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.853445 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.857957 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.862484 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.866415 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.872180 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.877193 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.887844 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.892705 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.897396 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.901257 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.928010 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.932901 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.937447 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.941946 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.946046 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:56.949912 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.010387 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.033438 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.038174 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.042498 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.047266 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.051115 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.084688 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.129346 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.134112 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.138535 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.142951 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.146804 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.158388 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.163249 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.174035 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.178565 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.183593 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.187283 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.204672 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.209447 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.213916 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.218151 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.222453 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.226353 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.281318 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.304019 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.308701 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.312924 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.317518 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.321343 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.355493 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.378866 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.383804 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.388358 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.393049 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.397125 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.402672 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.407440 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.418578 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.423136 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.440159 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.444035 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.468645 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.473502 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.483042 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.487233 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.491586 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.495888 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.550787 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.558227 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.562892 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.567493 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.571957 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.575639 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.606007 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.629593 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.634291 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.638743 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.643073 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.647121 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.655541 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.660457 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.671871 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.676473 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.680978 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.685447 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.708925 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.713865 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.718409 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.723203 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.727622 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.731496 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.791327 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.796478 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.804527 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.808531 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.812788 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.816620 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.855292 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.899044 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.903913 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.908237 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.912203 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.916214 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.925295 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.930166 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.941578 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.946289 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.963755 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.967853 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.979668 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.986746 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.991680 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:57.996282 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.000623 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.004343 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.050696 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.074307 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.078926 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.083572 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.088156 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.092393 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.126403 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.149790 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.154528 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.159081 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.163833 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.167977 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.178322 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.182983 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.194337 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.199248 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.214737 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.218736 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.261564 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.266508 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.271174 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.275892 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.280208 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.284079 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.341777 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.346855 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.351532 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.355789 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.360621 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.364863 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.395885 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.406285 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.411751 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.416179 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.421329 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.425738 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.435706 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.440591 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.456136 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.460895 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.466492 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.470446 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.489971 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.518111 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.522649 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.527161 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.531867 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.535784 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.582224 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.604903 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.609586 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.613870 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.618691 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.622637 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.656505 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.679630 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.684550 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.688859 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.693213 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.697943 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.703471 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.708139 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.725776 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.730481 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.735801 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.739661 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.745047 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.770137 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.800675 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.805294 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.809334 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.813275 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.862051 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.885051 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.889689 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.893746 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.898059 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.902035 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.937284 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.960926 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.965983 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.970284 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.974259 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.977893 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:58.998008 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.003188 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.008084 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.012358 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.017455 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.021331 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.047002 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.052012 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.056679 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.061287 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.066404 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.070446 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.122550 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.145617 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.150341 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.154982 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.160008 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.164138 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.196850 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.240458 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.245250 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.249506 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.253895 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.257782 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.264683 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.269454 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.281215 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.286211 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.290841 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.295718 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.320873 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.325678 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.330800 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.334819 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.339272 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.343042 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.392384 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.415516 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.420149 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.424756 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.429508 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.433532 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.467446 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.490853 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.501058 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.505555 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.520514 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.524485 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.537361 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.542205 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.551343 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.555874 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.560760 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.566187 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.586913 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.592085 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.605918 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.610227 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.614440 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.618263 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.663100 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.674471 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.678982 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.683575 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.688448 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.692457 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.727186 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.742417 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.753624 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.758119 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.762924 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.766995 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.778813 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.784306 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.804906 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.809508 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.813744 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.817733 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.823360 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.828405 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.833236 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.837335 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.841817 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.845728 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.904498 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.916234 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.920772 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.925255 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.930312 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.934309 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.967500 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.990983 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:34:59.995767 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.000183 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.004061 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.007692 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.012588 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.017478 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.033676 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.037748 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.042327 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.047075 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.068315 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.079476 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.084584 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.089024 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.093443 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.097730 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.142582 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.147614 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.152226 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.156886 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.161890 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.165962 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.197598 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.221233 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.226138 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.230973 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.235454 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.239410 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.255185 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.260167 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.265281 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.269607 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.275144 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.278860 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.306600 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.311899 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.325938 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.330695 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.335239 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.339067 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.403190 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.446188 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.451034 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.455509 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.460425 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.464467 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.497598 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.521185 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.526091 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.530756 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.534440 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.537881 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.542685 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.547430 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.564989 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.569461 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.597114 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.601065 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.622979 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.635590 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.639983 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.644285 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.648496 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.652321 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.683030 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.687885 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.692914 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.697672 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.701915 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.705877 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.738080 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.781641 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.786499 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.790679 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.794708 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.798550 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.803778 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:35:00.808648 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = -1 EIO (Input/output error) 02:35:00.812672 write(2, "xfs_repair: libxfs_device_zero w"..., 64) = 64 02:35:00.812846 exit_group(1) = ? 02:35:00.814061 +++ exited with 1 +++ --------------040608040302020006050206 Content-Type: text/plain; charset=UTF-8; name="strace_2.3.txt" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="strace_2.3.txt" 02:35:11.455004 execve("/sbin/xfs_repair", ["xfs_repair", "/dev/md2"], [/* 51 vars */]) = 0 02:35:11.455894 brk(NULL) = 0xf47000 02:35:11.456016 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fca489fc000 02:35:11.456111 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) 02:35:11.456223 open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 02:35:11.456304 fstat(3, {st_mode=S_IFREG|0644, st_size=246250, ...}) = 0 02:35:11.456534 mmap(NULL, 246250, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fca489b8000 02:35:11.456624 close(3) = 0 02:35:11.456733 open("/lib64/libxfs.so.0", O_RDONLY|O_CLOEXEC) = 3 02:35:11.456823 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300\325\0\0\0\0\0\0"..., 832) = 832 02:35:11.456899 fstat(3, {st_mode=S_IFREG|0755, st_size=370168, ...}) = 0 02:35:11.456975 mmap(NULL, 2466056, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fca48578000 02:35:11.457046 mprotect(0x7fca485ce000, 2097152, PROT_NONE) = 0 02:35:11.457121 mmap(0x7fca487ce000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x56000) = 0x7fca487ce000 02:35:11.457221 mmap(0x7fca487d2000, 264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fca487d2000 02:35:11.457310 close(3) = 0 02:35:11.457431 open("/lib64/libxlog.so.0", O_RDONLY|O_CLOEXEC) = 3 02:35:11.457517 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\360\21\0\0\0\0\0\0"..., 832) = 832 02:35:11.457589 fstat(3, {st_mode=S_IFREG|0755, st_size=22512, ...}) = 0 02:35:11.457661 mmap(NULL, 2118192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fca48370000 02:35:11.457732 mprotect(0x7fca48375000, 2093056, PROT_NONE) = 0 02:35:11.457802 mmap(0x7fca48574000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x4000) = 0x7fca48574000 02:35:11.457892 close(3) = 0 02:35:11.457970 open("/lib64/libuuid.so.1", O_RDONLY|O_CLOEXEC) = 3 02:35:11.458045 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@\26\0\0\0\0\0\0"..., 832) = 832 02:35:11.458115 fstat(3, {st_mode=S_IFREG|0755, st_size=18816, ...}) = 0 02:35:11.458185 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fca489f8000 02:35:11.458268 mmap(NULL, 2113952, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fca48168000 02:35:11.458338 mprotect(0x7fca4816c000, 2093056, PROT_NONE) = 0 02:35:11.458443 mmap(0x7fca4836b000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0x7fca4836b000 02:35:11.458530 close(3) = 0 02:35:11.458605 open("/lib64/librt.so.1", O_RDONLY|O_CLOEXEC) = 3 02:35:11.458681 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260!\0\0\0\0\0\0"..., 832) = 832 02:35:11.458751 fstat(3, {st_mode=S_IFREG|0755, st_size=31432, ...}) = 0 02:35:11.458821 mmap(NULL, 2128864, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fca47f60000 02:35:11.458891 mprotect(0x7fca47f66000, 2097152, PROT_NONE) = 0 02:35:11.458967 mmap(0x7fca48166000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x7fca48166000 02:35:11.459054 close(3) = 0 02:35:11.459130 open("/lib64/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3 02:35:11.459205 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340`\0\0\0\0\0\0"..., 832) = 832 02:35:11.459275 fstat(3, {st_mode=S_IFREG|0755, st_size=133920, ...}) = 0 02:35:11.459349 mmap(NULL, 2208976, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fca47d40000 02:35:11.459465 mprotect(0x7fca47d57000, 2093056, PROT_NONE) = 0 02:35:11.459539 mmap(0x7fca47f56000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16000) = 0x7fca47f56000 02:35:11.459621 mmap(0x7fca47f58000, 13520, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fca47f58000 02:35:11.459683 close(3) = 0 02:35:11.459758 open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 02:35:11.459813 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\7\2\0\0\0\0\0"..., 832) = 832 02:35:11.459888 fstat(3, {st_mode=S_IFREG|0755, st_size=1664768, ...}) = 0 02:35:11.459947 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fca489f7000 02:35:11.460010 mmap(NULL, 3771992, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fca479a0000 02:35:11.460070 mprotect(0x7fca47b2f000, 2097152, PROT_NONE) = 0 02:35:11.460122 mmap(0x7fca47d2f000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x18f000) = 0x7fca47d2f000 02:35:11.460181 mmap(0x7fca47d35000, 15960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fca47d35000 02:35:11.460239 close(3) = 0 02:35:11.460333 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fca489f6000 02:35:11.460410 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fca489b6000 02:35:11.460483 arch_prctl(ARCH_SET_FS, 0x7fca489b6780) = 0 02:35:11.460671 mprotect(0x7fca47d2f000, 16384, PROT_READ) = 0 02:35:11.460743 mprotect(0x7fca47f56000, 4096, PROT_READ) = 0 02:35:11.460806 mprotect(0x7fca48166000, 4096, PROT_READ) = 0 02:35:11.460861 mprotect(0x7fca4836b000, 4096, PROT_READ) = 0 02:35:11.460952 mprotect(0x7fca487ce000, 4096, PROT_READ) = 0 02:35:11.461008 mprotect(0x7fca48574000, 4096, PROT_READ) = 0 02:35:11.461088 mprotect(0x639000, 4096, PROT_READ) = 0 02:35:11.461146 mprotect(0x7fca489f9000, 4096, PROT_READ) = 0 02:35:11.461199 munmap(0x7fca489b8000, 246250) = 0 02:35:11.461268 set_tid_address(0x7fca489b6a50) = 31591 02:35:11.461314 set_robust_list(0x7fca489b6a60, 24) = 0 02:35:11.461394 rt_sigaction(SIGRTMIN, {0x7fca47d45b88, [], SA_RESTORER|SA_SIGINFO, 0x7fca47d50ae0}, NULL, 8) = 0 02:35:11.461448 rt_sigaction(SIGRT_1, {0x7fca47d45c10, [], SA_RESTORER|SA_RESTART|SA_SIGINFO, 0x7fca47d50ae0}, NULL, 8) = 0 02:35:11.461499 rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0 02:35:11.461562 getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0 02:35:11.461776 brk(NULL) = 0xf47000 02:35:11.461831 brk(0xf68000) = 0xf68000 02:35:11.461889 open("/usr/lib64/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3 02:35:11.461964 fstat(3, {st_mode=S_IFREG|0644, st_size=3832592, ...}) = 0 02:35:11.462017 mmap(NULL, 3832592, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fca475f8000 02:35:11.462083 close(3) = 0 02:35:11.462231 open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3 02:35:11.462283 fstat(3, {st_mode=S_IFREG|0644, st_size=2997, ...}) = 0 02:35:11.462328 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fca489f5000 02:35:11.462396 read(3, "# Locale name alias data base.\n#"..., 4096) = 2997 02:35:11.462499 read(3, "", 4096) = 0 02:35:11.462550 close(3) = 0 02:35:11.462597 munmap(0x7fca489f5000, 4096) = 0 02:35:11.462678 open("/usr/share/locale/en_US.utf8/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 02:35:11.462735 open("/usr/share/locale/en_US/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 02:35:11.462789 open("/usr/share/locale/en.utf8/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 02:35:11.462842 open("/usr/share/locale/en/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 02:35:11.462942 getcwd("/root/HPT/makeself-22854-20150421040904/product/rr272x/linux", 4096) = 61 02:35:11.463009 stat("/dev/md2", {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 02:35:11.463070 stat("/dev/md2", {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 02:35:11.463131 ustat(0x902, 0x7ffc25867180) = -1 EINVAL (Invalid argument) 02:35:11.463186 open("/dev/md2", O_RDONLY) = 3 02:35:11.463246 stat("/dev/md2", {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 02:35:11.463299 stat("/dev/md2", {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 02:35:11.463352 ustat(0x902, 0x7ffc25867180) = -1 EINVAL (Invalid argument) 02:35:11.463419 open("/dev/md2", O_RDWR|O_EXCL|O_DIRECT) = 4 02:35:11.463478 fstat(4, {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 02:35:11.463538 fstat(4, {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 02:35:11.463590 ioctl(4, BLKGETSIZE64, [6000790732800]) = 0 02:35:11.463642 ioctl(4, BLKSSZGET, [512]) = 0 02:35:11.463694 chdir("/root/HPT/makeself-22854-20150421040904/product/rr272x/linux") = 0 02:35:11.463859 close(3) = 0 02:35:11.463912 getrlimit(RLIMIT_FSIZE, {rlim_cur=RLIM64_INFINITY, rlim_max=RLIM64_INFINITY}) = 0 02:35:11.463984 write(2, "Phase 1 - find and verify superb"..., 40) = 40 02:35:11.464077 mmap(NULL, 528384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fca48935000 02:35:11.464130 mmap(NULL, 528384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fca488b4000 02:35:11.464756 lseek(4, 0, SEEK_SET) = 0 02:35:11.464809 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 524288) = 524288 02:35:11.470294 munmap(0x7fca488b4000, 528384) = 0 02:35:11.470427 brk(0xf9a000) = 0xf9a000 02:35:11.470621 lseek(4, 187524186112, SEEK_SET) = 187524186112 02:35:11.470664 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.493040 lseek(4, 375048372224, SEEK_SET) = 375048372224 02:35:11.493101 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.506858 lseek(4, 562572558336, SEEK_SET) = 562572558336 02:35:11.506909 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.517673 lseek(4, 750096744448, SEEK_SET) = 750096744448 02:35:11.517735 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.529179 lseek(4, 937620930560, SEEK_SET) = 937620930560 02:35:11.529267 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.538804 lseek(4, 1125145116672, SEEK_SET) = 1125145116672 02:35:11.538856 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.552501 lseek(4, 1312669302784, SEEK_SET) = 1312669302784 02:35:11.552580 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.564724 lseek(4, 1500193488896, SEEK_SET) = 1500193488896 02:35:11.564773 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.574185 lseek(4, 1687717675008, SEEK_SET) = 1687717675008 02:35:11.574237 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.584132 lseek(4, 1875241861120, SEEK_SET) = 1875241861120 02:35:11.584218 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.600381 lseek(4, 2062766047232, SEEK_SET) = 2062766047232 02:35:11.600492 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.608695 lseek(4, 2250290233344, SEEK_SET) = 2250290233344 02:35:11.608749 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.625991 lseek(4, 2437814419456, SEEK_SET) = 2437814419456 02:35:11.626054 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.635638 lseek(4, 2625338605568, SEEK_SET) = 2625338605568 02:35:11.635732 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.653360 lseek(4, 2812862791680, SEEK_SET) = 2812862791680 02:35:11.653472 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.669601 lseek(4, 3000386977792, SEEK_SET) = 3000386977792 02:35:11.669657 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.683542 lseek(4, 3187911163904, SEEK_SET) = 3187911163904 02:35:11.683631 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.698962 lseek(4, 3375435350016, SEEK_SET) = 3375435350016 02:35:11.699050 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.710146 lseek(4, 3562959536128, SEEK_SET) = 3562959536128 02:35:11.710231 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.721535 lseek(4, 3750483722240, SEEK_SET) = 3750483722240 02:35:11.721614 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.738689 lseek(4, 3938007908352, SEEK_SET) = 3938007908352 02:35:11.738776 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.749944 lseek(4, 4125532094464, SEEK_SET) = 4125532094464 02:35:11.750030 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.761220 lseek(4, 4313056280576, SEEK_SET) = 4313056280576 02:35:11.761301 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.774521 lseek(4, 4500580466688, SEEK_SET) = 4500580466688 02:35:11.774609 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.793742 lseek(4, 4688104652800, SEEK_SET) = 4688104652800 02:35:11.793817 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.809154 lseek(4, 4875628838912, SEEK_SET) = 4875628838912 02:35:11.809231 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.823183 lseek(4, 5063153025024, SEEK_SET) = 5063153025024 02:35:11.823272 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.836457 lseek(4, 5250677211136, SEEK_SET) = 5250677211136 02:35:11.836547 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.848883 lseek(4, 5438201397248, SEEK_SET) = 5438201397248 02:35:11.848957 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.858194 lseek(4, 5625725583360, SEEK_SET) = 5625725583360 02:35:11.858270 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.877390 lseek(4, 5813249769472, SEEK_SET) = 5813249769472 02:35:11.877488 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.890956 lseek(4, 6000773955584, SEEK_SET) = 6000773955584 02:35:11.891045 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 02:35:11.910541 munmap(0x7fca48935000, 528384) = 0 02:35:11.910671 lseek(4, 0, SEEK_SET) = 0 02:35:11.910738 read(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 32768) = 32768 02:35:11.911352 fstat(4, {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 02:35:11.911520 pread64(4, "\0\200P\271\0\210\377\377\0\0\0\0\0\0\0\0\1\0M$\0\0\0\0\1\0\0\0\0\0\0\0"..., 512, 6000790732288) = 512 02:35:11.912109 open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3 02:35:11.912210 read(3, "0-31\n", 8192) = 5 02:35:11.912292 close(3) = 0 02:35:11.912375 rt_sigprocmask(SIG_BLOCK, [HUP ALRM], NULL, 8) = 0 02:35:11.912462 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca46df7000 02:35:11.912551 mprotect(0x7fca46df7000, 4096, PROT_NONE) = 0 02:35:11.912627 clone(child_stack=0x7fca475f6f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca475f79d0, tls=0x7fca475f7700, child_tidptr=0x7fca475f79d0) = 31592 02:35:11.912772 write(2, " - reporting progress in "..., 56) = 56 02:35:11.913011 sysinfo({uptime=352211, loads=[46240, 52192, 90656], totalram=67543732224, freeram=64590876672, sharedram=1269760, bufferram=3579904, totalswap=10737414144, freeswap=10737414144, procs=655, totalhigh=0, freehigh=0, mem_unit=1}) = 0 02:35:11.913098 getrlimit(RLIMIT_AS, {rlim_cur=RLIM64_INFINITY, rlim_max=RLIM64_INFINITY}) = 0 02:35:11.913168 mmap(NULL, 48685056, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fca43f89000 02:35:11.939145 write(2, "Phase 2 - using internal log\n", 29) = 29 02:35:11.939330 write(2, " - zero log...\n", 22) = 22 02:35:11.939445 pread64(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512, 3000387010560) = 512 02:35:11.940069 write(2, "totally zeroed log", 18) = 18 02:35:11.940154 write(2, "\n", 1) = 1 02:35:11.940235 pread64(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512, 3000387010560) = 512 02:35:11.940456 write(2, " - scan filesystem freesp"..., 54) = 54 02:35:11.940541 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca43788000 02:35:11.940624 mprotect(0x7fca43788000, 4096, PROT_NONE) = 0 02:35:11.940696 clone(child_stack=0x7fca43f87f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca43f889d0, tls=0x7fca43f88700, child_tidptr=0x7fca43f889d0) = 31593 02:35:11.940803 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca42f87000 02:35:11.940875 mprotect(0x7fca42f87000, 4096, PROT_NONE) = 0 02:35:11.940936 clone(child_stack=0x7fca43786f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca437879d0, tls=0x7fca43787700, child_tidptr=0x7fca437879d0) = 31594 02:35:11.941025 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca42786000 02:35:11.941094 mprotect(0x7fca42786000, 4096, PROT_NONE) = 0 02:35:11.941156 clone(child_stack=0x7fca42f85f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca42f869d0, tls=0x7fca42f86700, child_tidptr=0x7fca42f869d0) = 31595 02:35:11.941233 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca41f85000 02:35:11.941299 mprotect(0x7fca41f85000, 4096, PROT_NONE) = 0 02:35:11.941360 clone(child_stack=0x7fca42784f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca427859d0, tls=0x7fca42785700, child_tidptr=0x7fca427859d0) = 31596 02:35:11.941494 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca41784000 02:35:11.941565 mprotect(0x7fca41784000, 4096, PROT_NONE) = 0 02:35:11.941627 clone(child_stack=0x7fca41f83f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca41f849d0, tls=0x7fca41f84700, child_tidptr=0x7fca41f849d0) = 31597 02:35:11.941711 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca40f83000 02:35:11.941779 mprotect(0x7fca40f83000, 4096, PROT_NONE) = 0 02:35:11.941841 clone(child_stack=0x7fca41782f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca417839d0, tls=0x7fca41783700, child_tidptr=0x7fca417839d0) = 31598 02:35:11.941930 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca40782000 02:35:11.941999 mprotect(0x7fca40782000, 4096, PROT_NONE) = 0 02:35:11.942062 clone(child_stack=0x7fca40f81f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca40f829d0, tls=0x7fca40f82700, child_tidptr=0x7fca40f829d0) = 31599 02:35:11.942142 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3ff81000 02:35:11.942211 mprotect(0x7fca3ff81000, 4096, PROT_NONE) = 0 02:35:11.942273 clone(child_stack=0x7fca40780f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca407819d0, tls=0x7fca40781700, child_tidptr=0x7fca407819d0) = 31600 02:35:11.942388 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3f780000 02:35:11.942472 mprotect(0x7fca3f780000, 4096, PROT_NONE) = 0 02:35:11.942536 clone(child_stack=0x7fca3ff7ff70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3ff809d0, tls=0x7fca3ff80700, child_tidptr=0x7fca3ff809d0) = 31601 02:35:11.942617 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3ef7f000 02:35:11.942688 mprotect(0x7fca3ef7f000, 4096, PROT_NONE) = 0 02:35:11.942751 clone(child_stack=0x7fca3f77ef70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3f77f9d0, tls=0x7fca3f77f700, child_tidptr=0x7fca3f77f9d0) = 31602 02:35:11.942838 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3e77e000 02:35:11.942907 mprotect(0x7fca3e77e000, 4096, PROT_NONE) = 0 02:35:11.942968 clone(child_stack=0x7fca3ef7df70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3ef7e9d0, tls=0x7fca3ef7e700, child_tidptr=0x7fca3ef7e9d0) = 31603 02:35:11.943049 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3df7d000 02:35:11.943122 mprotect(0x7fca3df7d000, 4096, PROT_NONE) = 0 02:35:11.943184 clone(child_stack=0x7fca3e77cf70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3e77d9d0, tls=0x7fca3e77d700, child_tidptr=0x7fca3e77d9d0) = 31604 02:35:11.943273 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3d77c000 02:35:11.943342 mprotect(0x7fca3d77c000, 4096, PROT_NONE) = 0 02:35:11.943423 clone(child_stack=0x7fca3df7bf70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3df7c9d0, tls=0x7fca3df7c700, child_tidptr=0x7fca3df7c9d0) = 31605 02:35:11.943503 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3cf7b000 02:35:11.943572 mprotect(0x7fca3cf7b000, 4096, PROT_NONE) = 0 02:35:11.943642 clone(child_stack=0x7fca3d77af70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3d77b9d0, tls=0x7fca3d77b700, child_tidptr=0x7fca3d77b9d0) = 31606 02:35:11.943733 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3c77a000 02:35:11.943802 mprotect(0x7fca3c77a000, 4096, PROT_NONE) = 0 02:35:11.943866 clone(child_stack=0x7fca3cf79f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3cf7a9d0, tls=0x7fca3cf7a700, child_tidptr=0x7fca3cf7a9d0) = 31607 02:35:11.943946 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3bf79000 02:35:11.944016 mprotect(0x7fca3bf79000, 4096, PROT_NONE) = 0 02:35:11.944078 clone(child_stack=0x7fca3c778f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3c7799d0, tls=0x7fca3c779700, child_tidptr=0x7fca3c7799d0) = 31608 02:35:11.944165 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3b778000 02:35:11.944236 mprotect(0x7fca3b778000, 4096, PROT_NONE) = 0 02:35:11.944297 clone(child_stack=0x7fca3bf77f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3bf789d0, tls=0x7fca3bf78700, child_tidptr=0x7fca3bf789d0) = 31609 02:35:11.944392 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3af77000 02:35:11.944465 mprotect(0x7fca3af77000, 4096, PROT_NONE) = 0 02:35:11.944527 clone(child_stack=0x7fca3b776f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3b7779d0, tls=0x7fca3b777700, child_tidptr=0x7fca3b7779d0) = 31610 02:35:11.944618 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3a776000 02:35:11.944692 mprotect(0x7fca3a776000, 4096, PROT_NONE) = 0 02:35:11.944756 clone(child_stack=0x7fca3af75f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3af769d0, tls=0x7fca3af76700, child_tidptr=0x7fca3af769d0) = 31611 02:35:11.944839 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca39f75000 02:35:11.944905 mprotect(0x7fca39f75000, 4096, PROT_NONE) = 0 02:35:11.944964 clone(child_stack=0x7fca3a774f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3a7759d0, tls=0x7fca3a775700, child_tidptr=0x7fca3a7759d0) = 31612 02:35:11.945057 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca39774000 02:35:11.945125 mprotect(0x7fca39774000, 4096, PROT_NONE) = 0 02:35:11.945188 clone(child_stack=0x7fca39f73f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca39f749d0, tls=0x7fca39f74700, child_tidptr=0x7fca39f749d0) = 31613 02:35:11.945271 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca38f73000 02:35:11.945340 mprotect(0x7fca38f73000, 4096, PROT_NONE) = 0 02:35:11.945424 clone(child_stack=0x7fca39772f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca397739d0, tls=0x7fca39773700, child_tidptr=0x7fca397739d0) = 31614 02:35:11.945514 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca38772000 02:35:11.945583 mprotect(0x7fca38772000, 4096, PROT_NONE) = 0 02:35:11.945646 clone(child_stack=0x7fca38f71f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca38f729d0, tls=0x7fca38f72700, child_tidptr=0x7fca38f729d0) = 31615 02:35:11.945726 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca37f71000 02:35:11.945800 mprotect(0x7fca37f71000, 4096, PROT_NONE) = 0 02:35:11.945862 clone(child_stack=0x7fca38770f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca387719d0, tls=0x7fca38771700, child_tidptr=0x7fca387719d0) = 31616 02:35:11.945949 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca37770000 02:35:11.946020 mprotect(0x7fca37770000, 4096, PROT_NONE) = 0 02:35:11.946082 clone(child_stack=0x7fca37f6ff70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca37f709d0, tls=0x7fca37f70700, child_tidptr=0x7fca37f709d0) = 31617 02:35:11.946160 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca36f6f000 02:35:11.946230 mprotect(0x7fca36f6f000, 4096, PROT_NONE) = 0 02:35:11.946292 clone(child_stack=0x7fca3776ef70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3776f9d0, tls=0x7fca3776f700, child_tidptr=0x7fca3776f9d0) = 31618 02:35:11.946398 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3676e000 02:35:11.946458 mprotect(0x7fca3676e000, 4096, PROT_NONE) = 0 02:35:11.946508 clone(child_stack=0x7fca36f6df70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca36f6e9d0, tls=0x7fca36f6e700, child_tidptr=0x7fca36f6e9d0) = 31619 02:35:11.946571 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca35f6d000 02:35:11.946622 mprotect(0x7fca35f6d000, 4096, PROT_NONE) = 0 02:35:11.946670 clone(child_stack=0x7fca3676cf70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3676d9d0, tls=0x7fca3676d700, child_tidptr=0x7fca3676d9d0) = 31620 02:35:11.946738 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3576c000 02:35:11.946789 mprotect(0x7fca3576c000, 4096, PROT_NONE) = 0 02:35:11.946836 clone(child_stack=0x7fca35f6bf70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca35f6c9d0, tls=0x7fca35f6c700, child_tidptr=0x7fca35f6c9d0) = 31621 02:35:11.946897 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca34f6b000 02:35:11.946948 mprotect(0x7fca34f6b000, 4096, PROT_NONE) = 0 02:35:11.946994 clone(child_stack=0x7fca3576af70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3576b9d0, tls=0x7fca3576b700, child_tidptr=0x7fca3576b9d0) = 31622 02:35:11.947063 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3476a000 02:35:11.947115 mprotect(0x7fca3476a000, 4096, PROT_NONE) = 0 02:35:11.947161 clone(child_stack=0x7fca34f69f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca34f6a9d0, tls=0x7fca34f6a700, child_tidptr=0x7fca34f6a9d0) = 31623 02:35:11.947222 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca33f69000 02:35:11.947273 mprotect(0x7fca33f69000, 4096, PROT_NONE) = 0 02:35:11.947320 clone(child_stack=0x7fca34768f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca347699d0, tls=0x7fca34769700, child_tidptr=0x7fca347699d0) = 31624 02:35:11.947395 futex(0x7ffc25868434, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x7ffc25868430, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1 02:35:11.947445 futex(0x7ffc25868408, FUTEX_WAKE_PRIVATE, 1) = 0 02:35:11.947488 futex(0x7ffc25868434, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x7ffc25868430, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1 02:35:11.947548 futex(0x7ffc25868434, FUTEX_CMP_REQUEUE_PRIVATE, 1, 2147483647, 0x7ffc25868408, 64) = 30 02:35:11.947614 futex(0x7fca43f889d0, FUTEX_WAIT, 31593, NULL) = 0 02:35:18.034742 futex(0x7fca437879d0, FUTEX_WAIT, 31594, NULL) = 0 02:35:18.248819 munmap(0x7fca43788000, 8392704) = 0 02:35:18.249018 munmap(0x7fca42f87000, 8392704) = 0 02:35:18.249124 munmap(0x7fca42786000, 8392704) = 0 02:35:18.249207 munmap(0x7fca41f85000, 8392704) = 0 02:35:18.249289 munmap(0x7fca41784000, 8392704) = 0 02:35:18.249392 munmap(0x7fca40f83000, 8392704) = 0 02:35:18.249491 munmap(0x7fca40782000, 8392704) = 0 02:35:18.249573 munmap(0x7fca3ff81000, 8392704) = 0 02:35:18.249656 munmap(0x7fca3f780000, 8392704) = 0 02:35:18.249736 futex(0x7fca3d77b9d0, FUTEX_WAIT, 31606, NULL) = 0 02:35:18.379119 munmap(0x7fca3ef7f000, 8392704) = 0 02:35:18.379216 munmap(0x7fca3e77e000, 8392704) = 0 02:35:18.379291 munmap(0x7fca3df7d000, 8392704) = 0 02:35:18.379404 munmap(0x7fca3d77c000, 8392704) = 0 02:35:18.379486 munmap(0x7fca3cf7b000, 8392704) = 0 02:35:18.379562 munmap(0x7fca3c77a000, 8392704) = 0 02:35:18.379637 munmap(0x7fca3bf79000, 8392704) = 0 02:35:18.379729 munmap(0x7fca3b778000, 8392704) = 0 02:35:18.379802 munmap(0x7fca3af77000, 8392704) = 0 02:35:18.379875 munmap(0x7fca3a776000, 8392704) = 0 02:35:18.379948 munmap(0x7fca39f75000, 8392704) = 0 02:35:18.380024 munmap(0x7fca39774000, 8392704) = 0 02:35:18.380098 munmap(0x7fca38f73000, 8392704) = 0 02:35:18.380173 munmap(0x7fca38772000, 8392704) = 0 02:35:18.380246 munmap(0x7fca37f71000, 8392704) = 0 02:35:18.380325 munmap(0x7fca37770000, 8392704) = 0 02:35:18.380428 munmap(0x7fca36f6f000, 8392704) = 0 02:35:18.380509 munmap(0x7fca3676e000, 8392704) = 0 02:35:18.380587 futex(0x7fca347699d0, FUTEX_WAIT, 31624, NULL) = 0 02:35:18.526206 munmap(0x7fca35f6d000, 8392704) = 0 02:35:18.526319 open("/etc/localtime", O_RDONLY|O_CLOEXEC) = 3 02:35:18.526472 fstat(3, {st_mode=S_IFREG|0644, st_size=2211, ...}) = 0 02:35:18.526557 fstat(3, {st_mode=S_IFREG|0644, st_size=2211, ...}) = 0 02:35:18.526636 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fca489f5000 02:35:18.526712 read(3, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\0\0\0\6\0\0\0\0"..., 4096) = 2211 02:35:18.526802 lseek(3, -1400, SEEK_CUR) = 811 02:35:18.526868 read(3, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\0\0\0\6\0\0\0\0"..., 4096) = 1400 02:35:18.526959 close(3) = 0 02:35:18.527028 munmap(0x7fca489f5000, 4096) = 0 02:35:18.527140 write(2, " - 02:35:18: scanning fil"..., 84) = 84 02:35:18.527269 write(2, " - found root inode chunk"..., 33) = 33 02:35:18.527381 write(2, "Phase 3 - for each AG...\n", 25) = 25 02:35:18.527481 write(2, " - scan and clear agi unl"..., 47) = 47 02:35:18.527669 stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2211, ...}) = 0 02:35:18.527772 write(2, " - 02:35:18: scanning agi"..., 82) = 82 02:35:18.527860 write(2, " - process known inodes a"..., 62) = 62 02:35:18.527958 clone(child_stack=0x7fca34768f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca347699d0, tls=0x7fca34769700, child_tidptr=0x7fca347699d0) = 31625 02:35:18.528077 clone(child_stack=0x7fca34f69f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca34f6a9d0, tls=0x7fca34f6a700, child_tidptr=0x7fca34f6a9d0) = 31626 02:35:18.528171 futex(0xf54f7c, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0xf54f78, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1 02:35:18.528249 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca42786000 02:35:18.529894 mprotect(0x7fca42786000, 4096, PROT_NONE) = 0 02:35:18.530133 clone(child_stack=0x7fca42f85f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca42f869d0, tls=0x7fca42f86700, child_tidptr=0x7fca42f869d0) = 31630 02:35:18.530250 futex(0x7fca347699d0, FUTEX_WAIT, 31625, NULL) = 0 02:43:27.430950 munmap(0x7fca43788000, 8392704) = 0 02:43:27.431068 futex(0xf54f7c, FUTEX_CMP_REQUEUE_PRIVATE, 1, 2147483647, 0xf54f50, 4) = 1 02:43:27.431148 futex(0x7fca34f6a9d0, FUTEX_WAIT, 31626, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:27.431239 munmap(0x7fca41784000, 8392704) = 0 02:43:27.431305 futex(0xf55004, FUTEX_CMP_REQUEUE_PRIVATE, 1, 2147483647, 0xf54fd8, 2) = 1 02:43:27.431373 futex(0x7fca42f869d0, FUTEX_WAIT, 31630, NULL) = 0 02:43:27.431635 munmap(0x7fca3e77e000, 8392704) = 0 02:43:27.431718 stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2211, ...}) = 0 02:43:27.431840 write(2, " - 02:43:27: process know"..., 94) = 94 02:43:27.431938 write(2, " - process newly discover"..., 45) = 45 02:43:27.432025 clone(child_stack=0x7fca42f85f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca42f869d0, tls=0x7fca42f86700, child_tidptr=0x7fca42f869d0) = 32045 02:43:27.432131 clone(child_stack=0x7fca34f69f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca34f6a9d0, tls=0x7fca34f6a700, child_tidptr=0x7fca34f6a9d0) = 32046 02:43:27.432232 clone(child_stack=0x7fca34768f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca347699d0, tls=0x7fca34769700, child_tidptr=0x7fca347699d0) = 32047 02:43:27.432327 clone(child_stack=0x7fca3f77ef70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3f77f9d0, tls=0x7fca3f77f700, child_tidptr=0x7fca3f77f9d0) = 32048 02:43:27.432439 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca43788000 02:43:27.432514 mprotect(0x7fca43788000, 4096, PROT_NONE) = 0 02:43:27.432579 clone(child_stack=0x7fca43f87f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca43f889d0, tls=0x7fca43f88700, child_tidptr=0x7fca43f889d0) = 32049 02:43:27.432661 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca42f87000 02:43:27.432731 mprotect(0x7fca42f87000, 4096, PROT_NONE) = 0 02:43:27.432792 clone(child_stack=0x7fca43786f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca437879d0, tls=0x7fca43787700, child_tidptr=0x7fca437879d0) = 32050 02:43:27.432877 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca41f85000 02:43:27.432945 mprotect(0x7fca41f85000, 4096, PROT_NONE) = 0 02:43:27.433007 clone(child_stack=0x7fca42784f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca427859d0, tls=0x7fca42785700, child_tidptr=0x7fca427859d0) = 32051 02:43:27.433083 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca41784000 02:43:27.433153 mprotect(0x7fca41784000, 4096, PROT_NONE) = 0 02:43:27.433218 clone(child_stack=0x7fca41f83f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca41f849d0, tls=0x7fca41f84700, child_tidptr=0x7fca41f849d0) = 32052 02:43:27.433306 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca40f83000 02:43:27.433386 mprotect(0x7fca40f83000, 4096, PROT_NONE) = 0 02:43:27.433454 clone(child_stack=0x7fca41782f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca417839d0, tls=0x7fca41783700, child_tidptr=0x7fca417839d0) = 32053 02:43:27.433530 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca40782000 02:43:27.433594 mprotect(0x7fca40782000, 4096, PROT_NONE) = 0 02:43:27.433654 clone(child_stack=0x7fca40f81f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca40f829d0, tls=0x7fca40f82700, child_tidptr=0x7fca40f829d0) = 32054 02:43:27.433734 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3ff81000 02:43:27.433799 mprotect(0x7fca3ff81000, 4096, PROT_NONE) = 0 02:43:27.433858 clone(child_stack=0x7fca40780f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca407819d0, tls=0x7fca40781700, child_tidptr=0x7fca407819d0) = 32055 02:43:27.433930 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3f780000 02:43:27.433995 mprotect(0x7fca3f780000, 4096, PROT_NONE) = 0 02:43:27.434064 clone(child_stack=0x7fca3ff7ff70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3ff809d0, tls=0x7fca3ff80700, child_tidptr=0x7fca3ff809d0) = 32056 02:43:27.434144 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3e77e000 02:43:27.434208 mprotect(0x7fca3e77e000, 4096, PROT_NONE) = 0 02:43:27.434268 clone(child_stack=0x7fca3ef7df70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3ef7e9d0, tls=0x7fca3ef7e700, child_tidptr=0x7fca3ef7e9d0) = 32057 02:43:27.434340 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3df7d000 02:43:27.434416 mprotect(0x7fca3df7d000, 4096, PROT_NONE) = 0 02:43:27.434476 clone(child_stack=0x7fca3e77cf70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3e77d9d0, tls=0x7fca3e77d700, child_tidptr=0x7fca3e77d9d0) = 32058 02:43:27.434558 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3d77c000 02:43:27.434624 mprotect(0x7fca3d77c000, 4096, PROT_NONE) = 0 02:43:27.434684 clone(child_stack=0x7fca3df7bf70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3df7c9d0, tls=0x7fca3df7c700, child_tidptr=0x7fca3df7c9d0) = 32059 02:43:27.434757 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3cf7b000 02:43:27.434823 mprotect(0x7fca3cf7b000, 4096, PROT_NONE) = 0 02:43:27.434883 clone(child_stack=0x7fca3d77af70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3d77b9d0, tls=0x7fca3d77b700, child_tidptr=0x7fca3d77b9d0) = 32060 02:43:27.434963 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3c77a000 02:43:27.435027 mprotect(0x7fca3c77a000, 4096, PROT_NONE) = 0 02:43:27.435086 clone(child_stack=0x7fca3cf79f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3cf7a9d0, tls=0x7fca3cf7a700, child_tidptr=0x7fca3cf7a9d0) = 32061 02:43:27.435158 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca377ff000 02:43:27.435558 mprotect(0x7fca377ff000, 4096, PROT_NONE) = 0 02:43:27.435620 clone(child_stack=0x7fca37ffef70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca37fff9d0, tls=0x7fca37fff700, child_tidptr=0x7fca37fff9d0) = 32062 02:43:27.435702 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca36ffe000 02:43:27.435770 mprotect(0x7fca36ffe000, 4096, PROT_NONE) = 0 02:43:27.435831 clone(child_stack=0x7fca377fdf70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca377fe9d0, tls=0x7fca377fe700, child_tidptr=0x7fca377fe9d0) = 32063 02:43:27.435903 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca367fd000 02:43:27.435968 mprotect(0x7fca367fd000, 4096, PROT_NONE) = 0 02:43:27.436026 clone(child_stack=0x7fca36ffcf70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca36ffd9d0, tls=0x7fca36ffd700, child_tidptr=0x7fca36ffd9d0) = 32064 02:43:27.436106 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca35ffc000 02:43:27.436171 mprotect(0x7fca35ffc000, 4096, PROT_NONE) = 0 02:43:27.436231 clone(child_stack=0x7fca367fbf70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca367fc9d0, tls=0x7fca367fc700, child_tidptr=0x7fca367fc9d0) = 32065 02:43:27.436311 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca357fb000 02:43:27.436405 mprotect(0x7fca357fb000, 4096, PROT_NONE) = 0 02:43:27.436484 clone(child_stack=0x7fca35ffaf70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca35ffb9d0, tls=0x7fca35ffb700, child_tidptr=0x7fca35ffb9d0) = 32066 02:43:27.436582 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca34ffa000 02:43:27.436663 mprotect(0x7fca34ffa000, 4096, PROT_NONE) = 0 02:43:27.436744 clone(child_stack=0x7fca357f9f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca357fa9d0, tls=0x7fca357fa700, child_tidptr=0x7fca357fa9d0) = 32067 02:43:27.436835 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca33768000 02:43:27.436923 mprotect(0x7fca33768000, 4096, PROT_NONE) = 0 02:43:27.436995 clone(child_stack=0x7fca33f67f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca33f689d0, tls=0x7fca33f68700, child_tidptr=0x7fca33f689d0) = 32068 02:43:27.437093 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca32f67000 02:43:27.437172 mprotect(0x7fca32f67000, 4096, PROT_NONE) = 0 02:43:27.437243 clone(child_stack=0x7fca33766f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca337679d0, tls=0x7fca33767700, child_tidptr=0x7fca337679d0) = 32069 02:43:27.437333 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca32766000 02:43:27.437453 mprotect(0x7fca32766000, 4096, PROT_NONE) = 0 02:43:27.437528 clone(child_stack=0x7fca32f65f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca32f669d0, tls=0x7fca32f66700, child_tidptr=0x7fca32f669d0) = 32070 02:43:27.437627 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca31f65000 02:43:27.437707 mprotect(0x7fca31f65000, 4096, PROT_NONE) = 0 02:43:27.437779 clone(child_stack=0x7fca32764f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca327659d0, tls=0x7fca32765700, child_tidptr=0x7fca327659d0) = 32071 02:43:27.437869 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca31764000 02:43:27.437954 mprotect(0x7fca31764000, 4096, PROT_NONE) = 0 02:43:27.438027 clone(child_stack=0x7fca31f63f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca31f649d0, tls=0x7fca31f64700, child_tidptr=0x7fca31f649d0) = 32072 02:43:27.438127 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca30f63000 02:43:27.438216 mprotect(0x7fca30f63000, 4096, PROT_NONE) = 0 02:43:27.438292 clone(child_stack=0x7fca31762f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca317639d0, tls=0x7fca31763700, child_tidptr=0x7fca317639d0) = 32073 02:43:27.438462 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca30762000 02:43:27.438550 mprotect(0x7fca30762000, 4096, PROT_NONE) = 0 02:43:27.438622 clone(child_stack=0x7fca30f61f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca30f629d0, tls=0x7fca30f62700, child_tidptr=0x7fca30f629d0) = 32074 02:43:27.438734 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fc9f77ff000 02:43:27.439421 mprotect(0x7fc9f77ff000, 4096, PROT_NONE) = 0 02:43:27.439503 clone(child_stack=0x7fc9f7ffef70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fc9f7fff9d0, tls=0x7fc9f7fff700, child_tidptr=0x7fc9f7fff9d0) = 32075 02:43:27.439605 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fc9f6ffe000 02:43:27.439688 mprotect(0x7fc9f6ffe000, 4096, PROT_NONE) = 0 02:43:27.439760 clone(child_stack=0x7fc9f77fdf70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fc9f77fe9d0, tls=0x7fc9f77fe700, child_tidptr=0x7fc9f77fe9d0) = 32076 02:43:27.439862 futex(0x7ffc25868484, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x7ffc25868480, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1 02:43:27.439945 futex(0x7ffc25868458, FUTEX_WAKE_PRIVATE, 1) = 1 02:43:27.440015 futex(0x7ffc25868484, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x7ffc25868480, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1 02:43:27.440085 futex(0x7ffc25868458, FUTEX_WAKE_PRIVATE, 1) = 1 02:43:27.440155 futex(0x7ffc25868484, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x7ffc25868480, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1 02:43:27.440224 futex(0x7ffc25868458, FUTEX_WAKE_PRIVATE, 1) = 1 02:43:27.440293 futex(0x7ffc25868484, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x7ffc25868480, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1 02:43:27.440396 futex(0x7ffc25868484, FUTEX_CMP_REQUEUE_PRIVATE, 1, 2147483647, 0x7ffc25868458, 70) = 31 02:43:27.440495 futex(0x7fca42f869d0, FUTEX_WAIT, 32045, NULL) = 0 02:43:27.441056 munmap(0x7fca42786000, 8392704) = 0 02:43:27.441600 munmap(0x7fca3476a000, 8392704) = 0 02:43:27.441694 munmap(0x7fca33f69000, 8392704) = 0 02:43:27.441778 munmap(0x7fca3ef7f000, 8392704) = 0 02:43:27.441857 munmap(0x7fca43788000, 8392704) = 0 02:43:27.441935 munmap(0x7fca42f87000, 8392704) = 0 02:43:27.442019 munmap(0x7fca41f85000, 8392704) = 0 02:43:27.442097 munmap(0x7fca41784000, 8392704) = 0 02:43:27.442174 munmap(0x7fca40f83000, 8392704) = 0 02:43:27.442249 munmap(0x7fca40782000, 8392704) = 0 02:43:27.442325 munmap(0x7fca3ff81000, 8392704) = 0 02:43:27.442419 munmap(0x7fca3f780000, 8392704) = 0 02:43:27.442497 munmap(0x7fca3e77e000, 8392704) = 0 02:43:27.442572 munmap(0x7fca3df7d000, 8392704) = 0 02:43:27.442648 munmap(0x7fca3d77c000, 8392704) = 0 02:43:27.442723 munmap(0x7fca3cf7b000, 8392704) = 0 02:43:27.442798 munmap(0x7fca3c77a000, 8392704) = 0 02:43:27.442873 munmap(0x7fca377ff000, 8392704) = 0 02:43:27.442954 munmap(0x7fca36ffe000, 8392704) = 0 02:43:27.443028 munmap(0x7fca367fd000, 8392704) = 0 02:43:27.443103 munmap(0x7fca35ffc000, 8392704) = 0 02:43:27.443177 munmap(0x7fca357fb000, 8392704) = 0 02:43:27.443251 munmap(0x7fca34ffa000, 8392704) = 0 02:43:27.443326 munmap(0x7fca33768000, 8392704) = 0 02:43:27.443424 munmap(0x7fca32f67000, 8392704) = 0 02:43:27.443500 munmap(0x7fca32766000, 8392704) = 0 02:43:27.443575 munmap(0x7fca31f65000, 8392704) = 0 02:43:27.443650 munmap(0x7fca31764000, 8392704) = 0 02:43:27.443728 stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2211, ...}) = 0 02:43:27.443847 write(2, " - 02:43:27: process newl"..., 86) = 86 02:43:27.443956 write(2, "Phase 4 - check for duplicate bl"..., 40) = 40 02:43:27.444046 write(2, " - setting up duplicate e"..., 46) = 46 02:43:27.580437 stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2211, ...}) = 0 02:43:27.580642 write(2, " - 02:43:27: setting up d"..., 87) = 87 02:43:27.612391 write(2, " - check for inodes claim"..., 56) = 56 02:43:27.612549 open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3 02:43:27.612617 read(3, "0-31\n", 8192) = 5 02:43:27.612689 close(3) = 0 02:43:27.612732 clone(child_stack=0x7fc9f77fdf70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fc9f77fe9d0, tls=0x7fc9f77fe700, child_tidptr=0x7fc9f77fe9d0) = 32077 02:43:27.612798 clone(child_stack=0x7fc9f7ffef70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fc9f7fff9d0, tls=0x7fc9f7fff700, child_tidptr=0x7fc9f7fff9d0) = 32078 02:43:27.612857 clone(child_stack=0x7fca30f61f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca30f629d0, tls=0x7fca30f62700, child_tidptr=0x7fca30f629d0) = 32079 02:43:27.612908 clone(child_stack=0x7fca31762f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca317639d0, tls=0x7fca31763700, child_tidptr=0x7fca317639d0) = 32080 02:43:27.612962 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca43788000 02:43:27.613018 mprotect(0x7fca43788000, 4096, PROT_NONE) = 0 02:43:27.613057 clone(child_stack=0x7fca43f87f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca43f889d0, tls=0x7fca43f88700, child_tidptr=0x7fca43f889d0) = 32081 02:43:27.613109 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca42f87000 02:43:27.613152 mprotect(0x7fca42f87000, 4096, PROT_NONE) = 0 02:43:27.613188 clone(child_stack=0x7fca43786f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca437879d0, tls=0x7fca43787700, child_tidptr=0x7fca437879d0) = 32082 02:43:27.613252 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca42786000 02:43:27.613305 mprotect(0x7fca42786000, 4096, PROT_NONE) = 0 02:43:27.613349 clone(child_stack=0x7fca42f85f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca42f869d0, tls=0x7fca42f86700, child_tidptr=0x7fca42f869d0) = 32083 02:43:27.613427 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca41f85000 02:43:27.613477 mprotect(0x7fca41f85000, 4096, PROT_NONE) = 0 02:43:27.613520 clone(child_stack=0x7fca42784f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca427859d0, tls=0x7fca42785700, child_tidptr=0x7fca427859d0) = 32084 02:43:27.613577 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca41784000 02:43:27.613626 mprotect(0x7fca41784000, 4096, PROT_NONE) = 0 02:43:27.613668 clone(child_stack=0x7fca41f83f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca41f849d0, tls=0x7fca41f84700, child_tidptr=0x7fca41f849d0) = 32085 02:43:27.613726 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca40f83000 02:43:27.613774 mprotect(0x7fca40f83000, 4096, PROT_NONE) = 0 02:43:27.613817 clone(child_stack=0x7fca41782f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca417839d0, tls=0x7fca41783700, child_tidptr=0x7fca417839d0) = 32086 02:43:27.613880 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca40782000 02:43:27.613928 mprotect(0x7fca40782000, 4096, PROT_NONE) = 0 02:43:27.613970 clone(child_stack=0x7fca40f81f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca40f829d0, tls=0x7fca40f82700, child_tidptr=0x7fca40f829d0) = 32087 02:43:27.614032 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3ff81000 02:43:27.614081 mprotect(0x7fca3ff81000, 4096, PROT_NONE) = 0 02:43:27.614125 clone(child_stack=0x7fca40780f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca407819d0, tls=0x7fca40781700, child_tidptr=0x7fca407819d0) = 32088 02:43:27.614182 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3f780000 02:43:27.614229 mprotect(0x7fca3f780000, 4096, PROT_NONE) = 0 02:43:27.614273 clone(child_stack=0x7fca3ff7ff70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3ff809d0, tls=0x7fca3ff80700, child_tidptr=0x7fca3ff809d0) = 32089 02:43:27.614329 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3ef7f000 02:43:27.614384 mprotect(0x7fca3ef7f000, 4096, PROT_NONE) = 0 02:43:27.614431 clone(child_stack=0x7fca3f77ef70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3f77f9d0, tls=0x7fca3f77f700, child_tidptr=0x7fca3f77f9d0) = 32090 02:43:27.614488 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3e77e000 02:43:27.614540 mprotect(0x7fca3e77e000, 4096, PROT_NONE) = 0 02:43:27.614583 clone(child_stack=0x7fca3ef7df70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3ef7e9d0, tls=0x7fca3ef7e700, child_tidptr=0x7fca3ef7e9d0) = 32091 02:43:27.614646 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3df7d000 02:43:27.614685 mprotect(0x7fca3df7d000, 4096, PROT_NONE) = 0 02:43:27.614720 clone(child_stack=0x7fca3e77cf70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3e77d9d0, tls=0x7fca3e77d700, child_tidptr=0x7fca3e77d9d0) = 32092 02:43:27.614781 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3d77c000 02:43:27.614829 mprotect(0x7fca3d77c000, 4096, PROT_NONE) = 0 02:43:27.614873 clone(child_stack=0x7fca3df7bf70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3df7c9d0, tls=0x7fca3df7c700, child_tidptr=0x7fca3df7c9d0) = 32093 02:43:27.614929 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3cf7b000 02:43:27.614977 mprotect(0x7fca3cf7b000, 4096, PROT_NONE) = 0 02:43:27.615019 clone(child_stack=0x7fca3d77af70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3d77b9d0, tls=0x7fca3d77b700, child_tidptr=0x7fca3d77b9d0) = 32094 02:43:27.615074 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3c77a000 02:43:27.615123 mprotect(0x7fca3c77a000, 4096, PROT_NONE) = 0 02:43:27.615167 clone(child_stack=0x7fca3cf79f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3cf7a9d0, tls=0x7fca3cf7a700, child_tidptr=0x7fca3cf7a9d0) = 32095 02:43:27.615224 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca377ff000 02:43:27.615769 mprotect(0x7fca377ff000, 4096, PROT_NONE) = 0 02:43:27.615817 clone(child_stack=0x7fca37ffef70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca37fff9d0, tls=0x7fca37fff700, child_tidptr=0x7fca37fff9d0) = 32096 02:43:27.615896 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca36ffe000 02:43:27.615947 mprotect(0x7fca36ffe000, 4096, PROT_NONE) = 0 02:43:27.615995 clone(child_stack=0x7fca377fdf70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca377fe9d0, tls=0x7fca377fe700, child_tidptr=0x7fca377fe9d0) = 32097 02:43:27.616056 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca367fd000 02:43:27.616104 mprotect(0x7fca367fd000, 4096, PROT_NONE) = 0 02:43:27.616147 clone(child_stack=0x7fca36ffcf70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca36ffd9d0, tls=0x7fca36ffd700, child_tidptr=0x7fca36ffd9d0) = 32098 02:43:27.616203 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca35ffc000 02:43:27.616245 mprotect(0x7fca35ffc000, 4096, PROT_NONE) = 0 02:43:27.616281 clone(child_stack=0x7fca367fbf70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca367fc9d0, tls=0x7fca367fc700, child_tidptr=0x7fca367fc9d0) = 32099 02:43:27.616329 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca357fb000 02:43:27.616392 mprotect(0x7fca357fb000, 4096, PROT_NONE) = 0 02:43:27.616432 clone(child_stack=0x7fca35ffaf70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca35ffb9d0, tls=0x7fca35ffb700, child_tidptr=0x7fca35ffb9d0) = 32100 02:43:27.616509 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca34ffa000 02:43:27.616569 mprotect(0x7fca34ffa000, 4096, PROT_NONE) = 0 02:43:27.616613 clone(child_stack=0x7fca357f9f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca357fa9d0, tls=0x7fca357fa700, child_tidptr=0x7fca357fa9d0) = 32101 02:43:27.616675 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca347f9000 02:43:27.616723 mprotect(0x7fca347f9000, 4096, PROT_NONE) = 0 02:43:27.616768 clone(child_stack=0x7fca34ff8f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca34ff99d0, tls=0x7fca34ff9700, child_tidptr=0x7fca34ff99d0) = 32102 02:43:27.616826 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca33ff8000 02:43:27.616874 mprotect(0x7fca33ff8000, 4096, PROT_NONE) = 0 02:43:27.616917 clone(child_stack=0x7fca347f7f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca347f89d0, tls=0x7fca347f8700, child_tidptr=0x7fca347f89d0) = 32103 02:43:27.616976 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca337f7000 02:43:27.617027 mprotect(0x7fca337f7000, 4096, PROT_NONE) = 0 02:43:27.617136 clone(child_stack=0x7fca33ff6f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca33ff79d0, tls=0x7fca33ff7700, child_tidptr=0x7fca33ff79d0) = 32104 02:43:27.617274 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca32ff6000 02:43:27.617417 mprotect(0x7fca32ff6000, 4096, PROT_NONE) = 0 02:43:27.617496 clone(child_stack=0x7fca337f5f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca337f69d0, tls=0x7fca337f6700, child_tidptr=0x7fca337f69d0) = 32105 02:43:27.617599 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca327f5000 02:43:27.617678 mprotect(0x7fca327f5000, 4096, PROT_NONE) = 0 02:43:27.617751 clone(child_stack=0x7fca32ff4f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca32ff59d0, tls=0x7fca32ff5700, child_tidptr=0x7fca32ff59d0) = 32106 02:43:27.617842 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca31ff4000 02:43:27.617915 mprotect(0x7fca31ff4000, 4096, PROT_NONE) = 0 02:43:27.617983 clone(child_stack=0x7fca327f3f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca327f49d0, tls=0x7fca327f4700, child_tidptr=0x7fca327f49d0) = 32107 02:43:27.618056 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca317f3000 02:43:27.618128 mprotect(0x7fca317f3000, 4096, PROT_NONE) = 0 02:43:27.618184 clone(child_stack=0x7fca31ff2f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca31ff39d0, tls=0x7fca31ff3700, child_tidptr=0x7fca31ff39d0) = 32108 02:43:27.618272 futex(0x7ffc25868424, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x7ffc25868420, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1 02:43:27.618347 futex(0x7ffc258683f8, FUTEX_WAKE_PRIVATE, 1) = 1 02:43:27.618530 futex(0x7ffc25868424, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x7ffc25868420, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1 02:43:27.618698 futex(0x7ffc258683f8, FUTEX_WAKE_PRIVATE, 1) = 1 02:43:27.618776 futex(0x7ffc25868424, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x7ffc25868420, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1 02:43:27.618863 futex(0x7ffc258683f8, FUTEX_WAKE_PRIVATE, 1) = 1 02:43:27.618944 futex(0x7ffc25868424, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x7ffc25868420, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1 02:43:27.619022 futex(0x7ffc258683f8, FUTEX_WAKE_PRIVATE, 1) = 1 02:43:27.619096 futex(0x7ffc25868424, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x7ffc25868420, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1 02:43:27.619174 futex(0x7ffc258683f8, FUTEX_WAKE_PRIVATE, 1) = 1 02:43:27.619249 futex(0x7ffc25868424, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x7ffc25868420, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1 02:43:27.619337 futex(0x7ffc25868424, FUTEX_CMP_REQUEUE_PRIVATE, 1, 2147483647, 0x7ffc258683f8, 64) = 26 02:43:27.619460 futex(0x7fc9f77fe9d0, FUTEX_WAIT, 32077, NULL) = 0 02:43:29.458273 munmap(0x7fc9f6ffe000, 8392704) = 0 02:43:29.458382 munmap(0x7fc9f77ff000, 8392704) = 0 02:43:29.458444 munmap(0x7fca30762000, 8392704) = 0 02:43:29.458491 munmap(0x7fca30f63000, 8392704) = 0 02:43:29.458535 munmap(0x7fca43788000, 8392704) = 0 02:43:29.458580 munmap(0x7fca42f87000, 8392704) = 0 02:43:29.458619 munmap(0x7fca42786000, 8392704) = 0 02:43:29.458657 munmap(0x7fca41f85000, 8392704) = 0 02:43:29.458695 munmap(0x7fca41784000, 8392704) = 0 02:43:29.458733 munmap(0x7fca40f83000, 8392704) = 0 02:43:29.458770 munmap(0x7fca40782000, 8392704) = 0 02:43:29.458807 munmap(0x7fca3ff81000, 8392704) = 0 02:43:29.458851 munmap(0x7fca3f780000, 8392704) = 0 02:43:29.458889 munmap(0x7fca3ef7f000, 8392704) = 0 02:43:29.458927 munmap(0x7fca3e77e000, 8392704) = 0 02:43:29.458970 munmap(0x7fca3df7d000, 8392704) = 0 02:43:29.459007 munmap(0x7fca3d77c000, 8392704) = 0 02:43:29.459044 munmap(0x7fca3cf7b000, 8392704) = 0 02:43:29.459082 munmap(0x7fca3c77a000, 8392704) = 0 02:43:29.459119 munmap(0x7fca377ff000, 8392704) = 0 02:43:29.459156 munmap(0x7fca36ffe000, 8392704) = 0 02:43:29.459193 munmap(0x7fca367fd000, 8392704) = 0 02:43:29.459232 munmap(0x7fca35ffc000, 8392704) = 0 02:43:29.459268 munmap(0x7fca357fb000, 8392704) = 0 02:43:29.459306 munmap(0x7fca34ffa000, 8392704) = 0 02:43:29.459342 munmap(0x7fca347f9000, 8392704) = 0 02:43:29.459385 munmap(0x7fca33ff8000, 8392704) = 0 02:43:29.459436 munmap(0x7fca337f7000, 8392704) = 0 02:43:29.459483 stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2211, ...}) = 0 02:43:29.459554 write(2, " - 02:43:29: check for in"..., 96) = 96 02:43:29.459772 write(2, "Phase 5 - rebuild AG headers and"..., 42) = 42 02:43:29.461325 brk(0xfbb000) = 0xfbb000 02:43:29.462207 brk(0xfdc000) = 0xfdc000 02:43:29.463115 brk(0xffd000) = 0xffd000 02:43:29.464005 brk(0x101e000) = 0x101e000 02:43:29.465325 brk(0x103f000) = 0x103f000 02:43:29.466227 brk(0x1060000) = 0x1060000 02:43:29.467131 brk(0x1081000) = 0x1081000 02:43:29.468015 brk(0x10a2000) = 0x10a2000 02:43:29.468913 brk(0x10c3000) = 0x10c3000 02:43:29.469853 brk(0x10e4000) = 0x10e4000 02:43:29.489205 brk(0x1105000) = 0x1105000 02:43:29.489980 brk(0x1126000) = 0x1126000 02:43:29.490773 brk(0x1147000) = 0x1147000 02:43:29.491553 brk(0x1168000) = 0x1168000 02:43:29.775706 stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2211, ...}) = 0 02:43:29.775916 write(2, " - 02:43:29: rebuild AG h"..., 83) = 83 02:43:29.776021 write(2, " - reset superblock...\n", 30) = 30 02:43:29.794287 write(2, "Phase 6 - check inode connectivi"..., 38) = 38 02:43:29.799650 brk(0x1189000) = 0x1189000 02:43:29.800052 brk(0x11aa000) = 0x11aa000 02:43:29.800423 brk(0x11cb000) = 0x11cb000 02:43:29.800777 brk(0x11ec000) = 0x11ec000 02:43:29.801137 brk(0x120d000) = 0x120d000 02:43:29.801502 brk(0x122e000) = 0x122e000 02:43:29.801873 brk(0x124f000) = 0x124f000 02:43:29.802222 brk(0x1270000) = 0x1270000 02:43:29.802573 brk(0x1291000) = 0x1291000 02:43:29.802916 brk(0x12b2000) = 0x12b2000 02:43:29.803270 brk(0x12d3000) = 0x12d3000 02:43:29.803621 brk(0x12f4000) = 0x12f4000 02:43:29.803968 brk(0x1315000) = 0x1315000 02:43:29.804307 brk(0x1336000) = 0x1336000 02:43:29.804704 brk(0x1357000) = 0x1357000 02:43:29.805120 brk(0x1378000) = 0x1378000 02:43:29.805501 brk(0x1399000) = 0x1399000 02:43:29.805853 brk(0x13ba000) = 0x13ba000 02:43:29.806201 brk(0x13db000) = 0x13db000 02:43:29.806563 brk(0x13fc000) = 0x13fc000 02:43:29.806921 brk(0x141d000) = 0x141d000 02:43:29.807272 brk(0x143e000) = 0x143e000 02:43:29.807641 brk(0x145f000) = 0x145f000 02:43:29.808006 brk(0x1480000) = 0x1480000 02:43:29.808358 brk(0x14a1000) = 0x14a1000 02:43:29.808743 brk(0x14c2000) = 0x14c2000 02:43:29.809105 brk(0x14e3000) = 0x14e3000 02:43:29.809467 brk(0x1504000) = 0x1504000 02:43:29.809825 brk(0x1525000) = 0x1525000 02:43:29.810176 brk(0x1546000) = 0x1546000 02:43:29.810541 brk(0x1567000) = 0x1567000 02:43:29.810898 brk(0x1588000) = 0x1588000 02:43:29.811254 brk(0x15a9000) = 0x15a9000 02:43:29.811628 brk(0x15ca000) = 0x15ca000 02:43:29.811987 brk(0x15eb000) = 0x15eb000 02:43:29.812340 brk(0x160c000) = 0x160c000 02:43:29.812729 brk(0x162d000) = 0x162d000 02:43:29.813083 brk(0x164e000) = 0x164e000 02:43:29.813450 brk(0x166f000) = 0x166f000 02:43:29.813810 brk(0x1690000) = 0x1690000 02:43:29.814167 brk(0x16b1000) = 0x16b1000 02:43:29.814544 brk(0x16d2000) = 0x16d2000 02:43:29.814894 brk(0x16f3000) = 0x16f3000 02:43:29.815244 brk(0x1714000) = 0x1714000 02:43:29.815617 brk(0x1735000) = 0x1735000 02:43:29.815983 brk(0x1756000) = 0x1756000 02:43:29.816341 brk(0x1777000) = 0x1777000 02:43:29.816731 brk(0x1798000) = 0x1798000 02:43:29.817077 brk(0x17b9000) = 0x17b9000 02:43:29.817456 brk(0x17da000) = 0x17da000 02:43:29.817803 brk(0x17fb000) = 0x17fb000 02:43:29.818168 brk(0x181c000) = 0x181c000 02:43:29.818543 brk(0x183d000) = 0x183d000 02:43:29.818905 brk(0x185e000) = 0x185e000 02:43:29.819281 brk(0x187f000) = 0x187f000 02:43:29.819655 brk(0x18a0000) = 0x18a0000 02:43:29.820003 brk(0x18c1000) = 0x18c1000 02:43:29.820359 brk(0x18e2000) = 0x18e2000 02:43:29.820745 brk(0x1903000) = 0x1903000 02:43:29.821122 brk(0x1924000) = 0x1924000 02:43:29.821478 brk(0x1945000) = 0x1945000 02:43:29.821814 brk(0x1966000) = 0x1966000 02:43:29.822170 brk(0x1987000) = 0x1987000 02:43:29.822531 brk(0x19a8000) = 0x19a8000 02:43:29.822901 brk(0x19c9000) = 0x19c9000 02:43:29.823247 brk(0x19ea000) = 0x19ea000 02:43:29.823605 brk(0x1a0b000) = 0x1a0b000 02:43:29.823960 brk(0x1a2c000) = 0x1a2c000 02:43:29.824311 brk(0x1a4d000) = 0x1a4d000 02:43:29.824668 brk(0x1a6e000) = 0x1a6e000 02:43:29.824901 write(2, " - resetting contents of "..., 67) = 67 02:43:29.825034 write(2, " - traversing filesystem "..., 36) = 36 02:43:29.825119 clone(child_stack=0x7fca31ff2f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca31ff39d0, tls=0x7fca31ff3700, child_tidptr=0x7fca31ff39d0) = 32109 02:43:29.825229 futex(0x1a5e9cc, FUTEX_WAIT_PRIVATE, 1, NULL) = 0 02:43:29.826052 futex(0x1a5e940, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:29.826127 futex(0x7fca281852e8, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:29.844811 futex(0x7fca281852e8, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:29.844950 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:29.845022 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:29.845086 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:29.845171 futex(0x7fca1c20c6f8, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:37.939312 futex(0x7fca1c20c6f8, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:37.940050 futex(0x7fca14187cb8, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:37.940761 futex(0x7fca14187cb8, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:37.941243 futex(0x7fca08189a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:37.948233 futex(0x7fca08189a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:37.949688 futex(0x7fca1c28ec88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:37.959043 futex(0x7fca1c28ec88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:37.959279 futex(0x7fca241bf088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:37.963968 futex(0x7fca241bf088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:37.964915 futex(0x7fca08209c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:37.967334 futex(0x7fca08209c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:37.967594 futex(0x7fca0820c088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:37.967755 futex(0x7fca0820c088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:37.968377 futex(0x7fca1c291088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:37.972322 futex(0x7fca1c291088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:37.972479 futex(0x7fca0820d288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:37.974638 futex(0x7fca0820d288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:37.974756 futex(0x7fca14210e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:37.981067 futex(0x7fca14210e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:37.981194 futex(0x7fca14212088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:37.986657 futex(0x7fca14212088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:37.987068 futex(0x7fca1c292288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:37.990503 futex(0x7fca1c292288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:37.990847 futex(0x7fca0820e488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.001213 futex(0x7fca0820e488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.001579 futex(0x7fca241c1488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.007522 futex(0x7fca241c1488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.008148 futex(0x7fca1c297c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.009693 futex(0x7fca1c297c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.009963 futex(0x7fca14217a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.012092 futex(0x7fca14217a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.012330 futex(0x7fca1c29a088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.012607 futex(0x7fca1c29a088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.012719 futex(0x7fca1421c288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.016169 futex(0x7fca1421c288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.016308 futex(0x7fca08211a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.017602 futex(0x7fca08211a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.017728 futex(0x7fca08212c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.020282 futex(0x7fca08212c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.020546 futex(0x7fca1421f888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.026233 futex(0x7fca1421f888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.026825 brk(0x1a8f000) = 0x1a8f000 02:43:38.027462 futex(0x7fca14227688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.032927 futex(0x7fca14227688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.033561 futex(0x7fca241c5c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.043280 futex(0x7fca241c5c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.043673 futex(0x7fca1c29b288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.045236 futex(0x7fca1c29b288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.045795 futex(0x7fca08216288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.055930 futex(0x7fca08216288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.057710 futex(0x7fca241cda88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.058337 futex(0x7fca241cda88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.059235 futex(0x7fca14230688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.067426 futex(0x7fca14230688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.067758 futex(0x7fca241d1088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.070766 futex(0x7fca241d1088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.071003 futex(0x7fca0821f288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.080325 futex(0x7fca0821f288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.081264 futex(0x7fca241d3488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.087148 futex(0x7fca241d3488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.088327 futex(0x7fca14232a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.095914 futex(0x7fca14232a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.096480 futex(0x7fca14236088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.114486 futex(0x7fca14236088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.115069 futex(0x7fca1c2a1e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.120527 futex(0x7fca1c2a1e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.121010 futex(0x7fca1423a888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.123016 futex(0x7fca1423a888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.123952 futex(0x7fca08235a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.125725 futex(0x7fca08235a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.125869 futex(0x7fca241da088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.128132 futex(0x7fca241da088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.128762 futex(0x7fca08236c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.129826 futex(0x7fca0823a288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.136600 futex(0x7fca0823a288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.136678 futex(0x7fca08236c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.137266 futex(0x7fca14243888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.138208 futex(0x7fca14243888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.138483 futex(0x7fca14245c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.141145 futex(0x7fca14245c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.141629 futex(0x7fca0823b488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.148884 futex(0x7fca0823b488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.149466 futex(0x7fca08244488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.163530 futex(0x7fca08244488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.164017 futex(0x7fca241e3088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.165789 futex(0x7fca241e3088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.166189 futex(0x7fca241e4288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.167207 futex(0x7fca241e4288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.167446 futex(0x7fca241e6688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.175002 futex(0x7fca241e6688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.175165 futex(0x7fca08249e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.201875 brk(0x1ab0000) = 0x1ab0000 02:43:38.202880 brk(0x1ad1000) = 0x1ad1000 02:43:38.203531 futex(0x7fca08249e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.204298 futex(0x7fca14248088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.211265 futex(0x7fca14248088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.211322 futex(0x7fca08278088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.218837 futex(0x7fca08278088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.219486 futex(0x7fca0827b688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.234784 futex(0x7fca0827b688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.235856 futex(0x7fca1424a488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.241496 futex(0x7fca1424a488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.241695 futex(0x7fca1424c888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.251347 futex(0x7fca1424c888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.253046 futex(0x7fca1424fe88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.265822 futex(0x7fca1424fe88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.266630 futex(0x7fca1c2af688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.267014 futex(0x7fca1c2af688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.267468 futex(0x7fca08281088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.271660 futex(0x7fca08281088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.272099 futex(0x7fca1c2b6288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.283208 futex(0x7fca1c2b6288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.283566 futex(0x7fca14264288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.294350 futex(0x7fca14264288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.294488 futex(0x7fca14265488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.300743 futex(0x7fca14265488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.300914 futex(0x7fca241f3e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.305192 futex(0x7fca241f3e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.305568 futex(0x7fca08285888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.320065 futex(0x7fca08285888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.322954 futex(0x7fca241f7488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.331222 futex(0x7fca241f7488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.332532 futex(0x7fca0828b288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.335347 futex(0x7fca0828b288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.335705 futex(0x7fca0828e888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.339952 futex(0x7fca0828e888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.340225 futex(0x7fca1c2c4c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.344216 futex(0x7fca1c2c4c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.344677 futex(0x7fca241fe088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.352521 futex(0x7fca241fe088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.354493 futex(0x7fca1c2c8288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.362032 futex(0x7fca1c2c8288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.362193 futex(0x7fca1c2c9488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.373833 futex(0x7fca1c2c9488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.376214 futex(0x7fca24205e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.376630 futex(0x7fca24205e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.376728 futex(0x7fca14270888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.381719 futex(0x7fca14270888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.383326 futex(0x7fca14271a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.386294 futex(0x7fca14271a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.386466 futex(0x7fca24207088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.389662 futex(0x7fca24207088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.389995 futex(0x7fca08291e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.393521 futex(0x7fca08291e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.393759 futex(0x7fca2420a688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.396943 futex(0x7fca2420a688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.397418 futex(0x7fca1c2d1288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.410051 futex(0x7fca1c2d1288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.411491 futex(0x7fca08294288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.415521 futex(0x7fca08294288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.415898 futex(0x7fca08298a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.416329 futex(0x7fca08298a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.416762 futex(0x7fca0829ae88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.421977 futex(0x7fca0829ae88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.422660 futex(0x7fca14276288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.422891 futex(0x7fca14276288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.423228 futex(0x7fca24213688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.428020 futex(0x7fca24213688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.428172 futex(0x7fca14278688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.431172 futex(0x7fca14278688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.431355 futex(0x7fca1427bc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.434512 futex(0x7fca1427bc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.436124 futex(0x7fca1c2d5a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.443540 futex(0x7fca1c2d5a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.444578 futex(0x7fca1c2d9088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.449735 futex(0x7fca1c2d9088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.450798 futex(0x7fca082abc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.452626 futex(0x7fca082abc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.453915 futex(0x7fca2421a288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.459032 futex(0x7fca2421a288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.459264 futex(0x7fca2421d888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.463065 futex(0x7fca2421d888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.463295 futex(0x7fca14283a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.472130 futex(0x7fca14283a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.472681 futex(0x7fca1c2e0e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.485485 futex(0x7fca1c2e0e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.485928 futex(0x7fca2421fc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.492546 futex(0x7fca2421fc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.492890 futex(0x7fca1c2e3288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.508207 futex(0x7fca1c2e3288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.510405 futex(0x7fca14285e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.514813 futex(0x7fca14285e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.515171 futex(0x7fca1c2e8c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.517615 futex(0x7fca1c2e8c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.519303 futex(0x7fca24223288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.524793 futex(0x7fca24223288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.525402 futex(0x7fca24228c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.527813 futex(0x7fca24228c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.527936 futex(0x7fca082bb888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.534554 futex(0x7fca082bb888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.534945 futex(0x7fca2422b088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.549886 futex(0x7fca2422b088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.550216 futex(0x7fca1428a688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.566707 futex(0x7fca1428a688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.567725 futex(0x7fca1428dc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.571907 futex(0x7fca1428dc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.572342 futex(0x7fca082c0088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.574768 futex(0x7fca082c0088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.574865 futex(0x7fca1c2ef888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.581267 futex(0x7fca1c2ef888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.582096 futex(0x7fca1429c688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.585474 futex(0x7fca1429c688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.586660 futex(0x7fca1429d888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.587067 futex(0x7fca1429d888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.587237 futex(0x7fca1c2f2e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.587868 futex(0x7fca1c2f2e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.588037 futex(0x7fca1c2f5288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.592809 futex(0x7fca1c2f5288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.593224 futex(0x7fca1429ea88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.602354 futex(0x7fca1429ea88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.602669 futex(0x7fca1c2f6488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.604667 futex(0x7fca1c2f6488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.604869 futex(0x7fca082c7e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.613535 futex(0x7fca082c7e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.615320 futex(0x7fca082ca288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.616261 futex(0x7fca082ca288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.616808 futex(0x7fca1c2fac88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.633626 futex(0x7fca1c2fac88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.635791 futex(0x7fca2423f488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.641171 futex(0x7fca2423f488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.641563 futex(0x7fca082d0e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.642610 futex(0x7fca082d0e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.642759 futex(0x7fca1c306088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.650755 futex(0x7fca1c306088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.651707 futex(0x7fca1c309688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.652818 futex(0x7fca1c309688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.652991 futex(0x7fca142a9e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.653804 futex(0x7fca142a9e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.653928 futex(0x7fca142ab088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.657778 futex(0x7fca142ab088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.659581 futex(0x7fca24249688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.666317 futex(0x7fca24249688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.667089 futex(0x7fca2424ba88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.672297 futex(0x7fca2424ba88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.673240 futex(0x7fca082d7a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.681391 futex(0x7fca082d7a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.682199 futex(0x7fca1c311488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.684835 futex(0x7fca1c311488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.685096 futex(0x7fca1c314a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.692887 futex(0x7fca1c314a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.693105 futex(0x7fca082db088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.693734 futex(0x7fca082db088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.693968 futex(0x7fca1c318088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.711769 futex(0x7fca1c318088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.712790 futex(0x7fca142bd088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.714638 futex(0x7fca142bd088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.715387 futex(0x7fca1c321088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.716950 futex(0x7fca1c321088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.717177 futex(0x7fca1c323488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.724074 futex(0x7fca1c323488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.725001 futex(0x7fca082df888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.733808 futex(0x7fca082df888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.735634 futex(0x7fca1c326a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.739278 futex(0x7fca1c326a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.739680 futex(0x7fca142c9688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.742485 futex(0x7fca142c9688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.742787 futex(0x7fca1c32b288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.743960 futex(0x7fca1c32b288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.744091 futex(0x7fca1c32c488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.749646 futex(0x7fca1c32c488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.749824 futex(0x7fca082e8888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.754268 futex(0x7fca082e8888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.754619 futex(0x7fca24252688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.756956 futex(0x7fca24252688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.757070 futex(0x7fca1c32e888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.767757 futex(0x7fca1c32e888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.768683 futex(0x7fca142ccc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.784076 futex(0x7fca142ccc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.786045 futex(0x7fca082ed088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.795678 futex(0x7fca082ed088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.795878 futex(0x7fca24255c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.798866 futex(0x7fca24255c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.799045 futex(0x7fca24256e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.808358 futex(0x7fca24256e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.808600 futex(0x7fca082ef488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.823234 futex(0x7fca082ef488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.823532 futex(0x7fca1c342c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.834754 futex(0x7fca1c342c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.835320 futex(0x7fca24259288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.841589 futex(0x7fca24259288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.842177 futex(0x7fca1c346288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.844921 futex(0x7fca1c346288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.845267 futex(0x7fca2425da88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.853681 futex(0x7fca2425da88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.854211 futex(0x7fca1c34ce88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.858800 futex(0x7fca1c34ce88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.861521 futex(0x7fca24261088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.862593 futex(0x7fca24261088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.862903 futex(0x7fca082f8488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.871152 futex(0x7fca082f8488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.871639 futex(0x7fca1c352888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.875437 futex(0x7fca1c352888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.875756 futex(0x7fca082fba88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.888423 futex(0x7fca082fba88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.888842 futex(0x7fca1c353a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.891809 futex(0x7fca1c353a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.892076 futex(0x7fca08302688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.906916 futex(0x7fca08302688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.907555 futex(0x7fca1c357088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.922440 futex(0x7fca1c357088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.924115 futex(0x7fca142db688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.927637 futex(0x7fca142db688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.928211 futex(0x7fca1c35dc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.936018 futex(0x7fca1c35dc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.936796 futex(0x7fca1c362488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.939702 futex(0x7fca1c362488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.940236 futex(0x7fca08308088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.953839 futex(0x7fca08308088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.954604 futex(0x7fca142e1088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.963980 futex(0x7fca142e1088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.964664 futex(0x7fca1c367e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.977132 futex(0x7fca1c367e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.979894 futex(0x7fca2426d688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.982984 futex(0x7fca2426d688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.984131 futex(0x7fca142eb288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.985525 futex(0x7fca142eb288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.985866 futex(0x7fca08311088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.986887 futex(0x7fca08311088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.987315 futex(0x7fca08313488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.989290 futex(0x7fca08313488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.990564 futex(0x7fca24271e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:38.998626 futex(0x7fca24271e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:38.999835 futex(0x7fca24275488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.007014 futex(0x7fca24275488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.009235 futex(0x7fca08317c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.014143 futex(0x7fca08317c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.015401 futex(0x7fca142f4288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.015856 futex(0x7fca142f4288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.016027 futex(0x7fca1c376888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.022085 futex(0x7fca1c376888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.023208 futex(0x7fca2427c088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.025961 futex(0x7fca2427c088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.026077 futex(0x7fca142f5488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.029024 futex(0x7fca142f5488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.029226 futex(0x7fca0831c488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.041547 futex(0x7fca0831c488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.041838 futex(0x7fca0831fa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.046589 futex(0x7fca0831fa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.046832 futex(0x7fca1c37c288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.054653 futex(0x7fca1c37c288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.054912 futex(0x7fca2427d288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.063973 futex(0x7fca2427d288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.064432 futex(0x7fca1c37e688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.065457 futex(0x7fca1c37e688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.066098 futex(0x7fca1c381c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.075042 futex(0x7fca1c381c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.075255 futex(0x7fca142f8a88, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:39.075383 futex(0x7fca142f8a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.075758 futex(0x7fca24280888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.084604 futex(0x7fca24280888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.088340 futex(0x7fca24297088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.100291 futex(0x7fca24297088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.102653 futex(0x7fca08321e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.105301 futex(0x7fca08321e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.106550 futex(0x7fca14306288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.107769 futex(0x7fca14306288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.108027 futex(0x7fca08323088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.113183 futex(0x7fca08323088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.113280 futex(0x7fca242a0088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.116438 futex(0x7fca242a0088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.116746 futex(0x7fca1c388888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.120287 futex(0x7fca1c388888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.120361 futex(0x7fca1c389a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.121600 futex(0x7fca1c389a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.121821 futex(0x7fca242a2488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.128695 futex(0x7fca242a2488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.129193 futex(0x7fca08326688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.137414 futex(0x7fca08326688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.137660 futex(0x7fca08327888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.141933 futex(0x7fca08327888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.142233 futex(0x7fca242a6c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.149310 futex(0x7fca242a6c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.149729 futex(0x7fca1430aa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.159854 futex(0x7fca1430aa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.160171 futex(0x7fca08335088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.174075 futex(0x7fca08335088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.175129 futex(0x7fca1c390688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.175879 futex(0x7fca1c390688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.176646 futex(0x7fca1430ce88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.184094 futex(0x7fca1430ce88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.184247 futex(0x7fca242a9088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.185378 futex(0x7fca242a9088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.185750 futex(0x7fca242ac688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.188458 futex(0x7fca242ac688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.188733 futex(0x7fca14314c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.189902 futex(0x7fca14314c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.190009 futex(0x7fca14315e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.195966 futex(0x7fca14315e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.196086 futex(0x7fca0833bc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.200052 futex(0x7fca0833bc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.201470 futex(0x7fca242afc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.208891 futex(0x7fca242afc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.209256 futex(0x7fca242b0e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.215485 futex(0x7fca242b0e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.218669 futex(0x7fca242d0688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.219253 futex(0x7fca242d0688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.219310 futex(0x7fca242d1888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.224117 futex(0x7fca242d1888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.224188 futex(0x7fca14319488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.229685 futex(0x7fca14319488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.229883 futex(0x7fca242d4e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.232591 futex(0x7fca242d4e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.232705 futex(0x7fca14321288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.235646 futex(0x7fca14321288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.235991 futex(0x7fca14326c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.245689 futex(0x7fca14326c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.245803 futex(0x7fca0833ce88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.257853 futex(0x7fca0833ce88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.258631 futex(0x7fca242d6088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.261106 futex(0x7fca242d6088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.262635 futex(0x7fca08342888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.268358 futex(0x7fca08342888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.269600 futex(0x7fca1c397288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.279892 futex(0x7fca1c397288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.280346 futex(0x7fca1c399688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.283297 futex(0x7fca1c399688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.283858 futex(0x7fca1c39ba88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.286205 futex(0x7fca1c39ba88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.286464 futex(0x7fca1c39cc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.289220 futex(0x7fca1c39cc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.289345 futex(0x7fca1c39de88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.290563 futex(0x7fca1c39de88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.291277 futex(0x7fca1432d888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.298415 futex(0x7fca1432d888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.298584 futex(0x7fca0834a688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.302221 futex(0x7fca0834a688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.302835 futex(0x7fca1432fc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.303312 futex(0x7fca1432fc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.303468 futex(0x7fca14330e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.305448 futex(0x7fca14330e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.305966 futex(0x7fca14333288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.313785 futex(0x7fca14333288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.315483 futex(0x7fca14336888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.318212 futex(0x7fca14336888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.318484 futex(0x7fca1c3a2688, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:39.318621 futex(0x7fca1c3a2688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.318794 futex(0x7fca1c3a4a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.323056 futex(0x7fca1c3a4a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.323931 futex(0x7fca242dcc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.329456 futex(0x7fca242dcc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.330377 futex(0x7fca242e0288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.331421 futex(0x7fca242e0288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.331764 futex(0x7fca1c3a6e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.332292 futex(0x7fca1c3a6e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.332426 futex(0x7fca08354888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.334687 futex(0x7fca08354888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.334836 futex(0x7fca08356c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.338698 futex(0x7fca08356c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.338969 futex(0x7fca1c3a8088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.346342 futex(0x7fca1c3a8088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.346754 futex(0x7fca0835a288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.355856 futex(0x7fca0835a288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.356059 futex(0x7fca14340a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.368113 futex(0x7fca14340a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.368338 futex(0x7fca0835b488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.372530 futex(0x7fca0835b488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.372813 futex(0x7fca1c3aa488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.378926 futex(0x7fca1c3aa488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.379657 futex(0x7fca14342e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.383662 futex(0x7fca14342e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.384027 futex(0x7fca242e4a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.386623 futex(0x7fca242e4a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.387882 futex(0x7fca242ea488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.388946 futex(0x7fca242ea488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.389240 futex(0x7fca242ec888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.394685 futex(0x7fca242ec888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.394835 futex(0x7fca14348888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.395397 futex(0x7fca14348888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.395689 futex(0x7fca08360e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.397424 futex(0x7fca08360e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.397645 futex(0x7fca08362088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.399637 futex(0x7fca08362088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.399943 futex(0x7fca1434ac88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.404901 futex(0x7fca1434ac88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.405237 futex(0x7fca08364488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.410850 futex(0x7fca08364488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.411563 futex(0x7fca1c3afe88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.420713 futex(0x7fca1c3afe88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.421829 futex(0x7fca1434f488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.434995 futex(0x7fca1434f488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.436071 futex(0x7fca0836e688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.442146 futex(0x7fca0836e688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.442870 futex(0x7fca14352a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.445539 futex(0x7fca14352a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.445842 futex(0x7fca242f7c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.452772 futex(0x7fca242f7c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.453290 futex(0x7fca1c3b6a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.454296 futex(0x7fca1c3b6a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.454438 futex(0x7fca1c3b7c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.455495 futex(0x7fca1c3b7c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.455655 futex(0x7fca14353c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.458087 futex(0x7fca14353c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.458268 futex(0x7fca08372e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.460644 futex(0x7fca08372e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.461592 futex(0x7fca1c3bb288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.467218 futex(0x7fca1c3bb288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.468014 futex(0x7fca242fe888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.477551 futex(0x7fca242fe888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.477952 futex(0x7fca08378888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.484166 futex(0x7fca08378888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.484591 futex(0x7fca0837ac88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.493152 futex(0x7fca0837ac88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.494026 futex(0x7fca1c3c4288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.502779 futex(0x7fca1c3c4288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.505012 futex(0x7fca1c3d2c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.507609 futex(0x7fca1c3d2c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.508136 futex(0x7fca0837f488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.512872 futex(0x7fca0837f488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.513008 futex(0x7fca1435de88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.518197 futex(0x7fca1435de88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.518445 futex(0x7fca08380688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.520860 futex(0x7fca08380688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.521108 futex(0x7fca24305488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.527841 futex(0x7fca24305488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.528187 futex(0x7fca1435f088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.537745 futex(0x7fca1435f088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.538633 futex(0x7fca1c3d8688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.545917 futex(0x7fca1c3d8688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.547485 futex(0x7fca08387288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.550438 futex(0x7fca08387288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.551814 futex(0x7fca14365c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.553032 futex(0x7fca14365c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.553294 futex(0x7fca24308a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.562858 futex(0x7fca24308a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.563426 futex(0x7fca1c3dce88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.569348 futex(0x7fca1c3dce88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.571166 futex(0x7fca1c3e7088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.590882 futex(0x7fca1c3e7088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.592128 futex(0x7fca0838a888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.594012 futex(0x7fca0838a888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.594217 futex(0x7fca14368088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.597318 futex(0x7fca14368088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.597952 futex(0x7fca1c3eb888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.602192 futex(0x7fca1c3eb888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.602740 futex(0x7fca1c3edc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.612217 futex(0x7fca1c3edc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.614302 futex(0x7fca0838de88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.616739 futex(0x7fca0838de88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.616989 futex(0x7fca1436ec88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.619479 futex(0x7fca1436ec88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.620011 futex(0x7fca1c3f3688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.620611 futex(0x7fca1c3f3688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.620870 futex(0x7fca14371088, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:39.620988 futex(0x7fca14371088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.621175 futex(0x7fca14373488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.631633 futex(0x7fca14373488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.634290 futex(0x7fca08390288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.636687 futex(0x7fca08390288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.636833 futex(0x7fca08391488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.639181 futex(0x7fca08391488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.639495 futex(0x7fca24317488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.640626 futex(0x7fca24317488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.640805 futex(0x7fca08393888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.643592 futex(0x7fca08393888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.643819 futex(0x7fca2431aa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.647662 futex(0x7fca2431aa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.647975 futex(0x7fca1c3f5a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.649984 futex(0x7fca1c3f5a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.650729 futex(0x7fca1437b288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.651468 futex(0x7fca1437b288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.651736 futex(0x7fca1437e888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.658140 futex(0x7fca1437e888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.659568 futex(0x7fca08394a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.660206 futex(0x7fca08394a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.660666 futex(0x7fca2431f288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.666282 futex(0x7fca2431f288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.666648 futex(0x7fca1c3f7e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.673205 futex(0x7fca1c3f7e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.673457 futex(0x7fca24320488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.677144 futex(0x7fca24320488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.677620 futex(0x7fca14381e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.680457 futex(0x7fca14381e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.680610 futex(0x7fca08396e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.688413 futex(0x7fca08396e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.688621 futex(0x7fca1c3fa288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.692861 futex(0x7fca1c3fa288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.693601 futex(0x7fca14385488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.709022 futex(0x7fca14385488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.709680 futex(0x7fca1c3fc688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.714690 futex(0x7fca1c3fc688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.715564 futex(0x7fca14388a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.720103 futex(0x7fca14388a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.720439 futex(0x7fca14389c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.727396 futex(0x7fca14389c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.728152 futex(0x7fca1c403288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.737920 futex(0x7fca1c403288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.738658 futex(0x7fca08399288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.746931 futex(0x7fca08399288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.747181 futex(0x7fca2432ca88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.748877 futex(0x7fca2432ca88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.749179 futex(0x7fca0839c888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.759922 futex(0x7fca0839c888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.760619 futex(0x7fca14390888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.770713 futex(0x7fca14390888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.771250 futex(0x7fca083a6a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.777744 futex(0x7fca083a6a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.779566 futex(0x7fca083ac488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.793444 futex(0x7fca083ac488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.795828 futex(0x7fca1c409e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.801010 futex(0x7fca1c409e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.801189 futex(0x7fca1439ce88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.803963 futex(0x7fca1439ce88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.804567 futex(0x7fca24335a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.806651 futex(0x7fca24335a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.806803 futex(0x7fca24336c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.808527 futex(0x7fca24336c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.808693 futex(0x7fca1c40b088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.811297 futex(0x7fca1c40b088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.811882 futex(0x7fca083b1e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.830090 futex(0x7fca083b1e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.832011 futex(0x7fca1c418888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.837597 futex(0x7fca1c418888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.837730 futex(0x7fca24337e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.847347 futex(0x7fca24337e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.847726 futex(0x7fca143a8288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.850375 futex(0x7fca143a8288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.851552 futex(0x7fca143aca88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.854642 futex(0x7fca143aca88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.855331 futex(0x7fca143b0088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.860434 futex(0x7fca143b0088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.861157 futex(0x7fca143b3688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.863442 futex(0x7fca143b3688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.863605 futex(0x7fca1c419a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.865085 futex(0x7fca1c419a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.865245 futex(0x7fca1c41ac88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.865505 futex(0x7fca1c41ac88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.865951 futex(0x7fca143b5a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.873523 futex(0x7fca143b5a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.874188 futex(0x7fca1c41e288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.876460 futex(0x7fca1c41e288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.876867 futex(0x7fca083c5088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.880329 futex(0x7fca083c5088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.880851 futex(0x7fca143ba288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.881419 futex(0x7fca143ba288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.881715 futex(0x7fca143bb488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.884619 futex(0x7fca143bb488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.884776 futex(0x7fca143bea88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.885054 futex(0x7fca143bea88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.885464 futex(0x7fca24344488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.889313 futex(0x7fca24344488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.889611 futex(0x7fca143bfc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.892337 futex(0x7fca143bfc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.892491 futex(0x7fca143c0e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.899046 futex(0x7fca143c0e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.901008 futex(0x7fca083caa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.907543 futex(0x7fca083caa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.909387 futex(0x7fca143c4488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.911005 futex(0x7fca143c5688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.917531 futex(0x7fca143c4488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.917626 futex(0x7fca143c5688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.918186 futex(0x7fca24347a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.926755 futex(0x7fca24347a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.927349 futex(0x7fca1c426088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.933872 futex(0x7fca1c426088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.934011 futex(0x7fca083d0488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.945898 futex(0x7fca083d0488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.946854 futex(0x7fca1c428488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.948804 futex(0x7fca1c428488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.949140 futex(0x7fca1c42de88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.950512 futex(0x7fca1c42de88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.950613 futex(0x7fca1c42f088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.958711 futex(0x7fca1c42f088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.959157 futex(0x7fca143ce688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.960096 futex(0x7fca143ce688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.960332 futex(0x7fca1c431488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.963509 futex(0x7fca1c431488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.963638 futex(0x7fca1c432688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.965050 futex(0x7fca1c432688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.965201 futex(0x7fca2434d488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.967502 futex(0x7fca2434d488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.968450 futex(0x7fca24355288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.970481 futex(0x7fca24355288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.970825 futex(0x7fca24356488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.972076 futex(0x7fca24356488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.972361 futex(0x7fca1c433888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.974078 futex(0x7fca1c433888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.976778 futex(0x7fca143d2e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.978128 futex(0x7fca143d2e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.978331 futex(0x7fca1c434a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.980227 futex(0x7fca1c434a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.980621 futex(0x7fca24358888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.982605 futex(0x7fca24358888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.983206 futex(0x7fca1c435c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.989888 futex(0x7fca1c435c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.990441 futex(0x7fca083ddc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:39.992116 futex(0x7fca083ddc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:39.995684 futex(0x7fca143d8888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.000454 futex(0x7fca143d8888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.000675 futex(0x7fca2435d088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.016732 futex(0x7fca2435d088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.017685 futex(0x7fca143d9a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.020266 futex(0x7fca143d9a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.020404 futex(0x7fca083e3688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.021310 futex(0x7fca083e3688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.021503 futex(0x7fca24366088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.024909 futex(0x7fca24366088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.025057 futex(0x7fca083e4888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.025287 futex(0x7fca083e4888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.025560 futex(0x7fca143dbe88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.028873 futex(0x7fca143dbe88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.029271 futex(0x7fca143e0688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.035615 futex(0x7fca143e0688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.035806 futex(0x7fca1c43fe88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.043508 futex(0x7fca1c43fe88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.043880 futex(0x7fca083e6c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.052535 futex(0x7fca083e6c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.052675 futex(0x7fca083e7e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.064526 futex(0x7fca083e7e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.064702 futex(0x7fca2436a888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.078106 futex(0x7fca2436a888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.082056 futex(0x7fca2436de88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.101563 futex(0x7fca2436de88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.103976 futex(0x7fca1c447c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.105553 futex(0x7fca1c447c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.106703 futex(0x7fca083f5688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.107652 futex(0x7fca083f5688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.107798 futex(0x7fca083f6888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.109671 futex(0x7fca083f6888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.109972 futex(0x7fca24373888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.112142 futex(0x7fca24373888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.112458 futex(0x7fca143f3888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.121256 futex(0x7fca143f3888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.121357 futex(0x7fca24374a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.122556 futex(0x7fca24374a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.122757 futex(0x7fca143f4a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.134793 futex(0x7fca143f4a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.134966 futex(0x7fca1c44b288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.152794 futex(0x7fca1c44b288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.154174 futex(0x7fca2437c888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.159272 futex(0x7fca2437c888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.159419 futex(0x7fca083fd488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.160970 futex(0x7fca083fd488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.162144 futex(0x7fca143f9288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.173319 futex(0x7fca143f9288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.173614 futex(0x7fca08402e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.175751 futex(0x7fca08402e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.175911 futex(0x7fca2437da88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.179449 futex(0x7fca2437da88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.181333 futex(0x7fca143fda88, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:40.181588 futex(0x7fca143fda88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.181709 futex(0x7fca1c453088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.183986 futex(0x7fca1c453088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.184119 futex(0x7fca143fec88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.188065 futex(0x7fca143fec88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.188450 futex(0x7fca08406488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.190008 futex(0x7fca08406488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.190818 futex(0x7fca14402288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.199826 futex(0x7fca14402288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.199968 futex(0x7fca0840ac88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.202018 futex(0x7fca0840ac88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.202182 futex(0x7fca0840be88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.205050 futex(0x7fca0840be88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.205311 futex(0x7fca14403488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.208777 futex(0x7fca14403488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.209129 futex(0x7fca1c455488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.210761 futex(0x7fca1c455488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.211145 futex(0x7fca24382288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.219651 futex(0x7fca24382288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.220148 futex(0x7fca14405888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.221189 futex(0x7fca14405888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.221551 futex(0x7fca1c458a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.228640 futex(0x7fca1c458a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.228948 futex(0x7fca0840f488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.236816 futex(0x7fca0840f488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.237278 futex(0x7fca1440c488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.247123 futex(0x7fca1440c488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.249203 futex(0x7fca08412a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.263147 futex(0x7fca08412a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.265650 futex(0x7fca1c45ae88, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:40.265830 futex(0x7fca1c45ae88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.266157 futex(0x7fca14413088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.268277 futex(0x7fca14413088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.269327 futex(0x7fca14415488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.272967 futex(0x7fca14415488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.273189 futex(0x7fca08417288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.276051 futex(0x7fca08417288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.276279 futex(0x7fca1c45e488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.278094 futex(0x7fca1c45e488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.280117 futex(0x7fca1c460888, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:40.280636 futex(0x7fca1c460888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.280886 futex(0x7fca1c465088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.281662 futex(0x7fca1c465088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.281831 futex(0x7fca1c467488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.287133 futex(0x7fca1c467488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.287636 futex(0x7fca2438c488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.295604 futex(0x7fca2438c488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.296242 futex(0x7fca1c46aa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.297508 futex(0x7fca1c46aa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.298167 futex(0x7fca1c46e088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.299943 futex(0x7fca1c46e088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.300130 futex(0x7fca1c46f288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.305257 futex(0x7fca1c46f288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.305569 futex(0x7fca0841f088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.316868 futex(0x7fca0841f088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.318122 futex(0x7fca2438d688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.324167 futex(0x7fca2438d688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.325086 futex(0x7fca1c471688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.327190 futex(0x7fca1c471688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.328091 futex(0x7fca08428088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.336603 futex(0x7fca08428088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.337602 futex(0x7fca1c474c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.343017 futex(0x7fca1c474c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.343943 futex(0x7fca14421a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.358545 futex(0x7fca14421a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.360161 futex(0x7fca0842da88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.369724 futex(0x7fca0842da88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.371494 futex(0x7fca1c47a688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.372890 futex(0x7fca1c47a688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.373012 futex(0x7fca243a0888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.377960 futex(0x7fca243a0888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.379534 futex(0x7fca243a5088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.391706 futex(0x7fca243a5088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.392702 futex(0x7fca243ace88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.397556 futex(0x7fca243ace88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.397733 futex(0x7fca14431688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.412850 futex(0x7fca14431688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.414622 futex(0x7fca08438e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.433783 futex(0x7fca08438e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.434154 futex(0x7fca14437088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.442948 futex(0x7fca14437088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.443217 futex(0x7fca0843e888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.445006 futex(0x7fca0843e888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.445310 futex(0x7fca1c482488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.450106 futex(0x7fca1c482488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.452229 futex(0x7fca1c48ea88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.461996 futex(0x7fca1c48ea88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.462680 futex(0x7fca1c496888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.470734 futex(0x7fca1c496888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.472094 futex(0x7fca243b3a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.478907 futex(0x7fca243b3a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.479284 futex(0x7fca0844d288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.481248 futex(0x7fca0844d288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.481460 futex(0x7fca0844e488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.488292 futex(0x7fca0844e488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.488861 futex(0x7fca08450888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.498966 futex(0x7fca08450888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.501128 futex(0x7fca08455088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.505107 futex(0x7fca08455088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.505816 futex(0x7fca0845bc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.507338 futex(0x7fca0845bc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.507850 futex(0x7fca08460488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.516356 futex(0x7fca08460488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.516831 futex(0x7fca08464c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.518023 futex(0x7fca08464c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.518417 futex(0x7fca1443b888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.525444 futex(0x7fca1443b888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.525673 futex(0x7fca1443dc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.526185 futex(0x7fca1443dc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.526443 futex(0x7fca14440088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.535319 futex(0x7fca14440088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.536045 futex(0x7fca243b7088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.537589 futex(0x7fca243b7088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.538042 futex(0x7fca1c4a1c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.545202 futex(0x7fca1c4a1c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.545319 futex(0x7fca1c4a2e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.549863 futex(0x7fca1c4a2e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.550015 futex(0x7fca08469488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.569481 futex(0x7fca08469488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.572197 futex(0x7fca14449088, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:40.572361 futex(0x7fca14449088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.572568 futex(0x7fca1444b488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.581933 futex(0x7fca1444b488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.582343 futex(0x7fca1c4a4088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.586426 futex(0x7fca1c4a4088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.586669 futex(0x7fca243c0088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.590476 futex(0x7fca243c0088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.591710 futex(0x7fca1444fc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.594049 futex(0x7fca1444fc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.594249 futex(0x7fca1c4af488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.597503 futex(0x7fca1c4af488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.597807 futex(0x7fca1c4b0688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.602175 futex(0x7fca1c4b0688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.602594 futex(0x7fca1c4b2a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.608117 futex(0x7fca1c4b2a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.608349 futex(0x7fca1c4b4e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.620731 futex(0x7fca1c4b4e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.621669 futex(0x7fca14452088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.625182 futex(0x7fca14452088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.625446 futex(0x7fca08471288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.626421 futex(0x7fca08471288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.626705 futex(0x7fca08472488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.628027 futex(0x7fca08472488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.628170 futex(0x7fca08473688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.634660 futex(0x7fca08473688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.635025 futex(0x7fca1c4ba888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.638632 futex(0x7fca1c4ba888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.639269 futex(0x7fca14455688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.646344 futex(0x7fca14455688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.646654 futex(0x7fca243c6c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.649537 futex(0x7fca243c6c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.650017 futex(0x7fca243cb488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.656571 futex(0x7fca243cb488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.656802 futex(0x7fca243cc688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.668349 futex(0x7fca243cc688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.668903 futex(0x7fca243cea88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.670788 futex(0x7fca243cea88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.670955 futex(0x7fca14457a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.674767 futex(0x7fca14457a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.674901 futex(0x7fca1c4bf088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.678959 futex(0x7fca1c4bf088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.679933 futex(0x7fca243d0e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.684333 futex(0x7fca243d0e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.685592 futex(0x7fca08477e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.689708 futex(0x7fca08477e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.689991 futex(0x7fca1c4c4a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.695385 futex(0x7fca1c4c4a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.696586 futex(0x7fca1c4c8088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.697011 futex(0x7fca1c4c8088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.697211 futex(0x7fca0847ea88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.701930 futex(0x7fca0847ea88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.702439 futex(0x7fca1c4ca488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.704295 futex(0x7fca1c4ca488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.704449 futex(0x7fca08482088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.709481 futex(0x7fca08482088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.709665 futex(0x7fca1c4cb688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.714098 futex(0x7fca1c4cb688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.714203 futex(0x7fca243d4488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.715583 futex(0x7fca243d4488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.716216 futex(0x7fca1445e688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.717964 futex(0x7fca1445e688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.718075 futex(0x7fca1c4cc888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.724630 futex(0x7fca1c4cc888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.724869 futex(0x7fca08487a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.725160 futex(0x7fca08487a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.725400 futex(0x7fca1c4cec88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.727510 futex(0x7fca1c4cec88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.728640 futex(0x7fca1c4d5888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.741029 futex(0x7fca1c4d5888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.743297 futex(0x7fca1c4d6a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.748943 futex(0x7fca1c4d6a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.749543 futex(0x7fca0848c288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.761096 futex(0x7fca0848c288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.762859 futex(0x7fca08490a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.769523 futex(0x7fca08490a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.769887 futex(0x7fca243e1c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.771813 futex(0x7fca243e1c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.772276 futex(0x7fca14468888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.772850 futex(0x7fca14468888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.773022 futex(0x7fca1c4da088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.790975 futex(0x7fca1c4da088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.792344 futex(0x7fca1c4e3088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.796046 futex(0x7fca1c4e3088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.796472 futex(0x7fca08497688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.809062 futex(0x7fca08497688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.810616 futex(0x7fca1446d088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.816440 futex(0x7fca1446d088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.816589 futex(0x7fca1446e288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.819954 futex(0x7fca1446e288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.820707 futex(0x7fca243eac88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.829939 futex(0x7fca243eac88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.831897 futex(0x7fca084a0688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.838224 futex(0x7fca084a0688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.839417 futex(0x7fca14474e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.848359 futex(0x7fca14474e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.849654 futex(0x7fca1c4ee488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.854258 futex(0x7fca1c4ee488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.854531 futex(0x7fca1447cc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.857512 futex(0x7fca1447cc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.858617 futex(0x7fca1447f088, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:40.858800 futex(0x7fca1447f088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.858926 futex(0x7fca084a4e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.871025 futex(0x7fca084a4e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.873392 futex(0x7fca243f4e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.882279 futex(0x7fca243f4e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.882450 futex(0x7fca243f6088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.885072 futex(0x7fca243f6088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.885344 futex(0x7fca1c4f0888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.896263 futex(0x7fca1c4f0888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.896598 futex(0x7fca084aa888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.909172 futex(0x7fca084aa888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.909432 futex(0x7fca14485c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.913046 futex(0x7fca14485c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.915969 futex(0x7fca1448ec88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.920020 futex(0x7fca1448ec88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.920166 futex(0x7fca243f8488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.923316 futex(0x7fca243f8488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.923511 futex(0x7fca1448fe88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.925925 futex(0x7fca1448fe88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.927331 futex(0x7fca1c4fce88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.931245 futex(0x7fca1c4fce88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.931378 futex(0x7fca14493488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.933842 futex(0x7fca14493488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.934280 futex(0x7fca1c4fe088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.935232 futex(0x7fca1c4fe088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.935431 futex(0x7fca084b2688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.936947 futex(0x7fca084b2688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.937091 futex(0x7fca14495888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.944898 futex(0x7fca14495888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.945103 futex(0x7fca1c502888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.959801 futex(0x7fca1c502888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.960276 futex(0x7fca243f9688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.969570 futex(0x7fca243f9688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.972049 futex(0x7fca14498e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.985971 futex(0x7fca14498e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.987267 futex(0x7fca243ff088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:40.995581 futex(0x7fca243ff088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:40.995982 futex(0x7fca24401488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.004738 futex(0x7fca24401488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.005088 futex(0x7fca084b6e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.013131 futex(0x7fca084b6e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.015192 futex(0x7fca24404a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.016241 futex(0x7fca24404a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.017820 futex(0x7fca084bec88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.022607 futex(0x7fca084bec88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.022739 futex(0x7fca1449fa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.025678 futex(0x7fca1449fa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.025776 futex(0x7fca144a0c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.026532 futex(0x7fca144a0c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.028126 futex(0x7fca2440b688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.032095 futex(0x7fca2440b688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.032854 futex(0x7fca084c1088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.035648 futex(0x7fca084c1088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.036394 futex(0x7fca2440da88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.039490 futex(0x7fca2440da88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.039834 futex(0x7fca144a1e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.042666 futex(0x7fca144a1e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.043401 futex(0x7fca2440fe88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.051584 futex(0x7fca2440fe88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.052409 futex(0x7fca084c2288, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:41.052602 futex(0x7fca084c2288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.052719 futex(0x7fca24412288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.056794 futex(0x7fca24412288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.057342 futex(0x7fca084c3488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.068509 futex(0x7fca084c3488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.068955 futex(0x7fca084c6a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.072761 futex(0x7fca084c6a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.073110 futex(0x7fca084c7c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.077524 futex(0x7fca084c7c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.080596 futex(0x7fca1c517e88, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:41.080816 futex(0x7fca1c517e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.081136 futex(0x7fca1c519088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.084442 futex(0x7fca1c519088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.084820 futex(0x7fca1c51a288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.091110 futex(0x7fca1c51a288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.091695 futex(0x7fca084cc488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.097055 futex(0x7fca084cc488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.097330 futex(0x7fca144a8a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.097617 futex(0x7fca144a8a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.098724 futex(0x7fca084d1e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.099249 futex(0x7fca084d1e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.099431 futex(0x7fca1c51d888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.102432 futex(0x7fca1c51d888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.102651 futex(0x7fca1c51ea88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.104824 futex(0x7fca1c51ea88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.105299 futex(0x7fca1c51fc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.106496 futex(0x7fca1c51fc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.107444 futex(0x7fca24417c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.109407 futex(0x7fca24417c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.109897 futex(0x7fca1c520e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.116594 futex(0x7fca1c520e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.116924 futex(0x7fca2441a088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.117764 futex(0x7fca2441a088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.120688 futex(0x7fca084d4288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.123545 futex(0x7fca084d4288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.124113 futex(0x7fca2441fa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.127932 futex(0x7fca2441fa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.128161 futex(0x7fca24420c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.132258 futex(0x7fca24420c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.133390 futex(0x7fca1c524488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.135379 futex(0x7fca1c524488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.136132 futex(0x7fca1c525688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.139208 futex(0x7fca1c525688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.141825 futex(0x7fca144b0888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.147193 futex(0x7fca144b0888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.149972 futex(0x7fca24427888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.153764 futex(0x7fca24427888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.153991 futex(0x7fca24429c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.155164 futex(0x7fca24429c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.155634 futex(0x7fca1c52e688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.158211 futex(0x7fca1c52e688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.158352 futex(0x7fca2442ae88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.161200 futex(0x7fca2442ae88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.161560 futex(0x7fca2442c088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.163946 futex(0x7fca2442c088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.164191 futex(0x7fca1c52f888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.172929 futex(0x7fca1c52f888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.174809 futex(0x7fca1c532e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.184777 futex(0x7fca1c532e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.186094 futex(0x7fca084e6288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.189582 futex(0x7fca084e6288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.190028 futex(0x7fca144b5088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.202476 futex(0x7fca144b5088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.202876 futex(0x7fca084e7488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.223916 futex(0x7fca084e7488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.224231 futex(0x7fca084e8688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.227941 futex(0x7fca084e8688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.229302 futex(0x7fca24433e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.239008 futex(0x7fca24433e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.239795 futex(0x7fca084f0488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.241641 futex(0x7fca084f0488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.242048 futex(0x7fca144b8688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.243794 futex(0x7fca144b8688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.244893 futex(0x7fca1c53be88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.254541 futex(0x7fca1c53be88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.254843 futex(0x7fca24438688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.265601 futex(0x7fca24438688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.266574 futex(0x7fca1c53e288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.270819 futex(0x7fca1c53e288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.271012 futex(0x7fca144bbc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.273533 futex(0x7fca144bbc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.273936 futex(0x7fca1c540688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.274885 futex(0x7fca1c540688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.275002 futex(0x7fca084f8288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.276562 futex(0x7fca084f8288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.277281 futex(0x7fca1c546088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.284931 futex(0x7fca1c546088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.285173 futex(0x7fca2443ce88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.292008 futex(0x7fca2443ce88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.292814 futex(0x7fca1c547288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.296195 futex(0x7fca1c547288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.296646 futex(0x7fca24444c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.303978 futex(0x7fca24444c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.304774 futex(0x7fca084fdc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.305825 futex(0x7fca084fdc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.305984 futex(0x7fca1c54a888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.325499 futex(0x7fca1c54a888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.325943 futex(0x7fca084fee88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.330932 futex(0x7fca084fee88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.332646 futex(0x7fca08500088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.340719 futex(0x7fca08500088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.341633 futex(0x7fca08501288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.346443 futex(0x7fca08501288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.347387 futex(0x7fca144c0488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.355636 futex(0x7fca144c0488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.355897 futex(0x7fca144c2888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.356326 futex(0x7fca144c2888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.357417 futex(0x7fca144c3a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.371558 futex(0x7fca144c3a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.373547 futex(0x7fca144c8288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.377553 futex(0x7fca144c8288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.377704 futex(0x7fca24450088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.379148 futex(0x7fca24450088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.380075 futex(0x7fca08505a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.385930 futex(0x7fca08505a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.387612 futex(0x7fca144ca688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.388020 futex(0x7fca144ca688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.389154 futex(0x7fca24456c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.390215 futex(0x7fca24456c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.390820 futex(0x7fca24457e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.398550 futex(0x7fca24457e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.398981 futex(0x7fca08509088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.404228 futex(0x7fca08509088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.404953 futex(0x7fca2445b488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.405660 futex(0x7fca2445b488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.406094 futex(0x7fca1c566a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.411214 futex(0x7fca1c566a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.411851 futex(0x7fca144cdc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.414793 futex(0x7fca144cdc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.415149 futex(0x7fca2445ea88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.419693 futex(0x7fca2445ea88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.420625 futex(0x7fca24460e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.432937 futex(0x7fca24460e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.433962 futex(0x7fca144cee88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.438482 futex(0x7fca144cee88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.439805 futex(0x7fca144d6c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.444419 futex(0x7fca144d6c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.445112 futex(0x7fca144db488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.453736 futex(0x7fca144db488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.453881 futex(0x7fca144dc688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.459311 futex(0x7fca144dc688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.460183 futex(0x7fca08512088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.462554 futex(0x7fca08512088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.462950 futex(0x7fca144dd888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.476914 futex(0x7fca144dd888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.477393 futex(0x7fca24467a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.479150 futex(0x7fca24467a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.479300 futex(0x7fca08516888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.480757 futex(0x7fca08516888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.481036 futex(0x7fca1c576688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.483152 futex(0x7fca1c576688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.483679 futex(0x7fca24468c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.490204 futex(0x7fca24468c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.491153 futex(0x7fca144e0e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.505901 futex(0x7fca144e0e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.506157 futex(0x7fca1c579c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.513044 futex(0x7fca1c579c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.515191 futex(0x7fca144e3288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.519152 futex(0x7fca144e3288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.521397 futex(0x7fca1c583e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.524817 futex(0x7fca1c583e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.524967 futex(0x7fca1c585088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.527442 futex(0x7fca1c585088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.527670 futex(0x7fca2446e688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.530514 futex(0x7fca2446e688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.532196 futex(0x7fca0851f888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.542619 futex(0x7fca0851f888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.542964 futex(0x7fca144e7a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.545249 futex(0x7fca144e7a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.545820 futex(0x7fca1c589888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.553078 futex(0x7fca1c589888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.554452 futex(0x7fca08521c88, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:41.554632 futex(0x7fca08521c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.555012 futex(0x7fca08525288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.555753 futex(0x7fca08525288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.555967 futex(0x7fca1c58ce88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.563025 futex(0x7fca1c58ce88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.563272 futex(0x7fca144ee688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.576598 futex(0x7fca144ee688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.577410 futex(0x7fca08526488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.581385 futex(0x7fca08526488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.581684 futex(0x7fca24472e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.594181 futex(0x7fca24472e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.594606 futex(0x7fca144f4088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.597499 futex(0x7fca144f4088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.598854 futex(0x7fca1c58f288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.607955 futex(0x7fca1c58f288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.609331 futex(0x7fca2447d088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.610431 futex(0x7fca2447d088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.610718 futex(0x7fca144fd088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.614320 futex(0x7fca144fd088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.614551 futex(0x7fca144ff488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.622495 futex(0x7fca144ff488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.622617 futex(0x7fca0852be88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.626877 brk(0x1af2000) = 0x1af2000 02:43:41.627838 futex(0x7fca0852be88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.628969 futex(0x7fca14501888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.639906 futex(0x7fca14501888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.640357 futex(0x7fca14503c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.649069 futex(0x7fca14503c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.651670 futex(0x7fca14504e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.652664 futex(0x7fca14504e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.652897 futex(0x7fca2447f488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.655440 futex(0x7fca2447f488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.656259 futex(0x7fca1450de88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.664224 futex(0x7fca1450de88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.665315 futex(0x7fca14510288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.673280 futex(0x7fca14510288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.673714 futex(0x7fca1c594c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.677896 futex(0x7fca1c594c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.679243 futex(0x7fca1c599488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.687939 futex(0x7fca1c599488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.688999 futex(0x7fca1c59a688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.696124 futex(0x7fca1c59a688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.696288 futex(0x7fca1c59b888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.699511 futex(0x7fca1c59b888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.701554 futex(0x7fca1c59ee88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.703220 futex(0x7fca1c59ee88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.703732 futex(0x7fca1c5a3688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.708913 futex(0x7fca1c5a3688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.709072 futex(0x7fca1c5a4888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.709811 futex(0x7fca1c5a4888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.710015 futex(0x7fca08545c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.711690 futex(0x7fca08545c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.712080 futex(0x7fca1c5a5a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.712966 futex(0x7fca1c5a5a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.713101 futex(0x7fca08546e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.718126 futex(0x7fca08546e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.718598 futex(0x7fca14518088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.719521 futex(0x7fca14518088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.719909 futex(0x7fca08549288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.725738 futex(0x7fca08549288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.726000 futex(0x7fca14519288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.728544 futex(0x7fca14519288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.728685 futex(0x7fca1c5a9088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.731453 futex(0x7fca1c5a9088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.731578 futex(0x7fca0854b688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.734964 futex(0x7fca0854b688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.735208 futex(0x7fca1c5aa288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.738701 futex(0x7fca1c5aa288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.739152 futex(0x7fca0854fe88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.747054 futex(0x7fca0854fe88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.747194 futex(0x7fca1c5aea88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.750815 futex(0x7fca1c5aea88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.750997 futex(0x7fca1c5afc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.757500 futex(0x7fca1c5afc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.757641 futex(0x7fca2448a888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.767265 futex(0x7fca2448a888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.767468 futex(0x7fca1451a488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.771605 futex(0x7fca1451a488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.771732 futex(0x7fca1451b688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.778736 futex(0x7fca1451b688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.779238 futex(0x7fca14521088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.785400 futex(0x7fca14521088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.785621 futex(0x7fca08551088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.789109 futex(0x7fca08551088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.791250 futex(0x7fca1c5b2088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.794337 futex(0x7fca1c5b2088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.794693 futex(0x7fca1c5b4488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.796389 futex(0x7fca1c5b4488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.797279 futex(0x7fca1c5b5688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.803617 futex(0x7fca1c5b5688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.804158 futex(0x7fca1c5b8c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.811438 futex(0x7fca1c5b8c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.813107 futex(0x7fca14522288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.818030 futex(0x7fca14522288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.819096 futex(0x7fca1c5bc288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.820444 futex(0x7fca1c5bc288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.822071 futex(0x7fca1c5be688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.829334 futex(0x7fca1c5be688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.831651 futex(0x7fca14524688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.835415 futex(0x7fca14524688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.835625 futex(0x7fca24495c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.837560 futex(0x7fca24495c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.838468 futex(0x7fca1452b288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.841268 futex(0x7fca1452b288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.842123 futex(0x7fca0855c488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.842634 futex(0x7fca0855c488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.842752 futex(0x7fca1452c488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.846918 futex(0x7fca1452c488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.847235 futex(0x7fca1452fa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.848486 futex(0x7fca1452fa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.848820 futex(0x7fca0855d688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.855776 futex(0x7fca0855d688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.857101 futex(0x7fca14531e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.869862 futex(0x7fca14531e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.871377 futex(0x7fca08561e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.872131 futex(0x7fca08561e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.872887 futex(0x7fca14537888, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:41.873037 futex(0x7fca14537888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.873341 futex(0x7fca2449c888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.876457 futex(0x7fca2449c888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.877740 futex(0x7fca2449ec88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.882170 futex(0x7fca2449ec88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.882933 futex(0x7fca08566688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.883597 futex(0x7fca08566688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.883938 futex(0x7fca2449fe88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.884096 futex(0x7fca2449fe88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.884230 futex(0x7fca1c5dcc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.897585 futex(0x7fca1c5dcc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.899112 futex(0x7fca1c5e4a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.902882 futex(0x7fca1c5e4a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.904809 futex(0x7fca244a1088, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:41.905004 futex(0x7fca244a1088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.905170 futex(0x7fca0856e488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.908712 futex(0x7fca0856e488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.910851 futex(0x7fca244a5888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.913877 futex(0x7fca244a5888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.914974 futex(0x7fca1453ae88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.916854 futex(0x7fca1453ae88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.917458 futex(0x7fca1453c088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.930076 futex(0x7fca1453c088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.932607 futex(0x7fca244a8e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.935335 futex(0x7fca244a8e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.935888 futex(0x7fca1c5ec888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.949928 futex(0x7fca1c5ec888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.952008 futex(0x7fca1c5f3488, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:41.952206 futex(0x7fca1c5f3488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.952686 futex(0x7fca1c5f5888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.954920 futex(0x7fca1c5f5888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.955169 futex(0x7fca1c5f7c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.956714 futex(0x7fca1c5f7c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.957010 futex(0x7fca244ae888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.962724 futex(0x7fca244ae888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.962950 futex(0x7fca08575088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.963329 futex(0x7fca08575088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.964180 futex(0x7fca1c5fe888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.973779 futex(0x7fca1c5fe888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.974228 futex(0x7fca244b0c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.985137 futex(0x7fca244b0c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.987057 futex(0x7fca14541a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.988700 futex(0x7fca14541a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.988918 futex(0x7fca244bc088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.991395 futex(0x7fca244bc088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.991964 futex(0x7fca1c604288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.994039 futex(0x7fca1c604288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.994230 futex(0x7fca244c2c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:41.997326 futex(0x7fca244c2c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:41.997540 futex(0x7fca0857bc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.000578 futex(0x7fca0857bc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.001218 futex(0x7fca244c3e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.004953 futex(0x7fca244c3e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.005126 futex(0x7fca244c5088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.008704 futex(0x7fca244c5088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.008892 futex(0x7fca0857e088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.019483 futex(0x7fca0857e088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.020270 futex(0x7fca14546288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.025838 futex(0x7fca14546288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.025988 futex(0x7fca1c60ae88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.038674 futex(0x7fca1c60ae88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.040970 futex(0x7fca08580488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.047262 futex(0x7fca08580488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.047749 futex(0x7fca1c60e488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.052326 futex(0x7fca1c60e488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.052510 futex(0x7fca244c9888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.052983 futex(0x7fca244c9888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.053407 futex(0x7fca244caa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.058240 futex(0x7fca244caa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.059818 futex(0x7fca1c610888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.064160 futex(0x7fca1c610888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.064346 futex(0x7fca1454ce88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.065078 futex(0x7fca1454ce88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.066527 futex(0x7fca14551688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.067778 futex(0x7fca14551688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.068141 futex(0x7fca08588288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.079244 futex(0x7fca08588288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.079696 futex(0x7fca0858a688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.088885 futex(0x7fca0858a688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.089479 futex(0x7fca244cf288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.097645 futex(0x7fca244cf288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.098654 futex(0x7fca1c613e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.102448 futex(0x7fca1c613e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.104160 futex(0x7fca08590088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.109433 futex(0x7fca08590088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.109714 futex(0x7fca08591288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.110279 futex(0x7fca08591288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.110630 futex(0x7fca08592488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.119504 futex(0x7fca08592488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.120052 futex(0x7fca14558288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.130585 futex(0x7fca14558288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.130751 futex(0x7fca08594888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.134025 futex(0x7fca08594888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.134174 futex(0x7fca08595a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.137522 futex(0x7fca08595a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.137802 futex(0x7fca244d3a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.146739 futex(0x7fca244d3a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.147733 futex(0x7fca0859a288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.149343 futex(0x7fca0859a288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.150753 futex(0x7fca14559488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.159305 futex(0x7fca14559488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.162004 futex(0x7fca1455dc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.168966 futex(0x7fca1455dc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.169497 futex(0x7fca1455ee88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.176327 futex(0x7fca1455ee88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.176847 futex(0x7fca1c61ce88, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:42.177069 futex(0x7fca1c61ce88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.177240 futex(0x7fca0859ea88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.185588 futex(0x7fca0859ea88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.185733 futex(0x7fca244db888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.187648 futex(0x7fca244db888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.188283 futex(0x7fca244dca88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.192138 futex(0x7fca244dca88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.192358 futex(0x7fca14563688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.193435 futex(0x7fca14563688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.193899 futex(0x7fca0859fc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.194274 futex(0x7fca0859fc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.194432 futex(0x7fca085a0e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.201864 futex(0x7fca085a0e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.202014 futex(0x7fca1c61f288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.203988 futex(0x7fca1c61f288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.204821 futex(0x7fca14565a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.208710 futex(0x7fca14565a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.209024 futex(0x7fca244dee88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.211072 futex(0x7fca244dee88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.211419 futex(0x7fca244e0088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.212779 futex(0x7fca244e0088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.213250 futex(0x7fca085a2088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.215307 futex(0x7fca085a2088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.216080 futex(0x7fca085a3288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.220468 futex(0x7fca085a3288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.220812 futex(0x7fca085a4488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.224057 futex(0x7fca085a4488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.224833 futex(0x7fca14569088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.227783 futex(0x7fca14569088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.229971 futex(0x7fca085a7a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.232021 futex(0x7fca085a7a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.233185 futex(0x7fca1456a288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.238340 futex(0x7fca1456a288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.239348 futex(0x7fca1c62a688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.252618 futex(0x7fca1c62a688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.253451 futex(0x7fca085ab088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.256585 futex(0x7fca085ab088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.257966 futex(0x7fca1c62dc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.263596 futex(0x7fca1c62dc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.263766 futex(0x7fca244e5a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.266510 futex(0x7fca244e5a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.267600 futex(0x7fca085ae688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.272194 futex(0x7fca085ae688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.273197 futex(0x7fca1c631288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.273808 futex(0x7fca1c631288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.273959 futex(0x7fca1c632488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.275203 futex(0x7fca1c632488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.275564 futex(0x7fca085b0a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.277128 futex(0x7fca085b0a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.277331 futex(0x7fca1456fc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.282541 futex(0x7fca1456fc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.282791 futex(0x7fca1c633688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.284921 futex(0x7fca1c633688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.285361 futex(0x7fca14574488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.287175 futex(0x7fca14574488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.287544 futex(0x7fca244ed888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.290978 futex(0x7fca244ed888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.291151 futex(0x7fca1c634888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.295095 futex(0x7fca1c634888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.295701 futex(0x7fca14576888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.307001 brk(0x1b13000) = 0x1b13000 02:43:42.307473 futex(0x7fca14576888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.310039 futex(0x7fca085b9a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.312635 futex(0x7fca085b9a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.312873 futex(0x7fca244f4488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.317132 futex(0x7fca244f4488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.317686 futex(0x7fca085bac88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.329151 futex(0x7fca085bac88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.329638 futex(0x7fca1c64d488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.333756 futex(0x7fca1c64d488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.334151 futex(0x7fca1458e288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.347037 futex(0x7fca1458e288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.349062 futex(0x7fca244f7a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.351454 futex(0x7fca244f7a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.354550 futex(0x7fca085c2a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.357008 futex(0x7fca085c2a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.357220 futex(0x7fca085c3c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.361506 futex(0x7fca085c3c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.362725 futex(0x7fca14593c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.366794 futex(0x7fca14593c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.367996 futex(0x7fca085c4e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.372948 futex(0x7fca085c4e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.374424 futex(0x7fca14594e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.376167 futex(0x7fca14594e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.377015 futex(0x7fca24500a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.378611 futex(0x7fca24500a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.378951 futex(0x7fca24501c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.379557 futex(0x7fca24501c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.379765 futex(0x7fca14596088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.384257 futex(0x7fca14596088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.385265 futex(0x7fca085c7288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.388772 futex(0x7fca085c7288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.390081 futex(0x7fca1c65ac88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.391952 futex(0x7fca1c65ac88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.392153 futex(0x7fca24502e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.393770 futex(0x7fca24502e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.394086 futex(0x7fca1459a888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.395907 futex(0x7fca1459a888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.396318 futex(0x7fca1459cc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.400582 futex(0x7fca1459cc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.400740 futex(0x7fca1459de88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.402324 futex(0x7fca1459de88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.402583 futex(0x7fca24505288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.404307 futex(0x7fca24505288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.404538 futex(0x7fca24506488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.407910 futex(0x7fca24506488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.408042 futex(0x7fca085c8488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.410019 futex(0x7fca085c8488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.410583 futex(0x7fca085ca888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.416655 futex(0x7fca085ca888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.416848 futex(0x7fca1c65be88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.424235 futex(0x7fca1c65be88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.424547 futex(0x7fca145a0288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.427930 futex(0x7fca145a0288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.430614 futex(0x7fca085cba88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.435396 futex(0x7fca085cba88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.436912 futex(0x7fca1c662a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.439907 futex(0x7fca1c662a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.440285 futex(0x7fca145a3888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.443393 futex(0x7fca145a3888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.443758 futex(0x7fca145a4a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.447236 futex(0x7fca145a4a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.448122 futex(0x7fca2450d088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.449263 futex(0x7fca2450d088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.449668 futex(0x7fca2450f488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.456458 futex(0x7fca2450f488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.458397 futex(0x7fca1c667288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.469441 futex(0x7fca1c667288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.471162 futex(0x7fca145a9288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.474419 futex(0x7fca145a9288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.474708 futex(0x7fca24511888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.478289 futex(0x7fca24511888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.479219 futex(0x7fca1c66de88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.489053 futex(0x7fca1c66de88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.489316 futex(0x7fca145ac888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.506794 futex(0x7fca145ac888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.508747 futex(0x7fca24518488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.509835 futex(0x7fca24518488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.510135 futex(0x7fca085d1488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.512051 futex(0x7fca085d1488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.512502 futex(0x7fca145b2288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.518941 futex(0x7fca145b2288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.519257 futex(0x7fca24519688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.523071 futex(0x7fca24519688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.523770 futex(0x7fca145b3488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.530475 futex(0x7fca145b3488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.532876 futex(0x7fca1c672688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.535561 futex(0x7fca1c672688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.535898 futex(0x7fca145b6a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.538916 futex(0x7fca145b6a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.539778 futex(0x7fca2451ba88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.550246 futex(0x7fca2451ba88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.550612 futex(0x7fca145b7c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.560307 futex(0x7fca145b7c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.561104 futex(0x7fca145bc488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.563541 futex(0x7fca145bc488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.564579 futex(0x7fca085d6e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.567208 futex(0x7fca085d6e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.569120 futex(0x7fca085db688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.570328 futex(0x7fca085db688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.570955 futex(0x7fca24522688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.578151 futex(0x7fca24522688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.579077 futex(0x7fca24524a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.588445 futex(0x7fca24524a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.589042 futex(0x7fca145c3088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.594473 futex(0x7fca145c3088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.594950 futex(0x7fca145c8a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.603843 futex(0x7fca145c8a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.604116 futex(0x7fca085dfe88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.616503 futex(0x7fca085dfe88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.617425 futex(0x7fca085e3488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.625091 futex(0x7fca085e3488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.625343 futex(0x7fca1c67b688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.628308 futex(0x7fca1c67b688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.628577 futex(0x7fca085e5888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.649027 futex(0x7fca085e5888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.652035 futex(0x7fca085eb288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.667291 futex(0x7fca085eb288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.671493 futex(0x7fca145d0888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.678820 futex(0x7fca145d0888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.679382 futex(0x7fca085efa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.694263 futex(0x7fca085efa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.696085 futex(0x7fca145d6288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.696539 futex(0x7fca145d6288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.697431 futex(0x7fca145daa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.716977 futex(0x7fca145daa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.721192 futex(0x7fca145e4c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.725252 futex(0x7fca145e4c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.725479 futex(0x7fca1c68d688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.728699 futex(0x7fca1c68d688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.728871 futex(0x7fca24537c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.738918 futex(0x7fca24538e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.747390 futex(0x7fca24537c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.747514 futex(0x7fca24538e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.749489 futex(0x7fca1c690c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.758030 futex(0x7fca1c690c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.758533 futex(0x7fca1c694288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.758995 futex(0x7fca1c694288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.759283 futex(0x7fca08601a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.761535 futex(0x7fca08601a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.761764 futex(0x7fca24540c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.763668 futex(0x7fca24540c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.763850 futex(0x7fca145eca88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.765976 futex(0x7fca145eca88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.766672 futex(0x7fca1c696688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.767130 futex(0x7fca1c696688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.767632 futex(0x7fca145f1288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.776463 futex(0x7fca145f1288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.777926 futex(0x7fca145f4888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.783961 futex(0x7fca145f4888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.785453 futex(0x7fca24548a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.789068 futex(0x7fca24548a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.789325 futex(0x7fca1c6a5088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.790341 futex(0x7fca1c6a5088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.790746 futex(0x7fca145fa288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.795596 futex(0x7fca145fa288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.796707 futex(0x7fca2454c088, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:42.796854 futex(0x7fca2454c088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.796950 futex(0x7fca2454d288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.798106 futex(0x7fca2454d288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.798224 futex(0x7fca08608688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.799873 futex(0x7fca08608688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.800047 futex(0x7fca145fd888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.805487 futex(0x7fca145fd888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.805706 futex(0x7fca1c6a8688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.808616 futex(0x7fca1c6a8688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.808851 futex(0x7fca2454e488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.816126 futex(0x7fca2454e488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.817201 futex(0x7fca1c6aaa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.819382 futex(0x7fca1c6aaa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.819818 futex(0x7fca1c6ace88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.828931 futex(0x7fca1c6ace88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.829452 futex(0x7fca14603288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.834099 futex(0x7fca14603288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.834614 futex(0x7fca0860e088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.843967 futex(0x7fca0860e088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.844473 futex(0x7fca08610488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.851532 futex(0x7fca08610488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.852033 futex(0x7fca14606888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.853471 futex(0x7fca14606888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.853642 futex(0x7fca1c6af288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.865385 futex(0x7fca1c6af288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.866658 futex(0x7fca1c6b1688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.879064 futex(0x7fca1c6b1688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.881217 futex(0x7fca1c6c2488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.881729 futex(0x7fca1c6c2488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.882224 futex(0x7fca14607a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.885270 futex(0x7fca14607a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.885585 futex(0x7fca1c6c7e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.887520 futex(0x7fca1c6c7e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.887742 futex(0x7fca08617088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.898735 futex(0x7fca08617088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.898969 futex(0x7fca24560488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.902002 futex(0x7fca24560488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.902359 futex(0x7fca08619488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.908539 futex(0x7fca08619488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.908944 futex(0x7fca0861ca88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.910199 futex(0x7fca0861ca88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.910930 futex(0x7fca1460d488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.913238 futex(0x7fca1460d488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.913698 futex(0x7fca1460f888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.920836 futex(0x7fca1460f888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.921038 futex(0x7fca14611c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.922693 futex(0x7fca14611c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.924505 futex(0x7fca08622488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.930341 futex(0x7fca08622488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.930783 futex(0x7fca14615288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.934593 futex(0x7fca14615288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.935921 futex(0x7fca24567088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.936772 futex(0x7fca24567088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.936931 futex(0x7fca24568288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.944705 futex(0x7fca24568288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.944904 futex(0x7fca08626c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.952332 futex(0x7fca08626c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.955175 futex(0x7fca1c6d2088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.962193 futex(0x7fca1c6d2088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.962921 futex(0x7fca1461f488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.973721 futex(0x7fca1461f488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.974041 futex(0x7fca1c6d4488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.977475 futex(0x7fca1c6d4488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.979121 futex(0x7fca14622a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.990889 futex(0x7fca14622a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.991069 futex(0x7fca14626088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.992026 futex(0x7fca14626088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.992147 futex(0x7fca1c6dc288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.993644 futex(0x7fca1c6dc288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.994815 futex(0x7fca14627288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:42.998303 futex(0x7fca14627288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:42.998679 futex(0x7fca2456ca88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.007765 futex(0x7fca2456ca88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.007907 futex(0x7fca2456dc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.011181 futex(0x7fca2456dc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.011858 futex(0x7fca08639e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.016559 futex(0x7fca08639e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.017108 futex(0x7fca1c6e7688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.018435 futex(0x7fca1c6e7688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.018601 futex(0x7fca0863e688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.031763 futex(0x7fca0863e688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.034218 futex(0x7fca1c6ee288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.034837 futex(0x7fca1c6ee288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.035797 futex(0x7fca2456ee88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.043212 futex(0x7fca2456ee88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.043354 futex(0x7fca1c6f2a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.046518 futex(0x7fca1c6f2a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.046963 futex(0x7fca24570088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.056180 futex(0x7fca24570088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.056383 futex(0x7fca1c6f7288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.058848 futex(0x7fca1c6f7288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.059829 futex(0x7fca1c6fa888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.068975 futex(0x7fca1c6fa888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.069297 futex(0x7fca1462f088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.077996 futex(0x7fca1462f088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.078439 futex(0x7fca08645288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.085512 futex(0x7fca08645288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.085665 futex(0x7fca1c6fba88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.098776 futex(0x7fca1c6fba88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.100287 futex(0x7fca24573688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.110038 futex(0x7fca24573688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.110988 futex(0x7fca1c6fde88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.111640 futex(0x7fca1c6fde88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.112037 futex(0x7fca1c700288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.115336 futex(0x7fca1c700288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.116399 futex(0x7fca14635c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.124526 futex(0x7fca14635c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.125310 futex(0x7fca2457b488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.126460 futex(0x7fca2457b488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.127397 futex(0x7fca2457d888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.135165 futex(0x7fca2457d888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.136814 futex(0x7fca14638088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.144791 futex(0x7fca14638088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.145281 futex(0x7fca1c706e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.151512 futex(0x7fca1c706e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.151998 futex(0x7fca08652a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.159457 futex(0x7fca08652a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.160501 futex(0x7fca08653c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.165673 futex(0x7fca08653c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.166109 futex(0x7fca24587a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.173498 futex(0x7fca24587a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.173703 futex(0x7fca24589e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.179062 futex(0x7fca24589e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.179420 futex(0x7fca1463c888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.187701 futex(0x7fca1463c888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.188808 futex(0x7fca14642288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.197680 futex(0x7fca14642288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.198014 futex(0x7fca08654e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.205580 futex(0x7fca08654e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.206286 futex(0x7fca1c70da88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.213428 futex(0x7fca1c70da88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.213977 futex(0x7fca0865ba88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.217812 futex(0x7fca0865ba88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.220127 futex(0x7fca14646a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.227567 futex(0x7fca14646a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.227745 futex(0x7fca1c71a088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.237854 futex(0x7fca1c71a088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.238980 futex(0x7fca2458f888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.239389 futex(0x7fca2458f888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.239605 futex(0x7fca1c720c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.243403 futex(0x7fca1c720c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.243960 futex(0x7fca0865de88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.249555 futex(0x7fca0865de88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.249718 futex(0x7fca0865f088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.251029 futex(0x7fca0865f088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.251206 futex(0x7fca14647c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.253531 futex(0x7fca14647c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.253788 futex(0x7fca1c723088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.260582 futex(0x7fca1c723088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.261107 futex(0x7fca08663888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.273568 futex(0x7fca08663888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.273817 futex(0x7fca08665c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.290518 futex(0x7fca08665c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.291549 futex(0x7fca24594088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.299439 futex(0x7fca24594088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.299577 futex(0x7fca14648e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.302220 futex(0x7fca14648e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.302932 futex(0x7fca1c726688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.317608 futex(0x7fca1c726688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.318418 futex(0x7fca24595288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.322751 futex(0x7fca24595288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.323810 futex(0x7fca1464fa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.328017 futex(0x7fca1464fa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.328514 futex(0x7fca1c72c088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.335612 futex(0x7fca1c72c088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.336211 futex(0x7fca2459be88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.346619 futex(0x7fca2459be88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.347605 futex(0x7fca14653088, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:43.347770 futex(0x7fca14653088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.348709 futex(0x7fca0866c888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.355119 futex(0x7fca0866c888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.356190 futex(0x7fca0866ec88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.359746 futex(0x7fca0866ec88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.361394 futex(0x7fca08675888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.364247 futex(0x7fca08675888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.364769 futex(0x7fca1c732c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.384765 futex(0x7fca1c732c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.385167 futex(0x7fca0867a088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.391506 futex(0x7fca0867a088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.392354 futex(0x7fca245a0688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.396210 futex(0x7fca245a0688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.398564 futex(0x7fca245a8488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.406146 futex(0x7fca245a8488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.407146 futex(0x7fca1c738688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.419141 futex(0x7fca1c738688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.420219 futex(0x7fca14660888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.422485 futex(0x7fca14660888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.422677 futex(0x7fca245aa888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.425622 futex(0x7fca245aa888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.426041 futex(0x7fca245af088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.428049 futex(0x7fca245af088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.428353 futex(0x7fca08684288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.432864 futex(0x7fca08684288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.432989 futex(0x7fca1c73ce88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.442558 futex(0x7fca1c73ce88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.443334 futex(0x7fca245b0288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.448390 futex(0x7fca245b0288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.448702 futex(0x7fca1c742888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.449786 futex(0x7fca1c742888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.450135 futex(0x7fca245b2688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.458446 futex(0x7fca245b2688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.459271 futex(0x7fca08685488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.469724 futex(0x7fca08685488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.469898 futex(0x7fca08687888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.477070 futex(0x7fca08687888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.478084 futex(0x7fca08689c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.484870 futex(0x7fca08689c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.485125 futex(0x7fca1c74ca88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.487817 futex(0x7fca1c74ca88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.487951 futex(0x7fca1c74dc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.496260 futex(0x7fca1c74dc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.496518 futex(0x7fca14666288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.498417 futex(0x7fca14666288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.498545 futex(0x7fca14667488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.506251 futex(0x7fca14667488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.506600 futex(0x7fca245b6e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.517360 futex(0x7fca245b6e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.517909 futex(0x7fca1466bc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.522902 futex(0x7fca1466bc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.523025 futex(0x7fca0868c088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.524776 futex(0x7fca0868c088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.525047 futex(0x7fca245ba488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.540238 futex(0x7fca245ba488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.541884 futex(0x7fca245bda88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.552041 futex(0x7fca245bda88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.552842 futex(0x7fca08690888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.553826 futex(0x7fca08690888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.553924 futex(0x7fca1c752488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.555903 futex(0x7fca1c752488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.556704 futex(0x7fca1c755a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.558205 futex(0x7fca1c755a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.558333 futex(0x7fca1c756c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.560181 futex(0x7fca1c756c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.560742 futex(0x7fca08692c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.566684 futex(0x7fca08692c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.566871 futex(0x7fca1466e088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.567463 futex(0x7fca1466e088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.567827 futex(0x7fca1c75b488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.577287 futex(0x7fca1c75b488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.578782 futex(0x7fca245c6a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.580667 futex(0x7fca245c6a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.580784 futex(0x7fca245c7c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.586596 futex(0x7fca245c7c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.587186 futex(0x7fca08698688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.590882 futex(0x7fca08698688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.591021 futex(0x7fca1c75ea88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.596212 futex(0x7fca1c75ea88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.597381 futex(0x7fca14678288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.606332 futex(0x7fca14678288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.606693 futex(0x7fca1c764488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.607734 futex(0x7fca1c764488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.608081 futex(0x7fca1c765688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.617180 futex(0x7fca1c765688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.617643 futex(0x7fca245cc488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.623042 futex(0x7fca245cc488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.623256 futex(0x7fca0869ce88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.626388 futex(0x7fca0869ce88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.626543 futex(0x7fca14679488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.627981 futex(0x7fca14679488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.628294 futex(0x7fca0869e088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.630506 futex(0x7fca0869e088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.630637 futex(0x7fca0869f288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.635683 futex(0x7fca0869f288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.636343 futex(0x7fca1c767a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.637238 futex(0x7fca1c767a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.637712 futex(0x7fca1c76b088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.643808 futex(0x7fca1c76b088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.644142 futex(0x7fca1467ca88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.653108 futex(0x7fca1467ca88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.653257 futex(0x7fca1c76c288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.653903 futex(0x7fca1c76c288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.654945 futex(0x7fca245cfa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.657265 futex(0x7fca245cfa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.657550 futex(0x7fca1467ee88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.661531 futex(0x7fca1467ee88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.662262 futex(0x7fca086a1688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.663896 futex(0x7fca086a1688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.664029 futex(0x7fca086a2888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.667825 futex(0x7fca086a2888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.668382 futex(0x7fca14682488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.672268 futex(0x7fca14682488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.672741 futex(0x7fca1c774088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.676912 futex(0x7fca1c774088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.677258 futex(0x7fca245d3088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.682105 futex(0x7fca245d3088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.683879 futex(0x7fca086a4c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.687120 futex(0x7fca086a4c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.687944 futex(0x7fca086a5e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.688596 futex(0x7fca086a5e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.688713 futex(0x7fca086a7088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.690533 futex(0x7fca086a7088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.690697 futex(0x7fca1c778888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.691837 futex(0x7fca1c778888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.692164 futex(0x7fca14686c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.695121 futex(0x7fca14686c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.695768 futex(0x7fca086a9488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.700261 futex(0x7fca086a9488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.701322 futex(0x7fca086aca88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.702778 futex(0x7fca086aca88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.703001 futex(0x7fca245d5488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.714181 futex(0x7fca245d5488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.715397 futex(0x7fca1c77ac88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.721071 futex(0x7fca1c77ac88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.721271 futex(0x7fca086adc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.723919 futex(0x7fca086adc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.725320 futex(0x7fca1c77d088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.725735 futex(0x7fca1c77d088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.725851 futex(0x7fca1469c288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.727427 futex(0x7fca1469c288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.728405 futex(0x7fca086b2488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.728759 futex(0x7fca086b2488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.728939 futex(0x7fca245d8a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.732570 futex(0x7fca245d8a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.733629 futex(0x7fca086b3688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.736042 futex(0x7fca086b3688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.736796 futex(0x7fca086b5a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.743567 futex(0x7fca086b5a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.743705 futex(0x7fca146a0a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.751385 futex(0x7fca146a0a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.752438 futex(0x7fca1c783c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.756615 futex(0x7fca1c783c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.757909 futex(0x7fca086b6c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.764509 futex(0x7fca086b6c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.764717 futex(0x7fca1c78a888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.765163 futex(0x7fca1c78a888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.766048 futex(0x7fca245e3e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.776201 futex(0x7fca245e3e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.777115 futex(0x7fca146a9a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.785948 futex(0x7fca146a9a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.788237 futex(0x7fca146aac88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.805508 futex(0x7fca146aac88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.806634 futex(0x7fca086b9088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.817135 futex(0x7fca086b9088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.819413 futex(0x7fca245ee088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.821112 futex(0x7fca245ee088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.821809 futex(0x7fca1c792688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.829200 futex(0x7fca1c792688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.829330 futex(0x7fca1c793888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.840863 futex(0x7fca1c793888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.842171 futex(0x7fca245f2888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.844672 futex(0x7fca245f2888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.846574 futex(0x7fca146b8488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.850751 futex(0x7fca146b8488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.851176 futex(0x7fca146b9688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.860693 futex(0x7fca146b9688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.861435 futex(0x7fca1c79a488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.872328 futex(0x7fca1c79a488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.873444 futex(0x7fca245f5e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.878650 futex(0x7fca245f5e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.878800 futex(0x7fca245f7088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.882232 futex(0x7fca245f7088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.883151 futex(0x7fca146bba88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.884651 futex(0x7fca146bba88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.885242 futex(0x7fca146bcc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.886711 futex(0x7fca146bcc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.886899 futex(0x7fca146bf088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.889314 futex(0x7fca146bf088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.889600 futex(0x7fca086c0e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.890542 futex(0x7fca086c0e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.891219 futex(0x7fca1c79ec88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.894133 futex(0x7fca1c79ec88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.894326 futex(0x7fca1c79fe88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.896380 futex(0x7fca1c79fe88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.896729 futex(0x7fca1c7a1088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.901642 futex(0x7fca1c7a1088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.901773 futex(0x7fca245fca88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.905539 futex(0x7fca245fca88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.905788 futex(0x7fca24600088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.907637 futex(0x7fca24600088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.907873 futex(0x7fca1c7a2288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.908917 futex(0x7fca1c7a2288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.909690 futex(0x7fca146c1488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.912460 futex(0x7fca146c1488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.912740 futex(0x7fca086c5688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.913640 futex(0x7fca086c5688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.913918 futex(0x7fca146c2688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.917543 futex(0x7fca146c2688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.917996 futex(0x7fca24602488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.929955 futex(0x7fca24602488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.930721 futex(0x7fca146c5c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.934597 futex(0x7fca146c5c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.936088 futex(0x7fca086c6888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.948944 futex(0x7fca086c6888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.950331 futex(0x7fca086cc288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.952746 futex(0x7fca086cc288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.952999 futex(0x7fca146cb688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.955748 futex(0x7fca146cb688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.956203 futex(0x7fca146cec88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.961669 futex(0x7fca146cec88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.963670 futex(0x7fca24605a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.966659 futex(0x7fca24605a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.967559 futex(0x7fca086cd488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.974892 futex(0x7fca086cd488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.975508 futex(0x7fca24606c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.977236 futex(0x7fca24606c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.977481 futex(0x7fca1c7b3088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.983307 futex(0x7fca1c7b3088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.985530 futex(0x7fca24612088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.990563 futex(0x7fca24612088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.991030 futex(0x7fca146d6a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:43.996808 futex(0x7fca146d6a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:43.997139 futex(0x7fca086d0a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.006160 futex(0x7fca086d0a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.006507 futex(0x7fca146d8e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.007943 futex(0x7fca146d8e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.008372 futex(0x7fca1c7b5488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.017078 futex(0x7fca1c7b5488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.017245 futex(0x7fca24614488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.017428 futex(0x7fca24614488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.017624 futex(0x7fca086d2e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.019386 futex(0x7fca086d2e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.020267 futex(0x7fca1c7b6688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.030675 futex(0x7fca1c7b6688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.031773 futex(0x7fca24618c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.033551 futex(0x7fca24618c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.034856 futex(0x7fca1c7bc088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.036053 futex(0x7fca1c7bc088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.036278 futex(0x7fca146dfa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.057452 futex(0x7fca146dfa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.058001 futex(0x7fca1c7bf688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.060069 futex(0x7fca1c7bf688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.060272 futex(0x7fca146e1e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.061344 futex(0x7fca146e1e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.063807 futex(0x7fca24624088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.068323 futex(0x7fca24624088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.069187 futex(0x7fca086d8888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.079454 futex(0x7fca086d8888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.079950 futex(0x7fca086dbe88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.081852 futex(0x7fca086dbe88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.084334 futex(0x7fca24626488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.092215 futex(0x7fca24626488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.093230 futex(0x7fca1c7c8688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.099938 futex(0x7fca1c7c8688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.102393 futex(0x7fca1c7caa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.102891 futex(0x7fca1c7caa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.103432 futex(0x7fca1c7cce88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.110567 futex(0x7fca1c7cce88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.111213 futex(0x7fca086df488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.131036 futex(0x7fca086df488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.131565 futex(0x7fca086e1888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.152840 futex(0x7fca086e1888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.153932 futex(0x7fca146ee488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.161169 futex(0x7fca146ee488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.162793 futex(0x7fca1c7d1688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.163077 futex(0x7fca1c7d1688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.164169 futex(0x7fca086e6088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.170532 futex(0x7fca086e6088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.171507 futex(0x7fca24633c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.178164 futex(0x7fca24633c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.179266 futex(0x7fca1c7e0088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.183019 futex(0x7fca1c7e0088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.183229 futex(0x7fca1c7e2488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.184538 futex(0x7fca1c7e2488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.185211 futex(0x7fca146faa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.187193 futex(0x7fca146faa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.188347 futex(0x7fca146ff288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.193900 futex(0x7fca146ff288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.194055 futex(0x7fca24637288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.196135 futex(0x7fca24637288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.196848 futex(0x7fca24638488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.197217 futex(0x7fca24638488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.197697 futex(0x7fca086ea888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.198426 futex(0x7fca086ea888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.198586 futex(0x7fca086eba88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.211593 futex(0x7fca086eba88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.213272 futex(0x7fca086f3888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.222646 futex(0x7fca086f3888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.223944 futex(0x7fca1c7ea288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.225419 futex(0x7fca1c7ea288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.225875 futex(0x7fca14708288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.231107 futex(0x7fca14708288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.231425 futex(0x7fca1c7ec688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.233243 futex(0x7fca1c7ec688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.233826 futex(0x7fca1c7f0e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.243042 futex(0x7fca1c7f0e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.243785 futex(0x7fca1c7f4488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.248780 futex(0x7fca1c7f4488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.249107 futex(0x7fca2463cc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.255866 futex(0x7fca2463cc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.256477 futex(0x7fca1470ca88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.261815 futex(0x7fca1470ca88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.263303 futex(0x7fca2463de88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.271284 futex(0x7fca2463de88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.273395 futex(0x7fca24643888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.274925 futex(0x7fca24643888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.275691 futex(0x7fca14719088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.278447 futex(0x7fca14719088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.279766 futex(0x7fca1c7f9e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.285331 futex(0x7fca1c7f9e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.285960 futex(0x7fca08705888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.288026 futex(0x7fca08705888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.288992 futex(0x7fca24649288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.290387 futex(0x7fca24649288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.290693 futex(0x7fca1471d888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.292003 futex(0x7fca1471d888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.292343 futex(0x7fca08708e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.298566 futex(0x7fca08708e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.298752 futex(0x7fca2464a488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.314250 futex(0x7fca2464a488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.317121 futex(0x7fca08710c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.325543 futex(0x7fca08710c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.325807 futex(0x7fca08713088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.326299 futex(0x7fca08713088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.326855 futex(0x7fca1c800a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.329041 futex(0x7fca1c800a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.330059 futex(0x7fca14728c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.336929 futex(0x7fca14728c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.337179 futex(0x7fca1472b088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.338129 futex(0x7fca1472b088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.338258 futex(0x7fca2464fe88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.338752 futex(0x7fca2464fe88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.339324 futex(0x7fca08714288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.341680 futex(0x7fca08714288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.343140 futex(0x7fca1472e688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.351551 futex(0x7fca1472e688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.351852 futex(0x7fca24655888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.355957 futex(0x7fca24655888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.356348 futex(0x7fca08715488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.366671 futex(0x7fca08715488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.366887 futex(0x7fca1472f888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.369562 futex(0x7fca1472f888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.371288 futex(0x7fca08716688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.375057 futex(0x7fca08716688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.375754 futex(0x7fca14730a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.376827 futex(0x7fca14730a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.377055 futex(0x7fca24657c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.378581 futex(0x7fca24657c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.379440 futex(0x7fca1c811888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.380892 futex(0x7fca1c811888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.381160 futex(0x7fca2465c488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.384976 futex(0x7fca2465c488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.385469 futex(0x7fca14735288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.388949 futex(0x7fca14735288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.389254 futex(0x7fca2465fa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.403281 futex(0x7fca2465fa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.404136 futex(0x7fca14737688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.408610 futex(0x7fca14737688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.409702 futex(0x7fca24661e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.412990 futex(0x7fca24661e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.413223 futex(0x7fca0871c088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.414667 futex(0x7fca0871c088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.415099 futex(0x7fca0871e488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.419176 futex(0x7fca0871e488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.419391 futex(0x7fca0871f688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.430106 futex(0x7fca0871f688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.430218 futex(0x7fca24663088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.432023 futex(0x7fca24663088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.432596 futex(0x7fca1c813c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.439339 futex(0x7fca1c813c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.441008 futex(0x7fca24664288, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:44.441179 futex(0x7fca24664288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.441403 futex(0x7fca1c818488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.442757 futex(0x7fca1c818488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.443621 futex(0x7fca24666688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.446853 futex(0x7fca24666688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.447306 futex(0x7fca08720888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.449034 futex(0x7fca08720888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.449467 futex(0x7fca08723e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.451013 futex(0x7fca08723e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.451194 futex(0x7fca14740688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.458184 futex(0x7fca14740688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.460039 futex(0x7fca1c81a888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.472517 futex(0x7fca1c81a888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.474059 futex(0x7fca2466ae88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.479650 futex(0x7fca2466ae88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.480675 futex(0x7fca0872f288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.485722 futex(0x7fca0872f288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.487845 futex(0x7fca08730488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.488606 futex(0x7fca08730488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.488849 futex(0x7fca08732888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.492672 futex(0x7fca08732888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.493194 futex(0x7fca1474cc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.494934 futex(0x7fca1474cc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.495776 futex(0x7fca1c822688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.500144 futex(0x7fca1c822688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.500389 futex(0x7fca14752688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.501229 futex(0x7fca14752688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.501377 futex(0x7fca2466e488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.503552 futex(0x7fca2466e488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.504013 futex(0x7fca08734c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.506386 futex(0x7fca08734c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.506534 futex(0x7fca1c824a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.510999 futex(0x7fca1c824a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.512273 futex(0x7fca08735e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.512825 futex(0x7fca08735e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.513536 futex(0x7fca1c829288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.519721 futex(0x7fca1c829288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.520208 futex(0x7fca08739488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.524803 futex(0x7fca08739488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.525740 futex(0x7fca1c82a488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.537827 futex(0x7fca1c82a488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.539614 futex(0x7fca1c82da88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.548895 futex(0x7fca1c82da88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.549526 futex(0x7fca14754a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.551773 futex(0x7fca14754a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.552818 futex(0x7fca1475a488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.555199 futex(0x7fca1475a488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.555457 futex(0x7fca0873ee88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.557272 futex(0x7fca0873ee88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.558054 futex(0x7fca1c832288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.562206 futex(0x7fca1c832288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.562539 futex(0x7fca1475da88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.565200 futex(0x7fca1475da88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.565880 futex(0x7fca1c833488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.567551 futex(0x7fca1c833488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.568109 futex(0x7fca1c837c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.575988 futex(0x7fca1c837c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.576212 futex(0x7fca24676288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.578651 futex(0x7fca24676288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.579301 futex(0xf49510, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.579602 futex(0x7fca2467e088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.580935 futex(0x7fca2467e088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.581127 futex(0x7fca2467f288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.587515 futex(0x7fca2467f288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.588010 futex(0x7fca08744888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.589878 futex(0x7fca08747e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.591906 futex(0x7fca08744888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.591989 futex(0x7fca08747e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.592740 futex(0x7fca1c83c488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.596727 futex(0x7fca1c83c488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.597006 futex(0x7fca1c83d688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.606035 futex(0x7fca1c83d688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.606223 futex(0x7fca0874fc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.612351 futex(0x7fca0874fc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.613687 futex(0x7fca08752088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.619494 futex(0x7fca08752088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.619926 futex(0x7fca08753288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.623061 futex(0x7fca08753288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.623964 futex(0x7fca1c841e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.632500 futex(0x7fca1c841e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.634427 futex(0x7fca1c843088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.639796 futex(0x7fca1c843088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.640325 futex(0x7fca1c844288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.646597 futex(0x7fca1c844288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.646899 futex(0x7fca24685e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.651712 futex(0x7fca24685e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.652330 futex(0x7fca08758c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.655372 futex(0x7fca08758c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.655667 futex(0x7fca0875b088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.666784 futex(0x7fca0875b088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.667722 futex(0x7fca0875c288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.669557 futex(0x7fca0875c288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.669824 futex(0x7fca24689488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.674059 futex(0x7fca24689488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.674296 futex(0x7fca2468b888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.677927 futex(0x7fca2468b888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.678034 futex(0x7fca14776688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.680122 futex(0x7fca14776688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.680454 futex(0x7fca2468ca88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.690424 futex(0x7fca2468ca88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.690946 futex(0x7fca1c84e488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.692861 futex(0x7fca1c84e488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.693987 futex(0x7fca0875d488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.694480 futex(0x7fca0875d488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.694936 futex(0x7fca1477c088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.704965 futex(0x7fca1477c088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.706882 futex(0x7fca08760a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.708036 futex(0x7fca08760a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.708154 futex(0x7fca1477f688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.712480 futex(0x7fca1477f688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.712651 futex(0x7fca1c851a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.712966 futex(0x7fca1c851a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.713254 futex(0x7fca08761c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.714786 futex(0x7fca08761c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.715060 futex(0x7fca1c852c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.734585 futex(0x7fca1c852c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.734829 futex(0x7fca14782c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.738011 futex(0x7fca14782c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.738455 futex(0x7fca08764088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.745509 futex(0x7fca08764088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.745647 futex(0x7fca24699088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.750924 futex(0x7fca24699088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.751222 futex(0x7fca1c856288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.754331 futex(0x7fca1c856288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.755326 futex(0x7fca2469c688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.757526 futex(0x7fca2469c688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.757938 futex(0x7fca1c858688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.758112 futex(0x7fca1c858688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.758202 futex(0x7fca1c859888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.760240 futex(0x7fca1c859888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.761845 futex(0x7fca0876ac88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.768032 futex(0x7fca0876ac88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.768741 futex(0x7fca14788688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.769567 futex(0x7fca14788688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.769669 futex(0x7fca14789888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.772071 futex(0x7fca14789888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.772209 futex(0x7fca246a0e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.785733 futex(0x7fca246a0e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.787198 futex(0x7fca246a4488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.789183 futex(0x7fca246a4488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.789895 futex(0x7fca246a5688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.795106 futex(0x7fca246a5688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.795534 futex(0x7fca1c860488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.797043 futex(0x7fca1c860488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.798078 futex(0x7fca246a8c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.808888 futex(0x7fca246a8c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.809309 futex(0x7fca1c867088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.813881 futex(0x7fca1c867088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.815544 futex(0x7fca1c86dc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.816592 futex(0x7fca1c86dc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.817548 futex(0x7fca246ad488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.827806 futex(0x7fca246ad488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.827978 futex(0x7fca08778488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.831597 futex(0x7fca08778488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.832057 futex(0x7fca246af888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.834605 futex(0x7fca246af888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.834801 futex(0x7fca1478ce88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.842397 futex(0x7fca1478ce88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.842550 futex(0x7fca1c86ee88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.855676 futex(0x7fca1c86ee88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.856523 futex(0x7fca08781488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.867126 futex(0x7fca08781488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.867246 futex(0x7fca246b1c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.870017 futex(0x7fca246b1c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.872226 futex(0x7fca1c873688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.876509 futex(0x7fca1c873688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.876650 futex(0x7fca08783888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.888895 futex(0x7fca08783888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.889705 futex(0x7fca14790488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.905501 futex(0x7fca14790488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.905890 futex(0x7fca246b5288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.912844 futex(0x7fca246b5288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.914160 futex(0x7fca1c87b488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.924160 futex(0x7fca1c87b488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.924304 futex(0x7fca1c87c688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.936302 futex(0x7fca1c87c688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.937315 futex(0x7fca08788088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.944505 futex(0x7fca08788088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.944739 futex(0x7fca246b6488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.947019 futex(0x7fca246b6488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.949676 futex(0x7fca0878c888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.954956 futex(0x7fca0878c888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.958405 futex(0x7fca0878ec88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.964299 futex(0x7fca0878ec88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.965395 futex(0x7fca14799488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.972573 futex(0x7fca14799488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.975564 futex(0x7fca08791088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.980870 futex(0x7fca08791088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.982542 futex(0x7fca08795888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.986434 futex(0x7fca08795888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:44.986594 futex(0x7fca1c887a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:44.998590 futex(0x7fca1c887a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.001123 futex(0x7fca08797c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.008613 futex(0x7fca08797c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.009545 futex(0x7fca0879c488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.011219 futex(0x7fca0879c488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.011779 futex(0x7fca1c891c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.014460 futex(0x7fca1c891c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.014595 futex(0x7fca147a7e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.015343 futex(0x7fca147a7e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.015503 futex(0x7fca147a9088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.015866 futex(0x7fca147aa288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.020064 futex(0x7fca147a9088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.020141 futex(0x7fca147aa288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.020294 futex(0x7fca246be288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.021085 futex(0x7fca246be288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.021438 futex(0x7fca1c892e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.022721 futex(0x7fca1c892e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.022866 futex(0x7fca246c0688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.027847 futex(0x7fca246c0688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.027978 futex(0x7fca246c1888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.036554 futex(0x7fca246c1888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.036673 futex(0x7fca246c2a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.049960 futex(0x7fca246c2a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.050283 futex(0x7fca147ac688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.053134 futex(0x7fca147ac688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.053893 futex(0x7fca147b2088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.060147 futex(0x7fca147b2088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.060293 futex(0x7fca0879e888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.061681 futex(0x7fca0879e888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.062048 futex(0x7fca1c896488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.064098 futex(0x7fca1c896488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.064829 futex(0x7fca087a3088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.065178 futex(0x7fca087a3088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.065298 futex(0x7fca1c897688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.074893 futex(0x7fca1c897688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.076431 futex(0x7fca1c898888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.081432 futex(0x7fca1c898888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.082181 futex(0x7fca087a7888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.085680 futex(0x7fca087a7888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.086023 futex(0x7fca1c89ac88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.089953 futex(0x7fca1c89ac88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.090180 futex(0x7fca246c9688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.092128 futex(0x7fca246c9688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.093416 futex(0x7fca246cba88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.097051 futex(0x7fca246cba88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.098220 futex(0x7fca246ccc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.107475 futex(0x7fca246ccc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.108028 futex(0x7fca246d1488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.118456 futex(0x7fca246d1488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.119400 futex(0x7fca246d3888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.120742 futex(0x7fca246d3888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.121335 futex(0x7fca1c89f488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.123504 futex(0x7fca1c89f488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.123992 futex(0x7fca147bd488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.136927 futex(0x7fca147bd488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.137520 futex(0x7fca087af688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.142674 futex(0x7fca087af688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.144353 futex(0x7fca246dec88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.148978 futex(0x7fca246dec88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.149253 futex(0x7fca1c8a9688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.151129 futex(0x7fca1c8a9688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.151287 futex(0x7fca147bf888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.156861 futex(0x7fca147bf888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.157219 futex(0x7fca1c8aba88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.166311 futex(0x7fca1c8aba88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.166456 futex(0x7fca246e1088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.169345 futex(0x7fca246e1088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.169823 futex(0x7fca087b3e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.171113 futex(0x7fca087b3e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.171987 futex(0x7fca246e5888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.174302 futex(0x7fca246e5888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.174463 futex(0x7fca147c5288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.176586 futex(0x7fca147c5288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.176992 futex(0x7fca147c6488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.179832 futex(0x7fca147c6488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.180118 futex(0x7fca1c8acc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.181773 futex(0x7fca1c8acc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.182229 futex(0x7fca1c8ade88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.183816 futex(0x7fca1c8ade88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.184045 futex(0x7fca147cac88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.191812 futex(0x7fca147cac88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.192745 futex(0x7fca087b7488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.199738 futex(0x7fca087b7488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.199962 futex(0x7fca1c8b0288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.207791 futex(0x7fca1c8b0288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.208892 futex(0x7fca1c8b1488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.211115 futex(0x7fca1c8b1488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.211708 brk(0x1b34000) = 0x1b34000 02:43:45.213221 futex(0x7fca087b8688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.218351 futex(0x7fca087b8688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.218540 futex(0x7fca147d7288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.219590 futex(0x7fca147d7288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.219861 futex(0x7fca1c8b6e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.224576 futex(0x7fca1c8b6e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.224794 futex(0x7fca087b9888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.234445 futex(0x7fca087b9888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.235160 futex(0x7fca1c8bc888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.243344 futex(0x7fca1c8bc888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.244196 futex(0x7fca087baa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.249090 futex(0x7fca087baa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.249257 futex(0x7fca246e7c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.251081 futex(0x7fca246e7c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.251616 futex(0x7fca246e8e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.258765 futex(0x7fca246e8e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.259735 futex(0x7fca246ec488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.262404 futex(0x7fca246ec488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.262542 futex(0x7fca1c8c3488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.264259 futex(0x7fca1c8c3488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.264401 futex(0x7fca1c8c4688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.266938 futex(0x7fca1c8c4688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.267461 futex(0x7fca087bce88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.268721 futex(0x7fca087bce88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.268854 futex(0x7fca087be088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.272543 futex(0x7fca087be088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.273254 futex(0x7fca147dba88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.275495 futex(0x7fca147dba88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.275722 futex(0x7fca1c8ca088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.280224 futex(0x7fca1c8ca088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.281981 futex(0x7fca246ed688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.288897 futex(0x7fca246ed688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.289988 futex(0x7fca246efa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.292140 futex(0x7fca246efa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.292546 futex(0x7fca246f0c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.295580 futex(0x7fca246f0c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.295969 futex(0x7fca147e4a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.297015 futex(0x7fca147e4a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.297210 futex(0x7fca1c8ce888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.302636 futex(0x7fca1c8ce888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.302763 futex(0x7fca1c8cfa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.313586 futex(0x7fca1c8cfa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.313967 futex(0x7fca1c8d1e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.321546 futex(0x7fca1c8d1e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.322274 futex(0x7fca147e5c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.339070 futex(0x7fca147e5c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.341548 futex(0x7fca087cb888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.344945 futex(0x7fca087cb888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.345173 futex(0x7fca147ea488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.348455 futex(0x7fca147ea488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.348597 futex(0x7fca147eb688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.350488 futex(0x7fca147eb688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.350611 futex(0x7fca087cdc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.362005 futex(0x7fca087cdc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.363043 futex(0x7fca1c8d8a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.370565 futex(0x7fca1c8d8a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.371316 futex(0x7fca147ec888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.382067 futex(0x7fca147ec888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.383841 futex(0x7fca1c8dc088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.384978 futex(0x7fca1c8dc088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.385958 futex(0x7fca087d5a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.387536 futex(0x7fca087d5a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.388225 futex(0x7fca147efe88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.392345 futex(0x7fca147efe88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.392649 futex(0x7fca1c8dd288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.393543 futex(0x7fca1c8dd288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.393666 futex(0x7fca1c8de488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.395499 futex(0x7fca1c8de488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.395690 futex(0x7fca147f2288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.410501 futex(0x7fca147f2288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.410970 futex(0x7fca246ff688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.415629 futex(0x7fca246ff688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.417291 futex(0x7fca087dc688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.419425 futex(0x7fca087dc688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.419954 futex(0x7fca24705088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.428862 futex(0x7fca24705088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.429805 futex(0x7fca1c8df688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.436935 futex(0x7fca1c8df688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.438592 futex(0x7fca147f8e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.440116 futex(0x7fca147f8e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.441159 futex(0x7fca147fa088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.441666 futex(0x7fca147fa088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.441946 futex(0x7fca087e4488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.453289 futex(0x7fca087e4488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.453737 futex(0x7fca087e7a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.457506 futex(0x7fca087e7a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.458737 futex(0x7fca1c8eaa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.462719 futex(0x7fca1c8eaa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.463045 futex(0x7fca087ec288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.464408 futex(0x7fca087ec288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.465481 futex(0x7fca2470bc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.466660 futex(0x7fca2470bc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.467771 futex(0x7fca147fd688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.475659 futex(0x7fca147fd688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.475817 futex(0x7fca24713a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.486795 futex(0x7fca24713a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.489261 futex(0x7fca1c8ee088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.497977 futex(0x7fca1c8ee088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.498352 futex(0x7fca087f5288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.502723 futex(0x7fca087f5288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.503014 futex(0x7fca14806688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.505568 futex(0x7fca14806688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.506628 futex(0x7fca087fac88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.513000 futex(0x7fca087fac88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.513186 futex(0x7fca14808a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.526038 futex(0x7fca14808a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.527416 futex(0x7fca087fbe88, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:45.527592 futex(0x7fca087fbe88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.528876 futex(0x7fca1c8f5e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.537664 futex(0x7fca1c8f5e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.537818 futex(0x7fca1480ae88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.549931 futex(0x7fca1480ae88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.550681 futex(0x7fca1480d288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.554387 futex(0x7fca1480d288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.554773 futex(0x7fca1c8f7088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.559138 futex(0x7fca1c8f7088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.559953 futex(0x7fca1c8f9488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.561623 futex(0x7fca1c8f9488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.561838 futex(0x7fca24726c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.566487 futex(0x7fca24726c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.566930 futex(0x7fca08802a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.572803 futex(0x7fca08802a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.574168 futex(0x7fca14810888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.590886 futex(0x7fca14810888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.593580 futex(0x7fca1c8fca88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.602683 futex(0x7fca1c8fca88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.604337 futex(0x7fca1c900088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.613882 futex(0x7fca1c900088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.615059 futex(0x7fca24735688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.618524 futex(0x7fca24735688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.619064 futex(0x7fca1c904888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.626192 futex(0x7fca1c904888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.626337 futex(0x7fca24736888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.629598 futex(0x7fca24736888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.630880 futex(0x7fca0880de88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.633426 futex(0x7fca0880de88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.633900 futex(0x7fca24739e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.636392 futex(0x7fca24739e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.637166 futex(0x7fca2473f888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.646857 futex(0x7fca2473f888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.648713 futex(0x7fca24742e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.651052 futex(0x7fca24742e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.651517 futex(0x7fca1482a688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.654288 futex(0x7fca1482a688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.655075 futex(0x7fca1482ca88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.660961 futex(0x7fca1482ca88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.661155 futex(0x7fca1c90a288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.663433 futex(0x7fca1c90a288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.664035 futex(0x7fca08815c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.669207 futex(0x7fca08815c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.669407 futex(0x7fca1c90c688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.671307 futex(0x7fca1c90c688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.672245 futex(0x7fca24748888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.679071 futex(0x7fca24748888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.679888 futex(0x7fca0881c888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.684801 futex(0x7fca0881c888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.685026 futex(0x7fca1c90fc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.685334 futex(0x7fca1c90fc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.685523 futex(0x7fca1c910e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.689360 futex(0x7fca1c910e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.691005 futex(0x7fca0881ec88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.693973 futex(0x7fca0881ec88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.694103 futex(0x7fca0881fe88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.696120 futex(0x7fca0881fe88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.696260 futex(0x7fca24749a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.705971 futex(0x7fca24749a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.707825 futex(0x7fca08821088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.712384 futex(0x7fca08821088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.712577 futex(0x7fca08823488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.719233 futex(0x7fca08823488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.719923 futex(0x7fca08825888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.728841 futex(0x7fca08825888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.729031 futex(0x7fca1c915688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.733456 futex(0x7fca1c915688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.734505 futex(0x7fca1c918c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.737723 futex(0x7fca1c918c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.738134 futex(0x7fca1483a288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.744670 futex(0x7fca1483a288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.745729 futex(0x7fca1c91d488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.755613 futex(0x7fca1c91d488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.756164 futex(0x7fca2474f488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.757821 futex(0x7fca2474f488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.758390 futex(0x7fca24751888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.765353 futex(0x7fca24751888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.766910 futex(0x7fca2475a888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.768964 futex(0x7fca2475a888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.769656 futex(0x7fca2475de88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.772221 futex(0x7fca2475de88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.772674 futex(0x7fca24760288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.783556 futex(0x7fca24760288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.784866 futex(0x7fca24768088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.789436 futex(0x7fca24768088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.789582 futex(0x7fca24769288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.793852 futex(0x7fca24769288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.794312 futex(0x7fca2476a488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.799956 futex(0x7fca2476a488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.802326 futex(0x7fca08833088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.812750 futex(0x7fca08833088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.813321 futex(0x7fca08835488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.817848 futex(0x7fca08835488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.817974 futex(0x7fca1c925288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.832653 futex(0x7fca1c925288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.833283 futex(0x7fca2476ec88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.834832 futex(0x7fca2476ec88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.835797 futex(0x7fca14840e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.836966 futex(0x7fca14840e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.837215 futex(0x7fca24778e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.841863 futex(0x7fca24778e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.842398 futex(0x7fca08838a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.847689 futex(0x7fca08838a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.848013 futex(0x7fca14845688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.851324 futex(0x7fca14845688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.851567 futex(0x7fca14847a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.852030 futex(0x7fca14847a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.852263 futex(0x7fca2477a088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.854112 futex(0x7fca2477a088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.854523 futex(0x7fca1c927688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.854949 futex(0x7fca1c927688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.856275 futex(0x7fca1484b088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.862144 futex(0x7fca1484b088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.863787 futex(0x7fca1484f888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.867103 futex(0x7fca1484f888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.868035 futex(0x7fca08841a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.869740 futex(0x7fca08841a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.870508 futex(0x7fca08848688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.875438 futex(0x7fca08848688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.875737 futex(0x7fca24788a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.879331 futex(0x7fca24788a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.879879 futex(0x7fca1c933c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.880284 futex(0x7fca1c933c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.880545 futex(0x7fca2478c088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.886685 futex(0x7fca2478c088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.887915 futex(0x7fca1c938488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.897008 futex(0x7fca1c938488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.897555 futex(0xf49510, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.898593 futex(0x7fca0884ce88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.903777 futex(0x7fca0884ce88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.904936 futex(0x7fca2478f688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.905744 futex(0x7fca2478f688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.907264 futex(0x7fca14858888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.911865 futex(0x7fca14858888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.912026 futex(0x7fca1c941488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.917331 futex(0x7fca1c941488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.917485 futex(0x7fca24791a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.920949 futex(0x7fca24791a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.921088 futex(0x7fca08852888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.927743 futex(0x7fca08852888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.927889 futex(0x7fca1c943888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.932263 futex(0x7fca1c943888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.933606 futex(0x7fca1485d088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.934840 futex(0x7fca1485d088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.935445 futex(0x7fca08854c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.938803 futex(0x7fca08854c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.938941 futex(0x7fca24797488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.952670 futex(0x7fca24797488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.953232 futex(0x7fca24799888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.964920 futex(0x7fca24799888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.965241 futex(0x7fca1c946e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.973701 futex(0x7fca1c946e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.974735 futex(0x7fca1485e288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.984973 futex(0x7fca1485e288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.985492 futex(0x7fca1c94b688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.987346 futex(0x7fca1c94b688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.987661 futex(0x7fca247a3a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:45.988999 futex(0x7fca247a3a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:45.989180 futex(0x7fca14862a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.004827 futex(0x7fca14862a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.005170 futex(0x7fca247a5e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.007072 futex(0x7fca247a5e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.007770 brk(0x1b58000) = 0x1b58000 02:43:46.010034 brk(0x1b79000) = 0x1b79000 02:43:46.011841 brk(0x1b9a000) = 0x1b9a000 02:43:46.013704 brk(0x1bbb000) = 0x1bbb000 02:43:46.015583 brk(0x1bdc000) = 0x1bdc000 02:43:46.017179 brk(0x1bfd000) = 0x1bfd000 02:43:46.020684 futex(0x7fca08855e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.025843 futex(0x7fca08855e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.026273 futex(0x7fca148d7a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.027601 futex(0x7fca148d7a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.027719 futex(0x7fca148d8c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.033550 futex(0x7fca148d8c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.033814 futex(0x7fca0885a688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.037926 futex(0x7fca0885a688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.038214 futex(0x7fca148d9e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.038749 futex(0x7fca148d9e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.038982 futex(0x7fca148dd488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.040128 futex(0x7fca148dd488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.040228 futex(0x7fca247b6c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.046743 futex(0x7fca247b6c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.046853 futex(0x7fca0885dc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.048294 futex(0x7fca0885dc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.048995 futex(0x7fca148de688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.059165 futex(0x7fca148de688, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.059543 futex(0x7fca247b7e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.075771 futex(0x7fca247b7e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.076656 futex(0x7fca1c94fe88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.079609 futex(0x7fca1c94fe88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.080075 futex(0x7fca1c956a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.091661 futex(0x7fca1c956a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.092922 futex(0x7fca247c2088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.102081 futex(0x7fca247c2088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.102483 futex(0x7fca148eac88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.106613 futex(0x7fca148eac88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.106895 futex(0x7fca1c95b288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.120756 futex(0x7fca1c95b288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.121712 futex(0x7fca247c6888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.124869 futex(0x7fca247c6888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.125388 futex(0x7fca247cb088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.127820 futex(0x7fca247cb088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.128435 futex(0x7fca0887b088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.134921 futex(0x7fca0887b088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.135309 futex(0x7fca148f3c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.139731 futex(0x7fca148f3c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.139986 futex(0x7fca247d0a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.142596 futex(0x7fca247d0a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.145387 futex(0x7fca1c95fa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.151301 futex(0x7fca1c95fa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.151848 futex(0x7fca1c963088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.155242 futex(0x7fca1c963088, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.155618 futex(0x7fca08880a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.163760 futex(0x7fca08880a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.164317 futex(0x7fca247de288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.172089 futex(0x7fca247de288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.172419 futex(0x7fca247e2a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.183584 futex(0x7fca247e2a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.183938 futex(0x7fca1c967888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.185832 futex(0x7fca1c967888, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.186148 futex(0x7fca08885288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.203276 futex(0x7fca08885288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.204433 futex(0x7fca247e8488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.209358 futex(0x7fca247e8488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.210283 futex(0x7fca148fde88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.212980 futex(0x7fca148fde88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.213423 futex(0x7fca0888ac88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.214321 futex(0x7fca0888ac88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.214723 futex(0x7fca0888f488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.216248 futex(0x7fca0888f488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.216621 futex(0x7fca1c976288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.225032 futex(0x7fca1c976288, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.225322 futex(0x1a5ed4c, FUTEX_WAIT_PRIVATE, 1, NULL) = 0 02:43:46.225613 futex(0x1a5ecc0, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.225753 futex(0x7fca14904a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.239217 futex(0x7fca14904a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.239353 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:46.239469 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.239553 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:46.239617 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:46.239678 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.239744 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:46.239809 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.239879 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:46.239944 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.240005 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:46.240073 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.240150 futex(0x7fca247f1488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.247347 futex(0x7fca247f1488, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.247563 futex(0x7fca08893c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:46.261321 futex(0x7fca08893c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:46.261566 futex(0x7fca0818be88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:52.513350 futex(0x7fca0818be88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:52.517327 futex(0x7fca18082ee8, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:53.361668 futex(0x7fca18082ee8, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.374326 futex(0x7fc993992a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:53.532521 futex(0x7fc993992a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.601672 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.601836 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.602032 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.602104 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.602175 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.602265 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.602327 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.602415 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.602589 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.602649 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.602710 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.602773 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.602853 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.602917 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.602976 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.603038 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.603175 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.603236 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.603294 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.603355 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.603601 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.603659 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.603717 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.603796 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.603865 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.603931 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.604079 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.604151 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.604273 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.604343 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.604421 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.604541 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.605595 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.605683 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.605748 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.605811 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.605877 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.605936 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.607158 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.607229 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.607319 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.607401 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.607514 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.607575 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.607753 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.607872 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.607934 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.607995 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.608058 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.608118 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.608233 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.608294 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.608353 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.608435 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.608496 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.608563 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.608623 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.608687 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.608747 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.608810 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.608873 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.608931 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.608990 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.609049 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.609408 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.609599 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.609786 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.609846 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.609904 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.609973 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.610033 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.610091 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.610150 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.610209 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.610270 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.610336 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.610444 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.610619 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.610751 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.611042 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.611125 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.611428 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.611512 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.611736 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.611805 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.611894 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.611956 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.612018 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.612080 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.612357 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.612470 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.612533 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.612596 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.612658 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.612919 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.613033 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.613108 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.613614 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.613701 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.613796 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.613865 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.613961 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.614028 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.614095 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.614160 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.614248 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.615114 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.615197 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.615361 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.615480 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.615547 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.615612 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.615819 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.615886 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.616002 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.616071 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:43:53.616170 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.616237 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.616322 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.616445 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.616516 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.616594 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.616743 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.616847 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.616916 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.617055 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.617120 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.617477 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.617565 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.617635 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.617711 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.617788 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.617857 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.617925 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.617993 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.618148 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.618218 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.618285 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.618352 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.618448 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.618551 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.618620 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.618750 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:43:53.618857 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.618927 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.619009 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.619103 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.619722 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.619802 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.620198 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.620269 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.620336 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.620434 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.620514 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.620595 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.620737 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.620805 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.620875 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.620959 futex(0xf49410, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.621062 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.621131 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.621722 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.621960 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.622040 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.622110 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.622250 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.622320 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.622410 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.622502 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.622573 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.622640 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.622708 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.622776 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.622872 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.623060 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.623137 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.623221 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.623289 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.623356 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.623444 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.623568 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.623638 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.623713 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.623786 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.623870 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.623950 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.624088 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.624158 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.624226 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.624294 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.624361 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.624448 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.624517 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.624587 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.624670 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.624739 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.624831 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.624900 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.624973 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.625041 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.625108 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.625223 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.625292 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.625377 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.625466 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:43:53.625594 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.625670 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.625738 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.625839 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.625926 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.626001 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.626070 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.626171 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.626239 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.626329 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.626440 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 1 02:43:53.626539 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.626612 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.626917 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.626968 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.627018 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.627271 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.627323 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.627525 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.627579 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.627629 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.627701 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.627761 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.627906 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.627956 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.628096 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.628147 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.628196 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.628246 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.628300 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.628350 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.628584 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.628661 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.628712 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.628805 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.628890 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.628940 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.629000 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.629049 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.629098 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.629150 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.629258 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.629309 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.629452 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.629504 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.629554 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.629633 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.629745 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.629800 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.629850 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.629988 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.630038 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.630217 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.630268 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.630317 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.630384 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:43:53.630451 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.630501 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.630550 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.630608 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.630675 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.630745 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.630802 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.630880 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.630930 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.631012 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.631062 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.631136 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.631187 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.631269 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.631319 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.631378 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.631431 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.631495 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.631545 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.631726 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.631777 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.631844 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.631894 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.631955 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.632008 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.632134 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.632196 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.632558 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.632623 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.632672 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.632721 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.632770 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.632819 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.632892 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.633025 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.633075 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.633125 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.633174 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.633314 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.633370 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.633422 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.633477 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.633527 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.633582 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.633680 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.633748 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.633809 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.633858 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.633956 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.634005 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.634054 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.634103 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.634171 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.634221 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.634280 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.634354 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.634436 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.634490 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.634540 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.634590 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.634640 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:43:53.634714 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.634771 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.634826 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.634875 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.635097 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.635148 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.635197 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.635359 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.635887 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.635941 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.636001 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.637914 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.638237 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.638347 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.638423 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.638490 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.638551 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.638618 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.638678 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.638737 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.638800 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.639067 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.639127 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.639187 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.639254 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.639330 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.639408 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.639469 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.639531 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.639591 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.639723 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.639784 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.639854 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.639914 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.639989 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.640048 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.640112 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.640171 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.640250 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.640309 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.640371 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.640437 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.640495 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.640554 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.640613 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.640673 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.640734 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.640794 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.640855 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.640914 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.640994 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.641107 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.641166 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.641225 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.641289 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.641351 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.641421 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.641509 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.641568 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.641632 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.641692 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.641750 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.641809 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.641871 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.641930 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.641989 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.642058 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.642127 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.642189 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.642264 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.642324 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.642413 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.642477 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.642599 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.642658 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.642792 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.642852 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.642910 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.642976 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.643036 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.643099 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.643159 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.643218 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.643276 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.643345 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.643402 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.643471 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.643530 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.643589 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.643648 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.643724 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.643832 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.643891 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.644145 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.644214 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.644303 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.644390 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.644455 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.644515 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.644575 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.644634 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.644725 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.644785 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.644856 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.644916 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.644976 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.645035 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.645095 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.645155 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.645268 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.645328 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.645434 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.645520 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.645580 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.645648 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.645713 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.645829 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.645889 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.645953 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.646013 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.646145 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.646204 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.646266 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.646326 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.646479 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.646540 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.646601 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.646661 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.646721 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.646876 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.646940 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.647005 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.647067 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.647130 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.647193 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.647270 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.647342 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.647424 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.647538 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.647603 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.647662 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.647707 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.647850 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.647897 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.647947 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.647993 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.648213 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.648269 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.648324 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.648398 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.648462 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.648512 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.648563 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.648769 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.648818 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.648871 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.669999 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.670129 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.678674 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.678777 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.678864 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.678930 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.702844 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.702973 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.705195 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.705294 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.714096 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.714201 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.733088 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.733640 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:43:53.733716 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:43:53.757675 futex(0x7fca1c97f288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:00.043241 futex(0x7fca1c97f288, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:00.046170 futex(0x7fca1c987088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:01.127217 futex(0x7fca1c987088, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.177746 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.177900 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.177983 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.178057 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.178136 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.178216 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.178301 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.178408 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.178493 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.178581 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.178655 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.178723 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.178797 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.179041 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.179117 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.179189 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.179255 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.179410 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.179495 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.179562 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.179627 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.179740 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.179811 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.179906 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.180233 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.180307 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.180480 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.180558 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.180915 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.180988 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.181054 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.181124 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.181191 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.181582 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.181659 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.181737 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.181805 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.181898 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.181965 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.182169 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.182237 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.182303 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.182390 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.182484 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.182550 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.182660 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.182726 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.182808 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.182973 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.183040 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.183106 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.183171 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.184027 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.184105 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.184177 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.184245 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.184311 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.184405 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.184479 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.184545 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.184610 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.184676 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.184758 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.184824 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.184890 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.184965 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.185083 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.185149 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.186710 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.186759 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.186802 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.187001 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.187052 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.187320 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.187356 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.187436 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.187478 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.187523 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.187564 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.187605 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.187651 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.187693 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.187738 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.187780 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.187824 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.187865 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.187943 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.187991 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.188039 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.188086 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.188128 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.188175 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.188216 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.188256 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.188296 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.188336 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.188391 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.188438 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.188484 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.188547 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.188589 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.188638 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.188685 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.188728 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.188791 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.188837 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.188870 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.188904 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.188937 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.188969 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.189002 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.189035 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.189068 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.189103 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.189137 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.189185 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.189233 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.189266 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.189299 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.189337 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.189400 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.189451 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.189493 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.189538 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.189578 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.189618 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.189659 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.189721 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.189773 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.189825 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.189867 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.189941 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.189981 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.190021 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.190066 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.190140 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.190195 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.190236 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.190282 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.190556 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.190613 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.190663 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.190705 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.190876 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.190910 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.190942 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:01.191009 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.191042 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.191075 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.191114 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.191147 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.191198 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.191231 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.191263 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.191295 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.191327 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.191359 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.191413 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.191449 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.191483 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.191515 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.191565 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.191598 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.191630 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.192319 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.192354 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.192397 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.192449 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.192592 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.192648 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.192681 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.192801 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.192873 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.192907 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.192943 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.192976 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.193008 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.193040 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.193073 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.193156 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.193191 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.193224 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.193432 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.193477 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.193512 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.193621 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.193656 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.194067 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.194104 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.194139 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.194213 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.194247 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.194349 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.194398 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:01.194466 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.194518 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.194552 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.194607 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.194864 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.194899 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.195128 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.195162 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.195200 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.195233 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.195694 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.195733 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.195786 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.195883 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.195918 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.196090 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.196125 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.196254 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.196317 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.196438 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.196776 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.196814 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.196850 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.196959 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.197006 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.197050 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.197085 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.197119 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.197155 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.197188 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.197223 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.197257 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.197309 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.197343 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.197400 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.197435 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.197469 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.197811 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.197948 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.197983 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.198046 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.198080 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.198113 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.198173 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.198207 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.198250 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.198328 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.198366 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.198403 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.198508 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.198651 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.198688 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.198771 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.198847 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.198882 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.199016 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.199051 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.199113 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.199147 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.199226 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.199260 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.199413 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.199454 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.199494 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.199610 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.199644 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.199676 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.199725 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.199759 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.199796 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.199923 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.200154 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.200190 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.200232 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.200266 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.200299 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.200339 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.200371 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.200445 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.200480 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.200561 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.200595 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.200629 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.200666 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.200724 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.200757 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.200789 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.200833 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.200884 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.200919 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.200978 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.201012 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.201051 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.201083 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.201116 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.201153 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.201191 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.201223 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.201256 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.201288 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.201324 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.201358 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.201416 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.201450 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.201503 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.201537 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.201604 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.201637 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.201677 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.201710 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.201796 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.201829 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.201867 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.201900 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.202190 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.202226 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.202261 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.202294 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.202411 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.202632 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.202667 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.202773 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.202811 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.202950 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.202983 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.203118 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.203263 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.203544 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:01.203613 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.203786 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.203828 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.203863 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.203994 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.204049 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.204084 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.204121 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.204173 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.204211 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.204244 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.204281 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.204313 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.204346 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.204397 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.204431 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.204470 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.204503 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.204546 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.204666 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.204701 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.204742 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.204775 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.204807 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.204841 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.204875 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.204925 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.204958 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.205032 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.205065 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.205605 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.205646 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.206227 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.206262 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.206352 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.206403 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.206458 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.206567 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.206601 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.206683 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.206718 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.206751 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.206837 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.206872 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.206947 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.206983 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.207345 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.207478 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.207748 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.207784 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.207822 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.208001 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.208262 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.208296 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.208330 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.208476 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.208513 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.208552 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.208585 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.208947 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.208986 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.209020 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.209991 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.210030 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.210067 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.210185 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.210219 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.210252 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.210588 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.210626 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.210659 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.210707 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.210742 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.211161 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.211197 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.211256 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.211308 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.211417 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.211454 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.211492 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.211525 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.211562 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.211668 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.211702 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.211785 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.211819 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.212056 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.212091 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.212284 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.212776 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.213107 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.213144 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.213317 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.213371 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.213410 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.213617 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.213653 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.213718 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.213751 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.213784 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.213890 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.213924 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.213977 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.214011 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.214048 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.214081 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.214119 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.214163 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.214196 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.214229 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.214279 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.214312 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.214345 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.214399 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.214433 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.214470 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.214503 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.214547 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.214580 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.214704 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.214738 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.214908 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.214947 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.214980 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.215052 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.215086 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.215118 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.215151 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.215210 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.215244 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.215299 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.215333 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.215409 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.215446 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.215499 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.215533 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.215714 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.215748 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.215780 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.215880 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.215914 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.215946 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.215979 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.216011 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.216052 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.216115 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.216148 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.216194 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.216228 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:01.216282 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.216318 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.216351 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.216524 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.216592 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.216648 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.216697 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.216735 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.217014 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.217209 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.217255 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.217291 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.217327 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.217402 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.217476 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.217815 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.217874 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.217956 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.218027 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.218091 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.218159 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.218329 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.218403 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.218513 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.218585 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.218749 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.218808 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.218876 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.218934 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.218993 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.219051 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.219110 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.219181 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.219248 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.219307 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.219372 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.219462 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.219521 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.219628 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.219686 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.219744 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.219804 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.219863 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.219920 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.219978 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.220045 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.220103 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.220195 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.220253 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.220314 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.220382 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.220445 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.220512 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.220608 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.220667 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.220733 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.220809 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.220867 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.220984 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.221059 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.221117 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.221178 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.221236 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.221460 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.221523 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.221597 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.221655 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.221766 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.221825 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.221893 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.221985 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.222045 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.222110 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.222171 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.222232 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.222290 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.222348 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.222649 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.222946 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.223005 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.223065 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.223124 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.223184 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.223242 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.223402 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.223467 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.223525 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.223585 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:01.223680 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.223745 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.223802 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.223861 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.226495 futex(0xf49410, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.250967 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.251122 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.251634 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.251707 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.291756 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.291881 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.292045 futex(0xf49410, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.295987 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.296088 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.313069 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.313217 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.332552 futex(0xf49410, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:01.332678 futex(0xf49410, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:01.343400 futex(0x7fca08f37688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:08.744433 futex(0x7fca08f37688, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.748389 brk(0x1c1e000) = 0x1c1e000 02:44:08.778879 futex(0x7fca08fda688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:08.788986 futex(0x7fca08fda688, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.803785 futex(0x7fc9764e8a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:08.808012 futex(0x7fc9764e8a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.808268 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.808674 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.808751 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.808822 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.808882 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.808942 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.809002 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.809205 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.809265 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.809492 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.809557 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.809679 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.809735 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.809795 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.810560 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.811861 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.811935 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.812000 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.812066 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.812141 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.812209 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.812267 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.812631 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.812697 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.813034 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.813094 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.813652 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.813717 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.813777 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.813993 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.814053 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.814696 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.814760 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.814820 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.815324 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.815398 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.815462 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.815904 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.815978 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.816036 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.816094 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.816151 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.816207 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.816264 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.816320 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.816406 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.816498 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:08.816686 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.816747 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.816839 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.816917 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.816975 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.817036 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.817099 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.817221 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.817278 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.817344 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.817409 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.817472 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.817557 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.817616 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.817722 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.817788 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.817846 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.817903 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.817965 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.818032 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.818089 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.818147 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.818204 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.818261 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.818341 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.818422 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.818483 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.818540 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.818601 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.818662 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.818753 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.818815 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.818871 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.818927 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.818982 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.819073 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.819130 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.819186 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.819248 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.819305 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.819361 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.819469 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.819646 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.819718 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.819886 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.819944 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.820092 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.820149 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.820206 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.820266 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.820332 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.820468 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.820538 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.820621 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.820684 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.820763 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.820836 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.820919 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.820979 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.821037 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.821111 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.821169 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.821228 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.821288 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.821345 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.821416 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.821529 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.821591 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.821695 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.821754 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.821817 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.821874 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.822151 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.822210 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.822411 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.822807 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.822870 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.822940 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.823002 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.823080 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.823143 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.823574 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.823637 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.823698 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.823817 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.823889 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.824379 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.824442 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.824498 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.824557 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.824615 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.824673 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.824731 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.824789 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.824847 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.824922 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.825018 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.825075 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.825165 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.825288 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.825348 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.825436 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.825502 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.825560 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.825621 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.825695 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.825754 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.825812 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.825871 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.825929 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.826001 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.826067 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.826126 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.826208 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.826266 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.826324 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.826401 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.826450 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.826569 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.826610 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.826652 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.826702 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.826744 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.826812 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.826847 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.826900 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.826935 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.826973 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.827012 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.827047 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.827089 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.827130 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.827165 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.827208 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.827247 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.827283 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.827359 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.827521 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.827558 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.827663 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.827700 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.827732 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.827771 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.827800 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.828065 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.828100 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.828132 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.828164 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.828358 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.828404 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.828439 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.828472 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.828517 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.828550 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.828587 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.828620 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.828657 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.828690 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.828722 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.828753 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.828786 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.828818 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.828909 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.828942 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.828977 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.829009 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.829041 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.829072 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.829161 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.829225 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.829257 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.829293 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.829325 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.829357 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.829401 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.829485 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.829524 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.829571 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.829668 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.829703 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.829737 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.829812 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.829851 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.829918 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.829952 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.829997 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.830030 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.830063 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.830100 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.830134 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.830169 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.830203 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.830235 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.830268 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.830343 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.830385 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.830418 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.830452 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.830715 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.830749 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.830785 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.830817 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.830850 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.830882 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.830916 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.830961 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.830995 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.831026 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.831058 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.831104 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.831140 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.831173 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.831408 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.831459 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.831493 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.831526 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.831564 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.831597 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.831630 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.831663 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.831695 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.831729 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.831763 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.831799 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.831832 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.831870 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.831905 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.831953 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.831987 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.832079 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.832114 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.832150 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.832184 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:08.832317 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.832362 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.832480 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.832517 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.832550 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.832583 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.832621 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.832654 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.832687 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.832792 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.832826 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.832862 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.832896 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.832982 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.833016 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.833049 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.833082 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.833348 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.833390 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.833424 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.833458 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.833495 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.833585 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.833619 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.833667 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.833700 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.833733 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.833766 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.833872 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.833907 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.833961 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.833994 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.834071 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.834105 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.834142 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.834176 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.834211 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.834309 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.834344 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.834410 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.834444 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.834486 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.834519 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.834569 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.834607 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.834640 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.834692 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.834726 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.834804 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.834837 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.834871 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.834907 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.834940 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.834973 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.835006 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.835047 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.835080 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.835112 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.835145 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.835306 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.835340 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.835371 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.835428 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.835461 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.835494 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.835646 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.835680 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.835748 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.836003 futex(0xf49410, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.836036 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.836263 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.836297 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.836330 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.836371 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.836410 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.836460 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.836495 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.836528 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.836565 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.836599 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.836633 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.836666 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.836714 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.836787 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.836823 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.836902 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.836960 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.836994 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.837148 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.837191 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.837225 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.837262 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.837296 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.837348 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.837389 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.837426 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.837581 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.837616 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.837664 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.837698 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.837745 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.837778 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.837811 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.837844 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.837894 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.837928 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.837963 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.837996 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.838079 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.838113 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.838146 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.838182 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.838215 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.838257 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.838291 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.838326 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.838359 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.838425 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.838465 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.838499 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.838549 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.838587 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.838626 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.838663 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.838698 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.838731 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.838763 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.838796 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.838828 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.838860 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.838893 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.838944 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.838977 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.839051 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.839085 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.839174 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.839210 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.839248 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.839281 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.839313 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.839351 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.839390 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.839423 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.839459 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.839492 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.839525 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.839599 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.839633 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.839675 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.839707 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.839739 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.839773 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.839805 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.839840 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.839872 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.839919 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.839953 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.839987 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.840020 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.840053 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.840102 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.840140 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.840176 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.840212 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.840246 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.840281 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.840313 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.840346 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.840394 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.840427 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.840464 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.840499 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.840548 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.840582 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.840676 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.840717 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.840767 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.840801 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.840833 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.840866 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.840898 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.840931 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.840971 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.841010 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.841048 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.841097 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.841168 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.841201 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.841234 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.841287 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.841346 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.841385 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.841425 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.841460 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.841494 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.841535 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.841568 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.841601 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.841637 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.841669 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.841720 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.841753 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.841791 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.841830 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.841862 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.841895 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.841934 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.841967 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.842080 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.842416 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.842454 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.842500 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.842534 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.842567 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.842685 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.842776 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.842810 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.843324 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.843384 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.843474 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.843508 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.843541 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:08.843880 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.843915 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.843949 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.843987 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.844020 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.844053 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.844086 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.844121 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.844153 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.844240 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.844535 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.844579 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.844623 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.844657 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.844689 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.844722 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.844773 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.844807 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.844857 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.844890 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.844923 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.844972 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.845006 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.845038 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.845071 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.845104 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.845136 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.845197 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.845232 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.845266 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.845311 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.845362 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.845405 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.845453 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.845504 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.845537 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.845570 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.845607 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.845640 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.845673 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.845744 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.845778 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.845868 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.845902 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.845938 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.845971 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.846004 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.846064 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.846097 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.846130 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.846185 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.846218 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.846254 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.846287 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.846320 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.846435 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.846479 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.846603 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.846701 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.846736 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.846769 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.846802 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.846835 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.846871 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.846903 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.846936 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.846974 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.847013 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.847053 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.847120 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.847180 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.847214 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.847269 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.847302 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.847335 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.865591 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.865666 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.868141 brk(0x1c3f000) = 0x1c3f000 02:44:08.877912 brk(0x1c60000) = 0x1c60000 02:44:08.907717 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.907786 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.922240 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.922299 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.938350 brk(0x1c81000) = 0x1c81000 02:44:08.944193 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.946456 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:08.946507 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:08.959685 futex(0x7fc9682c8288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:14.909219 futex(0x7fc9682c8288, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:14.910975 futex(0x7fc96409b288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:14.938674 futex(0x7fc96409b288, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:14.939199 futex(0x7fc993f64088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:14.944539 futex(0x7fc993f64088, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:14.946020 futex(0x7fca1d33e088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:14.953035 futex(0x7fca1d33e088, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:14.953694 futex(0x7fc964124488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:14.954827 futex(0x7fc964124488, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:14.956203 futex(0x7fc993f73c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:14.964389 futex(0x7fc993f73c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:14.964656 futex(0x7fca180844e8, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:15.987095 futex(0x7fca180844e8, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:15.991528 futex(0x7fc964130a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:16.063266 futex(0x7fc964130a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.075847 brk(0x1ca2000) = 0x1ca2000 02:44:16.084726 futex(0x7fc9763cb088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:16.089864 futex(0x7fc9763cb088, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.091200 futex(0x7fc9763d8888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:16.146704 futex(0x7fc9763d8888, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.149580 futex(0x7fc96836c488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:16.209738 futex(0x7fc96836c488, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.209974 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.210083 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.210242 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:16.211456 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.211548 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.211878 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:16.212996 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.213076 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.214758 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.214847 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.214926 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.215031 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.215104 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.215176 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.215414 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.215500 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.215908 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:16.216884 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.216973 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.218415 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:16.219341 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.219474 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.221094 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.221147 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.221748 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.221801 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.221844 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.221952 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.221996 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.222141 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.222183 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.222224 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.222271 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.222314 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.222355 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.222429 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.222464 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.222539 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.222674 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.222708 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.222746 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.222780 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.222871 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.222953 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.222996 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.223031 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.223109 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.223180 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.223301 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.223335 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.223383 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:16.223570 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.223605 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.223639 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.223781 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.223816 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.223857 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.223892 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.223955 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.223996 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.224030 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.224189 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.224224 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.224260 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.224302 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.224335 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.224389 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.224434 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.224483 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.224523 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.224564 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.224768 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.224813 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.224860 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.224992 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.225076 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.225126 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.225236 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.225277 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.225444 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.225555 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.225941 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.225980 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.226015 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.226243 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.226279 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.226382 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.226440 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.226475 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.226508 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.226541 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.226573 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.226614 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.226647 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.226694 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.226727 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.226760 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.226801 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.226835 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.226873 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.226913 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.226947 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.227007 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.227046 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.227079 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.227148 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.227182 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.227217 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.227251 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.227284 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.227343 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.227400 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.227438 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.227472 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.227596 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.227630 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.227664 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.227696 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.227730 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.227765 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.227798 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.227862 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.227897 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.227937 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.227971 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.228007 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.228040 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.228073 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.228108 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.228141 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.228211 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.228246 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.228279 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.228321 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.228354 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.228425 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.228459 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.228495 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.228529 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.228584 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.228626 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.228660 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.228709 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.228755 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.228817 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.229166 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.229433 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.229544 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.229582 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.229623 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.229656 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.229873 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.229908 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.229941 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.229974 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.230007 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.230056 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.230089 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.230121 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.230154 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.230190 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.230222 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.230256 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:16.230305 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.230343 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.230394 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.230431 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.230643 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.230678 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.230712 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.230753 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.230786 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.230820 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.230854 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.230888 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.230965 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.230999 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.231031 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.231095 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.231128 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.231180 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.231214 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.231259 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.231292 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.231325 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.231368 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.231406 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.231439 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.231471 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.231504 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.231537 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.231569 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.231606 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.231643 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.231687 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.231721 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.231759 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.231793 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.231828 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.231865 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.231898 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.231931 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.231964 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.232030 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.232063 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.232096 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.232132 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.232165 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.232198 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.232236 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.232269 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.232302 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:16.232401 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.232441 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.232475 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.232526 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.232559 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.232592 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:16.232634 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.232695 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.232736 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.232770 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.232864 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.232900 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.232933 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.232967 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.233000 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.233039 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.233081 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.233114 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.233147 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.233239 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.233273 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.233326 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.233359 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.233401 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.233441 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.233482 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.233516 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.233548 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.233734 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.233773 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.234069 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.234103 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.234368 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.234413 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.234464 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.234592 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.234628 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.234661 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.234694 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.234730 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.234763 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.234796 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.234840 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.234874 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.234907 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.234940 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.235391 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.235593 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.235818 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.235856 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.235893 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.235925 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.235958 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.236310 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.236401 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.236445 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.236896 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.236932 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.237100 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.237136 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.237316 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.237351 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.237790 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.237878 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.238216 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.238280 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.238729 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.238797 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.238913 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.238974 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.239271 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.239333 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.239512 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.239576 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.239720 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.239779 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.239901 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.240016 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.240086 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.240410 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.240770 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.240883 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.240942 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.241000 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.241061 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.241121 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.241180 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.241278 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.241345 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.241404 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.241489 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.241548 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.241606 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.241664 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.241731 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.241789 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.241847 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.241905 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.241967 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.242025 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.242083 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.242157 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.242215 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.242284 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.242342 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.242408 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.242469 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.242528 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.242586 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.242644 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.242732 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.242790 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.242851 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.242909 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.242966 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.243024 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.243096 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.243154 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.243213 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.243276 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.243334 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.243424 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.243483 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.243541 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.243608 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.243729 futex(0xf49410, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.243809 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.243879 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.243940 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:16.244052 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.244116 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.244186 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.244294 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.244354 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.244450 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.244516 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.244584 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.244644 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.244757 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.244820 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.244908 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.244968 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.245028 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.245093 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.245155 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.245219 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.245279 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.245339 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.245415 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.245474 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.245533 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.245591 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.245663 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.245748 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.245842 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.245912 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.245983 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.246044 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.246102 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.246161 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.246223 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.246282 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.246391 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.246440 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.246485 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.246522 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.246563 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.246600 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.246637 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.246691 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.246728 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.246779 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.246820 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.246861 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.246899 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.246948 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.246985 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.247032 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.247074 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.247187 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.247229 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.247265 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.247302 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.247338 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.247390 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.247429 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.247465 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.247501 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.247604 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.247640 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.247676 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.247712 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.247788 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.247828 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.247865 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.247978 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.248015 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.248115 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.248177 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.248213 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.248249 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.248285 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.248322 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.248419 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.248473 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.248519 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.248564 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:16.248628 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:16.248692 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.248754 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.248799 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.248844 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.248889 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.248936 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.248983 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.249039 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.249116 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.249163 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.249255 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.249315 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.249367 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.249429 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.249476 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.249521 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.249565 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.249610 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.249656 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.249701 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.249751 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:16.249855 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.249916 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.249962 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.250030 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.250090 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.250136 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.250202 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.250254 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.250320 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.250391 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.250491 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.250542 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.250617 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.250691 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.250745 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.250803 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.250903 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.250963 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.251014 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.251071 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.251122 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.251177 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.251228 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.251279 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.251350 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.251419 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.251471 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.251531 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.251578 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.251629 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.251676 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.251729 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.251774 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.251822 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.251894 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.251949 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.251994 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.252053 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.252098 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.252155 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.252201 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.252258 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.252343 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.252401 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.252451 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.252503 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.252576 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.252627 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.252698 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.252830 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.252961 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.253011 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.253061 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.253161 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.253210 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.253273 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.253323 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.253433 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.253487 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.253537 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.253612 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:16.253710 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:16.253758 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.253819 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.253865 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.253943 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:16.253999 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.254114 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.254166 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.254223 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.254268 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.254316 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.254375 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.254426 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.254471 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.254516 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.304276 brk(0x1cc3000) = 0x1cc3000 02:44:16.325791 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.325863 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.351313 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.351409 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.360189 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:16.360245 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:16.401454 futex(0x7fc962caa488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:22.549859 futex(0x7fc962caa488, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:22.550093 futex(0x7fc9bc074628, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:23.513639 futex(0x7fc9bc074628, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.514331 futex(0x7fc962cada88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:23.612533 futex(0x7fc962cada88, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.618052 futex(0x7fc9682ca688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:23.673653 futex(0x7fc9682ca688, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.688241 brk(0x1ce4000) = 0x1ce4000 02:44:23.700557 futex(0x7fca1d3b7888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:23.795297 futex(0x7fca1d3b7888, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.809438 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.809524 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.809605 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.809653 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.809735 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.809783 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.809976 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.810023 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.810069 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.810116 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.810157 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.810194 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.810229 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.810287 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.810325 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.810361 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.810427 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.810509 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.810551 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.810598 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.810646 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.810779 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.810828 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.810905 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.810952 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.811012 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.811060 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.811108 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.811464 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.811514 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.811560 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.811660 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.811893 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.811944 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.812062 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.812102 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.812136 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.812203 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.812243 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.812347 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.812414 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.812470 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.812519 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.812569 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.812613 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.812662 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.812740 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.812786 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.812831 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.812879 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.812923 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.812968 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.813025 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.813071 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.813115 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.813155 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.813197 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.813281 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.813326 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.813916 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.813966 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.814160 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.814478 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.814552 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.814595 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.814945 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.814991 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.815036 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.815779 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.815830 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.815875 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.816097 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.816133 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.816830 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.817621 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.817682 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.818157 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.818203 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.818427 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.819094 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.819142 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.819199 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.819240 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.819283 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.819738 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.819794 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.819848 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.819894 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.819949 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.820002 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.820048 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.820098 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.820165 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.820210 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.820258 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.820311 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.820359 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.820430 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.820481 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.820527 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.820575 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.820924 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.820964 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.821012 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.821053 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.821091 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.821147 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.821186 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.821221 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.821265 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.821304 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.821417 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.821458 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.821496 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.821549 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.821594 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.821634 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.821672 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.821709 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.821747 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.821810 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.821851 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.821892 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.821928 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.821968 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.822015 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.822052 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.822090 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.822177 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.822243 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.822281 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.822318 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.822361 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.822434 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.822486 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.822533 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.822581 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.822628 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.822676 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.822723 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.822767 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.822823 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.822921 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.822966 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.823042 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.823088 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.823140 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.823189 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.823240 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.823286 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.823336 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.823420 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.823475 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.823543 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.823591 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.823661 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.823708 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.823756 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.823814 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.823861 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.823899 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.823939 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.823977 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.824028 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.824069 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.824106 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.824146 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.824185 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.824224 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.824268 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.824308 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.824406 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.824448 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.824500 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.824539 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.824585 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.824624 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.824762 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.824800 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.824862 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.824908 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.824950 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.824985 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.825025 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.825061 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.825099 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.825136 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.825191 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.825228 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.825281 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.825318 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.825395 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.825437 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.825506 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.825546 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.825597 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.825637 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.825674 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.825742 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.825777 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.825827 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.825904 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.825940 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.825977 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.826029 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.826068 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.826118 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.826157 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.826195 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.826234 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.826270 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.826306 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.826343 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.826394 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.826430 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.826478 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.826537 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.826576 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.826665 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.826704 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.826796 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.826836 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.826879 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.826951 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.826991 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.827032 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.827072 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.827116 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.827153 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.827193 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.827229 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.827277 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.827314 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.827352 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.827407 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.827445 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.827514 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.827554 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.827591 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.827632 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.827671 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.827717 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.827752 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.827787 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.827822 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.827864 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.827900 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.827933 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.827982 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.828019 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.828062 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.828099 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.828138 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.828174 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.828211 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.828244 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.828286 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.828321 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.828377 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.828418 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.828454 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.828492 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.828539 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.828608 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.828659 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.828699 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.828753 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.828793 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.828829 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.828866 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.828911 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.828948 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.828995 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.829036 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.829074 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.829111 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.829148 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.829188 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.829241 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.829277 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.829321 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.829358 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.829412 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.829455 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.829494 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.829536 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.829574 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.829609 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.829659 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.829697 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.829734 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.829772 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.829810 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.829850 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.829962 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.830000 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.830040 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.830076 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.830112 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.830150 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.830196 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.830231 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.830279 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.830314 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.830353 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.830403 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.830453 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.830489 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.830541 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.830585 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.830626 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.830663 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.830700 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.830743 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.830782 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.830844 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.830898 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.830937 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.830976 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.831012 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.831049 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.831086 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.831121 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.831164 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.831217 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.831253 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.831290 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.831331 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.831381 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.831446 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.831484 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.831521 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.831557 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.831601 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.831637 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.831755 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.831791 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.832451 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.832834 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.833059 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.833098 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.833137 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:23.833237 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.833275 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.833315 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.833352 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.833395 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.833434 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.833470 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.833639 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.833674 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.833709 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.833748 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.833796 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.833831 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.833896 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.833933 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.834058 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.834172 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.834212 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.834248 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.834284 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.834326 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:23.834388 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.834431 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.834495 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.834533 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.834574 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.834614 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.834668 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.834707 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.834751 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.834789 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.834830 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.834865 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.834903 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.834952 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.835020 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.835122 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.835179 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.835217 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.835256 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.835290 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.835334 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.835370 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.835410 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.835446 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.835489 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.835525 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.835560 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.835634 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.835682 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.835720 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.835776 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.835814 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.835850 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.835888 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.835922 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.836123 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.836162 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.836205 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.836243 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.836280 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.836338 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.836390 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.836458 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.836514 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.836551 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.836587 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.836628 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.836671 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.836707 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.836770 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.836825 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.836864 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.837344 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.837505 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.837930 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.837992 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.838052 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.838130 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.838242 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.838294 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.838846 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.838905 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.839165 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.839217 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.839270 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.839319 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.839368 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:23.839707 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.839793 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.839842 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.839888 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.839946 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.840008 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.840136 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.840750 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.840865 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.840920 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.841260 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.841310 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.841361 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.841421 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.841468 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.841577 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.843128 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.843305 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.843358 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.843435 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:23.843778 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.843893 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.844331 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.844408 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.844460 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.844507 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.844915 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.844970 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.845032 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.845090 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.845145 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.845196 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.845251 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.845305 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.845356 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.846085 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.846633 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.846679 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.846718 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.846755 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.846794 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.846935 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.846975 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.847013 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.847054 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.847091 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.847348 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.847388 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.847441 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.847482 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.847520 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.847558 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.847638 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.847676 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.847764 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.847954 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.848147 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.848185 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.848222 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.848259 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.848297 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.848416 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.848455 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.848504 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.848541 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.848579 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.848617 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.848653 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.848786 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.848824 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.848864 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.848901 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.848940 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.848976 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.849019 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.849059 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.849108 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.849147 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.849186 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.849223 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.849261 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.849299 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.849382 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.849422 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.849465 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.849511 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.849551 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.849590 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.849630 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.849671 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.849710 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.849747 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.849785 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.849822 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.849862 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.849900 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.849939 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.850018 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.850056 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.850110 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.850148 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.850194 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.850236 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.850306 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.850433 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.850477 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.850514 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.850553 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.850591 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.850662 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.850700 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.850737 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.850825 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.850869 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.850922 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.850970 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.851014 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.851053 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.851091 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.851142 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.851186 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.851231 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.851281 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.851320 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.851358 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.851587 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.851626 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.851673 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.851714 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.851760 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.851799 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.851837 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.851885 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.851923 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.851967 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.852008 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.852062 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.852119 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.852156 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.852197 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.852234 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.852274 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.852315 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.852353 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.852488 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.852537 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.852576 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.852614 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.852653 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.852707 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.852760 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.852804 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.852869 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.853086 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.853135 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.853180 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.853225 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.853274 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.853321 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.853367 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.853720 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.853765 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.853811 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.853886 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.853932 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.853984 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.854029 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.854073 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.854134 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.854173 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.854212 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.854252 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.854566 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.854615 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.854659 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.854746 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.854789 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.854834 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.854900 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.854957 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.855003 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.855047 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.855174 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.855229 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.855340 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.855390 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.855436 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.855602 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.855646 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.855692 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.855738 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.855798 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.855836 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.855976 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.856350 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.856399 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.856440 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.856501 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.856542 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.856606 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.856644 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.856712 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.856749 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.856787 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.856880 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.856917 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.856956 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.856994 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.857032 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.857074 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.857607 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.857654 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.857692 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.857731 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.857769 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.857809 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.857861 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.857900 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.858325 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.858397 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.858437 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.858593 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.858777 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.858816 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.858854 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.858892 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.858930 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.858968 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.859161 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.859202 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.859609 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.859652 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.859802 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.860016 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.860058 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.860123 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.860250 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.860290 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.860328 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.860583 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.860643 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:23.860698 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.860843 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.861008 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.861052 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.861096 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.861141 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.861187 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.861231 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.861277 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.861565 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.861615 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.861661 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.861706 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.861750 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.861796 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.861849 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.861895 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.861949 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.861998 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.862037 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.862147 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.862188 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.862228 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.862277 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.862316 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.862354 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.862410 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.862748 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.862791 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.862835 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.862873 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.862910 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.862948 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.862987 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.863588 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.863749 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.863793 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.863844 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.863889 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.864025 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.864070 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.864116 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.864210 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.864255 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.864311 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.864391 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.865602 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.865649 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.869381 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.869444 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.885418 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.885501 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.892524 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.892580 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.893634 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.893687 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.897943 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.907574 brk(0x1d05000) = 0x1d05000 02:44:23.909607 brk(0x1d26000) = 0x1d26000 02:44:23.935996 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.949326 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.949426 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.958960 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.959013 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.987333 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:23.987437 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:23.998211 futex(0x7fca140c5028, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:31.066809 futex(0x7fca140c5028, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.068350 brk(0x1d47000) = 0x1d47000 02:44:31.104945 futex(0x7fca1da31688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:31.107298 futex(0x7fca1da31688, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.111335 futex(0x7fc968a21e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:31.128611 futex(0x7fc968a21e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.138981 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.139087 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.139720 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.139948 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.140012 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.140188 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.140246 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.140336 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.140438 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.140508 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.140588 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.140653 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.140722 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.140781 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.140842 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.141257 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.141326 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.141424 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.141488 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.141552 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.141630 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.141691 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.141751 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.141809 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.141897 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.141962 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.142027 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.142095 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.142153 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.142230 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.142288 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.142346 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.142418 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.142489 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.142554 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.142615 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.142706 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.142803 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.142864 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.142934 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.142996 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.143059 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.143119 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.143179 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.143241 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.143303 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.143384 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.143448 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.143508 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.143568 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.143642 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.143701 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.143915 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.143981 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.144108 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.144165 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.144222 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.144279 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.144336 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.144422 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.144489 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.144547 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.144607 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.144667 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.144725 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.144785 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.144844 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.144903 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.144969 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.145030 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.145087 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.145272 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.145331 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.145410 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.145475 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.145551 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.145631 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.145692 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.145761 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.145822 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.145901 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.145967 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.146179 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.146238 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.146295 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.146353 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.146463 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.146536 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.146605 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.146648 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.146708 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.146752 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.146796 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.146840 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.146964 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.147092 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.147137 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.147182 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.147225 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.147409 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.147455 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.147510 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.147564 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.147608 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.147740 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.148195 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.148233 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.149008 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.149061 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.149197 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.149254 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.149298 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.149346 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.149418 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.149522 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.149566 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.149611 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.149659 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.149703 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.149762 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.149805 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.149848 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.149891 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.149946 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.149989 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.150048 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.150098 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.150133 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.150273 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.150310 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.150352 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.150392 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.150428 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.150464 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.150505 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.150542 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.150580 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.150617 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.150653 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.150689 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.150738 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.150807 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.150844 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.150890 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.150926 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.150973 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.151023 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.151060 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:31.151126 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:31.151195 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.151232 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.151269 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.151308 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.151354 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.151399 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.151440 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.151498 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.151534 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.151571 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.151619 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.151673 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.151712 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.151750 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.151801 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.151842 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.151885 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.151923 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.151967 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.152005 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.152046 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.152089 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.152132 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.152169 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.152211 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.152261 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.152303 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.152344 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.152396 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.152435 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.152473 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.152616 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.152655 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.152714 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.152752 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.152805 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.152842 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.152879 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.152916 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.152953 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.152990 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.153104 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.153148 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.153312 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.153348 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.153393 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.153436 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.153471 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.153507 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.153546 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.153583 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.153664 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.153710 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.153805 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.153850 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.153893 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.153929 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.154114 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.154152 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.154189 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.154226 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.154262 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.154299 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.154350 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.154401 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.154438 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.154479 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.154517 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.154555 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.154592 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.154633 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.154670 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.154708 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.154757 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.155053 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.155096 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.155133 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.155169 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.155205 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.155240 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.155277 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.155314 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.155419 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.155552 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.155603 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.155639 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.155686 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.155741 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.155779 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.155816 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.155853 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.155939 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.155977 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.156015 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.156052 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.156087 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.156124 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.156178 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.156215 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.156260 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.156346 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.156418 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.156490 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.156549 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.156613 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.156672 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.156739 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.156797 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.156867 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.156935 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.157009 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.157072 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.157130 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.157190 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.157255 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.157319 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.157408 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.157484 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.157569 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.157630 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.157695 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.157755 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.157815 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.157878 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.157937 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.157998 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.158059 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.158119 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.158249 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.158309 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.158376 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.158485 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.158543 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.158603 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.158663 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.158722 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.158782 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.158841 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.158901 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.159057 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.159118 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.159181 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.159238 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.159297 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.159354 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.159447 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.159507 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.159568 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.159626 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.159830 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.159959 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.160022 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.160083 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.160192 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.160252 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.160310 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.160382 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.160445 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.160531 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.160608 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.160666 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.160753 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.160812 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.160874 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.160939 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.161001 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.161064 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.161122 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.161179 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.161559 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.161622 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.161694 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.161754 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.161816 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.161905 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.161982 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.162042 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:31.162143 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.162204 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.162292 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.162351 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.162432 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.162493 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.162568 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.162627 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.162697 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.162763 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.162882 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:31.162989 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.163049 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.163110 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.163184 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.163248 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.163308 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.163385 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.163460 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.163545 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.163605 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.163666 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.163768 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.163828 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.163911 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.164009 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.164069 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.164129 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.164188 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.164247 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.164322 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.164396 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.164488 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.164595 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.164659 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.164723 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.164790 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.164850 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.164909 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.164979 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.165050 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.165109 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.165174 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.165232 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.165361 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.165484 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.165545 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.165605 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.165665 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.165729 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.165790 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.165860 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.165923 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.166073 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.166133 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.166198 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.166257 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.166353 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.166450 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.166529 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.166572 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.166615 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.166663 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.166706 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.166752 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.166795 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.166838 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.166927 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.167005 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.167055 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.167108 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.167167 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.167203 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.167239 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.167412 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.167473 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.167529 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.167579 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.167662 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.167717 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.168010 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.168061 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.168111 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.168161 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.168211 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.168269 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.168415 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.168469 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.168528 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.168813 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.169022 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.169075 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.169378 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.169435 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.169502 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.169552 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.169601 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.169650 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.169700 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.169750 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.169988 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.170040 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.170161 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.170213 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.170669 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.170723 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.171035 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.171430 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.171494 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.171551 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.171647 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.171714 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.172079 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.172130 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.172180 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.172231 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.172383 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.172436 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.173867 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.173927 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.173978 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.174035 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.174131 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.174202 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.174263 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.174336 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:31.174405 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:31.174467 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.174523 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.174575 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.174625 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.174683 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.174733 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.174808 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.174854 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.174912 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.174958 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.175042 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.175089 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.175135 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.175202 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.175332 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.175407 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.175463 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.175509 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.175555 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.175600 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.175739 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.175786 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.175837 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.175883 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.176108 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.176288 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.176335 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.176389 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:31.176470 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.176543 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.176610 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.176676 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.176744 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:31.176860 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.176928 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.177006 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.177072 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.177139 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.177205 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.177272 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.177340 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.177429 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.177487 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.177555 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.177674 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.177733 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.177801 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.177859 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.177927 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.177986 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.178044 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.178115 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.178173 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.178233 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.178291 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.178351 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.178429 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.178488 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.178556 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.178629 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.178687 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.178755 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.178813 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.178891 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.178949 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.179012 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.179082 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.179144 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.182376 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.182447 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.195133 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.195208 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.198977 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.199049 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.199148 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.199211 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.207581 brk(0x1d68000) = 0x1d68000 02:44:31.212686 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.212789 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.228530 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.228639 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.243616 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.243724 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.256292 brk(0x1d89000) = 0x1d89000 02:44:31.267288 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.276175 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.276278 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.279248 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:31.279349 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.287448 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:31.289171 futex(0x7fc968c5fa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:38.387070 futex(0x7fc968c5fa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.404360 brk(0x1daa000) = 0x1daa000 02:44:38.417771 futex(0x7fc94cac0a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:38.444620 futex(0x7fc94cac2e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:38.452660 futex(0x7fc94cac2e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.452771 futex(0x7fc94cac0a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.521869 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.521989 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.522096 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.522164 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.522236 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.522308 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.522422 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.522566 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.522648 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.522714 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.522827 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.522908 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.522985 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.523108 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.523179 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.523300 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.523390 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.523460 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:38.523604 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.523681 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.523756 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.523845 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.523917 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.524112 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.524184 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.524483 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.524571 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:38.524695 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.524791 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.524850 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.524929 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.524982 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.525047 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.525098 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.525151 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.525395 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.525465 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.525646 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.525700 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:38.525856 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.525905 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.525958 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.526008 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.526067 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.526115 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.526201 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.526246 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.526300 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:38.526466 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.526700 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.526756 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.526817 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.526873 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.526945 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.526995 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.527048 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.527097 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.527146 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.527195 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.527243 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:38.527301 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.527353 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.527439 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.527488 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:38.527569 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.527623 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.527703 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.527754 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.527803 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.527931 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.527987 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.528040 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:38.528107 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.528149 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.528238 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.528287 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.528333 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.528407 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.528470 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.528772 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.528822 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.528890 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.528941 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.528991 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.529060 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:38.529142 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.529192 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.529241 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.529294 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.529342 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.529412 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.529466 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.529515 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.529566 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.529617 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.529671 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.529960 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.530009 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.530074 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.530120 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.530262 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.530304 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.530347 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.530424 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.530481 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.530675 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.530724 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.530930 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.530981 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.531033 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.531081 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.531131 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.531180 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.531257 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.531305 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.531354 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.531421 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.531471 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.531629 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.531678 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.531726 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.531774 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.531823 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.531871 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.531926 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.531984 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.532048 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.532107 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.532149 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.532305 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.533043 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.533100 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.533158 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.533210 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.533261 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.533315 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.533379 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.533576 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.533625 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.533673 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.533793 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.533841 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.533896 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.533974 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.534023 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.534083 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.534143 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.534200 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.534241 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.534284 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.534326 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.534396 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.534456 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.534505 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.534562 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.534611 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.534697 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.534753 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.534802 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.535111 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.535160 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.535215 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.535264 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.535335 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.535401 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.535452 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.535501 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.535558 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.535606 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.535658 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.535706 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.535768 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.535959 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.536008 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.536068 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.536270 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.536391 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.536453 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.536582 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.536631 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.536680 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.536751 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.536799 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.536847 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.536895 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.536945 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.537004 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.537052 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.537118 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.537299 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.537352 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.537456 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.537526 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.537610 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.537682 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.537749 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.537815 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.537962 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.538028 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.538106 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.538170 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.538234 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.538308 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.538417 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.538544 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.538626 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.538699 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.538765 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.538831 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.538896 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.539051 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.539117 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.539199 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.539265 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.539332 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.539420 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.539488 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.539554 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.539623 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.539689 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.539764 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.539831 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.539994 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.540070 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.540149 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.540214 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.540476 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.540547 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.540794 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.540875 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.540943 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.541009 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.541075 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.541142 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.541208 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.541274 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.541347 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.541433 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.541499 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.541588 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.541658 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:38.541749 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.541823 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.541888 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.541978 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.542044 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.542126 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.542189 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.542272 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.542337 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.542432 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.542503 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.542568 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.542633 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.542699 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.542767 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.542833 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.542976 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.543041 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.543107 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.543175 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.543243 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.543443 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.543513 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.543579 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.543651 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.543721 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.543786 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.543858 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.543981 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.544060 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.544127 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.544191 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.544255 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.544319 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.544398 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.544466 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.544530 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.544593 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.544662 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.544725 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.544789 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.544860 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.544924 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.545047 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.545111 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.545220 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.545285 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.545460 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.545529 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.545595 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.545710 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.545776 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.545843 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.545908 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.545975 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.546041 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.546107 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.546863 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.546940 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.547007 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.547071 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.547176 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.547240 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.547305 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.548068 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.548314 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.548426 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.548515 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.548579 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.548635 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.548691 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.549031 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.549181 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.549855 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.549927 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.549983 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.550047 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.550099 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.550209 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.550261 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.550311 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.550376 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.550431 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.550530 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.550626 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.550678 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.550729 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.550780 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.550837 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.550893 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.550946 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.551071 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.551122 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.551177 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.551229 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.551281 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.551375 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.551441 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.551494 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.551550 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.551615 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.551719 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.551772 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.551849 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.551900 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.551953 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.552005 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.552086 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.552139 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.552206 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.552258 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.552393 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.552447 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.552512 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.552563 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.552612 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.552663 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.552719 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.552791 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.552841 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.552900 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.552950 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.553000 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.553049 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.553104 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:38.553225 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.553276 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.553334 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.553413 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.553466 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.553522 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.553573 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.553636 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.553687 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.553772 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.553828 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.553879 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.553941 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.553993 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.554043 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.554096 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.554194 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.554245 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.554296 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.554386 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.554440 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.554492 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.554571 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.554625 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.554678 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.554754 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.554806 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.554857 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.554914 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.554965 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.555019 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.555154 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.555462 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.555516 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.555573 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.555630 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.555686 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.555737 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.555789 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.555846 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.555897 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.556025 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.556153 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.556205 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.556281 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.556333 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.556422 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.556500 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.556574 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.556657 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.556776 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.556896 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.556971 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.557557 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.557634 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.557701 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.557781 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.558221 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.558288 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.558414 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.558483 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.558558 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.559140 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.559204 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.559332 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.559519 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.559591 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.559679 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.559892 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.559967 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.560033 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.560099 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.560164 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.560230 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.560590 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.561178 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.561253 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.561320 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.561421 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.561502 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.561568 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.561641 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.561718 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.561783 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.573444 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.573536 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.581885 brk(0x1dcb000) = 0x1dcb000 02:44:38.594267 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.594384 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.608527 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.608636 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.620353 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:38.620506 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:38.642794 futex(0x7fc93644ca88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:45.882140 futex(0x7fc93644ca88, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:45.884601 brk(0x1dec000) = 0x1dec000 02:44:45.894868 futex(0x7fc968ca2088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:46.038947 futex(0x7fc968ca2088, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.041266 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.041574 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.041682 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.041758 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.041830 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.041900 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.041981 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.042071 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.042150 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.042227 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.042303 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.042552 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.042656 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.042726 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.042866 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.042939 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.043014 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.043089 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.043159 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.043227 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.043296 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.043381 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.043479 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.043549 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.043624 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.043697 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.043773 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.043842 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.043913 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.043981 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.044049 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.044140 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.044211 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.044281 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.044348 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.044609 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.044687 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.044754 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.044823 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.044891 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.044963 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.045038 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.045106 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.045174 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.045489 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.045570 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.045950 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.046040 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.046085 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.046127 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.046634 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.046722 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.046843 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.046915 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.046983 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.047049 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.047116 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.047192 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.047260 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.047627 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.047681 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.047722 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.047769 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.047810 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.047911 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.047953 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.047992 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.048031 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.048071 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.048209 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.048250 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.048299 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.048359 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.048407 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.048454 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.048520 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.048561 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.048599 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.048697 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.048759 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.048803 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.048849 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.048888 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.048945 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.049007 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.049048 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.049087 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.049152 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.049193 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.049242 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.049300 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.049430 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.049475 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.049527 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.049617 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.049658 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.049701 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.049741 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.049784 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.049823 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.049944 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.049985 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.050030 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.050070 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.050222 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.050264 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.050304 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.050529 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.051212 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.051694 brk(0x1e0d000) = 0x1e0d000 02:44:46.052486 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.052541 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.052582 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.052739 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.052781 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.052821 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.052869 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.052914 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.052954 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.052997 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.053037 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.053076 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.053115 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.053157 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.053254 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.053357 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.053410 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.053451 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.053493 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.053532 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.053612 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.053653 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.053744 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.053784 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.053823 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.053862 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.053926 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.054012 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.054054 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.054156 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.054197 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.054244 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.054298 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.054338 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.054394 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.054447 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.054593 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.054635 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.054675 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.054713 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.054757 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.054796 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.054836 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.054891 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.054931 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.054971 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.055081 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.055131 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.055171 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.055268 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.055308 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.055347 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.055398 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.055452 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.055502 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.055541 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.055596 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.055636 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.055677 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.055716 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.055755 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.055985 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.056026 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.056110 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.056164 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.056205 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.056254 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.056294 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.056348 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.056528 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.056619 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.056691 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.056762 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.056825 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.056888 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.056949 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.057077 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.057139 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.057205 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.057271 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.057331 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.057440 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.057502 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.057569 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.057670 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.057732 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.057795 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.057856 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.057937 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.057998 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.058058 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.058119 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.058188 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.058250 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.058313 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.058390 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:46.058465 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.058525 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.058591 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.058657 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.058722 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.058784 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.058947 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.059009 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.059072 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.059136 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.059196 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.059257 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.059330 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.059404 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.059470 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.059530 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.059600 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:46.059814 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.059874 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.059934 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.060044 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.060105 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.060167 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.060227 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.060289 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.060350 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.060429 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.060490 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.060565 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.060625 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.060685 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.060744 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.060805 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.060888 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.060949 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.061009 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.061069 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.061138 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.061206 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.061272 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.061334 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.061402 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.061462 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.061528 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.061588 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.061654 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.061718 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.061784 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.061849 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.061913 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.061974 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.062066 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.062126 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.062186 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.062251 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.062312 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.062391 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.062471 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.062644 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.062705 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.062773 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.062833 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.062893 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.063004 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.063064 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.063124 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.063191 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.063251 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.063325 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.063399 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.063466 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.063527 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.063588 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.063647 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.063711 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.063771 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.063836 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.063897 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.063957 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.064021 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.064081 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.064141 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.064202 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.064290 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.064352 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.064455 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.064516 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.064578 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.064640 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.064702 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.064803 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.064863 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.064923 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.064984 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.065136 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.065196 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.065264 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.065324 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.065393 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.065458 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.065518 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.065582 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.065645 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.065815 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.065875 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.065935 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.066062 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.066121 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.066181 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.066301 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.066361 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.066444 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.066564 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.066607 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.066650 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.066702 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.066762 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.066806 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.066849 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:46.066923 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:46.066974 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.067027 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.067073 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.067190 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.067232 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.067275 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.067327 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.067376 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.067450 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.067520 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.067573 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.067632 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.067825 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.067875 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.067926 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.067976 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.068026 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.068075 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.068245 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.068305 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.068356 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.068415 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.068478 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.068536 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.068586 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.068635 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.068685 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.068734 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.068788 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.068838 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.068886 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.068936 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.068985 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.069035 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.069096 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.069155 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.069219 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.069270 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.069319 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.069377 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.069434 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.069488 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.069544 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.069601 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.069642 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.069702 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.070139 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.070181 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.070222 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.070284 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.070332 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.070376 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.070421 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.070462 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.070507 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.070554 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.070595 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.070642 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.070686 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.070727 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.070771 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.070811 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.070851 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.070891 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.070938 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.070978 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.071019 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.071069 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.071109 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.071149 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.071195 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.071244 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.071283 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.071323 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.071378 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.071434 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.071476 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.071516 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.071556 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.071603 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.071644 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.071691 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.071736 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.071778 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.071821 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.071863 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.071909 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.071950 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.071990 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.072034 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.072080 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.072123 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.072163 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.072218 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.072259 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.072320 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.072361 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.072423 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.072464 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.072507 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.072548 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.072597 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.072647 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.072687 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.072737 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.072778 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.072818 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.072862 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.072903 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.072948 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.072989 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.073033 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.073074 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.073114 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.073154 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.073200 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.073241 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.073284 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.073330 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.073386 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.073431 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.073489 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.073530 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.073571 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.073619 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.073666 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.073707 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.073749 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.073790 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.073838 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.073885 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.073934 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.073978 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.074019 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.074063 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.074104 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.074149 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.074189 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.074229 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.074272 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.074313 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.074360 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.074417 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.074458 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.074504 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.074545 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.074588 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.074629 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.074670 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.074713 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.074759 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.074800 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.074843 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.074883 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.074923 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.074969 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.075010 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.075054 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.075111 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.075152 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.075192 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.075235 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.075275 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.075315 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.075358 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.075418 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.075466 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.075506 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.075546 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.075590 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.075630 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.075669 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.075713 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.075767 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.075808 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.075849 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.075894 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.075937 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.075981 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.076021 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.076062 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.076103 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.076151 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.076192 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.076244 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.076284 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.076324 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.076375 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.076421 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.076470 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.076510 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.076550 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.076596 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.076637 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.076682 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.076728 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.076779 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.076821 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.076863 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.076904 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.076949 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.076989 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.077036 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.077077 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.077120 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.077168 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.077214 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.077255 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.077306 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.077354 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.077404 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.077455 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.077496 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.077536 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.077577 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.077619 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.077659 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.077699 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.077745 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.077786 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.077826 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.077865 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.077906 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.077953 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.077994 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.078035 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.078077 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.078117 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.078160 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.078201 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.078250 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.078297 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.078340 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.078396 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.078437 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.078491 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.078534 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.078578 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.078620 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.078661 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.078707 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.078748 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.078802 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.078843 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.078884 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.078927 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.078968 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.079014 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.079064 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.079110 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.079151 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.079190 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.079229 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.079270 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.079316 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.079360 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.079411 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.079454 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.079495 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.079536 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.079580 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.079620 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.079678 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.079718 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.079758 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.079809 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.079853 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.079896 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.079936 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.079980 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.080020 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.080060 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.080113 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.080153 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.080196 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.080236 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.080282 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.080323 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.080373 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.080420 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.080461 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.080509 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.080560 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.080604 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:46.080738 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.080779 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.080823 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.080863 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.080912 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.080957 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.080998 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.081039 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.081082 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.081129 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.081170 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.081210 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.081250 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.081292 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.081332 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.081385 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.081430 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.081474 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.081518 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.081558 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.081597 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.081638 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.081678 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.081722 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.081773 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.081813 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.081853 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.081896 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.081936 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.081978 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.082018 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.082065 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.082106 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.082148 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.082189 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.082241 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.082282 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.082325 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.082369 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.082415 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.082456 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.082496 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.082536 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.084434 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.084491 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.103043 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.103097 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.114040 futex(0xf49410, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.114093 futex(0xf49410, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.126511 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.126568 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.128019 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.128063 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.144215 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:46.144311 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.157750 brk(0x1e2e000) = 0x1e2e000 02:44:46.161019 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.161130 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.210792 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.210874 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.220734 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.220799 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:46.220842 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.247740 futex(0x7fc93644ee88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:46.875095 futex(0x7fc93644ee88, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:46.878564 futex(0x7fc93645a288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:47.929204 futex(0x7fc93645a288, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:47.932395 brk(0x1e50000) = 0x1e50000 02:44:47.933842 futex(0x7fc9e0036128, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:53.144250 futex(0x7fc9e0036128, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.146017 futex(0x7fca1e320488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:53.779741 futex(0x7fca1e320488, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.796594 brk(0x1e71000) = 0x1e71000 02:44:53.812727 futex(0x7fc94d23c488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:53.919775 futex(0x7fc94d23c488, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.928435 futex(0x7fc9324a6288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:53.948708 futex(0x7fc9324a6288, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.950157 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.950407 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:53.950717 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.950812 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.950887 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.950960 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.951026 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.951113 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.951186 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.951255 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.951334 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.951416 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.951496 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.951582 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.951690 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.951977 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.952050 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.952328 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.952418 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.952488 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.952557 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.952622 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.952688 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.952755 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.952946 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.953088 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.953155 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.953235 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.953327 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.953423 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.953490 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.953748 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.953815 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.954448 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.954523 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.954814 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.954881 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.955087 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.955157 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.955232 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.955298 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.955395 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.955477 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.955544 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.955767 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.955833 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.956018 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.956223 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.956303 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.956383 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.956474 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.956546 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.956613 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.956679 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.956750 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.956824 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.956915 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.956984 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.957052 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.957119 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.957193 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.957259 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.957488 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.957552 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.957612 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.957674 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.957734 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.957801 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.957868 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.957926 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.958051 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.958109 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.958175 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.958232 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.958289 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.958356 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.958491 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.958549 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.958606 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.958679 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.958736 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.958795 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.958853 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.958910 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.958967 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.959029 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.959096 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.959156 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.959224 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.959282 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.959339 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.959415 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.959486 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.959545 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.959607 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.959666 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.959725 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.959784 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.959842 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.959901 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.959960 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.960021 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.960099 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.960159 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.960218 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.960291 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.960350 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.960430 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.960490 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.960553 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.960619 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.960681 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.960796 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.960854 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.960932 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.960989 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.961046 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.961112 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.961169 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.961226 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.961293 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.961391 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.961451 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.961519 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.961576 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.961640 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.961696 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.961761 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.961818 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.961875 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.961940 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.962089 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.962149 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.962694 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.962758 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.962819 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.962878 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.962937 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.962995 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.963063 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.963193 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.963253 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.963314 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.963385 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.963450 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.963515 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.963576 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.963636 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.963697 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.963756 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.964118 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.964176 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.964236 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.964293 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.964352 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.964424 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.964482 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.964611 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.964667 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.964759 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.964818 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.964876 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.964932 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.965008 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.965066 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.965124 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.965188 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.965245 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.965303 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.965361 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.965824 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.965886 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.965989 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.966057 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.966118 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.966200 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.966257 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.966314 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.966995 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.967059 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.967409 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.967481 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.967548 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.967915 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.967989 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.968318 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.968411 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:53.968718 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.968926 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.968957 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.968990 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.969019 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.969051 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.969210 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.969242 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.969275 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.969307 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.969339 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.969502 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.969540 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.969621 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.969709 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.969742 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.970005 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.970037 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.970081 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.970114 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.970557 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.970669 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.970703 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.970734 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.970923 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.970970 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.971017 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.971087 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.971120 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.971150 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.971218 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.971261 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.971293 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.971331 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.971445 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.971480 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.971539 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.971572 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.971604 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.971637 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.971681 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.971714 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.971748 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.971783 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.971820 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.971852 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.971885 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.971919 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.971951 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.971983 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.972015 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.972052 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.972093 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.972135 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.972167 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.972207 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.972240 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.972276 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.972309 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.972362 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.972857 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.972891 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.972924 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.973185 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.973216 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.973245 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.973278 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.973313 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.973347 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.973384 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.973417 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.973465 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.973499 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.973537 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.973579 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.973612 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.973644 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.973677 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:53.973741 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.973774 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.973811 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.973847 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.973879 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.973910 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.973943 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.973977 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.974009 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.974041 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.974073 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.974105 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.974148 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.974181 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.974213 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.974249 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.974285 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.974317 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.974349 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.974392 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.974425 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.974468 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.974500 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.974535 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.974583 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.974616 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.974653 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.974684 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.974717 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.974762 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.974794 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.974832 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.974864 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.974902 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.974934 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.974983 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.975015 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.975047 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.975080 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.975182 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.975220 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.975255 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:53.975347 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:53.975395 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.975481 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.975526 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.975571 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.975616 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.975657 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.975697 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.975740 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.975780 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.975871 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.975913 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.975977 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:53.976029 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.976069 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.976110 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.976180 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.976220 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.976260 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.976405 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.976451 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.976492 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.976552 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.976593 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.976633 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.976672 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.976712 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.976757 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.976797 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.976837 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.976880 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.976917 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.976971 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.977005 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.977044 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.977078 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.977175 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.977210 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.977260 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.977297 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.977330 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.977399 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.977438 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.977488 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.977545 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.977590 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.977638 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.977679 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.977723 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.977764 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.977819 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.977860 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.977900 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.977940 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.977983 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.978024 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.978064 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.978117 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.978158 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.978205 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.978245 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.978285 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.978329 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.978377 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.978422 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.978466 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.978507 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.978547 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.978607 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.978648 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.978688 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.978746 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.978789 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.978836 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.978884 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.978916 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.978949 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.978982 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.979014 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.979047 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.979081 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.979119 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.979152 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.979187 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.979220 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:44:53.979266 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.979300 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.979340 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.979394 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.979431 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.979471 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.979504 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.979551 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.979588 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.979626 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.979668 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.979701 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.979750 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.979783 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.979887 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.979937 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.979971 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.980011 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.980044 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.980081 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.980115 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.980150 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.980183 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.980233 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.980266 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.980302 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.980349 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.980397 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.980431 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.980471 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.980505 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.980578 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.980613 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.980646 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.980686 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.980724 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.980822 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.980855 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.980889 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.980921 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.980954 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.980993 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.981029 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.981062 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.981099 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.981142 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.981180 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.981223 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.981256 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.981289 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.981326 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.981358 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.981412 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.981446 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.981479 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.981517 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.981551 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.981584 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.981621 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.981686 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.981720 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.981755 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.981788 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.981821 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.981854 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.981891 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.981926 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.981960 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.982006 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.982039 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.982072 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.982104 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.982138 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.982173 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.982209 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.982241 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.982274 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.982316 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.982684 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.982970 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.983057 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.983103 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.983138 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.983178 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.983212 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.983255 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.983288 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.983321 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.983357 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.983407 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.983465 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.983508 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.983624 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.983667 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.983707 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.983747 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.984002 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.984084 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.984126 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.984179 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.984429 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.984476 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.984536 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.984577 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.984644 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.984700 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.984745 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:53.984812 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:53.984845 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:54.005399 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:54.005472 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:54.008648 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:54.008693 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:54.023774 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:54.023839 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:54.033117 brk(0x1e92000) = 0x1e92000 02:44:54.039094 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:54.039158 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:54.039200 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:54.039249 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:54.039290 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:54.039330 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:54.080339 futex(0xf49410, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:54.096504 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:54.096574 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:54.114611 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:44:54.114675 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:54.126748 brk(0x1eb3000) = 0x1eb3000 02:44:54.129506 futex(0x7fca1e65b088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:44:57.974154 futex(0x7fca1e65b088, FUTEX_WAKE_PRIVATE, 1) = 0 02:44:57.975528 futex(0x7fc9e0037f98, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:01.380173 futex(0x7fc9e0037f98, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.388206 brk(0x1ed4000) = 0x1ed4000 02:45:01.389031 brk(0x1ef5000) = 0x1ef5000 02:45:01.389742 futex(0x7fc9bc012918, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:01.397278 futex(0x7fc9bc012918, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.407426 futex(0x7fc9f01634c8, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:01.426545 futex(0x7fc9f01634c8, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.429672 futex(0x7fc9bc03ef98, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:01.430292 futex(0x7fc9bc03ef98, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.430699 futex(0x7fc936847c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:01.728036 futex(0x7fc936847c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.759005 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.759922 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:01.760493 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.760759 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.760847 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:01.762450 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.762765 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.762842 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.762916 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.762986 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.763056 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.763125 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.764116 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.764196 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.764346 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.764440 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.764626 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.764715 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.765056 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.765128 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.765197 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.765510 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.765635 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.765708 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.765783 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.765853 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.765922 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.765989 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.766057 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.766783 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.766934 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.767501 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.767587 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.767664 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.767731 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.767799 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.767930 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.768001 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.768073 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.768142 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.768619 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.768849 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.769539 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.769880 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.770192 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.770266 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.770340 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.770983 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.771120 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.771182 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.771238 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.771291 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.771341 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.771407 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.771530 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.771852 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.771904 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.771956 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.772341 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.772547 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.772634 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.772684 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.772736 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.773166 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.773217 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.773655 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.773766 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.773821 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.773889 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.773962 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.774015 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.774108 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.774158 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.774208 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.774260 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.774310 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.774360 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.774516 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.774586 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.774692 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.774785 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.774853 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.774924 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.774991 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.775185 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.775253 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.775320 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.775404 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.775475 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.775552 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.775621 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.775708 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.775775 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.776047 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.776223 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.776290 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.776358 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.776473 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.776569 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.776636 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.776710 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.776778 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.776871 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.776943 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.777010 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.777078 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.777162 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.777258 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.777328 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.777412 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.777480 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.777552 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.777624 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.777699 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.777799 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.777871 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.777943 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.778011 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.778124 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.778191 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.778264 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.778331 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.778418 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.778498 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.778565 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.778633 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:01.778732 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.778800 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.778875 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.778949 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.779016 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.779083 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.779149 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.779220 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.779287 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.779353 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.779478 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.779577 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.779645 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.779728 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.779796 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.779946 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.780017 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.780091 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.780158 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.780229 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.780296 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.780429 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.780559 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.780620 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.780740 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.780803 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.780863 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.780930 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.781045 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.781130 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.781215 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.781277 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.781336 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.781421 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.781488 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.781549 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.781614 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.781674 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.781789 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.781850 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.781909 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.782005 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.782075 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.782135 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.782198 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.782258 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.782326 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.782399 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.782469 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.782528 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.782598 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.782657 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.782717 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.782776 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.782850 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.782909 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.782968 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.783028 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.783097 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.783158 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.783243 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.783302 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.783395 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.783459 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.783524 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.783584 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.783657 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.783720 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.783781 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.783840 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.783905 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.783965 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.784062 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.784123 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.784185 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.784245 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.784304 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.784380 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.784444 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.784508 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.784568 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.784927 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.784995 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.785055 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.785116 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.785183 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.785243 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.785305 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.785373 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.785445 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.785506 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.785586 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.785646 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.785706 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.785767 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.785830 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.785889 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.785960 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.786028 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.786088 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.786166 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.786226 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.786290 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.786350 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.786436 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.786483 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.786534 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.786582 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.786632 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.786677 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.786727 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.786770 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.786816 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.786860 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.786916 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.786959 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.787002 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.787045 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.787087 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.787132 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.787175 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.787218 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.787292 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.787336 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.787400 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.787449 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.787495 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.787542 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.787624 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.787667 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.787757 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.787800 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.787887 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.787964 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.788007 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.788055 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.788098 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.788144 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.788188 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.788253 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.788296 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.788341 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.788401 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.788448 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.788501 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.788545 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.788591 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.788634 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.788679 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.788721 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.788782 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.788829 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.788872 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.788915 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.788962 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.789006 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.789060 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.789106 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.789149 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.789191 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.789235 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.789278 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.789349 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.789419 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.789465 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.789524 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.789568 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.789616 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.789659 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.789710 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.789753 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.789874 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.790668 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.790819 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.790874 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.790933 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.791000 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.791157 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.791211 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:01.791477 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.791537 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.791587 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.791637 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.791698 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.791752 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.791802 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.792078 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.792129 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.792214 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.792265 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.792315 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.792469 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.792522 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.792584 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.792791 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.792857 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.792914 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.792965 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.793017 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.793066 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.793128 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.793179 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.793243 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.793301 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.793408 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.793466 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.793526 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.793576 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.793635 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.793685 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.793746 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.793796 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.793857 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.793926 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.793976 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.794028 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.794078 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.794128 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.794178 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.794256 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.794431 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.794483 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.794538 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.794588 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.794639 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.794756 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.794807 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.795076 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.795204 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.795271 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.795356 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.795675 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.795733 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.798658 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.816096 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.816170 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.818567 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.818631 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.819407 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.819492 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.835206 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.835282 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.842542 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.842604 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.849505 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.849565 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.852797 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.852863 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.889416 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.889501 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.889551 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.901622 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.901687 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.916881 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.916952 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.922601 brk(0x1f16000) = 0x1f16000 02:45:01.931650 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:01.931740 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:01.932518 futex(0x7fc914294e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:07.924724 futex(0x7fc914294e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:07.926954 futex(0x7fc936f2dc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:07.929116 futex(0x7fc936f2dc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:07.930221 futex(0x7fc92b05a888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:09.235127 futex(0x7fc92b05a888, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.260810 brk(0x1f37000) = 0x1f37000 02:45:09.276783 futex(0x7fca1ea5ba88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:09.283274 futex(0x7fca1ea5ba88, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.283766 futex(0x7fca1ea61488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:09.289087 futex(0x7fca1ea61488, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.319502 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.319629 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.319745 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.319812 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.319884 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.319969 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.320037 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.320112 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.320181 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.320252 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.320310 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.320388 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.320572 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.320637 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.320700 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.320765 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.320827 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.320888 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.321177 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.321239 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.321607 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.321675 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.322014 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.322088 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.322152 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.322219 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.322503 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.322568 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.322628 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.322688 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.322754 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.322836 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.322897 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.322961 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.323022 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.323082 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.323158 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.323228 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.323311 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.323419 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.323483 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.323545 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.323606 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.323666 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.323730 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.323790 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.323854 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.323914 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.323982 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.324041 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.324105 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.324171 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.324240 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.324300 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.324359 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.324477 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.324540 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.324600 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.324693 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.324753 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.324826 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.324886 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.324952 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.325013 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.325240 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.325301 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.325361 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.325445 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.325505 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.325565 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.325624 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.325699 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.325759 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.325826 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.325888 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.325959 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.326019 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.326094 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.326152 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.326215 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.326274 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.326332 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.326443 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.326579 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.326624 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.327089 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.327134 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.327243 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.327346 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.327443 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.327489 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.327545 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.327724 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.327789 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.327838 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.327887 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.327931 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.327982 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.328027 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.328086 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.328138 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.328175 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.328217 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.328254 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.328290 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.328327 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.328380 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.328491 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.328546 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.328590 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.328633 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.328679 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.328722 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.328764 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.328807 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.328857 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.328937 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.328980 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.329022 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.329065 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.329121 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.329164 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.329228 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.329342 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.329402 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.329452 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.329504 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.329549 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.329592 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.329635 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.329678 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.329727 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.329770 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.329837 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.329882 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.329930 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.329983 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.330055 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.330103 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.330144 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.330180 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.330231 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.330268 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.330324 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.330360 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.330450 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.330497 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.330698 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.330742 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.330872 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.330915 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.330958 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.331000 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.331050 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.331092 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.331209 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.331251 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.331293 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.331335 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.331394 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.331442 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.331485 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.331780 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.331837 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.331882 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.332002 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.332102 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.332138 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.332174 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.332215 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.332252 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.332288 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.332324 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.332360 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.332418 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.332475 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.332526 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.332568 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.332610 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.332698 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.332743 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.332786 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.332829 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.332881 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.332924 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.332968 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.333016 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.333058 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.333103 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.333145 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.333187 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.333229 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.333275 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.333409 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.333485 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.333534 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.333577 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.333625 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.333708 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.333782 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.333829 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.333978 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.334021 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.334086 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.334122 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.334158 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.334257 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.334294 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.334330 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.334382 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.334434 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.334484 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.334531 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.334574 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.334619 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.334661 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.334703 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.334744 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.334786 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.334869 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.334922 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.334965 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.335118 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.335162 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.335221 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.335263 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.335305 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.335346 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.335403 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.335478 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.335521 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.335570 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.335613 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.335659 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.335701 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.335743 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.335846 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.335972 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.336021 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.336064 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.336131 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.336174 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.336210 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.336254 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.336290 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.336536 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.336593 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.336776 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.336832 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.336985 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.337044 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.337095 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.337160 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.337519 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.337722 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.337830 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.338040 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.338122 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.338567 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.338658 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.338837 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.338914 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.338991 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.339068 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.339146 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.339589 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.339680 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.339756 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.339837 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.339913 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.339995 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.340162 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.340243 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.340314 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.340452 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.340533 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.340609 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.340686 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.340763 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.340838 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.340911 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.340999 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.341073 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.341146 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.341220 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.341468 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.341588 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.341707 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.341852 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.341927 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.342003 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.342111 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.342197 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.342276 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.342356 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.342683 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.342766 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.342812 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.343151 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.343201 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.343244 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.343295 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.343387 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.343593 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.343783 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.343853 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.343929 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.343998 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.344063 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.344126 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.344223 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.344284 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.344350 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.344472 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.344558 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.344620 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.344683 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.344754 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.344816 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.344880 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.344950 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.345014 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.345076 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.345137 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.345217 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.345279 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.345341 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.345425 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.345517 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.345578 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.345647 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.345818 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.345917 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.345982 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.346053 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.346122 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.346184 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.346245 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.346310 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.346384 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.346452 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.346591 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.346662 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.346766 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.346826 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.346892 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.346956 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.347045 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.347108 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.347172 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.347238 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.347305 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.347447 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.347525 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.347587 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.347675 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.347738 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.347801 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.347863 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.347951 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.348012 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.348110 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.348171 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.348235 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.348296 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.348359 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.348467 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.348511 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.348557 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.348601 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.348647 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.348698 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.348878 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.348998 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.349085 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.349166 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.349286 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.349359 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.349521 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.349617 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.349704 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.349780 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.349854 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.349930 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.350013 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.350090 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.350161 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:09.350310 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.350412 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.350504 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.350649 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.350714 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.350787 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.350847 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.350909 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.350965 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.351112 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.351176 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.351228 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.351282 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.351335 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.351413 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.351468 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.351523 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.351574 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.351625 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.351685 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.351741 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.351793 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.351844 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.351895 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.351955 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.352050 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.352103 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.352156 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.352216 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.352481 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.352537 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.352642 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.352700 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.352752 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.352830 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.352882 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.352999 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.353060 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.353111 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.353348 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.353435 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.353622 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.353676 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.353737 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.353900 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.354031 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.354155 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.354269 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.354396 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.354570 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.354717 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.354809 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.354947 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.355043 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.355132 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.355208 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.355287 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.355396 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.355551 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.355683 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.355763 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.356494 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.356581 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.356655 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.356722 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.356800 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.356936 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.357019 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.357093 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.357444 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.357497 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.357579 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.357624 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.357670 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.357714 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.357761 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.357804 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.357847 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.357899 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.357947 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.357989 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.358033 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.358075 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.358139 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.358183 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.358227 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.358274 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.358318 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.358375 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.358524 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.358598 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.358634 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.358670 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.358751 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.358791 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.358845 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.358881 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.358914 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.358964 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.359000 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.359049 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.359085 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.359124 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.359159 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.359206 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.359474 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.359521 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.359566 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.359610 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.359656 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.359736 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.359781 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.359824 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.359907 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.359951 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.360001 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.360050 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.360117 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.360161 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.360205 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.360250 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.360301 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.360343 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.360393 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.360443 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.360494 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.360537 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.360578 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.360632 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.360665 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.360700 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.360869 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.361063 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.361106 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.361142 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.361176 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.361212 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.361245 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.361281 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.361335 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.361389 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.361432 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.361618 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.361657 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.361765 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.361801 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.361835 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.361981 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.362020 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.362060 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.362099 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.362152 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.362191 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.362279 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.362320 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.362358 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.362419 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.362458 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.362501 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.362539 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.362595 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.362634 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.362668 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.362705 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.362804 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.362844 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.362882 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.362916 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.362952 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.362999 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.363038 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.363073 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.363113 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.363146 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.363228 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.363264 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.363299 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.363331 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.363370 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.363410 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.363668 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.363706 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.363855 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.363893 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.364052 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.364093 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.364135 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.364168 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.364225 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.364259 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.364296 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.364334 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.364423 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.364465 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.364512 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.364547 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.364583 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.364724 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.364780 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.364885 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.364923 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.364968 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.365008 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.365062 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.365100 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.365139 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.365176 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.365214 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.365252 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.365291 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.365337 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.365391 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.365465 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.365528 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.365587 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.365654 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.365716 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.365778 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.365840 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.365902 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.366015 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.366074 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:09.367084 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.367149 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.367221 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.367286 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.367346 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.367418 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.367551 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.367613 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.367677 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.367789 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.367850 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.367917 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.367986 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.368045 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.368119 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.368178 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.368245 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.368307 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.368373 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.368438 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.368508 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.368570 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.368715 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.368793 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.368860 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.368919 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.368978 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.369039 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.369098 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.369159 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.369218 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.369287 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.369346 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.369403 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.369470 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.369528 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.369605 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.369665 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.369726 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.369798 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.369857 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.369917 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.369976 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.370040 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.370099 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.370157 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.370217 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.370286 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.370548 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.370629 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.370698 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.370766 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.370838 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.370991 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.371068 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.371138 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.371207 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.371305 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.371395 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:09.371470 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.371545 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.371773 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.372043 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.372282 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:09.409512 brk(0x1f58000) = 0x1f58000 02:45:09.484945 brk(0x1f79000) = 0x1f79000 02:45:09.495164 brk(0x1f9a000) = 0x1f9a000 02:45:09.496907 futex(0x7fc9146dfe88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:15.283768 futex(0x7fc9146dfe88, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:15.288020 futex(0x7fc9e0055f08, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:16.697565 futex(0x7fc9e0055f08, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.709146 futex(0x7fc9e0035f78, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:16.746813 futex(0x7fc9e0035f78, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.754509 futex(0x7fca1ea0ac88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:16.816087 futex(0x7fca1ea0ac88, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.820920 futex(0x7fc92b093e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:16.825755 futex(0x7fc92b093e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.832769 brk(0x1fd8000) = 0x1fd8000 02:45:16.836708 brk(0x1ff9000) = 0x1ff9000 02:45:16.837491 brk(0x201a000) = 0x201a000 02:45:16.838318 brk(0x203b000) = 0x203b000 02:45:16.839211 brk(0x205c000) = 0x205c000 02:45:16.840220 brk(0x207d000) = 0x207d000 02:45:16.841094 brk(0x209e000) = 0x209e000 02:45:16.841870 brk(0x20bf000) = 0x20bf000 02:45:16.842663 brk(0x20e0000) = 0x20e0000 02:45:16.845533 futex(0x7fca1ea2da88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:16.885917 futex(0x7fca1ea2da88, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.904896 futex(0x7fc92b0dbe88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:16.925205 futex(0x7fc92b0de288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:16.935508 futex(0x7fc92b0de288, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.935589 futex(0x7fc92b0dbe88, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.953612 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.953728 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.953797 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.953879 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.954331 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.954413 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.954544 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.955104 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.955168 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.955230 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.955552 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.955824 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:16.956829 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.957034 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.957110 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.957187 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.957622 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.957688 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.957759 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.957822 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.957886 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.957948 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.958012 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.958074 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.958136 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.958198 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.958261 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.958323 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.958452 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.958538 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.958599 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.958664 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.958741 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.958819 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.958881 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.958948 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.959016 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.959085 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.959145 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.959204 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.959263 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.959326 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.959418 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.959494 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.959555 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.959615 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.959676 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.959746 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:16.961047 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.961116 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:16.961212 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.961272 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.961340 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.961420 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.961490 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.961552 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.961615 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.961688 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.961759 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.962025 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.962088 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.962250 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.962312 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.962389 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.962620 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.962683 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.962746 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.962808 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.962869 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.962941 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.963002 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.963078 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.963138 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.963198 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.963342 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.963427 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.963494 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.963587 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.963650 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.963819 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.963881 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.963944 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.964103 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.964164 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.964227 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.964294 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.964360 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.964443 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.964511 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.964574 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.964641 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.964703 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.964774 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.965269 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.965330 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.965474 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.966306 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.966384 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.966463 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.966532 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.966602 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.967084 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.967247 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.967938 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.968072 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.968146 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.968226 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.968298 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.968387 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.968460 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.968529 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.968602 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.968685 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.968757 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.968838 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.968908 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.968997 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.969079 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.969150 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.969231 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.969299 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.969388 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.969466 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.969545 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.969617 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.969864 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.969936 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.970076 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.970146 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.970323 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.970418 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.970552 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.970625 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.970710 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.970789 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.970859 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.971007 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.971078 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.971155 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.971233 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.971424 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.971505 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.971587 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.971656 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.971727 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.971812 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.971884 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.971955 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.972027 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.972153 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.972226 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.972297 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.972394 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.972467 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.972688 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.972773 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.973113 futex(0xf49410, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:16.973277 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:16.974181 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.974261 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.974336 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.975533 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.975619 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.976136 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.976412 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.976477 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.976539 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.976598 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.976658 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.976721 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.976781 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.976840 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.976900 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.976960 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.977038 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.977097 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.977157 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.977217 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.977278 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.977465 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.977530 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.977590 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.977650 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.977710 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.977777 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.977837 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.977906 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.978021 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.978080 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.978140 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.978221 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.978342 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.978417 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.978472 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.978539 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.978578 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.978622 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.978661 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.978699 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.978735 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.978777 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.978812 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.978868 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.978903 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.978939 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.978971 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.979007 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.979041 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.979080 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.979173 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.979213 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.979270 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.979308 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.979368 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.979409 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.979448 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.979483 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.979523 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.979559 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.979599 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.979635 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.979675 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.979712 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.979772 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.979811 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.979861 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.979900 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.979935 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.979973 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.980017 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.980055 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.980091 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.980133 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.980168 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.980229 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.980264 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.980298 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.980334 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.980374 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.980518 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.980555 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.980664 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.980701 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.980740 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.980783 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.980818 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.980854 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.980908 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.980945 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.981100 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.981139 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:16.981183 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.981230 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.981266 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.981302 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.981498 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.981539 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.981577 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.981621 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.981659 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.981695 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.981826 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.981864 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.981898 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.981965 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.982002 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.982038 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.982074 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.982141 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.982266 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.982427 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.982467 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.982506 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.982634 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.982675 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.982712 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:16.982770 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.982807 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.982846 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.982902 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.982939 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.982976 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.983080 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.983119 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.983172 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.983208 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.983246 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.983290 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.983329 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.983543 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.983599 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.983645 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.983706 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.983757 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.983802 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.984324 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.984388 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.984736 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.984781 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.984865 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.984910 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.984955 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.985013 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.985062 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.985107 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.985154 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.985191 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.985383 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.985426 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.985461 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.985498 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.985534 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.985965 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.986090 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.986142 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.986178 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.987157 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.987199 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.987664 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.987705 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.987740 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.987781 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.987851 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.987889 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.987925 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.987970 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.988005 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.988097 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.988137 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.988174 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.988254 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.988294 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.988329 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.988376 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.988425 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.988458 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.988501 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.988551 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.988590 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.988628 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.988822 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.988859 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.988894 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.989131 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.989166 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.989569 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:16.990311 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.990355 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.990401 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.990436 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:16.990481 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.990518 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.990555 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.990613 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.990654 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.990690 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.990724 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.990758 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.990817 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:16.990876 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.990912 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.990954 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.990989 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.991026 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.991124 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.991162 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.991202 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.991287 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.991334 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.991369 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.991407 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:16.992276 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:16.992342 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.992402 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.992439 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.992479 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.992515 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.992912 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.992968 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.993009 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.993049 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.993084 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.993117 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:16.994047 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.994086 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.994125 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.994165 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.994221 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.994284 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.994322 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.994391 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.994432 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.994475 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.994514 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.994548 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.994585 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.994621 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.994661 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:16.995583 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.995628 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:16.996656 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.996700 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.996735 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.996835 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.996870 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.996906 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.996967 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.997003 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.997043 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.997079 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.997120 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.997157 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.997200 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.997240 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.997280 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.997319 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.997419 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.997515 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.997605 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.997682 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.997757 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.997833 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.998661 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.998746 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:16.998825 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:16.999856 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:16.999985 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.000068 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.000143 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.000216 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.000298 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:17.001245 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.001330 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.001460 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.001581 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.001664 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.001738 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.001814 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.001887 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:17.002842 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:17.004034 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.004115 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.004208 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.004285 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.004618 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.004741 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.004815 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.004889 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.005003 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:17.005883 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:17.006005 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:17.006114 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.006198 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.006274 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.006394 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.006476 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.006553 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.006629 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.006707 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.006804 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.006880 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.006955 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.007036 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.007235 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.007325 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.007436 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.007564 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.007660 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.007734 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.007812 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.007898 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.007980 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.008056 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.008151 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.008225 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.008300 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.008396 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.008481 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.008620 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.008694 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.008776 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.008874 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.008993 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.009069 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.009142 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.009224 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.009303 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.009396 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.009479 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.009561 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.009639 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.009718 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.009792 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.009866 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.009954 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.010030 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.010106 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.010184 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.010270 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.010345 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.010518 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.010595 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.010925 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.011003 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.011099 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.011175 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.011262 futex(0xf49410, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.011387 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.011594 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.011680 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.011770 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.011844 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.011995 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.012071 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.012153 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.012227 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.012967 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.013065 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.013138 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.013284 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.013500 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.013759 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.013834 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.015189 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.015304 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.015431 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.015523 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.015595 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.015666 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.015788 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.015861 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.015934 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.016100 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.016172 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.016242 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.016349 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.016433 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.016472 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.016514 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.016552 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.016592 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.016676 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.016715 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.016777 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.016816 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.016978 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.017016 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.017054 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.017112 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.017154 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.017210 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.017248 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.017333 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.017385 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.017443 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.017481 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.017527 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.017571 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.017611 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.017670 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.017709 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.017843 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.017883 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.017921 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.018039 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.018078 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.018150 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.018193 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.018232 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.018291 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.018330 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.018372 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.018514 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.018553 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.018704 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.018743 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.019011 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:17.019075 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:17.019140 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.019189 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:17.019258 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:17.019405 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.019449 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.019736 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.019778 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.019856 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.019894 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.019960 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.020000 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.020048 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.020087 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.020253 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.020292 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.020331 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.020372 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.020414 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.020453 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.020502 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.020541 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.020616 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.020665 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.020704 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.020742 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.020784 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.020823 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.020895 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.020939 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.021008 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.021046 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.021085 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.021123 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.021203 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.021241 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.021288 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.021330 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.021387 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.021430 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.021504 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.021543 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.021581 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.021620 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.021687 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.021734 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.021776 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.021819 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.021858 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.021896 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.021933 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.021992 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.022031 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.022070 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.022123 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.022161 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.022243 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.022282 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.022320 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.022384 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.022440 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.022479 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.022527 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.022565 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.022611 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.022650 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.022736 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.022775 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.022848 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.022887 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.022929 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.022968 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.023036 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.023078 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.023117 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.023154 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.023193 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.023237 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.023275 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.023313 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.023353 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.023401 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.023439 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.023477 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.023515 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.023577 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.023616 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.023659 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.023698 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.023771 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.024018 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.024214 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.024254 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.024297 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.024333 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.024482 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.024522 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.035479 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.035529 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.043659 futex(0xf49450, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.051956 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.052021 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.052064 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.052101 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.091661 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.091722 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.109585 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:17.109646 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:17.141931 futex(0x7fc937594a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:23.498600 futex(0x7fc937594a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:23.500389 futex(0x7fc9e005baf8, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:24.282333 futex(0x7fc9e005baf8, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.290518 futex(0x7fc9bc050ed8, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:24.291106 futex(0x7fc9bc050ed8, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.293099 futex(0x7fc92b402688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:24.532904 futex(0x7fc92b402688, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.535052 futex(0x7fc937265288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:24.609155 futex(0x7fc937265288, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.609343 futex(0x7fc8f5474c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:24.720088 futex(0x7fc8f5474c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.782585 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.782720 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.782807 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.782885 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.783306 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.783388 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.783693 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.783767 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.783830 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.783966 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.784025 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.784090 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.784150 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.784216 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.784276 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.784339 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.784528 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.784795 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.784858 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.784918 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.785087 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.785148 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.785209 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.785267 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.785543 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.785609 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.785668 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.785728 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.786047 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.786108 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.786184 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.786253 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.786312 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.786448 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.786517 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.786889 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.787017 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.787085 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.787146 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.787265 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.787325 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.787462 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.787527 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.787613 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.787707 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.787778 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.787837 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.787896 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.787956 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.788016 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.788085 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.788152 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.788211 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.788271 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.788340 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.788530 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.788616 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.788662 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.788707 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.788752 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.788793 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.788858 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.788900 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.788967 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.789010 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.789057 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.789102 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.789142 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.789187 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.789228 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.789269 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.789311 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.789351 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.789421 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.789464 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.789513 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.789554 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.789595 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.789674 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.789735 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.789887 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.789948 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.789989 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.790131 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.790177 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.790218 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.790332 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.790420 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.790640 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.790711 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.790756 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.790797 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.791104 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.791139 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.791176 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.791210 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.791269 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.791318 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.791396 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.791444 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.791493 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.791535 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.791579 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.791619 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.791660 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.791705 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.791747 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.791787 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.792089 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.792133 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.792174 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.792219 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.792260 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.792302 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.792343 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.792548 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.792595 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.792660 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.792705 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.792824 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.792867 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.792918 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.792959 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.793000 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.793043 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.793087 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.793148 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.793181 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.793213 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.793246 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.793278 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.793316 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.793349 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.793455 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.793497 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.793565 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.793607 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.793655 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.793711 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.793755 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.793805 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.793845 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.793888 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.794005 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.794052 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.794122 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.794163 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.794203 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.794242 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.794282 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.794360 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.794421 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.794473 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.794515 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.794558 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.794598 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.794638 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.794837 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.794878 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.794918 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.794960 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.795226 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.795262 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.795298 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.795349 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.795400 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.795551 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.795595 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.795636 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.795682 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.795723 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.795762 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.795803 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.795888 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.795929 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.795974 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.796015 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.796067 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.796110 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.796242 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.796287 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.796442 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.796490 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.796604 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.796645 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.796845 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.796888 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.796991 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.797034 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.797148 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.797634 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.797689 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.798138 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.798187 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.798230 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.798631 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.798678 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.798719 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.798766 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.798806 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.798893 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.798935 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.799059 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.799102 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.799135 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.799169 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.799228 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.799261 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.799293 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.799333 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.800032 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.800084 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.800185 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.800226 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.800283 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.800325 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.800382 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.800429 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.800471 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.800545 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.800585 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.800628 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.800669 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.800718 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.800761 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.800830 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.800872 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.800921 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.800966 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.801009 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.801052 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:24.801987 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.802064 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.802106 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.802215 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.802260 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.802301 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.802350 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.802409 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.802450 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.802511 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.802552 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.802681 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.802725 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.802781 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.802823 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.802869 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.802909 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.802952 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.802992 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.803036 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.803139 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.803174 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.803208 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.803240 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.803275 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.803311 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.803353 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.803398 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.803434 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.803543 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.803586 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.803645 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.803686 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.803727 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.803793 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.803836 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.803880 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.803920 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.803977 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.804018 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.804060 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.804100 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.804148 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.804189 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.804235 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.804275 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.804314 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.804379 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.804431 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.804478 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.804519 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.804560 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.804620 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.804661 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.804720 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.804761 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.804801 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.804843 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.804905 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.804948 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.804988 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.805045 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.805091 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.805124 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.805156 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.805192 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.805235 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.805268 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.805312 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.805360 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.805415 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.805467 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.805512 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.805547 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.805582 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.805685 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.805720 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.805769 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.805803 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.805862 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.805895 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.805942 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.805991 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.806025 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.806094 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.806169 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.806269 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.806305 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.806338 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.806385 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.806423 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.806599 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.806649 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.806707 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.806756 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.807054 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.807099 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.807486 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.807882 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.807925 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.807962 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.808000 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.808072 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.808110 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.808147 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.808457 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.808498 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.808608 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.808645 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.808683 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.808735 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.808772 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.808810 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.808847 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.808933 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.808971 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.809037 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.809076 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.809115 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.809183 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.809221 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.809258 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.809316 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.809354 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.809413 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.809454 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.809539 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.809577 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.809615 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.809653 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.809718 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.809773 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.809896 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:24.809975 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.810141 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.810186 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.810264 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.810313 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.810396 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.810445 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.810498 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.810543 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.810595 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.810650 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.810695 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.810743 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.810788 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.810855 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.810902 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.810953 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.810998 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.811047 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.811334 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.811386 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.811434 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.811494 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.811539 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.811592 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.811636 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.811679 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.811781 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.811825 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.811871 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.811942 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.811987 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.812039 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.812084 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.812140 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.812185 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.812259 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.812312 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.812471 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.812519 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.812577 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.812621 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.812680 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.812723 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.812761 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.812809 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.812849 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.812888 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.812990 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.813029 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.813067 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.813137 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.813175 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.813234 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.813273 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.813310 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.813353 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.813400 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.813553 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.813594 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.814278 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.814321 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.814359 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.814524 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.814570 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.814614 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.814753 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.814798 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.814871 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.814919 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.814970 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.815024 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.815205 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.815251 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.815328 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.815389 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.815439 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.815508 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.815553 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.815598 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.815653 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:24.815725 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:24.815811 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:24.815865 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.815917 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:24.815977 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:24.816043 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:24.816256 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.816301 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.816346 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.816409 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.816492 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.816538 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.816587 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.816632 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.816688 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.816733 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.816777 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.816847 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.816892 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.816937 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.817038 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.817082 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.817214 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.817273 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.817316 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.817703 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.817752 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.817806 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.817851 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.818064 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.818109 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.818152 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.818197 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.818241 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.818285 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.818335 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.818421 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.818491 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.818557 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.818621 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.819019 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.819080 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.819150 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.819212 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.819271 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.819416 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.819478 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.819537 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.819599 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.819657 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.819795 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.819854 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.819913 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.819976 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.820034 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.820093 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.820152 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.820239 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.820298 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.820357 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.820455 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.820527 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.820630 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.820691 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.820761 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.820884 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.820953 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.821026 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.821551 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.821627 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.821693 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.821759 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.821871 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.821933 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.822023 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.822086 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.822149 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.822302 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.822382 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.822452 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.822575 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.822638 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.822700 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.822761 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.822827 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.822962 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.823021 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.823081 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.823140 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.823200 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.823260 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.823318 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.823395 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.823469 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.823535 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.823596 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.823700 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.823761 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.823828 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.823889 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.823957 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.824019 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.824193 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.824258 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.824343 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.824417 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.824481 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.824548 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.824610 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.824702 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.824764 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.824877 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.824939 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.825138 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.825200 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.825276 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.825337 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.825520 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.825585 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.825663 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.825734 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.825796 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.825951 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.826014 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.826120 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.826182 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.826281 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.826343 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.826723 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.826817 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.826889 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.826962 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.827032 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.827092 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.827181 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.827244 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.827352 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.827446 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.827509 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.827772 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.827834 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.827897 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.827960 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.828025 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.828088 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.828235 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.828299 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.828362 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.828443 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.828506 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.828569 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.828636 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.828721 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.828784 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.829067 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:24.829924 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.829997 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.830082 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.830145 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.830263 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.830330 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.830404 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.830467 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.830604 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.830668 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.842514 futex(0xf49410, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.842609 futex(0xf49410, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.873195 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.873319 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.879640 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.879737 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.879801 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.883694 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.883798 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.899260 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.899393 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.908735 futex(0xf49410, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.916020 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.916122 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.919502 futex(0xf49410, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.930533 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.930635 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.934674 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.934774 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.937654 futex(0xf49450, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:24.937758 futex(0xf49450, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:24.959830 futex(0x7fc8ee952488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:29.185872 futex(0x7fc8ee952488, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:29.188947 futex(0x7fc9f054a088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:31.866835 futex(0x7fc9f054a088, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:31.875213 futex(0x7fca1f427088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:32.265596 futex(0x7fca1f427088, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.271929 futex(0x7fc92ba5aa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:32.338533 futex(0x7fc92ba5aa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.351771 futex(0x7fc92b731e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:32.356578 futex(0x7fc92b731e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.362005 futex(0x7fc93761ba88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:32.367166 futex(0x7fc93761ba88, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.376809 futex(0x7fc92b754c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:32.410083 futex(0x7fc92b754c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.414012 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.414938 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.415066 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.415143 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.415797 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.415882 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.415952 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.416026 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.416093 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.416187 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.416254 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.416421 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.416504 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.416787 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.416847 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.416913 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.416973 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.417037 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.417635 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.417699 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.417760 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.418025 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.418415 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.418606 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.418669 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.418732 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.419051 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.419111 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.419205 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.419561 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.419626 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.420840 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.420912 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.420980 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.421051 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.421146 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.421216 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.421434 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.421515 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.421577 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.421638 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.421698 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.421759 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.421819 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.421878 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.421966 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.422025 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.422084 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.422143 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.422202 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.422265 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.422327 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.422443 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.422506 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.422563 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.422622 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.422679 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.422925 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.423163 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.423232 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.423560 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.423627 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.423686 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.423745 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.423861 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.423919 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.424378 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.424441 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.424529 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.424586 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.424643 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.424703 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.424760 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.425009 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.425066 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.425122 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.425179 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.425237 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.425293 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.425351 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.425432 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.425489 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.425546 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.425603 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.425659 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.425716 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.425785 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.425842 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.425899 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.425956 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.426735 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.426851 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.426976 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.427037 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.427097 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.427226 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.427285 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.427344 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.427510 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.427570 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.427628 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.427686 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.427755 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.427978 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.428042 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.428100 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.428157 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.428223 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.428281 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.428340 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.428402 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.428459 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.428521 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.428579 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.428636 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.428695 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.428750 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.428811 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.428869 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.428928 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.428996 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.429053 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.429116 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.429181 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.429238 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.429304 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.429362 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.429439 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.429633 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.429718 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.429776 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.430000 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.430059 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.430130 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.430191 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.430424 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.430535 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.430604 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.430670 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.430739 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.430802 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.430971 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.431035 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.431093 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.431151 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.431211 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.431322 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.431675 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.431741 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.431860 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.431918 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.431985 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.432044 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.432118 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.432186 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.432244 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.432305 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.432377 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.432717 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.432777 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.432853 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.432938 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.432998 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.433058 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.433136 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.433196 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.433257 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.433316 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.433389 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.433453 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.433514 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.433728 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.433812 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.433877 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.433935 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.434086 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.434145 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.434208 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.434265 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.434322 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.434375 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.434442 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.434500 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.434560 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.434618 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.434675 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.434733 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.434790 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.434909 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.434967 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.435176 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.435235 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.435297 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.435380 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.435443 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.435525 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.435583 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.435643 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.435709 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.435782 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.435844 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.435903 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.435960 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.436020 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.436078 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.436144 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.436202 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.436274 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.436338 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.436405 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.436478 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.436550 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.436616 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.436682 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.436748 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.436938 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.437005 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.437159 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.437497 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.437768 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.437839 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.437920 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.437990 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.438305 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.438383 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.438469 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.438536 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.438602 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.438698 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.439237 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.439309 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.439377 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.439479 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.439545 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.439612 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.439942 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.440010 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.440408 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.440483 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.440885 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.441023 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.441804 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.441989 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.442058 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.442133 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.442760 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.442849 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.442916 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.442988 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.443054 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.443121 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.443516 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.443979 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.445210 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.445309 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.445665 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:32.445780 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.446240 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.446310 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.446401 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.446465 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.446577 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.446640 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.446706 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.446776 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.446837 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.446898 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.446956 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.447165 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.447245 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.447306 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.447387 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.447453 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.447512 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.447571 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.447630 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.447738 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.447797 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.447856 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.448011 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.448069 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.448127 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.448184 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.448242 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.448327 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.448398 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.448456 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.448524 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.448594 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.448652 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.448709 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.448767 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.448843 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.448901 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.449025 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.449084 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.449154 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.449260 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.449319 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.449383 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.449449 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.449516 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.449575 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.449635 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.449696 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.449796 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.449868 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.449927 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.449995 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.450058 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.450126 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.450184 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.450243 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.450301 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.450384 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.450448 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.450506 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.450570 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.450628 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.450686 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.450752 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.450811 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.450872 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.450943 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.451016 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.451088 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.451153 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.451224 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.451284 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.451359 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.451432 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.451506 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.451565 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.451625 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.451687 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.451748 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.451809 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.451880 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.451943 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.452003 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.452073 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.452140 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.452212 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.452316 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.452373 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.452444 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.452510 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.452569 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.452631 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.452691 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.452750 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.452836 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.452896 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.452993 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.453054 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.453196 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.453255 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.453313 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.453372 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.453436 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.453516 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.453574 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.453655 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.453714 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.453785 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.453844 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.453915 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.453990 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.454057 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.454120 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.454181 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.454242 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.454302 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.454428 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.454495 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.454645 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.454706 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.454765 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.454826 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.454909 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.454970 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.455040 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.455100 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.455160 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.455220 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.455314 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.455382 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.455450 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.455511 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.455577 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.455648 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.455706 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.455764 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.455823 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.455891 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.455948 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.456006 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.456064 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.456122 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.456190 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.456248 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.456305 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.456388 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.456427 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.456470 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.456507 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.456557 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.456602 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.456668 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.456714 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.456754 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.456793 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.456830 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.456870 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.456918 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.456955 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.457011 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.457049 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.462488 futex(0xf49410, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.477037 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.477095 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.499267 futex(0xf49410, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.502138 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.502206 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.510040 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.510091 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.526475 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.526543 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.529521 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.529631 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.555138 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.555252 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.572659 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.572738 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.587551 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.587649 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.594817 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:32.594873 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:32.613219 futex(0x7fc9c025be88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:38.904148 futex(0x7fc9c025be88, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:38.907816 futex(0x7fc9c0268488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:38.964282 futex(0x7fc9c0268488, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:38.965593 futex(0x7fc9ac237488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:38.973304 futex(0x7fc9ac237488, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:38.974260 futex(0x7fc9e01851d8, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:39.905792 futex(0x7fc9e01851d8, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:39.917998 futex(0x7fc9c028fa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:39.979092 futex(0x7fc9c028fa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.005106 futex(0x7fca042a5a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:40.036734 futex(0x7fca042a5a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.078103 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:40.079574 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:40.080990 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.081083 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.081157 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.081259 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.081382 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.081463 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.081524 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.081585 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.081705 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.081766 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.081831 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.081890 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.081950 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.082070 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.082133 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.082210 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.082269 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.082329 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.082516 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.082577 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.082639 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.082707 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.082884 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.082946 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.083008 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.083068 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.083138 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.083469 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.083534 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.083593 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.083653 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.083713 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.083773 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.083888 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.083953 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.084039 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.084097 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.084155 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.084290 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.084348 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.084435 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.084496 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.084809 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.084869 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.084928 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.084990 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.085113 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.085173 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.085233 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.085294 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.085353 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.085434 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.085537 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.085597 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.085678 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.085904 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.085971 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.086030 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.086095 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.086155 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.086214 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.086316 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.086421 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.086562 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.086629 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.086759 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.086813 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.086886 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.086950 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.087006 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.087095 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.087144 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.087200 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.087250 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.087409 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.087472 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.087541 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.087592 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.087658 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.087708 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.087774 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.087824 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.087875 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.087938 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.087988 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.088039 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.088098 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.088143 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.088189 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.088234 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.088336 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.088620 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.088709 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.088760 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.088811 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.088892 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.088944 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.088999 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.089049 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.089105 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.089155 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.089243 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.089293 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.089343 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.089412 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.089600 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.089665 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.089716 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.089767 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.089826 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.089877 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.089968 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.090019 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.090091 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.090208 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.090287 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.090332 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.090379 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.090429 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.090475 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.090578 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.090631 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.090676 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.090734 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.090795 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.090844 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.090899 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.090952 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.091022 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.091071 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.091376 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.091469 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.091536 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.091584 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.091823 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.091872 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.091921 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.091970 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.092259 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.092367 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.092415 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.092487 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.092533 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:40.092716 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.092761 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.092804 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.092849 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.092963 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.093008 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.093079 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.093124 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.093179 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.093223 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.093267 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.093312 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.093361 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.093411 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.093456 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.093557 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.093602 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.093646 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.093698 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.093743 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.093834 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.093879 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.093924 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.094035 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.094080 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.094123 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.094167 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.094308 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.094353 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.094400 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.094448 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:40.094549 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.094676 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.094720 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.094858 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.094902 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.094947 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:40.095140 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.095194 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.095240 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.095286 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.095341 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.095418 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.095484 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.095542 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.095587 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.095680 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.095728 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.095773 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.095817 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.095861 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.095998 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.096043 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.096086 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.096131 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.096183 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.096228 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.096278 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.096323 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.096411 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.096459 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.096543 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.096589 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.096634 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.096679 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.096737 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.096837 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.096895 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.096975 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.097021 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.097065 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.097276 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.097321 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.097466 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.097510 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.097566 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.097602 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.097651 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.097687 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.097736 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.097778 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.097831 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.097867 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.097903 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.097956 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.097992 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.098028 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.098064 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.098180 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.098232 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.098268 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.098321 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.098357 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.098409 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.098446 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.098481 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.098516 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.098569 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.098605 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.098640 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.098675 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.098717 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.098767 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.098819 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.098885 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.098934 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.098977 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.099079 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.099137 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.099231 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.099280 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.099428 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.099473 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.099520 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.099565 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.099607 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.099651 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.099694 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.099740 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.099783 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.099824 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.099890 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.099932 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.099975 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.100061 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.100103 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.100157 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.100200 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.100236 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.100297 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.100333 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.100371 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.100408 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.100443 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.100657 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.100694 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.100732 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.100799 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:40.100906 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:40.100951 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.100988 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.101036 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.101125 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.101161 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.101203 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.101238 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.101274 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.101326 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.101368 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.101411 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.101447 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.101487 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.101528 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.101568 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.101657 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.101736 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.101771 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.101807 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.101857 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.101893 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.101928 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.101964 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.102057 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.102217 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.102270 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.102326 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.102365 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.102402 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.102440 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.102499 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.102535 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.102571 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.102606 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.102642 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:40.102719 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.102761 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.102800 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.102864 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.102900 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.102977 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.103012 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.103048 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.103084 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.103157 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.103193 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.103249 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.103285 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.103334 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.103376 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.103425 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.103463 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.103499 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.103540 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.103577 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.103613 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.103660 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.103803 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.103839 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.103875 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.103910 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.104044 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.104085 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.104126 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.104163 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.104203 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.104239 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.104455 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.104494 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.104610 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.104654 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.104690 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.104773 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.104809 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.104853 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.104889 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.104924 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.104962 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.104998 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.105036 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.105071 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.105107 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.105156 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.105191 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.105260 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.105295 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.105577 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.105616 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.105653 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.105858 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.105895 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.105932 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.105972 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.106008 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.106055 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.106091 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.106130 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.106165 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.106201 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.106323 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.106505 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.106552 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.106587 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.106623 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.106661 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.106718 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.106768 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.106821 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.106906 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.106949 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.107011 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.107053 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.107099 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.107224 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.107399 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.107444 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.107548 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.107590 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.107664 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.107706 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.107752 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.107794 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.107836 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.107893 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.107937 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.108089 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.108137 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.108188 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:40.108248 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:40.108301 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.108351 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.108394 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.108436 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.108473 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.108521 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.108560 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.108597 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.108640 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.108676 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.108714 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.108749 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.108784 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.108821 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.108856 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.108914 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.108950 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.108985 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.109168 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.109204 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.109242 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.109278 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.109314 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.109360 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.109408 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.109453 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.109504 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.109540 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.109578 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.109615 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.109651 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.109687 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.109735 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.109839 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.109876 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.109938 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.109975 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.110071 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.110130 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.110167 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.110220 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.110256 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.110342 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.110385 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.110424 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.110460 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.110501 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.110538 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.110574 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.110610 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.110649 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.110687 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.110726 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.110762 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.110849 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.110891 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.110927 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.110962 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.111001 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.111037 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.111072 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.111114 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.111149 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.111185 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.111229 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.111265 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.111317 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.111353 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.111397 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.111434 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.111515 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.111556 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.111592 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.111628 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.111663 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.111699 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.111735 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.111771 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.111807 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.111845 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.111881 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.111931 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.111967 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.112036 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.112071 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.112150 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.112190 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:40.112233 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.112277 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.112345 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.112387 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.112428 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.112464 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.112550 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.112595 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.112631 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.112688 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.112724 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.112763 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.112799 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.112851 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.112887 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.112934 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.112971 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.113012 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.113049 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.113084 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.113123 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.113159 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.113751 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.113822 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.113859 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:40.113914 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.113953 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.114032 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.114068 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.114112 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.114164 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.114286 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.114360 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.114405 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.114489 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.114734 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.114791 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.114949 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.114993 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.115062 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.115104 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.115146 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.115216 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.115259 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.115309 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.115373 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.115418 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.115473 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:40.115598 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.115639 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.115681 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.115723 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.115765 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.115844 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.115942 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.116008 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.116051 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.116104 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.116140 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.116190 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.116231 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.116270 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.116306 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.116342 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.116392 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.116488 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.116524 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.116623 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.116658 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.116694 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.116874 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.116910 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.116957 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.116995 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.117030 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.117066 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.117129 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.117176 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.117212 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.117247 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.117340 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.117380 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.117417 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.117453 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.117488 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.117523 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.117559 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.117612 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.117648 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.117699 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.117735 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.117840 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.117875 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.117910 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.117946 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.117980 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.118016 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.118099 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.118135 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.118171 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.118206 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.118248 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.118292 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.118328 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.118380 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.118426 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.118470 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.118688 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.118787 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.118823 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.118859 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.118894 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.118930 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.119167 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.119204 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.119239 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.119277 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.119312 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.119348 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.160698 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.160778 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.176189 brk(0x2101000) = 0x2101000 02:45:40.220989 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.221069 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.236593 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.236671 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.236711 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.236798 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.236837 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.236874 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.236937 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.236980 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.237017 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.237065 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.237103 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.237151 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.237189 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.237229 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:40.237278 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:40.237361 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.237443 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.237496 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.237587 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.237638 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.237782 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.237825 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.237870 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.237914 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.238062 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.238378 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.238425 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.238471 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.238599 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:40.238643 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:40.242762 brk(0x2123000) = 0x2123000 02:45:40.243160 futex(0x7fc9c01d7488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:47.099683 futex(0x7fc9c01d7488, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:47.099979 futex(0x7fca1807e8c8, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:47.932734 futex(0x7fca1807e8c8, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:47.936389 futex(0x7fc9ac1a2e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:48.124265 futex(0x7fc9ac1a2e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.128408 brk(0x214d000) = 0x214d000 02:45:48.129977 brk(0x216e000) = 0x216e000 02:45:48.130861 brk(0x218f000) = 0x218f000 02:45:48.131967 brk(0x21b0000) = 0x21b0000 02:45:48.132959 brk(0x21d1000) = 0x21d1000 02:45:48.133912 brk(0x21f2000) = 0x21f2000 02:45:48.134900 brk(0x2213000) = 0x2213000 02:45:48.135944 brk(0x2234000) = 0x2234000 02:45:48.137016 brk(0x2255000) = 0x2255000 02:45:48.138159 brk(0x2276000) = 0x2276000 02:45:48.155415 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.155538 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.155606 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.155671 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.155734 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.155794 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.155853 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.155954 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.156015 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.156217 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.156294 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.156353 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.156458 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.156502 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.156553 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.156596 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.156678 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.156730 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.156773 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.156873 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.156917 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.157079 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.157132 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.158002 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.158055 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.158098 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.158218 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.158261 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.158303 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.158347 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.158414 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.158458 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.158602 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.158714 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.158757 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.158799 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.158842 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.158896 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.158939 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.158985 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.159034 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.159088 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.159126 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.159162 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.159198 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.159235 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.159275 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.159381 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.159420 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.159474 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.159516 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.159563 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.159609 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.159652 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.159951 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.159993 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.160036 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.160080 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.160122 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.160188 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.160231 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.160278 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.160321 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.160379 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.160424 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.160812 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.161069 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.161121 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.161158 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.161321 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.161358 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.161515 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.161580 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.161623 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.161665 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.161763 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.161846 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.161918 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.161966 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.162021 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.162073 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.162118 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.162160 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.163013 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.163157 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.163210 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.163353 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.163403 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.163458 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.163501 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:48.163559 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.163602 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.163659 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.163703 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.164146 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.164191 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.164562 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.164608 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.164650 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.164697 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.164742 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.164789 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.164832 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.164876 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.164929 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.164977 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.165266 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.165358 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.165413 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.165464 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.165506 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.165551 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.165630 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.165672 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.165725 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.165767 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.165864 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.165906 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.165951 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.165998 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.166207 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.166249 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.166310 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.166352 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.166429 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.166495 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.166554 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.166620 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.166680 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.166828 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.166935 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.167002 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.167323 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.167399 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.167465 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.167524 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.167687 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.167763 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.167824 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.167883 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.168027 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.168105 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.168172 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.168231 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.168291 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.168349 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.168426 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.168503 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.168562 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.168620 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.168679 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.168738 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.168803 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.168862 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.168921 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.168982 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.169048 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.169123 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.169180 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.169239 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.169300 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.169357 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.169454 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.169558 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.169618 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.169676 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.169734 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.169793 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.169904 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.170016 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.170075 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.170133 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.170192 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.170334 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.170598 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.170663 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.170723 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.170781 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.170908 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.170972 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.171154 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.171209 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.171270 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.171325 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.171406 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.171478 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.171537 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.171597 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.171657 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.171737 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.171796 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.171864 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.171926 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.171985 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.172044 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.172108 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.172168 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.172230 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.172289 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.172361 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.172984 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.173064 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.173290 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.173385 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.173466 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.173534 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.173602 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.173683 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.173751 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.174090 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.174271 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.174481 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.174559 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.174627 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.174694 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.174760 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.174826 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.174893 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:48.174975 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.175042 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.175122 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.175193 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.175300 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.175398 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.175475 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.175554 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.175622 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.175723 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.175791 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.176000 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.176070 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.176136 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.176213 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.176280 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.176347 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.176436 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.176512 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.176579 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.176652 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.176719 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.177458 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.177496 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.179259 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.179646 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.179712 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.180007 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.180046 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.180083 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.180116 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.180149 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.180192 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.180224 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.180257 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.180318 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.180377 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.180430 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.180464 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.180609 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.180650 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.180683 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.180715 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.180747 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.180779 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.180816 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.180849 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.180902 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.180934 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.180967 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.180999 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.181037 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.181076 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.181110 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:48.181147 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.181180 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.181212 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.181249 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.181282 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.181395 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.181439 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.181509 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.181549 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.181597 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.181637 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.181677 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.181822 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.181863 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.181910 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.181955 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.182085 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.182128 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.182262 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.182304 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.182344 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.182391 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.182431 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.182472 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.182520 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.182560 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.182603 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.182643 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.182696 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.182751 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.182799 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.182839 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.182885 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.182919 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.182962 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.182994 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.183032 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.183065 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.183097 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.183140 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.183172 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.183205 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.183242 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.183274 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.183320 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.183358 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.183413 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.183446 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.183481 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.183513 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.183545 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.183577 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.183610 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.183642 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.183679 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.183712 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.183747 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.183779 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.183811 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.183843 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.183875 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.183929 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.183962 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.183997 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.184029 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.184062 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.184118 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.184151 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.184190 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.184230 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.184263 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.184295 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.184332 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.184367 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.184469 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.184551 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.184654 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.184689 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.184725 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.184758 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.184790 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.184823 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.184871 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.184904 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.184936 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.184994 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.185027 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.185062 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.185094 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.185126 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.185158 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.185194 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.185317 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.185351 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.185391 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.185562 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.185601 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.185649 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.185721 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.185776 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.185810 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.185863 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.185904 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.185939 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.186009 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.186043 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.186075 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.186108 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.186145 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.186179 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.186213 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.186264 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.186297 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.186348 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.186399 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.186445 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.186479 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.186565 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.186599 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.186662 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.186696 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.186744 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.186777 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.186836 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.186871 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.186970 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.187005 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.187049 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.187082 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.187154 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.187305 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.187339 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.187375 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.187416 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.187456 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.187488 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.187528 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.187565 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.187599 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.187631 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.187669 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.187707 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.187745 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.187778 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.187827 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.187866 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.187901 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.187936 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.187975 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.188013 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.188046 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.188091 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.188124 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.188157 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.188192 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.188225 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.188260 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.188292 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.188325 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.188367 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.188410 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.188454 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.188488 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.188520 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.188553 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.188585 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.188617 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.188656 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.188689 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.188721 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.188753 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.188786 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.188823 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.188855 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.188891 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.188924 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:48.188961 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.188994 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.189026 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.189058 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.189090 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.189130 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.189163 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.189203 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.189245 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.189277 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.189314 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.189347 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.189395 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.189429 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.189468 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.189502 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.189544 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.189578 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.189636 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.189684 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.189717 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.189755 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.189800 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.189833 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.189873 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.189906 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.189959 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.189993 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.190030 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.190063 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.190100 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.190132 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.190164 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.190196 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.190229 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.190264 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.190296 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.190341 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.190379 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.190415 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.190447 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.190480 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.190526 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.190560 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.190595 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.190628 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.190662 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.190699 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.190732 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.190771 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.190804 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.190836 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.190869 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.190903 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.190937 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.190983 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.191016 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.191053 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.191085 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.191118 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.191154 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.191191 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.191224 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.191256 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.191288 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.191320 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.191356 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.191397 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.191429 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.191461 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.191494 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.191529 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.191561 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.191598 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.191630 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.191667 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.191700 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.191737 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.191770 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.191806 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.191839 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.191874 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.191911 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.191944 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.191990 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.192022 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.192057 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.192089 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.192130 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.192162 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.192206 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.192238 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.192271 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.192305 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.192337 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.192375 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.192423 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.192460 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.192509 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.192548 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.192588 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.192633 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.192681 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.192721 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.192760 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.192800 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.192840 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.192885 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.192925 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.192965 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.193008 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.193048 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.193088 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.193131 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.193170 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.193209 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.193252 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.193292 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.193332 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.193383 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.193427 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.193467 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.193507 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.193546 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.193585 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.193625 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.193676 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.193719 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.193762 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.193802 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.238128 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.238205 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.261223 futex(0xf49410, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.273878 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.273933 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.283383 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.283445 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.293839 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.293896 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.345482 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:48.345569 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:48.366002 futex(0x7fc98db24a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:54.666518 futex(0x7fc98db24a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:54.666770 futex(0x7fca00078e78, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:55.777778 futex(0x7fca00078e78, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:55.779916 futex(0x7fc98db33488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:55.995387 futex(0x7fc98db33488, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.025045 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.025178 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.025307 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.025388 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.025715 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.025790 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.026395 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.027694 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.027779 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.028048 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.028125 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.028197 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.028611 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.030705 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.030861 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.030917 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.031308 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.031346 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.031491 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.031529 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.031676 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.031712 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.031759 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.031794 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.031992 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.032028 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.032081 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.032117 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.032480 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.032519 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.032559 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.032594 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.032779 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.032813 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.032847 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.032884 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.032918 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.032969 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.033002 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.033035 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.033073 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.033106 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.033138 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.033171 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.033203 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.033236 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.033286 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.033320 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.033554 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.033605 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.033764 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.033847 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.033882 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.033927 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.033962 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.034018 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.034052 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.034086 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.034240 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.034276 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.034356 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.034489 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.034526 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.034559 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.034593 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.034627 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.034660 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.034748 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.034783 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.034816 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.034850 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.034890 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.034924 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.035072 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.035125 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.035160 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.035194 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.035288 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.035323 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.035357 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.035399 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.035431 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.035464 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.035497 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.035534 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.035567 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.035883 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.035918 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.035959 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.035993 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.036025 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.036058 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.036091 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.036138 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.036170 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.036207 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.036257 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.036291 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.037381 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.037465 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.037997 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.038673 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.038756 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.038832 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.038901 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.038970 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.039052 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.039120 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.039189 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.039256 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.039327 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.039417 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.039488 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.039563 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.039631 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.039698 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.039772 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.039839 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.039938 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.040097 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.040169 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:56.040276 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.040346 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.040426 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.040495 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.040563 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.040949 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.041343 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.041775 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.041846 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.041915 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.042189 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.042258 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.042557 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.042881 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.042955 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.044316 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.044412 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.044484 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.044552 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.044621 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.044699 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.044768 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.044836 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.044904 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.045094 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.045167 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.045235 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.045317 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.045396 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.045470 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.045547 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.045616 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.045684 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.045761 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.045829 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.045897 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.046009 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.046092 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.046170 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.046238 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.046341 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:56.046449 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.046532 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.046610 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.046695 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.046778 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.046880 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.046949 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.047072 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.047142 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.047259 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.047327 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.047409 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.047479 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.047547 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.047613 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.047680 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.047750 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.047854 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.047924 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.048006 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.048074 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.048154 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.048223 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.048384 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.048471 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.048555 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.048617 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.048682 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.048716 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.048755 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.048789 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.048823 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.048859 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.048893 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.048951 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.048986 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.049020 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.049054 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.049086 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.049119 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.049156 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.049189 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.049225 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.049258 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.049307 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.049346 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.049408 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.049443 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.049481 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.049517 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.049551 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.049583 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.049616 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.049649 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.049690 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.049723 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.049774 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.049821 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.050092 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.050128 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.050436 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.050574 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.050609 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.050844 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.050879 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.050935 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.050973 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.051007 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.051040 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.051075 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.051108 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.051141 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.051179 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.051265 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.051300 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.051336 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.051373 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.051457 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.051492 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.051525 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.051565 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.051599 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.051644 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.051678 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.051714 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.051771 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.051805 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.051839 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.051874 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.052249 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.052284 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.052317 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.052351 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.052391 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.052454 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.052488 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.052521 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.052554 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.052588 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.052624 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.052657 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.052698 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.052732 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.052830 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.053193 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.053229 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.053430 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.053467 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.053683 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.053718 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.053783 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.053818 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.054300 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 1 02:45:56.055083 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.055135 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.055178 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.056239 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.056394 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.056445 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.056783 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.056878 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.056915 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.056999 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.057036 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.057070 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.057104 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.057148 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.057266 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.057309 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.057351 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.057404 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.057452 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.057494 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.057543 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.057584 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.057697 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.057738 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.057779 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.057858 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.057900 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.057950 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.057990 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.058031 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.058105 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.058147 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.058188 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.058232 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.058276 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.058317 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.058358 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.058434 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.058479 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.058523 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.058571 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.058604 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.058637 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.058670 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.058722 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.058771 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.058839 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.058874 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.058915 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.058948 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.058981 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.059014 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.059046 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.059116 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.059150 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.059190 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.059224 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.059257 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.059325 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.059358 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.059408 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.059442 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.059475 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.059522 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.059556 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.059594 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.059629 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.059838 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.059874 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.059917 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.059950 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.060015 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.060049 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.060082 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.060115 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.060159 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.060193 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.060226 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.060283 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.060318 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.060357 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.060405 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.060450 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.060484 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.060517 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.060550 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.060608 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.060651 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.060685 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.060719 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.060768 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.060803 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.060849 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.060887 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.060931 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.060965 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.061005 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.061039 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.061107 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.061146 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.061179 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.061240 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.061274 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.061441 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.061479 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.061513 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.061546 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.061583 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.061616 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.061818 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.061853 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.061886 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.061930 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.061965 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.062035 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.062079 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.062112 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.062145 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.062178 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.062211 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.062248 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.062282 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.062315 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.062351 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.062401 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.062439 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.062479 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.062518 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.062613 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.062649 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.062697 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.062731 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.062770 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.062804 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.062858 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.062893 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.062930 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.062964 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.063043 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.063084 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.063118 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.063175 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.063241 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.063276 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.063310 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.063344 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.063400 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:56.063467 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.063604 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:45:56.063659 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.063724 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.063758 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.063792 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.063835 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.063869 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.063902 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.063964 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.063998 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.064034 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.064091 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.064125 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.064163 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.064197 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.064230 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.064263 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.064297 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.064332 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.064382 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.064419 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.064453 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.064487 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.064542 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.064576 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.064615 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.064649 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.064682 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.064718 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.064752 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.064785 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.064843 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.064876 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.064910 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.064975 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.065010 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.065047 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.065081 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.065113 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.065179 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.065217 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.065250 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.065283 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.065340 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.065402 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.065437 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.065481 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.065520 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.065553 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.065607 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.065644 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.065678 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.065711 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.065763 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.065797 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.065878 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.065912 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.065948 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.065990 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.066024 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.066057 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.066091 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.066129 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.066162 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.066199 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.066257 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.066291 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.066352 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.066399 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.066434 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.066472 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.066512 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.066545 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.066588 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.066648 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.066683 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.066717 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.066753 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.066786 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.066824 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.066858 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.066895 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.066928 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.066970 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.067004 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.067060 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.067094 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.067163 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.067198 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.067231 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.067264 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.067298 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.067334 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.067396 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.067437 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.067487 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.067521 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.067558 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.067591 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.067641 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.067675 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.067745 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.067780 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.068213 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.068249 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.068612 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.068652 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.068686 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.068720 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.068951 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.068987 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.069104 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.069247 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.069334 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.069373 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.069410 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.093607 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.093678 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.095335 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.095400 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.123351 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.123454 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.124747 futex(0xf49450, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.125792 futex(0xf49410, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.143988 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.144048 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.158307 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.158482 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.174767 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.185521 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.185626 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.211221 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.217990 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.222986 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:45:56.223088 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.225642 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:45:56.228568 futex(0x7fc98228f288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:00.728111 futex(0x7fc98228f288, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:00.729601 futex(0x7fc9c0c57a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:03.820793 futex(0x7fc9c0c57a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.834818 futex(0x7fc9b8a02488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:03.841604 futex(0x7fc9b8a02488, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.887731 futex(0x7fc9c0d66a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:03.909596 futex(0x7fc9c0d67c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:03.917176 futex(0x7fc9c0d67c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.917275 futex(0x7fc9c0d66a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.921873 futex(0x7fc986c6da88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:03.922458 futex(0x7fc986c6da88, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.950823 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.950956 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.951024 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.951084 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.951143 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.951201 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.951263 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.951320 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.951379 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.951440 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.951774 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.951833 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.951890 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.951949 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.952123 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.952180 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.952240 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.952462 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.952533 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.952622 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.952687 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.952823 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.952882 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.953042 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.953109 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.953167 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.953224 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.953284 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.953346 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.953410 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.953468 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.953527 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.953584 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.953641 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.953698 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.953806 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.953863 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.953937 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.953993 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.954162 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.954219 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.954291 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.954433 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.954495 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.955547 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.955621 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.955680 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.955741 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.955798 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.955855 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.955913 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.955976 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.956035 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.956093 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.956287 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.956345 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.956451 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.956517 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.956574 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.956632 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.956733 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.956845 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.956902 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.956994 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.957051 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.957108 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.957174 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.957232 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.957307 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.957370 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.957430 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.957488 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.957545 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.957602 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.957684 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.957741 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.957833 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.957894 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.957956 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.958013 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.958101 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.958160 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.958217 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.958329 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.958403 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.958493 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.958683 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.958741 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.959010 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.959072 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.959136 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.959281 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.959340 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.959419 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.959478 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.959537 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.959595 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.959668 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.959727 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.959788 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.959857 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.959916 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.959977 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.960041 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.960100 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.960164 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.960223 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.960280 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.960341 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.960407 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.960574 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.960795 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.960854 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.960923 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.960980 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.961105 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.961162 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.961218 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.961276 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.961348 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.961423 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.961488 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.961546 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.961606 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.961696 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.961804 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.961915 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.961973 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.962033 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.962091 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.962235 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.962301 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.962388 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.962465 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.962535 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.962593 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.962657 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.962714 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.962772 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.962838 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.962902 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.962960 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.963023 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.963086 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.963164 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.963225 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.963284 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.963340 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.963407 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.963490 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.963546 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.963605 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.963671 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.963729 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.963854 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.963927 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.963984 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.964049 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.964105 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.964171 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.964227 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.964285 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.964341 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.964441 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.964525 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.964585 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.964642 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.964700 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.964758 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.964868 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.964926 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.964984 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.965057 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.965130 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.965188 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.965252 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:03.965336 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:46:03.965417 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.965507 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.965566 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.965625 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.965686 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.965762 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.965856 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.965917 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.965975 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.966101 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.966159 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.966256 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.966315 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.966400 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.966440 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.966477 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.966516 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.966552 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.966603 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.966662 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.966699 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.966734 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.966770 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.966830 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.966866 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.966925 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.966962 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.966999 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.967036 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.967072 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.967160 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.967196 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.967236 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.967316 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.967353 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.967492 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.967536 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.967579 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.967637 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.967679 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.967739 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.967798 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.967841 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.967884 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.967927 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.968024 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.968067 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.968135 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.968177 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.968289 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.968331 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.968386 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.968448 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.968500 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.968544 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.968654 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.968700 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.968758 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.968811 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.968851 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.968887 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.968926 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.968962 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.968998 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.969039 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.969075 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.969141 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.969178 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.969220 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.969255 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.969306 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.969359 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.969410 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.969484 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.969521 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.969602 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.969670 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.969913 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.969950 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.969985 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.970173 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.970209 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.970244 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.970404 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.970493 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.970544 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.970597 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.970648 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.970714 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.970831 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.970923 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.970973 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.971022 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.971071 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.971275 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.971325 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.971930 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.972059 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.972193 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.972242 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.972311 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.973819 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.974692 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.974926 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.975110 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.975159 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.975443 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.975617 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.975662 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.975707 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.975757 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.976112 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.976186 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.976234 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.976278 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.976323 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.976409 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.976505 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.976551 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.976593 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.976636 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.976682 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.976724 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.976765 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.976821 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.976863 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.976946 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.976988 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.977031 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.977072 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.977114 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.977159 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.977255 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.977307 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.977349 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.977409 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.977461 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.977520 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.977562 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.977605 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.977705 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.977748 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.977853 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.977929 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.977966 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.978002 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.978046 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.978090 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.978134 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.978171 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.978207 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.978291 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.978328 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.978387 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.978453 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.978512 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.978572 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.978666 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.978724 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.978793 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.978965 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.979030 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.979098 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.979174 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.979232 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.979289 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.979346 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.979416 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.979474 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.979543 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.979601 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.979729 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.979787 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.979846 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.983022 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.983096 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.994712 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:03.996048 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:03.996122 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:04.011358 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:04.011516 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:04.019609 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:04.019715 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:04.039244 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:04.039394 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:04.060532 futex(0xf49450, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:04.060664 futex(0xf49450, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:04.063931 futex(0x7fc9c0fbd288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:10.502329 futex(0x7fc9c0fbd288, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:10.503916 futex(0x7fc986b3f288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:10.541025 futex(0x7fc986b3f288, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:10.541228 futex(0x7fc9c0fc1a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:11.581537 futex(0x7fc9c0fc1a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.611117 futex(0x7fc9b8da3688, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.611299 futex(0x7fc9b8da3688, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.627065 futex(0x7fc986f87c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:11.636667 futex(0x7fc986f87c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.639244 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.639337 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.639653 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.639736 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.640153 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.640221 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.640284 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.640347 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.640431 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.640572 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.640633 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.640811 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.640894 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.640977 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.641179 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.641242 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.642215 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.642286 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.642346 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.642432 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.642729 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.642796 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.643002 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.643066 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.643791 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.643911 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.643980 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.644047 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.644113 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.644346 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.644444 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.645372 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.645454 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.645658 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.645725 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.645788 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.645854 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.645920 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.645985 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.646051 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.646125 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.646191 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.646257 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.646397 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.646478 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.646556 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.646624 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.646690 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.646793 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.646889 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.649352 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.649507 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.649598 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.649675 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.649746 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.649830 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.649937 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.650011 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.650243 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.650335 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.650443 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.650512 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.650580 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.650652 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.650720 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.650865 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.650966 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.651034 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.651145 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.651219 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.651285 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.651352 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.651442 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.651523 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.651592 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.651905 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.652003 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.652070 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.652136 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.652476 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.652898 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.652965 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.653224 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.653319 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.653402 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.653482 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.653584 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.653651 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.653780 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.653852 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.653919 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.654078 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.654420 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.654636 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.654704 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.654795 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.654872 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.654946 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.655013 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.656136 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.656525 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.656628 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.656695 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.656755 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.656822 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.656880 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.656940 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.657020 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.657087 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.657716 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.657797 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.657974 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.658887 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.659210 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.659292 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.659381 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.659449 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.659869 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.660155 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.660355 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.660427 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.660496 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 1 02:46:11.660681 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.661154 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.661213 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.661272 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.661786 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.661851 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.661922 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.662095 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.662640 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.662727 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.662792 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.662908 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.662969 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.663037 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.663187 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.663249 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.663395 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.663466 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.663525 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.663586 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.663803 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.663864 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.664413 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.664488 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.664689 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.664755 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.664831 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.664889 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.664953 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.665013 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.665071 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.665138 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.665201 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.665915 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.666172 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.666231 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.666290 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.666357 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.666451 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.666510 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.666568 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.666627 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.666895 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.666963 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.667021 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.667079 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.667136 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.667391 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:11.667478 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.667539 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.667624 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.667835 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.667994 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.668055 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.668288 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.668356 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.668433 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.668498 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.668558 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.668866 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.668927 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.668992 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.669054 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.669113 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.669173 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.669231 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.669302 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.669395 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.669476 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.669632 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.669700 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.669761 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.669824 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.669884 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.669953 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.670015 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.670090 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.670149 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.670213 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.670272 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.670331 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.670532 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.670592 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.670652 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.670716 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.670995 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.671059 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.671118 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.671178 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.671288 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.671450 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.671530 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.671590 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.671650 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.671730 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.671790 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.671871 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.671935 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.671996 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.672056 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.672120 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.672180 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.672275 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.672335 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.672414 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.672475 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.672558 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.672618 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.672702 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.672765 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.672846 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.672906 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.672986 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.673052 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.673155 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.673214 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.673284 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.673346 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.673430 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.673492 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.673552 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.673611 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.673670 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.673736 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.673808 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.673867 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.673926 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.673985 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.674046 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.674112 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.674171 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.674242 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.674407 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.674793 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.674859 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.674959 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.675018 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.675269 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.675330 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.675411 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.683747 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.683821 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.716943 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.717032 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.728157 brk(0x2297000) = 0x2297000 02:46:11.739802 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.739868 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.773268 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.773346 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.794568 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:11.794629 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:11.795148 brk(0x22b9000) = 0x22b9000 02:46:11.813453 futex(0x7fc96c641488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:13.359393 futex(0x7fc96c641488, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:13.364332 futex(0x7fc96c64ec88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.328131 futex(0x7fc96c26fc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.341416 futex(0x7fc96c270e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.416778 futex(0x7fc96c276888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.433483 futex(0x7fc96c277a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.444533 futex(0x7fc96c278c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.458196 futex(0x7fc96c279e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.459832 futex(0x7fc96c27b088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.482751 futex(0x7fc96c64ec88, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.482867 futex(0x7fc96c26fc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.482942 futex(0x7fc96c270e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.483014 futex(0x7fc96c276888, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.483080 futex(0x7fc96c277a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.483145 futex(0x7fc96c278c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.483210 futex(0x7fc96c279e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.483275 futex(0x7fc96c27b088, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.499098 brk(0x22da000) = 0x22da000 02:46:19.507894 futex(0x7fc986f0e688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.518509 futex(0x7fc986f0e688, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.561923 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.562001 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.562037 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.562499 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.562543 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.562636 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.562675 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.562710 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.562746 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.562788 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.562822 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.562856 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.562904 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.563027 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.563074 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.563107 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.563152 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.563186 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.563270 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.563304 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.563353 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.563397 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.563441 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.563476 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.563512 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.563548 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.563583 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.563634 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.563668 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.563706 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.563739 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.563776 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.563822 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.563855 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.565138 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.565176 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.565223 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.565258 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.565293 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.565334 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.565384 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.565420 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.565514 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.565552 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.565654 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.565706 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.565744 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.565777 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.567379 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.568940 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.568983 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.569548 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.569592 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.569632 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.569672 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.569708 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.573281 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.573334 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.573389 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.575012 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.575074 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.575121 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.575218 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.575255 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.575304 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.575342 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.575392 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.575432 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.575492 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.575529 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.575567 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.575621 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.575659 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.575837 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.576921 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.577134 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.577180 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.577219 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.577264 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.577303 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.577338 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.577395 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.577476 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.577526 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.577575 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.577674 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.577710 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.577747 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.577787 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.577878 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.577915 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.577963 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.579118 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.579332 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.579390 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.579443 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.579491 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.579542 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.579589 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.579634 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.579679 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.579749 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.579794 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.579851 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.579889 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.579927 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.579964 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.581008 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.581123 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.581204 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.581423 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.582314 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.582419 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.582550 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.582629 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.582766 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.582853 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.582931 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.583896 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.584000 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.584078 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.584160 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.584233 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.584318 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.584409 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.585628 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.585714 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.585790 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.585863 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.585956 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.586047 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.586136 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.586241 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.586315 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.586752 futex(0xf49450, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.586831 futex(0xf49450, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.588188 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.588275 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.588355 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.588501 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.588617 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.589974 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.590058 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.590140 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.590305 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.591798 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.591889 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.591963 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.592036 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.592136 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.592211 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.592288 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.592387 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.592479 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.594487 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.594571 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.595088 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.595159 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.596653 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.596845 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.597821 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.597912 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.597989 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.598091 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.598176 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.598256 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.598335 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.598457 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.598505 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.598588 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.598630 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.599866 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.599907 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.599941 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.601129 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.602823 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.602866 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.605045 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.605100 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.605214 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.605338 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.605413 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.605450 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.605523 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.605557 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.607236 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.607275 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.607327 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.607386 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.608659 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.608700 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.608765 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.608805 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.608845 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.610086 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.610569 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.610649 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.611635 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.611783 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.611860 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.612789 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.612893 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.612970 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.613064 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.613138 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.614614 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.614712 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.614795 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.615162 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.615238 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.615376 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.615463 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.615541 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.615901 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.616966 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.617047 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.618218 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.618326 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.618425 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.619624 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.619703 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.619743 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.619963 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.620000 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.620038 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.620082 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.620120 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.620166 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.621249 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.622473 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:46:19.622670 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.622720 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.624124 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.624175 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.624244 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.624292 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.625840 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.625886 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.625928 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.626154 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.626193 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.626231 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.626269 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.627898 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.628324 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.630616 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.631530 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.632286 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.632372 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:46:19.632988 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.633074 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.633177 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.633256 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.633425 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.633512 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.633751 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.633948 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.634919 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.635022 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.636246 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.636335 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.636420 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.636458 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.636496 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.637897 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.638059 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.638104 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.639208 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.639265 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.639314 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.639426 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.639477 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.639521 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.639566 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.639614 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.639659 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.640311 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.640502 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.640544 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.640668 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.640707 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.640747 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.640789 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.640935 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.640973 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.641021 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.641058 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.641105 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.641145 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.641181 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.641251 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.641290 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.641336 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.641384 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.641432 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.641473 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.641510 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.641548 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.641602 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.641639 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.641675 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.641715 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.641754 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.641795 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.641843 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.641880 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.641919 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.641956 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.643555 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.643608 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.643650 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.643694 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.643735 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.643776 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.643930 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.643972 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.644088 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.644123 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.644157 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.644194 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.644228 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.644261 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.644297 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.644330 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.644389 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.644459 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.644512 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.644553 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.644599 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.644640 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.644701 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.644743 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.644783 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.644844 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.644885 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.644925 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.644976 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.645017 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.645063 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.645389 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.645436 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.645501 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.645542 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.645583 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.645627 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.645669 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.645744 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.645809 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.645850 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.645903 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.645957 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.646005 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.646104 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.646138 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.646171 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.646208 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.646242 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.646275 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.646313 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.646355 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.646443 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.646505 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.646550 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.646608 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.646649 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.646730 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.646773 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.646813 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.646853 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.646893 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.646940 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.646981 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.647022 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.647075 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.647116 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.647160 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.647201 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.647244 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.647284 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.647334 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.647383 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.647432 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.647473 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.647514 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.647562 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.647618 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.647667 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.647768 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.647810 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.647850 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.647911 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.647957 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.647997 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.648110 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.648144 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.648177 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.648254 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.648288 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.648343 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.648408 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.648459 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.648499 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.648539 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.648620 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.648661 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.648701 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.648741 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.648781 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.648821 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.648870 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.648911 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.648950 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.648990 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.649033 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.649120 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.649162 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.649262 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.649305 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:46:19.649353 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.649411 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:46:19.649456 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.649497 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.649601 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.649837 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.649881 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.649922 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.649970 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.650020 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.650073 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.650122 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.650176 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.650209 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.650242 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.650276 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.650311 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.650345 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.650422 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.650470 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.650510 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.650599 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.650640 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.650703 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.650744 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.650814 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.650857 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.650903 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.650944 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.651036 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.651087 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.651128 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.651168 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.651236 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.651334 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.651391 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.651460 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.651503 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.651546 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.651586 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.651638 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.651679 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.651725 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.651779 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:46:19.651892 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.651944 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.651987 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.652027 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.652080 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.652119 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.652153 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.652185 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.652218 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.652251 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.652284 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.652332 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.652371 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.652458 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.652526 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.652615 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.652683 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.652750 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.652823 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.652890 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.652966 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.653048 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.653117 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.653218 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.653382 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.653479 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.653549 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.653616 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.653684 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.653769 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.653846 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.653951 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.654021 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.654088 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.654163 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.654231 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.654308 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.654389 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.654479 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.654574 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.654645 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:46:19.654728 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.654796 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.654863 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.654929 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.654995 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.655077 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.655209 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.655335 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.655424 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:46:19.655507 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.655576 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.655652 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.655720 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.655788 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.655855 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.655945 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.656013 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.656103 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.656175 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.656243 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.656343 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.656431 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.656481 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.656523 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.656617 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.656882 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.656932 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.656976 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.657016 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.657124 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.657174 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.657234 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.657311 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.657359 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.657413 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.657474 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.657534 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.657580 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.657621 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.657741 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.657784 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.657841 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.657896 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.657937 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.657990 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.658030 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.658070 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.658164 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.658309 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.658375 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.658424 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.658477 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.658524 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.658570 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.658604 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.658637 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.658673 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.658706 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.658746 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.658779 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.658832 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.658874 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.658910 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.658949 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.658989 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.659032 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.659067 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.659100 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.659133 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.659172 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.659206 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.659248 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.659282 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.659315 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.660647 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.661359 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.662322 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.662398 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.662441 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.662478 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.662519 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.662552 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.662586 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.662623 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.662660 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.662694 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:19.662783 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.662817 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.662849 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.662917 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.662951 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.663104 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.663179 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.663215 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.663249 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.663394 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.663432 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.663467 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.663499 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.663532 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.663585 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.663619 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.663651 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.663684 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.663717 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.663992 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.664026 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.664059 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.664182 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.664216 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.664250 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.664292 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.664326 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.664429 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.664475 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.664509 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.664663 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.664705 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.664739 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.664773 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:46:19.664815 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.664849 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.665194 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.665230 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.665351 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.665388 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.665450 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.665515 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.665550 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.665592 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.665626 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.665661 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.665695 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.665745 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.665783 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.665841 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.665874 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.665907 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.665939 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.672349 brk(0x22fb000) = 0x22fb000 02:46:19.681946 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.695811 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.695884 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.699028 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.699084 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.718418 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:19.718479 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:19.730161 brk(0x231c000) = 0x231c000 02:46:19.752634 futex(0x7fc987575488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:20.718657 futex(0x7fc987575488, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:20.724438 futex(0x7fc9e01255e8, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:21.776451 futex(0x7fc9e01255e8, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:21.789012 futex(0x7fc9551b0688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:27.701927 futex(0x7fc9551b0688, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.722990 brk(0x235e000) = 0x235e000 02:46:27.725640 brk(0x237f000) = 0x237f000 02:46:27.727386 brk(0x23a0000) = 0x23a0000 02:46:27.728203 brk(0x23c1000) = 0x23c1000 02:46:27.729025 brk(0x23e2000) = 0x23e2000 02:46:27.729857 brk(0x2403000) = 0x2403000 02:46:27.730757 brk(0x2424000) = 0x2424000 02:46:27.757507 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.757656 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.757736 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.757812 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.757878 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.758050 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.758115 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.758176 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.758237 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.758399 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.758521 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.758582 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.758725 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.758788 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.760016 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.760095 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.760496 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.760623 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.760687 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.760748 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.760876 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.760937 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.761006 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.761073 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.761142 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.761204 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.761282 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.761493 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.761557 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.761618 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.761681 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.761749 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.761818 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.761911 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.761974 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.762057 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.762118 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.762178 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.762249 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.762310 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.762382 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.762450 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.762542 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.762602 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.762668 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.762731 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.762799 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.762859 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.762923 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.763286 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.763512 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.763576 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.763694 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.763765 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.764323 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.764416 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.764478 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.764539 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.765192 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.765263 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.765324 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.765403 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.765469 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.765689 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.765754 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.765814 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.765877 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.765946 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.766007 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.766067 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.766127 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.766188 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.766248 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.766317 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.766401 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.766664 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.766725 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.766815 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.767226 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.767287 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.767848 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.767920 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.767981 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.768041 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.768240 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.768308 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.768379 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.768813 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.768874 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.769103 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.769383 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.769459 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.769519 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.769598 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.769659 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.769731 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.770050 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.770116 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.770176 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.770294 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.770359 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.770442 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.770503 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.770564 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.770624 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.770684 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.770860 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.770921 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.771049 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.771158 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.771218 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.771329 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.771410 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.771470 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.771581 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.771640 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.771711 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.771771 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.771830 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.771890 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.771969 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.772036 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.772156 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.772215 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.772287 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.772347 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.772437 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.772498 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.772560 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.772888 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.772962 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.773023 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.773088 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.773148 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.773208 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.773271 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.773331 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.773548 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.773622 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.773682 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.773804 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.773864 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.774048 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.774119 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.774504 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.774567 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.774884 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.774944 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.775003 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.775061 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.775120 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.775179 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.775252 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.775312 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.775381 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.775445 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.775505 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.775624 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.775684 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.775744 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.775823 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.775882 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.776021 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.776163 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.776229 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.776288 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.776455 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.776519 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.776585 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.776644 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.776705 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.776775 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.776838 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.776900 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.776965 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.777024 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.777083 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.777151 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.777214 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.777274 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.777333 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.777423 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.777483 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.777547 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.777606 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.777665 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.777723 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.777781 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.777840 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.777899 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.777961 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.778020 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.778086 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.778145 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.778203 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.778265 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.778345 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.778432 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.778588 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.778648 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.778708 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.778768 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.778867 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.778928 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.779048 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.779121 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.779180 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.779239 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.779434 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.779498 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.779587 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.779646 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.779712 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.779771 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.779832 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.780043 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.780110 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.780186 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.780247 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.780339 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.780409 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.780625 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.780689 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.780749 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.780811 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.780870 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.781567 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.781707 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.781771 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.782083 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.782927 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.783134 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.783203 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.783270 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.783332 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.783425 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.783490 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.783549 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.783608 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.783755 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:27.783830 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.783894 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.783953 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.784084 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.784143 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.784232 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.784293 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.784351 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.784449 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.784550 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.784620 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.784680 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.784783 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.784854 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.784914 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.784984 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.785044 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.785123 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.785203 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.785263 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.785327 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.785402 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.785487 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.785549 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.785634 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.785696 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.785764 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.785867 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.785940 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.786000 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.786060 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.786132 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.786193 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.786257 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.786317 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.786441 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.786487 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.786531 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.786583 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.786626 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.786669 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.786717 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.786760 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.786802 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.786845 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.786888 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.786931 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.786974 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.787017 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.787062 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.787109 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.787166 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.787214 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.787257 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.787303 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.787347 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.787406 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.787450 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.787516 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.787560 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.787604 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.787744 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.787792 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.787845 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.787902 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.787950 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.787993 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.788036 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.788083 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.788126 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.788170 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.788217 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.788260 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.788303 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.788456 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.788586 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.789053 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.789117 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.789170 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.789245 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.789308 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.789358 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.789418 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.789467 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.789527 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.789586 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.789641 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.789691 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.790295 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.790597 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.790793 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.791140 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.791195 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.791449 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.791568 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.806251 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.806373 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.825048 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.825165 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.827875 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.827975 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.831355 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.831491 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.842049 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.842161 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.872728 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.872854 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.896406 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.896531 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.922111 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:27.922195 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:27.930515 futex(0x7fc955117888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:28.241118 futex(0x7fc955117888, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:28.243352 futex(0x7fc9c19dba88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:28.251109 futex(0x7fc9c19dba88, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:28.255686 futex(0x7fc955129888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:28.260379 futex(0x7fc955129888, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:28.261743 futex(0x7fc9534cb088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:28.295318 futex(0x7fc9534cb088, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:28.295720 futex(0x7fc955133a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:28.619680 futex(0x7fc955133a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:28.620408 futex(0x7fc9534cf488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:35.730925 futex(0x7fc9534cf488, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.733560 futex(0x7fc9534d5a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:35.736927 futex(0x7fc9534d5a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.757032 futex(0x7fc9c1696c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:35.773630 futex(0x7fc9c1696c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.790339 futex(0x7fc96cd6ce88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:35.793736 futex(0x7fc96cd6ce88, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.793930 futex(0x7fc9c1a73688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:35.801698 futex(0x7fc9c1a73688, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.841124 futex(0x7fc9c1b17a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:35.855631 futex(0x7fc9c1b17a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.866609 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.866728 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.867012 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.867081 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.867265 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.867328 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.867429 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.867496 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.867557 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.867672 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.867803 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.867863 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.867922 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.868001 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.868380 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.868445 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.869067 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.869232 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.869294 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.869354 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.869428 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.869488 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.869548 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.869627 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.869687 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.869756 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.869815 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.869879 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.869954 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.870018 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.870076 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.870134 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.870191 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.870359 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.870448 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.870513 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.870589 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.870650 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.870781 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.870841 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.870900 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.870963 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.871022 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.871094 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.871153 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.871212 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.871403 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.871467 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.871527 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.871590 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.871736 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.871812 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.871882 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.871949 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.872011 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.872102 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.872160 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.872230 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.872288 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.872345 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.872415 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.872482 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.872542 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.872610 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.872668 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.872728 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.872786 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.872845 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.872904 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.872972 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.873038 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.873097 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.873156 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.873215 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.873283 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.873342 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.873425 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.873484 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.873547 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.873607 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.873667 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.873732 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.873792 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.873854 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.874118 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.874176 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.874243 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.874324 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.874401 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.874521 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.874580 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.874639 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.874697 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.874758 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.874817 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.874877 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.874941 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.875000 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.875087 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.875636 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.875701 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.875982 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.876044 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.876137 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.876194 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.876252 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.876309 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.876552 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.876641 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.876692 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.876746 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.876802 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.876852 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.876906 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.877227 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.877295 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.878903 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.878958 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.879068 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.879269 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.879316 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.879407 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.879474 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.879523 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.879583 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.879633 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.879689 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.879780 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.879830 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.880148 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.880481 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.880555 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.880604 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.880653 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.880705 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.880753 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.880808 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.880852 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.880897 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:46:35.880962 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.881008 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.881097 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.881142 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.881187 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.881232 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.881282 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.881328 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.881387 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.881434 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.881480 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.881529 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.881574 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.881695 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.882210 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.882274 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.882320 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.882414 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.882470 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.882519 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.882579 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.882697 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:35.882776 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.882827 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.882929 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.883092 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.883141 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.883201 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.883251 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.883493 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.883546 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.883595 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.883645 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.883705 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.883753 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.883808 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.883861 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.883906 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.883960 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.884004 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.884060 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.884105 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.884151 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.884290 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.884337 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.884430 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.884478 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.884523 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.884567 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.884612 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.884656 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.884701 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.884751 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.884795 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.884850 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.884905 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.884964 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.885019 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.885064 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.885122 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.885169 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:46:35.885232 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.885278 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.885329 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.885394 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.885447 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.885516 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.885587 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.885650 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.885701 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.885750 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.885804 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.885854 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.885913 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.885962 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.886034 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.886092 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.886180 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.886229 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.886287 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.886336 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.886421 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.886487 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.886556 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.886626 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.886702 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.886767 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.886832 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.887025 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.887090 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.887302 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.887508 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.887596 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.887662 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.887733 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.887797 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.887863 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.887929 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.888006 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.888077 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.888148 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.888218 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.888291 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.888358 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.888496 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.888569 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.888691 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.888785 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.888853 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.888924 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.888999 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.889068 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.889271 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.889340 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:46:35.889622 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.889896 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.889971 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.890040 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.890225 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.890297 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.890389 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.890471 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.890541 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.890609 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.890683 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.890763 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.890831 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.890942 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.891012 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.891079 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.891164 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.891243 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.891311 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.891403 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.891499 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.891573 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.891650 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.891718 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.891786 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.891860 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.891947 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.892016 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.892090 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.892179 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.892249 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.892423 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.892500 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.892569 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.892637 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.892705 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.892801 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.892873 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.892939 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.893006 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.893151 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:46:35.893308 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.893386 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:46:35.893617 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.893702 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.893771 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.893838 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.893905 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.893973 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.894054 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.894206 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.894276 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.894382 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.894526 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.894595 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.894777 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.894849 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.895165 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.895242 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.895341 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.895409 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.895504 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.895599 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.895668 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.895736 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.895895 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.895974 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.896044 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.896249 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.896320 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.896405 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.896442 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.896476 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.896515 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.896549 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.896595 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.896629 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.896700 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.896747 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.896782 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.896819 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.896852 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.896886 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.896918 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.896952 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.897006 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.897045 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.897079 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.897113 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.897158 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.897192 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.897229 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.897264 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.897300 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.897333 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.897405 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.897441 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.897474 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.897508 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.897541 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.897605 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.897639 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.897672 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.897723 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.897761 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.897795 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.897844 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.897877 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.897923 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.897956 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.897989 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.898028 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.898062 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.898102 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.898136 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.898175 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.898208 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.898299 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.898335 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.898416 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.898487 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.898529 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.898569 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.898619 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.898659 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.898699 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.898741 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.898782 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.898830 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.898871 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.898920 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.898961 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.899007 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.899049 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.899132 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.899173 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.899213 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.899467 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.899515 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.899668 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.899721 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.899761 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.899803 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.899853 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.899943 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.899985 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.900031 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.900072 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.900128 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.900180 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.900213 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.900245 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.900284 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.900317 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.900350 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.900390 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.900428 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.900481 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.900515 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.900564 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.900600 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.900634 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.900666 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.900699 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.900737 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.900773 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.900806 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.900839 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.900891 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:35.900949 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.900982 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.901016 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.902194 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.902234 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.902845 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.902884 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.903389 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.903600 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.903638 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.903672 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.903720 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.903779 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.903813 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.903851 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.903886 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.903923 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.903957 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.904006 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.904042 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.904075 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.904163 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.904196 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.904287 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.904357 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.904411 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.904445 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.904479 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.904515 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.904565 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.904599 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.904632 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.904665 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.904698 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:46:35.904738 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.904771 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.904804 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.904842 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.904875 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.906655 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.921960 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.927739 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.927789 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.935421 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.935481 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.939431 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.939481 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.952254 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.952320 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.957686 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.957745 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.961992 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.962047 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.964185 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:35.964291 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.972723 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.972774 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.986731 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:35.986796 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:35.992892 futex(0x7fc9c1d22c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:37.599974 futex(0x7fc9c1d22c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:37.601669 futex(0x7fc9c19e2688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:43.587014 futex(0x7fc9c19e2688, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.615243 futex(0x7fc9c1a4d488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:43.643920 futex(0x7fc9c1a4d488, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.649994 futex(0x7fc955663088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:43.695469 futex(0x7fc955663088, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.695938 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.695992 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.696038 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.696087 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:46:43.696451 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.696502 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.696551 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.696592 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.696727 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.696772 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.696824 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.696868 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.696916 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.696956 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.696999 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.697106 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.697230 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.697265 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.697301 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.697342 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.697417 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.697527 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.697564 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.697601 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.697656 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.697692 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.697729 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.697772 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.697826 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.697859 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.697893 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.697935 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.697973 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.698024 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.698125 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.698162 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.698216 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.698252 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.698414 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.698500 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.698611 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.698689 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.698802 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.698883 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.698963 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.699035 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.699287 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.699360 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.699463 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.699607 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.699679 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.699904 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.700053 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.700133 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.700238 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.700317 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.700461 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.700682 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.700760 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.700841 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.700924 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.701006 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.701077 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.701198 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.701273 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.701345 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.701472 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.701553 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.701628 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.701705 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.702312 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.702454 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.702540 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.702650 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.702728 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.702808 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.702979 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.703063 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.703139 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.703211 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.703304 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.703407 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.703488 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:46:43.703625 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.703728 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.704274 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.704346 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.704446 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.704537 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.704981 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.705059 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.705130 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.705206 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.705276 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.705442 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.705539 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.705614 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.705769 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.705849 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.705926 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.706011 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.706084 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.706156 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.706426 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.706590 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 1 02:46:43.706909 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.706956 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.707028 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.707062 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.707096 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.707203 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.707238 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.707277 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.707318 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.707357 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.707432 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.707471 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.707960 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.707999 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.708037 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.708083 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.708124 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.708161 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.708349 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.708403 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.708494 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.708533 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.708577 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.708613 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.708866 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.708952 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.708986 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.709023 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.709060 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.709116 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.709153 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.709186 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.709245 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.709280 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.709433 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.709476 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.709751 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.709787 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.709821 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.709932 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.709967 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.710133 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.710228 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.710267 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:46:43.710438 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.710479 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.710517 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.710612 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.710650 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.710694 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.710730 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.710783 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.710817 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.710853 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.710889 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.710922 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.710963 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.710999 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.711035 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.711106 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.711150 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.711185 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.711246 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.711283 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.711318 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.711372 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.711412 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.711453 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.711487 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.711522 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.711556 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.711599 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.711637 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.711834 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.712181 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.712216 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.712252 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.712412 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.712448 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.713098 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.713287 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.713433 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.713472 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.713731 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.713778 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.713903 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.713937 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.713971 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.714004 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.714242 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.714387 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.714648 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.714690 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.714730 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.715407 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.715454 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.715747 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.715794 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.715829 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.715872 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.715907 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.716019 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.716053 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.716242 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.716281 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.716404 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.716442 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.716476 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.716512 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.716545 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.716579 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.716648 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.716682 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.716762 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.716795 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.716833 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.716866 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.716976 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.717011 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.717150 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.717185 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.717242 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.717276 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.717309 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.717342 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.717391 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.717620 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.717655 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.717688 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.717720 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.717753 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.717785 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.717818 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.717894 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.717928 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.717965 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.717998 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.718468 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.718521 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.718556 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.718592 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.718626 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.719018 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.719053 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.719089 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.719150 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.719184 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.719216 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.719249 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.719282 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.719396 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.719434 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.719468 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.719501 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.719534 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.719588 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.719622 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.719655 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.719691 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.719724 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.719757 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.719942 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.719976 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.720178 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.720212 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.720256 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.720290 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.720332 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.720373 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.720410 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.720443 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.720480 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.720514 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.720550 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.720583 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.720619 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.720653 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.720690 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.720724 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.720757 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.720863 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.720898 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.720933 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.720967 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.721018 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.721052 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.721095 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.721129 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.721222 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.721257 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.721373 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.721412 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.721604 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.721638 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.721671 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.721704 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.721742 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.721775 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.721846 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.721880 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.721913 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.721957 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.721994 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.722044 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.722078 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.722120 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.722161 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.722195 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.722232 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.722266 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.722302 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.722334 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.722376 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.722433 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.722466 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.722508 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.722541 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.722574 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.722615 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.722648 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.722714 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.722752 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.722905 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.722940 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.722973 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.723229 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.723266 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.723315 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.723350 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.723396 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.723632 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.724421 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.724460 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.724512 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.724547 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.724580 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.724613 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.724646 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.724699 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.724740 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.724774 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.724811 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.724854 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.724981 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.725017 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.725054 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.725088 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.725174 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.725238 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.725271 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.725305 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.725354 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.725400 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.725435 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.725474 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.725508 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.725561 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.725595 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.725648 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.725691 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.725745 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.725779 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.725814 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.725855 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.725893 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.725935 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.725968 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.726001 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.726046 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.726080 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.726118 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.726158 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.726191 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.726227 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.726261 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.726318 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.726352 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.726552 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.726639 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.726702 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.726768 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.726836 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.726893 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.726971 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.727030 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.727098 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.727161 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.727218 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.727275 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.727340 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.727422 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.727482 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.727552 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.727610 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.727667 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.727726 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.727790 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.727848 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.727905 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.727962 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.728019 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.728084 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.728175 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.728321 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.728427 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.728695 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.728779 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.728861 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.728920 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.729039 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.729098 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.729452 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.729732 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.729795 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.729862 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.729920 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.729986 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.730043 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.730100 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.730157 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.730214 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.730287 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.730344 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.730409 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.730467 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.730524 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.730628 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.730686 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.730749 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.730806 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.730864 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.730921 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.730997 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.731055 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.731254 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.731321 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.731382 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.731453 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.731512 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.731582 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.731639 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.731696 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.731784 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.731842 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.731900 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.731957 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.732090 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.732148 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.732214 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.732283 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.732342 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.732809 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.732872 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.733237 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.733298 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.733369 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.733435 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.733493 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.733832 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.733898 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.734778 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.734966 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.735208 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.735292 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.735425 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.735537 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.736447 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.737308 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.737425 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.737488 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.737547 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.737604 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.737660 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.737768 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.737834 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.737895 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.737953 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.738280 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.738347 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.738443 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.738515 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.738574 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.738633 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.738692 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.738752 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.738809 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.738866 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.738934 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.738994 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.739055 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.739113 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.739177 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.739311 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.739389 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.739468 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.739531 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.739597 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.739657 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.739731 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.739790 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.739849 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.739917 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.739979 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.740039 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.740098 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.742985 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.743056 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.744638 futex(0xf49410, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.746631 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.746704 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.784935 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.785056 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.802019 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.802126 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.811319 brk(0x2445000) = 0x2445000 02:46:43.825465 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.825569 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.827446 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.827547 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.827717 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.850438 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.850549 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.865039 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.865171 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.866483 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.866578 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.874089 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:43.874193 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:43.874757 futex(0x7fc955cf3888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:48.365516 futex(0x7fc955cf3888, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:48.367719 futex(0x7fc96d376888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:48.367960 futex(0x7fc96d376888, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:48.369446 brk(0x2466000) = 0x2466000 02:46:48.372006 futex(0x7fc941200688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:48.379465 futex(0x7fc941200688, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:48.379677 futex(0x7fc9e0156f38, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:51.351503 futex(0x7fc9e0156f38, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.356206 futex(0x7fc96d37c288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:51.573713 futex(0x7fc96d37c288, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.581863 futex(0x7fc92d328c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:51.591637 futex(0x7fc92d328c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.607235 futex(0x7fc955990488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:51.610422 futex(0x7fc955990488, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.611865 futex(0x7fc92d35b688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:51.616953 futex(0x7fc92d35b688, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.627737 futex(0x7fc92d370c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:51.691012 futex(0x7fc92d370c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.694312 brk(0x2487000) = 0x2487000 02:46:51.701662 futex(0x7fc96d09ec88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:51.736831 futex(0x7fc96d09ec88, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.763352 futex(0x7fc96d46a888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:51.766964 futex(0x7fc96d46a888, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.768278 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.768344 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.768597 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.768646 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.768698 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.768744 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.768789 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.768836 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.768872 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.769067 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.769103 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.769141 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.769176 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.769214 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.769248 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.769483 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.769522 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.770323 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.770359 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.770778 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.770822 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.770893 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.770935 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.770979 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.771024 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.771065 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.771110 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.771151 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.771192 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.771262 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.771312 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.771354 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.771410 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.771453 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.771501 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.771555 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.771625 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.771675 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.771715 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.771755 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.771801 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.771854 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.771888 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.771921 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.771953 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.771987 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.772056 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.772090 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.772124 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.772208 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.772250 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.772285 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.772320 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.772353 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.772413 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.772449 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.772565 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.772600 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.772634 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.772668 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.772705 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.772739 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.772924 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.772958 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.772992 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.774723 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.774773 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.774817 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.774850 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.774890 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.774924 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.774958 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.774990 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.775023 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.775056 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.775301 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.775336 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.775393 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.775432 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.775466 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.775504 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.775582 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.775692 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.775726 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.775761 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.775794 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.775860 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.775894 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.775927 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.775995 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.776028 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.776062 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.776178 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.776341 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.776403 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.776628 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.776859 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.776894 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.776928 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.776961 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.776999 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.777325 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.777359 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.777404 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.777437 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.777470 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.777558 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.777592 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.777625 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.777670 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.777708 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.777741 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.777778 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.777814 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.777847 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.777880 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.777913 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.777946 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.777982 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.778016 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.778048 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.778099 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.778253 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.778287 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.778320 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.778353 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.778399 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.778433 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.778466 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.778523 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.778557 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.778590 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.778622 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.778655 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.778687 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.778720 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.778759 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.778793 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.778826 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.778858 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.778890 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.778923 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.778955 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.779044 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.779078 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.779116 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.779149 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.779182 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.779218 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.779252 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.779300 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.779338 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.779393 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.779431 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.779467 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.779501 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.779545 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.779590 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.779632 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.779674 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.779744 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.779786 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.779838 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.779894 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.779938 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.779978 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.780019 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.780064 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.780105 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.780177 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.780219 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.780314 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.780389 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.780434 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.780475 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.780516 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.780608 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.780658 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.780702 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.780743 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.780786 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.780826 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.780865 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.780907 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.780946 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.780980 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.781019 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.781053 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.781086 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.781134 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.781167 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.781200 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.781233 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.781312 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.781347 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.781516 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.781551 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.781703 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.781738 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.782047 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.782085 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.782119 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.782151 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.782185 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.782222 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.782326 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.782361 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.782440 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.782591 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.782626 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.782659 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.782721 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.782755 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.782788 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.782853 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.782906 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.782940 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.782973 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.783042 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.783086 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.783120 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.783152 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.783185 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.783219 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.783269 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.783302 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.783357 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.783401 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.783434 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.783467 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.783504 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.783537 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.783570 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.783602 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.783635 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.783677 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.783921 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.784019 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.784054 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.784087 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.784177 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.784215 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.784248 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.784281 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.784318 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.784351 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.784405 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.784438 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.784471 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.784505 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.784537 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.784571 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:46:51.784623 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.784658 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.784778 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.784812 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.784846 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.784878 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.784911 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.784945 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.784994 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.785028 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.785061 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.785130 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.785165 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.785214 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.785266 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.785299 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.785338 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.785378 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.785415 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.785448 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.785483 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.785529 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.785570 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.785610 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.785650 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.785708 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.785756 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.785797 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.785849 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.785890 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.785930 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.785970 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.786037 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.786079 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.786184 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.786228 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.786269 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.786316 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.786412 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.786461 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.786536 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.786583 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.786713 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.786758 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.786827 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.786868 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.786910 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.786955 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.787094 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.787130 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.787225 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.787320 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.787357 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.787407 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.787441 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.787486 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.787519 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.787553 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.787600 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.787639 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.787698 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.787827 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.787862 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.787903 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.788046 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.788080 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.788116 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.788194 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.788228 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.788296 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.788330 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.788387 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.788487 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.788521 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.788554 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.788595 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.788628 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.788720 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.788802 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.788884 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.788922 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.788954 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.788988 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.789025 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.789058 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.789094 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.789166 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.789199 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.789240 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.789444 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.789482 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.789531 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:51.790835 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.790873 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.791281 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.791317 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.791352 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:46:51.791400 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.791434 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.791527 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.791561 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.791817 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.791853 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.792176 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.792259 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.792294 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.792370 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.793260 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.793296 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.793329 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.793370 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.793409 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.793442 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.793475 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.793507 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.793540 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.793572 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.793610 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.793643 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.793791 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.793833 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.793867 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.794063 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.794106 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.794139 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.794210 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.794243 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.794276 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.794308 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.794356 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.794409 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.794443 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.794533 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.794568 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.794601 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.794634 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.794671 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.794705 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.794871 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.794906 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.794947 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.795052 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.795281 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.795416 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.795453 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.795487 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.795541 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.795575 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.795608 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.795771 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.795806 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.795839 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.795872 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.795934 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.795991 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.796025 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.796076 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.796114 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.796169 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.796202 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.796235 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.796269 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.796302 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.796336 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.796399 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.796439 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.796473 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.796507 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.796540 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.796588 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.796621 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.796654 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.796686 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.796719 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.796752 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.796789 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.796822 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.796855 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.796887 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.796921 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.796958 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.796993 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:46:51.797031 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.797065 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.797097 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.797130 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.797163 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.797331 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.797405 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.797442 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.797476 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.797560 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.797651 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.797685 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.797718 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.797751 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.797783 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.797815 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.797848 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.797939 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.797975 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.798021 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.798066 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.798099 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.798132 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.798297 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.798352 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.798401 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.798453 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.798487 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.798569 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.798604 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.798640 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.798673 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.798705 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.798739 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.798773 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.798806 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.798839 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.798931 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.798965 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.798998 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.799038 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.799074 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.799107 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.799145 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.799178 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.799211 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.799292 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.799327 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.799407 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.799444 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.799477 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.799510 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.799542 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.799575 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.799623 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.799661 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.799694 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.799726 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.799758 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.799791 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.799823 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.799856 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.799889 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.799974 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.800013 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.800047 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.800088 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.800121 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.800154 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.800187 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.800328 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.800428 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.800477 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.800520 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.800555 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.800725 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.800760 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.801016 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.801214 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.801248 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.801288 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.801323 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:46:51.801553 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.801591 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.801686 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.801724 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.801773 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.801807 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.802193 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.802227 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.802260 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.802297 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.802330 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.802385 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.802422 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.802455 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.802493 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.802526 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.802609 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.802643 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.802676 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.802708 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.802740 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.802777 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.802810 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.802844 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.802883 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.802918 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.802955 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.802989 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.803044 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.803078 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.803110 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.803201 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.803235 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.803268 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.803301 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.803340 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.803379 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.803444 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.803477 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.803515 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.803557 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.803643 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.803677 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.850849 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.850916 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.860980 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.861033 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.861560 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.861604 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.861641 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.870196 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.870246 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.870841 brk(0x24a8000) = 0x24a8000 02:46:51.885241 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.885297 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.891306 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:51.891439 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.891479 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.894649 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.894696 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.895715 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.895755 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.907309 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.907471 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.925087 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:51.925190 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:51.925534 futex(0x7fc941937688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:59.762827 futex(0x7fc941937688, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.768552 brk(0x24c9000) = 0x24c9000 02:46:59.790284 brk(0x24ea000) = 0x24ea000 02:46:59.795547 futex(0x7fc96d3e9488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:59.839642 futex(0x7fc96d3e9488, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.843124 futex(0x7fc96d3f1288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:59.869667 futex(0x7fc96d3f3688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:59.883273 futex(0x7fc96d3f3688, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.883394 futex(0x7fc96d3f1288, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.895741 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.895843 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.895910 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.895985 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.896045 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.896118 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.896185 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.896242 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.896299 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.896356 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.896461 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.896522 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.896590 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.896650 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.896709 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.896788 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.896847 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.897078 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.897155 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.897302 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.897384 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.897468 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.897529 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.897600 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.897684 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.897744 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.897904 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.897965 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.898041 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.898099 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.898159 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.898221 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.898281 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.898339 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.898419 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.898509 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.898567 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.898626 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.898704 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.898764 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.898826 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.898889 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.898949 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.899011 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.899069 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.899130 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.899195 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.899270 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.899327 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.899407 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.899596 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.899665 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.899764 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.899823 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.899890 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.899950 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.900032 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.900091 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.900152 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.900211 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.900285 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.900346 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.900452 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.900517 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.900588 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.900667 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.900727 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.900789 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.900849 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.900916 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.900983 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.901045 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.901186 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.901246 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.901326 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.901403 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.901479 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.901542 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.901644 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.901708 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.901873 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.901941 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.902000 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.902061 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.902142 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.902203 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.902281 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.902340 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.902468 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.902529 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.902597 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.902659 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.902720 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.902780 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.902868 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.902928 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.902991 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.903050 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.903117 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.903184 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.903243 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.903318 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.903386 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.903451 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.903524 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.903585 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.903663 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.903723 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.903783 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.903843 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.903909 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.903970 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.904034 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.904093 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.904153 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.904230 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.904289 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.904348 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.904425 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.904494 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.904555 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.904618 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.904683 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.904741 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.904813 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.904905 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.904965 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.905039 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.905101 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.905181 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.905259 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.905338 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.905420 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.905486 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.905570 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.905642 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.905702 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.905773 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.905834 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.905898 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.905997 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.906057 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.906187 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.906249 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.906312 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.906403 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.906450 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.906493 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.906535 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.906583 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.906622 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.906668 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.906706 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.907684 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.907733 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.907772 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.907812 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.907852 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.907891 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.907929 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.907969 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.908096 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.908134 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.908172 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.908209 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.908247 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.908285 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.908325 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.908377 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.908418 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.908467 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.908505 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.908704 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.908742 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.908985 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.909023 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.909061 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.909105 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.909143 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.909289 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.909328 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.909384 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.909424 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:46:59.909489 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.909531 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.909571 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.909638 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.909677 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.909749 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.909792 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.909924 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.909982 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.910021 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.910058 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.910097 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.910134 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.910172 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.910211 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.910276 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.910316 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.910378 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.910442 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.910480 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.910518 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.910557 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.910664 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.910703 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.910742 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.910799 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.910839 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.910886 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.910927 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.910993 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.911032 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.911074 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.911113 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.911151 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.911194 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.911234 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.911272 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.911324 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.911647 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.911688 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.911729 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.911767 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.911872 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.911911 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.912223 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.912262 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.912300 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.912602 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.912643 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.912696 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.913068 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.913113 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.913158 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.914132 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.914190 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.914237 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.914304 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.914354 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.914411 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.914503 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.914742 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.914811 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.915082 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.915128 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.915282 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.915320 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.915361 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.915408 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.915447 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.915747 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.915785 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.915855 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.915895 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.916057 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.916098 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.916402 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.916444 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.916615 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.916655 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.916704 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.916742 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.916781 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.917101 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.917149 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.917211 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.917249 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.917420 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.917460 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.917505 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.917543 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.917581 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.917619 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.917665 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.917703 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.917749 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.917788 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.917826 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.917865 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.917906 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.917944 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.917988 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.918026 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.918063 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.918102 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.918157 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.918194 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.918237 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.918274 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.918312 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.918349 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.918402 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.918458 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.918504 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.918554 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.918593 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.918662 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.918702 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.918740 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.918784 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.918823 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.919422 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.919476 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.919518 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.919558 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.919624 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.919664 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.919705 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.919752 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.919790 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.919828 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.919876 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.919915 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.919953 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.920075 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.920114 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.920153 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.920259 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.920300 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.920342 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.920431 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.920494 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.921323 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.921431 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.921682 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.921750 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.921813 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.921885 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.922060 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.922125 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.922194 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.922259 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.922330 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.923451 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.923536 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.923685 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.923748 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.924173 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.924239 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.924521 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.924598 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.924677 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.925546 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.925620 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.926543 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.926617 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.926917 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.926981 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.927314 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.927396 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.927916 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.927984 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.928055 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.929359 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.929481 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.929682 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.929748 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.930777 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.930855 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.930916 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.930979 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.931038 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.931100 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.931603 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.931668 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.931737 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.931799 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.931876 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.931937 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.931997 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.932057 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.932122 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.932182 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.932269 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.932334 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.932419 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.932604 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.932666 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.932733 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.932793 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.941297 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.941422 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.945147 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.945239 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.945635 futex(0xf49410, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.963209 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.963325 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.973890 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:46:59.973994 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:46:59.997453 futex(0xf49410, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:00.009314 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:00.009463 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:00.012331 brk(0x250b000) = 0x250b000 02:47:00.048503 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:00.050984 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:00.051085 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:00.064398 brk(0x252c000) = 0x252c000 02:47:00.067409 futex(0x7fc96da88688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:07.882851 futex(0x7fc96da88688, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:07.887553 futex(0x7fc91fb2f688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:07.921192 futex(0x7fc91fb2f688, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:07.940616 futex(0x7fc941991688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:07.959145 futex(0x7fc941991688, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:07.963861 brk(0x254d000) = 0x254d000 02:47:07.968835 futex(0x7fc96db2a488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:07.996240 futex(0x7fc96db2a488, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.011508 futex(0x7fc941d7ee88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:08.013025 futex(0x7fc941d7ee88, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.033743 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.033860 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.033990 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.034055 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.034179 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.034241 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.034302 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.034358 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.034466 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.034525 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.034583 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.034641 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.034700 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.034758 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.034816 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.034891 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.034951 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.035012 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.035070 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.035133 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.035191 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.035328 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.035404 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.035466 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.035524 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.035583 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.035685 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.035743 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.035824 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.035883 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.035962 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.036020 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.036083 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.036141 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.036202 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.036259 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.036317 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.036387 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.036451 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.036556 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.036802 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.036861 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.036919 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.036977 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.037035 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.037095 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.037162 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.037343 futex(0x7fca47d33c40, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.037446 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.037539 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.037607 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.037673 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.037804 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.037870 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.037937 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.037997 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.038058 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.038118 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.038179 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.038245 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.038305 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.038401 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.038470 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.038531 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.038659 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.038718 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.038777 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.038839 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.038903 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.038966 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.039028 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.039095 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.039154 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.039228 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.039286 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.039349 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.039454 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.039541 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.039605 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.039666 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.039887 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.039962 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.040022 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.040244 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.040305 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.040382 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.040473 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.040534 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.040594 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.040654 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.040791 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.040867 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.040943 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.041022 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.041096 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.041207 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.041266 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.041327 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.041413 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.041475 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.041549 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.041610 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.041678 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.041737 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.041797 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.041857 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.041921 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.041982 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.042082 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.042150 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.042209 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.042270 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.042331 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.042408 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.042471 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.042532 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.042635 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.042695 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.042756 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.042817 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.042881 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.042946 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.043007 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.043073 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.043131 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.043242 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.043301 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.043360 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.043541 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.043614 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.043673 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.043733 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.043793 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.043857 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.043917 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.043979 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.044042 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.044105 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.044164 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.044223 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.044283 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.044345 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.044412 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.044473 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.044590 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.044709 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.044769 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.044829 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.044890 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.044954 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.045013 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.045078 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.045137 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.045201 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.045260 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.045498 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.045560 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.045620 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.045679 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.046037 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.046498 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.046573 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.046739 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.046809 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.046991 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.047061 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.047129 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.047297 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.047404 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.047458 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.047585 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.047640 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.047690 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.047861 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.047930 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.047976 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.048021 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.048067 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.048113 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.048158 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.048230 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.048289 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.048335 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.048700 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.048748 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.048794 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:08.048879 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.048980 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.049032 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.049085 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.049147 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.049232 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.049279 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.049325 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.049484 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.049566 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.049617 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.049789 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.049943 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.050012 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.050063 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.050184 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.050269 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.050320 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.050435 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.050568 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.050618 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.050671 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.050721 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.050891 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.050937 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.050981 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.051026 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.051076 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.051122 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.051182 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.051228 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.051272 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.051343 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.051452 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.051496 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.051542 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.051594 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.051639 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.051685 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.051760 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.051851 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.051897 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.051942 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.051987 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.052103 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.052149 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.052193 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.052262 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.052313 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.052389 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 1 02:47:08.052456 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.052503 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.052618 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.052665 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.052768 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.052814 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.052869 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.052921 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.052974 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:08.053031 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.053077 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.053151 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.053197 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.053247 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.053295 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.053342 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.053400 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.053446 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.053492 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.053640 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.053686 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.053740 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.053807 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.053852 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.053896 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.053941 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.053991 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.054036 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.054180 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.054226 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.054314 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.054381 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.054428 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.054473 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.054526 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.054722 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.054906 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.054965 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.055011 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.055056 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.055102 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.055181 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.055335 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.055564 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.055884 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.056051 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.056100 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.056145 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:47:08.056415 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.056543 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.056601 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.056645 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.056682 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.056726 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.056763 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.056799 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.056859 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.056895 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.056931 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.056967 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.057011 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.057048 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.057094 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.057134 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.057182 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.057218 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.057279 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.057316 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.057393 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.057482 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.057556 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.057596 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.057633 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.057670 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.057884 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.057921 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.057958 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.057995 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.058037 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.058074 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.058417 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.058458 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.058505 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.058584 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.058795 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.058840 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.058877 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.058917 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.058994 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.059032 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.059073 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.059110 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.059148 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.059185 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.059297 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.059333 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.059394 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.059438 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.059477 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.059574 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.059613 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.059677 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.059714 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.059750 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.059787 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.059823 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.059864 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.059900 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.059939 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.059976 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.060015 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.060058 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.060095 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.060133 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.060169 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.060244 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.060280 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.060316 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.060359 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.060445 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.060504 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.060565 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.060623 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.060799 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.060858 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.060916 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.060974 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.061032 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.061091 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.061151 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.061208 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.061268 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.061327 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.061402 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.061461 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.061530 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.061646 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.061705 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.061764 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.061823 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.061883 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.061941 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.062016 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.062074 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.062133 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.062193 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.062252 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.062311 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.062380 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.062463 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.062522 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.062590 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.062648 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.062707 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.062766 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.062825 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.062884 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.062954 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.063014 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.063080 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.063138 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.063201 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.063265 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.063323 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.063396 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.063459 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.063517 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.063576 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.063804 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.063863 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.063927 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.063995 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.064053 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.064112 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.064171 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.064232 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.064360 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.064434 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.064493 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.064586 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.064645 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.064708 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.064766 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.064825 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.064884 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.064943 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.065012 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.065071 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.065176 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.065245 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.065304 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.065398 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.065460 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.065523 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.065593 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.065658 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.065719 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.065795 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.065856 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.065915 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.065976 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.066035 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.066093 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.066154 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.066214 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.066286 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.066345 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.066408 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.066447 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.066499 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.066536 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.066576 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.066614 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.066651 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.066756 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.066793 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.066835 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.066900 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.066937 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.066973 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.067025 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.067062 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.067112 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.067148 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.067252 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.067289 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.067326 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.067367 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.067447 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.067484 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.067522 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.067576 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.067612 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.067653 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.067689 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.067725 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.067770 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.067866 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.067920 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.067956 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.067992 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.068100 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.068232 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.068269 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.068305 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.068343 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.068399 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.068438 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.068485 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.068523 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.068560 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.068603 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.068661 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.068706 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.068744 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.068780 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.068817 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.068853 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.068950 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.068988 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.069123 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.069164 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.069200 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.069236 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.069309 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.069345 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.069389 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.084596 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.084648 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.095593 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.108617 futex(0xf49410, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.108675 futex(0xf49410, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.109943 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.110004 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.116033 brk(0x256e000) = 0x256e000 02:47:08.145246 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.145702 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.145752 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.145798 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.145842 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.175673 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:08.175740 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:08.176897 brk(0x2590000) = 0x2590000 02:47:08.181201 futex(0x7fc96de01088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:09.137215 futex(0x7fc96de01088, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:09.141096 futex(0x7fc96de08e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:14.386185 futex(0x7fc96de08e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:14.388881 futex(0x7fca0003f998, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:15.756986 futex(0x7fca0003f998, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:15.767325 futex(0x7fc941cbd888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:15.972519 futex(0x7fc941cbd888, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:15.984289 futex(0x7fc941cecc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:16.056739 futex(0x7fc941cecc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.066093 brk(0x25b1000) = 0x25b1000 02:47:16.070617 futex(0x7fc96db0ae88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:16.087876 futex(0x7fc96db0ae88, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.133816 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.133964 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.134038 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.134106 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.134168 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.134229 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.134291 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.134382 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.134450 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.134520 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.134610 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.134688 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.134750 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.135028 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.135093 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.135159 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.135218 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.135279 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.135337 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.135412 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.135481 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.135544 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.135604 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.135664 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.135723 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.135782 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.135856 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.135916 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.135979 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.136132 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.136194 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.136252 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.136318 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.136414 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.136491 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.136558 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.136621 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.136691 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.136753 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.136816 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.137178 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.137239 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.137302 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.137443 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.137532 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.137605 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.137668 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.137791 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.137857 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.138062 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.138125 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.138196 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.138258 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.138608 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.138675 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.138738 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.138911 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.138980 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.139042 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.139122 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.139183 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.139244 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.139384 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.139474 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.139562 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.139625 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.139688 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.139750 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.139820 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.139886 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.139952 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.140014 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.140076 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.140185 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.140249 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.140539 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.140607 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.140679 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.140859 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.140926 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.141022 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.141088 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.141148 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.141336 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.141413 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.141546 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.141609 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.141675 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.141734 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.141796 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.141864 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.141926 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.141986 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.142102 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.142165 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.142239 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.142302 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.142385 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.142463 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.142537 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.142603 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.142667 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.142731 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.142796 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.142874 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.142946 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.143099 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.143162 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.143226 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.143591 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.143661 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.143724 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.143793 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.143854 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.143914 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.144020 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.144080 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.144239 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.144299 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.144544 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.144611 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.144857 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.144921 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.144980 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.145042 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.145114 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.145173 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.145233 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.145313 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.145387 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.145464 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.145535 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.145597 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.145659 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.145824 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.145886 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.145949 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.146189 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.146267 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.146328 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.146415 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.146478 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.146617 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:16.147452 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.147518 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.147604 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.147665 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.147852 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.147914 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.148032 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.148091 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.148340 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.148431 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.148503 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.148573 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.148638 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.148710 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.148776 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.148840 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.148908 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.148973 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.149035 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.149097 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.149159 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.149222 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.149331 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.149419 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.149484 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.149562 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.149624 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.149721 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.149790 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.149849 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.150412 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.150486 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.150625 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.150686 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.150747 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.150862 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.150923 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.151042 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.151103 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.151185 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.151244 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.151483 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.151552 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.151613 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.151746 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.151809 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.151902 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.151964 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.152154 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.152216 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.152378 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.152446 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.152598 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.152664 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.153039 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.153099 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.153167 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.153227 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.153292 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.153428 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.153491 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.153551 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.153610 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.153678 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.153738 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.153798 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.154221 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.154290 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.154349 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.154429 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.154490 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.154565 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.154644 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.154721 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.154783 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.154843 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.155300 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.155369 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.155446 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.155506 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.155602 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.155661 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.156319 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.156410 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.156472 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.156532 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.156596 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.156656 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.156718 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.156779 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.156838 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.157203 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.157264 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.157425 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.157489 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.157552 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:47:16.157719 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.157782 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.157862 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.157931 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.157992 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.158062 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.158123 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.158185 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.158551 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.158619 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.158682 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.158793 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.158857 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.158949 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.159011 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.159074 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.159144 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.159207 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.159327 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.159409 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.159513 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.159576 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.159638 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.159712 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.159777 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.159928 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.159988 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.160073 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.160133 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.160218 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.160279 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.160390 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.160456 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.160516 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.160579 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.160639 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.160701 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.160762 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.160822 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.160945 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.161006 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.161067 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.161129 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.161191 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.161260 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.161323 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.161417 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.161524 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.161593 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.161656 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.161723 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.161793 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.161861 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:16.161963 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.162028 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.162091 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.162299 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.162378 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.162444 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.162507 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.162570 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.162689 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.162751 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.162814 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.162883 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.162947 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.163007 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.163066 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.163152 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.163212 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.163279 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.163341 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.163419 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.163479 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.163538 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.163600 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.163665 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.163727 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.163809 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.163868 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.163981 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.164042 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.164110 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.164172 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.164231 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.164765 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.164834 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.164895 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.164959 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.165026 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.165087 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.165147 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.165215 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.165305 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.165427 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.165495 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.165851 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.165962 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.166022 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.166085 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.166152 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.166211 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.166270 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.166340 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.166418 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.167446 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.167497 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.167539 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.167598 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.167637 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.167684 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.167722 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.167876 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.167916 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.167955 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.167992 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.168215 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.168254 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.168291 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.168329 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.168411 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.168452 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.168492 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.168546 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.168586 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.168625 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.168663 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.168710 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.168748 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.168789 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.168828 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.168950 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.168990 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.169115 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.169153 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.169197 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.169235 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.169287 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.169332 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.169496 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.169538 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.169666 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.169705 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.169757 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.169795 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.169837 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.169882 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.169920 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.169961 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.170004 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.170041 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.170137 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.170175 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.170212 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.170284 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.170321 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.170424 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.170484 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.170604 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.170653 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.170698 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.170834 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.170879 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.171014 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.171095 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.171140 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.171222 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.171267 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.171359 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.171426 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.171483 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.171529 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.171589 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.171635 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.171692 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.171752 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.171803 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.171851 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.171890 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.171944 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.171999 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.172038 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.172090 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.172130 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.172180 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.183069 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.183125 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.197032 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.209742 brk(0x25d2000) = 0x25d2000 02:47:16.224059 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.224135 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.243574 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.243659 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.262081 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:16.262169 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.262673 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.271989 brk(0x25f3000) = 0x25f3000 02:47:16.274417 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:16.278075 brk(0x2614000) = 0x2614000 02:47:16.279632 futex(0x7fc94232fa88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:22.487064 futex(0x7fc94232fa88, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:22.495450 futex(0x7fc96de19c88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:22.778739 futex(0x7fc96de19c88, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:22.778938 futex(0x7fc96de1ae88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:24.041014 futex(0x7fc96de1ae88, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.047901 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.047988 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.048049 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.048115 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.048173 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.048231 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.048288 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.048347 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.048430 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.048512 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.048568 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.048625 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.048723 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.048779 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.048904 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.049024 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.049080 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.049139 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.049196 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.049251 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.049306 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.049361 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.049596 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.049715 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.049771 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.049930 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.049994 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.050050 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.050230 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.050327 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.050400 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.050458 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.050528 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.050589 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.050645 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.050708 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.050765 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.050820 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.050875 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.050935 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.050993 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.051050 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.051105 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.051160 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.051217 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.051274 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.051339 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.051416 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.051478 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.051536 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.051602 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.051840 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.051911 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.051969 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.052038 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.052106 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.052166 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.052223 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.052281 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.052338 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.052443 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.052502 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.052559 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.052624 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.052683 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.052936 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.052994 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.053057 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.053114 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.053171 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.053489 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.053551 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.053608 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.053666 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.053872 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.053930 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.053993 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.054050 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.054113 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.054172 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.054231 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.054288 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.054345 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.054407 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.054466 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.054527 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.054585 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.054645 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.054730 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.054792 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.054850 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.054910 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.054968 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.055090 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.055149 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.055263 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.055323 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.055426 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.055490 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.055575 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.055633 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.055691 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.055748 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.055847 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.055905 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.055962 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.056025 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.056103 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.056161 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.056231 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.056288 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.056347 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.056425 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:47:24.056515 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.056551 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.056625 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.056662 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.056747 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.056783 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.056818 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.056855 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.056904 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.056946 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.057181 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.057224 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.057264 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.057305 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.057342 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.057407 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.057446 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.057493 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.057529 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.057578 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.057616 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.057662 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.057698 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.057734 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.057778 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.057825 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.057861 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.057912 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.057953 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.057996 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.058042 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.058079 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.058116 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.058155 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.058193 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.058229 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.058265 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.058317 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.058514 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.058563 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.058608 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.058777 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.058827 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.058907 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.059062 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.059107 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.059161 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.059206 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.059251 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.059295 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.059340 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.059402 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.059478 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.059523 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.059567 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.059612 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.059656 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.059979 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.060204 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.060253 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.060310 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.060355 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.060428 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.060473 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.060686 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.060731 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.060779 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.060824 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.060888 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.060933 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.060982 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.061028 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.061100 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.061146 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:47:24.061209 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.061254 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.061298 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.061343 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.061398 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.061443 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.061487 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.061532 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.061577 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.061822 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.061875 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.062329 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.062390 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.062437 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.062578 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.062641 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.062685 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.062730 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.062781 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.062832 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.062897 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.062943 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.063002 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.063052 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.063096 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.063140 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.063270 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.063315 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.063386 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.063435 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.063681 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.063729 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.063773 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.063817 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.063953 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.063999 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.064293 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.064394 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.064441 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.064485 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.064529 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.064574 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.064648 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.064693 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.064738 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.064787 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.064831 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.064876 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.065107 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.065152 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.065198 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.065241 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.065286 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.065331 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.065387 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.065434 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.065581 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.065631 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.065675 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.065719 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.065764 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.065809 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.065868 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.065913 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.065958 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.066003 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.066054 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.066099 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.066143 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.066200 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.066245 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.066289 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.066333 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.066404 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.066524 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.066608 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.066717 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.066790 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.066858 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.066925 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.067015 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 1 02:47:24.067107 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:47:24.067188 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.067256 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.067323 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.067410 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.067481 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.067560 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.067647 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.067714 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.067789 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.067856 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.068104 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.068171 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.068237 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.068309 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.068409 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:47:24.068485 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.068545 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.068607 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.068666 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.068728 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.068786 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.068843 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.068910 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.068968 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.069026 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.069083 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.069141 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.069200 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.069361 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.069431 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.069497 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.069555 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.069612 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.069670 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.069728 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.069864 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.069923 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.070116 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.070176 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.070234 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.070290 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.070356 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.070439 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.070596 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.070729 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.070790 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.071004 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.071066 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.071123 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.071179 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.071236 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.071299 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.071356 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.071435 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.071494 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.071580 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.071638 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.071696 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.071759 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.071818 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.071894 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.071966 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.072029 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.072086 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.072145 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.072203 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.072267 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.072332 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.072408 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.072489 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.072548 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.072607 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.072666 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.072729 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:24.074074 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.074182 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.074242 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.074310 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.074380 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.074452 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.074510 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.074576 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.074637 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.074697 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.074849 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.074915 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.074973 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.075037 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.075095 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.075158 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.075229 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.075288 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.075346 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.075411 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.075470 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.075530 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.075588 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.075646 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.075711 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.075769 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.075827 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.075885 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.075949 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.076008 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.076091 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.076150 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.076209 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.076270 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.076328 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.076404 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.076462 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.076521 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.076581 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.076638 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.076751 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.076984 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.077151 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.077210 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.077282 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.077340 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.077429 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.077496 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.077567 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.077633 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.077700 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.077969 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 1 02:47:24.078116 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.078457 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.078528 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.078838 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.078907 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.078982 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.079048 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.079115 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.079181 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.079265 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.079337 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.080109 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.080220 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.080647 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.080696 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.080742 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.080829 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.080875 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.081053 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.081099 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.081144 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.081225 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.081517 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.081655 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.081741 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.081787 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.081996 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.082117 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.082183 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.082249 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.082568 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.082616 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.082661 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.083038 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.083084 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.083128 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.083173 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.083225 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.083270 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.083320 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.083378 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.083428 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.083487 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.083532 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.084413 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.084467 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.084512 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.151825 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.151921 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.189505 brk(0x2635000) = 0x2635000 02:47:24.190388 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.190453 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.218725 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:24.218811 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:24.256336 brk(0x2656000) = 0x2656000 02:47:24.261964 futex(0x7fc908594a88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:30.844291 futex(0x7fc908594a88, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:30.847260 futex(0x7fc908599288, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:30.850200 futex(0x7fc908599288, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:30.854455 futex(0x7fc96e52f088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:32.294594 futex(0x7fc96e52f088, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.320768 brk(0x2677000) = 0x2677000 02:47:32.328601 futex(0x7fc904d83888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:32.344666 futex(0x7fc904d83888, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.363623 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.365016 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.365116 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.365524 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:32.366528 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:32.367647 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.367734 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.369056 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.369490 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.369563 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.369653 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.369713 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.369773 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.369951 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.370023 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.370399 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.370468 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.370642 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.370706 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.370777 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.371078 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.371509 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.371573 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.371725 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.371802 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.371863 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.371925 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.372024 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.372263 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.372322 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.372398 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.372473 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.372534 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.372595 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.372664 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.372880 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.373521 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.373678 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.373749 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.373837 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.373905 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.373964 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.374051 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.374110 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.374171 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.374231 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.374290 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.374348 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.374419 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.374479 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.374619 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.374694 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.374754 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.374817 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.374874 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.374935 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.374995 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.375053 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.375112 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.375183 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.375242 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.375303 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.375386 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.375462 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.375525 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.375586 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.375646 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.375773 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.375833 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.375894 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.375954 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.376064 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.376124 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.376185 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.376251 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.376311 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.376374 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.376522 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.376585 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.376645 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.376709 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.376771 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.376852 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.376911 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.376973 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.377166 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.377226 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.377283 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.377341 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.377408 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.377465 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.377523 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.377631 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.377689 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.377776 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.377835 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.377929 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.377999 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.378063 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.378123 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.378181 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.378243 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.378382 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.378446 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.378558 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.378614 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.378680 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.378739 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.378946 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.379161 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.379237 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.379297 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.379355 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.379426 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.379488 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.379555 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.379615 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.379702 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.379760 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.379820 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.379879 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.379943 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.380047 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.380114 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.380173 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.380231 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.380304 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.380369 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.380430 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.380488 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.380578 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.380637 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.380715 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.380834 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.380899 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.380960 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.381014 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.381078 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.381136 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.381198 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.381328 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.381396 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.381455 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.381595 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.381660 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.381719 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.381778 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.381839 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.381913 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.381973 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.382032 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.382090 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.382148 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.382206 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.382264 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.382322 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.382375 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.382438 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.382496 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.382554 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.382611 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.382670 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.382728 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.382803 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.382861 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.382923 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.382982 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.383040 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.383113 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.383171 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.383228 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.383286 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.383354 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.383425 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.383490 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.383548 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.383608 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.383665 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.383812 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.383870 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.383926 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.384029 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.384239 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.384297 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.384355 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.384432 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.384491 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.384566 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.384625 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.384684 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.384744 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.384960 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.385025 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.385086 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.385143 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.385202 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.385356 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.385431 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.385489 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.385590 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.385648 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.385706 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.385796 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.385855 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.385919 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.385978 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.386038 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.386096 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.386165 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.386227 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.386294 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.386352 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.386452 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.386514 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.386550 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.386585 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.386622 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.386750 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.386798 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.386834 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.386870 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.386906 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.386952 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.386988 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.387024 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.387061 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.387097 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.387133 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.387195 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.387232 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.387337 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.387407 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.387474 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.387543 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.387594 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.387708 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.387758 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.387815 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.387912 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.387959 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.388008 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.388059 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.388113 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.388158 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.388204 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.388264 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.388564 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.388612 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.388658 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.388704 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.388807 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.388854 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.388905 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.388951 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.389003 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.389048 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.389094 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.389141 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:47:32.389203 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.389251 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.389332 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.389379 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.389426 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.389476 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.389521 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.389565 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.389610 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.389687 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.389732 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.390043 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.390090 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.390293 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 1 02:47:32.390630 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.390679 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.390784 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.390883 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.390929 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.390975 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.391105 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.391159 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.391205 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.391257 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.391507 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.391554 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.391761 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:32.391839 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.391894 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.391984 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.392034 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.392221 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.392267 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.392313 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.392499 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.392547 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.392612 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.392658 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.392930 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.393126 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.393460 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.393690 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.393788 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.395422 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.395498 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.395545 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.395595 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.395648 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.395700 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.395751 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:47:32.395803 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.395914 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.395964 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.396014 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.396074 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.396146 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.396192 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.396237 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.396296 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.396341 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.396422 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.396549 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.396699 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.396766 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.396856 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.396924 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.397197 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.397698 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.397894 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.398491 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.398570 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.398632 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.398692 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.398755 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.398873 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.398932 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.398992 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.399051 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.399109 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.399239 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.399298 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.399359 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.399436 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.399505 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.399564 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.399632 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.399701 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.399760 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.399829 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.399888 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.399946 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.400005 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.400063 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.400122 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.400180 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.400241 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.400304 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.400421 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.400493 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.400575 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.400680 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.400741 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.400838 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.400898 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.400959 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.417860 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.417975 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.449353 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.449511 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.450703 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.455023 brk(0x2698000) = 0x2698000 02:47:32.472923 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.473034 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.478927 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:32.479031 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.515089 brk(0x26b9000) = 0x26b9000 02:47:32.521767 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:32.523031 futex(0x7fc9f017ad68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:40.702146 futex(0x7fc9f017ad68, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.706688 futex(0x7fca18201e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:40.775928 futex(0x7fca18203088, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:40.779697 futex(0x7fca18205488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:40.798857 futex(0x7fca18201e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.798951 futex(0x7fca18203088, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.799031 futex(0x7fca18205488, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.832691 brk(0x26da000) = 0x26da000 02:47:40.847637 futex(0x7fc9f026a488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:40.872648 futex(0x7fc9f026a488, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.894828 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.894954 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.895027 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.895094 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.895156 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.895235 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.895314 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:40.896547 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.897008 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:40.897894 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.898253 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:40.899493 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.901075 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.901175 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.901265 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.901327 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:40.902711 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.902853 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:40.904190 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:40.905563 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.905980 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.906081 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.906146 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.906207 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.906530 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.906605 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.906672 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.906739 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.906810 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.906876 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.906942 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.907009 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.908140 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.908227 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.908686 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.908762 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.908936 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.909130 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.909636 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.909962 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.910033 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.910118 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.910186 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.910254 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.911148 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.911277 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.911586 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.911661 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.911900 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.913971 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.914460 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:47:40.914603 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.914675 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.915002 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.915069 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.915136 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.915671 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.916011 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.916183 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.916251 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.916450 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.916515 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.916574 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.916651 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.916767 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.917420 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.917507 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.917568 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.917962 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.918028 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.918088 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.918261 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.918321 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.918390 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.918455 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.918515 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.918636 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.918698 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.918762 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.918828 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.918886 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.918946 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.919083 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.919141 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.919201 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.919259 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.919317 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.919379 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.919463 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.919526 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.919584 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.919671 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.919729 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.919787 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.919845 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.919932 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.920085 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.920156 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.920215 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.920276 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.920335 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.920499 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.920560 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.920645 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.920705 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.920870 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.920938 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.920999 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.921162 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.921222 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.921282 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.921347 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.921430 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.921525 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:47:40.921686 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.921816 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.921860 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.921986 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.922088 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.922126 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.922160 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.922268 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.922303 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.922347 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.922390 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.922424 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.922763 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.922874 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.923302 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.923345 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.923927 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.923967 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.924001 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.924035 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.924274 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.924309 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.924346 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.924386 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.924420 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.924454 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.924487 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.924521 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.924674 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.924710 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.924744 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.924778 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.924818 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.924854 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.924888 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.924921 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.924969 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.925086 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.925133 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.925174 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.925288 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.925323 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.925374 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.925413 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.925453 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.925501 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.925577 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.925621 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.925659 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.925693 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.925744 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.925802 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.925836 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.925870 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.925903 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.925940 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.925974 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.926045 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.926078 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.926111 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.926253 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.926301 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.926334 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.926372 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.926419 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.926454 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.926487 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.926524 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.926557 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.926607 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.926641 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.926684 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.926718 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.926759 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.926795 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:47:40.926866 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.926900 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.926944 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.926978 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.927011 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.927044 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.927077 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.927114 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.927147 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.927198 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.927531 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.927570 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.927609 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.927656 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.927690 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.927734 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.927773 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.927892 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.927927 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.927979 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.928014 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.928048 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.928123 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.928157 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.928190 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.928631 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.928670 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.928703 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.928736 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.928821 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.928856 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.928890 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.929055 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.929092 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.929147 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.929245 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.929279 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.929334 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.929373 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.929414 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.929453 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.929489 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.929522 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.929600 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.929634 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.929669 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.929710 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.929754 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.929788 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.929930 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.929993 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.930028 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.930085 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.930119 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.930152 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.930195 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.930301 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.930335 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.930375 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.930417 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.930451 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.930485 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.930525 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.930559 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.930662 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.930696 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.930729 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.930848 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.930886 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.930951 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.930985 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.931032 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.931073 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.931106 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:40.931148 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.931181 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.931223 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.931256 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.931294 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.931327 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.931494 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.931544 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.931594 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.931741 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.931784 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.931863 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.931904 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.931943 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.931985 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.932030 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.932072 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.932111 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.932151 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.932190 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.932231 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.932273 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.932314 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.932514 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.932561 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.932606 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.932647 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.932759 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.932801 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.932840 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.932886 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.933013 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.933077 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.933112 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.933145 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.933179 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.933235 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.933278 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.933319 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.933378 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.933414 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.933456 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.933490 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.933539 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.933574 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.933607 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.933640 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.933700 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.933733 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.933766 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.933810 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.933969 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.934004 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.934038 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.934104 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.934139 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.934184 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.934218 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.934251 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 1 02:47:40.934340 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.934628 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.934666 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.934708 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.934742 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.934778 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.934811 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.934845 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.934968 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.935021 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.935055 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.935088 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.935121 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.935153 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.935186 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.935228 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.935266 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.935299 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.935400 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.935462 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.935505 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.935543 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.935829 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.936140 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.936195 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.936230 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.936281 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.936567 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.937267 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.937721 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.937764 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.938047 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.938157 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.938200 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.938257 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.938292 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.938326 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.938383 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.938420 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.938454 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.938609 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.938644 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.938678 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.938790 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.938825 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.938970 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.941485 futex(0xf49410, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.964982 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.965046 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.982547 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:40.982606 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.982854 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:40.989187 brk(0x26fb000) = 0x26fb000 02:47:41.006895 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.006961 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:41.015340 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.015411 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:41.029307 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.029374 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.029424 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:41.029478 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.029514 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:41.029560 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.029597 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:41.029724 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.029759 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.029796 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.029829 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.029864 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:41.029919 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.029955 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.029988 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.030038 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:41.030075 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.030109 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:41.030224 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.030261 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:41.030300 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.030334 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.030374 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:41.030442 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.030478 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:41.030538 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.030578 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.030611 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.030644 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:41.030903 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.030938 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.030972 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:41.031292 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.031330 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:41.031398 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.031435 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:41.031494 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.031532 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:41.038943 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:41.039002 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:41.057858 brk(0x271c000) = 0x271c000 02:47:41.070743 brk(0x273d000) = 0x273d000 02:47:41.071539 brk(0x275e000) = 0x275e000 02:47:41.072427 brk(0x277f000) = 0x277f000 02:47:41.073474 brk(0x27a0000) = 0x27a0000 02:47:41.079919 futex(0x7fc999ecbc88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:48.223631 futex(0x7fc999ecbc88, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:48.223956 futex(0x7fc999f4be88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:49.412287 futex(0x7fc999f4be88, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:49.417712 brk(0x27ca000) = 0x27ca000 02:47:49.427124 brk(0x27eb000) = 0x27eb000 02:47:49.428227 brk(0x280c000) = 0x280c000 02:47:49.429402 brk(0x282d000) = 0x282d000 02:47:49.430577 brk(0x284e000) = 0x284e000 02:47:49.431762 brk(0x286f000) = 0x286f000 02:47:49.436176 futex(0x7fc9d46ac688, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:49.449026 futex(0x7fc9d46ac688, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:49.455065 futex(0x7fc9d46c2e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:49.455708 futex(0x7fc9d46c2e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:49.464384 futex(0x7fc999f85488, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:49.472744 futex(0x7fc999f85488, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:49.480181 futex(0x7fca18682e88, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:49.580824 futex(0x7fca18682e88, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:49.582134 futex(0x7fc9d4710888, FUTEX_WAIT_PRIVATE, 2, NULL) = 0 02:47:49.586133 futex(0x7fc9d4710888, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:49.586878 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:49.587083 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:49.587203 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:49.587600 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:49.587760 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:49.587837 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:49.587925 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:49.587996 futex(0xf49190, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:49.588065 futex(0xf49190, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:49.617545 futex(0xf49410, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:49.625320 futex(0xf49110, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) 02:47:49.625468 futex(0xf49110, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:49.646760 futex(0x7fca47d33c40, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:49.646961 futex(0xf49410, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:49.764722 munmap(0x7fca327f5000, 8392704) = 0 02:47:49.766624 munmap(0x7fca317f3000, 8392704) = 0 02:47:49.766751 write(2, " - traversal finished ..."..., 33) = 33 02:47:49.766957 write(2, " - moving disconnected in"..., 55) = 55 02:47:49.783132 write(2, "Phase 7 - verify and correct lin"..., 44) = 44 02:47:49.783322 clone(child_stack=0x7fca42f85f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca42f869d0, tls=0x7fca42f86700, child_tidptr=0x7fca42f869d0) = 32288 02:47:49.783445 clone(child_stack=0x7fca43f87f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca43f889d0, tls=0x7fca43f88700, child_tidptr=0x7fca43f889d0) = 32289 02:47:49.783531 clone(child_stack=0x7fca43786f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca437879d0, tls=0x7fca43787700, child_tidptr=0x7fca437879d0) = 32290 02:47:49.783613 clone(child_stack=0x7fca337f5f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca337f69d0, tls=0x7fca337f6700, child_tidptr=0x7fca337f69d0) = 32291 02:47:49.783691 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca41f85000 02:47:49.783772 mprotect(0x7fca41f85000, 4096, PROT_NONE) = 0 02:47:49.783837 clone(child_stack=0x7fca42784f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca427859d0, tls=0x7fca42785700, child_tidptr=0x7fca427859d0) = 32292 02:47:49.783915 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca41784000 02:47:49.783982 mprotect(0x7fca41784000, 4096, PROT_NONE) = 0 02:47:49.784047 clone(child_stack=0x7fca41f83f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca41f849d0, tls=0x7fca41f84700, child_tidptr=0x7fca41f849d0) = 32293 02:47:49.784140 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca40f83000 02:47:49.784210 mprotect(0x7fca40f83000, 4096, PROT_NONE) = 0 02:47:49.784269 clone(child_stack=0x7fca41782f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca417839d0, tls=0x7fca41783700, child_tidptr=0x7fca417839d0) = 32294 02:47:49.784344 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca40782000 02:47:49.784441 mprotect(0x7fca40782000, 4096, PROT_NONE) = 0 02:47:49.784503 clone(child_stack=0x7fca40f81f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca40f829d0, tls=0x7fca40f82700, child_tidptr=0x7fca40f829d0) = 32295 02:47:49.784584 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3ff81000 02:47:49.784667 mprotect(0x7fca3ff81000, 4096, PROT_NONE) = 0 02:47:49.784728 clone(child_stack=0x7fca40780f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca407819d0, tls=0x7fca40781700, child_tidptr=0x7fca407819d0) = 32296 02:47:49.784801 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3f780000 02:47:49.784867 mprotect(0x7fca3f780000, 4096, PROT_NONE) = 0 02:47:49.784927 clone(child_stack=0x7fca3ff7ff70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3ff809d0, tls=0x7fca3ff80700, child_tidptr=0x7fca3ff809d0) = 32297 02:47:49.785005 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3ef7f000 02:47:49.785071 mprotect(0x7fca3ef7f000, 4096, PROT_NONE) = 0 02:47:49.785130 clone(child_stack=0x7fca3f77ef70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3f77f9d0, tls=0x7fca3f77f700, child_tidptr=0x7fca3f77f9d0) = 32298 02:47:49.785203 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3e77e000 02:47:49.785268 mprotect(0x7fca3e77e000, 4096, PROT_NONE) = 0 02:47:49.785328 clone(child_stack=0x7fca3ef7df70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3ef7e9d0, tls=0x7fca3ef7e700, child_tidptr=0x7fca3ef7e9d0) = 32299 02:47:49.785413 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3df7d000 02:47:49.785479 mprotect(0x7fca3df7d000, 4096, PROT_NONE) = 0 02:47:49.785538 clone(child_stack=0x7fca3e77cf70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3e77d9d0, tls=0x7fca3e77d700, child_tidptr=0x7fca3e77d9d0) = 32300 02:47:49.785612 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3d77c000 02:47:49.785679 mprotect(0x7fca3d77c000, 4096, PROT_NONE) = 0 02:47:49.785739 clone(child_stack=0x7fca3df7bf70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3df7c9d0, tls=0x7fca3df7c700, child_tidptr=0x7fca3df7c9d0) = 32301 02:47:49.785817 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3cf7b000 02:47:49.785881 mprotect(0x7fca3cf7b000, 4096, PROT_NONE) = 0 02:47:49.785941 clone(child_stack=0x7fca3d77af70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3d77b9d0, tls=0x7fca3d77b700, child_tidptr=0x7fca3d77b9d0) = 32302 02:47:49.786013 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca3c77a000 02:47:49.786078 mprotect(0x7fca3c77a000, 4096, PROT_NONE) = 0 02:47:49.786138 clone(child_stack=0x7fca3cf79f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca3cf7a9d0, tls=0x7fca3cf7a700, child_tidptr=0x7fca3cf7a9d0) = 32303 02:47:49.786215 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca377ff000 02:47:49.786623 mprotect(0x7fca377ff000, 4096, PROT_NONE) = 0 02:47:49.786685 clone(child_stack=0x7fca37ffef70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca37fff9d0, tls=0x7fca37fff700, child_tidptr=0x7fca37fff9d0) = 32304 02:47:49.786763 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca36ffe000 02:47:49.786828 mprotect(0x7fca36ffe000, 4096, PROT_NONE) = 0 02:47:49.786895 clone(child_stack=0x7fca377fdf70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca377fe9d0, tls=0x7fca377fe700, child_tidptr=0x7fca377fe9d0) = 32305 02:47:49.786973 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca367fd000 02:47:49.787038 mprotect(0x7fca367fd000, 4096, PROT_NONE) = 0 02:47:49.787098 clone(child_stack=0x7fca36ffcf70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca36ffd9d0, tls=0x7fca36ffd700, child_tidptr=0x7fca36ffd9d0) = 32306 02:47:49.787172 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca35ffc000 02:47:49.787236 mprotect(0x7fca35ffc000, 4096, PROT_NONE) = 0 02:47:49.787296 clone(child_stack=0x7fca367fbf70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca367fc9d0, tls=0x7fca367fc700, child_tidptr=0x7fca367fc9d0) = 32307 02:47:49.787378 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca357fb000 02:47:49.787449 mprotect(0x7fca357fb000, 4096, PROT_NONE) = 0 02:47:49.787520 clone(child_stack=0x7fca35ffaf70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca35ffb9d0, tls=0x7fca35ffb700, child_tidptr=0x7fca35ffb9d0) = 32308 02:47:49.787592 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca34ffa000 02:47:49.787678 mprotect(0x7fca34ffa000, 4096, PROT_NONE) = 0 02:47:49.787738 clone(child_stack=0x7fca357f9f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca357fa9d0, tls=0x7fca357fa700, child_tidptr=0x7fca357fa9d0) = 32309 02:47:49.787817 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca347f9000 02:47:49.787883 mprotect(0x7fca347f9000, 4096, PROT_NONE) = 0 02:47:49.787943 clone(child_stack=0x7fca34ff8f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca34ff99d0, tls=0x7fca34ff9700, child_tidptr=0x7fca34ff99d0) = 32310 02:47:49.788021 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca33ff8000 02:47:49.788088 mprotect(0x7fca33ff8000, 4096, PROT_NONE) = 0 02:47:49.788150 clone(child_stack=0x7fca347f7f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca347f89d0, tls=0x7fca347f8700, child_tidptr=0x7fca347f89d0) = 32311 02:47:49.788229 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca337f7000 02:47:49.788294 mprotect(0x7fca337f7000, 4096, PROT_NONE) = 0 02:47:49.788357 clone(child_stack=0x7fca33ff6f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca33ff79d0, tls=0x7fca33ff7700, child_tidptr=0x7fca33ff79d0) = 32312 02:47:49.788441 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca327f5000 02:47:49.788483 mprotect(0x7fca327f5000, 4096, PROT_NONE) = 0 02:47:49.788523 clone(child_stack=0x7fca32ff4f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca32ff59d0, tls=0x7fca32ff5700, child_tidptr=0x7fca32ff59d0) = 32313 02:47:49.788580 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca31ff4000 02:47:49.788622 mprotect(0x7fca31ff4000, 4096, PROT_NONE) = 0 02:47:49.788665 clone(child_stack=0x7fca327f3f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca327f49d0, tls=0x7fca327f4700, child_tidptr=0x7fca327f49d0) = 32314 02:47:49.788714 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca317f3000 02:47:49.788756 mprotect(0x7fca317f3000, 4096, PROT_NONE) = 0 02:47:49.788796 clone(child_stack=0x7fca31ff2f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca31ff39d0, tls=0x7fca31ff3700, child_tidptr=0x7fca31ff39d0) = 32315 02:47:49.788864 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca30ff2000 02:47:49.788914 mprotect(0x7fca30ff2000, 4096, PROT_NONE) = 0 02:47:49.788960 clone(child_stack=0x7fca317f1f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca317f29d0, tls=0x7fca317f2700, child_tidptr=0x7fca317f29d0) = 32316 02:47:49.789017 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fca307f1000 02:47:49.789074 mprotect(0x7fca307f1000, 4096, PROT_NONE) = 0 02:47:49.789120 clone(child_stack=0x7fca30ff0f70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fca30ff19d0, tls=0x7fca30ff1700, child_tidptr=0x7fca30ff19d0) = 32317 02:47:49.789183 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fc9f77ff000 02:47:49.789618 mprotect(0x7fc9f77ff000, 4096, PROT_NONE) = 0 02:47:49.789665 clone(child_stack=0x7fc9f7ffef70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fc9f7fff9d0, tls=0x7fc9f7fff700, child_tidptr=0x7fc9f7fff9d0) = 32318 02:47:49.789727 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fc9f6ffe000 02:47:49.789779 mprotect(0x7fc9f6ffe000, 4096, PROT_NONE) = 0 02:47:49.789825 clone(child_stack=0x7fc9f77fdf70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fc9f77fe9d0, tls=0x7fc9f77fe700, child_tidptr=0x7fc9f77fe9d0) = 32319 02:47:49.789890 futex(0x7ffc25868494, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x7ffc25868490, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1 02:47:49.789951 futex(0x7ffc25868468, FUTEX_WAKE_PRIVATE, 1) = 0 02:47:49.790004 futex(0x7ffc25868494, FUTEX_CMP_REQUEUE_PRIVATE, 1, 2147483647, 0x7ffc25868468, 62) = 30 02:47:49.790078 futex(0x7fca42f869d0, FUTEX_WAIT, 32288, NULL) = 0 02:47:49.796868 futex(0x7fca437879d0, FUTEX_WAIT, 32290, NULL) = 0 02:47:49.797448 futex(0x7fca427859d0, FUTEX_WAIT, 32292, NULL) = 0 02:47:49.797555 munmap(0x7fca42786000, 8392704) = 0 02:47:49.797647 munmap(0x7fca43788000, 8392704) = 0 02:47:49.797720 munmap(0x7fca42f87000, 8392704) = 0 02:47:49.797778 munmap(0x7fca32ff6000, 8392704) = 0 02:47:49.797844 munmap(0x7fca41f85000, 8392704) = 0 02:47:49.797897 munmap(0x7fca41784000, 8392704) = 0 02:47:49.797949 munmap(0x7fca40f83000, 8392704) = 0 02:47:49.797999 munmap(0x7fca40782000, 8392704) = 0 02:47:49.798057 munmap(0x7fca3ff81000, 8392704) = 0 02:47:49.798117 munmap(0x7fca3f780000, 8392704) = 0 02:47:49.798166 munmap(0x7fca3ef7f000, 8392704) = 0 02:47:49.798220 munmap(0x7fca3e77e000, 8392704) = 0 02:47:49.798275 munmap(0x7fca3df7d000, 8392704) = 0 02:47:49.798324 munmap(0x7fca3d77c000, 8392704) = 0 02:47:49.798430 munmap(0x7fca3cf7b000, 8392704) = 0 02:47:49.798503 munmap(0x7fca3c77a000, 8392704) = 0 02:47:49.798581 munmap(0x7fca377ff000, 8392704) = 0 02:47:49.798653 munmap(0x7fca36ffe000, 8392704) = 0 02:47:49.798718 munmap(0x7fca367fd000, 8392704) = 0 02:47:49.798782 munmap(0x7fca35ffc000, 8392704) = 0 02:47:49.798846 munmap(0x7fca357fb000, 8392704) = 0 02:47:49.798943 munmap(0x7fca34ffa000, 8392704) = 0 02:47:49.799023 munmap(0x7fca347f9000, 8392704) = 0 02:47:49.799092 munmap(0x7fca33ff8000, 8392704) = 0 02:47:49.799158 munmap(0x7fca337f7000, 8392704) = 0 02:47:49.799222 munmap(0x7fca327f5000, 8392704) = 0 02:47:49.799288 munmap(0x7fca31ff4000, 8392704) = 0 02:47:49.799351 munmap(0x7fca317f3000, 8392704) = 0 02:47:49.799452 stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2211, ...}) = 0 02:47:49.799601 write(2, " - 02:47:49: verify and c"..., 85) = 85 02:47:49.799700 munmap(0x7fca30ff2000, 8392704) = 0 02:47:49.800200 pwrite64(4, "IAB3\0\0\0\370\377\377\377\377\0\0\374\377\0\0\0\0\202\373\370@\0\0\0\0\0\0\0\0"..., 4096, 1125146198016) = 4096 02:47:49.817434 pwrite64(4, "AB3C\0\0\1\355\377\377\377\377\0\17}\177\0\0\0\2M\351w\250\0\0\0\0\0\0\0\0"..., 4096, 5067305340928) = 4096 02:47:49.884862 pwrite64(4, "AB3B\0\0\1\344\0\2\tC\0\2\31\177\0\0\0\1\6\10Y(\0\0\0\0\0\0\0\0"..., 4096, 2250842984448) = 4096 02:47:49.905031 pwrite64(4, "AB3C\0\0\1\362\0\4d\177\0\4r\177\0\0\0\0\203\37z\300\0\0\0\0\0\0\0\0"..., 4096, 1126337708032) = 4096 02:47:49.931426 pwrite64(4, "AB3C\0\0\1\364\0\10!~\0\0105\177\0\0\0\1\34\16#\370\0\0\0\0\0\0\0\0"..., 4096, 2440015900672) = 4096 02:47:49.961183 pwrite64(4, "IAB3\0\1\0\v\377\377\377\377\377\377\377\377\0\0\0\0027\231wh\0\0\0\0\0\0\0\0"..., 4096, 4875642392576) = 4096 02:47:50.006099 pwrite64(4, "AB3B\0\0\1\363\0\4Jo\0\4T\263\0\0\0\0\203\36\205\250\0\0\0\0\0\0\0\0"..., 4096, 1126305583104) = 4096 02:47:50.043271 pwrite64(4, "AB3C\0\0\1\354\0\30}\375\0\31\260\377\0\0\0\2N8\273\370\0\0\0\0\0\0\0\0"..., 4096, 5069965094912) = 4096 02:47:50.068568 pwrite64(4, "IAB3\0\0\0\373\0\2q}\0\3\25\376\0\0\0\0\0\25\336\360\0\0\0\0\0\0\0\0"..., 4096, 733863936) = 4096 02:47:50.096521 pwrite64(4, "IAB3\0\1\0\f\377\377\377\377\377\377\377\377\0\0\0\1\211\5\27\370\0\0\0\0\0\0\0\0"..., 4096, 3376015208448) = 4096 02:47:50.120531 pwrite64(4, "AB3B\0\0\1\361\0\16\5|\0\16\22\377\0\0\0\0\360\223\227\370\0\0\0\0\0\0\0\0"..., 4096, 2066536722432) = 4096 02:47:50.146381 pwrite64(4, "AB3C\0\0\1\353\0\33>\177\0\33H\177\0\0\0\0028sC\370\0\0\0\0\0\0\0\0"..., 4096, 4882950516736) = 4096 02:47:50.178017 pwrite64(4, "IAB3\0\0\0\373\0\v\351\377\0\fa\25\0\0\0\0\360\204\10x\0\0\0\0\0\0\0\0"..., 4096, 2066014597120) = 4096 02:47:50.209762 pwrite64(4, "AB3B\0\0\1\363\0\4R\265\0\4V\377\0\0\0\0\203\36\225\230\0\0\0\0\0\0\0\0"..., 4096, 1126307672064) = 4096 02:47:50.227616 pwrite64(4, "AB3B\0\0\1\355\0\5\206\35\377\377\377\377\0\0\0\0\0,c\370\0\0\0\0\0\0\0\0"..., 4096, 1489498112) = 4096 02:47:50.244576 pwrite64(4, "AB3B\0\0\1\353\0\6n\25\0\7-\254\0\0\0\0027\322:p\0\0\0\0\0\0\0\0"..., 4096, 4877547003904) = 4096 02:47:50.276066 pwrite64(4, "AB3B\0\0\1\353\0\5\267\177\0\6n\25\0\0\0\0027\307\225\300\0\0\0\0\0\0\0\0"..., 4096, 4877189873664) = 4096 02:47:50.306717 pwrite64(4, "AB3C\0\0\1\356\0\3 \365\0\0033\375\0\0\0\0+\302\222p\0\0\0\0\0\0\0\0"..., 4096, 375895941120) = 4096 02:47:50.326619 pwrite64(4, "AB3C\0\0\1\366\0\21\373\377\0\22\20\177\0\0\0\2\"To\370\0\0\0\0\0\0\0\0"..., 4096, 4692937535488) = 4096 02:47:50.391784 pwrite64(4, "IAB3\0\0\0\347\0\2\37\177\377\377\377\377\0\0\0\0m9\333\370\0\0\0\0\0\0\0\0"..., 4096, 938244304896) = 4096 02:47:50.427530 pwrite64(4, "AB3C\0\0\1\363\0\fo\376\0\23\253\257\0\0\0\0\332\344_\370\0\0\0\0\0\0\0\0"..., 4096, 1880268730368) = 4096 02:47:50.461182 pwrite64(4, "IAB3\0\0\0\371\0\2\213R\0\2\2722\0\0\0\2!\331s\370\0\0\0\0\0\0\0\0"..., 4096, 4688810864640) = 4096 02:47:50.485127 pwrite64(4, "IAB3\0\0\0\362\377\377\377\377\0\2d\345\0\0\0\1\211\2\307\370\0\0\0\0\0\0\0\0"..., 4096, 3375937613824) = 4096 02:47:50.509737 pwrite64(4, "AB3C\0\0\1\353\0\33F\177\0\33N\177\0\0\0\0028sS\370\0\0\0\0\0\0\0\0"..., 4096, 4882952613888) = 4096 02:47:50.536282 pwrite64(4, "AB3B\0\0\1\354\0\17p\177\377\377\377\377\0\0\0\2M\351_\370\0\0\0\0\0\0\0\0"..., 4096, 5067302236160) = 4096 02:47:50.554105 pwrite64(4, "AB3C\0\0\1\333\0V\341\177\0V\360\177\0\0\0\2\247w\323\370\0\0\0\0\0\0\0\0"..., 4096, 5836586348544) = 4096 02:47:50.599822 pwrite64(4, "AB3B\0\0\1\363\0\4T\263\0\4Z\377\0\0\0\0\203\36\247\370\0\0\0\0\0\0\0\0"..., 4096, 1126310080512) = 4096 02:47:50.652637 pwrite64(4, "AB3C\0\0\1\336\0\6\234\377\0\6\243\356\0\0\0\1\366P\17\370\0\0\0\0\0\0\0\0"..., 4096, 4314833612800) = 4096 02:47:50.674473 pwrite64(4, "AB3C\0\0\1\354\0\17w\365\0\17~r\0\0\0\2M\351\243\370\0\0\0\0\0\0\0\0"..., 4096, 5067311149056) = 4096 02:47:50.705317 pwrite64(4, "AB3C\0\0\1\357\377\377\377\377\0\17#\377\0\0\0\1\236\374sX\0\0\0\0\0\0\0\0"..., 4096, 3564703756288) = 4096 02:47:50.735750 pwrite64(4, "IAB3\0\0\0\352\0\1\264\377\0\2\33\277\0\0\0\2\216\373\363\370\0\0\0\0\0\0\0\0"..., 4096, 5626271363072) = 4096 02:47:50.765645 pwrite64(4, "AB3B\0\0\1\343\0\10|\177\377\377\377\377\0\0\0\1\264\341\v\370\0\0\0\0\0\0\0\0"..., 4096, 3752762798080) = 4096 02:47:50.797877 pwrite64(4, "AB3C\0\0\1\333\0V\357\177\0V\361\177\0\0\0\2\247w\333\370\0\0\0\0\0\0\0\0"..., 4096, 5836587397120) = 4096 02:47:50.822517 pwrite64(4, "IAB3\0\0\0\374\0\0Mj\0\0W|\0\0\0\0011\243\263\370\0\0\0\0\0\0\0\0"..., 4096, 2625423011840) = 4096 02:47:50.854399 pwrite64(4, "AB3B\0\0\1\361\0\3\332\177\0\3\342\264\0\0\0\2y5\377\230\0\0\0\0\0\0\0\0"..., 4096, 5439240482816) = 4096 02:47:50.892739 pwrite64(4, "IAB3\0\0\0\356\0\1P\177\0\1m\177\0\0\0\1\33\327\313\370\0\0\0\0\0\0\0\0"..., 4096, 2438192427008) = 4096 02:47:50.924914 pwrite64(4, "AB3C\0\0\1\354\0\17}\177\0\17\177\344\0\0\0\2M\351\253\220\0\0\0\0\0\0\0\0"..., 4096, 5067312144384) = 4096 02:47:50.952676 pwrite64(4, "AB3B\0\0\1\343\0\10{\177\0\10}\177\0\0\0\1\264\341\3\370\0\0\0\0\0\0\0\0"..., 4096, 3752761749504) = 4096 02:47:50.973185 pwrite64(4, "AB3B\0\0\1\357\377\377\377\377\0\3z\355\0\0\0\0\256\274\217\370\0\0\0\0\0\0\0\0"..., 4096, 1500975722496) = 4096 02:47:51.011397 pwrite64(4, "IAB3\0\1\0\f\377\377\377\377\377\377\377\377\0\0\0\1\5\372\245\370\0\0\0\0\0\0\0\0"..., 4096, 2250383290368) = 4096 02:47:51.050117 pwrite64(4, "IAB3\0\0\0\361\0\0\37\10\0\0h\377\0\0\0\1\5\372\246\20\0\0\0\0\0\0\0\0"..., 4096, 2250383302656) = 4096 02:47:51.051309 pwrite64(4, "IAB3\0\0\0\356\0\1h\177\0\1\206\235\0\0\0\1\33\327\363\370\0\0\0\0\0\0\0\0"..., 4096, 2438197669888) = 4096 02:47:51.073537 pwrite64(4, "AB3C\0\0\1\347\377\377\377\377\0\25\214\177\0\0\0\2\217\226\213\370\0\0\0\0\0\0\0\0"..., 4096, 5631458668544) = 4096 02:47:51.104652 pwrite64(4, "AB3C\0\0\1\354\0\17~r\0\17\204\343\0\0\0\2M\351\267 \0\0\0\0\0\0\0\0"..., 4096, 5067313659904) = 4096 02:47:51.132247 pwrite64(4, "IAB3\0\0\0\366\0V\232~\0V\234\177\0\0\0\0\307.\277\310\0\0\0\0\0\0\0\0"..., 4096, 1710965624832) = 4096 02:47:51.155126 pwrite64(4, "IAB3\0\0\0\372\0\f\204m\0\r<5\0\0\0\0\360\207\372\220\0\0\0\0\0\0\0\0"..., 4096, 2066146992128) = 4096 02:47:51.179592 pwrite64(4, "IAB3\0\0\0\366\0V\232A\0V\232\371\0\0\0\0\307.\273\360\0\0\0\0\0\0\0\0"..., 4096, 1710965121024) = 4096 02:47:51.232549 pwrite64(4, "IAB3\0\0\0\366\0V\231\376\0V\232~\0\0\0\0\307.\272\10\0\0\0\0\0\0\0\0"..., 4096, 1710964871168) = 4096 02:47:51.240433 pwrite64(4, "AB3C\0\0\1\366\0\20\305\177\0\22\0\377\0\0\0\2\"TG\370\0\0\0\0\0\0\0\0"..., 4096, 4692932292608) = 4096 02:47:51.265712 pwrite64(4, "IAB3\0\0\0\366\0V\221\245\0V\232A\0\0\0\0\307.\267\360\0\0\0\0\0\0\0\0"..., 4096, 1710964596736) = 4096 02:47:51.282478 pwrite64(4, "AB3B\0\0\1\346\0\16\256\220\0\24#\341\0\0\0\1\211\206\257\370\0\0\0\0\0\0\0\0"..., 4096, 3380363653120) = 4096 02:47:51.312602 pwrite64(4, "AB3B\0\0\1\363\0\4V\377\0\4`\34\0\0\0\0\203\36\307\370\0\0\0\0\0\0\0\0"..., 4096, 1126314274816) = 4096 02:47:51.347079 pwrite64(4, "AB3B\0\0\1\355\0\5w\377\0\5\214\177\0\0\0\0\0,0\350\0\0\0\0\0\0\0\0"..., 4096, 1482805248) = 4096 02:47:51.368826 pwrite64(4, "AB3C\0\0\1\344\0\10\250\177\0,\36\24\0\0\0\1\265[7\370\0\0\0\0\0\0\0\0"..., 4096, 3756862205952) = 4096 02:47:51.399996 pwrite64(4, "AB3B\0\0\1\344\0\2\10\177\0\2\17%\0\0\0\1\6\10*\30\0\0\0\0\0\0\0\0"..., 4096, 2250836815872) = 4096 02:47:51.426302 pwrite64(4, "AB3C\0\0\1\346\0.a\370\377\377\377\377\0\0\0\2\220t\273\370\0\0\0\0\0\0\0\0"..., 4096, 5638914043904) = 4096 02:47:51.463205 pwrite64(4, "AB3C\0\0\1\354\0\17\236\377\0\30}\375\0\0\0\2N/\363\370\0\0\0\0\0\0\0\0"..., 4096, 5069670445056) = 4096 02:47:51.481191 pwrite64(4, "AB3C\0\0\1\353\0\33H\177\0\33Q\177\0\0\0\0028s\203\370\0\0\0\0\0\0\0\0"..., 4096, 4882958905344) = 4096 02:47:51.499048 pwrite64(4, "AB3C\0\1\0\16\377\377\377\377\377\377\377\377\0\0\0\2M\351\213\210\0\0\0\0\0\0\0\0"..., 4096, 5067307945984) = 4096 02:47:51.512689 pwrite64(4, "AB3B\0\0\1\344\0\2\1\377\0\2\tC\0\0\0\1\6\10#\370\0\0\0\0\0\0\0\0"..., 4096, 2250836013056) = 4096 02:47:51.534289 pwrite64(4, "AB3B\0\0\1\361\0\3\0228\0\3\336\363\0\0\0\2y5\333\370\0\0\0\0\0\0\0\0"..., 4096, 5439235813376) = 4096 02:47:51.582398 pwrite64(4, "IAB3\0\0\0\374\0\0\1\210\0\0Mh\0\0\0\0011\243\2330\0\0\0\0\0\0\0\0"..., 4096, 2625419763712) = 4096 02:47:51.603066 pwrite64(4, "IAB3\0\0\0\374\0\0Mh\0\0P\177\0\0\0\0011\243\233P\0\0\0\0\0\0\0\0"..., 4096, 2625419780096) = 4096 02:47:51.604355 pwrite64(4, "IAB3\0\0\0\374\0\0Mf\0\0Mj\0\0\0\0011\243\233@\0\0\0\0\0\0\0\0"..., 4096, 2625419771904) = 4096 02:47:51.605836 pwrite64(4, "IAB3\0\1\0\v\377\377\377\377\377\377\377\377\0\0\0\0011\243\232\360\0\0\0\0\0\0\0\0"..., 4096, 2625419730944) = 4096 02:47:51.609284 pwrite64(4, "AB3C\0\0\1\337\0\4\24\304\0\6\232\377\0\0\0\1\366=w@\0\0\0\0\0\0\0\0"..., 4096, 4314209615872) = 4096 02:47:51.636107 pwrite64(4, "AB3B\0\0\1\327\0\3OZ\0\3O\305\0\0\0\0mA\304\240\0\0\0\0\0\0\0\0"..., 4096, 938509680640) = 4096 02:47:51.656072 pwrite64(4, "AB3B\0\0\1\353\0\7%N\0\7z\275\0\0\0\0027\322}`\0\0\0\0\0\0\0\0"..., 4096, 4877555777536) = 4096 02:47:51.684187 pwrite64(4, "AB3B\0\0\1\327\0\3O\224\0\3m*\0\0\0\0mA\306(\0\0\0\0\0\0\0\0"..., 4096, 938509881344) = 4096 02:47:51.685180 pwrite64(4, "IAB3\0\0\0\367\377\377\377\377\0\0c*\0\0\0\0027\231\30@\0\0\0\0\0\0\0\0"..., 4096, 4875629920256) = 4096 02:47:51.736517 pwrite64(4, "AB3C\0\1\0\23\377\377\377\377\377\377\377\377\0\0\0\0\0,\337\370\0\0\0\0\0\0\0\0"..., 4096, 1505751040) = 4096 02:47:51.758726 pwrite64(4, "AB3B\0\0\1\327\0\3=\207\0\3O\224\0\0\0\0mA\302\320\0\0\0\0\0\0\0\0"..., 4096, 938509443072) = 4096 02:47:51.773019 pwrite64(4, "XAFL\0\0\0\32\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 4875628840448) = 512 02:47:51.805195 pwrite64(4, "XAGI\0\0\0\1\0\0\0\32\2\272\225\0\0\2\246\300\0\0\f\355\0\0\0\2\0\0\0001"..., 512, 4875628839936) = 512 02:47:51.805665 pwrite64(4, "XAGF\0\0\0\1\0\0\0\32\2\272\225\0\0\3\203C\0\7\234~\0\0\0\0\0\0\0\2"..., 512, 4875628839424) = 512 02:47:51.806313 pwrite64(4, "IAB3\0\0\0\374\0\0W|\0\0]\366\0\0\0\0011\243\354\210\0\0\0\0\0\0\0\0"..., 4096, 2625430425600) = 4096 02:47:51.828641 pwrite64(4, "IAB3\0\0\0\374\0\0P\177\0\0W\221\0\0\0\0011\243\353\340\0\0\0\0\0\0\0\0"..., 4096, 2625430339584) = 4096 02:47:51.844635 pwrite64(4, "AB3C\0\0\1\350\0\3c\377\0\3}\177\0\0\0\0\25\357\327\370\0\0\0\0\0\0\0\0"..., 4096, 188436443136) = 4096 02:47:51.885025 pwrite64(4, "AB3C\0\0\1\343\0`\227\177\0bm\177\0\0\0\1\267\246\353\370\0\0\0\0\0\0\0\0"..., 4096, 3776582250496) = 4096 02:47:51.913745 pwrite64(4, "AB3C\0\0\1\352\0\33N\177\377\377\377\377\0\0\0\0028s\233\370\0\0\0\0\0\0\0\0"..., 4096, 4882962051072) = 4096 02:47:51.939710 pwrite64(4, "AB3C\0\0\1\344\377\377\377\377\0\10\247\177\0\0\0\1\264\341C\370\0\0\0\0\0\0\0\0"..., 4096, 3752770138112) = 4096 02:47:51.965567 pwrite64(4, "IAB3\0\0\0\356\0\0\343\250\0\1h\177\0\0\0\1\33\327\v\370\0\0\0\0\0\0\0\0"..., 4096, 2438167261184) = 4096 02:47:51.997339 pwrite64(4, "AB3C\0\0\1\356\377\377\377\377\0\5\234\377\0\0\0\0\0,\307\370\0\0\0\0\0\0\0\0"..., 4096, 1502605312) = 4096 02:47:52.013250 pwrite64(4, "AB3B\0\0\1\324\0\17\247\177\0\17\255\177\0\0\0\1]\307\313\370\0\0\0\0\0\0\0\0"..., 4096, 3004591239168) = 4096 02:47:52.037157 pwrite64(4, "AB3C\0\0\1\350\0\3b\377\0\3e\377\0\0\0\0\25\357\307\370\0\0\0\0\0\0\0\0"..., 4096, 188434345984) = 4096 02:47:52.066338 pwrite64(4, "AB3B\0\0\1\363\0\4Z\377\377\377\377\377\0\0\0\0\203\36\360\340\0\0\0\0\0\0\0\0"..., 4096, 1126319636480) = 4096 02:47:52.080571 pwrite64(4, "AB3B\0\1\0\r\377\377\377\377\377\377\377\377\0\0\0\2y5\243\370\0\0\0\0\0\0\0\0"..., 4096, 5439228473344) = 4096 02:47:52.098701 pwrite64(4, "AB3C\0\0\1\356\0\3(N\0\0036\204\0\0\0\0+\302\357\350\0\0\0\0\0\0\0\0"..., 4096, 375908192256) = 4096 02:47:52.119225 pwrite64(4, "AB3B\0\0\1\346\0\25T\253\377\377\377\377\0\0\0\2\217\226W\370\0\0\0\0\0\0\0\0"..., 4096, 5631451852800) = 4096 02:47:52.147790 pwrite64(4, "AB3B\0\1\0\r\377\377\377\377\377\377\377\377\0\0\0\0\360\223i\300\0\0\0\0\0\0\0\0"..., 4096, 2066530664448) = 4096 02:47:52.175005 pwrite64(4, "AB3B\0\0\1\346\0\25T\177\0\25T\377\0\0\0\2\217\226UX\0\0\0\0\0\0\0\0"..., 4096, 5631451508736) = 4096 02:47:52.193394 pwrite64(4, "AB3B\0\0\1\352\0009\253\177\0TL\377\0\0\0\1\342\342\357\370\0\0\0\0\0\0\0\0"..., 4096, 4147963228160) = 4096 02:47:52.212283 pwrite64(4, "AB3B\0\0\1\346\0\25O\177\0\25T\253\0\0\0\2\217\226S\370\0\0\0\0\0\0\0\0"..., 4096, 5631451328512) = 4096 02:47:52.212861 pwrite64(4, "AB3B\0\1\0\16\377\377\377\377\377\377\377\377\0\0\0\0\256\300\332p\0\0\0\0\0\0\0\0"..., 4096, 1501119700992) = 4096 02:47:52.248495 pwrite64(4, "IAB3\0\0\0\347\0\1\351\177\0\2R\177\0\0\0\0m8C\370\0\0\0\0\0\0\0\0"..., 4096, 938190827520) = 4096 02:47:52.272343 pwrite64(4, "AB3C\0\0\1\321\0\\\267\177\0_\256\377\0\0\0\1v\33/\370\0\0\0\0\0\0\0\0"..., 4096, 3213547794432) = 4096 02:47:52.304570 pwrite64(4, "AB3C\0\0\1\354\0\17\204\343\0\17\212>\0\0\0\2M\351\377\370\0\0\0\0\0\0\0\0"..., 4096, 5067323207680) = 4096 02:47:52.330662 pwrite64(4, "AB3B\0\0\1\361\377\377\377\377\0\16\v\377\0\0\0\0\360\223c\340\0\0\0\0\0\0\0\0"..., 4096, 2066529894400) = 4096 02:47:52.347875 pwrite64(4, "AB3B\0\1\0\16\377\377\377\377\377\377\377\377\0\0\0\1H\2\363\370\0\0\0\0\0\0\0\0"..., 4096, 2817597632512) = 4096 02:47:52.364751 pwrite64(4, "AB3C\0\0\1\357\0\17\365\177\0\20W\377\0\0\0\1\237H{\370\0\0\0\0\0\0\0\0"..., 4096, 3567255023616) = 4096 02:47:52.387472 pwrite64(4, "AB3B\0\0\1\360\0\5\364\177\0\6-\376\0\0\0\2yG\353\370\0\0\0\0\0\0\0\0"..., 4096, 5439841890304) = 4096 02:47:52.424942 pwrite64(4, "AB3C\0\0\1\364\0\10\20\177\0\0103\177\0\0\0\1\34\r\223\360\0\0\0\0\0\0\0\0"..., 4096, 2439997022208) = 4096 02:47:52.445298 pwrite64(4, "AB3B\0\0\1\363\0\2\244\177\377\377\377\377\0\0\0\0011\267\313X\0\0\0\0\0\0\0\0"..., 4096, 2626097164288) = 4096 02:47:52.471212 pwrite64(4, "IAB3\0\0\0\374\0\0\372\243\0\1?Z\0\0\0\0\332WE\250\0\0\0\0\0\0\0\0"..., 4096, 1875534106624) = 4096 02:47:52.506656 pwrite64(4, "AB3C\0\0\1\343\0\rJ\177\0\r\211\377\0\0\0\1\312\334\377\370\0\0\0\0\0\0\0\0"..., 4096, 3941605568512) = 4096 02:47:52.528377 pwrite64(4, "AB3B\0\0\1\346\0\25L\377\0\25T\177\0\0\0\2\217\226+\370\0\0\0\0\0\0\0\0"..., 4096, 5631446085632) = 4096 02:47:52.556351 pwrite64(4, "AB3C\0\0\1\356\0\5\230\377\0\5\370\177\0\0\0\0\0,\347\370\0\0\0\0\0\0\0\0"..., 4096, 1506799616) = 4096 02:47:52.557465 pwrite64(4, "AB3B\0\0\1\323\0\17\251\177\0\17\263\177\0\0\0\1]\307\353\370\0\0\0\0\0\0\0\0"..., 4096, 3004595433472) = 4096 02:47:52.585527 pwrite64(4, "AB3B\0\0\1\355\377\377\377\377\0\177b\377\0\0\0\0\310t\367\370\0\0\0\0\0\0\0\0"..., 4096, 1721911734272) = 4096 02:47:52.606012 pwrite64(4, "AB3C\0\0\1\356\0\201M\363\0\201Qn\0\0\0\0\310\204sH\0\0\0\0\0\0\0\0"..., 4096, 1722431213568) = 4096 02:47:52.633101 pwrite64(4, "AB3C\0\0\1\356\0\201Qi\0\201g~\0\0\0\0\310\204sp\0\0\0\0\0\0\0\0"..., 4096, 1722431234048) = 4096 02:47:52.638167 pwrite64(4, "AB3B\0\1\0\17\377\377\377\377\377\377\377\377\0\0\0\0\310t\374\260\0\0\0\0\0\0\0\0"..., 4096, 1721912352768) = 4096 02:47:52.644871 pwrite64(4, "AB3B\0\0\1\356\0\177a\377\0\177k\357\0\0\0\0\310t\377\370\0\0\0\0\0\0\0\0"..., 4096, 1721912782848) = 4096 02:47:52.646924 pwrite64(4, "IAB3\0\0\0\367\0\1\r\177\377\377\377\377\0\0\0\1\366$%\320\0\0\0\0\0\0\0\0"..., 4096, 4313360080896) = 4096 02:47:52.676932 pwrite64(4, "AB3C\0\0\1\366\0\22(\177\377\377\377\377\0\0\0\2\"U\347\370\0\0\0\0\0\0\0\0"..., 4096, 4692986818560) = 4096 02:47:52.702475 pwrite64(4, "AB3C\0\0\1\354\0\17\177\344\0\17\210\377\0\0\0\2M\351\337\30\0\0\0\0\0\0\0\0"..., 4096, 5067318898688) = 4096 02:47:52.719924 pwrite64(4, "AB3C\0\0\1\333\0F\245b\0V\341\177\0\0\0\2\247\35~p\0\0\0\0\0\0\0\0"..., 4096, 5833555238912) = 4096 02:47:52.735668 pwrite64(4, "AB3B\0\0\1\346\0\25H\177\0\25L\377\0\0\0\2\217\226\3\370\0\0\0\0\0\0\0\0"..., 4096, 5631440842752) = 4096 02:47:52.770246 pwrite64(4, "AB3C\0\0\1\350\377\377\377\377\0\3b\377\0\0\0\0\25\357\237\370\0\0\0\0\0\0\0\0"..., 4096, 188429103104) = 4096 02:47:52.797710 pwrite64(4, "AB3B\0\0\1\333\0\26\304\177\0\27\340f\0\0\0\2\f\255\373\370\0\0\0\0\0\0\0\0"..., 4096, 4506963668992) = 4096 02:47:52.833375 pwrite64(4, "AB3C\0\0\1\356\0\201M\352\0\201Qi\0\0\0\0\310\204W\230\0\0\0\0\0\0\0\0"..., 4096, 1722427584512) = 4096 02:47:52.859199 pwrite64(4, "AB3C\0\0\1\356\0\201M\331\0\201M\363\0\0\0\0\310\204WP\0\0\0\0\0\0\0\0"..., 4096, 1722427547648) = 4096 02:47:52.869045 pwrite64(4, "AB3C\0\0\1\356\0\20142\0\201M\352\0\0\0\0\310\204V\310\0\0\0\0\0\0\0\0"..., 4096, 1722427478016) = 4096 02:47:52.871796 pwrite64(4, "AB3B\0\0\1\346\0\16,\177\0\16|\377\0\0\0\1\211f\363\370\0\0\0\0\0\0\0\0"..., 4096, 3379298824192) = 4096 02:47:52.895758 pwrite64(4, "AB3B\0\0\1\347\0\3V\177\377\377\377\377\0\0\0\0\25\357\205\360\0\0\0\0\0\0\0\0"..., 4096, 188425691136) = 4096 02:47:52.918329 pwrite64(4, "IAB3\0\0\0\361\0\0X\302\0\0kj\0\0\0\1\5\373'\370\0\0\0\0\0\0\0\0"..., 4096, 2250400329728) = 4096 02:47:52.943883 pwrite64(4, "AB3B\0\0\1\330\0\3\6\357\0\3=\207\0\0\0\0m@#\370\0\0\0\0\0\0\0\0"..., 4096, 938455068672) = 4096 02:47:52.958139 pwrite64(4, "FIB3\0\0\0\3\377\377\377\377\377\377\377\377\0\0\0\0\360\223/\370\0\0\0\0\0\0\0\0"..., 4096, 2066523090944) = 4096 02:47:52.975676 pwrite64(4, "AB3B\0\0\1\346\0\25J\177\0\25O\177\0\0\0\2\217\226\27\370\0\0\0\0\0\0\0\0"..., 4096, 5631443464192) = 4096 02:47:52.997505 pwrite64(4, "IAB3\0\1\0\v\377\377\377\377\377\377\377\377\0\0\0\1\340Q\237\370\0\0\0\0\0\0\0\0"..., 4096, 4125907480576) = 4096 02:47:53.035356 pwrite64(4, "AB3B\0\0\1\362\0\2\203\177\0\3\325k\0\0\0\2c[\24X\0\0\0\0\0\0\0\0"..., 4096, 5251506155520) = 4096 02:47:53.055254 pwrite64(4, "AB3B\0\0\1\343\0\21\247\377\0\21\266\377\0\0\0\1H\3;\370\0\0\0\0\0\0\0\0"..., 4096, 2817607069696) = 4096 02:47:53.086518 pwrite64(4, "AB3C\0\0\1\344\0\4T;\0\5\37\24\0\0\0\1\6\34J@\0\0\0\0\0\0\0\0"..., 4096, 2251512119296) = 4096 02:47:53.109346 pwrite64(4, "FIB3\0\0\0\t\377\377\377\377\377\377\377\377\0\0\0\0W_\360\310\0\0\0\0\0\0\0\0"..., 4096, 750543540224) = 4096 02:47:53.134057 pwrite64(4, "AB3B\0\0\1\324\0\17\204\377\0\17\251\177\0\0\0\1]\307\273\370\0\0\0\0\0\0\0\0"..., 4096, 3004589142016) = 4096 02:47:53.165276 pwrite64(4, "AB3B\0\0\1\363\0\4@j\0\4R\265\0\0\0\0\203\36Cx\0\0\0\0\0\0\0\0"..., 4096, 1126296907776) = 4096 02:47:53.186167 pwrite64(4, "IAB3\0\0\0\361\0\0h\377\0\0\211\177\0\0\0\1\5\373;P\0\0\0\0\0\0\0\0"..., 4096, 2250402865152) = 4096 02:47:53.205893 pwrite64(4, "AB3C\0\0\1\354\0\17\210\377\0\17\214\277\0\0\0\2M\352\t\360\0\0\0\0\0\0\0\0"..., 4096, 5067324514304) = 4096 02:47:53.247846 pwrite64(4, "AB3C\0\0\1\347\0\3^\377\0\3c\377\0\0\0\0\25\357\277\370\0\0\0\0\0\0\0\0"..., 4096, 188433297408) = 4096 02:47:53.283471 pwrite64(4, "AB3B\0\0\1\321\377\377\377\377\0\7@\377\0\0\0\1sM\257\350\0\0\0\0\0\0\0\0"..., 4096, 3189472481280) = 4096 02:47:53.303361 pwrite64(4, "AB3C\0\1\0\t\377\377\377\377\377\377\377\377\0\0\0\0\25\357\247\370\0\0\0\0\0\0\0\0"..., 4096, 188430151680) = 4096 02:47:53.313834 pwrite64(4, "AB3B\0\0\1\364\0\2\v\177\0\3\2566\0\0\0\1\33\3468\30\0\0\0\0\0\0\0\0"..., 4096, 2438676361216) = 4096 02:47:53.343289 pwrite64(4, "AB3C\0\0\1\354\0\17\212>\0\17\236\377\0\0\0\2M\352\35\370\0\0\0\0\0\0\0\0"..., 4096, 5067327139840) = 4096 02:47:53.362889 pwrite64(4, "IAB3\0\0\0\353\0\1\303\177\0\1\321\177\0\0\0\2\244\316\333\370\0\0\0\0\0\0\0\0"..., 4096, 5813736828928) = 4096 02:47:53.412452 pwrite64(4, "AB3B\0\0\1\321\0Pz\377\377\377\377\377\0\0\0\1u\276\323\370\0\0\0\0\0\0\0\0"..., 4096, 3210448728064) = 4096 02:47:53.428451 pwrite64(4, "IAB3\0\0\0\352\0\1\320\177\0\2\1\177\0\0\0\2\244\316\343\370\0\0\0\0\0\0\0\0"..., 4096, 5813737877504) = 4096 02:47:53.429136 pwrite64(4, "IAB3\0\0\0\372\0\fn\377\0\f\230R\0\0\0\0\360\207[h\0\0\0\0\0\0\0\0"..., 4096, 2066126131200) = 4096 02:47:53.450344 pwrite64(4, "AB3C\0\0\1\366\0\22\20\177\0\22/\377\0\0\0\2\"U\253\370\0\0\0\0\0\0\0\0"..., 4096, 4692978954240) = 4096 02:47:53.470124 pwrite64(4, "AB3C\0\0\1\357\0\17f\177\0\20\0\177\0\0\0\1\237H#\370\0\0\0\0\0\0\0\0"..., 4096, 3567243489280) = 4096 02:47:53.495473 pwrite64(4, "AB3C\0\0\1\346\0\25\261\177\0\25\316\377\0\0\0\2\217\231\347\370\0\0\0\0\0\0\0\0"..., 4096, 5631571390464) = 4096 02:47:53.514631 pwrite64(4, "AB3B\0\0\1\343\0\21\203\377\0\21\254\177\0\0\0\1H\3\27\370\0\0\0\0\0\0\0\0"..., 4096, 2817602351104) = 4096 02:47:53.537791 pwrite64(4, "IAB3\0\0\0\373\0\3\341\177\0\4\f\177\0\0\0\0\0 #\370\0\0\0\0\0\0\0\0"..., 4096, 1078456320) = 4096 02:47:53.568091 pwrite64(4, "AB3C\0\0\1\343\0\r<\377\0\rf\377\0\0\0\1\312\334\33\370\0\0\0\0\0\0\0\0"..., 4096, 3941575684096) = 4096 02:47:53.601665 pwrite64(4, "AB3B\0\0\1\363\0\2\177\16\0\2\323k\0\0\0\0011\266S\370\0\0\0\0\0\0\0\0"..., 4096, 2626047963136) = 4096 02:47:53.636688 pwrite64(4, "AB3C\0\0\1\323\0\3\376\263\0\4\237\"\0\0\0\0A\237A\230\0\0\0\0\0\0\0\0"..., 4096, 563689500672) = 4096 02:47:53.661401 pwrite64(4, "AB3B\0\0\1\355\0\5fp\0\5p\177\0\0\0\0\0+K\370\0\0\0\0\0\0\0\0"..., 4096, 1452797952) = 4096 02:47:53.692116 pwrite64(4, "AB3B\0\1\0\r\377\377\377\377\377\377\377\377\0\0\0\1\366(7\360\0\0\0\0\0\0\0\0"..., 4096, 4313496674304) = 4096 02:47:53.723339 pwrite64(4, "IAB3\0\0\0\367\0\2\254X\0\2\270:\0\0\0\0\203\21\261\250\0\0\0\0\0\0\0\0"..., 4096, 1125875142656) = 4096 02:47:53.744678 pwrite64(4, "IAB3\0\0\0\367\0\2\2705\0\2\357C\0\0\0\0\203\21\261\320\0\0\0\0\0\0\0\0"..., 4096, 1125875163136) = 4096 02:47:53.745874 pwrite64(4, "IAB3\0\0\0\356\0\1m\177\0\1\206\244\0\0\0\1\33\330\274\350\0\0\0\0\0\0\0\0"..., 4096, 2438224007168) = 4096 02:47:53.772745 pwrite64(4, "IAB3\0\0\0\356\0\1\206\235\0\1\224&\0\0\0\1\33\330\275 \0\0\0\0\0\0\0\0"..., 4096, 2438224035840) = 4096 02:47:53.774076 pwrite64(4, "IAB3\0\1\0\v\377\377\377\377\377\377\377\377\0\0\0\0+\255\251\230\0\0\0\0\0\0\0\0"..., 4096, 375194333184) = 4096 02:47:53.801967 pwrite64(4, "IAB3\0\0\0\365\0\0.\36\0\0\261\274\0\0\0\2MsC \0\0\0\0\0\0\0\0"..., 4096, 5063339032576) = 4096 02:47:53.823792 pwrite64(4, "IAB3\0\0\0\365\0\0\261d\0\0\261\277\0\0\0\2MsE\340\0\0\0\0\0\0\0\0"..., 4096, 5063339393024) = 4096 02:47:53.850605 pwrite64(4, "IAB3\0\0\0\365\0\0\261\274\0\2\253\177\0\0\0\2MsE\370\0\0\0\0\0\0\0\0"..., 4096, 5063339405312) = 4096 02:47:53.870149 pwrite64(4, "AB3C\0\0\1\364\0\10\r7\0\10!~\0\0\0\1\34\r\v\370\0\0\0\0\0\0\0\0"..., 4096, 2439979200512) = 4096 02:47:53.896086 pwrite64(4, "AB3B\0\0\1\355\0\5T\177\0\5fp\0\0\0\0\0+#\370\0\0\0\0\0\0\0\0"..., 4096, 1447555072) = 4096 02:47:53.928255 pwrite64(4, "IAB3\0\0\0\373\0\2\20\370\0\4\271\377\0\0\0\0\332s\21\330\0\0\0\0\0\0\0\0"..., 4096, 1876466839552) = 4096 02:47:53.964466 pwrite64(4, "AB3C\0\1\0\17\377\377\377\377\377\377\377\377\0\0\0\1\264\342\3\370\0\0\0\0\0\0\0\0"..., 4096, 3752795303936) = 4096 02:47:53.989445 pwrite64(4, "IAB3\0\0\0\370\0\2\253\372\0\2\2705\0\0\0\0\203\21R\300\0\0\0\0\0\0\0\0"..., 4096, 1125862703104) = 4096 02:47:54.006287 pwrite64(4, "AB3C\0\0\1\354\0\17\214\277\0\30G\177\0\0\0\2M\352\257\370\0\0\0\0\0\0\0\0"..., 4096, 5067346276352) = 4096 02:47:54.027700 pwrite64(4, "FIB3\0\0\0\10\377\377\377\377\377\377\377\377\0\0\0\1sMZ\30\0\0\0\0\0\0\0\0"..., 4096, 3189461233664) = 4096 02:47:54.057658 pwrite64(4, "AB3B\0\0\1\356\0\177k\357\0\177s\357\0\0\0\0\310uG\340\0\0\0\0\0\0\0\0"..., 4096, 1721922207744) = 4096 02:47:54.079707 pwrite64(4, "AB3B\0\0\1\362\0\3\325k\377\377\377\377\0\0\0\2ca\367\370\0\0\0\0\0\0\0\0"..., 4096, 5251737317376) = 4096 02:47:54.102582 pwrite64(4, "AB3B\0\0\1\356\0\177b\377\0\177k\374\0\0\0\0\310uGx\0\0\0\0\0\0\0\0"..., 4096, 1721922154496) = 4096 02:47:54.121275 pwrite64(4, "AB3B\0\0\1\347\0\2\312 \0\4\261\367\0\0\0\2\217\17\363\370\0\0\0\0\0\0\0\0"..., 4096, 5626942451712) = 4096 02:47:54.152799 pwrite64(4, "AB3B\0\0\1\355\0\5d\177\0\5i\177\0\0\0\0\0+3\200\0\0\0\0\0\0\0\0"..., 4096, 1449590784) = 4096 02:47:54.187879 pwrite64(4, "IAB3\0\0\0\373\0\4\4\177\0\4\223\177\0\0\0\0\0 c\370\0\0\0\0\0\0\0\0"..., 4096, 1086844928) = 4096 02:47:54.215438 pwrite64(4, "AB3B\0\0\1\322\0\7O\377\0\7g\177\0\0\0\1sZ\v\370\0\0\0\0\0\0\0\0"..., 4096, 3189887201280) = 4096 02:47:54.246956 pwrite64(4, "IAB3\0\0\0\370\0\2\242\377\0\2\254X\0\0\0\0\203\21O\320\0\0\0\0\0\0\0\0"..., 4096, 1125862318080) = 4096 02:47:54.263497 pwrite64(4, "AB3C\0\0\1\364\0\7\346\177\0\10\20\177\0\0\0\1\34\f\361\270\0\0\0\0\0\0\0\0"..., 4096, 2439975759872) = 4096 02:47:54.293169 pwrite64(4, "AB3C\0\0\1\323\0\4)3\0\4\301\373\0\0\0\0A\242\361\20\0\0\0\0\0\0\0\0"..., 4096, 563813163008) = 4096 02:47:54.316885 pwrite64(4, "IAB3\0\0\0\372\0\r\345\205\377\377\377\377\0\0\0\0\360\222\257\370\0\0\0\0\0\0\0\0"..., 4096, 2066506313728) = 4096 02:47:54.339691 pwrite64(4, "AB3C\0\0\1\344\0\10\247\177\0\27\302\377\0\0\0\1\264\342c\370\0\0\0\0\0\0\0\0"..., 4096, 3752807886848) = 4096 02:47:54.370458 pwrite64(4, "IAB3\0\0\0\374\0\1\26\265\0\2\20\370\0\0\0\0\332X\212\320\0\0\0\0\0\0\0\0"..., 4096, 1875576725504) = 4096 02:47:54.396145 pwrite64(4, "AB3B\0\0\1\343\0\21\254\177\0\21\321\177\0\0\0\1H\3\217\370\0\0\0\0\0\0\0\0"..., 4096, 2817618079744) = 4096 02:47:54.426296 pwrite64(4, "IAB3\0\0\0\357\0\0\10\177\0\1\27v\0\0\0\0\256\246\20\260\0\0\0\0\0\0\0\0"..., 4096, 1500220841984) = 4096 02:47:54.456962 pwrite64(4, "AB3B\0\0\1\337\0\1U\226\0\1\365C\0\0\0\1\366(\346\240\0\0\0\0\0\0\0\0"..., 4096, 4313519570944) = 4096 02:47:54.484274 pwrite64(4, "IAB3\0\0\0\355\377\377\377\377\0\0v\210\0\0\0\2y\27\34p\0\0\0\0\0\0\0\0"..., 4096, 5438204076032) = 4096 02:47:54.505561 pwrite64(4, "IAB3\0\0\0\373\0\0\322]\0\1l\251\0\0\0\0\0\10\276\20\0\0\0\0\0\0\0\0"..., 4096, 293347328) = 4096 02:47:54.531563 pwrite64(4, "AB3C\0\0\1\343\0\10\204\177\0\10\250\177\0\0\0\1\264\342[\370\0\0\0\0\0\0\0\0"..., 4096, 3752806838272) = 4096 02:47:54.532734 pwrite64(4, "IAB3\0\0\0\371\0\2\241\177\0\3=-\0\0\0\2!\3329\220\0\0\0\0\0\0\0\0"..., 4096, 4688836763648) = 4096 02:47:54.562357 pwrite64(4, "IAB3\0\0\0\360\0\1a_\0\2M\377\0\0\0\0\25\340\360X\0\0\0\0\0\0\0\0"..., 4096, 187936321536) = 4096 02:47:54.596910 pwrite64(4, "AB3B\0\0\1\357\0\3!B\0\4\242\177\0\0\0\1\236\346\33\360\0\0\0\0\0\0\0\0"..., 4096, 3563954102272) = 4096 02:47:54.639237 pwrite64(4, "AB3C\0\0\1\336\0\2y\375\0\2|\177\0\0\0\0Wf{\370\0\0\0\0\0\0\0\0"..., 4096, 750763110400) = 4096 02:47:54.674795 pwrite64(4, "IAB3\0\0\0\355\0\0\2\216\0\0\343z\0\0\0\2y\32\274@\0\0\0\0\0\0\0\0"..., 4096, 5438325686272) = 4096 02:47:54.701243 pwrite64(4, "AB3C\0\1\0\17\377\377\377\377\377\377\377\377\0\0\0\0Wfp`\0\0\0\0\0\0\0\0"..., 4096, 750761590784) = 4096 02:47:54.717611 pwrite64(4, "AB3B\0\0\1\356\0\177k\374\0\200\n\177\0\0\0\0\310u\207x\0\0\0\0\0\0\0\0"..., 4096, 1721930543104) = 4096 02:47:54.757337 pwrite64(4, "XAGF\0\0\0\1\0\0\0\35\2\272\225\0\0\3\323\177\0D~\177\0\0\0\0\0\0\0\2"..., 512, 5438201397760) = 512 02:47:54.785649 pwrite64(4, "XAFL\0\0\0\35\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 5438201398784) = 512 02:47:54.786143 pwrite64(4, "XAGI\0\0\0\1\0\0\0\35\2\272\225\0\0\2\213@\0\0007\10\0\0\0\2\0\0\0&"..., 512, 5438201398272) = 512 02:47:54.786807 pwrite64(4, "AB3C\0\0\1\363\0\3\24x\0\3\360F\0\0\0\0011\275#\340\0\0\0\0\0\0\0\0"..., 4096, 2626276540416) = 4096 02:47:54.817873 pwrite64(4, "IAB3\0\0\0\353\0\1\252\303\0\1\320\177\0\0\0\2\244\316s\370\0\0\0\0\0\0\0\0"..., 4096, 5813723197440) = 4096 02:47:54.845836 pwrite64(4, "IAB3\0\0\0\372\0\fad\0\f\204m\0\0\0\0\360\206\257\370\0\0\0\0\0\0\0\0"..., 4096, 2066103660544) = 4096 02:47:54.879266 pwrite64(4, "AB3C\0\0\1\337\377\377\377\377\0\2{\177\0\0\0\0Wfo\350\0\0\0\0\0\0\0\0"..., 4096, 750761529344) = 4096 02:47:54.883230 pwrite64(4, "IAB3\0\0\0\367\0\0\336\313\0\1!\272\0\0\0\1\366#\203\370\0\0\0\0\0\0\0\0"..., 4096, 4313338867712) = 4096 02:47:54.905728 pwrite64(4, "AB3C\0\0\1\363\0\5(\203\0\5\240?\0\0\0\2cm\np\0\0\0\0\0\0\0\0"..., 4096, 5252108836864) = 4096 02:47:54.949653 pwrite64(4, "AB3B\0\0\1\353\0\7-\254\0\7\225U\0\0\0\0027\324\345\350\0\0\0\0\0\0\0\0"..., 4096, 4877636587520) = 4096 02:47:54.991147 pwrite64(4, "IAB3\0\0\0\370\0\1#\223\0\2\253\372\0\0\0\0\203\21\7\370\0\0\0\0\0\0\0\0"..., 4096, 1125852901376) = 4096 02:47:55.030735 pwrite64(4, "AB3B\0\0\1\363\0\4\0165\0\4Jo\0\0\0\0\203\35\363P\0\0\0\0\0\0\0\0"..., 4096, 1126286401536) = 4096 02:47:55.052204 pwrite64(4, "AB3B\0\0\1\330\0\2\350\343\0\3\33\177\0\0\0\0m?\177x\0\0\0\0\0\0\0\0"..., 4096, 938433507328) = 4096 02:47:55.070055 pwrite64(4, "IAB3\0\0\0\372\0\r<5\0\r\356\377\0\0\0\0\360\222d(\0\0\0\0\0\0\0\0"..., 4096, 2066496376832) = 4096 02:47:55.087615 pwrite64(4, "AB3C\0\0\1\347\0\25\233\177\0\25\306\377\0\0\0\2\217\231;\370\0\0\0\0\0\0\0\0"..., 4096, 5631548846080) = 4096 02:47:55.130788 pwrite64(4, "IAB3\0\0\0\353\0\0\205\312\0\0\277\26\0\0\0\1\312v7\370\0\0\0\0\0\0\0\0"..., 4096, 3938156802048) = 4096 02:47:55.156231 pwrite64(4, "IAB3\0\0\0\363\0\1\265\177\0\1\324\374\0\0\0\0+\267r\300\0\0\0\0\0\0\0\0"..., 4096, 375522689024) = 4096 02:47:55.187104 pwrite64(4, "AB3B\0\0\1\337\0\2j\377\377\377\377\377\0\0\0\0WfO\370\0\0\0\0\0\0\0\0"..., 4096, 750757343232) = 4096 02:47:55.214048 pwrite64(4, "IAB3\0\0\0\360\0\0\365Y\0\1\211\v\0\0\0\0\25\337\262\370\0\0\0\0\0\0\0\0"..., 4096, 187894722560) = 4096 02:47:55.235970 pwrite64(4, "AB3B\0\0\1\322\0\7\\\177\0\7i\177\0\0\0\1sZc\370\0\0\0\0\0\0\0\0"..., 4096, 3189898735616) = 4096 02:47:55.281338 pwrite64(4, "AB3C\0\0\1\352\0b\36\177\0j/\177\0\0\0\1\343y\237\370\0\0\0\0\0\0\0\0"..., 4096, 4153019461632) = 4096 02:47:55.315070 pwrite64(4, "AB3B\0\0\1\355\0\5p\177\0\5w\377\0\0\0\0\0+\247\370\0\0\0\0\0\0\0\0"..., 4096, 1464856576) = 4096 02:47:55.346587 pwrite64(4, "AB3B\0\0\1\322\0\7i\177\0\7{\377\0\0\0\1sZ{\370\0\0\0\0\0\0\0\0"..., 4096, 3189901881344) = 4096 02:47:55.382846 pwrite64(4, "IAB3\0\0\0\361\0\0kj\0\0017T\0\0\0\1\5\374+\370\0\0\0\0\0\0\0\0"..., 4096, 2250434408448) = 4096 02:47:55.418729 pwrite64(4, "AB3C\0\0\1\344\0\3\20D\0\4\6\364\0\0\0\1\6\26\327\360\0\0\0\0\0\0\0\0"..., 4096, 2251329363968) = 4096 02:47:55.454404 pwrite64(4, "AB3B\0\0\1\360\0\6\34\177\0%\337\377\0\0\0\2yHw\360\0\0\0\0\0\0\0\0"..., 4096, 5439860236288) = 4096 02:47:55.483127 pwrite64(4, "AB3B\0\0\1\322\0\7g\177\0\7j\177\0\0\0\1sZs\370\0\0\0\0\0\0\0\0"..., 4096, 3189900832768) = 4096 02:47:55.487396 pwrite64(4, "AB3B\0\1\0\16\377\377\377\377\377\377\377\377\0\0\0\0A\207?\370\0\0\0\0\0\0\0\0"..., 4096, 562883981312) = 4096 02:47:55.502528 pwrite64(4, "AB3B\0\0\1\357\0\0\210\357\0\0025\376\0\0\0\1\236\323\344\200\0\0\0\0\0\0\0\0"..., 4096, 3563342856192) = 4096 02:47:55.535148 pwrite64(4, "AB3C\0\0\1\352\0ja\377\0jm~\0\0\0\1\343\231\277\370\0\0\0\0\0\0\0\0"..., 4096, 4154097397760) = 4096 02:47:55.565760 pwrite64(4, "AB3B\0\0\1\355\0\5t\377\0\5\206\35\0\0\0\0\0+\277\370\0\0\0\0\0\0\0\0"..., 4096, 1468002304) = 4096 02:47:55.591910 pwrite64(4, "AB3C\0\0\1\364\0\4\4B\0\4\33\31\0\0\0\0011\301V\370\0\0\0\0\0\0\0\0"..., 4096, 2626417455104) = 4096 02:47:55.621253 pwrite64(4, "AB3B\0\0\1\364\0\0054\177\0\5\372\377\0\0\0\1\33\373\267\370\0\0\0\0\0\0\0\0"..., 4096, 2439397765120) = 4096 02:47:55.630658 pwrite64(4, "AB3C\0\0\1\346\0\26\371@\0&\30\377\0\0\0\2\220\n\273\370\0\0\0\0\0\0\0\0"..., 4096, 5635357274112) = 4096 02:47:55.658832 pwrite64(4, "AB3C\0\0\1\323\0\17\370\377\377\377\377\377\0\0\0\1]\314O\360\0\0\0\0\0\0\0\0"..., 4096, 3004742754304) = 4096 02:47:55.675929 pwrite64(4, "AB3B\0\0\1\355\0\5i\177\0\5t\377\0\0\0\0\0+\203\370\0\0\0\0\0\0\0\0"..., 4096, 1460137984) = 4096 02:47:55.692679 pwrite64(4, "AB3C\0\0\1\364\0\3\360F\0\4\4\337\0\0\0\0011\301R\20\0\0\0\0\0\0\0\0"..., 4096, 2626416812032) = 4096 02:47:55.727069 pwrite64(4, "AB3C\0\0\1\356\0\3\215H\0\3\227\314\0\0\0\0+\305\311\10\0\0\0\0\0\0\0\0"..., 4096, 376003760128) = 4096 02:47:55.751299 pwrite64(4, "AB3C\0\0\1\357\0\5\233\33\377\377\377\377\0\0\0\0\256\326\0(\0\0\0\0\0\0\0\0"..., 4096, 1501829287936) = 4096 02:47:55.783013 pwrite64(4, "AB3B\0\0\1\362\0\3\26\213\0\3\362\377\0\0\0\2ca\vX\0\0\0\0\0\0\0\0"..., 4096, 5251706302464) = 4096 02:47:55.825930 pwrite64(4, "AB3B\0\0\1\342\0\22-\310\377\377\377\377\0\0\0\1H\7[\370\0\0\0\0\0\0\0\0"..., 4096, 2817745481728) = 4096 02:47:55.856379 pwrite64(4, "AB3C\0\0\1\343\377\377\377\377\0\0223\177\0\0\0\1H\7_\370\0\0\0\0\0\0\0\0"..., 4096, 2817746006016) = 4096 02:47:55.860612 pwrite64(4, "AB3C\0\0\1\344\0\4F\375\0\4\215H\0\0\0\1\6\32\201\330\0\0\0\0\0\0\0\0"..., 4096, 2251452297216) = 4096 02:47:55.890976 pwrite64(4, "AB3C\0\0\1\356\0\3\177\374\0\3\217!\0\0\0\0+\305\272@\0\0\0\0\0\0\0\0"..., 4096, 376001822720) = 4096 02:47:55.912631 pwrite64(4, "AB3C\0\0\1\343\0\5\25\377\0\nDu\0\0\0\1\312\232\241\340\0\0\0\0\0\0\0\0"..., 4096, 3939378642944) = 4096 02:47:55.931604 pwrite64(4, "IAB3\0\0\0\373\0\f\32\17\0\fad\0\0\0\0\360\206@\250\0\0\0\0\0\0\0\0"..., 4096, 2066089070592) = 4096 02:47:55.956732 pwrite64(4, "IAB3\0\0\0\372\0\fa\25\0\fn\377\0\0\0\0\360\206C \0\0\0\0\0\0\0\0"..., 4096, 2066089394176) = 4096 02:47:55.957882 pwrite64(4, "IAB3\0\0\0\373\0\3\253\317\0\4\4\177\0\0\0\0\0\37\v\370\0\0\0\0\0\0\0\0"..., 4096, 1041756160) = 4096 02:47:55.987923 pwrite64(4, "AB3C\0\0\1\322\0W\220\177\0X\271\377\0\0\0\1u\335\v\370\0\0\0\0\0\0\0\0"..., 4096, 3211462701056) = 4096 02:47:56.013799 pwrite64(4, "AB3B\0\0\1\356\0\5'\177\0\5T\177\0\0\0\0\0*g\340\0\0\0\0\0\0\0\0"..., 4096, 1422901248) = 4096 02:47:56.044970 pwrite64(4, "AB3C\0\0\1\352\0ji\377\0kD\250\0\0\0\1\343\231\333\360\0\0\0\0\0\0\0\0"..., 4096, 4154101063680) = 4096 02:47:56.068430 pwrite64(4, "AB3C\0\0\1\356\0\35p\177\0\35\205\377\0\0\0\1\237\264\33\370\0\0\0\0\0\0\0\0"..., 4096, 3570866319360) = 4096 02:47:56.091761 pwrite64(4, "AB3B\0\0\1\342\0\22#.\0\0220\177\0\0\0\1H\7F@\0\0\0\0\0\0\0\0"..., 4096, 2817742635008) = 4096 02:47:56.137534 pwrite64(4, "IAB3\0\0\0\373\377\377\377\377\0\0\310\325\0\0\0\0\0\0\345(\0\0\0\0\0\0\0\0"..., 4096, 30035968) = 4096 02:47:56.186565 pwrite64(4, "AB3B\0\0\1\357\0\3\234\t\0\3\245~\0\0\0\0\256\302;\370\0\0\0\0\0\0\0\0"..., 4096, 1501166039040) = 4096 02:47:56.207859 pwrite64(4, "AB3C\0\0\1\343\0\0223\377\0\22\234\177\0\0\0\1H\7{\370\0\0\0\0\0\0\0\0"..., 4096, 2817749676032) = 4096 02:47:56.219932 pwrite64(4, "XAFL\0\0\0\f\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 2250290234880) = 512 02:47:56.238401 pwrite64(4, "XAGI\0\0\0\1\0\0\0\f\2\272\225\0\0\2\322@\0\0X\277\0\0\0\2\0\0\0\230"..., 512, 2250290234368) = 512 02:47:56.238853 pwrite64(4, "XAGF\0\0\0\1\0\0\0\f\2\272\225\0\0\1\373~\0\2\201|\0\0\0\0\0\0\0\2"..., 512, 2250290233856) = 512 02:47:56.239178 pwrite64(4, "AB3C\0\0\1\337\0\2\205\177\0\2\226\177\0\0\0\0Wf\367\370\0\0\0\0\0\0\0\0"..., 4096, 750779363328) = 4096 02:47:56.261346 pwrite64(4, "AB3C\0\0\1\352\0jm~\0l[\377\0\0\0\1\343\240\225@\0\0\0\0\0\0\0\0"..., 4096, 4154326679552) = 4096 02:47:56.287172 pwrite64(4, "IAB3\0\1\0\26\377\377\377\377\377\377\377\377\0\0\0\0\0\0\350@\0\0\0\0\0\0\0\0"..., 4096, 30441472) = 4096 02:47:56.305097 pwrite64(4, "IAB3\0\0\0\373\0\2DU\0\2\273\336\0\0\0\0\0\23\213\350\0\0\0\0\0\0\0\0"..., 4096, 655872000) = 4096 02:47:56.340596 pwrite64(4, "AB3C\0\0\1\342\0\0220\377\0\0223\377\0\0\0\1H\7s\370\0\0\0\0\0\0\0\0"..., 4096, 2817748627456) = 4096 02:47:56.341275 pwrite64(4, "AB3B\0\0\1\357\0\3\225\4\0\3\237\177\0\0\0\0\256\302 H\0\0\0\0\0\0\0\0"..., 4096, 1501162409984) = 4096 02:47:56.359567 pwrite64(4, "IAB3\0\0\0\367\0\0\232C\0\0\262,\0\0\0\0\230\325\274H\0\0\0\0\0\0\0\0"..., 4096, 1312841830400) = 4096 02:47:56.376592 pwrite64(4, "AB3C\0\0\1\343\0\0223\177\0\0224\177\0\0\0\1H\7w\370\0\0\0\0\0\0\0\0"..., 4096, 2817749151744) = 4096 02:47:56.377809 pwrite64(4, "AB3C\0\0\1\337\377\377\377\377\0\4\24\304\0\0\0\1\3667_\370\0\0\0\0\0\0\0\0"..., 4096, 4314005237760) = 4096 02:47:56.401954 pwrite64(4, "AB3B\0\0\1\346\0\16d\177\0\16\256\220\0\0\0\1\211g\267\370\0\0\0\0\0\0\0\0"..., 4096, 3379324514304) = 4096 02:47:56.424841 pwrite64(4, "AB3C\0\1\0\16\377\377\377\377\377\377\377\377\0\0\0\1H\7o\360\0\0\0\0\0\0\0\0"..., 4096, 2817748099072) = 4096 02:47:56.444570 pwrite64(4, "AB3C\0\0\1\333\0\222\350\377\0\224Q\377\0\0\0\2\20\217\363\370\0\0\0\0\0\0\0\0"..., 4096, 4540315725824) = 4096 02:47:56.470542 pwrite64(4, "IAB3\0\0\0\356\0\1\224;\0\1\252\377\0\0\0\1\33\331\246x\0\0\0\0\0\0\0\0"..., 4096, 2438254620672) = 4096 02:47:56.515096 pwrite64(4, "AB3B\0\0\1\343\0\10+\377\0\10z\177\0\0\0\1\264\336\307\370\0\0\0\0\0\0\0\0"..., 4096, 3752686776320) = 4096 02:47:56.552172 pwrite64(4, "IAB3\0\0\0\361\0\6\247\312\0\10uT\0\0\0\1\2117w\370\0\0\0\0\0\0\0\0"..., 4096, 3377705512960) = 4096 02:47:56.571731 pwrite64(4, "AB3C\0\0\1\362\377\377\377\377\0\16\335\177\0\0\0\0\360\231\22\350\0\0\0\0\0\0\0\0"..., 4096, 2066720608256) = 4096 02:47:56.599488 pwrite64(4, "IAB3\0\0\0\373\0\0\335\177\377\377\377\377\0\0\0\0011\251\0330\0\0\0\0\0\0\0\0"..., 4096, 2625604313088) = 4096 02:47:56.627680 pwrite64(4, "IAB3\0\0\0\361\0\10t\377\0\10\255\177\0\0\0\1\2117z\240\0\0\0\0\0\0\0\0"..., 4096, 3377705861120) = 4096 02:47:56.646775 pwrite64(4, "IAB3\0\0\0\363\0\1\304X\0\1\3302\0\0\0\0+\267\367\340\0\0\0\0\0\0\0\0"..., 4096, 375540137984) = 4096 02:47:56.696180 pwrite64(4, "AB3C\0\0\1\337\0\2\204\177\0\2\212\377\0\0\0\0Wf\313\370\0\0\0\0\0\0\0\0"..., 4096, 750773596160) = 4096 02:47:56.715216 pwrite64(4, "AB3C\0\0\1\357\0\17=\177\0\17\365\177\0\0\0\1\237C\253\370\0\0\0\0\0\0\0\0"..., 4096, 3567093542912) = 4096 02:47:56.737291 pwrite64(4, "AB3C\0\0\1\337\0\2\202\177\0\2\205\177\0\0\0\0Wf\303\370\0\0\0\0\0\0\0\0"..., 4096, 750772547584) = 4096 02:47:56.738296 pwrite64(4, "AB3C\0\1\0\21\377\377\377\377\377\377\377\377\0\0\0\1\312\232\26X\0\0\0\0\0\0\0\0"..., 4096, 3939360354304) = 4096 02:47:56.773064 pwrite64(4, "AB3C\0\0\1\327\0\4S\377\377\377\377\377\0\0\0\0mJ\7\370\0\0\0\0\0\0\0\0"..., 4096, 938786942976) = 4096 02:47:56.795944 pwrite64(4, "AB3B\0\0\1\324\0\2d\373\0\2\204r\0\0\0\0A\221\302H\0\0\0\0\0\0\0\0"..., 4096, 563236605952) = 4096 02:47:56.829384 pwrite64(4, "IAB3\0\0\0\356\0\1\243\317\377\377\377\377\0\0\0\1\33\331\337\370\0\0\0\0\0\0\0\0"..., 4096, 2438262157312) = 4096 02:47:56.850171 pwrite64(4, "AB3C\0\0\1\337\0\2\200B\0\2\204\177\0\0\0\0Wf\263\370\0\0\0\0\0\0\0\0"..., 4096, 750770450432) = 4096 02:47:56.875031 pwrite64(4, "AB3B\0\0\1\322\0\7{\377\0I\337\177\0\0\0\1s[\r\360\0\0\0\0\0\0\0\0"..., 4096, 3189921013760) = 4096 02:47:56.907033 pwrite64(4, "AB3B\0\0\1\357\0\3\237\177\0\3\266\371\0\0\0\0\256\302k\360\0\0\0\0\0\0\0\0"..., 4096, 1501172326400) = 4096 02:47:56.923989 pwrite64(4, "AB3C\0\1\0\r\377\377\377\377\377\377\377\377\0\0\0\0\360\231cP\0\0\0\0\0\0\0\0"..., 4096, 2066731147264) = 4096 02:47:56.944973 pwrite64(4, "XAGI\0\0\0\1\0\0\0\t\2\272\225\0\0\2\244\0\0V\221x\0\0\0\2\0\0\0007"..., 512, 1687717676032) = 512 02:47:56.957336 pwrite64(4, "XAFL\0\0\0\t\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 1687717676544) = 512 02:47:56.957790 pwrite64(4, "XAGF\0\0\0\1\0\0\0\t\2\272\225\0\0\177b\226\0\200\362\177\0\0\0\0\0\0\0\2"..., 512, 1687717675520) = 512 02:47:56.958558 pwrite64(4, "AB3C\0\0\1\356\0\3P\177\0\3\215H\0\0\0\0+\305O\340\0\0\0\0\0\0\0\0"..., 4096, 375987879936) = 4096 02:47:56.981446 pwrite64(4, "AB3B\0\0\1\322\0\7j\177\0\7|\276\0\0\0\1s[\7\370\0\0\0\0\0\0\0\0"..., 4096, 3189920231424) = 4096 02:47:57.005640 pwrite64(4, "AB3C\0\0\1\337\0\2~\177\0\2\202\177\0\0\0\0Wf\242\20\0\0\0\0\0\0\0\0"..., 4096, 750768103424) = 4096 02:47:57.029513 pwrite64(4, "AB3C\0\0\1\347\0\25\214\177\0\25\261\177\0\0\0\2\217\230\213\370\0\0\0\0\0\0\0\0"..., 4096, 5631525777408) = 4096 02:47:57.059392 pwrite64(4, "AB3B\0\0\1\352\377\377\377\377\0\5&\377\0\0\0\1\340g\367\370\0\0\0\0\0\0\0\0"..., 4096, 4126657212416) = 4096 02:47:57.085696 pwrite64(4, "FIB3\0\0\0\v\377\377\377\377\377\377\377\377\0\0\0\1\33\331\340\340\0\0\0\0\0\0\0\0"..., 4096, 2438262276096) = 4096 02:47:57.106990 pwrite64(4, "AB3C\0\0\1\337\0\2|\177\0\2\200B\0\0\0\0Wf\223\370\0\0\0\0\0\0\0\0"..., 4096, 750766256128) = 4096 02:47:57.167575 pwrite64(4, "IAB3\0\0\0\355\0\2\217|\0\2\2408\0\0\0\2y+\210@\0\0\0\0\0\0\0\0"..., 4096, 5438889295872) = 4096 02:47:57.204813 pwrite64(4, "IAB3\0\0\0\367\0\1\347|\0\2\263\177\0\0\0\0027\255g\370\0\0\0\0\0\0\0\0"..., 4096, 4876311457792) = 4096 02:47:57.248955 pwrite64(4, "IAB3\0\0\0\355\0\1\242e\0\2\220\10\0\0\0\2y+\203\340\0\0\0\0\0\0\0\0"..., 4096, 5438888722432) = 4096 02:47:57.282676 pwrite64(4, "IAB3\0\1\0\v\377\377\377\377\377\377\377\377\0\0\0\1\236\310\304@\0\0\0\0\0\0\0\0"..., 4096, 3562969530368) = 4096 02:47:57.335471 pwrite64(4, "IAB3\0\0\0\354\377\377\377\377\0\0\37\212\0\0\0\1\236\310\300h\0\0\0\0\0\0\0\0"..., 4096, 3562969026560) = 4096 02:47:57.354338 pwrite64(4, "AB3C\0\0\1\327\0\3\324 \0\4P\272\0\0\0\0mF:\260\0\0\0\0\0\0\0\0"..., 4096, 938659373056) = 4096 02:47:57.374873 pwrite64(4, "AB3C\0\0\1\353\0\tM\266\0\t\313\377\0\0\0\0027\346\277\370\0\0\0\0\0\0\0\0"..., 4096, 4878235594752) = 4096 02:47:57.427741 pwrite64(4, "AB3C\0\0\1\344\0\4/\210\0\4T;\0\0\0\1\6\32\27\350\0\0\0\0\0\0\0\0"..., 4096, 2251438411776) = 4096 02:47:57.471753 pwrite64(4, "AB3C\0\0\1\337\0\2{\177\0\2~\177\0\0\0\0Wf\203\370\0\0\0\0\0\0\0\0"..., 4096, 750764158976) = 4096 02:47:57.493013 pwrite64(4, "AB3B\0\0\1\330\0\2\301\2\0\2\350\343\0\0\0\0m>[\370\0\0\0\0\0\0\0\0"..., 4096, 938395299840) = 4096 02:47:57.517406 pwrite64(4, "AB3C\0\0\1\337\0\2\231\177\0\2\235\377\0\0\0\0Wg~ \0\0\0\0\0\0\0\0"..., 4096, 750796947456) = 4096 02:47:57.529349 pwrite64(4, "IAB3\0\0\0\366\377\377\377\377\0\21h\177\0\0\0\1G\214uP\0\0\0\0\0\0\0\0"..., 4096, 2813621608448) = 4096 02:47:57.550438 pwrite64(4, "AB3B\0\0\1\364\0\5\345\377\0\6\20\377\0\0\0\1\33\374_\370\0\0\0\0\0\0\0\0"..., 4096, 2439419785216) = 4096 02:47:57.571869 pwrite64(4, "AB3C\0\1\0\r\377\377\377\377\377\377\377\377\0\0\0\1\3667\306\270\0\0\0\0\0\0\0\0"..., 4096, 4314018705408) = 4096 02:47:57.621340 pwrite64(4, "AB3C\0\1\0\16\377\377\377\377\377\377\377\377\0\0\0\0027\325\363\360\0\0\0\0\0\0\0\0"..., 4096, 4877671981056) = 4096 02:47:57.644973 pwrite64(4, "FIB3\0\0\0\t\377\377\377\377\377\377\377\377\0\0\0\2cR\2308\0\0\0\0\0\0\0\0"..., 4096, 5251221450752) = 4096 02:47:57.666592 pwrite64(4, "AB3C\0\0\1\354\0\30G\177\0\31`\177\0\0\0\2N1\247\350\0\0\0\0\0\0\0\0"..., 4096, 5069727584256) = 4096 02:47:57.705686 pwrite64(4, "AB3C\0\0\1\343\0\r\211\377\0\r\240\177\0\0\0\1\312\336\233\370\0\0\0\0\0\0\0\0"..., 4096, 3941659570176) = 4096 02:47:57.727996 pwrite64(4, "AB3C\0\0\1\356\0\35t\177\377\377\377\377\0\0\0\1\237\264\247\370\0\0\0\0\0\0\0\0"..., 4096, 3570884669440) = 4096 02:47:57.742440 pwrite64(4, "AB3B\0\0\1\343\0\22\24\314\0\22-\310\0\0\0\1H\6\361p\0\0\0\0\0\0\0\0"..., 4096, 2817731518464) = 4096 02:47:57.759525 pwrite64(4, "AB3C\0\0\1\337\0\2\226\177\0\2\233\304\0\0\0\0Wgk\370\0\0\0\0\0\0\0\0"..., 4096, 750794567680) = 4096 02:47:57.792968 pwrite64(4, "AB3B\0\0\1\353\0\3\362\371\0\4\34\365\0\0\0\0027\271W\370\0\0\0\0\0\0\0\0"..., 4096, 4876712013824) = 4096 02:47:57.820004 pwrite64(4, "AB3C\0\0\1\352\0jL\177\0ji\377\0\0\0\1\343\231\177\370\0\0\0\0\0\0\0\0"..., 4096, 4154089009152) = 4096 02:47:57.848497 pwrite64(4, "IAB3\0\0\0\356\0\1\224&\0\1\243\317\0\0\0\1\33\331)\330\0\0\0\0\0\0\0\0"..., 4096, 2438238285824) = 4096 02:47:57.878973 pwrite64(4, "IAB3\0\0\0\356\0\1\206\244\0\1\224;\0\0\0\1\33\331)0\0\0\0\0\0\0\0\0"..., 4096, 2438238199808) = 4096 02:47:57.888687 pwrite64(4, "IAB3\0\0\0\374\0\0]\366\0\0\335\177\0\0\0\0011\245\2\220\0\0\0\0\0\0\0\0"..., 4096, 2625466867712) = 4096 02:47:57.914882 pwrite64(4, "AB3C\0\0\1\342\0\4\364\177\0\5\33<\0\0\0\1\312\232w\370\0\0\0\0\0\0\0\0"..., 4096, 3939373150208) = 4096 02:47:57.956645 pwrite64(4, "AB3C\0\0\1\355\0\6\235\246\0\6\263\235\0\0\0\0\00052\220\0\0\0\0\0\0\0\0"..., 4096, 1785012224) = 4096 02:47:57.981394 pwrite64(4, "AB3B\0\0\1\362\377\377\377\377\0\2\25\200\0\0\0\2cR\253\370\0\0\0\0\0\0\0\0"..., 4096, 5251224039424) = 4096 02:47:58.027596 pwrite64(4, "AB3B\0\0\1\333\0?C\377\377\377\377\377\0\0\0\2\17\366O\370\0\0\0\0\0\0\0\0"..., 4096, 4535160401920) = 4096 02:47:58.051287 pwrite64(4, "AB3B\0\0\1\343\0\10%\377\0\0104\377\0\0\0\1\264\336\177\370\0\0\0\0\0\0\0\0"..., 4096, 3752677339136) = 4096 02:47:58.064409 pwrite64(4, "AB3C\0\0\1\353\377\377\377\377\0\7\237\177\0\0\0\0027\325\333\370\0\0\0\0\0\0\0\0"..., 4096, 4877668839424) = 4096 02:47:58.101327 pwrite64(4, "IAB3\0\1\0\v\377\377\377\377\377\377\377\377\0\0\0\0\360\202@@\0\0\0\0\0\0\0\0"..., 4096, 2065954799616) = 4096 02:47:58.140257 pwrite64(4, "AB3C\0\0\1\366\0\20\271\377\0\21\373\377\0\0\0\2\"J\223\370\0\0\0\0\0\0\0\0"..., 4096, 4692606709760) = 4096 02:47:58.164167 pwrite64(4, "AB3B\0\0\1\352\0\7\225U\377\377\377\377\0\0\0\0027\325\323\370\0\0\0\0\0\0\0\0"..., 4096, 4877667790848) = 4096 02:47:58.198987 pwrite64(4, "AB3C\0\0\1\337\0\2\212\377\0\2\231\177\0\0\0\0WgS\370\0\0\0\0\0\0\0\0"..., 4096, 750791421952) = 4096 02:47:58.217068 pwrite64(4, "AB3C\0\0\1\343\0\r\240\177\0\r\317\177\0\0\0\1\312\336\373\370\0\0\0\0\0\0\0\0"..., 4096, 3941672153088) = 4096 02:47:58.236650 pwrite64(4, "AB3B\0\0\1\343\0\7\307\177\0\10+\377\0\0\0\1\264\336O\370\0\0\0\0\0\0\0\0"..., 4096, 3752671047680) = 4096 02:47:58.259585 pwrite64(4, "AB3B\0\1\0\16\377\377\377\377\377\377\377\377\0\0\0\2M\347\277\370\0\0\0\0\0\0\0\0"..., 4096, 5067247710208) = 4096 02:47:58.288586 pwrite64(4, "IAB3\0\0\0\367\0\0<~\0\0\232C\0\0\0\0\230\325\22\20\0\0\0\0\0\0\0\0"..., 4096, 1312819519488) = 4096 02:47:58.310811 pwrite64(4, "AB3B\0\0\1\363\0\3\373\177\0\4\6\177\0\0\0\0\203\34\33\310\0\0\0\0\0\0\0\0"..., 4096, 1126224596992) = 4096 02:47:58.347854 pwrite64(4, "IAB3\0\0\0\363\0\0\373\2\0\1\251\325\0\0\0\0+\266\177\370\0\0\0\0\0\0\0\0"..., 4096, 375490867200) = 4096 02:47:58.369978 pwrite64(4, "AB3C\0\0\1\356\0\3\256\371\0\3\271\377\0\0\0\0+\306\340\240\0\0\0\0\0\0\0\0"..., 4096, 376040407040) = 4096 02:47:58.388158 pwrite64(4, "IAB3\0\0\0\367\0\0\217B\0\0\244\211\0\0\0\0\230\325j\30\0\0\0\0\0\0\0\0"..., 4096, 1312831057920) = 4096 02:47:58.439982 pwrite64(4, "AB3C\0\0\1\343\0\r\232\177\0\r\246\177\0\0\0\1\312\336\313\370\0\0\0\0\0\0\0\0"..., 4096, 3941665861632) = 4096 02:47:58.460054 pwrite64(4, "AB3B\0\0\1\356\0\5L\374\0\5d\177\0\0\0\0\0*\243\370\0\0\0\0\0\0\0\0"..., 4096, 1430777856) = 4096 02:47:58.479032 pwrite64(4, "AB3C\0\0\1\364\0\7\273\377\0\10\r7\0\0\0\1\34\v\273\370\0\0\0\0\0\0\0\0"..., 4096, 2439935160320) = 4096 02:47:58.522621 pwrite64(4, "AB3B\0\0\1\353\0\7z\275\0\7\230\177\0\0\0\0027\325\272\250\0\0\0\0\0\0\0\0"..., 4096, 4877664473088) = 4096 02:47:58.543911 pwrite64(4, "AB3B\0\0\1\357\0\3\245~\0\0043\371\0\0\0\0\256\302\367\310\0\0\0\0\0\0\0\0"..., 4096, 1501190656000) = 4096 02:47:58.572600 pwrite64(4, "IAB3\0\0\0\372\0\f\230R\0\r\345\205\0\0\0\0\360\215\31\250\0\0\0\0\0\0\0\0"..., 4096, 2066318839808) = 4096 02:47:58.612571 pwrite64(4, "IAB3\0\0\0\362\0\5\224\206\0\6\31\343\0\0\0\1\211#\36`\0\0\0\0\0\0\0\0"..., 4096, 3377022681088) = 4096 02:47:58.641986 pwrite64(4, "AB3B\0\0\1\333\0\2k\177\0\2\203\232\0\0\0\0\230\344[\370\0\0\0\0\0\0\0\0"..., 4096, 1313332523008) = 4096 02:47:58.660825 pwrite64(4, "AB3C\0\0\1\336\0\3\210\377\0\4K\350\0\0\0\1\366;\276 \0\0\0\0\0\0\0\0"..., 4096, 4314151796736) = 4096 02:47:58.694012 pwrite64(4, "AB3C\0\0\1\367\377\377\377\377\0\20r\177\0\0\0\2\"F\17\370\0\0\0\0\0\0\0\0"..., 4096, 4692455190528) = 4096 02:47:58.732403 pwrite64(4, "AB3B\0\0\1\363\0\4\5y\0\4\0165\0\0\0\0\203\34#\370\0\0\0\0\0\0\0\0"..., 4096, 1126225670144) = 4096 02:47:58.748735 pwrite64(4, "AB3B\0\1\0\r\377\377\377\377\377\377\377\377\0\0\0\2cR\337\370\0\0\0\0\0\0\0\0"..., 4096, 5251230855168) = 4096 02:47:58.779831 pwrite64(4, "AB3C\0\0\1\346\0\25[\177\0\25\233\177\0\0\0\2\217\230\23\370\0\0\0\0\0\0\0\0"..., 4096, 5631510048768) = 4096 02:47:58.800520 pwrite64(4, "AB3B\0\0\1\330\0\2\342\177\0\3\6\357\0\0\0\0m>\217\30\0\0\0\0\0\0\0\0"..., 4096, 938402000896) = 4096 02:47:58.826843 pwrite64(4, "AB3B\0\0\1\346\0\16|\377\0\22[\377\0\0\0\1\211iD\200\0\0\0\0\0\0\0\0"..., 4096, 3379376488448) = 4096 02:47:58.858577 pwrite64(4, "XFSB\0\0\20\0\0\0\0\0WR\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512, 0) = 512 02:47:58.887480 pwrite64(4, "XAGF\0\0\0\1\0\0\0\0\2\272\225\0\0\4\261\223\0\5\233\377\0\0\0\0\0\0\0\2"..., 512, 512) = 512 02:47:58.888057 pwrite64(4, "XAGI\0\0\0\1\0\0\0\0\2\272\225\0\0\5d@\0\0\35\10\0\0\0\2\0\0\0\357"..., 512, 1024) = 512 02:47:58.888468 pwrite64(4, "XAFL\0\0\0\0\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 1536) = 512 02:47:58.890890 pwrite64(4, "AB3C\0\0\1\356\0\3\251\340\0\3\262\24\0\0\0\0+\306\307\310\0\0\0\0\0\0\0\0"..., 4096, 376037150720) = 4096 02:47:58.920346 pwrite64(4, "AB3C\0\0\1\357\0\4`\222\0\5\33#\0\0\0\0\256\314\303\300\0\0\0\0\0\0\0\0"..., 4096, 1501519380480) = 4096 02:47:58.938228 pwrite64(4, "IAB3\0\0\0\373\0\0\0\4\0\f\32\17\0\0\0\0\360\202\207\370\0\0\0\0\0\0\0\0"..., 4096, 2065964199936) = 4096 02:47:58.953015 pwrite64(4, "AB3C\0\1\0\r\377\377\377\377\377\377\377\377\0\0\0\2cf\351P\0\0\0\0\0\0\0\0"..., 4096, 5251903168512) = 4096 02:47:58.983871 pwrite64(4, "AB3C\0\0\1\344\0,\36\24\0_\245\177\0\0\0\1\266\205S\370\0\0\0\0\0\0\0\0"..., 4096, 3766865096704) = 4096 02:47:59.011550 pwrite64(4, "AB3B\0\0\1\353\0\4\10\377\0\5\225\377\0\0\0\0027\271\367\250\0\0\0\0\0\0\0\0"..., 4096, 4876732944384) = 4096 02:47:59.036578 pwrite64(4, "AB3C\0\0\1\352\0j8\177\0ja\377\0\0\0\1\343\230\323\370\0\0\0\0\0\0\0\0"..., 4096, 4154066464768) = 4096 02:47:59.064582 pwrite64(4, "AB3B\0\0\1\354\0\17G{\0\17I\10\0\0\0\2M\347\377\360\0\0\0\0\0\0\0\0"..., 4096, 5067256094720) = 4096 02:47:59.106466 pwrite64(4, "AB3B\0\0\1\354\0\17E\177\0\17G{\0\0\0\2M\347\361\270\0\0\0\0\0\0\0\0"..., 4096, 5067254231040) = 4096 02:47:59.145639 pwrite64(4, "AB3C\0\0\1\357\0\17.\177\0\17f\177\0\0\0\1\237Bc\370\0\0\0\0\0\0\0\0"..., 4096, 3567050551296) = 4096 02:47:59.171336 pwrite64(4, "AB3B\0\0\1\354\0\17G7\0\17H\376\0\0\0\2M\347\363\330\0\0\0\0\0\0\0\0"..., 4096, 5067254509568) = 4096 02:47:59.189320 pwrite64(4, "AB3C\0\0\1\364\0\3~|\0\4\4B\0\0\0\0011\300\2620\0\0\0\0\0\0\0\0"..., 4096, 2626395856896) = 4096 02:47:59.213768 pwrite64(4, "IAB3\0\0\0\363\0\1\253\377\0\1\265\177\0\0\0\0+\266\273\230\0\0\0\0\0\0\0\0"..., 4096, 375498682368) = 4096 02:47:59.236935 pwrite64(4, "XAGF\0\0\0\1\0\0\0\23\2\272\225\0\0\0]\357\0\16\364\177\0\0\0\0\0\0\0\2"..., 512, 3562959536640) = 512 02:47:59.259489 pwrite64(4, "XAFL\0\0\0\23\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 3562959537664) = 512 02:47:59.259892 pwrite64(4, "XAGI\0\0\0\1\0\0\0\23\2\272\225\0\0\2\211\0\0\0\t\210\0\0\0\2\0\0\0|"..., 512, 3562959537152) = 512 02:47:59.262478 pwrite64(4, "AB3B\0\0\1\352\0\5)\377\0\5\320\377\0\0\0\1\340p\317\370\0\0\0\0\0\0\0\0"..., 4096, 4126953959424) = 4096 02:47:59.291820 pwrite64(4, "AB3B\0\0\1\354\0\17Dp\0\17ED\0\0\0\2M\347\340\310\0\0\0\0\0\0\0\0"..., 4096, 5067252011008) = 4096 02:47:59.307373 pwrite64(4, "AB3B\0\0\1\336\0\2\355r\377\377\377\377\0\0\0\1\3666K\370\0\0\0\0\0\0\0\0"..., 4096, 4313969061888) = 4096 02:47:59.344056 pwrite64(4, "AB3B\0\0\1\356\0\200bO\0\200\304\177\0\0\0\0\310\177\213\370\0\0\0\0\0\0\0\0"..., 4096, 1722266677248) = 4096 02:47:59.363872 pwrite64(4, "AB3B\0\0\1\346\0\tw\177\0\rj`\0\0\0\1\211^{\370\0\0\0\0\0\0\0\0"..., 4096, 3379014660096) = 4096 02:47:59.384298 pwrite64(4, "AB3B\0\0\1\354\0\17E\31\0\17E\177\0\0\0\2M\347\342 \0\0\0\0\0\0\0\0"..., 4096, 5067252187136) = 4096 02:47:59.385504 pwrite64(4, "AB3B\0\0\1\354\0\17ED\0\17G7\0\0\0\2M\347\343\370\0\0\0\0\0\0\0\0"..., 4096, 5067252428800) = 4096 02:47:59.387003 pwrite64(4, "AB3B\0\0\1\343\0\22\3\177\0\22#.\0\0\0\1H\6~`\0\0\0\0\0\0\0\0"..., 4096, 2817716436992) = 4096 02:47:59.418387 pwrite64(4, "AB3C\0\0\1\366\0\20\266\177\0\20\305\177\0\0\0\2\"J7\370\0\0\0\0\0\0\0\0"..., 4096, 4692594651136) = 4096 02:47:59.447871 pwrite64(4, "IAB3\0\0\0\367\0\2\357C\0\3\225\377\0\0\0\0\203\27\353\370\0\0\0\0\0\0\0\0"..., 4096, 1126084112384) = 4096 02:47:59.472908 pwrite64(4, "AB3C\0\0\1\356\0\3\232\342\0\3\251\340\0\0\0\0+\306\220\360\0\0\0\0\0\0\0\0"..., 4096, 376029962240) = 4096 02:47:59.516426 pwrite64(4, "IAB3\0\0\0\363\0\1\251\325\0\1\255s\0\0\0\0+\266\257\370\0\0\0\0\0\0\0\0"..., 4096, 375497158656) = 4096 02:47:59.560389 pwrite64(4, "AB3B\0\0\1\354\0\17C\365\0\17E\31\0\0\0\2M\347\333\200\0\0\0\0\0\0\0\0"..., 4096, 5067251318784) = 4096 02:47:59.584430 pwrite64(4, "AB3C\0\0\1\343\0\rf\377\0\r\232\177\0\0\0\1\312\336\27\370\0\0\0\0\0\0\0\0"..., 4096, 3941642268672) = 4096 02:47:59.615676 pwrite64(4, "IAB3\0\0\0\367\0\0\326\371\0\1\r\177\0\0\0\1\366\"\16X\0\0\0\0\0\0\0\0"..., 4096, 4313289895936) = 4096 02:47:59.638091 pwrite64(4, "AB3B\0\0\1\363\0\4\6\177\0\4@j\0\0\0\0\203\34a\250\0\0\0\0\0\0\0\0"..., 4096, 1126233755648) = 4096 02:47:59.660732 pwrite64(4, "AB3B\0\0\1\361\0\16\226\345\377\377\377\377\0\0\0\0\360\230'\0\0\0\0\0\0\0\0\0"..., 4096, 2066689687552) = 4096 02:47:59.695306 pwrite64(4, "AB3B\0\0\1\333\0\2\203\232\0\2\231\177\0\0\0\0\230\344\346\370\0\0\0\0\0\0\0\0"..., 4096, 1313350742016) = 4096 02:47:59.711930 pwrite64(4, "IAB3\0\0\0\363\0\1\245\377\0\1\253\377\0\0\0\0+\266\236\250\0\0\0\0\0\0\0\0"..., 4096, 375494889472) = 4096 02:47:59.736174 pwrite64(4, "AB3B\0\0\1\354\0\17C\360\0\17Dp\0\0\0\2M\347\327\250\0\0\0\0\0\0\0\0"..., 4096, 5067250814976) = 4096 02:47:59.756018 pwrite64(4, "AB3B\0\0\1\355\0\6\301\377\0\17C\365\0\0\0\2M\347\327\200\0\0\0\0\0\0\0\0"..., 4096, 5067250794496) = 4096 02:47:59.756778 pwrite64(4, "AB3C\0\0\1\356\0\3\250\36\0\3\256\371\0\0\0\0+\306\237\0\0\0\0\0\0\0\0\0"..., 4096, 376031805440) = 4096 02:47:59.777796 pwrite64(4, "AB3C\0\0\1\366\0\20\211\177\0\20\266\177\0\0\0\2\"J\v\370\0\0\0\0\0\0\0\0"..., 4096, 4692588883968) = 4096 02:47:59.797121 pwrite64(4, "AB3B\0\0\1\324\0\2`\375\0\2yI\0\0\0\0A\221\37\330\0\0\0\0\0\0\0\0"..., 4096, 563215314944) = 4096 02:47:59.819659 pwrite64(4, "AB3C\0\0\1\355\0\201\200\244\377\377\377\377\0\0\0\0\310\206\0220\0\0\0\0\0\0\0\0"..., 4096, 1722485596160) = 4096 02:47:59.852277 pwrite64(4, "AB3C\0\1\0\16\377\377\377\377\377\377\377\377\0\0\0\2\"G\243\370\0\0\0\0\0\0\0\0"..., 4096, 4692508143616) = 4096 02:47:59.870647 pwrite64(4, "IAB3\0\0\0\374\0\0zR\0\0\375f\0\0\0\0011\250\33\370\0\0\0\0\0\0\0\0"..., 4096, 2625570861056) = 4096 02:47:59.891819 pwrite64(4, "AB3C\0\0\1\346\0\25\347\377\0\26C\377\0\0\0\2\217\233\317\370\0\0\0\0\0\0\0\0"..., 4096, 5631635353600) = 4096 02:47:59.923081 pwrite64(4, "AB3C\0\0\1\366\0\20\264\177\0\20\271\377\0\0\0\2\"J\33\370\0\0\0\0\0\0\0\0"..., 4096, 4692590981120) = 4096 02:47:59.946745 pwrite64(4, "AB3B\0\0\1\354\377\377\377\377\0\17C\360\0\0\0\2M\243\307\370\0\0\0\0\0\0\0\0"..., 4096, 5064967057408) = 4096 02:47:59.973551 pwrite64(4, "IAB3\0\0\0\363\0\1\255s\0\1\304X\0\0\0\0+\266\373\370\0\0\0\0\0\0\0\0"..., 4096, 375507120128) = 4096 02:48:00.004950 pwrite64(4, "IAB3\0\0\0\364\0\3B}\0\4\273\377\0\0\0\1sD\320\20\0\0\0\0\0\0\0\0"..., 4096, 3189174706176) = 4096 02:48:00.023929 pwrite64(4, "AB3C\0\0\1\355\0\6\246R\377\377\377\377\0\0\0\0\0005\234\350\0\0\0\0\0\0\0\0"..., 4096, 1798950912) = 4096 02:48:00.048605 pwrite64(4, "AB3C\0\0\1\342\0\24\301\377\0\24\350\374\0\0\0\1H\35\23\370\0\0\0\0\0\0\0\0"..., 4096, 2818474242048) = 4096 02:48:00.078896 pwrite64(4, "IAB3\0\0\0\353\0\0\215\377\0\0\323\342\0\0\0\1\312w\300\260\0\0\0\0\0\0\0\0"..., 4096, 3938208276480) = 4096 02:48:00.098678 pwrite64(4, "IAB3\0\0\0\352\0\1\352\377\377\377\377\377\0\0\0\2cRMH\0\0\0\0\0\0\0\0"..., 4096, 5251211628544) = 4096 02:48:00.148592 pwrite64(4, "AB3C\0\0\1\337\0\2\242\377\377\377\377\377\0\0\0\0Wg\277\370\0\0\0\0\0\0\0\0"..., 4096, 750805577728) = 4096 02:48:00.172816 pwrite64(4, "AB3C\0\0\1\353\0\t\265\377\0\t\336\376\0\0\0\0027\347o\370\0\0\0\0\0\0\0\0"..., 4096, 4878258663424) = 4096 02:48:00.199755 pwrite64(4, "AB3C\0\0\1\342\0\24\347\177\377\377\377\377\0\0\0\1H\35\37\340\0\0\0\0\0\0\0\0"..., 4096, 2818475802624) = 4096 02:48:00.223358 pwrite64(4, "AB3B\0\0\1\356\0\5#~\0\5L\374\0\0\0\0\0);\370\0\0\0\0\0\0\0\0"..., 4096, 1383591936) = 4096 02:48:00.245718 pwrite64(4, "AB3C\0\0\1\337\0\2\235\377\0\2\243\377\0\0\0\0Wg\267\370\0\0\0\0\0\0\0\0"..., 4096, 750804529152) = 4096 02:48:00.285359 pwrite64(4, "AB3C\0\0\1\323\0\4\237\"\0\4\327\345\0\0\0\0A\244\7\330\0\0\0\0\0\0\0\0"..., 4096, 563849703424) = 4096 02:48:00.333292 pwrite64(4, "AB3C\0\0\1\352\0j/\177\0jL\177\0\0\0\1\343\2303\370\0\0\0\0\0\0\0\0"..., 4096, 4154045493248) = 4096 02:48:00.354917 pwrite64(4, "AB3C\0\1\0\20\377\377\377\377\377\377\377\377\0\0\0\0011\274\347\30\0\0\0\0\0\0\0\0"..., 4096, 2626268573696) = 4096 02:48:00.399833 pwrite64(4, "IAB3\0\1\0\v\377\377\377\377\377\377\377\377\0\0\0\2y\30\300@\0\0\0\0\0\0\0\0"..., 4096, 5438259101696) = 4096 02:48:00.419100 pwrite64(4, "IAB3\0\0\0\371\0\0\1\210\0\0\276\315\0\0\0\2!\310\344@\0\0\0\0\0\0\0\0"..., 4096, 4688255156224) = 4096 02:48:00.452755 pwrite64(4, "AB3C\0\0\1\353\377\377\377\377\0`\264\376\0\0\0\1\343-\7\370\0\0\0\0\0\0\0\0"..., 4096, 4150449401856) = 4096 02:48:00.486788 pwrite64(4, "AB3B\0\0\1\364\0\5\372\377\0\6'\177\0\0\0\1\33\375\17\370\0\0\0\0\0\0\0\0"..., 4096, 2439442853888) = 4096 02:48:00.514309 pwrite64(4, "AB3C\0\0\1\366\0\0204\377\0\20t\377\0\0\0\2\"G\373\370\0\0\0\0\0\0\0\0"..., 4096, 4692519677952) = 4096 02:48:00.540811 pwrite64(4, "IAB3\0\0\0\365\0\3\254\375\0\3\333\377\0\0\0\1\340d\373\370\0\0\0\0\0\0\0\0"..., 4096, 4126557073408) = 4096 02:48:00.570266 pwrite64(4, "AB3B\0\0\1\346\0\r\225\377\0\16,\177\0\0\0\1\211e\v\370\0\0\0\0\0\0\0\0"..., 4096, 3379234861056) = 4096 02:48:00.604400 pwrite64(4, "AB3C\0\0\1\334\377\377\377\377\0\201K\377\0\0\0\2\17\366\213\370\0\0\0\0\0\0\0\0"..., 4096, 4535168266240) = 4096 02:48:00.642319 pwrite64(4, "AB3C\0\0\1\334\0\201W\177\0\221\363\177\0\0\0\2\20S\337\370\0\0\0\0\0\0\0\0"..., 4096, 4538299838464) = 4096 02:48:00.665781 pwrite64(4, "AB3B\0\1\0\16\377\377\377\377\377\377\377\377\0\0\0\2!\341\345h\0\0\0\0\0\0\0\0"..., 4096, 4689094168576) = 4096 02:48:00.689961 pwrite64(4, "AB3B\0\0\1\343\0\21\375\177\0\22\3\177\0\0\0\1H\5\323\370\0\0\0\0\0\0\0\0"..., 4096, 2817694101504) = 4096 02:48:00.711124 pwrite64(4, "AB3B\0\0\1\333\0\2x\177\0\2\211\337\0\0\0\0\230\344\264\320\0\0\0\0\0\0\0\0"..., 4096, 1313344167936) = 4096 02:48:00.734396 pwrite64(4, "AB3B\0\0\1\356\0\5\16\216\0\5'\177\0\0\0\0\0)\33\360\0\0\0\0\0\0\0\0"..., 4096, 1379393536) = 4096 02:48:00.760732 pwrite64(4, "AB3B\0\0\1\364\377\377\377\377\0\1\316\370\0\0\0\1\33\332\363\370\0\0\0\0\0\0\0\0"..., 4096, 2438298333184) = 4096 02:48:00.793672 pwrite64(4, "AB3B\0\0\1\365\0\1\315\177\0\1\326\375\0\0\0\1\33\332\377\300\0\0\0\0\0\0\0\0"..., 4096, 2438299877376) = 4096 02:48:00.825718 pwrite64(4, "AB3B\0\1\0\25\377\377\377\377\377\377\377\377\0\0\0\1\33\332\377 \0\0\0\0\0\0\0\0"..., 4096, 2438299795456) = 4096 02:48:00.834374 pwrite64(4, "IAB3\0\0\0\361\0\10uT\0\10\260~\0\0\0\1\2119;\370\0\0\0\0\0\0\0\0"..., 4096, 3377764757504) = 4096 02:48:00.855814 pwrite64(4, "AB3C\0\0\1\337\0\2\233\304\0\2\242\377\0\0\0\0Wg\217\370\0\0\0\0\0\0\0\0"..., 4096, 750799286272) = 4096 02:48:00.885350 pwrite64(4, "AB3B\0\0\1\343\0\2c\377\0\2\230\177\0\0\0\1\312\205\3\370\0\0\0\0\0\0\0\0"..., 4096, 3938653302784) = 4096 02:48:00.913652 pwrite64(4, "IAB3\0\0\0\352\0\2\1\177\0\2\n\377\0\0\0\2\244\320\227(\0\0\0\0\0\0\0\0"..., 4096, 5813794918400) = 4096 02:48:00.948826 pwrite64(4, "IAB3\0\0\0\364\0\0\356\205\0\3\n\36\0\0\0\1s*/`\0\0\0\0\0\0\0\0"..., 4096, 3188281229312) = 4096 02:48:00.971301 pwrite64(4, "AB3B\0\0\1\343\0\21\365\177\0\21\377\177\0\0\0\1H\5\303\370\0\0\0\0\0\0\0\0"..., 4096, 2817692004352) = 4096 02:48:01.002554 pwrite64(4, "AB3B\0\0\1\324\0\1\346\177\0\2d\373\0\0\0\0A\220\377\350\0\0\0\0\0\0\0\0"..., 4096, 563211128832) = 4096 02:48:01.024089 pwrite64(4, "IAB3\0\0\0\374\0\0W\221\0\0zR\0\0\0\0011\244\37\260\0\0\0\0\0\0\0\0"..., 4096, 2625437130752) = 4096 02:48:01.042172 pwrite64(4, "AB3B\0\0\1\334\0\3\355\376\0\6\223\345\0\0\0\2\f\17\376h\0\0\0\0\0\0\0\0"..., 4096, 4501662388224) = 4096 02:48:01.059105 pwrite64(4, "AB3C\0\0\1\356\0\3\227\314\0\3\250\36\0\0\0\0+\306'\20\0\0\0\0\0\0\0\0"..., 4096, 376016084992) = 4096 02:48:01.083289 pwrite64(4, "FIB3\0\0\0\7\377\377\377\377\377\377\377\377\0\0\0\2!\341\217\370\0\0\0\0\0\0\0\0"..., 4096, 4689082970112) = 4096 02:48:01.119457 pwrite64(4, "AB3B\0\0\1\356\0\1\371|\0\2\2\377\0\0\0\0+\2717\360\0\0\0\0\0\0\0\0"..., 4096, 375582089216) = 4096 02:48:01.153206 pwrite64(4, "AB3B\0\0\1\330\0\2\252\372\0\2\342\177\0\0\0\0m=P\20\0\0\0\0\0\0\0\0"..., 4096, 938360184832) = 4096 02:48:01.185000 pwrite64(4, "AB3B\0\0\1\343\0\21\377\177\0\22\24\314\0\0\0\1H\5\363\370\0\0\0\0\0\0\0\0"..., 4096, 2817698295808) = 4096 02:48:01.186309 pwrite64(4, "IAB3\0\0\0\367\0\0\244\211\0\0\354\31\0\0\0\0\230\326)`\0\0\0\0\0\0\0\0"..., 4096, 1312856129536) = 4096 02:48:01.210810 pwrite64(4, "IAB3\0\0\0\373\0\0\310\325\0\1\27\302\0\0\0\0\0\6\222\350\0\0\0\0\0\0\0\0"..., 4096, 220581888) = 4096 02:48:01.230929 pwrite64(4, "AB3C\0\0\1\343\0\5\33<\0\r\26\377\0\0\0\1\312\303\353\250\0\0\0\0\0\0\0\0"..., 4096, 3940764045312) = 4096 02:48:01.292689 pwrite64(4, "IAB3\0\0\0\361\0\10\255\177\377\377\377\377\0\0\0\1\2119S\360\0\0\0\0\0\0\0\0"..., 4096, 3377767899136) = 4096 02:48:01.313517 pwrite64(4, "AB3B\0\0\1\333\0\2\211\337\377\377\377\377\0\0\0\0\230\345c\370\0\0\0\0\0\0\0\0"..., 4096, 1313367126016) = 4096 02:48:01.339181 pwrite64(4, "AB3B\0\0\1\346\0\16'\177\0\16d\177\0\0\0\1\211e3\370\0\0\0\0\0\0\0\0"..., 4096, 3379240103936) = 4096 02:48:01.368801 pwrite64(4, "AB3B\0\0\1\324\0\0\220\240\0\2`\375\0\0\0\0A\215+\370\0\0\0\0\0\0\0\0"..., 4096, 563082686464) = 4096 02:48:01.400153 pwrite64(4, "AB3C\0\0\1\323\0\4\301\373\0\0055\313\0\0\0\0A\244\267(\0\0\0\0\0\0\0\0"..., 4096, 563872681984) = 4096 02:48:01.411249 pwrite64(4, "IAB3\0\0\0\352\0\2\7\345\377\377\377\377\0\0\0\2\244\320\257\370\0\0\0\0\0\0\0\0"..., 4096, 5813798170624) = 4096 02:48:01.437712 pwrite64(4, "AB3C\0\0\1\363\0\0049\344\0\4|\210\0\0\0\0011\303f\260\0\0\0\0\0\0\0\0"..., 4096, 2626486624256) = 4096 02:48:01.463003 pwrite64(4, "AB3B\0\0\1\356\0\1\362X\0\1\374\376\0\0\0\0+\271\33\340\0\0\0\0\0\0\0\0"..., 4096, 375578411008) = 4096 02:48:01.499268 pwrite64(4, "AB3C\0\0\1\356\0\3\217!\0\3\232\342\0\0\0\0+\306\16`\0\0\0\0\0\0\0\0"..., 4096, 376012849152) = 4096 02:48:01.523842 pwrite64(4, "IAB3\0\0\0\373\0\2=\23\0\2q}\0\0\0\0\0\22\"\250\0\0\0\0\0\0\0\0"..., 4096, 608522240) = 4096 02:48:01.546887 pwrite64(4, "AB3B\0\0\1\346\0\rU\177\0\r\225\377\0\0\0\1\211_#\0\0\0\0\0\0\0\0\0"..., 4096, 3379036553216) = 4096 02:48:01.573662 pwrite64(4, "IAB3\0\0\0\365\0\3\321\177\0\3\343\177\0\0\0\1\340eO\370\0\0\0\0\0\0\0\0"..., 4096, 4126568083456) = 4096 02:48:01.620385 pwrite64(4, "AB3C\0\0\1\355\0\6x\334\0\6\214{\0\0\0\0\0004#\370\0\0\0\0\0\0\0\0"..., 4096, 1749544960) = 4096 02:48:01.644065 pwrite64(4, "AB3B\0\0\1\356\0\1\374\376\0\2\4\377\0\0\0\0+\271g\370\0\0\0\0\0\0\0\0"..., 4096, 375588384768) = 4096 02:48:01.679415 pwrite64(4, "AB3B\0\0\1\337\0\2)\177\0\2DT\0\0\0\0WdC\240\0\0\0\0\0\0\0\0"..., 4096, 750688616448) = 4096 02:48:01.704094 pwrite64(4, "AB3B\0\0\1\343\0\21\344\177\0\21\375\177\0\0\0\1H\5\203\370\0\0\0\0\0\0\0\0"..., 4096, 2817683615744) = 4096 02:48:01.733605 pwrite64(4, "AB3B\0\0\1\356\0\4\302\177\377\377\377\377\0\0\0\1\236\3644\360\0\0\0\0\0\0\0\0"..., 4096, 3564427141120) = 4096 02:48:01.769649 pwrite64(4, "AB3B\0\0\1\333\0\27\340f\0,\n\177\0\0\0\2\r\n\367\370\0\0\0\0\0\0\0\0"..., 4096, 4510083706880) = 4096 02:48:01.817822 pwrite64(4, "AB3B\0\0\1\366\377\377\377\377\0\3\335\377\0\0\0\2!\341\263\220\0\0\0\0\0\0\0\0"..., 4096, 4689087635456) = 4096 02:48:01.841807 pwrite64(4, "AB3C\0\0\1\344\0\4\6\364\0\4F\375\0\0\0\1\6\31\\@\0\0\0\0\0\0\0\0"..., 4096, 2251413815296) = 4096 02:48:01.868071 pwrite64(4, "IAB3\0\1\0\v\377\377\377\377\377\377\377\377\0\0\0\2!\310\20\330\0\0\0\0\0\0\0\0"..., 4096, 4688227446784) = 4096 02:48:01.900999 pwrite64(4, "AB3B\0\0\1\333\0\27\307\177\0#f\377\0\0\0\2\f\256\3030\0\0\0\0\0\0\0\0"..., 4096, 4506989780992) = 4096 02:48:01.918287 pwrite64(4, "AB3B\0\0\1\356\0\2\2\377\0\2\6\340\0\0\0\0+\271w\370\0\0\0\0\0\0\0\0"..., 4096, 375590481920) = 4096 02:48:01.947880 pwrite64(4, "AB3B\0\0\1\333\377\377\377\377\0\4\7\315\0\0\0\2\f\17/\360\0\0\0\0\0\0\0\0"..., 4096, 4501635325952) = 4096 02:48:01.984815 pwrite64(4, "IAB3\0\0\0\371\0\3X\232\377\377\377\377\0\0\0\2!\341[\370\0\0\0\0\0\0\0\0"..., 4096, 4689076154368) = 4096 02:48:02.017951 pwrite64(4, "IAB3\0\0\0\367\0\0\275\377\0\0\336\313\0\0\0\1\366!\317\310\0\0\0\0\0\0\0\0"..., 4096, 4313281695744) = 4096 02:48:02.034741 pwrite64(4, "IAB3\0\0\0\373\0\0021\311\0\2=\23\0\0\0\0\0\21\333\350\0\0\0\0\0\0\0\0"..., 4096, 599248896) = 4096 02:48:02.064341 pwrite64(4, "AB3B\0\0\1\343\0\2L\377\0\2g\177\0\0\0\1\312\204\347\370\0\0\0\0\0\0\0\0"..., 4096, 3938649632768) = 4096 02:48:02.087530 pwrite64(4, "IAB3\0\0\0\373\0\0\34\245\0\0\322]\0\0\0\0\0\6F\250\0\0\0\0\0\0\0\0"..., 4096, 210587648) = 4096 02:48:02.115076 pwrite64(4, "AB3C\0\0\1\363\0\6\236H\377\377\377\377\0\0\0\0\2031\27\370\0\0\0\0\0\0\0\0"..., 4096, 1126928740352) = 4096 02:48:02.132971 pwrite64(4, "IAB3\0\0\0\373\0\2;}\0\2DU\0\0\0\0\0\21\350\230\0\0\0\0\0\0\0\0"..., 4096, 600911872) = 4096 02:48:02.157037 pwrite64(4, "AB3C\0\0\1\364\0\7\264\177\0\7\346\177\0\0\0\1\34\ng\370\0\0\0\0\0\0\0\0"..., 4096, 2439890595840) = 4096 02:48:02.178617 pwrite64(4, "AB3B\0\0\1\356\0\200\n\177\0\200bO\0\0\0\0\310|k\350\0\0\0\0\0\0\0\0"..., 4096, 1722161811456) = 4096 02:48:02.196080 pwrite64(4, "FIB3\0\0\0\1\377\377\377\377\377\377\377\377\0\0\0\1\2119\207\370\0\0\0\0\0\0\0\0"..., 4096, 3377774718976) = 4096 02:48:02.220145 pwrite64(4, "AB3C\0\0\1\355\0\6\214{\0\6\214\253\0\0\0\0\0004eH\0\0\0\0\0\0\0\0"..., 4096, 1758105600) = 4096 02:48:02.244754 pwrite64(4, "AB3C\0\0\1\355\0\6\214\251\0\6\224\7\0\0\0\0\0004eX\0\0\0\0\0\0\0\0"..., 4096, 1758113792) = 4096 02:48:02.246409 pwrite64(4, "AB3B\0\0\1\322\0\7J\177\0\7\\\177\0\0\0\1sY\247\370\0\0\0\0\0\0\0\0"..., 4096, 3189874094080) = 4096 02:48:02.274456 pwrite64(4, "AB3B\0\1\0\16\377\377\377\377\377\377\377\377\0\0\0\2\f\17r\330\0\0\0\0\0\0\0\0"..., 4096, 4501644095488) = 4096 02:48:02.297350 pwrite64(4, "AB3C\0\0\1\355\0\6\204\177\0\6\214\251\0\0\0\0\0004c\330\0\0\0\0\0\0\0\0"..., 4096, 1757917184) = 4096 02:48:02.319046 pwrite64(4, "AB3B\0\0\1\363\0\2\32\377\0\2I\177\0\0\0\2cS\367\370\0\0\0\0\0\0\0\0"..., 4096, 5251267555328) = 4096 02:48:02.371834 pwrite64(4, "IAB3\0\0\0\354\0\0\37\376\377\377\377\377\0\0\0\1\236\311x@\0\0\0\0\0\0\0\0"..., 4096, 3562993123328) = 4096 02:48:02.392511 pwrite64(4, "AB3B\0\0\1\363\0\2\t\177\0\2\26\377\0\0\0\2cS\f\0\0\0\0\0\0\0\0\0"..., 4096, 5251236626432) = 4096 02:48:02.410915 pwrite64(4, "FIB3\0\0\0\20\377\377\377\377\377\377\377\377\0\0\0\1\236\311~p\0\0\0\0\0\0\0\0"..., 4096, 3562993934336) = 4096 02:48:02.425942 pwrite64(4, "AB3B\0\0\1\333\0\4\206\377\0\6\366\377\0\0\0\2\244\356\217\370\0\0\0\0\0\0\0\0"..., 4096, 5814800609280) = 4096 02:48:02.444664 pwrite64(4, "AB3C\0\0\1\363\0\22\271\377\0\23\342b\0\0\0\0\332\353\355x\0\0\0\0\0\0\0\0"..., 4096, 1880522158080) = 4096 02:48:02.467496 pwrite64(4, "AB3B\0\0\1\346\377\377\377\377\0\tT\377\0\0\0\1\2119\253\370\0\0\0\0\0\0\0\0"..., 4096, 3377779437568) = 4096 02:48:02.516526 pwrite64(4, "AB3C\0\0\1\346\0\25\316\377\0\26\3\377\0\0\0\2\217\232\357\370\0\0\0\0\0\0\0\0"..., 4096, 5631605993472) = 4096 02:48:02.540472 pwrite64(4, "IAB3\0\0\0\354\0\0\37\214\0\0\37\315\0\0\0\1\236\311tp\0\0\0\0\0\0\0\0"..., 4096, 3562992623616) = 4096 02:48:02.565638 pwrite64(4, "IAB3\0\0\0\354\0\0\37\212\0\0\37\216\0\0\0\1\236\311t`\0\0\0\0\0\0\0\0"..., 4096, 3562992615424) = 4096 02:48:02.568058 pwrite64(4, "IAB3\0\0\0\354\0\0\t\r\0\0\37\214\0\0\0\1\236\311tP\0\0\0\0\0\0\0\0"..., 4096, 3562992607232) = 4096 02:48:02.569069 pwrite64(4, "IAB3\0\0\0\354\0\0\37\315\0\0\37\354\0\0\0\1\236\311w0\0\0\0\0\0\0\0\0"..., 4096, 3562992984064) = 4096 02:48:02.618948 pwrite64(4, "IAB3\0\0\0\354\0\0\37\346\0\0\37\371\0\0\0\1\236\311w`\0\0\0\0\0\0\0\0"..., 4096, 3562993008640) = 4096 02:48:02.620098 pwrite64(4, "IAB3\0\0\0\354\0\0\37\373\0\0 \10\0\0\0\1\236\311w\360\0\0\0\0\0\0\0\0"..., 4096, 3562993082368) = 4096 02:48:02.620893 pwrite64(4, "IAB3\0\0\0\354\0\0\37\371\0\0\37\376\0\0\0\1\236\311w\330\0\0\0\0\0\0\0\0"..., 4096, 3562993070080) = 4096 02:48:02.621902 pwrite64(4, "IAB3\0\0\0\354\0\0\37\354\0\0\37\373\0\0\0\1\236\311w\310\0\0\0\0\0\0\0\0"..., 4096, 3562993061888) = 4096 02:48:02.623012 pwrite64(4, "IAB3\0\0\0\354\0\0\37\216\0\0\37\346\0\0\0\1\236\311vh\0\0\0\0\0\0\0\0"..., 4096, 3562992881664) = 4096 02:48:02.625818 pwrite64(4, "IAB3\0\0\0\373\0\1\340M\0\2;}\0\0\0\0\0\21\216H\0\0\0\0\0\0\0\0"..., 4096, 589074432) = 4096 02:48:02.649665 pwrite64(4, "IAB3\0\0\0\367\0\0\275\330\0\0\326\371\0\0\0\1\366!\7\370\0\0\0\0\0\0\0\0"..., 4096, 4313255505920) = 4096 02:48:02.671940 pwrite64(4, "IAB3\0\0\0\367\0\0\247\7\0\0\275\377\0\0\0\1\366!\6\300\0\0\0\0\0\0\0\0"..., 4096, 4313255346176) = 4096 02:48:02.681573 pwrite64(4, "AB3B\0\0\1\356\0\5\16\177\0\5#~\0\0\0\0\0(tp\0\0\0\0\0\0\0\0"..., 4096, 1357438976) = 4096 02:48:02.709061 pwrite64(4, "AB3B\0\0\1\363\0\2\25\200\0\2\32\377\0\0\0\2cS\27\370\0\0\0\0\0\0\0\0"..., 4096, 5251238195200) = 4096 02:48:02.743911 pwrite64(4, "AB3B\0\0\1\356\0\2\4\377\0\2\10\377\0\0\0\0+\271\207\0\0\0\0\0\0\0\0\0"..., 4096, 375592452096) = 4096 02:48:02.745347 pwrite64(4, "AB3B\0\0\1\346\0\5\246\307\0\6 \377\0\0\0\2\217\31 \0\0\0\0\0\0\0\0"..., 4096, 5627250229248) = 4096 02:48:02.769570 pwrite64(4, "AB3B\0\0\1\356\0\4\371\177\0\5\16\216\0\0\0\0\0(s\370\0\0\0\0\0\0\0\0"..., 4096, 1357377536) = 4096 02:48:02.780276 pwrite64(4, "AB3C\0\0\1\353\0\t\313\377\0\33\"~\0\0\0\0027\350\7\360\0\0\0\0\0\0\0\0"..., 4096, 4878278582272) = 4096 02:48:02.828677 pwrite64(4, "AB3B\0\0\1\337\0\2DT\0\2O\377\0\0\0\0Wd\353\370\0\0\0\0\0\0\0\0"..., 4096, 750710681600) = 4096 02:48:02.873669 pwrite64(4, "AB3B\0\0\1\364\0\6\20\377\0\6?\177\0\0\0\1\33\375\303\370\0\0\0\0\0\0\0\0"..., 4096, 2439466446848) = 4096 02:48:02.904111 pwrite64(4, "IAB3\0\0\0\373\0\3y\263\0\3\341\177\0\0\0\0\0\35^x\0\0\0\0\0\0\0\0"..., 4096, 985460736) = 4096 02:48:02.924122 pwrite64(4, "AB3B\0\0\1\353\0\3h\177\0\4\10\377\0\0\0\0027\270\247\310\0\0\0\0\0\0\0\0"..., 4096, 4876688920576) = 4096 02:48:02.946651 pwrite64(4, "AB3B\0\0\1\356\0\2\6\340\0\2\26\377\0\0\0\0+\271\227\370\0\0\0\0\0\0\0\0"..., 4096, 375594676224) = 4096 02:48:02.977405 pwrite64(4, "AB3C\0\0\1\362\0\6\26\r\377\377\377\377\0\0\0\2c\217\253\370\0\0\0\0\0\0\0\0"..., 4096, 5253270859776) = 4096 02:48:03.016916 pwrite64(4, "IAB3\0\0\0\350\0\1iR\0\3\264\253\0\0\0\1\264\2557\330\0\0\0\0\0\0\0\0"..., 4096, 3751023718400) = 4096 02:48:03.054968 pwrite64(4, "FIB3\0\0\0\5\377\377\377\377\377\377\377\377\0\0\0\1\340e\317\370\0\0\0\0\0\0\0\0"..., 4096, 4126584860672) = 4096 02:48:03.086516 pwrite64(4, "AB3C\0\0\1\355\0\6\214\253\0\6\235\246\0\0\0\0\0004\2408\0\0\0\0\0\0\0\0"..., 4096, 1765830656) = 4096 02:48:03.140632 pwrite64(4, "AB3B\0\0\1\337\0\0024t\0\2I\177\0\0\0\0Wd\302\240\0\0\0\0\0\0\0\0"..., 4096, 750705262592) = 4096 02:48:03.273781 pwrite64(4, "AB3B\0\0\1\363\0\2\26\377\0\0022\377\0\0\0\2cS7\370\0\0\0\0\0\0\0\0"..., 4096, 5251242389504) = 4096 02:48:03.302853 pwrite64(4, "AB3C\0\0\1\356\0\3\271\377\0\4NZ\0\0\0\0+\307}\10\0\0\0\0\0\0\0\0"..., 4096, 376060907520) = 4096 02:48:03.357702 pwrite64(4, "AB3C\0\0\1\364\0\7p\377\0\7\273\377\0\0\0\1\34\n+\370\0\0\0\0\0\0\0\0"..., 4096, 2439882731520) = 4096 02:48:03.379963 pwrite64(4, "AB3B\0\0\1\364\0\0036\3\0\3\340\376\0\0\0\1\33\351\371\260\0\0\0\0\0\0\0\0"..., 4096, 2438802399232) = 4096 02:48:03.400922 pwrite64(4, "IAB3\0\0\0\372\377\377\377\377\0\0\217\210\0\0\0\2!\304t@\0\0\0\0\0\0\0\0"..., 4096, 4688106258432) = 4096 02:48:03.438530 pwrite64(4, "AB3C\0\0\1\330\0\3\243\377\0\3\267\377\0\0\0\0mDz0\0\0\0\0\0\0\0\0"..., 4096, 938600587264) = 4096 02:48:03.468454 pwrite64(4, "XAFL\0\0\0\31\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 4688104654336) = 512 02:48:03.502156 pwrite64(4, "AB3C\0\0\1\357\0\5)8\0\5\227~\0\0\0\0\256\321\335\330\0\0\0\0\0\0\0\0"..., 4096, 1501690572800) = 4096 02:48:03.558154 pwrite64(4, "XAGI\0\0\0\1\0\0\0\31\2\272\225\0\0\2\255\0\0\0u\33\0\0\0\2\0\0\0\252"..., 512, 4688104653824) = 512 02:48:03.558560 pwrite64(4, "XAGF\0\0\0\1\0\0\0\31\2\272\225\0\0\3\257\255\0\20g\177\0\0\0\0\0\0\0\2"..., 512, 4688104653312) = 512 02:48:03.563682 pwrite64(4, "AB3C\0\0\1\330\0\3\2178\0\3\246F\0\0\0\0mDg\370\0\0\0\0\0\0\0\0"..., 4096, 938598199296) = 4096 02:48:03.574109 pwrite64(4, "IAB3\0\0\0\353\0\0\277\26\0\0\324|\0\0\0\1\312xg\20\0\0\0\0\0\0\0\0"..., 4096, 3938230083584) = 4096 02:48:03.612029 pwrite64(4, "IAB3\0\0\0\365\0\0\2T\0\0\261d\0\0\0\2Mo(\360\0\0\0\0\0\0\0\0"..., 4096, 5063201382400) = 4096 02:48:03.640845 pwrite64(4, "AB3C\0\0\1\356\0\6\177k\0\17.\177\0\0\0\1\237A\227\370\0\0\0\0\0\0\0\0"..., 4096, 3567023812608) = 4096 02:48:03.676488 pwrite64(4, "FIB3\0\0\0\10\377\377\377\377\377\377\377\377\0\0\0\1]\221\"\370\0\0\0\0\0\0\0\0"..., 4096, 3002757148672) = 4096 02:48:03.696325 pwrite64(4, "AB3B\0\0\1\330\0\2\225m\0\2\241\377\0\0\0\0m<\3\200\0\0\0\0\0\0\0\0"..., 4096, 938316595200) = 4096 02:48:03.717283 pwrite64(4, "AB3C\0\0\1\327\0\4P\272\0\4W\377\0\0\0\0mI\347\370\0\0\0\0\0\0\0\0"..., 4096, 938782748672) = 4096 02:48:03.752292 pwrite64(4, "IAB3\0\0\0\353\0\0\323\342\0\1\231\210\0\0\0\1\312xk\340\0\0\0\0\0\0\0\0"..., 4096, 3938230714368) = 4096 02:48:03.770212 pwrite64(4, "AB3B\0\0\1\346\0\5\240\r\0\5\256\4\0\0\0\2\217\30\3468\0\0\0\0\0\0\0\0"..., 4096, 5627242639360) = 4096 02:48:03.800607 pwrite64(4, "IAB3\0\0\0\367\0\0\262,\377\377\377\377\0\0\0\0\230\327\370\310\0\0\0\0\0\0\0\0"..., 4096, 1312916869120) = 4096 02:48:03.846865 pwrite64(4, "AB3B\0\0\1\357\0\2\327\177\0\3\264~\0\0\0\1\236\341\202\20\0\0\0\0\0\0\0\0"..., 4096, 3563799715840) = 4096 02:48:03.869416 pwrite64(4, "AB3C\0\0\1\360\0Da\377\0D\232\177\0\0\0\2{;+\370\0\0\0\0\0\0\0\0"..., 4096, 5456593940480) = 4096 02:48:03.909086 pwrite64(4, "AB3C\0\0\1\346\0\0242\177\0\24>\177\0\0\0\1\211\225\243\370\0\0\0\0\0\0\0\0"..., 4096, 3380865396736) = 4096 02:48:03.930404 pwrite64(4, "IAB3\0\0\0\352\0\1\321\177\0\2\7\345\0\0\0\2\244\320c\370\0\0\0\0\0\0\0\0"..., 4096, 5813788209152) = 4096 02:48:03.951100 pwrite64(4, "AB3C\0\0\1\357\0\5\223\273\0\5\233\33\0\0\0\0\256\321\373\360\0\0\0\0\0\0\0\0"..., 4096, 1501694517248) = 4096 02:48:03.977560 pwrite64(4, "AB3C\0\0\1\355\0\6\224\7\0\6\246R\0\0\0\0\0004\3550\0\0\0\0\0\0\0\0"..., 4096, 1775919104) = 4096 02:48:04.028783 pwrite64(4, "AB3C\0\0\1\357\0\17#\377\0\17=\177\0\0\0\1\237A\353\370\0\0\0\0\0\0\0\0"..., 4096, 3567034822656) = 4096 02:48:04.073408 pwrite64(4, "IAB3\0\0\0\360\0\2u\203\0\3\344\377\0\0\0\2\f\16\313H\0\0\0\0\0\0\0\0"..., 4096, 4501622132736) = 4096 02:48:04.101578 pwrite64(4, "IAB3\0\0\0\350\0\2\2\373\0\3\273\177\0\0\0\1\264\272\305X\0\0\0\0\0\0\0\0"..., 4096, 3751478472704) = 4096 02:48:04.118856 pwrite64(4, "IAB3\0\0\0\365\0\3\333\377\377\377\377\377\0\0\0\1\340e\213\370\0\0\0\0\0\0\0\0"..., 4096, 4126575947776) = 4096 02:48:04.134646 pwrite64(4, "FIB3\0\0\0\4\377\377\377\377\377\377\377\377\0\0\0\2\f\16\363\370\0\0\0\0\0\0\0\0"..., 4096, 4501627465728) = 4096 02:48:04.169102 pwrite64(4, "AB3C\0\0\1\352\0\7\231\177\0\tM\266\0\0\0\0027\326\v\370\0\0\0\0\0\0\0\0"..., 4096, 4877675130880) = 4096 02:48:04.196647 pwrite64(4, "AB3C\0\0\1\327\0\3\336V\0\4S\377\0\0\0\0mI\315\320\0\0\0\0\0\0\0\0"..., 4096, 938779320320) = 4096 02:48:04.217659 pwrite64(4, "AB3B\0\0\1\322\0\5\320\375\0\7J\177\0\0\0\1sY/\370\0\0\0\0\0\0\0\0"..., 4096, 3189858365440) = 4096 02:48:04.267758 pwrite64(4, "AB3B\0\0\1\356\377\377\377\377\0\0d\351\0\0\0\1\236\312\363\370\0\0\0\0\0\0\0\0"..., 4096, 3563042893824) = 4096 02:48:04.289838 pwrite64(4, "AB3C\0\0\1\346\0\24:\177\0\24F\336\0\0\0\1\211\225\303\370\0\0\0\0\0\0\0\0"..., 4096, 3380869591040) = 4096 02:48:04.300190 pwrite64(4, "AB3B\0\0\1\356\0\200P}\0\200\264\177\0\0\0\0\310|\372x\0\0\0\0\0\0\0\0"..., 4096, 1722180497408) = 4096 02:48:04.352911 pwrite64(4, "IAB3\0\0\0\353\0\0\313\210\0\1y\332\0\0\0\2\244\311_\370\0\0\0\0\0\0\0\0"..., 4096, 5813552803840) = 4096 02:48:04.384034 pwrite64(4, "AB3C\0\1\0\r\377\377\377\377\377\377\377\377\0\0\0\1u\311\313\370\0\0\0\0\0\0\0\0"..., 4096, 3210816778240) = 4096 02:48:04.411294 pwrite64(4, "AB3C\0\0\1\344\0\3\336\376\0\4/\210\0\0\0\1\6\30\27\240\0\0\0\0\0\0\0\0"..., 4096, 2251371266048) = 4096 02:48:04.441660 pwrite64(4, "AB3C\0\0\1\321\0UR\377\0U^\377\0\0\0\1u\311\327\370\0\0\0\0\0\0\0\0"..., 4096, 3210818351104) = 4096 02:48:04.451526 pwrite64(4, "IAB3\0\0\0\360\0\3\341i\377\377\377\377\0\0\0\2\f\16\347\370\0\0\0\0\0\0\0\0"..., 4096, 4501625892864) = 4096 02:48:04.476302 pwrite64(4, "IAB3\0\0\0\350\0\3\264\253\377\377\377\377\0\0\0\1\264\272\373\370\0\0\0\0\0\0\0\0"..., 4096, 3751485632512) = 4096 02:48:04.495752 pwrite64(4, "AB3B\0\0\1\330\0\2\227p\0\2\252\372\0\0\0\0m>\0\0\0\0+\273#\350\0\0\0\0\0\0\0\0"..., 4096, 375646572544) = 4096 02:48:08.170885 pwrite64(4, "AB3B\0\0\1\363\0\1\377\177\0\2\35\177\0\0\0\0011\261o\370\0\0\0\0\0\0\0\0"..., 4096, 2625883860992) = 4096 02:48:08.189179 pwrite64(4, "AB3B\0\0\1\337\0\2Y\336\0\2_\377\0\0\0\0We\207\370\0\0\0\0\0\0\0\0"..., 4096, 750731128832) = 4096 02:48:08.232976 pwrite64(4, "AB3B\0\0\1\347\377\377\377\377\0\2\212\343\0\0\0\0\25\350\267\370\0\0\0\0\0\0\0\0"..., 4096, 188197367808) = 4096 02:48:08.250757 pwrite64(4, "AB3B\0\0\1\333\0\0029\377\0\2J\377\0\0\0\2\244\322\237\370\0\0\0\0\0\0\0\0"..., 4096, 5813863182336) = 4096 02:48:08.286918 pwrite64(4, "IAB3\0\0\0\367\0\0\1\10\0\1\347|\0\0\0\0027\234)P\0\0\0\0\0\0\0\0"..., 4096, 4875732819968) = 4096 02:48:08.317168 pwrite64(4, "IAB3\0\0\0\370\0\0\0\1\0\0\22@\0\0\0\0\230\320\240@\0\0\0\0\0\0\0\0"..., 4096, 1312670384128) = 4096 02:48:08.347306 pwrite64(4, "AB3C\0\0\1\361\0\16\335\177\0\17'\21\0\0\0\0\360\232D\230\0\0\0\0\0\0\0\0"..., 4096, 2066760675328) = 4096 02:48:08.369396 pwrite64(4, "AB3C\0\0\1\334\0\214\203\377\0\222\350\377\0\0\0\2\20\177[\370\0\0\0\0\0\0\0\0"..., 4096, 4539758931968) = 4096 02:48:08.400392 pwrite64(4, "AB3B\0\0\1\356\0\177s\357\0\200P}\0\0\0\0\310z;\370\0\0\0\0\0\0\0\0"..., 4096, 1722088419328) = 4096 02:48:08.449478 pwrite64(4, "AB3B\0\0\1\361\0\16K~\0\16w\177\0\0\0\0\360\225\242\240\0\0\0\0\0\0\0\0"..., 4096, 2066605228032) = 4096 02:48:08.468108 pwrite64(4, "AB3B\0\0\1\356\0\200\304\177\0\200\322\377\0\0\0\0\310\200s\370\0\0\0\0\0\0\0\0"..., 4096, 1722297085952) = 4096 02:48:08.507720 pwrite64(4, "AB3C\0\0\1\330\0\3\273e\0\3\324 \0\0\0\0mE#\320\0\0\0\0\0\0\0\0"..., 4096, 938622820352) = 4096 02:48:08.533860 pwrite64(4, "AB3C\0\0\1\330\0\3\267\377\0\3\273z\0\0\0\0mE#(\0\0\0\0\0\0\0\0"..., 4096, 938622734336) = 4096 02:48:08.543598 pwrite64(4, "AB3B\0\0\1\356\0\200\321\177\0\200\333\177\0\0\0\0\310\200\177\370\0\0\0\0\0\0\0\0"..., 4096, 1722298658816) = 4096 02:48:08.558949 pwrite64(4, "AB3C\0\0\1\361\377\377\377\377\0D\204\177\0\0\0\2{:\27\370\0\0\0\0\0\0\0\0"..., 4096, 5456557764608) = 4096 02:48:08.590345 pwrite64(4, "AB3B\0\0\1\346\0\22[\377\0\24#\355\0\0\0\1\211\224\357\10\0\0\0\0\0\0\0\0"..., 4096, 3380841680896) = 4096 02:48:08.611959 pwrite64(4, "AB3B\0\0\1\346\0\24#\341\0\24$\355\0\0\0\1\211\224\357h\0\0\0\0\0\0\0\0"..., 4096, 3380841730048) = 4096 02:48:08.613598 pwrite64(4, "AB3B\0\0\1\356\0\0025\3\0\2:}\0\0\0\0+\273\17\370\0\0\0\0\0\0\0\0"..., 4096, 375643959296) = 4096 02:48:08.644121 pwrite64(4, "IAB3\0\0\0\365\0\2\253\177\0\3+\333\0\0\0\2M\203\353h\0\0\0\0\0\0\0\0"..., 4096, 5063897960448) = 4096 02:48:08.684143 pwrite64(4, "AB3B\0\0\1\347\0\t`\377\0\tw\177\0\0\0\1\211?w\370\0\0\0\0\0\0\0\0"..., 4096, 3377973948416) = 4096 02:48:08.725414 pwrite64(4, "AB3B\0\0\1\357\0\0O\177\0\0\205\10\0\0\0\1\236\313\237H\0\0\0\0\0\0\0\0"..., 4096, 3563065348096) = 4096 02:48:08.743048 pwrite64(4, "AB3C\0\1\0\r\377\377\377\377\377\377\377\377\0\0\0\2{:\373\370\0\0\0\0\0\0\0\0"..., 4096, 5456587649024) = 4096 02:48:08.801797 pwrite64(4, "AB3B\0\0\1\333\0\2H\377\0\2S\177\0\0\0\2\244\322\257\370\0\0\0\0\0\0\0\0"..., 4096, 5813865279488) = 4096 02:48:08.822440 pwrite64(4, "AB3C\0\0\1\330\0\3\246F\0\3\273e\0\0\0\0mE\7\370\0\0\0\0\0\0\0\0"..., 4096, 938619170816) = 4096 02:48:08.857336 pwrite64(4, "AB3C\0\0\1\343\0\5\"\177\377\377\377\377\0\0\0\1\6!\23\370\0\0\0\0\0\0\0\0"..., 4096, 2251672776704) = 4096 02:48:08.879419 pwrite64(4, "IAB3\0\0\0\364\0\1`\354\0\3B}\0\0\0\1s7x\360\0\0\0\0\0\0\0\0"..., 4096, 3188727078912) = 4096 02:48:08.911955 pwrite64(4, "IAB3\0\0\0\367\0\2\212\377\0\2\327\177\0\0\0\0027\256\253\370\0\0\0\0\0\0\0\0"..., 4096, 4876353925120) = 4096 02:48:08.932754 pwrite64(4, "AB3B\0\0\1\346\0\24#\355\0\24&\4\0\0\0\1\211\224\367h\0\0\0\0\0\0\0\0"..., 4096, 3380842778624) = 4096 02:48:08.935439 pwrite64(4, "IAB3\0\0\0\352\0\1\326\177\0\1\375\251\0\0\0\2cQ\267\370\0\0\0\0\0\0\0\0"..., 4096, 5251192057856) = 4096 02:48:08.955560 pwrite64(4, "AB3C\0\0\1\363\0\4\264\1\0\5!\315\0\0\0\0011\310~\220\0\0\0\0\0\0\0\0"..., 4096, 2626657525760) = 4096 02:48:08.989116 pwrite64(4, "AB3C\0\1\0\25\377\377\377\377\377\377\377\377\0\0\0\1\34\3'\370\0\0\0\0\0\0\0\0"..., 4096, 2439647326208) = 4096 02:48:09.031863 pwrite64(4, "AB3B\0\0\1\343\0\3x\37\0\4<\t\0\0\0\1\312\222\237\360\0\0\0\0\0\0\0\0"..., 4096, 3939109953536) = 4096 02:48:09.052695 pwrite64(4, "AB3C\0\0\1\362\0\5\320\377\0\6\26\r\0\0\0\2crm\320\0\0\0\0\0\0\0\0"..., 4096, 5252289634304) = 4096 02:48:09.073848 pwrite64(4, "AB3B\0\0\1\356\0\4\366~\0\5\16\177\0\0\0\0\0'\313\370\0\0\0\0\0\0\0\0"..., 4096, 1335357440) = 4096 02:48:09.114344 pwrite64(4, "AB3B\0\0\1\361\0\16\37\205\0\16MT\0\0\0\0\360\225\223\360\0\0\0\0\0\0\0\0"..., 4096, 2066603302912) = 4096 02:48:09.140013 pwrite64(4, "AB3B\0\0\1\365\0\1\326\375\0\1\376\347\0\0\0\1\33\334\2\370\0\0\0\0\0\0\0\0"..., 4096, 2438333853696) = 4096 02:48:09.157652 pwrite64(4, "AB3C\0\0\1\363\377\377\377\377\0\4\323#\0\0\0\2ce\252X\0\0\0\0\0\0\0\0"..., 4096, 5251861360640) = 4096 02:48:09.184558 pwrite64(4, "AB3B\0\0\1\363\0\1\355\177\0\2\7\377\0\0\0\0011\261+\370\0\0\0\0\0\0\0\0"..., 4096, 2625874948096) = 4096 02:48:09.223652 pwrite64(4, "AB3C\0\0\1\357\0\4\360x\0\5\35\177\0\0\0\0\256\316\31\30\0\0\0\0\0\0\0\0"..., 4096, 1501564121088) = 4096 02:48:09.241115 pwrite64(4, "AB3C\0\0\1\322\0Uh\177\0Uo\377\0\0\0\1u\312\217\370\0\0\0\0\0\0\0\0"..., 4096, 3210842468352) = 4096 02:48:09.267226 pwrite64(4, "IAB3\0\0\0\350\0\0\0\6\0\0[\227\0\0\0\0m'\247\200\0\0\0\0\0\0\0\0"..., 4096, 937633447936) = 4096 02:48:09.314391 pwrite64(4, "AB3B\0\0\1\366\0\17\317\377\377\377\377\377\0\0\0\2\"E\27\370\0\0\0\0\0\0\0\0"..., 4096, 4692422684672) = 4096 02:48:09.363113 pwrite64(4, "AB3B\0\0\1\364\0\1\357_\0\2\v\177\0\0\0\1\33\334\1778\0\0\0\0\0\0\0\0"..., 4096, 2438350139392) = 4096 02:48:09.391398 pwrite64(4, "AB3B\0\0\1\356\0\4\357\377\0\4\371\177\0\0\0\0\0'\263\360\0\0\0\0\0\0\0\0"..., 4096, 1332207616) = 4096 02:48:09.422452 pwrite64(4, "AB3C\0\0\1\360\0E\210\177\0H\5\177\0\0\0\2{Rk\370\0\0\0\0\0\0\0\0"..., 4096, 5457374081024) = 4096 02:48:09.457767 pwrite64(4, "AB3C\0\0\1\357\0\5\33#\0\5(\177\0\0\0\0\256\316+\370\0\0\0\0\0\0\0\0"..., 4096, 1501566595072) = 4096 02:48:09.483970 pwrite64(4, "IAB3\0\0\0\350\0\0\v\360\0\1\7\337\0\0\0\0m*$\270\0\0\0\0\0\0\0\0"..., 4096, 937716969472) = 4096 02:48:09.506021 pwrite64(4, "IAB3\0\1\0\f\377\377\377\377\377\377\377\377\0\0\0\0m'\226\210\0\0\0\0\0\0\0\0"..., 4096, 937631223808) = 4096 02:48:09.548011 pwrite64(4, "AB3C\0\0\1\356\0\4NZ\0\5\24\377\0\0\0\0+\321(`\0\0\0\0\0\0\0\0"..., 4096, 376385355776) = 4096 02:48:09.561615 pwrite64(4, "IAB3\0\0\0\355\0\0\343z\0\1j\20\0\0\0\2y\36O\370\0\0\0\0\0\0\0\0"..., 4096, 5438445711360) = 4096 02:48:09.592478 pwrite64(4, "AB3B\0\0\1\333\0\2J\377\0\2T\177\0\0\0\2\244\322\363\370\0\0\0\0\0\0\0\0"..., 4096, 5813874192384) = 4096 02:48:09.626723 pwrite64(4, "IAB3\0\0\0\373\0\3^\214\0\3\253\317\0\0\0\0\0\33\315\230\0\0\0\0\0\0\0\0"..., 4096, 932917248) = 4096 02:48:09.673496 pwrite64(4, "AB3B\0\0\1\367\0\3\251r\0\0078\377\0\0\0\2!\343W\370\0\0\0\0\0\0\0\0"..., 4096, 4689142738944) = 4096 02:48:09.698978 pwrite64(4, "AB3B\0\0\1\343\0\2\230\177\0\2\263\177\0\0\0\1\312\206\327\370\0\0\0\0\0\0\0\0"..., 4096, 3938714644480) = 4096 02:48:09.738524 pwrite64(4, "AB3B\0\0\1\333\0\2S\177\0\3\272\327\0\0\0\2\244\322\373\370\0\0\0\0\0\0\0\0"..., 4096, 5813875240960) = 4096 02:48:09.776789 pwrite64(4, "AB3B\0\0\1\356\0\2:}\0\2S\177\0\0\0\0+\273A\360\0\0\0\0\0\0\0\0"..., 4096, 375650508800) = 4096 02:48:09.794607 pwrite64(4, "IAB3\0\0\0\361\0\0\211\177\0\1\256\177\0\0\0\1\6\1\232\240\0\0\0\0\0\0\0\0"..., 4096, 2250616684544) = 4096 02:48:09.814177 pwrite64(4, "IAB3\0\0\0\351\0\2\"\177\0\2o\377\0\0\0\2\216\375?\370\0\0\0\0\0\0\0\0"..., 4096, 5626314878976) = 4096 02:48:09.866237 pwrite64(4, "AB3C\0\0\1\356\0\6?\377\0\6ap\0\0\0\0\0002\7\370\0\0\0\0\0\0\0\0"..., 4096, 1678766080) = 4096 02:48:09.896858 pwrite64(4, "FIB3\0\0\0\10\377\377\377\377\377\377\377\377\0\0\0\2\217\1?\370\0\0\0\0\0\0\0\0"..., 4096, 5626449096704) = 4096 02:48:09.920866 pwrite64(4, "IAB3\0\0\0\351\0\0W\177\0\0f\253\0\0\0\1\264\240\30@\0\0\0\0\0\0\0\0"..., 4096, 3750583369728) = 4096 02:48:09.950064 pwrite64(4, "AB3B\0\0\1\336\0\2x.\0\2\355r\0\0\0\1\366/\355\240\0\0\0\0\0\0\0\0"..., 4096, 4313755369472) = 4096 02:48:09.983327 pwrite64(4, "AB3C\0\0\1\322\0Ul\377\0W\220\177\0\0\0\1u\312\247\370\0\0\0\0\0\0\0\0"..., 4096, 3210845614080) = 4096 02:48:10.025273 pwrite64(4, "AB3C\0\0\1\334\0\2\272\335\0\2\357\32\0\0\0\0\230\3473\370\0\0\0\0\0\0\0\0"..., 4096, 1313427943424) = 4096 02:48:10.046125 pwrite64(4, "IAB3\0\0\0\362\0\2d\345\0\5\351\314\0\0\0\1\211 t0\0\0\0\0\0\0\0\0"..., 4096, 3376933265408) = 4096 02:48:10.070487 pwrite64(4, "IAB3\0\0\0\351\377\377\377\377\0\0KY\0\0\0\1\264\235(@\0\0\0\0\0\0\0\0"..., 4096, 3750484803584) = 4096 02:48:10.100084 pwrite64(4, "IAB3\0\1\0\v\377\377\377\377\377\377\377\377\0\0\0\1\264\235+\370\0\0\0\0\0\0\0\0"..., 4096, 3750485291008) = 4096 02:48:10.103394 pwrite64(4, "AB3C\0\0\1\364\0\10\217\377\377\377\377\377\0\0\0\1\34\0213\370\0\0\0\0\0\0\0\0"..., 4096, 2440118661120) = 4096 02:48:10.126545 pwrite64(4, "AB3C\0\1\0\16\377\377\377\377\377\377\377\377\0\0\0\0A\231\263\220\0\0\0\0\0\0\0\0"..., 4096, 563503112192) = 4096 02:48:10.145122 pwrite64(4, "AB3B\0\0\1\333\0\2T\177\0\4\206\377\0\0\0\2\244\336.\270\0\0\0\0\0\0\0\0"..., 4096, 5814250991616) = 4096 02:48:10.183675 pwrite64(4, "AB3C\0\0\1\333\0$>}\0F\245b\0\0\0\2\246\303S\340\0\0\0\0\0\0\0\0"..., 4096, 5830529761280) = 4096 02:48:10.228044 pwrite64(4, "XAGI\0\0\0\1\0\0\0\24\2\272\225\0\0\2\177\300\0\0\1\177\0\0\0\2\0\0\0\10"..., 512, 3750483723264) = 512 02:48:10.265614 pwrite64(4, "XAFL\0\0\0\24\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 3750483723776) = 512 02:48:10.266046 pwrite64(4, "XAGF\0\0\0\1\0\0\0\24\2\272\225\0\0\4\211\250\0\10\234\177\0\0\0\0\0\0\0\2"..., 512, 3750483722752) = 512 02:48:10.267026 pwrite64(4, "AB3C\0\0\1\361\0\17S}\0\17\301x\0\0\0\0\360\241C\200\0\0\0\0\0\0\0\0"..., 4096, 2066995412992) = 4096 02:48:10.283033 pwrite64(4, "AB3C\0\0\1\361\0\17\301x\0\0220A\0\0\0\0\360\241C\320\0\0\0\0\0\0\0\0"..., 4096, 2066995453952) = 4096 02:48:10.283999 pwrite64(4, "AB3C\0\0\1\361\0\17\301p\0\17\301z\0\0\0\0\360\241C\300\0\0\0\0\0\0\0\0"..., 4096, 2066995445760) = 4096 02:48:10.288191 pwrite64(4, "AB3B\0\0\1\346\0\tt\377\0\rU\177\0\0\0\1\211?\213\370\0\0\0\0\0\0\0\0"..., 4096, 3377976569856) = 4096 02:48:10.319931 pwrite64(4, "AB3B\0\0\1\356\0\200\322\377\0\200\342\177\0\0\0\0\310\200\303\370\0\0\0\0\0\0\0\0"..., 4096, 1722307571712) = 4096 02:48:10.347620 pwrite64(4, "AB3B\0\0\1\343\0\2g\177\0\2\241\377\0\0\0\1\312\206\213\370\0\0\0\0\0\0\0\0"..., 4096, 3938704683008) = 4096 02:48:10.384629 pwrite64(4, "AB3C\0\0\1\364\0\10`\377\0\10\225\177\0\0\0\1\34\21\7\370\0\0\0\0\0\0\0\0"..., 4096, 2440112893952) = 4096 02:48:10.424629 pwrite64(4, "IAB3\0\0\0\365\0V\235\177\377\377\377\377\0\0\0\0\310nox\0\0\0\0\0\0\0\0"..., 4096, 1721692516352) = 4096 02:48:10.452573 pwrite64(4, "IAB3\0\0\0\371\0\0\217\210\0\1\36{\0\0\0\2!\312^h\0\0\0\0\0\0\0\0"..., 4096, 4688304721920) = 4096 02:48:10.483752 pwrite64(4, "AB3C\0\0\1\364\0\7W\177\0\7\264\177\0\0\0\1\34\10\17\370\0\0\0\0\0\0\0\0"..., 4096, 2439811952640) = 4096 02:48:10.504012 pwrite64(4, "AB3C\0\0\1\357\0\5\227~\0\6\30\5\0\0\0\0\256\322\30\330\0\0\0\0\0\0\0\0"..., 4096, 1501698306048) = 4096 02:48:10.525828 pwrite64(4, "IAB3\0\0\0\366\0\2\362]\0\3+\21\0\0\0\0027\261\33\370\0\0\0\0\0\0\0\0"..., 4096, 4876435714048) = 4096 02:48:10.551610 pwrite64(4, "AB3B\0\0\1\353\0\0040\377\0\5)\377\0\0\0\1\340o\247\370\0\0\0\0\0\0\0\0"..., 4096, 4126915162112) = 4096 02:48:10.581710 pwrite64(4, "AB3B\0\1\0\21\377\377\377\377\377\377\377\377\0\0\0\1\236\313gx\0\0\0\0\0\0\0\0"..., 4096, 3563058032640) = 4096 02:48:10.597497 pwrite64(4, "AB3C\0\0\1\322\0U^\377\0Uh\177\0\0\0\1u\312S\370\0\0\0\0\0\0\0\0"..., 4096, 3210834604032) = 4096 02:48:10.624093 pwrite64(4, "AB3B\0\1\0\20\377\377\377\377\377\377\377\377\0\0\0\0011\255G\370\0\0\0\0\0\0\0\0"..., 4096, 2625744400384) = 4096 02:48:10.640827 pwrite64(4, "IAB3\0\0\0\353\0\1\264\v\0\1\352\377\0\0\0\2cQ\23\370\0\0\0\0\0\0\0\0"..., 4096, 5251170562048) = 4096 02:48:10.658317 pwrite64(4, "IAB3\0\0\0\365\0\0039\177\0\3\321\177\0\0\0\1\340c\327\350\0\0\0\0\0\0\0\0"..., 4096, 4126518792192) = 4096 02:48:10.687419 pwrite64(4, "AB3C\0\1\0\16\377\377\377\377\377\377\377\377\0\0\0\2\17\371\303\370\0\0\0\0\0\0\0\0"..., 4096, 4535276269568) = 4096 02:48:10.700898 pwrite64(4, "AB3B\0\0\1\356\0\200\333\177\0\200\351\377\0\0\0\0\310\200\373\370\0\0\0\0\0\0\0\0"..., 4096, 1722314911744) = 4096 02:48:10.752218 pwrite64(4, "AB3B\0\0\1\353\0\5&\377\0\5K\377\0\0\0\1\340o\277\370\0\0\0\0\0\0\0\0"..., 4096, 4126918307840) = 4096 02:48:10.780088 pwrite64(4, "AB3B\0\0\1\324\0\2yI\0\2\235\345\0\0\0\0A\222\33\220\0\0\0\0\0\0\0\0"..., 4096, 563248308224) = 4096 02:48:10.818918 pwrite64(4, "AB3C\0\0\1\322\0Ue\177\0Ul\377\0\0\0\1u\312k\370\0\0\0\0\0\0\0\0"..., 4096, 3210837749760) = 4096 02:48:10.836951 pwrite64(4, "AB3C\0\0\1\324\377\377\377\377\0\3\202\316\0\0\0\0A\231\236\0\0\0\0\0\0\0\0\0"..., 4096, 563500285952) = 4096 02:48:10.842148 pwrite64(4, "AB3B\0\0\1\333\0\0023\311\0\2H\377\0\0\0\2\244\322'\370\0\0\0\0\0\0\0\0"..., 4096, 5813847453696) = 4096 02:48:10.895398 pwrite64(4, "AB3C\0\0\1\363\0\7\25\201\0\t6\377\0\0\0\0\332\230\27\370\0\0\0\0\0\0\0\0"..., 4096, 1877709156352) = 4096 02:48:10.914856 pwrite64(4, "IAB3\0\0\0\351\0\0_\10\0\0\250\231\0\0\0\1\264\240UX\0\0\0\0\0\0\0\0"..., 4096, 3750591377408) = 4096 02:48:10.956843 pwrite64(4, "IAB3\0\0\0\355\0\0v\210\0\0\350\377\0\0\0\2y\36#\320\0\0\0\0\0\0\0\0"..., 4096, 5438439923712) = 4096 02:48:10.988522 pwrite64(4, "AB3B\0\0\1\343\0\3\35h\0\3oz\0\0\0\1\312\212\303\370\0\0\0\0\0\0\0\0"..., 4096, 3938846240768) = 4096 02:48:11.008558 pwrite64(4, "AB3C\0\1\0\16\377\377\377\377\377\377\377\377\0\0\0\1\343A\343\370\0\0\0\0\0\0\0\0"..., 4096, 4151149326336) = 4096 02:48:11.025963 pwrite64(4, "AB3B\0\0\1\356\0\2>>\0\2T\337\0\0\0\0+\273\353\370\0\0\0\0\0\0\0\0"..., 4096, 375672795136) = 4096 02:48:11.069497 pwrite64(4, "AB3C\0\0\1\347\0\3}\177\0\3\354\5\0\0\0\0\25\360\230\360\0\0\0\0\0\0\0\0"..., 4096, 188461735936) = 4096 02:48:11.084339 pwrite64(4, "AB3B\0\0\1\356\0\2S\177\0\2Z\315\0\0\0\0+\273\366\370\0\0\0\0\0\0\0\0"..., 4096, 375674236928) = 4096 02:48:11.100768 pwrite64(4, "AB3C\0\0\1\350\0\3e\377\0\3~\36\0\0\0\0\25\360\223\370\0\0\0\0\0\0\0\0"..., 4096, 188461084672) = 4096 02:48:11.110667 pwrite64(4, "AB3B\0\0\0\1\377\377\377\377\377\377\377\377\0\0\0\2\272\225\0\20\0\0\0\0\0\0\0\0"..., 4096, 6000773963776) = 4096 02:48:11.138759 pwrite64(4, "AB3C\0\0\0\1\377\377\377\377\377\377\377\377\0\0\0\2\272\225\0\30\0\0\0\0\0\0\0\0"..., 4096, 6000773967872) = 4096 02:48:11.139997 pwrite64(4, "XAGF\0\0\0\1\0\0\0 \0\0\20\0\0\0\0\2\0\0\0\3\0\0\0\0\0\0\0\1"..., 512, 6000773956096) = 512 02:48:11.173254 pwrite64(4, "XAGI\0\0\0\1\0\0\0 \0\0\20\0\0\0\5@\0\0\0u\0\0\0\1\0\0\0\0"..., 512, 6000773956608) = 512 02:48:11.173689 pwrite64(4, "XAFL\0\0\0 \24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 6000773957120) = 512 02:48:11.173982 pwrite64(4, "FIB3\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\2\272\225\0\10\0\0\0\0\0\0\0\0"..., 4096, 6000773959680) = 4096 02:48:11.175121 pwrite64(4, "IAB3\0\0\0\25\377\377\377\377\377\377\377\377\0\0\0\2\272\225\3\250\0\0\0\0\0\0\0\0"..., 4096, 6000774434816) = 4096 02:48:11.177591 pwrite64(4, "AB3C\0\0\1\322\0UU\377\0Ue\177\0\0\0\1u\312\37\370\0\0\0\0\0\0\0\0"..., 4096, 3210827788288) = 4096 02:48:11.203885 pwrite64(4, "AB3B\0\0\1\355\0\200\342\177\377\377\377\377\0\0\0\0\310\2017\370\0\0\0\0\0\0\0\0"..., 4096, 1722322776064) = 4096 02:48:11.250132 pwrite64(4, "AB3C\0\0\1\344\0=\6\177\0_\277\377\0\0\0\1\267\232K\370\0\0\0\0\0\0\0\0"..., 4096, 3776158625792) = 4096 02:48:11.296314 pwrite64(4, "AB3B\0\0\1\360\377\377\377\377\0\3\332\177\0\0\0\2y/\231\300\0\0\0\0\0\0\0\0"..., 4096, 5439025807360) = 4096 02:48:11.332427 pwrite64(4, "AB3B\0\0\1\357\0\2^~\0\3!B\0\0\0\1\236\3373\370\0\0\0\0\0\0\0\0"..., 4096, 3563722371072) = 4096 02:48:11.364295 pwrite64(4, "AB3C\0\0\1\343\0\5\37\24\0\5&\177\0\0\0\1\6 \363\370\0\0\0\0\0\0\0\0"..., 4096, 2251668582400) = 4096 02:48:11.384847 pwrite64(4, "AB3B\0\0\1\364\0\3\2566\0\3\344\300\0\0\0\1\33\353\217\360\0\0\0\0\0\0\0\0"..., 4096, 2438855647232) = 4096 02:48:11.444210 pwrite64(4, "AB3C\0\0\1\333\0W\r\377\377\377\377\377\0\0\0\2\247y\257\370\0\0\0\0\0\0\0\0"..., 4096, 5836648738816) = 4096 02:48:11.468194 pwrite64(4, "AB3C\0\0\1\344\0\4\215H\0\5\"\177\0\0\0\1\6 \330\240\0\0\0\0\0\0\0\0"..., 4096, 2251664998400) = 4096 02:48:11.491101 pwrite64(4, "AB3C\0\0\1\344\0\2\246}\0\2\345$\0\0\0\1\6\r\277\370\0\0\0\0\0\0\0\0"..., 4096, 2251024232448) = 4096 02:48:11.512288 pwrite64(4, "AB3B\0\0\1\356\0\4\247\377\0\4\357\377\0\0\0\0\0&\7\370\0\0\0\0\0\0\0\0"..., 4096, 1276112896) = 4096 02:48:11.563400 pwrite64(4, "AB3C\0\0\1\362\0\6\1\272\0\t\251\177\0\0\0\2cs\20h\0\0\0\0\0\0\0\0"..., 4096, 5252310945792) = 4096 02:48:11.598060 pwrite64(4, "AB3C\0\0\1\363\0\t0\377\0\fo\376\0\0\0\0\332\230G\370\0\0\0\0\0\0\0\0"..., 4096, 1877715447808) = 4096 02:48:11.623091 pwrite64(4, "AB3C\0\0\1\356\377\377\377\377\0\200\363\177\0\0\0\0\310\201_\370\0\0\0\0\0\0\0\0"..., 4096, 1722328018944) = 4096 02:48:11.655942 pwrite64(4, "AB3B\0\1\0\22\377\377\377\377\377\377\377\377\0\0\0\1\211>\3\370\0\0\0\0\0\0\0\0"..., 4096, 3377925189632) = 4096 02:48:11.702743 pwrite64(4, "AB3B\0\0\1\364\0\3\340\376\0\4\332\222\0\0\0\1\33\353\256\0\0\0\0\0\0\0\0\0"..., 4096, 2438859587584) = 4096 02:48:11.766228 pwrite64(4, "AB3B\0\0\1\366\0\7\270\375\0\10\351c\0\0\0\2\"\2S\370\0\0\0\0\0\0\0\0"..., 4096, 4690182402048) = 4096 02:48:11.795280 pwrite64(4, "AB3C\0\0\1\343\0_\312\377\0`&\377\0\0\0\1\267\235\277\370\0\0\0\0\0\0\0\0"..., 4096, 3776274493440) = 4096 02:48:11.821643 pwrite64(4, "AB3B\0\0\1\356\0\2\30\377\0\2'\377\0\0\0\0+\2727\370\0\0\0\0\0\0\0\0"..., 4096, 375615647744) = 4096 02:48:11.849542 pwrite64(4, "AB3C\0\0\1\334\0\201K\377\0\214\203\377\0\0\0\2\17\372{\370\0\0\0\0\0\0\0\0"..., 4096, 4535300386816) = 4096 02:48:11.880690 pwrite64(4, "AB3C\0\0\1\363\0\4\305\7\0\4\353\226\0\0\0\0\203#\3 \0\0\0\0\0\0\0\0"..., 4096, 1126456246272) = 4096 02:48:11.906500 pwrite64(4, "AB3B\0\0\1\343\0\3\25\177\0\3\37\177\0\0\0\1\312\212\263@\0\0\0\0\0\0\0\0"..., 4096, 3938844049408) = 4096 02:48:11.940092 pwrite64(4, "AB3C\0\1\0\17\377\377\377\377\377\377\377\377\0\0\0\0\310\201{\370\0\0\0\0\0\0\0\0"..., 4096, 1722331688960) = 4096 02:48:11.976357 pwrite64(4, "AB3C\0\0\1\363\0\4\227\265\0\4\264\1\0\0\0\0011\305\356X\0\0\0\0\0\0\0\0"..., 4096, 2626571513856) = 4096 02:48:12.008927 pwrite64(4, "AB3B\0\0\1\356\0\2\10\377\0\2\27\375\0\0\0\0+\272\7\370\0\0\0\0\0\0\0\0"..., 4096, 375609356288) = 4096 02:48:12.046288 pwrite64(4, "AB3C\0\0\1\363\0\4\226\177\0\4\227\313\0\0\0\0011\305\355\250\0\0\0\0\0\0\0\0"..., 4096, 2626571423744) = 4096 02:48:12.100009 pwrite64(4, "IAB3\0\0\0\373\0\1\221\275\0\0021\311\0\0\0\0\0\17\2h\0\0\0\0\0\0\0\0"..., 4096, 503631872) = 4096 02:48:12.111805 pwrite64(4, "IAB3\0\0\0\356\0\2\267\320\0\2\275\222\0\0\0\0\256\272\377\370\0\0\0\0\0\0\0\0"..., 4096, 1500923293696) = 4096 02:48:12.131345 pwrite64(4, "IAB3\0\0\0\356\0\1h\334\0\2\267\377\0\0\0\0\256\272\376\200\0\0\0\0\0\0\0\0"..., 4096, 1500923101184) = 4096 02:48:12.140085 pwrite64(4, "AB3B\0\0\1\356\0\2\26\377\0\2\30\377\0\0\0\0+\272\17\350\0\0\0\0\0\0\0\0"..., 4096, 375610396672) = 4096 02:48:12.159670 pwrite64(4, "AB3C\0\0\1\363\0\4|\210\0\4\227\265\0\0\0\0011\305\343\370\0\0\0\0\0\0\0\0"..., 4096, 2626570153984) = 4096 02:48:12.180798 pwrite64(4, "IAB3\0\0\0\371\0\3=-\0\3\236\177\0\0\0\2!\337,\320\0\0\0\0\0\0\0\0"..., 4096, 4689002864640) = 4096 02:48:12.203041 pwrite64(4, "AB3B\0\0\1\347\0\10\273\177\0\t`\377\0\0\0\1\211>w\370\0\0\0\0\0\0\0\0"..., 4096, 3377940393984) = 4096 02:48:12.253872 pwrite64(4, "IAB3\0\0\0\361\377\377\377\377\0\0\303G\0\0\0\0\25\324\264\0\0\0\0\0\0\0\0\0"..., 4096, 187525758976) = 4096 02:48:12.282763 pwrite64(4, "AB3B\0\0\1\356\0\2\27\375\0\2\34\377\0\0\0\0+\272\27\370\0\0\0\0\0\0\0\0"..., 4096, 375611453440) = 4096 02:48:12.297600 pwrite64(4, "AB3C\0\0\1\343\0\r\26\377\0\r7\177\0\0\0\1\312\332\327\370\0\0\0\0\0\0\0\0"..., 4096, 3941533216768) = 4096 02:48:12.319927 pwrite64(4, "XAFL\0\0\0\1\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 187524187648) = 512 02:48:12.337180 pwrite64(4, "XAGI\0\0\0\1\0\0\0\1\2\272\225\0\0\2\224\200\0\0\255|\0\0\0\2\0\0\0\344"..., 512, 187524187136) = 512 02:48:12.338855 pwrite64(4, "XAGF\0\0\0\1\0\0\0\1\2\272\225\0\0\2\211\377\0\3_\377\0\0\0\0\0\0\0\2"..., 512, 187524186624) = 512 02:48:12.339964 pwrite64(4, "AB3B\0\0\1\364\0\1\215\214\0\1\264\177\0\0\0\0011\255\247\370\0\0\0\0\0\0\0\0"..., 4096, 2625756983296) = 4096 02:48:12.382453 pwrite64(4, "IAB3\0\0\0\373\0\3\25\376\0\3y\263\0\0\0\0\0\32\364`\0\0\0\0\0\0\0\0"..., 4096, 904445952) = 4096 02:48:12.405331 pwrite64(4, "AB3C\0\0\1\343\0\24m\177\0\24x\177\0\0\0\1H\31\223\370\0\0\0\0\0\0\0\0"..., 4096, 2818356801536) = 4096 02:48:12.434877 pwrite64(4, "IAB3\0\0\0\367\0\0N\21\0\0\260\352\0\0\0\0WU\21\270\0\0\0\0\0\0\0\0"..., 4096, 750178758656) = 4096 02:48:12.462256 pwrite64(4, "IAB3\0\0\0\367\0\0L\375\0\0N7\0\0\0\0WU\20\210\0\0\0\0\0\0\0\0"..., 4096, 750178603008) = 4096 02:48:12.470637 pwrite64(4, "IAB3\0\0\0\356\0\0\32\26\0\1h\334\0\0\0\0\256\255\373\260\0\0\0\0\0\0\0\0"..., 4096, 1500486524928) = 4096 02:48:12.494071 pwrite64(4, "AB3B\0\0\1\364\0\1v(\0\1\216\377\0\0\0\0011\255\234`\0\0\0\0\0\0\0\0"..., 4096, 2625755463680) = 4096 02:48:12.519999 pwrite64(4, "AB3C\0\0\1\355\0\200\356\377\0\201/\177\0\0\0\0\310\201\203\370\0\0\0\0\0\0\0\0"..., 4096, 1722332737536) = 4096 02:48:12.535782 pwrite64(4, "AB3C\0\0\1\343\0\24w\177\0\24\254\377\0\0\0\1H\31\233\370\0\0\0\0\0\0\0\0"..., 4096, 2818357850112) = 4096 02:48:12.562790 pwrite64(4, "IAB3\0\1\0\f\377\377\377\377\377\377\377\377\0\0\0\1]\212?\210\0\0\0\0\0\0\0\0"..., 4096, 3002526011392) = 4096 02:48:12.596812 pwrite64(4, "AB3C\0\0\1\352\0\\\322\377\0`\265~\0\0\0\1\343L\27\360\0\0\0\0\0\0\0\0"..., 4096, 4151491682304) = 4096 02:48:12.618056 pwrite64(4, "AB3C\0\0\1\353\0`\264\376\0b\36\177\0\0\0\1\343L\33\360\0\0\0\0\0\0\0\0"..., 4096, 4151492206592) = 4096 02:48:12.619051 pwrite64(4, "IAB3\0\0\0\351\0\0\250\231\0\1iR\0\0\0\1\264\243?\310\0\0\0\0\0\0\0\0"..., 4096, 3750689214464) = 4096 02:48:12.632920 pwrite64(4, "IAB3\0\0\0\370\377\377\377\377\0\10=\376\0\0\0\1]\2120@\0\0\0\0\0\0\0\0"..., 4096, 3002524008448) = 4096 02:48:12.652885 pwrite64(4, "AB3C\0\0\1\356\0\6\r\271\0\0068\177\0\0\0\0\0001g\370\0\0\0\0\0\0\0\0"..., 4096, 1657794560) = 4096 02:48:12.686509 pwrite64(4, "XAGF\0\0\0\1\0\0\0\33\2\272\225\0\0\17@\377\0\17zq\0\0\0\0\0\0\0\2"..., 512, 5063153025536) = 512 02:48:12.714644 pwrite64(4, "XAGI\0\0\0\1\0\0\0\33\2\272\225\0\0\2\242\0\0\0\2\210\0\0\0\2\0\0\0O"..., 512, 5063153026048) = 512 02:48:12.715046 pwrite64(4, "XAFL\0\0\0\33\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 5063153026560) = 512 02:48:12.715469 pwrite64(4, "FIB3\0\0\0\5\377\377\377\377\377\377\377\377\0\0\0\2M\237\263\370\0\0\0\0\0\0\0\0"..., 4096, 5064830218240) = 4096 02:48:12.751586 pwrite64(4, "AB3B\0\0\1\323\0\0039\177\0\3jr\0\0\0\0A\231Dp\0\0\0\0\0\0\0\0"..., 4096, 563488546816) = 4096 02:48:12.799535 pwrite64(4, "AB3B\0\0\1\323\0\3i\216\0\3k\\\0\0\0\0A\231K\220\0\0\0\0\0\0\0\0"..., 4096, 563489480704) = 4096 02:48:12.842342 pwrite64(4, "AB3B\0\0\1\343\0\3\24\177\0\3\35h\0\0\0\1\312\212s\370\0\0\0\0\0\0\0\0"..., 4096, 3938835755008) = 4096 02:48:12.866188 pwrite64(4, "IAB3\0\0\0\367\0\0\t\261\0\0N\21\0\0\0\0WU\7\350\0\0\0\0\0\0\0\0"..., 4096, 750177472512) = 4096 02:48:12.897634 pwrite64(4, "AB3B\0\0\1\346\377\377\377\377\0\4\210\177\0\0\0\2\217\2\1\0\0\0\0\0\0\0\0\0"..., 4096, 5626474397696) = 4096 02:48:12.923849 pwrite64(4, "AB3B\0\0\1\323\0\3jr\377\377\377\377\0\0\0\0A\231R\340\0\0\0\0\0\0\0\0"..., 4096, 563490439168) = 4096 02:48:12.954566 pwrite64(4, "AB3B\0\0\1\343\0\2\263\177\0\3\25\177\0\0\0\1\312\212k\370\0\0\0\0\0\0\0\0"..., 4096, 3938834706432) = 4096 02:48:12.980377 pwrite64(4, "AB3B\0\0\1\352\0S\217\377\0Tb\177\0\0\0\1\342\350\327\370\0\0\0\0\0\0\0\0"..., 4096, 4148161409024) = 4096 02:48:13.014170 pwrite64(4, "AB3C\0\0\1\363\0\4\342d\0\6x\377\0\0\0\0\203#L\260\0\0\0\0\0\0\0\0"..., 4096, 1126465888256) = 4096 02:48:13.037326 pwrite64(4, "AB3B\0\0\1\367\0\0078\377\0\7\275\177\0\0\0\2\"\2/\350\0\0\0\0\0\0\0\0"..., 4096, 4690177675264) = 4096 02:48:13.076913 pwrite64(4, "AB3C\0\0\1\364\0\7E\177\0\7p\377\0\0\0\1\34\7C\370\0\0\0\0\0\0\0\0"..., 4096, 2439785213952) = 4096 02:48:13.095606 pwrite64(4, "AB3C\0\0\1\346\0\24T\377\0\24p\177\0\0\0\1\211\227+\370\0\0\0\0\0\0\0\0"..., 4096, 3380916776960) = 4096 02:48:13.141202 pwrite64(4, "AB3C\0\0\1\333\0\200\331\177\0\201W\177\0\0\0\2\17\372\37\370\0\0\0\0\0\0\0\0"..., 4096, 4535288328192) = 4096 02:48:13.162445 pwrite64(4, "AB3B\0\0\1\333\0,\n\177\0\200\321\377\0\0\0\2\r\351\337\370\0\0\0\0\0\0\0\0"..., 4096, 4517563199488) = 4096 02:48:13.186224 pwrite64(4, "AB3B\0\0\1\366\0\vv\377\0\17\235\177\0\0\0\2\" o\370\0\0\0\0\0\0\0\0"..., 4096, 4691192705024) = 4096 02:48:13.224639 pwrite64(4, "IAB3\0\0\0\370\0\0\1\10\0\0\22\377\0\0\0\0\230\321*\0\0\0\0\0\0\0\0\0"..., 4096, 1312688439296) = 4096 02:48:13.274425 pwrite64(4, "IAB3\0\0\0\370\0\0\22@\0\0-\177\0\0\0\0\230\321/\370\0\0\0\0\0\0\0\0"..., 4096, 1312689221632) = 4096 02:48:13.277904 pwrite64(4, "FIB3\0\0\0\3\377\377\377\377\377\377\377\377\0\0\0\2y.7\370\0\0\0\0\0\0\0\0"..., 4096, 5438979436544) = 4096 02:48:13.308437 pwrite64(4, "IAB3\0\0\0\366\377\377\377\377\0\0.\36\0\0\0\2Mm\312\240\0\0\0\0\0\0\0\0"..., 4096, 5063155466240) = 4096 02:48:13.324988 pwrite64(4, "IAB3\0\1\0\v\377\377\377\377\377\377\377\377\0\0\0\2Mm\314@\0\0\0\0\0\0\0\0"..., 4096, 5063155679232) = 4096 02:48:13.347136 pwrite64(4, "AB3B\0\0\1\362\0\2{\377\0\3\26\213\0\0\0\2cV{\370\0\0\0\0\0\0\0\0"..., 4096, 5251351965696) = 4096 02:48:13.403228 pwrite64(4, "FIB3\0\0\0\3\377\377\377\377\377\377\377\377\0\0\0\0\310oW\370\0\0\0\0\0\0\0\0"..., 4096, 1721722990592) = 4096 02:48:13.433513 pwrite64(4, "AB3C\0\0\1\346\0\24k\177\0\24q\177\0\0\0\1\211\227S\370\0\0\0\0\0\0\0\0"..., 4096, 3380922019840) = 4096 02:48:13.448601 pwrite64(4, "AB3B\0\0\1\356\0\2'\377\0\0022\377\0\0\0\0+\272\270H\0\0\0\0\0\0\0\0"..., 4096, 375632465920) = 4096 02:48:13.470421 pwrite64(4, "AB3C\0\0\1\343\0\2/\373\0\2\273\377\0\0\0\1\6\r\23\350\0\0\0\0\0\0\0\0"..., 4096, 2251001679872) = 4096 02:48:13.486280 pwrite64(4, "AB3C\0\0\1\346\0\24p\177\0\24s\177\0\0\0\1\211\227[\370\0\0\0\0\0\0\0\0"..., 4096, 3380923068416) = 4096 02:48:13.488164 pwrite64(4, "AB3B\0\0\1\336\0\2R\264\0\2\232\264\0\0\0\1\366.\331p\0\0\0\0\0\0\0\0"..., 4096, 4313719169024) = 4096 02:48:13.542117 pwrite64(4, "FIB3\0\0\0\5\377\377\377\377\377\377\377\377\0\0\0\0A\202g\370\0\0\0\0\0\0\0\0"..., 4096, 562721452032) = 4096 02:48:13.562576 pwrite64(4, "AB3B\0\0\1\366\0\10\351c\0\v\200\377\0\0\0\2\" \37\370\0\0\0\0\0\0\0\0"..., 4096, 4691182219264) = 4096 02:48:13.594147 pwrite64(4, "AB3B\0\0\1\361\0\16\31\177\0\16K~\0\0\0\0\360\2244(\0\0\0\0\0\0\0\0"..., 4096, 2066557194240) = 4096 02:48:13.624042 pwrite64(4, "AB3B\0\0\1\323\377\377\377\377\0\1\346\177\0\0\0\0A\202}\0\0\0\0\0\0\0\0\0"..., 4096, 562724208640) = 4096 02:48:13.638562 pwrite64(4, "AB3C\0\0\1\346\0\24q\177\377\377\377\377\0\0\0\1\211\227k\370\0\0\0\0\0\0\0\0"..., 4096, 3380925165568) = 4096 02:48:13.663612 pwrite64(4, "IAB3\0\0\0\370\0\10=\376\0\10|\360\0\0\0\1]\215\247\350\0\0\0\0\0\0\0\0"..., 4096, 3002640355328) = 4096 02:48:13.696470 pwrite64(4, "AB3B\0\0\1\356\0\2\34\377\0\2-\t\0\0\0\0+\272\217\370\0\0\0\0\0\0\0\0"..., 4096, 375627182080) = 4096 02:48:13.735281 pwrite64(4, "AB3B\0\0\1\352\0\5\343\177\0\n\220\377\0\0\0\1\340y(\30\0\0\0\0\0\0\0\0"..., 4096, 4127233945600) = 4096 02:48:13.764675 pwrite64(4, "AB3C\0\0\1\356\0\6,\377\0\6?\377\0\0\0\0\0001\303\370\0\0\0\0\0\0\0\0"..., 4096, 1669853184) = 4096 02:48:13.799037 pwrite64(4, "AB3B\0\0\1\361\0\16\22\377\0\16\37\205\0\0\0\0\360\224\3\370\0\0\0\0\0\0\0\0"..., 4096, 2066550878208) = 4096 02:48:13.824133 pwrite64(4, "AB3C\0\0\1\363\0\4F\326\0\4\226\177\0\0\0\0011\305\24@\0\0\0\0\0\0\0\0"..., 4096, 2626542927872) = 4096 02:48:13.848578 pwrite64(4, "IAB3\0\0\0\352\0\0\0\v\0\0\t\301\0\0\0\0A~\0@\0\0\0\0\0\0\0\0"..., 4096, 562573639680) = 4096 02:48:13.874735 pwrite64(4, "IAB3\0\0\0\365\0\0037\177\0\3\254\375\0\0\0\1\340`;\370\0\0\0\0\0\0\0\0"..., 4096, 4126397689856) = 4096 02:48:13.910349 pwrite64(4, "AB3B\0\0\1\356\0\2-\t\0\0025\3\0\0\0\0+\272\347\370\0\0\0\0\0\0\0\0"..., 4096, 375638716416) = 4096 02:48:13.944457 pwrite64(4, "AB3C\0\0\1\343\0\nDu\0\r!\377\0\0\0\1\312\332\177\370\0\0\0\0\0\0\0\0"..., 4096, 3941521682432) = 4096 02:48:13.964705 pwrite64(4, "AB3B\0\0\1\363\0\3\317+\0\4\5y\0\0\0\0\203\33\313\370\0\0\0\0\0\0\0\0"..., 4096, 1126214135808) = 4096 02:48:13.986832 pwrite64(4, "IAB3\0\0\0\365\0\0033\20\0\0039\177\0\0\0\1\340`+\370\0\0\0\0\0\0\0\0"..., 4096, 4126395592704) = 4096 02:48:14.008558 pwrite64(4, "AB3B\0\0\1\355\377\377\377\377\0\4\300\377\0\0\0\0\0%?\370\0\0\0\0\0\0\0\0"..., 4096, 1249898496) = 4096 02:48:14.024611 pwrite64(4, "AB3B\0\0\1\323\0\2\311)\0\3\5e\0\0\0\0A\225L\20\0\0\0\0\0\0\0\0"..., 4096, 563355328512) = 4096 02:48:14.040105 pwrite64(4, "AB3B\0\0\1\362\0\2V\377\0\2\203\177\0\0\0\2cV?\370\0\0\0\0\0\0\0\0"..., 4096, 5251344101376) = 4096 02:48:14.072776 pwrite64(4, "AB3B\0\0\1\347\0\tT\377\0\tt\377\0\0\0\1\211>\327\370\0\0\0\0\0\0\0\0"..., 4096, 3377952976896) = 4096 02:48:14.093521 pwrite64(4, "IAB3\0\0\0\367\0\2\327\177\0\2\356\177\0\0\0\0027\260G\370\0\0\0\0\0\0\0\0"..., 4096, 4876407926784) = 4096 02:48:14.121509 pwrite64(4, "AB3B\0\0\1\356\0\0022\377\0\0027\377\0\0\0\0+\272\370\30\0\0\0\0\0\0\0\0"..., 4096, 375640829952) = 4096 02:48:14.147284 pwrite64(4, "IAB3\0\1\0\f\377\377\377\377\377\377\377\377\0\0\0\1\33\322V\210\0\0\0\0\0\0\0\0"..., 4096, 2438009262080) = 4096 02:48:14.173680 pwrite64(4, "AB3B\0\0\1\344\0\7g\334\0\7\301\177\0\0\0\1\264\333\23\370\0\0\0\0\0\0\0\0"..., 4096, 3752562520064) = 4096 02:48:14.212212 pwrite64(4, "AB3B\0\0\1\346\0\0061C\0\25\17~\0\0\0\2\217\35\307\370\0\0\0\0\0\0\0\0"..., 4096, 5627406446592) = 4096 02:48:14.245115 pwrite64(4, "AB3C\0\0\1\356\0\0068\177\0\6@\377\0\0\0\0\0001\377\370\0\0\0\0\0\0\0\0"..., 4096, 1677717504) = 4096 02:48:14.278310 pwrite64(4, "AB3C\0\0\1\322\0W\274\177\0\\\267\177\0\0\0\1u\344\367\370\0\0\0\0\0\0\0\0"..., 4096, 3211728515072) = 4096 02:48:14.324765 pwrite64(4, "IAB3\0\0\0\356\0\0\1\210\0\0\343\250\0\0\0\1\33\322[\370\0\0\0\0\0\0\0\0"..., 4096, 2438009974784) = 4096 02:48:14.343790 pwrite64(4, "AB3C\0\0\1\363\0\4\353\226\0\6\236H\0\0\0\0\203/\267\370\0\0\0\0\0\0\0\0"..., 4096, 1126882603008) = 4096 02:48:14.377403 pwrite64(4, "AB3C\0\0\1\343\0\22\271\177\0\24w\177\0\0\0\1H\31C\370\0\0\0\0\0\0\0\0"..., 4096, 2818346315776) = 4096 02:48:14.392461 pwrite64(4, "AB3C\0\0\1\343\0\r7\177\0\r<\377\0\0\0\1\312\333\233\370\0\0\0\0\0\0\0\0"..., 4096, 3941558906880) = 4096 02:48:14.414213 pwrite64(4, "IAB3\0\0\0\350\0\1\21\\\0\1E\377\0\0\0\0m1Z\30\0\0\0\0\0\0\0\0"..., 4096, 937958846464) = 4096 02:48:14.438767 pwrite64(4, "AB3C\0\0\1\363\0\4\227\313\0\4\351\322\0\0\0\0011\306\320\10\0\0\0\0\0\0\0\0"..., 4096, 2626601095168) = 4096 02:48:14.464421 pwrite64(4, "AB3B\0\0\1\364\0\1\312\362\0\1\377\177\0\0\0\0011\260\233\370\0\0\0\0\0\0\0\0"..., 4096, 2625856073728) = 4096 02:48:14.508917 pwrite64(4, "IAB3\0\0\0\365\0\2\317\177\0\0037\177\0\0\0\1\340`\10\200\0\0\0\0\0\0\0\0"..., 4096, 4126390943744) = 4096 02:48:14.527748 pwrite64(4, "IAB3\0\0\0\352\0\0\t\301\0\0\21\207\0\0\0\0A~Fp\0\0\0\0\0\0\0\0"..., 4096, 562582839296) = 4096 02:48:14.554806 pwrite64(4, "IAB3\0\0\0\352\0\0\1\10\0\0\t\316\0\0\0\0A~F\10\0\0\0\0\0\0\0\0"..., 4096, 562582786048) = 4096 02:48:14.565633 pwrite64(4, "IAB3\0\0\0\364\0\0002\210\0\1\245\377\0\0\0\0+\261(\20\0\0\0\0\0\0\0\0"..., 4096, 375311572992) = 4096 02:48:14.612533 pwrite64(4, "AB3B\0\0\1\344\0\7\301\177\0\7\305\177\0\0\0\1\264\333;\370\0\0\0\0\0\0\0\0"..., 4096, 3752567762944) = 4096 02:48:14.644145 pwrite64(4, "AB3B\0\0\1\363\377\377\377\377\0\1\215\214\0\0\0\0011\254\341@\0\0\0\0\0\0\0\0"..., 4096, 2625730936832) = 4096 02:48:14.661673 pwrite64(4, "IAB3\0\0\0\347\0\1BC\0\1\351\177\0\0\0\0m1w\370\0\0\0\0\0\0\0\0"..., 4096, 937962762240) = 4096 02:48:14.692966 pwrite64(4, "AB3C\0\0\1\343\0\r!\377\0\r:\177\0\0\0\1\312\333\203\370\0\0\0\0\0\0\0\0"..., 4096, 3941555761152) = 4096 02:48:14.707960 pwrite64(4, "AB3C\0\0\1\363\0\5\240?\0\5\302\377\0\0\0\2cp+\370\0\0\0\0\0\0\0\0"..., 4096, 5252213895168) = 4096 02:48:14.728814 pwrite64(4, "AB3B\0\0\1\366\0\17\235\177\0\17\310\177\0\0\0\2\"B+\370\0\0\0\0\0\0\0\0"..., 4096, 4692324642816) = 4096 02:48:14.749725 pwrite64(4, "AB3B\0\0\1\347\0\4\210\177\0\5L\252\0\0\0\2\217\21?\270\0\0\0\0\0\0\0\0"..., 4096, 5626985934848) = 4096 02:48:14.770343 pwrite64(4, "IAB3\0\0\0\367\0\2\346\377\0\2\362]\0\0\0\0027\260\203\370\0\0\0\0\0\0\0\0"..., 4096, 4876415791104) = 4096 02:48:14.809315 pwrite64(4, "XAGF\0\0\0\1\0\0\0\36\2\272\225\0\0\2\354\377\0\25f\177\0\0\0\0\0\0\0\2"..., 512, 5625725583872) = 512 02:48:14.848426 pwrite64(4, "XAFL\0\0\0\36\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 5625725584896) = 512 02:48:14.848879 pwrite64(4, "XAGI\0\0\0\1\0\0\0\36\2\272\225\0\0\2\274\300\0\1){\0\0\0\2\0\0\0W"..., 512, 5625725584384) = 512 02:48:14.849915 pwrite64(4, "AB3B\0\0\1\344\0\7\276\177\0\7\303\177\0\0\0\1\264\333+\370\0\0\0\0\0\0\0\0"..., 4096, 3752565665792) = 4096 02:48:14.874351 pwrite64(4, "AB3B\0\0\1\364\0\4\332\222\0\0054\177\0\0\0\1\33\365\333\30\0\0\0\0\0\0\0\0"..., 4096, 2439201042432) = 4096 02:48:14.907358 pwrite64(4, "AB3B\0\0\1\356\0\2g\336\0\2\227=\0\0\0\0+\275\6\220\0\0\0\0\0\0\0\0"..., 4096, 375709835264) = 4096 02:48:14.925827 pwrite64(4, "AB3C\0\0\1\363\0\4\274\247\0\4\342d\0\0\0\0\203\"\0308\0\0\0\0\0\0\0\0"..., 4096, 1126425456640) = 4096 02:48:14.950437 pwrite64(4, "AB3C\0\0\1\363\0\4\323#\0\5&\177\0\0\0\2ckYp\0\0\0\0\0\0\0\0"..., 4096, 5252052082688) = 4096 02:48:14.972531 pwrite64(4, "AB3B\0\0\1\343\0\7\305\177\0\10%\377\0\0\0\1\264\333[\370\0\0\0\0\0\0\0\0"..., 4096, 3752571957248) = 4096 02:48:14.996574 pwrite64(4, "AB3C\0\0\1\343\0\r:\177\0\rJ\177\0\0\0\1\312\333\257\370\0\0\0\0\0\0\0\0"..., 4096, 3941561528320) = 4096 02:48:15.009508 pwrite64(4, "AB3C\0\0\1\360\0H\317\377\0Sjr\0\0\0\2{c\357\370\0\0\0\0\0\0\0\0"..., 4096, 5457961807872) = 4096 02:48:15.033063 pwrite64(4, "AB3B\0\0\1\360\0%\337\377\377\377\377\377\0\0\0\2zg\367\330\0\0\0\0\0\0\0\0"..., 4096, 5449507123200) = 4096 02:48:15.047119 pwrite64(4, "AB3B\0\0\1\324\0\16\373\376\0\17[\377\0\0\0\1]\303_\360\0\0\0\0\0\0\0\0"..., 4096, 3004442861568) = 4096 02:48:15.098514 pwrite64(4, "AB3C\0\0\1\357\0\4O\177\0\4\360x\0\0\0\0\256\310D\220\0\0\0\0\0\0\0\0"..., 4096, 1501368492032) = 4096 02:48:15.124721 pwrite64(4, "IAB3\0\0\0\367\0\2\356\177\0\3\1\177\0\0\0\0027\260\242\350\0\0\0\0\0\0\0\0"..., 4096, 4876419846144) = 4096 02:48:15.146525 pwrite64(4, "AB3B\0\0\1\336\0\2:\212\0\2R\264\0\0\0\1\366-%(\0\0\0\0\0\0\0\0"..., 4096, 4313661984768) = 4096 02:48:15.188907 pwrite64(4, "AB3C\0\0\1\363\0\5&\177\0\5UN\0\0\0\2ck\244\30\0\0\0\0\0\0\0\0"..., 4096, 5252061868032) = 4096 02:48:15.205930 pwrite64(4, "AB3B\0\0\1\344\0\7\303\177\0\7\307\177\0\0\0\1\264\333K\370\0\0\0\0\0\0\0\0"..., 4096, 3752569860096) = 4096 02:48:15.208074 pwrite64(4, "AB3C\0\0\1\365\0\6\367\177\0\7E\177\0\0\0\1\34\6\217\370\0\0\0\0\0\0\0\0"..., 4096, 2439761620992) = 4096 02:48:15.244079 pwrite64(4, "IAB3\0\0\0\352\0\0\t\316\0\0\33\370\0\0\0\0A~\2048\0\0\0\0\0\0\0\0"..., 4096, 562590937088) = 4096 02:48:15.267810 pwrite64(4, "IAB3\0\0\0\353\0\0\202\350\0\1\234\377\0\0\0\2cN\373\370\0\0\0\0\0\0\0\0"..., 4096, 5251100307456) = 4096 02:48:15.287876 pwrite64(4, "FIB3\0\0\0\31\377\377\377\377\377\377\377\377\0\0\0\0011\254\257\370\0\0\0\0\0\0\0\0"..., 4096, 2625724477440) = 4096 02:48:15.328975 pwrite64(4, "AB3B\0\0\1\366\0\17\310\177\0\17\317\377\0\0\0\2\"B\333\370\0\0\0\0\0\0\0\0"..., 4096, 4692347711488) = 4096 02:48:15.369296 pwrite64(4, "IAB3\0\1\0\v\377\377\377\377\377\377\377\377\0\0\0\0\202\377\275P\0\0\0\0\0\0\0\0"..., 4096, 1125272690688) = 4096 02:48:15.406770 pwrite64(4, "IAB3\0\0\0\367\0\0-\177\0\0\217B\0\0\0\0\230\322{\360\0\0\0\0\0\0\0\0"..., 4096, 1312732733440) = 4096 02:48:15.445091 pwrite64(4, "AB3C\0\0\1\364\0\7@\377\0\7W\177\0\0\0\1\34\6\263\370\0\0\0\0\0\0\0\0"..., 4096, 2439766339584) = 4096 02:48:15.471215 pwrite64(4, "AB3B\0\1\0\17\377\377\377\377\377\377\377\377\0\0\0\1\264\301m@\0\0\0\0\0\0\0\0"..., 4096, 3751701807104) = 4096 02:48:15.491761 pwrite64(4, "AB3C\0\0\1\346\0\24>\177\0\24J\177\0\0\0\1\211\226\6\360\0\0\0\0\0\0\0\0"..., 4096, 3380878368768) = 4096 02:48:15.525944 pwrite64(4, "AB3B\0\0\1\366\0\17\316\177\0\20\25\377\0\0\0\2\"B\347\370\0\0\0\0\0\0\0\0"..., 4096, 4692349284352) = 4096 02:48:15.546656 pwrite64(4, "AB3B\0\1\0\25\377\377\377\377\377\377\377\377\0\0\0\2\217\3\27\370\0\0\0\0\0\0\0\0"..., 4096, 5626510962688) = 4096 02:48:15.573813 pwrite64(4, "AB3B\0\0\1\336\0\2\232\264\0\3f\177\0\0\0\1\3662\203\220\0\0\0\0\0\0\0\0"..., 4096, 4313842130944) = 4096 02:48:15.613730 pwrite64(4, "AB3C\0\0\1\356\0\6\0\370\0\6,\377\0\0\0\0\0000m\310\0\0\0\0\0\0\0\0"..., 4096, 1625001984) = 4096 02:48:15.663396 pwrite64(4, "IAB3\0\0\0\353\377\377\377\377\0\0\202\177\0\0\0\2cC\220\330\0\0\0\0\0\0\0\0"..., 4096, 5250717167616) = 4096 02:48:15.688854 pwrite64(4, "AB3C\0\0\1\346\0#\341\177\0*\3\177\0\0\0\2\220\34w\370\0\0\0\0\0\0\0\0"..., 4096, 5635952340992) = 4096 02:48:15.743229 pwrite64(4, "IAB3\0\0\0\367\0\0\352\306\0\1\17\324\0\0\0\0WZ\2h\0\0\0\0\0\0\0\0"..., 4096, 750344523776) = 4096 02:48:15.755091 pwrite64(4, "AB3B\0\0\1\361\0\16\207\202\0\16\235\340\0\0\0\0\360\227\357(\0\0\0\0\0\0\0\0"..., 4096, 2066682368000) = 4096 02:48:15.808793 pwrite64(4, "AB3C\0\0\1\362\0\5\271\177\0\5\320\377\0\0\0\2cpw\370\0\0\0\0\0\0\0\0"..., 4096, 5252223856640) = 4096 02:48:15.851861 pwrite64(4, "IAB3\0\0\0\351\0\0021\377\0\2\232\177\0\0\0\2\216\377/\370\0\0\0\0\0\0\0\0"..., 4096, 5626379890688) = 4096 02:48:15.876685 pwrite64(4, "AB3B\0\0\1\363\0\4\370\377\0\4\377\377\0\0\0\0\332vo\370\0\0\0\0\0\0\0\0"..., 4096, 1876579840000) = 4096 02:48:15.919747 pwrite64(4, "AB3C\0\0\1\356\0\3\305\241\0\4\373\f\0\0\0\0+\313\302\320\0\0\0\0\0\0\0\0"..., 4096, 376204271616) = 4096 02:48:15.955752 pwrite64(4, "IAB3\0\0\0\367\0\0\22\377\0\0<~\0\0\0\0\230\322\3\370\0\0\0\0\0\0\0\0"..., 4096, 1312717008896) = 4096 02:48:15.975163 pwrite64(4, "IAB3\0\0\0\352\0\0\21\207\0\0\"\322\0\0\0\0A~\327\300\0\0\0\0\0\0\0\0"..., 4096, 562601885696) = 4096 02:48:16.005967 pwrite64(4, "AB3C\0\0\1\363\0\5\37.\0\5(\203\0\0\0\2ck\223\370\0\0\0\0\0\0\0\0"..., 4096, 5252059754496) = 4096 02:48:16.027688 pwrite64(4, "AB3C\0\0\1\346\0\24F\336\0\24M\377\0\0\0\1\211\226#\370\0\0\0\0\0\0\0\0"..., 4096, 3380882173952) = 4096 02:48:16.044679 pwrite64(4, "IAB3\0\0\0\356\0\0\272\177\0\1P\177\0\0\0\1\33\323\245@\0\0\0\0\0\0\0\0"..., 4096, 2438053134336) = 4096 02:48:16.086397 pwrite64(4, "AB3C\0\0\1\355\0\5\370\177\0\6\r\271\0\0\0\0\0000\7\300\0\0\0\0\0\0\0\0"..., 4096, 1611628544) = 4096 02:48:16.108715 pwrite64(4, "IAB3\0\0\0\351\0\0KY\0\0_\10\0\0\0\1\264\237\333\370\0\0\0\0\0\0\0\0"..., 4096, 3750575468544) = 4096 02:48:16.153993 pwrite64(4, "AB3C\0\0\1\346\0\24J\177\0\24N\377\0\0\0\1\211\226?\370\0\0\0\0\0\0\0\0"..., 4096, 3380885843968) = 4096 02:48:16.197026 pwrite64(4, "IAB3\0\0\0\352\377\377\377\377\0\1,\357\0\0\0\2\216\353\300@\0\0\0\0\0\0\0\0"..., 4096, 5625727713280) = 4096 02:48:16.213877 pwrite64(4, "AB3B\0\1\0\23\377\377\377\377\377\377\377\377\0\0\0\0\0%\214\230\0\0\0\0\0\0\0\0"..., 4096, 1259941888) = 4096 02:48:16.248444 pwrite64(4, "AB3B\0\0\1\364\0\1\264\177\0\1\312\362\0\0\0\0011\257o\370\0\0\0\0\0\0\0\0"..., 4096, 2625816752128) = 4096 02:48:16.273385 pwrite64(4, "AB3B\0\0\1\344\0\1\370\177\0\2\1\377\0\0\0\1\6\7\347\10\0\0\0\0\0\0\0\0"..., 4096, 2250828025856) = 4096 02:48:16.291562 pwrite64(4, "AB3C\0\0\1\346\0\24M\377\0\24Tq\0\0\0\1\211\226G\370\0\0\0\0\0\0\0\0"..., 4096, 3380886892544) = 4096 02:48:16.292266 pwrite64(4, "AB3B\0\0\1\367\0\3\335\377\0\7\270\375\0\0\0\2!\376/\370\0\0\0\0\0\0\0\0"..., 4096, 4690043465728) = 4096 02:48:16.318605 pwrite64(4, "AB3B\0\0\1\363\0\4\366\377\0\4\370\377\0\0\0\0\332vNP\0\0\0\0\0\0\0\0"..., 4096, 1876575428608) = 4096 02:48:16.341870 pwrite64(4, "AB3C\0\0\1\363\0\4\351\322\377\377\377\377\0\0\0\0011\312>h\0\0\0\0\0\0\0\0"..., 4096, 2626716225536) = 4096 02:48:16.362155 pwrite64(4, "AB3B\0\0\1\323\377\377\377\377\0\t\373\177\0\0\0\1]\225\370\30\0\0\0\0\0\0\0\0"..., 4096, 3002919301120) = 4096 02:48:16.378421 pwrite64(4, "AB3B\0\0\1\363\0\4\345\377\0\4\367\312\0\0\0\0\332vG\370\0\0\0\0\0\0\0\0"..., 4096, 1876574597120) = 4096 02:48:16.403741 pwrite64(4, "AB3B\0\0\1\366\0\17\270\177\0\17\316\177\0\0\0\2\"B\253\370\0\0\0\0\0\0\0\0"..., 4096, 4692341420032) = 4096 02:48:16.429257 pwrite64(4, "AB3B\0\0\1\344\0\2\0\341\0\2\10\177\0\0\0\1\6\7\357\370\0\0\0\0\0\0\0\0"..., 4096, 2250829197312) = 4096 02:48:16.448278 pwrite64(4, "AB3B\0\0\1\364\0\5*c\0\5\345\377\0\0\0\1\33\366+\370\0\0\0\0\0\0\0\0"..., 4096, 2439211642880) = 4096 02:48:16.494507 pwrite64(4, "FIB3\0\0\0\16\377\377\377\377\377\377\377\377\0\0\0\1\6\7\227\370\0\0\0\0\0\0\0\0"..., 4096, 2250817662976) = 4096 02:48:16.512273 pwrite64(4, "IAB3\0\0\0\360\0\2R\377\0\2a\177\0\0\0\0\25\347s\370\0\0\0\0\0\0\0\0"..., 4096, 188154900480) = 4096 02:48:16.536533 pwrite64(4, "IAB3\0\0\0\362\0\6>\250\0\10t\377\0\0\0\1\211)\16P\0\0\0\0\0\0\0\0"..., 4096, 3377221902336) = 4096 02:48:16.556904 pwrite64(4, "AB3B\0\0\1\363\0\4\367\312\0\4\373\377\0\0\0\0\332vW\370\0\0\0\0\0\0\0\0"..., 4096, 1876576694272) = 4096 02:48:16.582336 pwrite64(4, "AB3C\0\0\1\363\0\24/\251\0\24\321\307\0\0\0\0\332\364\3518\0\0\0\0\0\0\0\0"..., 4096, 1880823590912) = 4096 02:48:16.608153 pwrite64(4, "XAGI\0\0\0\1\0\0\0\34\2\272\225\0\0\2\205\300\0\0\202\n\0\0\0\2\0\0\0\217"..., 512, 5250677212160) = 512 02:48:16.627879 pwrite64(4, "XAFL\0\0\0\34\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 5250677212672) = 512 02:48:16.628291 pwrite64(4, "XAGF\0\0\0\1\0\0\0\34\2\272\225\0\0\2\17\377\0\4\221*\0\0\0\0\0\0\0\2"..., 512, 5250677211648) = 512 02:48:16.628636 pwrite64(4, "IAB3\0\0\0\351\0\0f\253\0\0\303\371\0\0\0\1\264\242d\310\0\0\0\0\0\0\0\0"..., 4096, 3750660509696) = 4096 02:48:16.658787 pwrite64(4, "AB3B\0\0\1\346\0\6 \377\0\0061C\0\0\0\2\217\35\37\370\0\0\0\0\0\0\0\0"..., 4096, 5627384426496) = 4096 02:48:16.682045 pwrite64(4, "XAFL\0\0\0\2\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 375048373760) = 512 02:48:16.710897 pwrite64(4, "XAGI\0\0\0\1\0\0\0\2\2\272\225\0\0\2\234\300\0\0\2133\0\0\0\2\0\0\0\26"..., 512, 375048373248) = 512 02:48:16.711347 pwrite64(4, "XAGF\0\0\0\1\0\0\0\2\2\272\225\0\0\1\355\377\0\2\321\317\0\0\0\0\0\0\0\2"..., 512, 375048372736) = 512 02:48:16.711895 pwrite64(4, "AB3C\0\0\1\344\0\2\345$\0\3\336\376\0\0\0\1\6\20b \0\0\0\0\0\0\0\0"..., 4096, 2251112595456) = 4096 02:48:16.743225 pwrite64(4, "IAB3\0\0\0\352\0\0\"\322\0\0*z\0\0\0\0A\177\23\370\0\0\0\0\0\0\0\0"..., 4096, 562609778688) = 4096 02:48:16.762916 pwrite64(4, "AB3B\0\0\1\361\0\16x|\0\16\207\202\0\0\0\0\360\2277\210\0\0\0\0\0\0\0\0"..., 4096, 2066658299904) = 4096 02:48:16.789407 pwrite64(4, "AB3B\0\0\1\352\0TL\377\0Y\33\377\0\0\0\1\342\351\203\370\0\0\0\0\0\0\0\0"..., 4096, 4148183953408) = 4096 02:48:16.822820 pwrite64(4, "AB3C\0\0\1\344\0\27\302\377\0=\6\177\0\0\0\1\265\376\20\240\0\0\0\0\0\0\0\0"..., 4096, 3762326421504) = 4096 02:48:16.842985 pwrite64(4, "IAB3\0\0\0\352\0\0\33\370\0\0#\177\0\0\0\0A\177\16\220\0\0\0\0\0\0\0\0"..., 4096, 562609070080) = 4096 02:48:16.874474 pwrite64(4, "AB3C\0\0\1\346\0\24T~\0\24k\177\0\0\0\1\211\226w\370\0\0\0\0\0\0\0\0"..., 4096, 3380893184000) = 4096 02:48:16.906130 pwrite64(4, "AB3C\0\0\1\346\0\24Tq\0\24T\377\0\0\0\1\211\226s\360\0\0\0\0\0\0\0\0"..., 4096, 3380892655616) = 4096 02:48:16.912500 pwrite64(4, "AB3B\0\0\1\336\0\2A\245\0\2x.\0\0\0\1\366-\255\240\0\0\0\0\0\0\0\0"..., 4096, 4313679872000) = 4096 02:48:16.940139 pwrite64(4, "AB3B\0\1\0\16\377\377\377\377\377\377\377\377\0\0\0\1\6\7\273\360\0\0\0\0\0\0\0\0"..., 4096, 2250822377472) = 4096 02:48:16.977241 pwrite64(4, "AB3C\0\0\1\346\0\24N\377\0\24T~\0\0\0\1\211\226s\210\0\0\0\0\0\0\0\0"..., 4096, 3380892602368) = 4096 02:48:16.980223 pwrite64(4, "AB3B\0\0\1\366\0\v\200\377\0\17\270\177\0\0\0\2\"AS\370\0\0\0\0\0\0\0\0"..., 4096, 4692296331264) = 4096 02:48:17.002092 pwrite64(4, "AB3B\0\0\1\346\0\6-\377\0\6B\377\0\0\0\2\217\35:\30\0\0\0\0\0\0\0\0"..., 4096, 5627387850752) = 4096 02:48:17.048190 pwrite64(4, "AB3B\0\0\1\343\377\377\377\377\0\2\0\341\0\0\0\1\6\7\243\370\0\0\0\0\0\0\0\0"..., 4096, 2250819235840) = 4096 02:48:17.072190 pwrite64(4, "AB3B\0\0\1\363\0\4\373\377\0\5\0\377\0\0\0\0\332v\217\370\0\0\0\0\0\0\0\0"..., 4096, 1876584034304) = 4096 02:48:17.094287 pwrite64(4, "AB3C\0\0\1\362\0\5\302\377\0\6\1\272\0\0\0\2cp\347\370\0\0\0\0\0\0\0\0"..., 4096, 5252238536704) = 4096 02:48:17.121054 pwrite64(4, "AB3B\0\0\1\323\0\2\235\345\0\2\352\202\0\0\0\0A\224AH\0\0\0\0\0\0\0\0"..., 4096, 563320360960) = 4096 02:48:17.148545 pwrite64(4, "AB3C\0\0\1\354\0\31`\177\0\34\302\177\0\0\0\2N;?\370\0\0\0\0\0\0\0\0"..., 4096, 5070049505280) = 4096 02:48:17.187595 pwrite64(4, "IAB3\0\0\0\351\0\0\1\10\0\0W\177\0\0\0\1\264\237z\310\0\0\0\0\0\0\0\0"..., 4096, 3750562729984) = 4096 02:48:17.211279 pwrite64(4, "IAB3\0\0\0\356\0\1\27v\0\2\267\320\0\0\0\0\256\260\206\340\0\0\0\0\0\0\0\0"..., 4096, 1500571877376) = 4096 02:48:17.255172 pwrite64(4, "AB3C\0\0\1\363\0\4\254l\0\4\305\7\0\0\0\0\203!\3258\0\0\0\0\0\0\0\0"..., 4096, 1126416674816) = 4096 02:48:17.286453 pwrite64(4, "AB3C\0\0\1\355\0\2\343\326\0\2\376S\0\0\0\0+\301\16\360\0\0\0\0\0\0\0\0"..., 4096, 375845150720) = 4096 02:48:17.298382 pwrite64(4, "IAB3\0\0\0\360\0\2M\377\0\2R\377\0\0\0\0\25\3477\370\0\0\0\0\0\0\0\0"..., 4096, 188147036160) = 4096 02:48:17.342079 pwrite64(4, "AB3B\0\0\1\363\0\4\377\377\0\5\vu\0\0\0\0\332v\227\370\0\0\0\0\0\0\0\0"..., 4096, 1876585082880) = 4096 02:48:17.356841 pwrite64(4, "IAB3\0\0\0\367\0\1\17\324\377\377\377\377\0\0\0\0W[\223\370\0\0\0\0\0\0\0\0"..., 4096, 750397157376) = 4096 02:48:17.384723 pwrite64(4, "AB3C\0\1\0\16\377\377\377\377\377\377\377\377\0\0\0\1\6\v\353\340\0\0\0\0\0\0\0\0"..., 4096, 2250962878464) = 4096 02:48:17.403197 pwrite64(4, "IAB3\0\0\0\360\0\2Q\377\0\2Y\177\0\0\0\0\25\347?\370\0\0\0\0\0\0\0\0"..., 4096, 188148084736) = 4096 02:48:17.437093 pwrite64(4, "AB3B\0\0\1\333\0\25\245~\0\26\304\177\0\0\0\2\f\234\354\210\0\0\0\0\0\0\0\0"..., 4096, 4506391220224) = 4096 02:48:17.467814 pwrite64(4, "AB3B\0\0\1\363\0\5\0\377\0\5\f\177\0\0\0\0\332v\353\250\0\0\0\0\0\0\0\0"..., 4096, 1876596051968) = 4096 02:48:17.489482 pwrite64(4, "AB3B\0\0\1\334\0\6\226\177\0\25\245~\0\0\0\2\f\234\350\270\0\0\0\0\0\0\0\0"..., 4096, 4506390720512) = 4096 02:48:17.512534 pwrite64(4, "AB3B\0\0\1\361\0\16\177\361\0\16\226\345\0\0\0\0\360\227t\20\0\0\0\0\0\0\0\0"..., 4096, 2066666233856) = 4096 02:48:17.535087 pwrite64(4, "AB3B\0\0\1\334\0\25\245\27\0\25\245\221\0\0\0\2\f\234\353\360\0\0\0\0\0\0\0\0"..., 4096, 4506391142400) = 4096 02:48:17.564683 pwrite64(4, "IAB3\0\0\0\352\0\0#\177\0\0*\247\0\0\0\0A\177K\320\0\0\0\0\0\0\0\0"..., 4096, 562617098240) = 4096 02:48:17.596769 pwrite64(4, "IAB3\0\0\0\370\0\7\366\10\0\10d\375\0\0\0\1]\214o\360\0\0\0\0\0\0\0\0"..., 4096, 3002599464960) = 4096 02:48:17.618238 pwrite64(4, "IAB3\0\0\0\373\0\2\273\336\0\3^\214\0\0\0\0\0\30\257\360\0\0\0\0\0\0\0\0"..., 4096, 828366848) = 4096 02:48:17.640591 pwrite64(4, "IAB3\0\0\0\354\0\2\265\275\377\377\377\377\0\0\0\2y-\2138\0\0\0\0\0\0\0\0"..., 4096, 5438956793856) = 4096 02:48:17.670617 pwrite64(4, "IAB3\0\0\0\352\0\0*z\0\0001\371\0\0\0\0A\177M8\0\0\0\0\0\0\0\0"..., 4096, 562617282560) = 4096 02:48:17.684444 pwrite64(4, "IAB3\0\0\0\374\0\1?Z\0\4\220;\0\0\0\0\332_\27\300\0\0\0\0\0\0\0\0"..., 4096, 1875796525056) = 4096 02:48:17.729788 pwrite64(4, "IAB3\0\0\0\360\0\1\211\v\0\2Q\377\0\0\0\0\25\347\27\370\0\0\0\0\0\0\0\0"..., 4096, 188142841856) = 4096 02:48:17.750747 pwrite64(4, "IAB3\0\0\0\353\0\1\234\377\0\1\264\v\0\0\0\2cO\273\370\0\0\0\0\0\0\0\0"..., 4096, 5251125473280) = 4096 02:48:17.773000 pwrite64(4, "AB3B\0\0\1\363\0\5\vu\0\5\27\273\0\0\0\0\332v\363\370\0\0\0\0\0\0\0\0"..., 4096, 1876597141504) = 4096 02:48:17.796137 pwrite64(4, "IAB3\0\0\0\367\0\0a\373\0\0\241\204\0\0\0\1\366\36.\320\0\0\0\0\0\0\0\0"..., 4096, 4313159933952) = 4096 02:48:17.836451 pwrite64(4, "AB3C\0\0\1\363\0\4w\326\0\4\254l\0\0\0\0\203!\33\20\0\0\0\0\0\0\0\0"..., 4096, 1126392274944) = 4096 02:48:17.868156 pwrite64(4, "AB3C\0\0\1\363\0\24\313'\0\25\32\243\0\0\0\0\332\365\0368\0\0\0\0\0\0\0\0"..., 4096, 1880830537728) = 4096 02:48:17.884520 pwrite64(4, "IAB3\0\0\0\367\0\0\1\210\0\0b\332\0\0\0\1\366\36'\330\0\0\0\0\0\0\0\0"..., 4096, 4313159020544) = 4096 02:48:17.925068 pwrite64(4, "AB3B\0\0\1\366\0\7\275\177\0\vv\377\0\0\0\2\"\v\263\30\0\0\0\0\0\0\0\0"..., 4096, 4690496860160) = 4096 02:48:17.965531 pwrite64(4, "AB3B\0\0\1\352\0\n\220\377\0S\217\377\0\0\0\1\342\23\313\370\0\0\0\0\0\0\0\0"..., 4096, 4141012742144) = 4096 02:48:17.999055 pwrite64(4, "IAB3\0\0\0\362\0\6\31\343\0\6>\250\0\0\0\1\211%?\370\0\0\0\0\0\0\0\0"..., 4096, 3377094193152) = 4096 02:48:18.018145 pwrite64(4, "FIB3\0\0\0\26\377\377\377\377\377\377\377\377\0\0\0\0\0$\353\0\0\0\0\0\0\0\0\0"..., 4096, 1238761472) = 4096 02:48:18.024724 pwrite64(4, "AB3C\0\0\1\360\0H\5\177\0I\234\377\0\0\0\2{]\207\370\0\0\0\0\0\0\0\0"..., 4096, 5457746849792) = 4096 02:48:18.049864 pwrite64(4, "AB3C\0\0\1\356\0\2\376S\0\3\17\307\0\0\0\0+\301C\370\0\0\0\0\0\0\0\0"..., 4096, 375852101632) = 4096 02:48:18.077938 pwrite64(4, "IAB3\0\0\0\361\0\0\1\200\0\0\365Y\0\0\0\0\25\332\3028\0\0\0\0\0\0\0\0"..., 4096, 187728949248) = 4096 02:48:18.102554 pwrite64(4, "IAB3\0\1\0\f\377\377\377\377\377\377\377\377\0\0\0\2\216\364\373\330\0\0\0\0\0\0\0\0"..., 4096, 5626037514240) = 4096 02:48:18.134083 pwrite64(4, "AB3B\0\0\1\324\0\t\376\177\0\17\33\376\0\0\0\1]\302_\360\0\0\0\0\0\0\0\0"..., 4096, 3004409307136) = 4096 02:48:18.157858 pwrite64(4, "AB3C\0\0\1\356\0\2\367\336\0\2\376\177\0\0\0\0+\301B\230\0\0\0\0\0\0\0\0"..., 4096, 375851921408) = 4096 02:48:18.179495 pwrite64(4, "AB3B\0\0\1\363\0\3\243\177\0\3\317+\0\0\0\0\203\32c\370\0\0\0\0\0\0\0\0"..., 4096, 1126166949888) = 4096 02:48:18.203643 pwrite64(4, "AB3C\0\0\1\363\0\t6\377\0\22\271\377\0\0\0\0\332\262\17\360\0\0\0\0\0\0\0\0"..., 4096, 1878580518912) = 4096 02:48:18.231395 pwrite64(4, "AB3B\0\0\1\363\0\2\35\177\0\2nL\0\0\0\0011\262K\370\0\0\0\0\0\0\0\0"..., 4096, 2625912696832) = 4096 02:48:18.255355 pwrite64(4, "AB3B\0\0\1\363\0\3\316\177\0\3\373\177\0\0\0\0\203\32iX\0\0\0\0\0\0\0\0"..., 4096, 1126167654400) = 4096 02:48:18.278040 pwrite64(4, "AB3B\0\0\1\346\0\0259\177\0\25J\177\0\0\0\2\217\225\363\370\0\0\0\0\0\0\0\0"..., 4096, 5631438745600) = 4096 02:48:18.299639 pwrite64(4, "IAB3\0\0\0\360\0\1\343s\377\377\377\377\0\0\0\1\6\0077\370\0\0\0\0\0\0\0\0"..., 4096, 2250805080064) = 4096 02:48:18.319702 pwrite64(4, "AB3B\0\0\1\336\0\2\fm\0\2:\212\0\0\0\1\366,'\340\0\0\0\0\0\0\0\0"..., 4096, 4313628786688) = 4096 02:48:18.341021 pwrite64(4, "IAB3\0\0\0\362\0\6-\377\0\6\247\312\0\0\0\1\211%\305@\0\0\0\0\0\0\0\0"..., 4096, 3377111662592) = 4096 02:48:18.363689 pwrite64(4, "AB3B\0\0\1\356\0\2T\337\0\2g\336\0\0\0\0+\274&h\0\0\0\0\0\0\0\0"..., 4096, 375680454656) = 4096 02:48:18.388205 pwrite64(4, "IAB3\0\0\0\352\0\0*\247\0\0c\177\0\0\0\0A\177\207\310\0\0\0\0\0\0\0\0"..., 4096, 562624958464) = 4096 02:48:18.406711 pwrite64(4, "IAB3\0\0\0\353\377\377\377\377\0\1 \377\0\0\0\2\244\306\264@\0\0\0\0\0\0\0\0"..., 4096, 5813463187456) = 4096 02:48:18.446100 pwrite64(4, "AB3B\0\0\1\357\0\3\266\371\0\4:\212\0\0\0\0\256\306\337\310\0\0\0\0\0\0\0\0"..., 4096, 1501321728000) = 4096 02:48:18.473048 pwrite64(4, "AB3B\0\0\1\346\0\5\256\4\0\6-\377\0\0\0\2\217\34\267\370\0\0\0\0\0\0\0\0"..., 4096, 5627370795008) = 4096 02:48:18.503938 pwrite64(4, "AB3B\0\0\1\323\0\3\5e\0\3i\216\0\0\0\0A\227\303\370\0\0\0\0\0\0\0\0"..., 4096, 563438153728) = 4096 02:48:18.518962 pwrite64(4, "AB3C\0\0\1\363\0\4\245b\0\4\274\247\0\0\0\0\203!S`\0\0\0\0\0\0\0\0"..., 4096, 1126399655936) = 4096 02:48:18.565170 pwrite64(4, "IAB3\0\0\0\360\0\2Y\177\0\2n\377\0\0\0\0\25\347\263\370\0\0\0\0\0\0\0\0"..., 4096, 188163289088) = 4096 02:48:18.587499 pwrite64(4, "AB3C\0\0\1\323\0\17\301\377\0\17\312\177\0\0\0\1]\310\317\370\0\0\0\0\0\0\0\0"..., 4096, 3004625317888) = 4096 02:48:18.614225 pwrite64(4, "AB3B\0\0\1\364\0\1\307\377\0\1\355\177\0\0\0\0011\257\207\220\0\0\0\0\0\0\0\0"..., 4096, 2625819844608) = 4096 02:48:18.651940 pwrite64(4, "AB3B\0\0\1\333\0\25\245\221\0\27\307\177\0\0\0\2\f\245\343\370\0\0\0\0\0\0\0\0"..., 4096, 4506692087808) = 4096 02:48:18.672639 pwrite64(4, "IAB3\0\0\0\367\0\0\354M\0\1\36\177\0\0\0\0W[\36\240\0\0\0\0\0\0\0\0"..., 4096, 750381776896) = 4096 02:48:18.696201 pwrite64(4, "IAB3\0\0\0\371\0\0\276\315\0\1\3511\0\0\0\2!\315[\330\0\0\0\0\0\0\0\0"..., 4096, 4688405049344) = 4096 02:48:18.747287 pwrite64(4, "AB3C\0\0\1\334\377\377\377\377\0$>}\0\0\0\2\245\340\337\370\0\0\0\0\0\0\0\0"..., 4096, 5822931267584) = 4096 02:48:18.779893 pwrite64(4, "AB3C\0\0\1\324\0\17\311\377\0\17\315\177\0\0\0\1]\310\323\370\0\0\0\0\0\0\0\0"..., 4096, 3004625842176) = 4096 02:48:18.780700 pwrite64(4, "AB3B\0\1\0\16\377\377\377\377\377\377\377\377\0\0\0\0\230\342\323\370\0\0\0\0\0\0\0\0"..., 4096, 1313281142784) = 4096 02:48:18.809074 pwrite64(4, "AB3B\0\0\1\361\0\16w\177\0\16\177\361\0\0\0\0\360\226\373\340\0\0\0\0\0\0\0\0"..., 4096, 2066650480640) = 4096 02:48:18.847963 pwrite64(4, "IAB3\0\0\0\361\0\1\256\177\0\1\340\177\0\0\0\1\6\6\303\370\0\0\0\0\0\0\0\0"..., 4096, 2250789875712) = 4096 02:48:18.867317 pwrite64(4, "AB3B\0\0\1\334\0\2F\177\0\2JD\0\0\0\0\230\342\337\370\0\0\0\0\0\0\0\0"..., 4096, 1313282715648) = 4096 02:48:18.889219 pwrite64(4, "AB3B\0\0\1\363\0\0022\377\0\2U\177\0\0\0\2cT\253\370\0\0\0\0\0\0\0\0"..., 4096, 5251291148288) = 4096 02:48:18.915299 pwrite64(4, "AB3B\0\0\1\361\0\16MT\0\16x|\0\0\0\0\360\226\363\370\0\0\0\0\0\0\0\0"..., 4096, 2066649444352) = 4096 02:48:18.925824 pwrite64(4, "IAB3\0\0\0\367\0\10\247\352\0\10\272\357\0\0\0\1]\217\356\250\0\0\0\0\0\0\0\0"..., 4096, 3002716737536) = 4096 02:48:18.948300 pwrite64(4, "AB3C\0\0\1\361\0\0220A\0\22Q~\0\0\0\0\360\265\256\20\0\0\0\0\0\0\0\0"..., 4096, 2067680468992) = 4096 02:48:18.962200 pwrite64(4, "IAB3\0\0\0\355\0\2\220\10\0\2\265\275\0\0\0\2y,\t\300\0\0\0\0\0\0\0\0"..., 4096, 5438906269696) = 4096 02:48:18.985169 pwrite64(4, "IAB3\0\0\0\372\0\4\f\177\377\377\377\377\0\0\0\0\0$\233\370\0\0\0\0\0\0\0\0"..., 4096, 1228402688) = 4096 02:48:19.017574 pwrite64(4, "FIB3\0\0\0\5\377\377\377\377\377\377\377\377\0\0\0\0\230\342\305\320\0\0\0\0\0\0\0\0"..., 4096, 1313279287296) = 4096 02:48:19.051736 pwrite64(4, "IAB3\0\1\0\v\377\377\377\377\377\377\377\377\0\0\0\0\25\332\23\340\0\0\0\0\0\0\0\0"..., 4096, 187706097664) = 4096 02:48:19.069670 pwrite64(4, "AB3C\0\0\1\324\0\17\312\177\0\17\316\177\0\0\0\1]\310\353\370\0\0\0\0\0\0\0\0"..., 4096, 3004628987904) = 4096 02:48:19.100669 pwrite64(4, "AB3B\0\0\1\336\0\2!\374\0\2A\245\0\0\0\1\366,\354P\0\0\0\0\0\0\0\0"..., 4096, 4313654534144) = 4096 02:48:19.118866 pwrite64(4, "AB3B\0\0\1\363\0\2\7\377\0\2#\177\0\0\0\0011\262\33\370\0\0\0\0\0\0\0\0"..., 4096, 2625906405376) = 4096 02:48:19.155579 pwrite64(4, "AB3B\0\0\1\333\377\377\377\377\0\2H\377\0\0\0\0\230\342\313\370\0\0\0\0\0\0\0\0"..., 4096, 1313280094208) = 4096 02:48:19.177867 pwrite64(4, "IAB3\0\0\0\360\0\1\341\177\0\1\352\377\0\0\0\1\6\6\373\230\0\0\0\0\0\0\0\0"..., 4096, 2250797166592) = 4096 02:48:19.197563 pwrite64(4, "AB3B\0\0\1\356\0\4\242\177\0\4\272\377\0\0\0\1\236\355\241h\0\0\0\0\0\0\0\0"..., 4096, 3564206477312) = 4096 02:48:19.217241 pwrite64(4, "AB3C\0\0\1\362\0\4iK\0\5\37.\0\0\0\2ch\371\30\0\0\0\0\0\0\0\0"..., 4096, 5251972345856) = 4096 02:48:19.258412 pwrite64(4, "AB3C\0\0\1\324\0\17\315\177\0\17\321\177\0\0\0\1]\310\363\370\0\0\0\0\0\0\0\0"..., 4096, 3004630036480) = 4096 02:48:19.274982 pwrite64(4, "IAB3\0\0\0\361\0\1\334\177\0\1\341\177\0\0\0\1\6\6\343\370\0\0\0\0\0\0\0\0"..., 4096, 2250794070016) = 4096 02:48:19.288946 pwrite64(4, "AB3B\0\0\1\363\0\5\f\177\377\377\377\377\0\0\0\0\332wM\330\0\0\0\0\0\0\0\0"..., 4096, 1876608921600) = 4096 02:48:19.308122 pwrite64(4, "FIB3\0\0\0\2\377\377\377\377\377\377\377\377\0\0\0\1\264\300\243\370\0\0\0\0\0\0\0\0"..., 4096, 3751675424768) = 4096 02:48:19.337030 pwrite64(4, "IAB3\0\0\0\360\0\1\340\177\0\1\343s\0\0\0\1\6\6\353\370\0\0\0\0\0\0\0\0"..., 4096, 2250795118592) = 4096 02:48:19.337656 pwrite64(4, "AB3C\0\0\1\346\0\26\300\177\0\26\371@\0\0\0\2\217\241\313\370\0\0\0\0\0\0\0\0"..., 4096, 5631836155904) = 4096 02:48:19.386959 pwrite64(4, "AB3C\0\0\1\352\0kD\250\0m\242\377\0\0\0\1\343\251O\370\0\0\0\0\0\0\0\0"..., 4096, 4154619588608) = 4096 02:48:19.412103 pwrite64(4, "AB3B\0\0\1\357\0\3\264~\0\4\245-\0\0\0\1\236\355\213\370\0\0\0\0\0\0\0\0"..., 4096, 3564203667456) = 4096 02:48:19.443711 pwrite64(4, "AB3B\0\0\1\356\0\2Z\315\0\2v\322\0\0\0\0+\274\216\360\0\0\0\0\0\0\0\0"..., 4096, 375694155776) = 4096 02:48:19.470488 pwrite64(4, "IAB3\0\0\0\350\0\0\303\371\0\2\2\373\0\0\0\1\264\250j\220\0\0\0\0\0\0\0\0"..., 4096, 3750862594048) = 4096 02:48:19.511873 pwrite64(4, "AB3C\0\0\1\324\377\377\377\377\0\17\311\377\0\0\0\1]\310\217\370\0\0\0\0\0\0\0\0"..., 4096, 3004616929280) = 4096 02:48:19.529514 pwrite64(4, "IAB3\0\0\0\353\0\0\0\10\0\0\203\377\0\0\0\1\312q\340\330\0\0\0\0\0\0\0\0"..., 4096, 3938011164672) = 4096 02:48:19.544359 pwrite64(4, "IAB3\0\1\0\f\377\377\377\377\377\377\377\377\0\0\0\1\312q\340\310\0\0\0\0\0\0\0\0"..., 4096, 3938011156480) = 4096 02:48:19.552801 pwrite64(4, "IAB3\0\0\0\350\0\1\t\4\0\1BC\0\0\0\0m/\322\340\0\0\0\0\0\0\0\0"..., 4096, 937907568640) = 4096 02:48:19.574432 pwrite64(4, "AB3C\0\0\1\323\0\3\220\376\0\3\375\377\0\0\0\0A\232\201\240\0\0\0\0\0\0\0\0"..., 4096, 563530121216) = 4096 02:48:19.598782 pwrite64(4, "AB3C\0\0\1\356\0\2\376\177\0\3\32\251\0\0\0\0+\301\3168\0\0\0\0\0\0\0\0"..., 4096, 375870222336) = 4096 02:48:19.626726 pwrite64(4, "IAB3\0\0\0\367\0\10\241\340\0\10\255\325\0\0\0\1]\217\277P\0\0\0\0\0\0\0\0"..., 4096, 3002710532096) = 4096 02:48:19.645200 pwrite64(4, "AB3B\0\1\0\16\377\377\377\377\377\377\377\377\0\0\0\0\203\31\363\370\0\0\0\0\0\0\0\0"..., 4096, 1126152269824) = 4096 02:48:19.658352 pwrite64(4, "AB3B\0\0\1\334\0\2H\377\0\2M\35\0\0\0\0\230\342\352 \0\0\0\0\0\0\0\0"..., 4096, 1313284046848) = 4096 02:48:19.685891 pwrite64(4, "AB3C\0\0\1\333\0@_|\0K\244\316\0\0\0\2\246\365\203\20\0\0\0\0\0\0\0\0"..., 4096, 5832213667840) = 4096 02:48:19.712996 pwrite64(4, "IAB3\0\0\0\373\0\1t\t\0\1\340M\0\0\0\0\0\f\215\350\0\0\0\0\0\0\0\0"..., 4096, 421253120) = 4096 02:48:19.738418 pwrite64(4, "AB3B\0\0\1\346\0\0254\177\0\25H\177\0\0\0\2\217\225{\370\0\0\0\0\0\0\0\0"..., 4096, 5631423016960) = 4096 02:48:19.795857 pwrite64(4, "IAB3\0\0\0\353\0\1\223\177\0\1\253\177\0\0\0\2cOG\370\0\0\0\0\0\0\0\0"..., 4096, 5251110268928) = 4096 02:48:19.857818 pwrite64(4, "AB3C\0\0\1\356\0\5\234\377\0\6\0\370\0\0\0\0\0/\303\370\0\0\0\0\0\0\0\0"..., 4096, 1602744320) = 4096 02:48:19.890972 pwrite64(4, "AB3C\0\1\0\16\377\377\377\377\377\377\377\377\0\0\0\1]\310\267\370\0\0\0\0\0\0\0\0"..., 4096, 3004622172160) = 4096 02:48:19.911960 pwrite64(4, "IAB3\0\0\0\354\377\377\377\377\0\0\3\33\0\0\0\1\312q\310@\0\0\0\0\0\0\0\0"..., 4096, 3938007941120) = 4096 02:48:19.941444 pwrite64(4, "XAGF\0\0\0\1\0\0\0\25\2\272\225\0\0\1\242\377\0\5\t\313\0\0\0\0\0\0\0\2"..., 512, 3938007908864) = 512 02:48:19.954417 pwrite64(4, "XAGI\0\0\0\1\0\0\0\25\2\272\225\0\0\2\301@\0\0\3\31\0\0\0\2\0\0\0-"..., 512, 3938007909376) = 512 02:48:19.954843 pwrite64(4, "XAFL\0\0\0\25\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 3938007909888) = 512 02:48:19.955093 pwrite64(4, "AB3C\0\0\1\360\0D\342\177\0E\210\177\0\0\0\2{>C\370\0\0\0\0\0\0\0\0"..., 4096, 5456697749504) = 4096 02:48:20.000619 pwrite64(4, "IAB3\0\0\0\365\377\377\377\377\0\0\305\6\0\0\0\1s (@\0\0\0\0\0\0\0\0"..., 4096, 3187944751104) = 4096 02:48:20.040165 pwrite64(4, "AB3C\0\0\1\361\0\22N\302\377\377\377\377\0\0\0\0\360\265\303\360\0\0\0\0\0\0\0\0"..., 4096, 2067683336192) = 4096 02:48:20.059400 pwrite64(4, "IAB3\0\0\0\367\0\10\235b\0\10\247\352\0\0\0\1]\217\217\0\0\0\0\0\0\0\0\0"..., 4096, 3002704199680) = 4096 02:48:20.076532 pwrite64(4, "AB3B\0\0\1\346\0\25\17~\0\0259\177\0\0\0\2\217\225S\370\0\0\0\0\0\0\0\0"..., 4096, 5631417774080) = 4096 02:48:20.102954 pwrite64(4, "IAB3\0\0\0\350\0\1\7\377\0\1\21\\\0\0\0\0m/\220 \0\0\0\0\0\0\0\0"..., 4096, 937898819584) = 4096 02:48:20.120915 pwrite64(4, "AB3C\0\0\1\343\0bm\177\377\377\377\377\0\0\0\1\267\261\33\370\0\0\0\0\0\0\0\0"..., 4096, 3776924086272) = 4096 02:48:20.151054 pwrite64(4, "AB3C\0\0\1\360\0D\347\177\0Gl\177\0\0\0\2{CK\370\0\0\0\0\0\0\0\0"..., 4096, 5456866570240) = 4096 02:48:20.187554 pwrite64(4, "AB3B\0\0\1\356\0\4\245-\0\4\302\177\0\0\0\1\236\356O\370\0\0\0\0\0\0\0\0"..., 4096, 3564229357568) = 4096 02:48:20.207528 pwrite64(4, "IAB3\0\0\0\350\0\0[\227\0\1\7\377\0\0\0\0m/\206\370\0\0\0\0\0\0\0\0"..., 4096, 937897619456) = 4096 02:48:20.220205 pwrite64(4, "IAB3\0\0\0\350\0\1\7\337\0\1\t\4\0\0\0\0m/\207\370\0\0\0\0\0\0\0\0"..., 4096, 937897750528) = 4096 02:48:20.221135 pwrite64(4, "AB3C\0\0\1\346\0\26\267\335\0\26\303\177\0\0\0\2\217\241\263\370\0\0\0\0\0\0\0\0"..., 4096, 5631833010176) = 4096 02:48:20.250067 pwrite64(4, "AB3B\0\0\1\343\377\377\377\377\0\5t\274\0\0\0\1\264\300\302@\0\0\0\0\0\0\0\0"..., 4096, 3751679393792) = 4096 02:48:20.276726 pwrite64(4, "AB3C\0\0\1\360\0D\310\177\0D\347\177\0\0\0\2{>\33\370\0\0\0\0\0\0\0\0"..., 4096, 5456692506624) = 4096 02:48:20.294656 pwrite64(4, "IAB3\0\0\0\370\0\10\203\250\0\10\241\340\0\0\0\1]\217k\20\0\0\0\0\0\0\0\0"..., 4096, 3002699489280) = 4096 02:48:20.316940 pwrite64(4, "AB3B\0\0\1\360\0\6-\376\0*\35\373\0\0\0\2zF\7\370\0\0\0\0\0\0\0\0"..., 4096, 5448368386048) = 4096 02:48:20.353951 pwrite64(4, "IAB3\0\0\0\366\0\3\1\177\377\377\377\377\0\0\0\0027\262h\210\0\0\0\0\0\0\0\0"..., 4096, 4876479303680) = 4096 02:48:20.379085 pwrite64(4, "AB3C\0\0\1\324\0\3\202\316\0\3\216\377\0\0\0\0A\232/X\0\0\0\0\0\0\0\0"..., 4096, 563519336448) = 4096 02:48:20.398480 pwrite64(4, "AB3C\0\0\1\361\0\17'\21\0\17Sc\0\0\0\0\360\235\306\340\0\0\0\0\0\0\0\0"..., 4096, 2066878414848) = 4096 02:48:20.441217 pwrite64(4, "AB3B\0\0\1\337\0\1\365C\0\2\fm\0\0\0\1\366+_\370\0\0\0\0\0\0\0\0"..., 4096, 4313602584576) = 4096 02:48:20.478478 pwrite64(4, "XAGF\0\0\0\1\0\0\0\20\2\272\225\0\0\t\232\376\0\17\306\377\0\0\0\0\0\0\0\2"..., 512, 3000386978304) = 512 02:48:20.533174 pwrite64(4, "XAGI\0\0\0\1\0\0\0\20\2\272\225\0\0\2\346\200\0\7\367\361\0\0\0\2\0\0\0E"..., 512, 3000386978816) = 512 02:48:20.533602 pwrite64(4, "XAFL\0\0\0\20\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 3000386979328) = 512 02:48:20.537398 pwrite64(4, "AB3B\0\0\1\323\0\17\267\377\377\377\377\377\0\0\0\1]\310o\370\0\0\0\0\0\0\0\0"..., 4096, 3004612734976) = 4096 02:48:20.556822 pwrite64(4, "AB3C\0\0\1\347\0\3\354\5\0\4#\345\0\0\0\0\25\364>\310\0\0\0\0\0\0\0\0"..., 4096, 188584136704) = 4096 02:48:20.575257 pwrite64(4, "AB3B\0\0\1\360\0\4\n\177\0\4\202~\0\0\0\2y;\3\370\0\0\0\0\0\0\0\0"..., 4096, 5439408828416) = 4096 02:48:20.726317 pwrite64(4, "AB3C\0\0\1\343\0\22\250\377\0\24m\177\0\0\0\1H\v\243\370\0\0\0\0\0\0\0\0"..., 4096, 2817889136640) = 4096 02:48:20.774303 pwrite64(4, "IAB3\0\0\0\354\0\2\2408\0\2\320g\0\0\0\2y,\265\350\0\0\0\0\0\0\0\0"..., 4096, 5438928834560) = 4096 02:48:20.811441 pwrite64(4, "AB3B\0\0\1\362\377\377\377\377\0\3\316\177\0\0\0\0\203\31\v\370\0\0\0\0\0\0\0\0"..., 4096, 1126121861120) = 4096 02:48:20.833481 pwrite64(4, "AB3B\0\0\1\357\0\1m\220\0\2^~\0\0\0\1\236\332'\360\0\0\0\0\0\0\0\0"..., 4096, 3563553021952) = 4096 02:48:20.860713 pwrite64(4, "AB3C\0\0\1\361\0\17Sc\0\17\301p\0\0\0\0\360\235\323\350\0\0\0\0\0\0\0\0"..., 4096, 2066880122880) = 4096 02:48:20.884289 pwrite64(4, "AB3C\0\0\1\361\0\17Q\334\0\17S}\0\0\0\0\360\235\323\30\0\0\0\0\0\0\0\0"..., 4096, 2066880016384) = 4096 02:48:20.891449 pwrite64(4, "AB3B\0\0\1\360\0\4\177\177\0\5\364\177\0\0\0\2y;\33\360\0\0\0\0\0\0\0\0"..., 4096, 5439411970048) = 4096 02:48:20.933477 pwrite64(4, "AB3B\0\0\1\364\0\1\216\377\0\1\307\377\0\0\0\0011\256\323\370\0\0\0\0\0\0\0\0"..., 4096, 2625796304896) = 4096 02:48:20.955609 pwrite64(4, "IAB3\0\0\0\352\0\0\2\10\0\1A{\0\0\0\2\216\365\27x\0\0\0\0\0\0\0\0"..., 4096, 5626041135104) = 4096 02:48:20.976287 pwrite64(4, "AB3C\0\0\1\360\0Sjr\377\377\377\377\0\0\0\2{\313/\240\0\0\0\0\0\0\0\0"..., 4096, 5461426257920) = 4096 02:48:20.994259 pwrite64(4, "AB3C\0\0\1\323\0\3t\300\0\3\206\353\0\0\0\0A\232\16p\0\0\0\0\0\0\0\0"..., 4096, 563515023360) = 4096 02:48:21.020439 pwrite64(4, "AB3C\0\0\1\337\0\4K\350\0\6\234\377\0\0\0\1\366O\357\370\0\0\0\0\0\0\0\0"..., 4096, 4314829418496) = 4096 02:48:21.047017 pwrite64(4, "AB3B\0\0\1\337\0\2\10\377\0\2!\374\0\0\0\1\366+{h\0\0\0\0\0\0\0\0"..., 4096, 4313606180864) = 4096 02:48:21.078639 pwrite64(4, "IAB3\0\0\0\361\0\0\220\375\0\2\\z\0\0\0\2\f\2K\370\0\0\0\0\0\0\0\0"..., 4096, 4501202792448) = 4096 02:48:21.107462 pwrite64(4, "AB3B\0\0\1\360\0\4\10\177\0\4\177\177\0\0\0\2y7[\370\0\0\0\0\0\0\0\0"..., 4096, 5439286145024) = 4096 02:48:21.144678 pwrite64(4, "AB3C\0\0\1\343\0\r\317\177\377\377\377\377\0\0\0\1\312\340\267\370\0\0\0\0\0\0\0\0"..., 4096, 3941730349056) = 4096 02:48:21.169770 pwrite64(4, "IAB3\0\0\0\352\0\1_\236\0\2\10\177\0\0\0\2\216\371W\370\0\0\0\0\0\0\0\0"..., 4096, 5626183806976) = 4096 02:48:21.201421 pwrite64(4, "AB3C\0\0\1\337\0\6\232\377\0\6\236\377\0\0\0\1\366O\377\370\0\0\0\0\0\0\0\0"..., 4096, 4314831515648) = 4096 02:48:21.238945 pwrite64(4, "IAB3\0\0\0\367\0\0N7\0\0\336\357\0\0\0\0WX'P\0\0\0\0\0\0\0\0"..., 4096, 750282252288) = 4096 02:48:21.288235 pwrite64(4, "AB3B\0\0\1\333\0\7\35\177\377\377\377\377\0\0\0\2\245\337\377\370\0\0\0\0\0\0\0\0"..., 4096, 5822901907456) = 4096 02:48:21.310639 pwrite64(4, "AB3B\0\0\1\333\0\2[\177\0\2g\177\0\0\0\0\230\343\233\370\0\0\0\0\0\0\0\0"..., 4096, 1313307357184) = 4096 02:48:21.346923 pwrite64(4, "AB3B\0\0\1\360\0\3\342\264\0\4\n\177\0\0\0\2y7K\370\0\0\0\0\0\0\0\0"..., 4096, 5439284047872) = 4096 02:48:21.373670 pwrite64(4, "AB3C\0\0\1\333\0\224j\211\0\224\234\377\0\0\0\2\20\223\277\370\0\0\0\0\0\0\0\0"..., 4096, 4540443127808) = 4096 02:48:21.404055 pwrite64(4, "AB3C\0\0\1\347\0\3~\36\0\3\362\331\0\0\0\0\25\364\10(\0\0\0\0\0\0\0\0"..., 4096, 188576976896) = 4096 02:48:21.437182 pwrite64(4, "AB3B\0\0\1\323\0\17\255\177\0\17\267\377\0\0\0\1]\310\33\370\0\0\0\0\0\0\0\0"..., 4096, 3004601724928) = 4096 02:48:21.462719 pwrite64(4, "AB3C\0\0\1\346\0\26\251~\0\26\300\177\0\0\0\2\217\241n\350\0\0\0\0\0\0\0\0"..., 4096, 5631823958016) = 4096 02:48:21.480284 pwrite64(4, "XAFL\0\0\0\30\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 4500580468224) = 512 02:48:21.509418 pwrite64(4, "XAGI\0\0\0\1\0\0\0\30\2\272\225\0\0\2\225@\0\0\1\210\0\0\0\2\0\0\0005"..., 512, 4500580467712) = 512 02:48:21.509851 pwrite64(4, "XAGF\0\0\0\1\0\0\0\30\2\272\225\0\0\3\366[\0\201@\177\0\0\0\0\0\0\0\2"..., 512, 4500580467200) = 512 02:48:21.511036 pwrite64(4, "AB3C\0\0\1\324\0\3\206\353\0\3\220\320\0\0\0\0A\232o\370\0\0\0\0\0\0\0\0"..., 4096, 563527806976) = 4096 02:48:21.555207 pwrite64(4, "AB3C\0\0\1\330\377\377\377\377\0\3\204\20\0\0\0\0mCC\220\0\0\0\0\0\0\0\0"..., 4096, 938559873024) = 4096 02:48:21.578253 pwrite64(4, "AB3C\0\0\1\354\0\31\260\377\377\377\377\377\0\0\0\2NS\313\370\0\0\0\0\0\0\0\0"..., 4096, 5070873161728) = 4096 02:48:21.615388 pwrite64(4, "IAB3\0\0\0\361\377\377\377\377\0\0\215-\0\0\0\2\v\357\310(\0\0\0\0\0\0\0\0"..., 4096, 4500581535744) = 4096 02:48:21.635665 pwrite64(4, "AB3B\0\0\1\363\0\2t\343\0\2\244\177\0\0\0\0011\265(p\0\0\0\0\0\0\0\0"..., 4096, 2626008702976) = 4096 02:48:21.674127 pwrite64(4, "IAB3\0\1\0\v\377\377\377\377\377\377\377\377\0\0\0\2\v\357\314@\0\0\0\0\0\0\0\0"..., 4096, 4500582072320) = 4096 02:48:21.701387 pwrite64(4, "AB3C\0\0\1\356\0\2\317\377\0\2\367\336\0\0\0\0+\300n\260\0\0\0\0\0\0\0\0"..., 4096, 375824146432) = 4096 02:48:21.730996 pwrite64(4, "AB3C\0\0\1\324\0\3\216\377\0\3\220\376\0\0\0\0A\232~\200\0\0\0\0\0\0\0\0"..., 4096, 563529711616) = 4096 02:48:21.766403 pwrite64(4, "AB3C\0\0\1\324\0\3\220\320\0\3\2214\0\0\0\0A\232\177\360\0\0\0\0\0\0\0\0"..., 4096, 563529900032) = 4096 02:48:21.770592 pwrite64(4, "AB3B\0\0\1\353\0\4\34\365\0\5\266\177\0\0\0\0027\305\277\370\0\0\0\0\0\0\0\0"..., 4096, 4877128298496) = 4096 02:48:21.809632 pwrite64(4, "IAB3\0\0\0\352\0\0001\371\377\377\377\377\0\0\0\0A\201\23\370\0\0\0\0\0\0\0\0"..., 4096, 562676887552) = 4096 02:48:21.827058 pwrite64(4, "AB3B\0\0\1\323\0\17\263\177\0\17\275\377\0\0\0\1]\310?\370\0\0\0\0\0\0\0\0"..., 4096, 3004606443520) = 4096 02:48:21.870829 pwrite64(4, "AB3C\0\0\1\327\0\3\177r\0\3\212\177\0\0\0\0mCh\200\0\0\0\0\0\0\0\0"..., 4096, 938564714496) = 4096 02:48:21.893708 pwrite64(4, "AB3C\0\1\0\17\377\377\377\377\377\377\377\377\0\0\0\0mCg\370\0\0\0\0\0\0\0\0"..., 4096, 938564644864) = 4096 02:48:21.910974 pwrite64(4, "AB3B\0\0\1\330\0\2a\"\0\2\227p\0\0\0\0m;\363h\0\0\0\0\0\0\0\0"..., 4096, 938314485760) = 4096 02:48:21.934874 pwrite64(4, "IAB3\0\0\0\357\377\377\377\377\0\0\272\177\0\0\0\1\33\314\224@\0\0\0\0\0\0\0\0"..., 4096, 2437816025088) = 4096 02:48:21.975891 pwrite64(4, "FIB3\0\0\0\6\377\377\377\377\377\377\377\377\0\0\0\0\203\30\273\370\0\0\0\0\0\0\0\0"..., 4096, 1126111375360) = 4096 02:48:21.998002 pwrite64(4, "IAB3\0\0\0\357\377\377\377\377\0\0\0100\0\0\0\0\256\245@\10\0\0\0\0\0\0\0\0"..., 4096, 1500193492992) = 4096 02:48:22.014136 pwrite64(4, "XAGF\0\0\0\1\0\0\0\10\2\272\225\0\0\3sN\0\4@\372\0\0\0\0\0\0\0\2"..., 512, 1500193489408) = 512 02:48:22.080443 pwrite64(4, "XAGI\0\0\0\1\0\0\0\10\2\272\225\0\0\2\217\200\0\0\2\10\0\0\0\2\0\0\0\10"..., 512, 1500193489920) = 512 02:48:22.080871 pwrite64(4, "XAFL\0\0\0\10\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 1500193490432) = 512 02:48:22.081910 pwrite64(4, "AB3B\0\0\1\333\0\2`\177\0\2k\177\0\0\0\0\230\343\323\370\0\0\0\0\0\0\0\0"..., 4096, 1313314697216) = 4096 02:48:22.119923 pwrite64(4, "IAB3\0\0\0\352\0\1,\357\0\1_\236\0\0\0\2\216\365\273\330\0\0\0\0\0\0\0\0"..., 4096, 5626062680064) = 4096 02:48:22.153879 pwrite64(4, "XAFL\0\0\0\r\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 2437814420992) = 512 02:48:22.176036 pwrite64(4, "XAGI\0\0\0\1\0\0\0\r\2\272\225\0\0\2\312@\0\0\271\321\0\0\0\2\0\0\0\231"..., 512, 2437814420480) = 512 02:48:22.176758 pwrite64(4, "XAGF\0\0\0\1\0\0\0\r\2\272\225\0\0\1\316\344\0\6\323\377\0\0\0\0\0\0\0\2"..., 512, 2437814419968) = 512 02:48:22.177741 pwrite64(4, "IAB3\0\0\0\373\0\4\271\377\0\4\277\377\0\0\0\0\332tg\370\0\0\0\0\0\0\0\0"..., 4096, 1876511682560) = 4096 02:48:22.217778 pwrite64(4, "AB3C\0\0\1\360\0\4G\377\0\4`\222\0\0\0\0\256\307\273\370\0\0\0\0\0\0\0\0"..., 4096, 1501350588416) = 4096 02:48:22.231855 pwrite64(4, "AB3C\0\0\1\343\0\22\234\177\0\22\271\177\0\0\0\1H\v\37\370\0\0\0\0\0\0\0\0"..., 4096, 2817871835136) = 4096 02:48:22.258335 pwrite64(4, "IAB3\0\0\0\371\0\1\36{\0\2\213R\0\0\0\2!\323\261\210\0\0\0\0\0\0\0\0"..., 4096, 4688617607168) = 4096 02:48:22.287396 pwrite64(4, "IAB3\0\1\0\v\377\377\377\377\377\377\377\377\0\0\0\0\256\245P@\0\0\0\0\0\0\0\0"..., 4096, 1500195618816) = 4096 02:48:22.310401 pwrite64(4, "AB3B\0\0\1\323\0\2\352\202\0\0039\177\0\0\0\0A\226#(\0\0\0\0\0\0\0\0"..., 4096, 563383521280) = 4096 02:48:22.348859 pwrite64(4, "AB3B\0\1\0\r\377\377\377\377\377\377\377\377\0\0\0\1sN_\200\0\0\0\0\0\0\0\0"..., 4096, 3189495496704) = 4096 02:48:22.379543 pwrite64(4, "IAB3\0\0\0\367\0\3\177\177\377\377\377\377\0\0\0\0\203\30\237\370\0\0\0\0\0\0\0\0"..., 4096, 1126107705344) = 4096 02:48:22.406162 pwrite64(4, "AB3C\0\0\1\365\0\6\363\377\0\7@\377\0\0\0\1\34\4C\370\0\0\0\0\0\0\0\0"..., 4096, 2439684550656) = 4096 02:48:22.442709 pwrite64(4, "AB3B\0\0\1\336\377\377\377\377\0\2)\177\0\0\0\0WbG\370\0\0\0\0\0\0\0\0"..., 4096, 750622076928) = 4096 02:48:22.482806 pwrite64(4, "AB3C\0\0\1\363\0\23\253\257\0\24\31\330\0\0\0\0\332\355\243\20\0\0\0\0\0\0\0\0"..., 4096, 1880579514368) = 4096 02:48:22.508065 pwrite64(4, "AB3C\0\0\1\364\377\377\377\377\0\3~|\0\0\0\0011\271\323\300\0\0\0\0\0\0\0\0"..., 4096, 2626165374976) = 4096 02:48:22.544242 pwrite64(4, "AB3C\0\0\1\330\0\3\204\20\0\3\216\251\0\0\0\0mC\233\370\0\0\0\0\0\0\0\0"..., 4096, 938571460608) = 4096 02:48:22.569736 pwrite64(4, "AB3B\0\0\1\350\0\2\212\377\0\3\22\340\0\0\0\0\25\355\26\0\0\0\0\0\0\0\0\0"..., 4096, 188343910400) = 4096 02:48:22.606555 pwrite64(4, "IAB3\0\0\0\362\0\5\351\314\0\6-\377\0\0\0\1\211$\237\30\0\0\0\0\0\0\0\0"..., 4096, 3377073106944) = 4096 02:48:22.633406 pwrite64(4, "AB3C\0\0\1\361\0\17\301z\0\22N\302\0\0\0\0\360\264\272\10\0\0\0\0\0\0\0\0"..., 4096, 2067648483328) = 4096 02:48:22.655749 pwrite64(4, "AB3B\0\0\1\333\0\2g\177\0\2x\177\0\0\0\0\230\343\363\370\0\0\0\0\0\0\0\0"..., 4096, 1313318891520) = 4096 02:48:22.667591 pwrite64(4, "AB3C\0\0\1\333\0\224\\\377\0\224\177\377\0\0\0\2\20\223\24H\0\0\0\0\0\0\0\0"..., 4096, 4540420624384) = 4096 02:48:22.708071 pwrite64(4, "XAGI\0\0\0\1\0\0\0\17\2\272\225\0\0\2\242\200\0\21g~\0\0\0\2\0\0\0:"..., 512, 2812862792704) = 512 02:48:22.725056 pwrite64(4, "XAFL\0\0\0\17\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 2812862793216) = 512 02:48:22.725447 pwrite64(4, "XAGF\0\0\0\1\0\0\0\17\2\272\225\0\0\21\243\177\0\0222\376\0\0\0\0\0\0\0\2"..., 512, 2812862792192) = 512 02:48:22.725815 pwrite64(4, "AB3C\0\0\1\357\0\4?\377\0\4G\377\0\0\0\0\256\307c\370\0\0\0\0\0\0\0\0"..., 4096, 1501339054080) = 4096 02:48:22.752698 pwrite64(4, "AB3C\0\1\0\16\377\377\377\377\377\377\377\377\0\0\0\2\245\341\354\250\0\0\0\0\0\0\0\0"..., 4096, 5822966484992) = 4096 02:48:22.804431 pwrite64(4, "AB3C\0\0\1\322\0X\271\377\0_\200\377\0\0\0\1v\4\343\370\0\0\0\0\0\0\0\0"..., 4096, 3212799635456) = 4096 02:48:22.830260 pwrite64(4, "AB3B\0\0\1\350\0\3\r\300\0\3\33Y\0\0\0\0\25\355?\0\0\0\0\0\0\0\0\0"..., 4096, 188349284352) = 4096 02:48:22.865216 pwrite64(4, "AB3C\0\0\1\330\0\3\212\177\0\3\2178\0\0\0\0mC\275H\0\0\0\0\0\0\0\0"..., 4096, 938575826944) = 4096 02:48:22.882046 pwrite64(4, "IAB3\0\0\0\373\0\1l\251\0\1\221\275\0\0\0\0\0\v\240H\0\0\0\0\0\0\0\0"..., 4096, 390107136) = 4096 02:48:22.901473 pwrite64(4, "IAB3\0\0\0\373\0\4\220;\0\4\272\377\0\0\0\0\332t_\370\0\0\0\0\0\0\0\0"..., 4096, 1876510633984) = 4096 02:48:22.902831 pwrite64(4, "IAB3\0\0\0\370\0\0\374\377\0\2\242\377\0\0\0\0\203\5\f\230\0\0\0\0\0\0\0\0"..., 4096, 1125450854400) = 4096 02:48:22.917450 pwrite64(4, "AB3B\0\0\1\356\0\4\272\377\0\5w\236\0\0\0\1\236\356\213\370\0\0\0\0\0\0\0\0"..., 4096, 3564237221888) = 4096 02:48:22.942600 pwrite64(4, "AB3C\0\0\1\360\0\4D\177\0\4O\177\0\0\0\0\256\307\177\370\0\0\0\0\0\0\0\0"..., 4096, 1501342724096) = 4096 02:48:22.954761 pwrite64(4, "AB3C\0\0\1\346\0\26\240\377\0\26\267\335\0\0\0\2\217\240\373\360\0\0\0\0\0\0\0\0"..., 4096, 5631808888832) = 4096 02:48:22.992327 pwrite64(4, "FIB3\0\0\0\10\377\377\377\377\377\377\377\377\0\0\0\0\332t\247\370\0\0\0\0\0\0\0\0"..., 4096, 1876520071168) = 4096 02:48:23.021879 pwrite64(4, "AB3C\0\1\0\16\377\377\377\377\377\377\377\377\0\0\0\0\256\307G\320\0\0\0\0\0\0\0\0"..., 4096, 1501335363584) = 4096 02:48:23.037940 pwrite64(4, "AB3B\0\0\1\333\0\3\272\327\0\5\306\377\0\0\0\2\244\344\217\370\0\0\0\0\0\0\0\0"..., 4096, 5814465064960) = 4096 02:48:23.072660 pwrite64(4, "IAB3\0\0\0\362\0\1\336\377\0\5\224\206\0\0\0\1\211\6\367(\0\0\0\0\0\0\0\0"..., 4096, 3376078016512) = 4096 02:48:23.103661 pwrite64(4, "IAB3\0\0\0\366\377\377\377\377\0V\221z\0\0\0\0\306\343\363\370\0\0\0\0\0\0\0\0"..., 4096, 1708455882752) = 4096 02:48:23.124293 pwrite64(4, "AB3C\0\0\1\323\0\17\335\177\0\17\346\177\0\0\0\1]\311\243\370\0\0\0\0\0\0\0\0"..., 4096, 3004653105152) = 4096 02:48:23.137877 pwrite64(4, "AB3B\0\0\1\334\0\2JD\0\2T\177\0\0\0\0\230\343\0\350\0\0\0\0\0\0\0\0"..., 4096, 1313287032832) = 4096 02:48:23.160397 pwrite64(4, "AB3C\0\0\1\330\0\3\216\251\0\3\243\377\0\0\0\0mC\301\300\0\0\0\0\0\0\0\0"..., 4096, 938576412672) = 4096 02:48:23.175822 pwrite64(4, "IAB3\0\1\0\r\377\377\377\377\377\377\377\377\0\0\0\2\244\307%\200\0\0\0\0\0\0\0\0"..., 4096, 5813478031360) = 4096 02:48:23.225217 pwrite64(4, "IAB3\0\0\0\361\377\377\377\377\0\0X\302\0\0\0\1\5\370\330@\0\0\0\0\0\0\0\0"..., 4096, 2250322771968) = 4096 02:48:23.255897 pwrite64(4, "FIB3\0\0\0\10\377\377\377\377\377\377\377\377\0\0\0\1\312~\235\230\0\0\0\0\0\0\0\0"..., 4096, 3938438557696) = 4096 02:48:23.286648 pwrite64(4, "IAB3\0\0\0\360\0\2\\z\0\2n\205\0\0\0\2\f\2\365h\0\0\0\0\0\0\0\0"..., 4096, 4501225000960) = 4096 02:48:23.333410 pwrite64(4, "IAB3\0\0\0\370\0\10|\360\0\10\235b\0\0\0\1]\216\235@\0\0\0\0\0\0\0\0"..., 4096, 3002672513024) = 4096 02:48:23.353526 pwrite64(4, "IAB3\0\0\0\366\377\377\377\377\0\1\251y\0\0\0\1\340Fp@\0\0\0\0\0\0\0\0"..., 4096, 4125532127232) = 4096 02:48:23.369966 pwrite64(4, "XAFL\0\0\0\26\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 4125532096000) = 512 02:48:23.408799 pwrite64(4, "XAGI\0\0\0\1\0\0\0\26\2\272\225\0\0\2\242\200\0\1e\377\0\0\0\2\0\0\0]"..., 512, 4125532095488) = 512 02:48:23.409312 pwrite64(4, "XAGF\0\0\0\1\0\0\0\26\2\272\225\0\0\5!\377\0_n\177\0\0\0\0\0\0\0\2"..., 512, 4125532094976) = 512 02:48:23.411706 pwrite64(4, "IAB3\0\0\0\353\0\0\324|\0\1\231\215\0\0\0\1\312~\224@\0\0\0\0\0\0\0\0"..., 4096, 3938437332992) = 4096 02:48:23.440047 pwrite64(4, "IAB3\0\0\0\353\0\1\231\210\0\1\231\371\0\0\0\1\312~\224h\0\0\0\0\0\0\0\0"..., 4096, 3938437353472) = 4096 02:48:23.441271 pwrite64(4, "AB3C\0\0\1\323\0\17\344\177\0\17\370\377\0\0\0\1]\311\263\370\0\0\0\0\0\0\0\0"..., 4096, 3004655202304) = 4096 02:48:23.458308 pwrite64(4, "IAB3\0\0\0\353\0\1\231\215\377\377\377\377\0\0\0\1\312~\227\310\0\0\0\0\0\0\0\0"..., 4096, 3938437795840) = 4096 02:48:23.460499 pwrite64(4, "AB3C\0\0\1\360\0D\232\177\0D\342\177\0\0\0\2{=K\370\0\0\0\0\0\0\0\0"..., 4096, 5456665243648) = 4096 02:48:23.504279 pwrite64(4, "AB3C\0\0\1\333\0\2\371\377\0\2\376\330\0\0\0\0\230\350w\370\0\0\0\0\0\0\0\0"..., 4096, 1313470410752) = 4096 02:48:23.544306 pwrite64(4, "AB3C\0\1\0\33\377\377\377\377\377\377\377\377\0\0\0\0+\277\336x\0\0\0\0\0\0\0\0"..., 4096, 375805243392) = 4096 02:48:23.578895 pwrite64(4, "IAB3\0\0\0\373\0\4\272\377\377\377\377\377\0\0\0\0\332t\217\370\0\0\0\0\0\0\0\0"..., 4096, 1876516925440) = 4096 02:48:23.596787 pwrite64(4, "AB3B\0\0\1\334\0\2M\35\0\2X!\0\0\0\0\230\343;\370\0\0\0\0\0\0\0\0"..., 4096, 1313294774272) = 4096 02:48:23.622312 pwrite64(4, "IAB3\0\0\0\353\0\1y\332\0\1\210d\0\0\0\2\244\314\213\370\0\0\0\0\0\0\0\0"..., 4096, 5813659234304) = 4096 02:48:23.652997 pwrite64(4, "AB3B\0\0\1\357\0\0\205O\0\0\210\357\0\0\0\1\236\314\245\200\0\0\0\0\0\0\0\0"..., 4096, 3563099717632) = 4096 02:48:23.690569 pwrite64(4, "AB3C\0\0\1\324\0\17\326\177\0\17\332\177\0\0\0\1]\311C\370\0\0\0\0\0\0\0\0"..., 4096, 3004640522240) = 4096 02:48:23.707690 pwrite64(4, "AB3B\0\0\1\357\0\0\205\10\0\0\205\260\0\0\0\1\236\314\242x\0\0\0\0\0\0\0\0"..., 4096, 3563099320320) = 4096 02:48:23.729692 pwrite64(4, "IAB3\0\0\0\366\0\1\251y\0\2\317\177\0\0\0\1\340S\3100\0\0\0\0\0\0\0\0"..., 4096, 4125979860992) = 4096 02:48:23.772215 pwrite64(4, "AB3B\0\0\1\357\0\0d\351\0\0\205O\0\0\0\1\236\314\240@\0\0\0\0\0\0\0\0"..., 4096, 3563099029504) = 4096 02:48:23.790710 pwrite64(4, "AB3C\0\0\1\364\0\6\257\377\0\6\367\177\0\0\0\1\34\4'\370\0\0\0\0\0\0\0\0"..., 4096, 2439680880640) = 4096 02:48:23.809563 pwrite64(4, "AB3B\0\0\1\343\0\1\241\177\0\2L\377\0\0\0\1\312~\340\210\0\0\0\0\0\0\0\0"..., 4096, 3938447331328) = 4096 02:48:23.834135 pwrite64(4, "AB3B\0\0\1\357\0\4:\212\377\377\377\377\0\0\0\0\256\307+\370\0\0\0\0\0\0\0\0"..., 4096, 1501331714048) = 4096 02:48:23.870526 pwrite64(4, "AB3B\0\0\1\357\0\0\205\260\0\1m\220\0\0\0\1\236\314\277x\0\0\0\0\0\0\0\0"..., 4096, 3563103121408) = 4096 02:48:23.886643 pwrite64(4, "AB3C\0\0\1\333\0\2\367\377\0\2\373\377\0\0\0\0\230\350g\370\0\0\0\0\0\0\0\0"..., 4096, 1313468313600) = 4096 02:48:23.903528 pwrite64(4, "IAB3\0\0\0\361\0\0017T\0\1\334\177\0\0\0\1\6\5S\370\0\0\0\0\0\0\0\0"..., 4096, 2250741641216) = 4096 02:48:23.924664 pwrite64(4, "IAB3\0\1\0\v\377\377\377\377\377\377\377\377\0\0\0\1\366\34\364\240\0\0\0\0\0\0\0\0"..., 4096, 4313118752768) = 4096 02:48:23.948669 pwrite64(4, "IAB3\0\0\0\367\0\0\260\352\0\0\352\306\0\0\0\0WY\227x\0\0\0\0\0\0\0\0"..., 4096, 750330507264) = 4096 02:48:23.975882 pwrite64(4, "AB3C\0\0\1\357\377\377\377\377\0\2\343\326\0\0\0\0+\277\317\370\0\0\0\0\0\0\0\0"..., 4096, 375803342848) = 4096 02:48:24.010277 pwrite64(4, "AB3B\0\0\1\346\0\6B\377\0\0254\177\0\0\0\2\217\224+\360\0\0\0\0\0\0\0\0"..., 4096, 5631378972672) = 4096 02:48:24.040230 pwrite64(4, "AB3C\0\0\1\356\0\0033\375\0\3A\177\0\0\0\0+\303\4 \0\0\0\0\0\0\0\0"..., 4096, 375910842368) = 4096 02:48:24.071317 pwrite64(4, "AB3B\0\1\0\16\377\377\377\377\377\377\377\377\0\0\0\0027\265*\30\0\0\0\0\0\0\0\0"..., 4096, 4876571783168) = 4096 02:48:24.104924 pwrite64(4, "IAB3\0\0\0\373\0\1\27\302\0\1t\t\0\0\0\0\0\veH\0\0\0\0\0\0\0\0"..., 4096, 382373888) = 4096 02:48:24.143440 pwrite64(4, "AB3B\0\0\1\333\0\5\306\377\0\7\35\177\0\0\0\2\244\370\17\370\0\0\0\0\0\0\0\0"..., 4096, 5815119376384) = 4096 02:48:24.174180 pwrite64(4, "AB3B\0\0\1\322\0\7|\276\0Pz\377\0\0\0\1un#\370\0\0\0\0\0\0\0\0"..., 4096, 3207741304832) = 4096 02:48:24.219763 pwrite64(4, "IAB3\0\0\0\353\0\1\206\177\0\1\251\377\0\0\0\2\244\314\233 \0\0\0\0\0\0\0\0"..., 4096, 5813661220864) = 4096 02:48:24.253924 pwrite64(4, "AB3C\0\0\1\324\0\17\330\177\0\17\335\177\0\0\0\1]\311S\370\0\0\0\0\0\0\0\0"..., 4096, 3004642619392) = 4096 02:48:24.267009 pwrite64(4, "AB3C\0\0\1\360\377\377\377\377\0\4D\177\0\0\0\0\256\307?\370\0\0\0\0\0\0\0\0"..., 4096, 1501334335488) = 4096 02:48:24.313177 pwrite64(4, "IAB3\0\0\0\366\0\0\0\10\0\1\253\6\0\0\0\1\340S\273\310\0\0\0\0\0\0\0\0"..., 4096, 4125978234880) = 4096 02:48:24.336493 pwrite64(4, "AB3C\0\0\1\346\0\26\236\377\0\26\251~\0\0\0\2\217\240\267\370\0\0\0\0\0\0\0\0"..., 4096, 5631799980032) = 4096 02:48:24.357208 pwrite64(4, "AB3C\0\0\1\333\0\2\366\377\0\2\371\377\0\0\0\0\230\350W\370\0\0\0\0\0\0\0\0"..., 4096, 1313466216448) = 4096 02:48:24.390768 pwrite64(4, "AB3C\0\0\1\323\0\3\2214\0\3\376\263\0\0\0\0A\235\347\370\0\0\0\0\0\0\0\0"..., 4096, 563644198912) = 4096 02:48:24.408227 pwrite64(4, "AB3B\0\0\1\327\377\377\377\377\0\2\225m\0\0\0\0m:Q\20\0\0\0\0\0\0\0\0"..., 4096, 938259652608) = 4096 02:48:24.431818 pwrite64(4, "AB3B\0\0\1\334\0\2T\177\0\2[\177\0\0\0\0\230\343Y\10\0\0\0\0\0\0\0\0"..., 4096, 1313298583552) = 4096 02:48:24.447239 pwrite64(4, "AB3B\0\0\1\363\377\377\377\377\0\4\330\225\0\0\0\0\332t\357\370\0\0\0\0\0\0\0\0"..., 4096, 1876529508352) = 4096 02:48:24.479097 pwrite64(4, "AB3C\0\0\1\323\0\3\375\377\0\4)3\0\0\0\0A\235\355\230\0\0\0\0\0\0\0\0"..., 4096, 563644936192) = 4096 02:48:24.491218 pwrite64(4, "AB3C\0\0\1\333\0\2\365\177\0\2\367\377\0\0\0\0\230\350O\370\0\0\0\0\0\0\0\0"..., 4096, 1313465167872) = 4096 02:48:24.504976 pwrite64(4, "IAB3\0\0\0\360\0\2Q\177\0\2f\255\0\0\0\2\f\2\243\320\0\0\0\0\0\0\0\0"..., 4096, 4501214306304) = 4096 02:48:24.528185 pwrite64(4, "AB3B\0\0\1\363\0\2U\177\0\2{\377\0\0\0\2cU\27\370\0\0\0\0\0\0\0\0"..., 4096, 5251305304064) = 4096 02:48:24.555637 pwrite64(4, "AB3B\0\1\0\16\377\377\377\377\377\377\377\377\0\0\0\1]\227W\360\0\0\0\0\0\0\0\0"..., 4096, 3002965417984) = 4096 02:48:24.584668 pwrite64(4, "AB3C\0\0\1\364\0\10Y\177\0\10\217\377\0\0\0\1\34\17\217\370\0\0\0\0\0\0\0\0"..., 4096, 2440063610880) = 4096 02:48:24.611874 pwrite64(4, "AB3B\0\0\1\352\0Tb\177\377\377\377\377\0\0\0\1\343\17O\370\0\0\0\0\0\0\0\0"..., 4096, 4149452206080) = 4096 02:48:24.636938 pwrite64(4, "IAB3\0\0\0\370\0\10d\375\0\10\203\250\0\0\0\1]\216g\200\0\0\0\0\0\0\0\0"..., 4096, 3002665467904) = 4096 02:48:24.652711 pwrite64(4, "AB3C\0\0\1\346\0\26C\377\0\26\240\377\0\0\0\2\217\240\247\370\0\0\0\0\0\0\0\0"..., 4096, 5631797882880) = 4096 02:48:24.712711 pwrite64(4, "IAB3\0\0\0\374\377\377\377\377\0\0Mf\0\0\0\0011\241<@\0\0\0\0\0\0\0\0"..., 4096, 2625340211200) = 4096 02:48:24.739152 pwrite64(4, "IAB3\0\0\0\367\0\0\336\357\0\0\354M\0\0\0\0WY\3660\0\0\0\0\0\0\0\0"..., 4096, 750342922240) = 4096 02:48:24.763189 pwrite64(4, "AB3C\0\0\1\324\0\17\332\177\0\17\344\177\0\0\0\1]\311k\370\0\0\0\0\0\0\0\0"..., 4096, 3004645765120) = 4096 02:48:24.786085 pwrite64(4, "AB3C\0\0\1\343\0`\23\377\0`\227\177\0\0\0\1\267\236W\370\0\0\0\0\0\0\0\0"..., 4096, 3776294416384) = 4096 02:48:24.808020 pwrite64(4, "AB3C\0\0\1\334\0\2\363\377\0\2\366\377\0\0\0\0\230\350C\370\0\0\0\0\0\0\0\0"..., 4096, 1313463595008) = 4096 02:48:24.830997 pwrite64(4, "AB3B\0\1\0\21\377\377\377\377\377\377\377\377\0\0\0\1\312~\337\370\0\0\0\0\0\0\0\0"..., 4096, 3938447257600) = 4096 02:48:24.887966 pwrite64(4, "AB3B\0\0\1\357\0\0043\371\0\4=\177\0\0\0\0\256\307\24P\0\0\0\0\0\0\0\0"..., 4096, 1501328613376) = 4096 02:48:24.908102 pwrite64(4, "IAB3\0\0\0\371\0\1\3511\0\2\241\177\0\0\0\2!\330\302\220\0\0\0\0\0\0\0\0"..., 4096, 4688787611648) = 4096 02:48:24.925854 pwrite64(4, "IAB3\0\0\0\366\0\21h\177\0\21k\177\0\0\0\1H\1'\370\0\0\0\0\0\0\0\0"..., 4096, 2817537339392) = 4096 02:48:24.948185 pwrite64(4, "AB3B\0\0\1\343\0\10z\177\0\10|\177\0\0\0\1\264\340\373\370\0\0\0\0\0\0\0\0"..., 4096, 3752760700928) = 4096 02:48:24.975241 pwrite64(4, "AB3B\0\0\1\333\0\2X!\0\2`\177\0\0\0\0\230\343s\370\0\0\0\0\0\0\0\0"..., 4096, 1313302114304) = 4096 02:48:25.003901 pwrite64(4, "XAFL\0\0\0\16\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 2625338607104) = 512 02:48:25.015920 pwrite64(4, "XAGI\0\0\0\1\0\0\0\16\2\272\225\0\0\2\264\300\0\0M^\0\0\0\2\0\0\1\270"..., 512, 2625338606592) = 512 02:48:25.016349 pwrite64(4, "XAGF\0\0\0\1\0\0\0\16\2\272\225\0\0\1\202\377\0\3v\343\0\0\0\0\0\0\0\2"..., 512, 2625338606080) = 512 02:48:25.017573 pwrite64(4, "AB3C\0\0\1\333\0\224Q\377\0\224\\\377\0\0\0\2\20\222\237\370\0\0\0\0\0\0\0\0"..., 4096, 4540405379072) = 4096 02:48:25.035907 pwrite64(4, "AB3C\0\0\1\346\0*\3\177\0001!\177\0\0\0\2\220^\277\300\0\0\0\0\0\0\0\0"..., 4096, 5638176342016) = 4096 02:48:25.053502 pwrite64(4, "AB3B\0\0\1\343\377\377\377\377\0\1\243\21\0\0\0\1\312~\323\370\0\0\0\0\0\0\0\0"..., 4096, 3938445684736) = 4096 02:48:25.070800 pwrite64(4, "AB3C\0\0\1\334\0\2\357\32\0\2\365\177\0\0\0\0\230\3507\370\0\0\0\0\0\0\0\0"..., 4096, 1313462022144) = 4096 02:48:25.098995 pwrite64(4, "AB3B\0\0\1\347\0\3\22\340\0\3S\377\0\0\0\0\25\355\202\310\0\0\0\0\0\0\0\0"..., 4096, 188358168576) = 4096 02:48:25.119769 pwrite64(4, "AB3C\0\0\1\334\0\221\363\177\0\224\6\177\0\0\0\2\20\207\7\370\0\0\0\0\0\0\0\0"..., 4096, 4540016357376) = 4096 02:48:25.155106 pwrite64(4, "IAB3\0\0\0\365\0\21i\377\0\21l\377\0\0\0\1H\0013\370\0\0\0\0\0\0\0\0"..., 4096, 2817538912256) = 4096 02:48:25.192800 pwrite64(4, "AB3B\0\0\1\343\0\0104\377\0\10{\177\0\0\0\1\264\340\363\370\0\0\0\0\0\0\0\0"..., 4096, 3752759652352) = 4096 02:48:25.193653 pwrite64(4, "AB3C\0\0\1\343\0\0224\177\0\22\250\377\0\0\0\1H\n\273\370\0\0\0\0\0\0\0\0"..., 4096, 2817858727936) = 4096 02:48:25.228759 pwrite64(4, "AB3B\0\0\1\363\0\2I\177\0\2V\377\0\0\0\2cU\v\370\0\0\0\0\0\0\0\0"..., 4096, 5251303731200) = 4096 02:48:25.258122 pwrite64(4, "AB3C\0\0\1\333\0\224[\377\0\224j\211\0\0\0\2\20\222\247\370\0\0\0\0\0\0\0\0"..., 4096, 4540406427648) = 4096 02:48:25.274126 pwrite64(4, "AB3C\0\0\1\343\0\r\246\177\0\r\335\377\0\0\0\1\312\340C\370\0\0\0\0\0\0\0\0"..., 4096, 3941715144704) = 4096 02:48:25.296359 pwrite64(4, "AB3B\0\0\1\337\0\1\364\377\0\0024t\0\0\0\0Wc\353\370\0\0\0\0\0\0\0\0"..., 4096, 750677127168) = 4096 02:48:25.319603 pwrite64(4, "AB3B\0\0\1\346\0\rj`\0\16'\177\0\0\0\1\211`\177\370\0\0\0\0\0\0\0\0"..., 4096, 3379082293248) = 4096 02:48:25.353867 pwrite64(4, "AB3B\0\0\1\354\0\17I\10\0\17p\177\0\0\0\2M\350;\20\0\0\0\0\0\0\0\0"..., 4096, 5067263844352) = 4096 02:48:25.404415 pwrite64(4, "AB3B\0\0\1\360\0\2\351\377\0\3}z\0\0\0\0\256\301\27h\0\0\0\0\0\0\0\0"..., 4096, 1501127692288) = 4096 02:48:25.430567 pwrite64(4, "IAB3\0\0\0\365\0\21k\177\0\21t\177\0\0\0\1H\1?\370\0\0\0\0\0\0\0\0"..., 4096, 2817540485120) = 4096 02:48:25.444983 pwrite64(4, "AB3C\0\0\1\364\0\10E\377\0\10`\377\0\0\0\1\34\17S\370\0\0\0\0\0\0\0\0"..., 4096, 2440055746560) = 4096 02:48:25.470052 pwrite64(4, "AB3B\0\0\1\356\0\2v\322\0\2\237\177\0\0\0\0+\276\t\350\0\0\0\0\0\0\0\0"..., 4096, 375743827968) = 4096 02:48:25.488038 pwrite64(4, "AB3C\0\0\1\324\0\17\316\177\0\17\326\177\0\0\0\1]\311\v\370\0\0\0\0\0\0\0\0"..., 4096, 3004633182208) = 4096 02:48:25.508185 pwrite64(4, "AB3B\0\0\1\354\0\17H\376\0\17Pb\0\0\0\2M\350\0@\0\0\0\0\0\0\0\0"..., 4096, 5067256135680) = 4096 02:48:25.538297 pwrite64(4, "AB3C\0\0\1\363\0\24\321\307\0\25-q\0\0\0\0\332\367e\30\0\0\0\0\0\0\0\0"..., 4096, 1880906936320) = 4096 02:48:25.563153 pwrite64(4, "IAB3\0\0\0\357\0\0\0\1\0\0\10\177\0\0\0\0\256\245\201\200\0\0\0\0\0\0\0\0"..., 4096, 1500202074112) = 4096 02:48:25.590111 pwrite64(4, "AB3C\0\1\0\16\377\377\377\377\377\377\377\377\0\0\0\0\332x\243\370\0\0\0\0\0\0\0\0"..., 4096, 1876653764608) = 4096 02:48:25.601622 pwrite64(4, "IAB3\0\0\0\357\0\0\0100\0\0\32\26\0\0\0\0\256\245\203\370\0\0\0\0\0\0\0\0"..., 4096, 1500202397696) = 4096 02:48:25.606916 pwrite64(4, "AB3C\0\0\1\334\0\2\323\177\0\2\363\377\0\0\0\0\230\350\20\320\0\0\0\0\0\0\0\0"..., 4096, 1313456889856) = 4096 02:48:25.620186 pwrite64(4, "IAB3\0\1\0\v\377\377\377\377\377\377\377\377\0\0\0\1H\1\23\360\0\0\0\0\0\0\0\0"..., 4096, 2817534713856) = 4096 02:48:25.637127 pwrite64(4, "AB3C\0\0\1\364\377\377\377\377\0\7\25\201\0\0\0\0\332x\223\370\0\0\0\0\0\0\0\0"..., 4096, 1876651667456) = 4096 02:48:25.656783 pwrite64(4, "IAB3\0\0\0\366\0\2\323\252\0\21i\377\0\0\0\1H\1\33\370\0\0\0\0\0\0\0\0"..., 4096, 2817535766528) = 4096 02:48:25.729911 pwrite64(4, "IAB3\0\0\0\365\0\2\306m\0\0037\377\0\0\0\2M\207\26\330\0\0\0\0\0\0\0\0"..., 4096, 5064004317184) = 4096 02:48:25.757586 pwrite64(4, "AB3C\0\0\1\356\0\0036\204\0\3P\177\0\0\0\0+\303[\370\0\0\0\0\0\0\0\0"..., 4096, 375922356224) = 4096 02:48:25.795807 pwrite64(4, "IAB3\0\0\0\360\0\2n\205\0\3\341i\0\0\0\2\f\3l\30\0\0\0\0\0\0\0\0"..., 4096, 4501240557568) = 4096 02:48:25.822811 pwrite64(4, "AB3C\0\0\1\353\0\t\336\376\0\33\"\213\0\0\0\0028r#\360\0\0\0\0\0\0\0\0"..., 4096, 4882912763904) = 4096 02:48:25.857849 pwrite64(4, "AB3B\0\0\1\360\0\3z\355\0\3\212\177\0\0\0\0\256\301+\320\0\0\0\0\0\0\0\0"..., 4096, 1501130366976) = 4096 02:48:25.881664 pwrite64(4, "AB3C\0\0\1\353\0\33\"~\0\0339\177\0\0\0\0028r$X\0\0\0\0\0\0\0\0"..., 4096, 4882912817152) = 4096 02:48:25.905971 pwrite64(4, "AB3C\0\0\1\360\0Gl\177\0H\317\377\0\0\0\2{W3\370\0\0\0\0\0\0\0\0"..., 4096, 5457534513152) = 4096 02:48:25.925862 pwrite64(4, "AB3B\0\0\1\324\0\17\33\376\0\17\204\377\0\0\0\1]\305_\370\0\0\0\0\0\0\0\0"..., 4096, 3004509974528) = 4096 02:48:25.960768 pwrite64(4, "AB3C\0\0\1\324\0\17\321\177\0\17\330\177\0\0\0\1]\3113\370\0\0\0\0\0\0\0\0"..., 4096, 3004638425088) = 4096 02:48:25.987085 pwrite64(4, "AB3B\0\1\0\17\377\377\377\377\377\377\377\377\0\0\0\0m:\377\360\0\0\0\0\0\0\0\0"..., 4096, 938282573824) = 4096 02:48:26.000883 pwrite64(4, "AB3B\0\0\1\343\0\2+A\377\377\377\377\0\0\0\1\6\t_\310\0\0\0\0\0\0\0\0"..., 4096, 2250877407232) = 4096 02:48:26.035882 pwrite64(4, "AB3C\0\0\1\344\377\377\377\377\0\2\246}\0\0\0\1\6\t_\330\0\0\0\0\0\0\0\0"..., 4096, 2250877415424) = 4096 02:48:26.037426 pwrite64(4, "AB3B\0\0\1\357\0\0025\376\0\2\327\177\0\0\0\1\236\333k\360\0\0\0\0\0\0\0\0"..., 4096, 3563595489280) = 4096 02:48:26.064982 pwrite64(4, "IAB3\0\0\0\365\0\21l\377\0\21v\377\0\0\0\1H\1{\370\0\0\0\0\0\0\0\0"..., 4096, 2817548349440) = 4096 02:48:26.076732 pwrite64(4, "IAB3\0\0\0\365\0\3+\333\0\3\213\177\0\0\0\2M\207w\370\0\0\0\0\0\0\0\0"..., 4096, 5064017047552) = 4096 02:48:26.108387 pwrite64(4, "AB3C\0\0\1\363\0\4qX\0\4u~\0\0\0\0\203\37\203\370\0\0\0\0\0\0\0\0"..., 4096, 1126338916352) = 4096 02:48:26.130822 pwrite64(4, "AB3B\0\1\0\16\377\377\377\377\377\377\377\377\0\0\0\0\332u\23\370\0\0\0\0\0\0\0\0"..., 4096, 1876534226944) = 4096 02:48:26.150059 pwrite64(4, "AB3B\0\0\1\356\0\2\227=\377\377\377\377\0\0\0\0+\276K\370\0\0\0\0\0\0\0\0"..., 4096, 375752486912) = 4096 02:48:26.188676 pwrite64(4, "AB3B\0\0\1\352\0\6W\3\0009\253\177\0\0\0\1\340\232\367\370\0\0\0\0\0\0\0\0"..., 4096, 4128368488448) = 4096 02:48:26.215180 pwrite64(4, "AB3B\0\0\1\360\0\3\336\363\0\4\10\177\0\0\0\2y6\35\240\0\0\0\0\0\0\0\0"..., 4096, 5439244419072) = 4096 02:48:26.238001 pwrite64(4, "IAB3\0\0\0\352\0\1A{\0\1\264\377\0\0\0\2\216\366\254\360\0\0\0\0\0\0\0\0"..., 4096, 5626094280704) = 4096 02:48:26.251558 pwrite64(4, "AB3C\0\0\1\321\0_\200\377\377\377\377\377\0\0\0\1v\34\237\370\0\0\0\0\0\0\0\0"..., 4096, 3213596028928) = 4096 02:48:26.275332 pwrite64(4, "AB3B\0\0\1\347\0\4\261\367\0\5\240\r\0\0\0\2\217\26\25P\0\0\0\0\0\0\0\0"..., 4096, 5627148148736) = 4096 02:48:26.295617 pwrite64(4, "AB3C\0\0\1\333\0\3\7\177\377\377\377\377\0\0\0\0\230\350\337\370\0\0\0\0\0\0\0\0"..., 4096, 1313484042240) = 4096 02:48:26.317187 pwrite64(4, "AB3C\0\0\1\356\0\201{\22\0\201\205F\0\0\0\0\310\205\355 \0\0\0\0\0\0\0\0"..., 4096, 1722480738304) = 4096 02:48:26.331740 pwrite64(4, "AB3C\0\0\1\343\0a9\177\0b\177\177\0\0\0\1\267\260\213\370\0\0\0\0\0\0\0\0"..., 4096, 3776905211904) = 4096 02:48:26.355128 pwrite64(4, "IAB3\0\1\0\v\377\377\377\377\377\377\377\377\0\0\0\0WR\354\20\0\0\0\0\0\0\0\0"..., 4096, 750106714112) = 4096 02:48:26.382835 pwrite64(4, "IAB3\0\0\0\367\0\0\0\7\0\0L\375\0\0\0\0WR\355\210\0\0\0\0\0\0\0\0"..., 4096, 750106906624) = 4096 02:48:26.384929 pwrite64(4, "AB3B\0\0\1\363\0\4\331\177\0\4\345\377\0\0\0\0\332uc\370\0\0\0\0\0\0\0\0"..., 4096, 1876544712704) = 4096 02:48:26.410314 pwrite64(4, "AB3B\0\0\1\352\0\5K\377\0\5\325\377\0\0\0\1\340t\367\370\0\0\0\0\0\0\0\0"..., 4096, 4127093420032) = 4096 02:48:26.435801 pwrite64(4, "AB3C\0\0\1\333\0\3\1\372\0\3\10\377\0\0\0\0\230\350\323\370\0\0\0\0\0\0\0\0"..., 4096, 1313482469376) = 4096 02:48:26.469137 pwrite64(4, "AB3C\0\0\1\363\0\4r\177\0\4w\326\0\0\0\0\203\37\233\360\0\0\0\0\0\0\0\0"..., 4096, 1126342057984) = 4096 02:48:26.486601 pwrite64(4, "AB3C\0\0\1\356\0\201l\352\0\201\200\244\0\0\0\0\310\205\300\220\0\0\0\0\0\0\0\0"..., 4096, 1722474897408) = 4096 02:48:26.500302 pwrite64(4, "IAB3\0\0\0\353\0\1 \377\0\1\206\177\0\0\0\2\244\314&\320\0\0\0\0\0\0\0\0"..., 4096, 5813645975552) = 4096 02:48:26.530117 pwrite64(4, "AB3B\0\1\0\17\377\377\377\377\377\377\377\377\0\0\0\0WcEX\0\0\0\0\0\0\0\0"..., 4096, 750655287296) = 4096 02:48:26.565731 pwrite64(4, "IAB3\0\0\0\370\0\0\1\10\0\1#\223\0\0\0\0\203\3\327\370\0\0\0\0\0\0\0\0"..., 4096, 1125410402304) = 4096 02:48:26.579806 pwrite64(4, "IAB3\0\0\0\347\0\1E\377\0\2\37\177\0\0\0\0m6\223\370\0\0\0\0\0\0\0\0"..., 4096, 938134204416) = 4096 02:48:26.611391 pwrite64(4, "IAB3\0\0\0\360\0\2f\255\0\2u\203\0\0\0\2\f\0034(\0\0\0\0\0\0\0\0"..., 4096, 4501233225728) = 4096 02:48:26.638442 pwrite64(4, "AB3C\0\0\1\363\0\4u~\0\4\245b\0\0\0\0\203\37\256\260\0\0\0\0\0\0\0\0"..., 4096, 1126344515584) = 4096 02:48:26.655295 pwrite64(4, "IAB3\0\0\0\365\0\1\253\6\0\0033\20\0\0\0\1\340\\\353\370\0\0\0\0\0\0\0\0"..., 4096, 4126286540800) = 4096 02:48:26.685522 pwrite64(4, "IAB3\0\0\0\367\0\0c*\0\2\212\377\0\0\0\0027\250K\340\0\0\0\0\0\0\0\0"..., 4096, 4876140003328) = 4096 02:48:26.702965 pwrite64(4, "XAGF\0\0\0\1\0\0\0\3\2\272\225\0\0\1(\377\0\3wr\0\0\0\0\0\0\0\2"..., 512, 562572558848) = 512 02:48:26.732510 pwrite64(4, "XAGI\0\0\0\1\0\0\0\3\2\272\225\0\0\2\276@\0\0\0X\0\0\0\2\0\0\0D"..., 512, 562572559360) = 512 02:48:26.732902 pwrite64(4, "XAFL\0\0\0\3\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 562572559872) = 512 02:48:26.733388 pwrite64(4, "IAB3\0\0\0\353\377\377\377\377\0\0\1\10\0\0\0\0A}\370X\0\0\0\0\0\0\0\0"..., 4096, 562572603392) = 4096 02:48:26.772804 pwrite64(4, "AB3B\0\0\1\337\0\1\271\324\0\2\10\377\0\0\0\1\366*\302\30\0\0\0\0\0\0\0\0"..., 4096, 4313581891584) = 4096 02:48:26.798956 pwrite64(4, "AB3B\0\0\1\352\0\5\320\377\0\5\343\177\0\0\0\1\340u\37\370\0\0\0\0\0\0\0\0"..., 4096, 4127098662912) = 4096 02:48:26.833606 pwrite64(4, "IAB3\0\1\0\f\377\377\377\377\377\377\377\377\0\0\0\0A}\372\300\0\0\0\0\0\0\0\0"..., 4096, 562572918784) = 4096 02:48:26.836144 pwrite64(4, "AB3C\0\0\1\357\0\20W\377\0\20\253\217\0\0\0\1\237K\213\370\0\0\0\0\0\0\0\0"..., 4096, 3567357784064) = 4096 02:48:26.856601 pwrite64(4, "AB3C\0\0\1\322\0Uo\377\0W\274\177\0\0\0\1u\333\253\370\0\0\0\0\0\0\0\0"..., 4096, 3211416563712) = 4096 02:48:26.877923 pwrite64(4, "IAB3\0\0\0\360\0\0\303G\0\1a_\0\0\0\0\25\334R\310\0\0\0\0\0\0\0\0"..., 4096, 187781451776) = 4096 02:48:26.907359 pwrite64(4, "AB3B\0\0\1\324\0\to\3\0\t\375\177\0\0\0\1]\232[\370\0\0\0\0\0\0\0\0"..., 4096, 3003066609664) = 4096 02:48:26.954465 pwrite64(4, "AB3C\0\0\1\333\0\2\376\330\0\3\7\177\0\0\0\0\230\350\247\320\0\0\0\0\0\0\0\0"..., 4096, 1313476681728) = 4096 02:48:26.974186 pwrite64(4, "AB3B\0\0\1\360\0\4\202~\0\6\34\177\0\0\0\2yF\253\370\0\0\0\0\0\0\0\0"..., 4096, 5439799947264) = 4096 02:48:26.998899 pwrite64(4, "IAB3\0\0\0\365\0\21w\377\0\21~\177\0\0\0\1H\1\277\370\0\0\0\0\0\0\0\0"..., 4096, 2817557262336) = 4096 02:48:27.050591 pwrite64(4, "AB3B\0\0\1\364\0\4\313\377\0\4\331\177\0\0\0\0\332uT\250\0\0\0\0\0\0\0\0"..., 4096, 1876542705664) = 4096 02:48:27.078944 pwrite64(4, "AB3B\0\0\1\344\0\2\37\377\0\2*\377\0\0\0\1\6\t/\370\0\0\0\0\0\0\0\0"..., 4096, 2250871140352) = 4096 02:48:27.094262 pwrite64(4, "AB3B\0\0\1\360\0\3}z\0\3\220}\0\0\0\0\256\301\223\370\0\0\0\0\0\0\0\0"..., 4096, 1501144018944) = 4096 02:48:27.124933 pwrite64(4, "AB3B\0\0\1\343\0\4<\t\377\377\377\377\0\0\0\1\312\231+\370\0\0\0\0\0\0\0\0"..., 4096, 3939329634304) = 4096 02:48:27.159474 pwrite64(4, "AB3B\0\0\1\363\0\4\330\225\0\4\332\177\0\0\0\0\332u[\370\0\0\0\0\0\0\0\0"..., 4096, 1876543664128) = 4096 02:48:27.160139 pwrite64(4, "XAGF\0\0\0\1\0\0\0\21\2\272\225\0\0\5\346\360\0UT\177\0\0\0\0\0\0\0\2"..., 512, 3187911164416) = 512 02:48:27.182075 pwrite64(4, "XAFL\0\0\0\21\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 3187911165440) = 512 02:48:27.182529 pwrite64(4, "XAGI\0\0\0\1\0\0\0\21\2\272\225\0\0\2\240\200\0\0\305\3\0\0\0\2\0\0\0\211"..., 512, 3187911164928) = 512 02:48:27.183241 pwrite64(4, "AB3C\0\0\1\356\0\35m\177\0\35t\177\0\0\0\1\237\263\373\370\0\0\0\0\0\0\0\0"..., 4096, 3570862125056) = 4096 02:48:27.204746 pwrite64(4, "AB3B\0\0\1\327\0\3O\305\377\377\377\377\0\0\0\0mB\261P\0\0\0\0\0\0\0\0"..., 4096, 938540703744) = 4096 02:48:27.219593 pwrite64(4, "AB3C\0\0\1\361\0\16\341\223\0\17Q\334\0\0\0\0\360\234p\210\0\0\0\0\0\0\0\0"..., 4096, 2066833543168) = 4096 02:48:27.257834 pwrite64(4, "AB3C\0\0\1\363\0\25\32\243\377\377\377\377\0\0\0\0\332\367\373\210\0\0\0\0\0\0\0\0"..., 4096, 1880926654464) = 4096 02:48:27.289445 pwrite64(4, "AB3B\0\0\1\324\0\t\373\177\0\t\376\177\0\0\0\1]\232k\370\0\0\0\0\0\0\0\0"..., 4096, 3003068706816) = 4096 02:48:27.315480 pwrite64(4, "AB3B\0\0\1\343\0\2*\377\0\2/\371\0\0\0\1\6\t:\10\0\0\0\0\0\0\0\0"..., 4096, 2250872459264) = 4096 02:48:27.345001 pwrite64(4, "AB3B\0\0\1\333\0\6\366\377\0#\364\377\0\0\0\2\244\371C\370\0\0\0\0\0\0\0\0"..., 4096, 5815159746560) = 4096 02:48:27.374788 pwrite64(4, "IAB3\0\0\0\367\0\2\270:\0\3\177\177\0\0\0\0\203\23j\30\0\0\0\0\0\0\0\0"..., 4096, 1125932871680) = 4096 02:48:27.407527 pwrite64(4, "AB3C\0\0\1\356\0\35h\377\0\35p\177\0\0\0\1\237\263\343\370\0\0\0\0\0\0\0\0"..., 4096, 3570858979328) = 4096 02:48:27.441503 pwrite64(4, "IAB3\0\0\0\365\0\21t\177\0\21w\377\0\0\0\1H\1\217\370\0\0\0\0\0\0\0\0"..., 4096, 2817550970880) = 4096 02:48:27.477741 pwrite64(4, "AB3C\0\0\1\352\0l[\377\377\377\377\377\0\0\0\1\343\263\207\370\0\0\0\0\0\0\0\0"..., 4096, 4154962472960) = 4096 02:48:27.504767 pwrite64(4, "AB3B\0\0\1\344\0\4tH\0\7g\334\0\0\0\1\264\310\305\340\0\0\0\0\0\0\0\0"..., 4096, 3751948304384) = 4096 02:48:27.524415 pwrite64(4, "FIB3\0\0\0\1\377\377\377\377\377\377\377\377\0\0\0\1\366%eP\0\0\0\0\0\0\0\0"..., 4096, 4313401958400) = 4096 02:48:27.581613 pwrite64(4, "AB3C\0\0\1\333\0\2\373\377\0\3\1\372\0\0\0\0\230\350\216\300\0\0\0\0\0\0\0\0"..., 4096, 1313473396736) = 4096 02:48:27.596162 pwrite64(4, "IAB3\0\0\0\367\377\377\377\377\0\0\t\261\0\0\0\0WR\2408\0\0\0\0\0\0\0\0"..., 4096, 750096773120) = 4096 02:48:27.627654 pwrite64(4, "XAGI\0\0\0\1\0\0\0\4\2\272\225\0\0\2\247@\0\0\t\202\0\0\0\2\0\0\0w"..., 512, 750096745472) = 512 02:48:27.671263 pwrite64(4, "XAFL\0\0\0\4\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 750096745984) = 512 02:48:27.671765 pwrite64(4, "XAGF\0\0\0\1\0\0\0\4\2\272\225\0\0\2\24\253\0\2z\f\0\0\0\0\0\0\0\2"..., 512, 750096744960) = 512 02:48:27.672159 pwrite64(4, "AB3C\0\0\1\356\0\3A\177\0\3\177\374\0\0\0\0+\303\323\370\0\0\0\0\0\0\0\0"..., 4096, 375938084864) = 4096 02:48:27.695937 pwrite64(4, "AB3B\0\0\1\344\0\2)\377\0\2+A\0\0\0\1\6\t7\370\0\0\0\0\0\0\0\0"..., 4096, 2250872188928) = 4096 02:48:27.696645 pwrite64(4, "IAB3\0\0\0\365\0\21v\377\0\21|\377\0\0\0\1H\1\227\370\0\0\0\0\0\0\0\0"..., 4096, 2817552019456) = 4096 02:48:27.725072 pwrite64(4, "AB3C\0\0\1\363\0\23\342b\0\24/\251\0\0\0\0\332\357^\300\0\0\0\0\0\0\0\0"..., 4096, 1880637669376) = 4096 02:48:27.747610 pwrite64(4, "AB3B\0\0\1\343\0\3oz\0\4\32\376\0\0\0\1\312\215\210\370\0\0\0\0\0\0\0\0"..., 4096, 3938939170816) = 4096 02:48:27.782755 pwrite64(4, "AB3B\0\0\1\352\377\377\377\377\0\3\362\371\0\0\0\0027\264S\370\0\0\0\0\0\0\0\0"..., 4096, 4876543717376) = 4096 02:48:27.805238 pwrite64(4, "AB3C\0\0\1\333\0\224\6\177\0\224[\377\0\0\0\2\20\222O\370\0\0\0\0\0\0\0\0"..., 4096, 4540394893312) = 4096 02:48:27.839392 pwrite64(4, "AB3C\0\0\1\364\0\0106\377\0\10Y\177\0\0\0\1\34\16\267\370\0\0\0\0\0\0\0\0"..., 4096, 2440035299328) = 4096 02:48:27.863602 pwrite64(4, "AB3B\0\0\1\353\0\5\225\377\0\5\267\177\0\0\0\0027\306\303\370\0\0\0\0\0\0\0\0"..., 4096, 4877162377216) = 4096 02:48:27.881135 pwrite64(4, "AB3B\0\0\1\344\0\2\31\177\0\2\36\377\0\0\0\1\6\10\310\360\0\0\0\0\0\0\0\0"..., 4096, 2250857635840) = 4096 02:48:27.930152 pwrite64(4, "IAB3\0\0\0\365\0\0\337R\0\0\337\211\0\0\0\1s&# \0\0\0\0\0\0\0\0"..., 4096, 3188145405952) = 4096 02:48:27.954855 pwrite64(4, "IAB3\0\0\0\365\0\0\305\6\0\0\337d\0\0\0\1s&\"\220\0\0\0\0\0\0\0\0"..., 4096, 3188145332224) = 4096 02:48:27.962603 pwrite64(4, "IAB3\0\0\0\365\0\21~\177\377\377\377\377\0\0\0\1H\1\343\370\0\0\0\0\0\0\0\0"..., 4096, 2817561980928) = 4096 02:48:27.992748 pwrite64(4, "AB3B\0\0\1\324\0\t\375\177\0\16\373\376\0\0\0\1]\232s\370\0\0\0\0\0\0\0\0"..., 4096, 3003069755392) = 4096 02:48:28.004846 pwrite64(4, "AB3B\0\0\1\363\0\2#\177\0\2t\343\0\0\0\0011\264\242`\0\0\0\0\0\0\0\0"..., 4096, 2625991131136) = 4096 02:48:28.022612 pwrite64(4, "IAB3\0\0\0\365\0\0\337d\0\0\356\205\0\0\0\1s&$H\0\0\0\0\0\0\0\0"..., 4096, 3188145557504) = 4096 02:48:28.042124 pwrite64(4, "AB3C\0\0\1\336\0\6\260\377\377\377\377\377\0\0\0\1\366P\267\370\0\0\0\0\0\0\0\0"..., 4096, 4314855632896) = 4096 02:48:28.070245 pwrite64(4, "IAB3\0\0\0\374\0\0\370h\0\1\26\265\0\0\0\0\332Ve\30\0\0\0\0\0\0\0\0"..., 4096, 1875504672768) = 4096 02:48:28.095511 pwrite64(4, "AB3B\0\0\1\353\0\5\266\177\0\5\320\270\0\0\0\0027\306\313\370\0\0\0\0\0\0\0\0"..., 4096, 4877163425792) = 4096 02:48:28.096112 pwrite64(4, "AB3C\0\0\1\333\0K\244\316\0V\357\177\0\0\0\2\247wc\370\0\0\0\0\0\0\0\0"..., 4096, 5836571668480) = 4096 02:48:28.131772 pwrite64(4, "AB3B\0\0\1\363\0\4\332\177\0\4\366\377\0\0\0\0\332u\277\370\0\0\0\0\0\0\0\0"..., 4096, 1876556771328) = 4096 02:48:28.158409 pwrite64(4, "FIB3\0\0\0\1\377\377\377\377\377\377\377\377\0\0\0\1H\1\353\370\0\0\0\0\0\0\0\0"..., 4096, 2817563029504) = 4096 02:48:28.179552 pwrite64(4, "AB3B\0\0\1\344\0\2\36\377\0\2)\377\0\0\0\1\6\10\337\370\0\0\0\0\0\0\0\0"..., 4096, 2250860654592) = 4096 02:48:28.206779 pwrite64(4, "AB3B\0\0\1\344\0\2\35\36\0\2\37\377\0\0\0\1\6\10\327\370\0\0\0\0\0\0\0\0"..., 4096, 2250859606016) = 4096 02:48:28.240610 pwrite64(4, "AB3B\0\0\1\342\377\377\377\377\0\21\247\377\0\0\0\1H\1\367\370\0\0\0\0\0\0\0\0"..., 4096, 2817564602368) = 4096 02:48:28.248303 pwrite64(4, "AB3B\0\0\1\363\0\2nL\0\2\177\16\0\0\0\0011\264\327\30\0\0\0\0\0\0\0\0"..., 4096, 2625998041088) = 4096 02:48:28.286700 pwrite64(4, "AB3C\0\0\1\353\0\7\237\177\0\t\265\377\0\0\0\0027\343}\260\0\0\0\0\0\0\0\0"..., 4096, 4878126243840) = 4096 02:48:28.312476 pwrite64(4, "IAB3\0\0\0\366\0V\221~\0V\231\376\0\0\0\0\307.u(\0\0\0\0\0\0\0\0"..., 4096, 1710955843584) = 4096 02:48:28.348321 pwrite64(4, "IAB3\0\0\0\366\0V\221z\0V\221\245\0\0\0\0\307.s\360\0\0\0\0\0\0\0\0"..., 4096, 1710955683840) = 4096 02:48:28.399590 pwrite64(4, "IAB3\0\0\0\366\0MA\177\0V\221~\0\0\0\0\307.s\320\0\0\0\0\0\0\0\0"..., 4096, 1710955667456) = 4096 02:48:28.408040 pwrite64(4, "IAB3\0\1\0\v\377\377\377\377\377\377\377\377\0\0\0\0\307.s\300\0\0\0\0\0\0\0\0"..., 4096, 1710955659264) = 4096 02:48:28.409684 pwrite64(4, "AB3C\0\0\1\323\0\17\346\177\0\0209\376\0\0\0\1]\312G\370\0\0\0\0\0\0\0\0"..., 4096, 3004674600960) = 4096 02:48:28.457844 pwrite64(4, "AB3C\0\0\1\344\377\377\377\377\0\5\25\377\0\0\0\1\312\231k\370\0\0\0\0\0\0\0\0"..., 4096, 3939338022912) = 4096 02:48:28.475544 pwrite64(4, "AB3C\0\0\1\357\0\35a\26\0\35h\377\0\0\0\1\237\263\267\370\0\0\0\0\0\0\0\0"..., 4096, 3570853212160) = 4096 02:48:28.491078 pwrite64(4, "AB3C\0\0\1\336\0\6\256\377\0\6\260\377\0\0\0\1\366P\227\370\0\0\0\0\0\0\0\0"..., 4096, 4314851438592) = 4096 02:48:28.527189 pwrite64(4, "XAGF\0\0\0\1\0\0\0\22\2\272\225\0\0\tF\177\0\24)\360\0\0\0\0\0\0\0\2"..., 512, 3375435350528) = 512 02:48:28.550734 pwrite64(4, "XAFL\0\0\0\22\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 3375435351552) = 512 02:48:28.553388 pwrite64(4, "XAGI\0\0\0\1\0\0\0\22\2\272\225\0\0\2\325\0\0\2(\377\0\0\0\2\0\0\0#"..., 512, 3375435351040) = 512 02:48:28.555312 pwrite64(4, "IAB3\0\0\0\365\0\0037\377\0\5\t\375\0\0\0\2M\212\23\370\0\0\0\0\0\0\0\0"..., 4096, 5064104603648) = 4096 02:48:28.577239 pwrite64(4, "AB3C\0\0\1\363\377\377\377\377\0\4qX\0\0\0\0\203\37\23\370\0\0\0\0\0\0\0\0"..., 4096, 1126324236288) = 4096 02:48:28.600863 pwrite64(4, "IAB3\0\0\0\365\0\21|\377\0\21\201\177\0\0\0\1H\1\313\370\0\0\0\0\0\0\0\0"..., 4096, 2817558835200) = 4096 02:48:28.619835 pwrite64(4, "FIB3\0\0\0\f\377\377\377\377\377\377\377\377\0\0\0\0027\264%\230\0\0\0\0\0\0\0\0"..., 4096, 4876537638912) = 4096 02:48:28.646667 pwrite64(4, "AB3C\0\0\1\363\0\5@\177\0\t0\377\0\0\0\0\332\207<\10\0\0\0\0\0\0\0\0"..., 4096, 1877143457792) = 4096 02:48:28.668564 pwrite64(4, "AB3C\0\0\1\357\0\35g\377\0\35m\177\0\0\0\1\237\263\277\370\0\0\0\0\0\0\0\0"..., 4096, 3570854260736) = 4096 02:48:28.669574 pwrite64(4, "AB3C\0\0\1\336\0\6\257\377\0\6\263\377\0\0\0\1\366P\237\370\0\0\0\0\0\0\0\0"..., 4096, 4314852487168) = 4096 02:48:28.724894 pwrite64(4, "AB3B\0\0\1\357\0\3\212\177\0\3\224\315\0\0\0\0\256\301\303\350\0\0\0\0\0\0\0\0"..., 4096, 1501150302208) = 4096 02:48:28.745803 pwrite64(4, "IAB3\0\0\0\355\0\0\350\377\0\1\242e\0\0\0\2y\"X\200\0\0\0\0\0\0\0\0"..., 4096, 5438581047296) = 4096 02:48:28.778525 pwrite64(4, "AB3B\0\0\1\343\0\3\37\177\0\3x\37\0\0\0\1\312\215C\320\0\0\0\0\0\0\0\0"..., 4096, 3938930106368) = 4096 02:48:28.815965 pwrite64(4, "AB3C\0\0\1\360\0I\234\377\0V\204\364\0\0\0\2{\262[\220\0\0\0\0\0\0\0\0"..., 4096, 5460593156096) = 4096 02:48:28.858053 pwrite64(4, "IAB3\0\0\0\364\377\377\377\377\0\0\373\2\0\0\0\0+\252\344@\0\0\0\0\0\0\0\0"..., 4096, 375101358080) = 4096 02:48:28.889797 pwrite64(4, "AB3C\0\0\1\366\0\22\0\377\0\22(\177\0\0\0\2\"T\353\370\0\0\0\0\0\0\0\0"..., 4096, 4692953788416) = 4096 02:48:28.914671 pwrite64(4, "IAB3\0\0\0\353\0\1\251\377\0\1\303\177\0\0\0\2\244\315\256\30\0\0\0\0\0\0\0\0"..., 4096, 5813697261568) = 4096 02:48:28.950622 pwrite64(4, "AB3C\0\0\1\353\0\33\"\213\0\33>\177\0\0\0\0028r\333\370\0\0\0\0\0\0\0\0"..., 4096, 4882936885248) = 4096 02:48:28.990564 pwrite64(4, "IAB3\0\0\0\374\0\0K\10\0\0\372\243\0\0\0\0\332VS@\0\0\0\0\0\0\0\0"..., 4096, 1875502333952) = 4096 02:48:29.019325 pwrite64(4, "AB3C\0\0\1\336\0\6\252\377\0\6\257\377\0\0\0\1\366P\217\370\0\0\0\0\0\0\0\0"..., 4096, 4314850390016) = 4096 02:48:29.043580 pwrite64(4, "AB3C\0\0\1\347\0\3\362\331\377\377\377\377\0\0\0\0\25\365\307(\0\0\0\0\0\0\0\0"..., 4096, 188635566080) = 4096 02:48:29.079983 pwrite64(4, "AB3C\0\0\1\332\0$\20\377\0@_|\0\0\0\2\245\342K\350\0\0\0\0\0\0\0\0"..., 4096, 5822978969600) = 4096 02:48:29.126205 pwrite64(4, "IAB3\0\0\0\353\0\1\210d\0\1\252\303\0\0\0\2\244\315\247\370\0\0\0\0\0\0\0\0"..., 4096, 5813696458752) = 4096 02:48:29.151941 pwrite64(4, "FIB3\0\0\0\3\377\377\377\377\377\377\377\377\0\0\0\0\256\274\17\270\0\0\0\0\0\0\0\0"..., 4096, 1500958912512) = 4096 02:48:29.177874 pwrite64(4, "AB3B\0\0\1\352\0\5\325\377\0\6W\3\0\0\0\1\340u\213\370\0\0\0\0\0\0\0\0"..., 4096, 4127112818688) = 4096 02:48:29.205021 pwrite64(4, "AB3C\0\0\1\356\0\201l\312\0\201{\22\0\0\0\0\310\205OP\0\0\0\0\0\0\0\0"..., 4096, 1722460053504) = 4096 02:48:29.234194 pwrite64(4, "AB3B\0\0\1\357\0\3\224\315\0\3\234\t\0\0\0\0\256\301\350 \0\0\0\0\0\0\0\0"..., 4096, 1501155049472) = 4096 02:48:29.242996 pwrite64(4, "AB3C\0\0\1\356\0\201g~\0\201l\352\0\0\0\0\310\205NP\0\0\0\0\0\0\0\0"..., 4096, 1722459922432) = 4096 02:48:29.254054 pwrite64(4, "AB3C\0\0\1\356\0\3\17\307\0\3 \365\0\0\0\0+\302%H\0\0\0\0\0\0\0\0"..., 4096, 375881633792) = 4096 02:48:29.302275 pwrite64(4, "AB3B\0\0\1\357\0\3\220}\0\3\225\4\0\0\0\0\256\301\346h\0\0\0\0\0\0\0\0"..., 4096, 1501154824192) = 4096 02:48:29.345828 pwrite64(4, "IAB3\0\0\0\356\0\2\304\377\377\377\377\377\0\0\0\0\256\274\7\10\0\0\0\0\0\0\0\0"..., 4096, 1500957773824) = 4096 02:48:29.367404 pwrite64(4, "IAB3\0\0\0\365\0\0\337\211\0\1`\354\0\0\0\1s&\234(\0\0\0\0\0\0\0\0"..., 4096, 3188161269760) = 4096 02:48:29.397641 pwrite64(4, "XAFL\0\0\0\27\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 4313056282112) = 512 02:48:29.415449 pwrite64(4, "XAGI\0\0\0\1\0\0\0\27\2\272\225\0\0\2\247@\0\0;\224\0\0\0\2\0\0\0;"..., 512, 4313056281600) = 512 02:48:29.415906 pwrite64(4, "XAGF\0\0\0\1\0\0\0\27\2\272\225\0\0\1\243\376\0\3\225\327\0\0\0\0\0\0\0\2"..., 512, 4313056281088) = 512 02:48:29.418218 pwrite64(4, "AB3B\0\0\1\333\0#f\377\0?C\377\0\0\0\2\rP\23\370\0\0\0\0\0\0\0\0"..., 4096, 4512402632704) = 4096 02:48:29.434475 pwrite64(4, "AB3C\0\0\1\357\0\20\253\217\0\35g\377\0\0\0\1\237\263\200\260\0\0\0\0\0\0\0\0"..., 4096, 3570845966336) = 4096 02:48:29.473858 pwrite64(4, "AB3B\0\0\1\336\377\377\377\377\0\1\271\324\0\0\0\1\366%\304\260\0\0\0\0\0\0\0\0"..., 4096, 4313414459392) = 4096 02:48:29.511258 pwrite64(4, "AB3B\0\0\1\354\0\17Pb\0\17t\377\0\0\0\2M\351;\370\0\0\0\0\0\0\0\0"..., 4096, 5067297517568) = 4096 02:48:29.546565 pwrite64(4, "AB3C\0\0\1\356\0\201Qn\0\201l\312\0\0\0\0\310\205#\360\0\0\0\0\0\0\0\0"..., 4096, 1722454368256) = 4096 02:48:29.573647 pwrite64(4, "AB3B\0\0\1\327\0\3\33\177\0\3OZ\0\0\0\0mA48\0\0\0\0\0\0\0\0"..., 4096, 938490753024) = 4096 02:48:29.608134 pwrite64(4, "AB3C\0\0\1\336\0\6\247\377\0\6\256\377\0\0\0\1\366Po\370\0\0\0\0\0\0\0\0"..., 4096, 4314846195712) = 4096 02:48:29.632868 pwrite64(4, "IAB3\0\0\0\364\0\3\n\36\0\4\265\2\0\0\0\1s9;\350\0\0\0\0\0\0\0\0"..., 4096, 3188786188288) = 4096 02:48:29.663658 pwrite64(4, "AB3B\0\0\1\344\0\2\17%\0\2\35\36\0\0\0\1\6\10\253\370\0\0\0\0\0\0\0\0"..., 4096, 2250853838848) = 4096 02:48:29.683471 pwrite64(4, "AB3C\0\0\1\357\0\20\0\177\0\20b\177\0\0\0\1\237K7\370\0\0\0\0\0\0\0\0"..., 4096, 3567346774016) = 4096 02:48:29.743545 pwrite64(4, "XAFL\0\0\0\n\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 1875241862656) = 512 02:48:29.762770 pwrite64(4, "XAGI\0\0\0\1\0\0\0\n\2\272\225\0\0\2\264\0\0\0\3\10\0\0\0\2\0\0\0\342"..., 512, 1875241862144) = 512 02:48:29.763209 pwrite64(4, "XAGF\0\0\0\1\0\0\0\n\2\272\225\0\0\4\320\177\0\5B\177\0\0\0\0\0\0\0\2"..., 512, 1875241861632) = 512 02:48:29.763820 pwrite64(4, "AB3C\0\1\0\25\377\377\377\377\377\377\377\377\0\0\0\2\217\226\343\370\0\0\0\0\0\0\0\0"..., 4096, 5631470202880) = 4096 02:48:29.804674 pwrite64(4, "AB3B\0\0\1\334\0\6\223\345\0\25\245\27\0\0\0\2\f$s\370\0\0\0\0\0\0\0\0"..., 4096, 4502348886016) = 4096 02:48:29.821322 pwrite64(4, "AB3C\0\0\1\353\0\0339\177\0\33F\177\0\0\0\0028s\3\370\0\0\0\0\0\0\0\0"..., 4096, 4882942128128) = 4096 02:48:29.867058 pwrite64(4, "AB3C\0\0\1\336\0\6\243\356\0\6\252\377\0\0\0\1\366PW\370\0\0\0\0\0\0\0\0"..., 4096, 4314843049984) = 4096 02:48:29.887913 pwrite64(4, "AB3C\0\0\1\346\0&\30\377\0.a\370\0\0\0\2\220;\313\370\0\0\0\0\0\0\0\0"..., 4096, 5637003538432) = 4096 02:48:29.910793 pwrite64(4, "IAB3\0\0\0\366\0V\232\371\0V\235\177\0\0\0\0\307.\313\370\0\0\0\0\0\0\0\0"..., 4096, 1710967222272) = 4096 02:48:29.933742 pwrite64(4, "AB3C\0\0\1\346\0\26\303\177\0#\341\177\0\0\0\2\217\243z\0\0\0\0\0\0\0\0\0"..., 4096, 5631892520960) = 4096 02:48:29.956661 pwrite64(4, "IAB3\0\1\0\v\377\377\377\377\377\377\377\377\0\0\0\0\332N\250@\0\0\0\0\0\0\0\0"..., 4096, 1875245039616) = 4096 02:48:29.983631 pwrite64(4, "AB3B\0\0\1\361\0\16\v\377\0\16\31\177\0\0\0\0\360\223\317\370\0\0\0\0\0\0\0\0"..., 4096, 2066544062464) = 4096 02:48:30.005294 pwrite64(4, "IAB3\0\0\0\374\377\377\377\377\0\0K\10\0\0\0\0\332N\247\370\0\0\0\0\0\0\0\0"..., 4096, 1875245002752) = 4096 02:48:30.017390 pwrite64(4, "AB3C\0\0\1\363\0\5UN\0\5\271\177\0\0\0\2coa\370\0\0\0\0\0\0\0\0"..., 4096, 5252187418624) = 4096 02:48:30.035961 pwrite64(4, "AB3C\0\0\1\363\0\24\31\330\0\24\313'\0\0\0\0\332\360\rH\0\0\0\0\0\0\0\0"..., 4096, 1880660545536) = 4096 02:48:30.055625 pwrite64(4, "AB3B\0\0\1\324\0\17[\377\0\17\247\177\0\0\0\1]\306\247\370\0\0\0\0\0\0\0\0"..., 4096, 3004552966144) = 4096 02:48:30.072145 pwrite64(4, "AB3C\0\0\1\356\0\3\32\251\0\3(N\0\0\0\0+\302W\250\0\0\0\0\0\0\0\0"..., 4096, 375888236544) = 4096 02:48:30.094404 pwrite64(4, "AB3B\0\0\1\334\0\4\7\315\0\6\226\177\0\0\0\2\f$_(\0\0\0\0\0\0\0\0"..., 4096, 4502346158080) = 4096 02:48:30.117055 pwrite64(4, "XAGF\0\0\0\1\0\0\0\37\2\272\225\0\0\2\35\177\0$2\225\0\0\0\0\0\0\0\2"..., 512, 5813249769984) = 512 02:48:30.146929 pwrite64(4, "XAFL\0\0\0\37\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 5813249771008) = 512 02:48:30.147355 pwrite64(4, "XAGI\0\0\0\1\0\0\0\37\2\272\225\0\0\2\372\300\0\0\331\260\0\0\0\2\0\0\0\235"..., 512, 5813249770496) = 512 02:48:30.148551 pwrite64(4, "AB3B\0\0\1\321\0I\337\177\0S\365\177\0\0\0\1u\242\377\370\0\0\0\0\0\0\0\0"..., 4096, 3209514971136) = 4096 02:48:30.189790 pwrite64(4, "IAB3\0\0\0\367\377\377\377\377\0\0a\373\0\0\0\1\366\33$@\0\0\0\0\0\0\0\0"..., 4096, 4313057886208) = 4096 02:48:30.218680 pwrite64(4, "IAB3\0\0\0\365\0V\234\177\0~\220\357\0\0\0\0\307.\323\370\0\0\0\0\0\0\0\0"..., 4096, 1710968270848) = 4096 02:48:30.239448 pwrite64(4, "AB3B\0\0\1\347\0\3S\377\0\3[\276\0\0\0\0\25\357[\370\0\0\0\0\0\0\0\0"..., 4096, 188420190208) = 4096 02:48:30.273644 pwrite64(4, "IAB3\0\0\0\353\0\0&\33\0\0\202\277\0\0\0\2cFs\370\0\0\0\0\0\0\0\0"..., 4096, 5250814046208) = 4096 02:48:30.295867 pwrite64(4, "FIB3\0\0\0\1\377\377\377\377\377\377\377\377\0\0\0\0m9\353\370\0\0\0\0\0\0\0\0"..., 4096, 938246402048) = 4096 02:48:30.347258 pwrite64(4, "AB3C\0\0\1\364\0\0103\177\0\0106\377\0\0\0\1\34\0163\370\0\0\0\0\0\0\0\0"..., 4096, 2440017997824) = 4096 02:48:30.373048 pwrite64(4, "IAB3\0\1\0\v\377\377\377\377\377\377\377\377\0\0\0\2cFpP\0\0\0\0\0\0\0\0"..., 4096, 5250813566976) = 4096 02:48:30.391725 pwrite64(4, "AB3C\0\0\1\336\0\6\236\377\0\6\247\377\0\0\0\1\366P7p\0\0\0\0\0\0\0\0"..., 4096, 4314838786048) = 4096 02:48:30.419235 pwrite64(4, "IAB3\0\0\0\353\0\0\202\277\0\1\223\177\0\0\0\2cFw@\0\0\0\0\0\0\0\0"..., 4096, 5250814476288) = 4096 02:48:30.441880 pwrite64(4, "XAGF\0\0\0\1\0\0\0\6\2\272\225\0\0\3\300\177\0\4p\177\0\0\0\0\0\0\0\2"..., 512, 1125145117184) = 512 02:48:30.463325 pwrite64(4, "XAFL\0\0\0\6\24\274'\v\346XO\205\261\333g6B\253\235g\377\377\377\377\377\377\377\377"..., 512, 1125145118208) = 512 02:48:30.463826 pwrite64(4, "XAGI\0\0\0\1\0\0\0\6\2\272\225\0\0\2\250\300\0\0y\252\0\0\0\2\0\0\0H"..., 512, 1125145117696) = 512 02:48:30.464698 pwrite64(4, "AB3C\0\0\1\364\0\0105\177\0\10E\377\0\0\0\1\34\16?\370\0\0\0\0\0\0\0\0"..., 4096, 2440019570688) = 4096 02:48:30.495647 pwrite64(4, "AB3C\0\0\1\333\0V\360\177\0V\374\377\0\0\0\2\247w\343\370\0\0\0\0\0\0\0\0"..., 4096, 5836588445696) = 4096 02:48:30.515445 pwrite64(4, "IAB3\0\0\0\353\0\0\202\177\0\0\202\350\0\0\0\2cFu\370\0\0\0\0\0\0\0\0"..., 4096, 5250814308352) = 4096 02:48:30.561253 pwrite64(4, "AB3C\0\0\1\352\0fe\377\0j8\177\0\0\0\1\343\227\353\370\0\0\0\0\0\0\0\0"..., 4096, 4154036056064) = 4096 02:48:30.579753 pwrite64(4, "IAB3\0\0\0\365\0\0 \10\0\0\337R\0\0\0\1s%P0\0\0\0\0\0\0\0\0"..., 4096, 3188117757952) = 4096 02:48:30.637984 pwrite64(4, "IAB3\0\1\0\v\377\377\377\377\377\377\377\377\0\0\0\1s%P\30\0\0\0\0\0\0\0\0"..., 4096, 3188117745664) = 4096 02:48:30.651897 pwrite64(4, "AB3C\0\1\0\16\377\377\377\377\377\377\377\377\0\0\0\0\203\37s\370\0\0\0\0\0\0\0\0"..., 4096, 1126336819200) = 4096 02:48:30.677217 pwrite64(4, "AB3B\0\0\1\347\0\3\33Y\0\3V\177\0\0\0\0\25\357G\370\0\0\0\0\0\0\0\0"..., 4096, 188417568768) = 4096 02:48:30.696649 write(2, "Maximum metadata LSN (64:2230592"..., 57) = 57 02:48:30.696789 write(2, "Format log to cycle 67.\n", 24) = 24 02:48:30.697114 brk(0x28b6000) = 0x28b6000 02:48:30.697509 lseek(4, 3000387010560, SEEK_SET) = 3000387010560 02:48:30.697588 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.727519 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.732168 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.738012 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.742543 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.747200 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.751209 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.755154 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.784690 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.789768 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.794473 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.798816 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.803157 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.807593 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.880461 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.885390 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.890360 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.894682 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.899591 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.903497 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.924742 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.930051 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.944158 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.948772 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.953215 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.957225 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.970793 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.976280 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.990876 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.995339 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:30.999710 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.004135 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.025447 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.030305 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.044435 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.049226 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.053459 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.057825 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.099897 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.111454 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.116298 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.120609 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.125311 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.129667 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.165220 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.170473 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.179931 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.184516 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.188989 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.192875 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.198151 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.203139 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.217041 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.221170 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.225514 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.229732 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.240014 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.253547 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.258277 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.262545 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.266792 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.270644 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.320114 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.325055 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.330038 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.334441 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.339447 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.343420 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.374263 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.380264 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.390551 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.395136 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.399581 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.403397 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.425732 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.430646 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.435548 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.439713 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.445042 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.449254 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.470099 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.475117 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.479964 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.483816 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.488449 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.491969 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.528194 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.533203 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.537913 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.542195 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.547021 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.551411 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.584298 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.589501 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.602014 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.606551 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.611021 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.615091 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.634569 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.639440 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.644650 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.649111 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.654229 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.658691 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.679401 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.691582 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.696265 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.700686 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.705813 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.710133 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.739349 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.744451 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.750596 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.754887 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.759411 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.763281 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.793338 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.798454 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.813320 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.818029 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.822499 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.826423 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.838784 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.843703 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.859836 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.864436 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.868789 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.874056 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.889871 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.894853 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.903792 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.908393 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.913073 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.917913 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.969552 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.974580 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.979580 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.983607 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.988245 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:31.991907 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.023657 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.036602 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.048294 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.052951 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.057228 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.061174 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.075057 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.080328 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.093682 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.097984 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.103910 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.107878 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.118744 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.132271 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.142544 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.146996 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.151216 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.155219 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.208954 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.218673 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.223123 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.227392 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.232131 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.236345 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.274287 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.279458 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.295197 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.299677 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.304163 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.308231 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.318294 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.323454 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.328638 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.333535 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.353998 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.357999 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.383448 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.388170 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.392528 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.396579 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.400305 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.403884 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.437332 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.442475 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.449346 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.453739 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.458087 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.462185 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.493322 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.506461 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.511340 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.516092 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.520660 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.524404 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.543799 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.548819 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.564153 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.568457 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.573625 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.578230 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.597395 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.606169 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.610829 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.614975 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.619481 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.623379 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.648297 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.653069 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.657896 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.662336 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.666984 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.671040 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.703340 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.708473 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.717317 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.721926 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.726456 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.730917 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.736080 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.741029 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.756594 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.761590 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.766070 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.770859 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.796582 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.801289 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.807943 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.812288 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.816305 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.820087 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.857512 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.862599 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.867179 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.871686 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.876330 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.880288 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.912501 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.925467 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.936017 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.940492 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.944923 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.948493 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.961696 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.966465 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.987166 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.992273 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:32.998290 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.002297 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.022440 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.031590 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.036203 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.040618 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.045202 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.049186 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.078558 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.083450 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.088177 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.092608 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.097150 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.101016 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.132783 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.137952 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.147194 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.151615 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.156361 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.160186 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.165233 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.170501 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.181658 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.185958 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.206632 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.210173 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.226546 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.237279 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.242117 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.246451 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.250599 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.254305 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.287595 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.292472 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.297337 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.301350 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.305740 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.309831 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.342753 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.354867 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.366035 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.370611 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.375102 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.379075 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.393111 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.398959 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.420110 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.424659 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.429070 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.433201 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.471907 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.476747 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.484170 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.488468 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.492598 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.496601 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.528009 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.542311 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.546812 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.551267 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.555962 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.560179 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.592181 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.597280 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.611116 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.615905 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.620269 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.624232 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.635103 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.640327 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.647039 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.651740 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.676358 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.681039 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.693347 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.698071 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.702698 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.707131 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.711784 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.715858 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.747161 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.756382 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.761007 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.765393 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.769894 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.773850 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.812293 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.825050 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.830178 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.834714 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.839348 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.843350 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.863111 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.868103 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.891544 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.896186 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.900533 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.905452 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.920657 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.925578 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.938143 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.942838 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.947693 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.951595 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.986757 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:33.991825 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.002857 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.007053 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.011825 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.016000 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.051603 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.056558 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.066348 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.070593 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.083741 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.087545 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.103253 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.108088 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.113246 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.117464 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.122490 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.125988 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.146729 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.156325 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.170680 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.175239 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.179810 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.183561 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.237803 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.242834 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.247448 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.251284 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.256519 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.260018 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.291983 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.305100 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.309987 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.314713 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.319179 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.322930 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.343269 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.348239 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.361337 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.365501 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.372536 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.376793 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.387524 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.392321 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.398107 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.402195 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.406514 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.410546 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.457128 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.468200 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.472306 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.476435 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.480753 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.484563 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.522440 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.536050 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.540924 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.545497 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.550136 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.553512 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.564430 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.569062 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.581518 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.586100 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.591119 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.594920 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.610928 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.615877 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.620424 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.624884 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.629038 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.632715 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.676620 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.688852 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.693243 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.697723 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.702575 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.707165 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.741601 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.754720 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.765733 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.770352 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.774747 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.778949 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.789147 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.795469 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.812449 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.816876 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.821899 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.825864 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.839787 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.844967 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.849601 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.853412 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.857508 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.860991 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.905899 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.917260 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.922812 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.927513 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.936867 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.940813 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.961829 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.966987 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.977003 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.981595 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.986155 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.990189 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:34.995345 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.000236 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.014345 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.019489 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.024347 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.028355 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.037192 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.049998 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.054779 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.058954 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.063156 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.067004 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.117021 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.122070 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.131844 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.136224 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.141008 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.145349 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.180928 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.194068 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.204002 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.207996 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.212863 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.216883 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.230330 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.235595 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.252208 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.256581 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.261785 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.266142 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.275986 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.280936 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.292234 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.296553 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.300680 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.304539 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.336976 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.353031 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.357679 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.361999 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.366864 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.370858 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.401216 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.411924 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.417169 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.421604 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.426073 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.429887 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.435313 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.440546 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.447480 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.452146 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.456636 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.461626 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.475042 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.480073 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.484450 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.488560 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.492158 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.496657 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.525740 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.530715 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.535647 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.540015 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.544736 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.549059 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.580859 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.586084 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.595726 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.600498 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.604695 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.608796 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.622597 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.627836 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.633562 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.638477 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.643200 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.647297 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.667597 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.672486 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.677332 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.682274 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.686126 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.689983 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.715656 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.720555 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.725478 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.729999 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.734866 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.739157 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.769811 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.775087 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.797789 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.802184 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.811106 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.815571 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.831716 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.836539 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.841166 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.845814 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.850736 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.854555 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.874998 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.880030 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.893789 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.898450 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.903011 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.906824 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.954933 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.959769 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.971214 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.975581 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.980109 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:35.983998 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.020170 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.025066 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.034636 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.039284 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.044525 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.048836 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.054024 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.058944 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.074312 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.079451 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.084207 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.089458 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.103189 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.115163 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.128986 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.133509 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.137754 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.142134 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.195462 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.200480 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.205425 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.210129 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.215353 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.219494 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.257703 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.272791 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.277806 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.282134 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.286167 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.290051 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.300168 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.305007 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.327454 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.331806 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.336866 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.340654 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.347462 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.381848 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.386507 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.390860 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.395509 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.399435 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.445989 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.459561 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.464140 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.468557 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.483940 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.489197 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.520276 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.526504 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.531901 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.536460 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.540889 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.545457 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.550781 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.556057 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.579449 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.583893 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.588871 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.592754 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.599739 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.604677 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.610403 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.615117 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.619601 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.623488 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.675119 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.718452 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.723156 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.728314 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.750663 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.754730 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.780782 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.792973 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.797755 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.802301 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.806686 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.810844 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.830561 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.835320 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.850683 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.854944 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.860035 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.864012 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.895016 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.900053 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.904716 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.909141 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.914573 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.918408 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.954336 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.959684 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.964284 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.970162 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.984017 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:36.988105 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.020188 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.025537 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.038190 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.042913 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.047566 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.051486 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.073496 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.084208 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.089665 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.094156 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.099721 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.103780 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.130388 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.140276 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.145242 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.149681 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.153729 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.157585 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.205470 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.228882 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.233674 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.238675 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.255716 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.259773 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.290809 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.296007 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.308348 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.313098 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.317331 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.321295 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.348180 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.353193 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.358789 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.363218 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.368349 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.372299 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.406648 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.451661 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.462219 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.466267 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.470196 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.474086 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.506464 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.511588 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.516454 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.521292 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.534278 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.537797 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.570687 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.583836 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.593893 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.598501 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.602651 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.606555 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.618437 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.623704 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.633051 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.637228 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.643100 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.647296 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.668604 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.675661 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.680021 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.684607 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.688730 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.692556 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.747602 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.752773 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.757537 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.762568 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.776890 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.781212 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.811029 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.816219 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.830810 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.835315 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.839548 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.843785 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.857476 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.862701 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.878920 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.883384 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.888202 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.892185 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.911049 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.916189 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.929458 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.933658 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.938064 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.941989 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.986216 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:37.993266 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.006940 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.011615 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.016657 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.020564 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.051452 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.056594 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.067483 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.071880 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.076011 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.080490 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.085937 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.094847 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.119742 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.124081 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.128311 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.132223 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.141470 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.146663 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.151354 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.155547 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.159749 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.163202 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.216476 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.239347 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.244264 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.249314 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.265000 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.269471 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.300922 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.314348 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.328676 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.333224 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.337541 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.341553 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.352576 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.357606 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.371702 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.376016 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.381560 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.385591 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.403060 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.408080 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.413392 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.418077 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.422476 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.426790 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.476085 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.482464 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.487022 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.491346 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.496025 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.499973 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.531189 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.554732 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.565280 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.570056 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.583702 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.588207 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.602192 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.607163 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.620160 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.660900 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.665058 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.669124 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.686734 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.713836 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.718467 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.723099 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.727354 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.731329 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.777073 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.800103 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.804853 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.809974 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.825252 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.829464 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.861467 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.866726 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.876088 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.881209 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.885588 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.889681 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.895106 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.899935 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.920782 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.924942 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.929400 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.933447 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.944186 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.955826 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.968269 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.972546 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.977049 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:38.981312 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.027609 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.050306 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.055090 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.059247 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.075560 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.079672 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.111967 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.125143 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.129790 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.134187 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.138455 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.142334 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.163208 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.168166 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.180997 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.185181 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.189334 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.193141 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.211174 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.216030 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.220693 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.225011 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.229126 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.232808 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.286961 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.301388 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.305775 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.309924 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.328292 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.332158 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.362296 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.367239 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.374656 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.379187 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.383704 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.387643 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.392711 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.397558 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.420553 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.424640 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.428697 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.432488 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.444049 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.448789 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.452951 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.456954 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.460906 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.464565 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.517248 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.544926 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.549482 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.553708 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.558337 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.562096 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.591495 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.615020 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.619751 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.624285 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.628319 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.632572 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.644600 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.649521 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.670860 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.675055 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.680297 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.684076 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.695784 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.700411 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.704963 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.709498 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.713911 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.717664 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.766729 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.790499 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.795060 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.799158 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.815671 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.819544 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.852058 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.858625 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.870605 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.875186 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.879872 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.883927 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.894514 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.899640 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.943039 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.947801 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.959285 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.963266 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:39.987791 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.014688 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.019313 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.024858 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.029568 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.033438 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.087996 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.092911 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.097540 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.102410 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.117903 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.121868 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.152183 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.157147 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.165132 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.169592 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.174077 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.178045 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.183479 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.188310 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.231491 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.235689 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.240046 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.244190 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.252406 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.257119 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.264476 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.268129 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.271975 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.275719 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.328334 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.351254 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.355632 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.359560 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.376266 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.380277 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.412674 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.420911 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.425886 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.430266 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.434808 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.438509 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.443599 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.455691 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.481846 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.485959 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.490756 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.494624 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.503189 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.514740 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.519005 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.522811 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.526617 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.529863 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.577676 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.600564 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.604917 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.609167 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.627053 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.630898 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.663183 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.677029 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.681947 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.686325 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.690638 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.694594 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.718641 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.723536 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.728550 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.733241 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.737570 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.744902 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.758286 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.767732 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.772124 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.776197 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.780476 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.784147 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.838283 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.881566 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.886149 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.890930 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.905665 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.909660 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.942896 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.947973 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.956257 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.960287 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.964636 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.968440 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.973285 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:40.978088 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.002235 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.006307 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.010781 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.015326 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.024732 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.037496 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.045541 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.049951 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.054243 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.057838 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.108142 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.131341 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.135773 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.140772 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.171455 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.175417 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.213669 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.224663 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.231979 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.236450 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.241091 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.245117 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.266557 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.271361 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.284345 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.288578 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.293737 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.297521 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.325781 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.330575 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.335073 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.339329 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.344765 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.349061 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.378719 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.383453 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.388039 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.393125 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.406557 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.410880 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.442850 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.447817 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.461511 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.465903 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.470305 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.474482 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.485918 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.490819 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.495763 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.501250 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.513164 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.517181 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.542841 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.547547 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.551703 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.555694 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.559445 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.562835 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.608977 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.631949 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.636435 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.641119 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.657471 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.661146 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.693430 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.706514 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.711356 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.715468 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.719375 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.723165 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.745014 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.750064 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.765700 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.769857 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.774394 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.778594 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.803601 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.810493 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.815997 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.820008 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.823884 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.827325 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.878795 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.883974 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.888615 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.893825 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.909926 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.914244 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.943992 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.949108 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.958080 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.962561 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.966804 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.970779 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.976167 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:41.981327 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.002322 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.006503 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.011390 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.016308 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.048904 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.055938 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.060649 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.064955 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.069309 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.073276 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.127656 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.132872 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.137465 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.142385 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.156480 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.160449 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.193454 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.208956 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.217746 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.221829 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.226085 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.230140 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.242554 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.247398 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.263456 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.267953 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.272645 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.276762 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.296502 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.309653 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.314239 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.318799 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.322618 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.326785 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.360647 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.365451 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.369889 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.374741 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.390636 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.394662 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.423640 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.428664 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.437744 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.441980 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.446458 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.450566 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.455689 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.460668 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.482047 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.486312 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.490570 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.494516 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.503280 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.507984 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.512447 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.516319 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.520791 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.524730 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.578677 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.601823 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.606552 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.611604 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.627999 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.632155 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.663216 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.670050 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.675585 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.679983 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.684987 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.688961 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.694050 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.698951 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.722292 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.726574 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.731688 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.735635 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.758453 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.763432 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.767817 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.772314 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.777246 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.781546 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.843694 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.848877 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.853519 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.858912 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.872096 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.876162 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.913602 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.918570 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.928915 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.933349 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.937553 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.941550 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.978290 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:42.984360 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.023257 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.027506 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.032262 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.036235 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.055203 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.069571 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.074542 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.079192 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.084040 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.087603 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.139247 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.144454 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.149147 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.153987 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.167472 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.171786 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.204561 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.213681 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.222822 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.227423 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.231863 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.235757 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.259967 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.268827 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.285613 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.290201 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.294592 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.298164 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.309376 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.314497 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.319183 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.323720 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.327889 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.331784 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.379651 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.392598 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.397360 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.401784 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.406452 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.410546 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.443845 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.467279 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.472250 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.476640 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.481177 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.485150 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.493696 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.498481 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.523269 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.528076 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.532957 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.536818 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.548034 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.552955 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.557600 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.561665 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.567071 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.570998 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.618990 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.642503 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.647259 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.651687 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.668539 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.672220 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.704479 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.715056 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.719943 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.724445 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.729123 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.733359 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.738687 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.743811 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.762793 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.767684 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.772471 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.776561 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.784047 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.789047 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.794008 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.798314 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.802580 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.806466 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.859465 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.882671 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.887295 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.892273 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.907698 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.911839 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.943907 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.949041 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.957099 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.961420 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.966056 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.969923 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.975120 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:43.980151 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.023237 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.037030 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.042283 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.046578 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.069456 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.074617 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.079153 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.083009 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.087696 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.091770 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.140052 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.145121 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.149877 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.154091 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.158899 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.162907 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.194471 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.206460 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.217616 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.222557 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.227082 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.231059 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.243686 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.248455 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.264462 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.290478 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.294500 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.298459 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.312921 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.346698 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.361475 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.365727 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.369767 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.373443 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.419873 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.443027 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.447869 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.452748 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.466469 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.470445 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.505396 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.510555 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.521100 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.525574 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.530018 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.534251 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.539667 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.545021 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.593768 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.598553 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.603196 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.607190 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.625595 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.635006 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.639815 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.644460 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.649063 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.652592 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.700791 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.705487 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.710414 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.715639 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.751935 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.756062 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.785147 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.800088 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.805081 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.809697 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.814173 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.818317 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.830941 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.836396 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.853890 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.858561 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.863154 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.867320 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.891386 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.896403 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.901011 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.905272 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.910239 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.914354 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.951901 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.956984 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.961741 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.966750 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.971437 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:44.975653 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.005423 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.010749 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.018477 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.022725 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.027114 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.031198 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.036481 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.041358 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.063678 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.067939 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.072106 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.076181 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.085991 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.093458 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.098089 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.102450 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.106832 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.110899 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.160323 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.183390 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.188085 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.193322 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.208557 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.212755 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.244707 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.251132 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.262453 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.266781 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.271114 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.275193 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.296492 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.301456 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.318129 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.341941 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.346785 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.350959 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.374769 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.379887 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.384662 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.388942 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.393122 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.397061 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.451073 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.456010 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.460843 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.465869 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.481952 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.486062 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.515400 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.520554 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.532612 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.537171 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.541690 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.545939 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.565078 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.570189 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.587301 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.591890 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.596713 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.600658 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.612668 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.637444 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.651291 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.655674 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.659651 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.663197 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.710611 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.715455 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.720088 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.725079 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.741040 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.745464 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.775992 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.783565 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.793595 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.798271 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.802874 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.806769 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.826481 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.831495 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.848724 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.875092 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.879465 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.883197 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.899455 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.917248 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.921870 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.925629 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.929914 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.933974 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:45.991507 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.014385 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.019229 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.024203 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.040846 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.045285 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.076073 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.081313 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.096968 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.101573 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.105925 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.110219 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.122815 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.127608 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.133194 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.137891 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.154996 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.159460 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.179271 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.184448 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.189276 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.193599 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.197991 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.202058 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.243639 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.248892 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.253460 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.257835 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.271036 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.275347 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.306151 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.316220 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.325022 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.329570 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.333838 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.337832 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.347474 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.352221 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.363191 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.367561 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.372038 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.375945 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.383121 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.418143 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.436860 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.441031 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.445674 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.449427 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.501456 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.534585 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.538869 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.543497 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.560588 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.563943 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.596006 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.630317 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.634817 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.639095 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.643622 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.647802 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.652281 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.665754 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.670215 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.674996 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.679159 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.682939 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.702155 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.706847 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.711530 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.715936 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.720094 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.723704 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.772297 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.777252 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.781751 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.786538 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.823445 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.827331 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.856676 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.868126 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.872959 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.877482 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.881963 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.885742 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.891492 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.896473 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.925871 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.929940 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.934806 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.938633 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.947312 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.952000 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.956660 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.960945 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.965107 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:46.968747 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.021699 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.044893 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.049498 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.053063 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.070929 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.074846 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.107084 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.112330 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.126712 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.131182 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.135447 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.139301 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.152523 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.157427 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.161772 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.166092 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.170235 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.174586 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.191742 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.196655 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.201270 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.205379 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.209923 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.214145 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.262123 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.266975 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.280820 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.285773 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.300036 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.303888 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.336342 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.341444 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.354523 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.359079 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.363228 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.367321 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.389427 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.398578 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.409545 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.414800 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.419383 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.423128 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.446017 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.450782 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.464872 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.469313 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.473259 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.476642 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.521768 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.532645 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.537483 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.541861 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.563515 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.567325 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.596994 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.611221 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.623256 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.627994 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.632265 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.636197 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.648922 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = 262144 02:48:47.653738 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144) = -1 EIO (Input/output error) 02:48:47.684683 open("/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 02:48:47.684799 open("/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 02:48:47.684879 open("/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 02:48:47.684952 open("/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 02:48:47.685058 write(2, "xfs_repair: libxfs_device_zero w"..., 64) = 64 02:48:47.685194 exit_group(1) = ? 02:48:47.929267 +++ exited with 1 +++ --------------040608040302020006050206-- From shyam@zadarastorage.com Tue Apr 12 01:57:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 285DE7CB1 for ; Tue, 12 Apr 2016 01:57:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E95C28F8033 for ; Mon, 11 Apr 2016 23:57:34 -0700 (PDT) X-ASG-Debug-ID: 1460444251-04cbb02e1ddb6c0001-NocioJ Received: from mail-wm0-f48.google.com (mail-wm0-f48.google.com [74.125.82.48]) by cuda.sgi.com with ESMTP id RrqxdxAdgBALaHbH (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 11 Apr 2016 23:57:32 -0700 (PDT) X-Barracuda-Envelope-From: shyam@zadarastorage.com X-Barracuda-Apparent-Source-IP: 74.125.82.48 Received: by mail-wm0-f48.google.com with SMTP id v188so113995939wme.1 for ; Mon, 11 Apr 2016 23:57:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=from:mime-version:thread-index:date:message-id:subject:to; bh=30IyIS7TPkMcRVrlCe8OTZjJUnr0ytOhLPiz1Qe/qvE=; b=VPYCYTFkFZ1ipECPD3cOwG/aKATTkRa0Ak39D7qMUPiVwsi7Ks3TA3Skb5jBi4KFTx TF/iCELnboe67ELeSyrCCTzEZKIldlJxP8vXWcG3W7cibGCgdM0CUhL88v+kaA9m3/Mo ZCyTR80I7Gr6be+xQ/ArS/dd9BYPy6SE062GQw0VCJqpPPqdSBkTvTr9UZuLiVYmi5qT zTrqlxq9Q2J8aVWnz+mADPaOzICAnEdPneFOACkLPXC3x/GwfwQ/+6dz/7msdpXvBNkB WElLsA6qGPm6hs3mjSfJPnJnZ0RpKWbsUgsc3sJEtamKnxWVp9Ezog1zX5/UbQAU6dHX 2kVg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:mime-version:thread-index:date:message-id :subject:to; bh=30IyIS7TPkMcRVrlCe8OTZjJUnr0ytOhLPiz1Qe/qvE=; b=acvJPj/MoIgTRg22qoLSZIh0y02I6K6rSBrSH5ch7pQdTjF/MGrkFvBmuegTJ1n+Iy vay2P0kVu4NiemO/87ehF18uz8Bf12ORonV+sGXXc2sLw8fqOFUo1loSBgfrTunfJBYN gslXiJh8LDSleEAE+CIiIv704U8xslKMQakMCbnezm/i2YcHMpAxLVjNNX9ik3JCPHmo xG649KB7YD+ftxFfuArTdWVI9PrYg+2f9ojN5eRvfmLjkqVRYftpGsSs7EA12RxrRAdn sgPzX/1iSl09zcVjTWmrPHmWsKtXhbfN/jUHNUiyjnkHB26iWxxOrPFWMIuJPG8bzfsT jo7g== X-Gm-Message-State: AOPr4FV7uNWKEBZSVAMNqjpGG0T2Ao655WdYDqRy/pC6mjuHtjnqVP+qrT00T5O0qNAkjL6TFwSdYGSlJ2wPMQ== X-Received: by 10.194.178.233 with SMTP id db9mr1650279wjc.11.1460444250988; Mon, 11 Apr 2016 23:57:30 -0700 (PDT) From: Shyam Kaushik MIME-Version: 1.0 X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AdGUiJTdu19S3LQ9Rpu4ACmQUIoVwA== Date: Tue, 12 Apr 2016 12:27:30 +0530 Message-ID: <23e35813cb097c7b15686852500cbf97@mail.gmail.com> Subject: [PATCH] xfs: Abort intent log item in xfs_iflush() upon error to get buf To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: Abort intent log item in xfs_iflush() upon error to get buf Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wm0-f48.google.com[74.125.82.48] X-Barracuda-Start-Time: 1460444251 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28659 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Looking at xfs_iflush(). If an IO fails, it is supposed to unlock the inode by calling xfs_iflush_abort(), which will also remove it from the AIL. This can also happen on reclaim of a dirty inode, and if so we'll still reclaim the inode because reclaim assumes xfs_iflush() cleans up properly. Which, apparently, it doesn't. Fix xfs_iflush() buf get failure to remove intent log item. Discovered-by: Dave Chinner diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 96f606d..85414a6 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -3374,8 +3374,9 @@ xfs_iflush( error = xfs_imap_to_bp(mp, NULL, &ip->i_imap, &dip, &bp, XBF_TRYLOCK, 0); if (error || !bp) { - xfs_ifunlock(ip); - return error; + if (!bp) + error = -EIO; + goto abort_out; } /* -- From shyam@zadarastorage.com Tue Apr 12 01:59:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1D6FE7CB1 for ; Tue, 12 Apr 2016 01:59:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C44AF304039 for ; Mon, 11 Apr 2016 23:59:55 -0700 (PDT) X-ASG-Debug-ID: 1460444388-04bdf011043fc320001-NocioJ Received: from mail-wm0-f46.google.com (mail-wm0-f46.google.com [74.125.82.46]) by cuda.sgi.com with ESMTP id 4Yvevth7DPn34mxt (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 11 Apr 2016 23:59:49 -0700 (PDT) X-Barracuda-Envelope-From: shyam@zadarastorage.com X-Barracuda-Apparent-Source-IP: 74.125.82.46 Received: by mail-wm0-f46.google.com with SMTP id u206so14550884wme.1 for ; Mon, 11 Apr 2016 23:59:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=from:references:in-reply-to:mime-version:thread-index:date :message-id:subject:to:cc; bh=5jnQoVQS15Fu+PoCKhyrffAFEwgMxzJc6r1m0kQugpI=; b=1zglbPU/OeQ5rT7gbuHwdzqJ5FMWqNOqEDMDKLplZlmnHtGIkneQOskQkjc3Er53eh gB2e5aQAh6G/gWlZ013R1VAGWTlIuoh/mRWZNV6DWz40PhjWSuFrFtv0DXdnuwerKLbv XFSG7TE5K3Fh3DQanMKu4taba6S11I4VVFpMtVAVX18JEyl0RQeXj1bevm9CISGhvtTq VHaapjDQF9uXfHdkR6z5mhKJ/77QGf07Uq877YDG4qp0rrQx0b6Aue2GjTZzRPOD19rc 73j5FYP11IwgVMq32J4l6E1KbFq8OXcPvihB8h5iWYqePcKdmkUwIW3rNCPc2FRROT7J C+LA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:references:in-reply-to:mime-version :thread-index:date:message-id:subject:to:cc; bh=5jnQoVQS15Fu+PoCKhyrffAFEwgMxzJc6r1m0kQugpI=; b=iNjxzv1RgntK2mOQl2JMyrgPfkaz0yV3gDhf2kl00M99ycWNbf/tWLyhzWaPnpjsvZ bDRXgrgKOZ0lLYNGGr2SG6FoJM6P2NmURwuePikt1l1lldocOKm6zr1bsHfoLVFHXwhG k9t/F5w6l2Z10ZdxK/Xhe3vIgosJ3iGlvx8vhWqAB+t1PeFvEIUJGRTmZnZ4gcUJnUwK tyLPSPEP7dOy7n76OHh4xFuSAEZySMIsd2D/8NFeLNGrL3pVGKys4YgJMBfjYpc6XVB9 syHE0+DuS6EtID27vKGdkAB3aDB7ZXyS+Xuiaf91cNdVQf4/uMqe/IUG8PyBaRxu+E2A +XzA== X-Gm-Message-State: AOPr4FWlqAWUIFraA883h+TSTrmj/WFirLOBM06kmi4oKXq/hYPjQqDlKZRCNaqRLm8ilO9DZHn5ZipaNlrS9g== X-Received: by 10.28.125.2 with SMTP id y2mr2196850wmc.90.1460444388014; Mon, 11 Apr 2016 23:59:48 -0700 (PDT) From: Shyam Kaushik References: <20160322121922.GA53693@bfoster.bfoster> <232dd85fde11d4ef1625f070eabfd167@mail.gmail.com> <20160408224648.GD567@dastard> <20160411012127.GF567@dastard> In-Reply-To: <20160411012127.GF567@dastard> MIME-Version: 1.0 X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AdGTkH/Z4umH15ffTqq0wVMyHRNp8AA+Bd6g Date: Tue, 12 Apr 2016 12:29:48 +0530 Message-ID: <0cfd6b7bfb3ef9dbac02a19a1f8fe568@mail.gmail.com> Subject: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery To: Dave Chinner , Alex Lyakas X-ASG-Orig-Subj: RE: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Cc: Brian Foster , xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wm0-f46.google.com[74.125.82.46] X-Barracuda-Start-Time: 1460444389 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28659 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi Dave, I posted the patch. After applying this patch & your use-after-free patch, xfs_ail_push_all_sync() processing intent-logs that are no longer relevant upon disk failure/recovery doesn't happen anymore. I tried several times to recreate and the issue doesn't show up. Thanks. --Shyam -----Original Message----- From: Dave Chinner [mailto:david@fromorbit.com] Sent: 11 April 2016 06:51 To: Alex Lyakas Cc: Shyam Kaushik; Brian Foster; xfs@oss.sgi.com Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery On Sun, Apr 10, 2016 at 09:40:29PM +0300, Alex Lyakas wrote: > Hello Dave, > > On Sat, Apr 9, 2016 at 1:46 AM, Dave Chinner wrote: > > On Fri, Apr 08, 2016 at 04:21:02PM +0530, Shyam Kaushik wrote: > >> Hi Dave, Brian, Carlos, > >> > >> While trying to reproduce this issue I have been running into different > >> issues that are similar. Underlying issue remains the same when backend to > >> XFS is failed & we unmount XFS, we run into hung-task timeout (180-secs) > >> with stack like > >> > >> kernel: [14952.671131] [] > >> xfs_ail_push_all_sync+0xa9/0xe0 [xfs] > >> kernel: [14952.671139] [] ? > >> prepare_to_wait_event+0x110/0x110 > >> kernel: [14952.671181] [] xfs_unmountfs+0x61/0x1a0 > >> [xfs] > >> > >> while running trace-events, XFS ail push keeps looping around > >> > >> xfsaild/dm-10-21143 [001] ...2 17878.555133: xfs_ilock_nowait: dev > >> 253:10 ino 0x0 flags ILOCK_SHARED caller xfs_inode_item_push [xfs] > > > > Looks like either a stale inode (which should never reach the AIL) > > or it's an inode that's been reclaimed and this is a use after free > > situation. Given that we are failing IOs here, I'd suggest it's more > > likely to be an IO failure that's caused a writeback problem, not an > > interaction with stale inodes. > > > > So, look at xfs_iflush. If an IO fails, it is supposed to unlock the > > inode by calling xfs_iflush_abort(), which will also remove it from > > the AIL. This can also happen on reclaim of a dirty inode, and if so > > we'll still reclaim the inode because reclaim assumes xfs_iflush() > > cleans up properly. > > > > Which, apparently, it doesn't: > > > > /* > > * Get the buffer containing the on-disk inode. > > */ > > error = xfs_imap_to_bp(mp, NULL, &ip->i_imap, &dip, &bp, XBF_TRYLOCK, 0); > > if (error || !bp) { > > xfs_ifunlock(ip); > > return error; > > } > > > > This looks like a bug - xfs_iflush hasn't aborted the inode > > writeback on failure - it's just unlocked the flush lock. Hence it > > has left the inode dirty in the AIL, and then the inode has probably > > then been reclaimed, setting the inode number to zero. > In our case, we do not reach this call, because XFS is already marked > as "shutdown", so in our case we do: > /* > * This may have been unpinned because the filesystem is shutting > * down forcibly. If that's the case we must not write this inode > * to disk, because the log record didn't make it to disk. > * > * We also have to remove the log item from the AIL in this case, > * as we wait for an empty AIL as part of the unmount process. > */ > if (XFS_FORCED_SHUTDOWN(mp)) { > error = -EIO; > goto abort_out; > } > > So we call xfs_iflush_abort, but due to "iip" being NULL (as Shyam > mentioned earlier in this thread), we proceed directly to > xfs_ifunlock(ip), which now becomes the same situation as you > described above. If you are getting this occuring, something else has already gone wrong as you can't have a dirty inode without a log item attached to it. So it appears to me that you are reporting a symptom of a problem after it has occured, not the root cause. Maybe it is the same root cause, maybe not. Either way, it doesn't help us solve any problem. > The comment clearly says "We also have to remove the log item from the > AIL in this case, as we wait for an empty AIL as part of the unmount > process." Could you perhaps point us at the code that is supposed to > remove the log item from the AIL? Apparently this is not happening. xfs_iflush_abort or xfs_iflush_done does that work. -Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 12 02:54:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 09DB27CB5 for ; Tue, 12 Apr 2016 02:54:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C195C304053 for ; Tue, 12 Apr 2016 00:54:49 -0700 (PDT) X-ASG-Debug-ID: 1460447684-04cbb02e1adcc90001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id REnS2uHCcLEegxrR for ; Tue, 12 Apr 2016 00:54:45 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DMCwBnqQxXNaAZLHldgzeBUIZrn2QBAQEBAQEGjBGJd4YHAgIBAQKBLE0BAQEBAQEHAQEBAUJAhEEBAQEEJxMcIxAIAw4HAwklDwUlAwcaE4gmwDkBAQEHAgEdGYVAhROEBWCFMAWHcpAWjgOPGkWOYoJmGYFcKjCIUYE0AQEB Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail05.adl6.internode.on.net with ESMTP; 12 Apr 2016 17:24:24 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1apt9T-0001AK-Rj; Tue, 12 Apr 2016 17:54:23 +1000 Date: Tue, 12 Apr 2016 17:54:23 +1000 From: Dave Chinner To: Dave Chinner Cc: Joe Lawrence , xfs@oss.sgi.com Subject: Re: list_add corruption after "xfs: mode di_mode to vfs inode" Message-ID: <20160412075423.GG9088@dastard> X-ASG-Orig-Subj: Re: list_add corruption after "xfs: mode di_mode to vfs inode" References: <56FC9FA6.1080700@stratus.com> <20160401024413.GB2072@devil.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160401024413.GB2072@devil.localdomain> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1460447684 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28660 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Apr 01, 2016 at 01:44:13PM +1100, Dave Chinner wrote: > On Wed, Mar 30, 2016 at 11:55:18PM -0400, Joe Lawrence wrote: > > Hi Dave, > > > > Upon loading 4.6-rc1, I noticed a few linked list corruption messages in > > dmesg shortly after boot up. I bisected the kernel, landing on: > > > > [c19b3b05ae440de50fffe2ac2a9b27392a7448e9] xfs: mode di_mode to vfs inode > > > > If I revert c19b3b05ae44 from 4.6-rc1, the warnings stop. > > > > WARNING: CPU: 35 PID: 6715 at lib/list_debug.c:29 __list_add+0x65/0xc0 > > list_add corruption. next->prev should be prev (ffff882030928a00), but was ffff88103f00c300. (next=ffff88100fde5ce8). > ..... > > [] ? bdev_test+0x20/0x20 > > [] __list_add+0x65/0xc0 > > [] bd_acquire+0xc8/0xd0 > > [] blkdev_open+0x39/0x70 > > [] do_dentry_open+0x227/0x320 > > [] ? blkdev_get_by_dev+0x50/0x50 > > [] vfs_open+0x57/0x60 > > [] path_openat+0x1ba/0x1340 > > [] do_filp_open+0x91/0x100 > > [] ? __alloc_fd+0x46/0x180 > > [] do_sys_open+0x124/0x210 > > [] SyS_open+0x1e/0x20 > > [] do_syscall_64+0x62/0x110 > > [] entry_SYSCALL64_slow_path+0x25/0x25 > .... > > According to the bd_acquire+0xc8 offset, we're in bd_acquire() > > attempting the list add: > .... > > 713 bdev = bdget(inode->i_rdev); > > 714 if (bdev) { > > 715 spin_lock(&bdev_lock); > > 716 if (!inode->i_bdev) { > > 717 /* > > 718 * We take an additional reference to bd_inode, > > 719 * and it's released in clear_inode() of inode. > > 720 * So, we can access it via ->i_mapping always > > 721 * without igrab(). > > 722 */ > > 723 bdgrab(bdev); > > 724 inode->i_bdev = bdev; > > 725 inode->i_mapping = bdev->bd_inode->i_mapping; > > 726 list_add(&inode->i_devices, &bdev->bd_inodes); > > So the bdev->bd_inodes list is corrupt, and this call trace is > just the messenger. .... > > I'm not really sure why the bisect landed on c19b3b05ae44 "xfs: mode > > di_mode to vfs inode", but as I mentioned, reverting it made the list > > warnings go away. > > Neither am I at this point as it's the bdev inode (not an xfs > inode) that has a corrupted list. I'll have to try to reproduce this. Patch below should fix the problem. Smoke tested only at this point. Cheers, Dave. -- Dave Chinner david@fromorbit.com xfs: we don't need no steekin ->evict_inode From: Dave Chinner Joe Lawrence reported a list_add corruption with 4.6-rc1 when testing some custom md administration code that made it's own block device nodes for the md array. The simple test loop of: for i in {0..100}; do mknod --mode=0600 $tmp/tmp_node b $MAJOR $MINOR mdadm --detail --export $tmp/tmp_node > /dev/null rm -f $tmp/tmp_node done Would produce this warning in bd_acquire() when mdadm opened the device node: list_add double add: new=ffff88043831c7b8, prev=ffff8804380287d8, next=ffff88043831c7b8. And then produce this from bd_forget from kdevtmpfs evicting a block dev inode: list_del corruption. prev->next should be ffff8800bb83eb10, but was ffff88043831c7b8 This is a regression caused by commit c19b3b05 ("xfs: mode di_mode to vfs inode"). The issue is that xfs_inactive() frees the unlinked inode, and the above commit meant that this freeing zeroed the mode in the struct inode. The problem is that after evict() has called ->evict_inode, it expects the i_mode to be intact so that it can call bd_forget() or cd_forget() to drop the reference to the block device inode attached to the XFS inode. In reality, the only thing we do in xfs_fs_evict_inode() that is not generic is call xfs_inactive(). We can move the xfs_inactive() call to xfs_fs_destroy_inode() without any problems at all, and this will leave the VFS inode intact until it is completely done with it. So, remove xfs_fs_evict_inode(), and do the work it used to do in ->destroy_inode instead. Reported-by: Joe Lawrence Signed-off-by: Dave Chinner --- fs/xfs/xfs_super.c | 28 +++++++--------------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index b412bb1..d8424f5 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -928,7 +928,7 @@ xfs_fs_alloc_inode( /* * Now that the generic code is guaranteed not to be accessing - * the linux inode, we can reclaim the inode. + * the linux inode, we can inactivate and reclaim the inode. */ STATIC void xfs_fs_destroy_inode( @@ -938,9 +938,14 @@ xfs_fs_destroy_inode( trace_xfs_destroy_inode(ip); - XFS_STATS_INC(ip->i_mount, vn_reclaim); + ASSERT(!rwsem_is_locked(&ip->i_iolock.mr_lock)); + XFS_STATS_INC(ip->i_mount, vn_rele); + XFS_STATS_INC(ip->i_mount, vn_remove); + + xfs_inactive(ip); ASSERT(XFS_FORCED_SHUTDOWN(ip->i_mount) || ip->i_delayed_blks == 0); + XFS_STATS_INC(ip->i_mount, vn_reclaim); /* * We should never get here with one of the reclaim flags already set. @@ -987,24 +992,6 @@ xfs_fs_inode_init_once( "xfsino", ip->i_ino); } -STATIC void -xfs_fs_evict_inode( - struct inode *inode) -{ - xfs_inode_t *ip = XFS_I(inode); - - ASSERT(!rwsem_is_locked(&ip->i_iolock.mr_lock)); - - trace_xfs_evict_inode(ip); - - truncate_inode_pages_final(&inode->i_data); - clear_inode(inode); - XFS_STATS_INC(ip->i_mount, vn_rele); - XFS_STATS_INC(ip->i_mount, vn_remove); - - xfs_inactive(ip); -} - /* * We do an unlocked check for XFS_IDONTCACHE here because we are already * serialised against cache hits here via the inode->i_lock and igrab() in @@ -1673,7 +1660,6 @@ xfs_fs_free_cached_objects( static const struct super_operations xfs_super_operations = { .alloc_inode = xfs_fs_alloc_inode, .destroy_inode = xfs_fs_destroy_inode, - .evict_inode = xfs_fs_evict_inode, .drop_inode = xfs_fs_drop_inode, .put_super = xfs_fs_put_super, .sync_fs = xfs_fs_sync_fs, From david@fromorbit.com Tue Apr 12 03:19:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C0B9D7CB7 for ; Tue, 12 Apr 2016 03:19:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 42380AC001 for ; Tue, 12 Apr 2016 01:19:53 -0700 (PDT) X-ASG-Debug-ID: 1460449190-04bdf011023fe170001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id DPc9gasvKg9EV6Ms for ; Tue, 12 Apr 2016 01:19:51 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BaCwANrwxXNaAZLHldgzeBUIZrn2UBAQEBAQEGjBGDT4YohgcEAgKBLU0BAQEBAQEHAQEBAUJAhEIBAQQ6HCMQCAMYCSUPBSUDBxoTiCbAPwEBCAIeGYVAhROKFQWYCI4DgVuNP0WOYoMUgUcqMIoFAQEB Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail05.adl6.internode.on.net with ESMTP; 12 Apr 2016 17:49:36 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aptXr-0001DY-Ld; Tue, 12 Apr 2016 18:19:35 +1000 Date: Tue, 12 Apr 2016 18:19:35 +1000 From: Dave Chinner To: Shyam Kaushik Cc: Alex Lyakas , Brian Foster , xfs@oss.sgi.com Subject: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery Message-ID: <20160412081935.GH9088@dastard> X-ASG-Orig-Subj: Re: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery References: <20160322121922.GA53693@bfoster.bfoster> <232dd85fde11d4ef1625f070eabfd167@mail.gmail.com> <20160408224648.GD567@dastard> <20160411012127.GF567@dastard> <0cfd6b7bfb3ef9dbac02a19a1f8fe568@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <0cfd6b7bfb3ef9dbac02a19a1f8fe568@mail.gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1460449191 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28660 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Apr 12, 2016 at 12:29:48PM +0530, Shyam Kaushik wrote: > Hi Dave, > > I posted the patch. > > After applying this patch & your use-after-free patch, > xfs_ail_push_all_sync() processing intent-logs that are no longer relevant > upon disk failure/recovery doesn't happen anymore. I tried several times > to recreate and the issue doesn't show up. OK, so that confirms we are leaking inodes at that spot. I'll have a look at the patch.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 12 03:28:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C33417CB7 for ; Tue, 12 Apr 2016 03:28:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 78753304039 for ; Tue, 12 Apr 2016 01:28:04 -0700 (PDT) X-ASG-Debug-ID: 1460449681-04bdf011053fe3e0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id sq8c4h2m8nByIbix for ; Tue, 12 Apr 2016 01:28:01 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AjDAB4sAxXNaAZLHldgzdTfYZrn1kMAQEBAQEBBowRhWiEDxmFbgICAQECgS1NAQEBAQEBBwEBAQFCQIRBAQEBBCcTDQ8jEAgDFQMJDBkPBSUDBxoTiCazEY02AQEBBwIBHRmFQIUThH6FFwWHZ4cbiQaFd4gMgXFOhACIW0WFW4kHhFsqMIoFAQEB Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail05.adl6.internode.on.net with ESMTP; 12 Apr 2016 17:58:00 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aptg0-0001FE-2X; Tue, 12 Apr 2016 18:28:00 +1000 Date: Tue, 12 Apr 2016 18:28:00 +1000 From: Dave Chinner To: Shyam Kaushik Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Abort intent log item in xfs_iflush() upon error to get buf Message-ID: <20160412082759.GI9088@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: Abort intent log item in xfs_iflush() upon error to get buf References: <23e35813cb097c7b15686852500cbf97@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <23e35813cb097c7b15686852500cbf97@mail.gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1460449681 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28660 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Apr 12, 2016 at 12:27:30PM +0530, Shyam Kaushik wrote: > Looking at xfs_iflush(). If an IO fails, it is supposed to unlock the > inode by calling xfs_iflush_abort(), which will also remove it from > the AIL. This can also happen on reclaim of a dirty inode, and if so > we'll still reclaim the inode because reclaim assumes xfs_iflush() > cleans up properly. Which, apparently, it doesn't. > > Fix xfs_iflush() buf get failure to remove intent log item. > > Discovered-by: Dave Chinner > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 96f606d..85414a6 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -3374,8 +3374,9 @@ xfs_iflush( > error = xfs_imap_to_bp(mp, NULL, &ip->i_imap, &dip, &bp, > XBF_TRYLOCK, > 0); > if (error || !bp) { > - xfs_ifunlock(ip); > - return error; > + if (!bp) > + error = -EIO; > + goto abort_out; So that will trigger a failure whenever the underlying buffer is busy (i.e. returns -EAGAIN with bp NULL), not just when an IO or corruption error occurs. The hammer is too big. ;) Great proof of concept, though, as your testing results tell us you have found the root cause of the bug. The patch I wrote earlier today takes the EAGAIN case into account - I'm currently testing it, and have attached it below. Can you run it through your error testing, please, Shyam? I'll update all the reported-by, etc attributions before I post it for proper review. Cheers, Dave. -- Dave Chinner david@fromorbit.com xfs: xfs_iflush_cluster fails to abort on error From: Dave Chinner When a failure due to an inode buffer occurs, the error handling fails to abort the inode writeback correctly. This can result in the inode being reclaimed whilst still in the AIL, leading to use-after-free situations as well as filesystems that cannot be unmounted as the inode log items left in the AIL never get removed. Fix this by ensuring fatal errors from xfs_imap_to_bp() result in the inode flush being aborted correctly. Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 5b84bbc..e1a8020 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -3378,14 +3378,22 @@ xfs_iflush( } /* - * Get the buffer containing the on-disk inode. + * Get the buffer containing the on-disk inode. We are doing a try-lock + * operation here, so we may get an EAGAIN error. In that case, we + * simply want to return with the inode still dirty. + * + * If we get any other error, we effectively have a corruption situation + * and we cannot flush the inode, so we treat it the same as failing + * xfs_iflush_int(). */ error = xfs_imap_to_bp(mp, NULL, &ip->i_imap, &dip, &bp, XBF_TRYLOCK, 0); - if (error || !bp) { + if (error == -EAGAIN) { xfs_ifunlock(ip); return error; } + if (error) + goto corrupt_out; /* * First flush out the inode that xfs_iflush was called with. @@ -3413,7 +3421,8 @@ xfs_iflush( return 0; corrupt_out: - xfs_buf_relse(bp); + if (bp) + xfs_buf_relse(bp); xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); cluster_corrupt_out: error = -EFSCORRUPTED; From alex@zadarastorage.com Tue Apr 12 03:56:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 B4DE57CA3 for ; Tue, 12 Apr 2016 03:56:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7932D304039 for ; Tue, 12 Apr 2016 01:56:32 -0700 (PDT) X-ASG-Debug-ID: 1460451388-04cbb02e1dde3c0001-NocioJ Received: from mail-wm0-f46.google.com (mail-wm0-f46.google.com [74.125.82.46]) by cuda.sgi.com with ESMTP id hvLY2So6VJaGnPG5 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 12 Apr 2016 01:56:29 -0700 (PDT) X-Barracuda-Envelope-From: alex@zadarastorage.com X-Barracuda-Apparent-Source-IP: 74.125.82.46 Received: by mail-wm0-f46.google.com with SMTP id a140so44493210wma.0 for ; Tue, 12 Apr 2016 01:56:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=message-id:from:to:cc:subject:date:mime-version:importance; bh=su4gAkiOM58MfGGBj9S2KnEDz9YPiYPLsPrAakQUIGY=; b=cBD0i0pfcDp8lfSoMGZxz2PE/kO+6MdS+dvsi9GIvskFzp5tlGHFANmLITWDJ0i5VO 3m49v8rbDadAsj9LrzTaiMIEMdFL4OYfyP9KAZg4Q8gavTC544WBhJyQan2xCPDUapAK gt8/yT9ElG4Q7T/k4ShoBQfegULbNyjWQa3o0LDcgaJGduGVah1Red5SBxKlXgShPlA2 d6KMaCmZb8L7OQjeUd5bHOGdmFZJ0LfmutvUPX1IuXIMGTY41F2sXJ5l5y+C/sgQ4U+K Ust2tSZoq2CJyZknTwDK94k3E30CtM+lEhoW8RhrkBFT9jDwUaQgP5Su/8SqHers/hih 7N9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:from:to:cc:subject:date:mime-version :importance; bh=su4gAkiOM58MfGGBj9S2KnEDz9YPiYPLsPrAakQUIGY=; b=JMOszvYFP4H4tub7kolr99EF4dNJV+0EvagnMUs9M8GwqyDhqiaHXHjFcjPQMqG8ug 18RHtqT5Bchf5nfjCtpJ7LYLsxmdexkphk12Tdu+s+JTx8GItjE68pykEkZwEQLGvMOJ u/7MqWC06VI1DSh+ucs9e7+svOIagMq/gPVabe3k0BwT3BXBT2P6OsRn5w50Cu+AlmBX 3Ph61n7/MXUx4HmEACzdsJ6UGRGq9iqn2w19Deo2T9MCUqor2Oz3lO6CY6NFVWykHZgI BZe6W9XffC0AP5ZP/9danTRZnYZSid9M9zmsOe61O9lsCkmLfhhQpO1rTTIyxR51m0oC rnyw== X-Gm-Message-State: AOPr4FVlZ/gbLhcsbidxS2D+ODPEisYDZMxK1m4CrSCZT9Ozdg3ubAFrcN0SytgwUY78ag== X-Received: by 10.28.214.137 with SMTP id n131mr2744491wmg.33.1460451388390; Tue, 12 Apr 2016 01:56:28 -0700 (PDT) Received: from alyakaslap (bzq-169-168-31-234.red.bezeqint.net. [31.168.169.234]) by smtp.gmail.com with ESMTPSA id ys9sm32046101wjc.35.2016.04.12.01.56.27 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 12 Apr 2016 01:56:27 -0700 (PDT) Message-ID: From: "Alex Lyakas" To: Cc: , Subject: RE: [PATCH 4/5] xfs: xfs_inode_free() isn't RCU safe Date: Tue, 12 Apr 2016 11:55:41 +0300 X-ASG-Orig-Subj: RE: [PATCH 4/5] xfs: xfs_inode_free() isn't RCU safe MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0041_01D194B2.3CBE5090" X-Priority: 3 X-MSMail-Priority: Normal Importance: Normal X-Mailer: Microsoft Windows Live Mail 16.4.3528.331 X-MimeOLE: Produced By Microsoft MimeOLE V16.4.3528.331 X-Barracuda-Connect: mail-wm0-f46.google.com[74.125.82.46] X-Barracuda-Start-Time: 1460451389 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28661 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 This is a multi-part message in MIME format. ------=_NextPart_000_0041_01D194B2.3CBE5090 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hello Dave, Looking at the patch, I see that now we call xfs_idestroy_fork() in RCU = callback. This can do the following chain: xfs_iext_destroy =3D> xfs_iext_irec_remove =3D> = xfs_iext_realloc_indirect=3D> kmem_realloc =3D> kmem_alloc =3D> = kmem_alloc =3D> congestion_wait() At least according to documentation, the RCU callback cannot block, = since it may be called from softirq context. Is this fine? Thanks, Alex. P.S.: I have submitted a patch called =E2=80=9C[PATCH] xfs: optimize = destruction of the indirection array=E2=80=9D, which changes = xfs_iext_destroy to call only kmem_free(). But this patch got stuck in = the spam filter of the mailing list, and Brent is working to release it = from there. ------=_NextPart_000_0041_01D194B2.3CBE5090 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
    Hello Dave,
     
    Looking at the patch, I see that now we call xfs_idestroy_fork() in = RCU=20 callback. This can do the following chain:
     
    xfs_iext_destroy =3D> xfs_iext_irec_remove =3D>=20 xfs_iext_realloc_indirect=3D> kmem_realloc =3D> kmem_alloc =3D> = kmem_alloc=20 =3D> congestion_wait()
     
    At least according to documentation, the RCU callback cannot block, = since=20 it may be called from softirq context. Is this fine?
     
    Thanks,
    Alex.
     
    P.S.: I have submitted a patch called =E2=80=9C[PATCH] xfs: = optimize destruction of=20 the indirection array=E2=80=9D, which changes xfs_iext_destroy to call = only kmem_free().=20 But this patch got stuck in the spam filter of the mailing list, and = Brent is=20 working to release it from there.
     
     
     
    ------=_NextPart_000_0041_01D194B2.3CBE5090-- From alex@zadarastorage.com Tue Apr 12 03:56:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 0FD4F7CA3 for ; Tue, 12 Apr 2016 03:56:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6C50CAC001 for ; Tue, 12 Apr 2016 01:56:40 -0700 (PDT) X-ASG-Debug-ID: 1460451397-04cbb02e1ade3c0001-NocioJ Received: from mail-wm0-f53.google.com (mail-wm0-f53.google.com [74.125.82.53]) by cuda.sgi.com with ESMTP id 7OV1XhXSsVH5kHhA (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 12 Apr 2016 01:56:38 -0700 (PDT) X-Barracuda-Envelope-From: alex@zadarastorage.com X-Barracuda-Apparent-Source-IP: 74.125.82.53 Received: by mail-wm0-f53.google.com with SMTP id l6so178450442wml.1 for ; Tue, 12 Apr 2016 01:56:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=message-id:from:to:cc:subject:date:mime-version:importance; bh=IAHHqV+d4vgylOHmJwDQBd1WBTE86HeRfS7Zc/3en8s=; b=CyVdSuQRR22zNtmqw2uxrI2/p/s/7DiMbeeA1ftxe4n2h20h/0k4fz3yvQtCFIxmdE tGQiT57juWf+nROYCprODObagWJCQfb5MQtb1BsUQNI2VOBTkHRmQJbcugmiJX9V9w9k xvN2ahBeC8Fhs9Wn/wPJziJjBKuOWqeMMYTlO1NwA/lvnUVD77bq1AxqmRTxvCgGyhGu uBYHBuOeUapv2o2J2EaSvdPL5yXK0mo4gSgEJAqIQ55knU7vE0m7GQNYu9wf+T7m9q3q 0hLwnXO7prx6GG7/AbJvcJetf3depAqnfAExX2j7bOwUVU3lRw9Gz8DY+FLwJ1uXrxrG HJEg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:from:to:cc:subject:date:mime-version :importance; bh=IAHHqV+d4vgylOHmJwDQBd1WBTE86HeRfS7Zc/3en8s=; b=XdAsf/mCs4ueXKWUXX+L85y0/p5vICrz6aj1CobjUU8OmcI3tM1BdS/RNdty6PVZ4r ZwYxz3u4UddGkFFqVFFJvqGCO1ULb6oZuVO+IiGGAV2f28jfyyI87XUoopLNcTKsX/iu QSRLndqU672uHNfDBtTgcJr2pU7f74It7DQaVYkV4wFfTNdFkiNbvrnYb9MAJZ9JjQAN t+p5k6HgPCcM0811VN+1kJvm/XgXEp9dXyBuGfEdCOhHtRKtRlsB4+Z1FYA3xrqnB8Mh 6Yb4V9fm6cD1DE8RKqGPdxQdnYb7ahPyCjlpYMP1ftX+UvRp3NIW/dcSl9wV3ZHXHH6l uo3Q== X-Gm-Message-State: AOPr4FWOaFcy5wEaa7Z2LjkTJF0Ghkc5b9iAN92MuOX441wBfd4aQDYtnseFLNcP3GOflA== X-Received: by 10.28.35.82 with SMTP id j79mr2822745wmj.78.1460451397278; Tue, 12 Apr 2016 01:56:37 -0700 (PDT) Received: from alyakaslap (bzq-169-168-31-234.red.bezeqint.net. [31.168.169.234]) by smtp.gmail.com with ESMTPSA id s6sm12612083wjy.31.2016.04.12.01.56.36 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 12 Apr 2016 01:56:36 -0700 (PDT) Message-ID: <0A92B65A3BF94F60BB36EA3FA716DF1F@alyakaslap> From: "Alex Lyakas" To: Cc: , , "Shyam Kaushik" Subject: RE: [PATCH 4/5] xfs: xfs_inode_free() isn't RCU safe Date: Tue, 12 Apr 2016 11:56:35 +0300 X-ASG-Orig-Subj: RE: [PATCH 4/5] xfs: xfs_inode_free() isn't RCU safe MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0057_01D194B2.5CD57E80" X-Priority: 3 X-MSMail-Priority: Normal Importance: Normal X-Mailer: Microsoft Windows Live Mail 16.4.3528.331 X-MimeOLE: Produced By Microsoft MimeOLE V16.4.3528.331 X-Barracuda-Connect: mail-wm0-f53.google.com[74.125.82.53] X-Barracuda-Start-Time: 1460451398 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28661 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 This is a multi-part message in MIME format. ------=_NextPart_000_0057_01D194B2.5CD57E80 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hello Dave, Looking at the patch, I see that now we call xfs_idestroy_fork() in RCU = callback. This can do the following chain: xfs_iext_destroy =3D> xfs_iext_irec_remove =3D> = xfs_iext_realloc_indirect=3D> kmem_realloc =3D> kmem_alloc =3D> = kmem_alloc =3D> congestion_wait() At least according to documentation, the RCU callback cannot block, = since it may be called from softirq context. Is this fine? Thanks, Alex. P.S.: I have submitted a patch called =E2=80=9C[PATCH] xfs: optimize = destruction of the indirection array=E2=80=9D, which changes = xfs_iext_destroy to call only kmem_free(). But this patch got stuck in = the spam filter of the mailing list, and Brent is working to release it = from there. ------=_NextPart_000_0057_01D194B2.5CD57E80 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
    Hello Dave,
     
    Looking at the patch, I see that now we call xfs_idestroy_fork() in = RCU=20 callback. This can do the following chain:
     
    xfs_iext_destroy =3D> xfs_iext_irec_remove =3D>=20 xfs_iext_realloc_indirect=3D> kmem_realloc =3D> kmem_alloc =3D> = kmem_alloc=20 =3D> congestion_wait()
     
    At least according to documentation, the RCU callback cannot block, = since=20 it may be called from softirq context. Is this fine?
     
    Thanks,
    Alex.
     
    P.S.: I have submitted a patch called =E2=80=9C[PATCH] xfs: = optimize destruction of=20 the indirection array=E2=80=9D, which changes xfs_iext_destroy to call = only kmem_free().=20 But this patch got stuck in the spam filter of the mailing list, and = Brent is=20 working to release it from there.
     
     
     
    ------=_NextPart_000_0057_01D194B2.5CD57E80-- From bbice@sgi.com Tue Apr 12 06:29:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 39A557CA0 for ; Tue, 12 Apr 2016 06:29:21 -0500 (CDT) Received: from xmail.sgi.com (pv-excas1-dc21.corp.sgi.com [137.38.106.7]) by relay3.corp.sgi.com (Postfix) with ESMTP id D4821AC002; Tue, 12 Apr 2016 04:29:16 -0700 (PDT) Received: from [134.15.0.33] (134.15.0.33) by xmail.sgi.com (137.38.106.6) with Microsoft SMTP Server (TLS) id 14.3.210.2; Tue, 12 Apr 2016 06:29:16 -0500 Subject: Re: [PATCH 4/5] xfs: xfs_inode_free() isn't RCU safe To: Alex Lyakas , References: <0A92B65A3BF94F60BB36EA3FA716DF1F@alyakaslap> CC: , Shyam Kaushik From: Brent Bice Message-ID: <570CDC0B.3070802@sgi.com> Date: Tue, 12 Apr 2016 05:29:15 -0600 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <0A92B65A3BF94F60BB36EA3FA716DF1F@alyakaslap> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 8bit X-Originating-IP: [134.15.0.33] Could you resend it to be sure? I flagged it for redelivery the day I emailed you so if nobody else has seen it yet then something still didn't work. I was pretty sure I'd seen it get delivered ok to oss, but... (shrug) Brent On 04/12/2016 02:56 AM, Alex Lyakas wrote: > Hello Dave, > Looking at the patch, I see that now we call xfs_idestroy_fork() in RCU > callback. This can do the following chain: > xfs_iext_destroy => xfs_iext_irec_remove => xfs_iext_realloc_indirect=> > kmem_realloc => kmem_alloc => kmem_alloc => congestion_wait() > At least according to documentation, the RCU callback cannot block, > since it may be called from softirq context. Is this fine? > Thanks, > Alex. > P.S.: I have submitted a patch called “[PATCH] xfs: optimize destruction > of the indirection arrayâ€, which changes xfs_iext_destroy to call only > kmem_free(). But this patch got stuck in the spam filter of the mailing > list, and Brent is working to release it from there. > > > From shyam@zadarastorage.com Tue Apr 12 06:47:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7C44E7CA0 for ; Tue, 12 Apr 2016 06:47:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 50E108F8037 for ; Tue, 12 Apr 2016 04:47:21 -0700 (PDT) X-ASG-Debug-ID: 1460461634-04cbb02e1cee6d0001-NocioJ Received: from mail-wm0-f43.google.com (mail-wm0-f43.google.com [74.125.82.43]) by cuda.sgi.com with ESMTP id uwLea7SQiimmxZdK (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 12 Apr 2016 04:47:15 -0700 (PDT) X-Barracuda-Envelope-From: shyam@zadarastorage.com X-Barracuda-Apparent-Source-IP: 74.125.82.43 Received: by mail-wm0-f43.google.com with SMTP id v188so123581272wme.1 for ; Tue, 12 Apr 2016 04:47:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=from:references:in-reply-to:mime-version:thread-index:date :message-id:subject:to:cc; bh=6vunoMnVgiGmF9UIvKMNLuJm8LbTlds5ujdp2dolrDw=; b=JwRBV5i0HR6d582qaesp+3b3ue0rkYaDfMgDlS2wrT4aeOrxao9oHd1T4GynnjOxKq vqwO5EHFn5/qor8Go8cE58+x1DmFaYR8Age9rQhmgpUzdugDigEGaXCa7VKbLHswbZU+ MC63mrSIGwnxhr4y3g+n21pdHah79N48b9UXwwe9VvVqObrLoo3pUS7z6xe5kqLprluG g6hQp+hDAfwvuVDPDCo18wd1Dw9YZwjS7XT6qJRcVIoZ0JBwKN28O+rbabVpljYtq0qI CguXBqUA07cWAWvaqBy1+OLrYunyScNtcChIFNHLWwSwKWVza9rBTIvORjNprnrSA/5U wkeg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:references:in-reply-to:mime-version :thread-index:date:message-id:subject:to:cc; bh=6vunoMnVgiGmF9UIvKMNLuJm8LbTlds5ujdp2dolrDw=; b=lfqLUP1XRh+jcDptLvO9Cud4ZhNYERMHqMVLHFkl6cDpa9p/bNHQM2hPvd/++jO0yP y+qjRpqsVb/Igg4cmXodnMI5TQV6QG7sIDq4ZXJfNS4HezR/mCsIFYspe9R7XYVNFXPh CW4vX1PYhRxFYumMMYJbXwVSK7F0DHAjQhfZ+xD/8rn4Z+FoKJ11MjeJHJglve0Q+yRF MfEBME0ePs15xZKn5/nxIBYftrl73hJ/+we0jNJPE4Z13h6MYu5hA1e9AdOCXXL5Qb4/ GYWJM+3a7Zd1ARp/B19TJDTKbyt91DwjsOqYYfjXIiO+1VcTJiY93UdkKxK42rL3uKBI W2tg== X-Gm-Message-State: AD7BkJKcaQjNsrJefAhGr01woNZeQFi7LYZPKgfly+iN6Inp1AtyXiEFVfwF+c7Fg7kVZ1fvvJUhIfrQhlIHEQ== X-Received: by 10.28.184.194 with SMTP id i185mr24627896wmf.90.1460461634480; Tue, 12 Apr 2016 04:47:14 -0700 (PDT) From: Shyam Kaushik References: <23e35813cb097c7b15686852500cbf97@mail.gmail.com> <20160412082759.GI9088@dastard> In-Reply-To: <20160412082759.GI9088@dastard> MIME-Version: 1.0 X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AdGUlTrrBOLVTNlqQWycRATh+lZWlwAGze1Q Date: Tue, 12 Apr 2016 17:17:13 +0530 Message-ID: <107cf9c2690aa00fcdd74b15198fbbdf@mail.gmail.com> Subject: RE: [PATCH] xfs: Abort intent log item in xfs_iflush() upon error to get buf To: Dave Chinner X-ASG-Orig-Subj: RE: [PATCH] xfs: Abort intent log item in xfs_iflush() upon error to get buf Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wm0-f43.google.com[74.125.82.43] X-Barracuda-Start-Time: 1460461635 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28663 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi Dave, With your patch, I ran into below OOPs once. With "if (bp)" check before xfs_buf_relse() I am not sure how this happened. I will re-run the tests few more times & get back to you. [ 514.010390] XFS (dm-10): xfs_imap_to_bp: xfs_trans_read_buf() returned error -5. [ 514.010410] BUG: unable to handle kernel NULL pointer dereference at 000000000000003f [ 514.010415] IP: [] _raw_spin_lock_irqsave+0x27/0x60 [ 514.010422] PGD 7b9b067 PUD 7545067 PMD 0 [ 514.010424] Oops: 0002 [#2] PREEMPT SMP [ 514.010486] task: ffff88001dd3bcc0 ti: ffff880007a9c000 task.ti: ffff880007a9c000 [ 514.010488] RIP: 0010:[] [] _raw_spin_lock_irqsave+0x27/0x60 [ 514.010491] RSP: 0018:ffff880007a9f538 EFLAGS: 00010082 [ 514.010492] RAX: 0000000000000296 RBX: 000000000000003f RCX: 0000000000003dfc [ 514.010492] RDX: 0000000000020000 RSI: 000000003dfe3dfc RDI: 000000000000003f [ 514.010493] RBP: ffff880007a9f538 R08: 0000000000000296 R09: ffffffff81ecadf4 [ 514.010494] R10: 000000000001675c R11: 0000000000000001 R12: 000000000000000f [ 514.010494] R13: ffff880009471000 R14: ffff880007a9f610 R15: 0000000000000000 [ 514.010496] FS: 00007f0ba69e1840(0000) GS:ffff88007fc00000(0000) knlGS:0000000000000000 [ 514.010498] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 514.010499] CR2: 000000000000003f CR3: 000000001e313000 CR4: 00000000000007f0 [ 514.010504] Stack: [ 514.010506] ffff880007a9f568 ffffffff810b9236 ffffea000109fec0 0000000000000000 [ 514.010507] 00000000368bb6a0 ffff880003406400 ffff880007a9f598 ffffffffc07b661e [ 514.010508] ffff8800034064e4 ffff880003406400 000000000000000f ffff880009471000 [ 514.010511] Call Trace: [ 514.010515] [] up+0x16/0x50 [ 514.010544] [] xfs_buf_unlock+0x1e/0x90 [xfs] [ 514.010562] [] xfs_iflush+0xcf/0x290 [xfs] [ 514.010580] [] xfs_reclaim_inode+0xd5/0x340 [xfs] [ 514.010597] [] xfs_reclaim_inodes_ag+0x233/0x370 [xfs] [ 514.010614] [] xfs_reclaim_inodes_nr+0x33/0x40 [xfs] [ 514.010632] [] xfs_fs_free_cached_objects+0x15/0x20 [xfs] [ 514.010637] [] super_cache_scan+0x169/0x170 [ 514.010639] [] shrink_slab_node+0x138/0x2f0 [ 514.010641] [] ? mem_cgroup_iter+0x257/0x470 [ 514.010644] [] shrink_slab+0x8b/0x160 [ 514.010646] [] do_try_to_free_pages+0x34f/0x4a0 [ 514.010648] [] try_to_free_pages+0xba/0x1a0 [ 514.010652] [] __alloc_pages_nodemask+0x664/0xaa0 [ 514.010655] [] alloc_pages_current+0x97/0x110 [ 514.010658] [] __page_cache_alloc+0xa7/0xc0 [ 514.010660] [] __do_page_cache_readahead+0x108/0x250 [ 514.010662] [] ? do_last+0x185/0x1220 [ 514.010670] [] ? inode_permission+0x18/0x50 [ 514.010672] [] ondemand_readahead+0x148/0x2a0 [ 514.010674] [] ? pagecache_get_page+0x2c/0x1e0 [ 514.010676] [] page_cache_sync_readahead+0x31/0x50 [ 514.010679] [] generic_file_read_iter+0x409/0x5f0 [ 514.010681] [] new_sync_read+0x7e/0xb0 [ 514.010683] [] vfs_read+0x9c/0x180 [ 514.010686] [] SyS_read+0x46/0xb0 [ 514.010688] [] system_call_fastpath+0x16/0x1b Thanks. --Shyam -----Original Message----- From: Dave Chinner [mailto:david@fromorbit.com] Sent: 12 April 2016 13:58 To: Shyam Kaushik Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Abort intent log item in xfs_iflush() upon error to get buf On Tue, Apr 12, 2016 at 12:27:30PM +0530, Shyam Kaushik wrote: > Looking at xfs_iflush(). If an IO fails, it is supposed to unlock the > inode by calling xfs_iflush_abort(), which will also remove it from > the AIL. This can also happen on reclaim of a dirty inode, and if so > we'll still reclaim the inode because reclaim assumes xfs_iflush() > cleans up properly. Which, apparently, it doesn't. > > Fix xfs_iflush() buf get failure to remove intent log item. > > Discovered-by: Dave Chinner > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 96f606d..85414a6 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -3374,8 +3374,9 @@ xfs_iflush( > error = xfs_imap_to_bp(mp, NULL, &ip->i_imap, &dip, &bp, > XBF_TRYLOCK, > 0); > if (error || !bp) { > - xfs_ifunlock(ip); > - return error; > + if (!bp) > + error = -EIO; > + goto abort_out; So that will trigger a failure whenever the underlying buffer is busy (i.e. returns -EAGAIN with bp NULL), not just when an IO or corruption error occurs. The hammer is too big. ;) Great proof of concept, though, as your testing results tell us you have found the root cause of the bug. The patch I wrote earlier today takes the EAGAIN case into account - I'm currently testing it, and have attached it below. Can you run it through your error testing, please, Shyam? I'll update all the reported-by, etc attributions before I post it for proper review. Cheers, Dave. -- Dave Chinner david@fromorbit.com xfs: xfs_iflush_cluster fails to abort on error From: Dave Chinner When a failure due to an inode buffer occurs, the error handling fails to abort the inode writeback correctly. This can result in the inode being reclaimed whilst still in the AIL, leading to use-after-free situations as well as filesystems that cannot be unmounted as the inode log items left in the AIL never get removed. Fix this by ensuring fatal errors from xfs_imap_to_bp() result in the inode flush being aborted correctly. Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 5b84bbc..e1a8020 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -3378,14 +3378,22 @@ xfs_iflush( } /* - * Get the buffer containing the on-disk inode. + * Get the buffer containing the on-disk inode. We are doing a try-lock + * operation here, so we may get an EAGAIN error. In that case, we + * simply want to return with the inode still dirty. + * + * If we get any other error, we effectively have a corruption situation + * and we cannot flush the inode, so we treat it the same as failing + * xfs_iflush_int(). */ error = xfs_imap_to_bp(mp, NULL, &ip->i_imap, &dip, &bp, XBF_TRYLOCK, 0); - if (error || !bp) { + if (error == -EAGAIN) { xfs_ifunlock(ip); return error; } + if (error) + goto corrupt_out; /* * First flush out the inode that xfs_iflush was called with. @@ -3413,7 +3421,8 @@ xfs_iflush( return 0; corrupt_out: - xfs_buf_relse(bp); + if (bp) + xfs_buf_relse(bp); xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); cluster_corrupt_out: error = -EFSCORRUPTED; From hack.coo@gmail.com Tue Apr 12 08:27:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 89F057CA0 for ; Tue, 12 Apr 2016 08:27:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5C23D8F8035 for ; Tue, 12 Apr 2016 06:27:26 -0700 (PDT) X-ASG-Debug-ID: 1460467644-04cbb02e1af5c80001-NocioJ Received: from mail-yw0-f193.google.com (mail-yw0-f193.google.com [209.85.161.193]) by cuda.sgi.com with ESMTP id EeFgz1vSvRt3YM4I (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 12 Apr 2016 06:27:24 -0700 (PDT) X-Barracuda-Envelope-From: hack.coo@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.161.193 Received: by mail-yw0-f193.google.com with SMTP id o63so2316343ywe.0 for ; Tue, 12 Apr 2016 06:27:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=plA8KcDbee8Vs7RgXZ+9APZaVVjL6gt0nBRGG7OciTQ=; b=0Xb+ziz5KTvMl/68zF9oja1dTVT/MMRppqaXgCrvxFXlWF1V6Byir1UH5oWxpsS91O yV4Q4ZRXZRYwuEYQOY2oGoSHocJnxqF6CQcTA5dkWSpCkqcwq03WodE4vuA7NcwX4FBc 1ZZfZAyXuBIq/Try5FCAwHMUTZ3/seDYpv+sNpyP9XKp/XINcpWlVqSJKHCEsEkgXgqR FWS0KFr2dpTP0JKxVscU2yh2K0oT94V2FegebRiYgMwQgbYGIgDIzWStsPpik6lRo84P 0Fi+oXXPNEkUtnTp4q+whLnW1DF8ZSWgBICVSNoXdoSUGiQp/f24eIpuNiRd6OIHPEcC KtvQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=plA8KcDbee8Vs7RgXZ+9APZaVVjL6gt0nBRGG7OciTQ=; b=glC+xJZjJ9lh05fIne/m5KXLRCuaQLoHQ+xsxPntZo/nTlEWDru988bS1t+sEA0SAY yENaEqjWrqdD9FQ1jPb0DWTeVJLSw6xzBysMK/m5WTAUf+HMvaZhHCmYVrMOAbAbL8Oh RVOHy+sfE4wrHz9mdg7PSFeiBVpG3L8sdA5PP1gyox8Q0HnrJK1DVXZmMUnqqrV7y8Re KaTFI3PY8KHcPDfP7TTDwmm5pB5ZeZZXK02lzyK0ThmmV/2T3kMypI7kyxlJmftXTr8I rjw7mhydvHW8jIOqONk2SNBBAifZao78wDOPGOwBGR5KApA9pkhyVgHKLJhT70RuYloB 8oPw== X-Gm-Message-State: AOPr4FVt5UDhG76LYsE4FabRcvg5mY6pIUB0509jjt9zPA6FoG4eAijCHWc2K9a5fOSXBzmraTZGLkERmD83IQ== MIME-Version: 1.0 X-Received: by 10.129.44.139 with SMTP id s133mr1879873yws.182.1460467644056; Tue, 12 Apr 2016 06:27:24 -0700 (PDT) Received: by 10.37.89.10 with HTTP; Tue, 12 Apr 2016 06:27:24 -0700 (PDT) In-Reply-To: <20160411181001.2760439b@harpe.intellique.com> References: <20160411181001.2760439b@harpe.intellique.com> Date: Tue, 12 Apr 2016 21:27:24 +0800 Message-ID: Subject: Re: about the xfs performance From: Songbo Wang X-ASG-Orig-Subj: Re: about the xfs performance To: Emmanuel Florac Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a1141e82a216c9f0530499f5d X-Barracuda-Connect: mail-yw0-f193.google.com[209.85.161.193] X-Barracuda-Start-Time: 1460467644 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28665 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --001a1141e82a216c9f0530499f5d Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hi=EF=BC=8CEmmanuel Thank you for your reply , I have two types of pcie-ssd cards: Intel P3600 and ES3000 V2 PCIe SSD ; I did this testing as you mentioned above , but the results are also bad. 2016-04-12 0:10 GMT+08:00 Emmanuel Florac : > Le Mon, 11 Apr 2016 22:14:06 +0800 > Songbo Wang =C3=A9crivait: > > > mkfs: mkfs.xfs /dev/hioa2 -f -n size=3D64k -i size=3D512 -d > > agcount=3D40 -l size=3D1024m. > > mount: mount /dev/hioa2 /mnt/ -t xfs -o > > > rw,noexec,nodev,noatime,nodiratime,nobarrier,discard,inode64,logbsize=3D2= 56k,delaylog > > I use the following command to test iops: fio -ioengine=3Dlibaio -bs=3D= 4k > > -direct=3D1 -thread -rw=3Drandwrite -size=3D50G -filename=3D/mnt/test > > -name=3D"EBS 4KB randwrite test" -iodepth=3D64 -runtime=3D60 > > The results is normal at the beginning which is about 210k=C2=B1=EF=BC= =8Cbut some > > seconds later, the results down to 19k=C2=B1. > > You should first try default mkfs settings, with default mount options. > Normally mkfs.xfs should initiate a TRIM on the SSD, therefore > performance should remain predictable. > > What model of SSD card are you using? With an HGST NVMe SN1x0 I've got > very consistent results (no degradation with time). > > -- > ------------------------------------------------------------------------ > Emmanuel Florac | Direction technique > | Intellique > | > | +33 1 78 94 84 02 > ------------------------------------------------------------------------ > --001a1141e82a216c9f0530499f5d Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
    Hi= =EF=BC=8CEmmanuel
    Thank you for your reply , I have two types of pcie-ssd cards: = Intel P3600 =C2=A0and=C2=A0ES3000 V2 PCIe SSD ;
    I did this testing as you mentioned a= bove , but the results are also bad.=C2=A0

    2016-04-12 0:10 GMT+08:00 Emman= uel Florac <eflorac@intellique.com>:
    Le Mon, 11 Apr 2016 22:14:06 +0800
    Songbo Wang <hack.coo@gmail.com> =C3=A9crivait:

    >=C2=A0 =C2=A0 =C2=A0 mkfs: mkfs.xfs /dev/hioa2 -f -n size=3D64k -i size= =3D512 -d
    > agcount=3D40 -l size=3D1024m.
    >=C2=A0 =C2=A0 =C2=A0 mount: mount /dev/hioa2 /mnt/=C2=A0 -t xfs -o
    > rw,noexec,nodev,noatime,nodiratime,nobarrier,discard,inode64,logbsize= =3D256k,delaylog
    > I use the following command to test iops: fio -ioengine=3Dlibaio -bs= =3D4k
    > -direct=3D1 -thread -rw=3Drandwrite -size=3D50G -filename=3D/mnt/test<= br> > -name=3D"EBS 4KB randwrite test" -iodepth=3D64 -runtime=3D60=
    > The results is normal at the beginning which is about 210k=C2=B1=EF=BC= =8Cbut some
    > seconds later, the results down to 19k=C2=B1.

    You should first try default mkfs settings, with default mount optio= ns.
    Normally mkfs.xfs should initiate a TRIM on the SSD, therefore
    performance should remain predictable.

    What model of SSD card are you using? With an HGST NVMe SN1x0 I've got<= br> very consistent results (no degradation with time).

    --
    ------------------------------------------------------------------------ Emmanuel Florac=C2=A0 =C2=A0 =C2=A0|=C2=A0 =C2=A0Direction technique
    =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 |=C2= =A0 =C2=A0Intellique
    =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 |=C2= =A0 =C2=A0<
    eflorac@intellique.= com>
    =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 |=C2= =A0 =C2=A0+33 1 78 94 84 02
    ------------------------------------------------------------------------

    --001a1141e82a216c9f0530499f5d-- From bfoster@redhat.com Tue Apr 12 09:05:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 279AE7CA0 for ; Tue, 12 Apr 2016 09:05:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id DE0458F8035 for ; Tue, 12 Apr 2016 07:05:20 -0700 (PDT) X-ASG-Debug-ID: 1460469914-04cb6c24624126f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Ue0v9xAB21d8gNcO (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 07:05:15 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 61A3E201FB; Tue, 12 Apr 2016 14:05:14 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-153.bos.redhat.com [10.18.41.153]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3CE5DEI002951; Tue, 12 Apr 2016 10:05:14 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id D1334125438; Tue, 12 Apr 2016 10:05:12 -0400 (EDT) Date: Tue, 12 Apr 2016 10:05:12 -0400 From: Brian Foster To: Andrew Ryder Cc: xfs@oss.sgi.com Subject: Re: xfs_repair fails after trying to format log cycle? Message-ID: <20160412140512.GA59690@bfoster.bfoster> X-ASG-Orig-Subj: Re: xfs_repair fails after trying to format log cycle? References: <56F6DE67.60403@shaw.ca> <20160328085541.GA27040@bfoster.bfoster> <570C8D4D.3060304@shaw.ca> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <570C8D4D.3060304@shaw.ca> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460469914 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Apr 12, 2016 at 01:53:17AM -0400, Andrew Ryder wrote: > > > On 03/28/2016 04:55 AM, Brian Foster wrote: > >On Sat, Mar 26, 2016 at 03:09:27PM -0400, Andrew Ryder wrote: > >>Hello, > >> > >>I have an mdadm array with a xfs v5 filesystem on it and its begun to give > >>me issues when trying to mount it as well as complete xfs_repair. Not sure > >>if anyone might be able to shed some light on what is going on or how to > >>correct the issue? > >> > >>When I try and mount the fs, it complains with: > >> > >>[ 388.479847] XFS (md2): Mounting V5 Filesystem > >>[ 388.494686] XFS (md2): metadata I/O error: block 0x15d6d39c0 > >>("xlog_bread_noalign") error 5 numblks 8192 > >>[ 388.495013] XFS (md2): failed to find log head > >>[ 388.495018] XFS (md2): log mount/recovery failed: error -5 > >>[ 388.495090] XFS (md2): log mount failed > >> > > > >So a read I/O error from the kernel... > > > >> > >>This is where its not making any sense for me, If I try and run "xfs_repair > >>/dev/md2" it fails with: > >> > >>Phase 1 - find and verify superblock... > >> - reporting progress in intervals of 15 minutes > >>Phase 2 - using internal log > >> - zero log... > >>xfs_repair: read failed: Input/output error > >>failed to find log head > >>zero_log: cannot find log head/tail (xlog_find_tail=-5) > >> > >>fatal error -- ERROR: The log head and/or tail cannot be discovered. Attempt > >>to mount the > >>filesystem to replay the log or use the -L option to destroy the log and > >>attempt a repair. > >> > > > >... similar read error from xfsprogs... > > > >> > >>But if I run "xfs_repair -L /dev/md2" which gives: > >> > >>Phase 1 - find and verify superblock... > >> - reporting progress in intervals of 15 minutes > >>Phase 2 - using internal log > >> - zero log... > >>xfs_repair: read failed: Input/output error > >>failed to find log head > >>zero_log: cannot find log head/tail (xlog_find_tail=-5) > >>xfs_repair: libxfs_device_zero write failed: Input/output error > >> > > > >... and it looks like it fails to write as well when trying to zero the > >log... > > > >>then try and re-run "xfs_repair /dev/md2" it starts traversing the > >>filesystem all the way to "Phase 7" then errors with: > >> > >>Phase 7 - verify and correct link counts... > >> - 14:36:55: verify and correct link counts - 33 of 33 allocation > >>groups done > >>Maximum metadata LSN (64:2230592) is ahead of log (0:0). > >>Format log to cycle 67. > >>xfs_repair: libxfs_device_zero write failed: Input/output error > >> > >> > >>Yet at this point I can now mount the filesystem.. > >> > > > >... and this is effectively a repeat of the write error as we try to > >format the log with a correct LSN based on the metadata LSN tracked by > >the repair process. Your kernel is old enough that runtime probably > >won't complain either way (note that 3.19 might be considered a fairly > >early kernel for using CRC support). Perhaps the first write attempt > >zeroed enough of the log before it failed that log recovery wasn't > >required, and thus these problematic I/Os were avoided. > > > >What's the history of this fs? Has it been working for some time, just > >recently formatted? What lead to the need for log recovery? What's the > >mdadm --detail info, member device size, total array size, xfs_info of > >the filesystem, etc..? > > > >Does xfs_repair run clean at this point? If so, does 'xfs_repair -L' > >still reproduce the write error (note that I'm assuming you have a clean > >log such that this command will not cause data loss). If so, an strace > >of the repair process might be interesting... > > > >Brian > > > The filesystem is about a year old as I had one of the Addonics backplane > boards go bad and after the replacement all was good again.. until the > RocketRaid 2722 card and its obscure "Task File error" error message came up > again. > > Everything up to this point had been working smoothly since end of Sept 2015 > after the rebuild. All disks are 2TB in size, partitioned via 'parted' with > 0% and 100% used for partition boundaries on each drive. Everything had been > working wonderfully long before but the array was taken out due to some > issues I had with 3 hitachi drives that refused to work on the RR2722 > card/drivers. Long story. > > I've swapped out two drives in the array and no luck yet as it doesn't seem > to be hardware failure related.. I've not had any signs of data corruption, > just meta-data corruption/errors. > > If I remember correct, the format applied to the array was done under 3.6.11 > kernel as > I'm still going through the same xfs_repair as above to get the array to > mount. It keeps failing after it tries to format the log to cycle 67. > > I'll see if I can get you an strace of things. > FWIW, I created an md array of similar geometry and ran through some fsstress/xfs_repair sequences just to see if there was anything obviously broken in the stack here, but I don't hit any issues. xfs_repair can zero the log and reformat it successfully. This is on a 4.6.0-rc1 kernel. So I think the big question here is why are these certain I/Os failing? This might ultimately require investigation at the md layer and/or further down to your storage controller driver, etc. Anyways, here's the first failed I/O from strace_2.1.txt: 02:34:36.309704 pread64(4, 0x7fe772ec0200, 2097152, 3001552175104) = -1 EIO (Input/output error) That's a 2MB read during phase 2, which is probably what leads to the "failed to find log head" error. The read offset is right around the middle of the array where the internal log resides. What's also interesting is that it is preceded by a bunch of other read I/Os that all appear to complete fine, but those are all 512b I/Os. What happens if you manually issue the read call that failed? E.g., umount the filesystem and run the following command directly against the array: xfs_io -dc "pread 3001552175104 2097152" /dev/md2 Brian > > This all began when the RR2722 driver running under 3.18.15 complained and > .. > > Mar 14 07:23:07 Bigmouth kernel: [7177248.090541] /dev/vmnet: port on hub 0 > successfully opened > Mar 14 07:26:03 Bigmouth kernel: [7177424.552323] device eth1 left > promiscuous mode > Mar 14 07:26:03 Bigmouth kernel: [7177424.552786] bridge-eth1: disabled > promiscuous mode > Mar 14 20:10:20 Bigmouth kernel: [7223317.069464] rr272x_1x:Task file error, > StatusReg=0x51, ErrReg=0x84, LBA[0-3]=0x747dc92f,LBA[4-7]=0x0. > Mar 14 20:10:20 Bigmouth kernel: [7223317.179811] sd 5:0:1:0: [sdg] > Mar 14 20:10:21 Bigmouth kernel: [7223317.690439] Result: > hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK > Mar 14 20:10:21 Bigmouth kernel: [7223317.700480] sd 5:0:1:0: [sdg] CDB: > Mar 14 20:10:21 Bigmouth kernel: [7223318.211147] Write(10): 2a 00 74 7d c9 > 00 00 00 40 00 > Mar 14 20:10:21 Bigmouth kernel: [7223318.211167] blk_update_request: I/O > error, dev sdg, sector 1954400512 > Mar 14 20:10:21 Bigmouth kernel: [7223318.211203] sd 5:0:3:0: [sdi] > Mar 14 20:10:21 Bigmouth kernel: [7223318.211206] Result: > hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK > Mar 14 20:10:21 Bigmouth kernel: [7223318.211209] sd 5:0:3:0: [sdi] CDB: > Mar 14 20:10:21 Bigmouth kernel: [7223318.211211] Write(10): 2a 00 74 7d c9 > 00 00 00 40 00 > Mar 14 20:10:21 Bigmouth kernel: [7223318.211223] blk_update_request: I/O > error, dev sdi, sector 1954400512 > Mar 14 20:10:23 Bigmouth kernel: [7223319.957052] XFS (md2): metadata I/O > error: block 0x15d6d4900 ("xlog_iodone") error 5 numblks 64 > Mar 14 20:10:23 Bigmouth kernel: [7223319.957064] XFS (md2): > xfs_do_force_shutdown(0x2) called from line 1181 of file fs/xfs/xfs_log.c. > Return address = 0xffffffff812fdf96 > Mar 14 20:10:23 Bigmouth kernel: [7223319.957080] XFS (md2): Log I/O Error > Detected. Shutting down filesystem > Mar 14 20:10:23 Bigmouth kernel: [7223319.957083] XFS (md2): Please umount > the filesystem and rectify the problem(s) > Mar 14 20:10:23 Bigmouth kernel: [7223319.957093] XFS (md2): xfs_log_force: > error -5 returned. > Mar 14 20:10:50 Bigmouth kernel: [7223347.087272] XFS (md2): xfs_log_force: > error -5 returned. > Mar 14 20:11:20 Bigmouth kernel: [7223377.190469] XFS (md2): xfs_log_force: > error -5 returned. > Mar 14 20:11:50 Bigmouth kernel: [7223407.293952] XFS (md2): xfs_log_force: > error -5 returned. > Mar 14 20:12:20 Bigmouth kernel: [7223437.397444] XFS (md2): xfs_log_force: > error -5 returned. > Mar 14 20:12:23 Bigmouth kernel: [7223439.791407] nfsd: last server has > exited, flushing export cache > Mar 14 20:12:50 Bigmouth kernel: [7223467.500928] XFS (md2): xfs_log_force: > error -5 returned. > Mar 14 20:13:20 Bigmouth kernel: [7223497.604420] XFS (md2): xfs_log_force: > error -5 returned. > Mar 14 20:13:50 Bigmouth kernel: [7223527.707899] XFS (md2): xfs_log_force: > error -5 returned. > Mar 14 20:14:21 Bigmouth kernel: [7223557.811399] XFS (md2): xfs_log_force: > error -5 returned. > Mar 14 20:14:51 Bigmouth kernel: [7223587.914932] XFS (md2): xfs_log_force: > error -5 returned. > Mar 14 20:15:21 Bigmouth kernel: [7223618.018362] XFS (md2): xfs_log_force: > error -5 returned. > Mar 14 20:15:51 Bigmouth kernel: [7223648.121779] XFS (md2): xfs_log_force: > error -5 returned. > Mar 14 20:16:19 Bigmouth kernel: [7223676.401069] XFS (md2): xfs_log_force: > error -5 returned. > Mar 14 20:16:21 Bigmouth kernel: [7223678.225334] XFS (md2): xfs_log_force: > error -5 returned. > Mar 14 20:16:27 Bigmouth kernel: [7223684.541305] XFS (md2): xfs_log_force: > error -5 returned. > Mar 14 20:16:27 Bigmouth kernel: [7223684.572176] XFS (md2): xfs_log_force: > error -5 returned. > Mar 14 20:16:38 Bigmouth kernel: [7223694.918565] md2: unknown partition > table > Mar 14 20:16:43 Bigmouth kernel: [7223700.425290] XFS (md2): Mounting V5 > Filesystem > Mar 14 20:16:43 Bigmouth kernel: [7223700.545669] XFS (md2): Starting > recovery (logdev: internal) > Mar 14 20:16:44 Bigmouth kernel: [7223701.874245] XFS (md2): Ending recovery > (logdev: internal) > Mar 14 20:30:31 Bigmouth kernel: [7224529.528678] md2: unknown partition > table > > > > /dev/md2: > Version : 1.2 > Creation Time : Tue Oct 13 22:21:27 2015 > Raid Level : raid5 > Array Size : 5860147200 (5588.67 GiB 6000.79 GB) > Used Dev Size : 1953382400 (1862.89 GiB 2000.26 GB) > Raid Devices : 4 > Total Devices : 4 > Persistence : Superblock is persistent > > Intent Bitmap : Internal > > Update Time : Tue Apr 12 01:19:43 2016 > State : clean > Active Devices : 4 > Working Devices : 4 > Failed Devices : 0 > Spare Devices : 0 > > Layout : left-symmetric > Chunk Size : 512K > > Name : Bigmouth:2 (local to host Bigmouth) > UUID : ed979276:3459155c:a32f63da:0c684042 > Events : 62846 > > Number Major Minor RaidDevice State > 5 8 193 0 active sync /dev/sdm1 > 6 8 129 1 active sync /dev/sdi1 > 2 8 177 2 active sync /dev/sdl1 > 4 8 113 3 active sync /dev/sdh1 > > > meta-data=/dev/md2 isize=512 agcount=33, agsize=45782272 > blks > = sectsz=512 attr=2, projid32bit=1 > = crc=1 finobt=1 spinodes=0 > data = bsize=4096 blocks=1465036800, imaxpct=5 > = sunit=128 swidth=384 blks > naming =version 2 bsize=4096 ascii-ci=0 ftype=1 > log =internal bsize=4096 blocks=521728, version=2 > = sectsz=512 sunit=8 blks, lazy-count=1 > realtime =none extsz=4096 blocks=0, rtextents=0 > > > > > >> > >>Checking the drives with smartctl shows no errors nor does 'dmesg' show any > >>hardware i/o or controller related errors... > >> > >>I've tried scrubbing the array and no bad sectors are found either.. > >> > >>I'm running kernel 3.19.8 with xfsprogs 4.5. > >> > >>Thanks, > >>Andrew > >> > >>_______________________________________________ > >>xfs mailing list > >>xfs@oss.sgi.com > >>http://oss.sgi.com/mailman/listinfo/xfs > > From hack.coo@gmail.com Tue Apr 12 09:07:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,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 A2FDA7CA0 for ; Tue, 12 Apr 2016 09:07:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 38B5630405F for ; Tue, 12 Apr 2016 07:07:54 -0700 (PDT) X-ASG-Debug-ID: 1460470065-04bdf0110540f2d0001-NocioJ Received: from mail-yw0-f182.google.com (mail-yw0-f182.google.com [209.85.161.182]) by cuda.sgi.com with ESMTP id u25skcKqjlIZmalz (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 12 Apr 2016 07:07:46 -0700 (PDT) X-Barracuda-Envelope-From: hack.coo@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.161.182 Received: by mail-yw0-f182.google.com with SMTP id o66so25078154ywc.3 for ; Tue, 12 Apr 2016 07:07:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=GiShZ7gminfvxmIyjIfqTNo5QnyOMmP29UOI3W3B4VA=; b=UdvR1/XF6zF2AGZRD97/uoKEozlzJ73Qhf0A1k8fiE++tdh1Y6HdN3AU8PCaWVI59i KFOAjg1Mi9AoieHlgBokLX8ktNBoB0Ud21cH6SAbnkvk5Alz949JI8+PHWdINdVOgYDl 9IcqcSg9XWvuZTzG3Jwc8GH1iJWN/s8p0yWob5rCECaVmz1nPMwXpTugcYs4LuQrDn0W FM2zSOtCnmVN8zRw60eDkLYFf2wxeRPX3LdHnFKjSQBDYlfILoP1FgyVTQMzlyFGkLLZ tyDhq4iCgQ15tGKbMPTMTsDNTktNqoOXSTwqR8ZUhVsS2+tUlc9R6w/wXeBxT1ywlO9/ JvlQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=GiShZ7gminfvxmIyjIfqTNo5QnyOMmP29UOI3W3B4VA=; b=BglTicSZw8WVzKeQs4zpEdx5NMLchqm3HFv9Mdm6Fl7Rc8vt+v/7Q/ZIKy/AX85a6E 4Zeb/cqf7cV+5CWnHlTllItTi8H2nBgZHmOWB6d7SZjkWxLewmQov5CVrZk4wTmuFZVK smChTe2u7Bx1yDWiv5zHZLcRmAQjEzxGR6vZ1GFb0HVB5TcVGauJiTjhPnPjcRO+GgRN 35YFg2BZPAkUdIf96VWdqpwHUH8/spHgx9krAfO+2hDxFYz1RVbgGav+oeZtxaDhjv5w Nms0LYtG4PiWZyZ3z23wH4PYly6eRxW/XpG/8T1JmojkaPPm7t2p8tZO9WJHQWVNr1Yd WojA== X-Gm-Message-State: AOPr4FUP/3UNGuI1DxD8Zdj+0BhQxEb+89FfH6O4Db2VWRcZTftNjpurxd+AK3fJRcsOFaPTE5CNl8pQY8opUw== MIME-Version: 1.0 X-Received: by 10.129.119.213 with SMTP id s204mr1730758ywc.95.1460470065771; Tue, 12 Apr 2016 07:07:45 -0700 (PDT) Received: by 10.37.89.10 with HTTP; Tue, 12 Apr 2016 07:07:45 -0700 (PDT) In-Reply-To: <20160411231056.GD9088@dastard> References: <20160411231056.GD9088@dastard> Date: Tue, 12 Apr 2016 22:07:45 +0800 Message-ID: Subject: Re: about the xfs performance From: Songbo Wang X-ASG-Orig-Subj: Re: about the xfs performance To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a11490f0279db9205304a2f01 X-Barracuda-Connect: mail-yw0-f182.google.com[209.85.161.182] X-Barracuda-Start-Time: 1460470066 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC5_SA210e, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28666 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC5_SA210e Custom Rule SA210e --001a11490f0279db9205304a2f01 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hi Dave, Thank you for your reply. I did some test today and described those as follows: Delete the existing test file , and redo the test : fio -ioengine=3Dlibaio -bs=3D4k -direct=3D1 -thread -rw=3Drandwrite -size=3D50G -filename=3D/mnt/t= est -name=3D"EBS 4KB randwrite test" -iodepth=3D64 -runtime=3D60 The iops resultes is 19k=C2=B1(per second); I continue to fio this test fi= le untill it was filled to the full. Then I did another test using the same test case, the results was 210k=C2=B1(per second).(The results mentioned yesterday was partial. I used the same test file several times, the results degraded because of the test file was not fill to the full) I try to remake the filesystem using the following command to increase the internal log size , inode size and agcount num: mkfs.xfs /dev/hioa2 -f -n size=3D64k -i size=3D2048,align=3D1 -d agcount=3D= 2045 -l size=3D512m but it has no help to the result. Any suggestion to deal with this problems ? I very appreciate your feedback. songbo 2016-04-12 7:10 GMT+08:00 Dave Chinner : > On Mon, Apr 11, 2016 at 10:14:06PM +0800, Songbo Wang wrote: > > Hi xfsers: > > > > I got some troubles on the performance of xfs. > > The environment is , > > xfs version is 3.2.1, > > centos 7.1, > > kernel version:3.10.0-229.el7.x86_64. > > pcie-ssd card, > > mkfs: mkfs.xfs /dev/hioa2 -f -n size=3D64k -i size=3D512 -d agcoun= t=3D40 > -l > > size=3D1024m. > > mount: mount /dev/hioa2 /mnt/ -t xfs -o > > > rw,noexec,nodev,noatime,nodiratime,nobarrier,discard,inode64,logbsize=3D2= 56k,delaylog > > I use the following command to test iops: fio -ioengine=3Dlibaio -bs=3D= 4k > > -direct=3D1 -thread -rw=3Drandwrite -size=3D50G -filename=3D/mnt/test -= name=3D"EBS > > 4KB randwrite test" -iodepth=3D64 -runtime=3D60 > > The results is normal at the beginning which is about 210k=C2=B1=EF=BC= =8Cbut some > > seconds later, the results down to 19k=C2=B1. > > Looks like the workload runs out of log space due to all the > allocation transactions being logged, which then causes new > transactions to start tail pushing the log to flush dirty metadata. > This is needed to to make more space in the log for on incoming dio > writes that require allocation transactions. This will block IO > submission until there is space available in the log. > > Let's face it, all that test does is create a massively fragmented > 50GB file, so you're going to have a lot of metadata to log. Do the > maths - if it runs at 200kiops for a few seconds, it's created a > million extents. > > And it's doing random insert on the extent btree, so > it's repeatedly dirtying the entire extent btree. This will trigger > journal commits quite frequently as this is a large amount of > metadata that is being dirtied. e.g. at 500 extent records per 4k > block, a million extents will require 2000 leaf blocks to store them > all. That's 80MB of metadata per million extents that this workload > is generating and repeatedly dirtying. > > Then there's also other metadata, like the free space btrees, that > is also being repeatedly dirtied, etc, so it would not be unexpected > to see a workload like this on high IOPS devices allocating 100MB of > metadata every few seconds and the amount being journalled steadily > increasing until the file is fully populated. > > > I did a senond test , > > umount the /dev/hioa2, > > fio -ioengine=3Dlibaio -bs=3D4k -direct=3D1 -thread -rw=3Drandwri= te > > -filename=3D/dev/hioa2 -name=3D"EBS 8KB randwrite test" -iodepth=3D64 > -runtime=3D60 > > The results was normal, the iops is about 210k=C2=B1 all the time. > > That's not an equivalent test - it's being run direct to the block > device, not to a file on the filesytem on the block device, and so > you won't see artifacts taht are a result of creating worst case > file fragmentation.... > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --001a11490f0279db9205304a2f01 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
    Hi Dave,

    Thank you for your reply. I di= d some test today and described those as follows:

    = Delete the existing = test file , and redo the test :=C2=A0fio -ioengine=3Dlibaio -bs=3D4k=C2=A0-direct=3D1 -thread -rw=3Drand= write -size=3D50G -filename=3D/mnt/test -name=3D"EBS=C2=A04KB randwrite test" -iode= pth=3D64 -runtime=3D60
    The iops resultes is 19k=C2=B1(per second); =C2=A0I continue to fio this test file untill it was= filled to the full. Then I did another test using the same test case, the = results was 210k=C2=B1(per second).(The results mentioned yesterday was=C2= =A0partial.= =C2=A0 I used the same test file several times,=C2=A0the results degraded because of the test file was no= t fill to the full= )=C2=A0

    I try to remake the filesystem using the following comm= and to increase the internal log size , inode size and agcount num:<= /font>
    mkf= s.xfs /dev/hioa2 -f -n size=3D64k -i size=3D2048,align=3D1 -d agcount=3D204= 5 -l size=3D512m
    but it has no help to the result.
    <= div>

    Any suggestion to deal with this problems ?
    =
    I very appreciate your feedback.
    =C2=A0 =C2=A0=C2=A0
    songbo

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


    2016-04-12 7:10 GMT+08:00= Dave Chinner <david@fromorbit.com>:
    On Mon, Apr 11, 2016 at 10:14:06PM +0800, So= ngbo Wang wrote:
    > Hi xfsers:
    >
    > I got some troubles on the performance of=C2=A0 xfs.
    > The environment is ,
    >=C2=A0 =C2=A0 =C2=A0 xfs version is 3.2.1,
    >=C2=A0 =C2=A0 =C2=A0 centos 7.1,
    >=C2=A0 =C2=A0 =C2=A0 kernel version:3.10.0-229.el7.x86_64.
    >=C2=A0 =C2=A0 =C2=A0 pcie-ssd card,
    >=C2=A0 =C2=A0 =C2=A0 mkfs: mkfs.xfs /dev/hioa2 -f -n size=3D64k -i size= =3D512 -d agcount=3D40 -l
    > size=3D1024m.
    >=C2=A0 =C2=A0 =C2=A0 mount: mount /dev/hioa2 /mnt/=C2=A0 -t xfs -o
    > rw,noexec,nodev,noatime,nodiratime,nobarrier,discard,inode64,logbsize= =3D256k,delaylog
    > I use the following command to test iops: fio -ioengine=3Dlibaio -bs= =3D4k
    > -direct=3D1 -thread -rw=3Drandwrite -size=3D50G -filename=3D/mnt/test = -name=3D"EBS
    > 4KB randwrite test" -iodepth=3D64 -runtime=3D60
    > The results is normal at the beginning which is about 210k=C2=B1=EF=BC= =8Cbut some
    > seconds later, the results down to 19k=C2=B1.

    Looks like the workload runs out of log space due to all the
    allocation transactions being logged, which then causes new
    transactions to start tail pushing the log to flush dirty metadata.
    This is needed to to make more space in the log for on incoming dio
    writes that require allocation transactions. This will block IO
    submission until there is space available in the log.

    Let's face it, all that test does is create a massively fragmented
    50GB file, so you're going to have a lot of metadata to log. Do the
    maths - if it runs at 200kiops for a few seconds, it's created a
    million extents.

    And it's doing random insert on the extent btree, so
    it's repeatedly dirtying the entire extent btree. This will trigger
    journal commits quite frequently as this is a large amount of
    metadata that is being dirtied. e.g. at 500 extent records per 4k
    block, a million extents will require 2000 leaf blocks to store them
    all. That's 80MB of metadata per million extents that this workload
    is generating and repeatedly dirtying.

    Then there's also other metadata, like the free space btrees, that
    is also being repeatedly dirtied, etc, so it would not be unexpected
    to see a workload like this on high IOPS devices allocating 100MB of
    metadata every few seconds and the amount being journalled steadily
    increasing until the file is fully populated.

    > I did a senond test ,
    >=C2=A0 =C2=A0 =C2=A0 umount the /dev/hioa2,
    >=C2=A0 =C2=A0 =C2=A0 fio -ioengine=3Dlibaio -bs=3D4k -direct=3D1=C2=A0 = -thread -rw=3Drandwrite
    > -filename=3D/dev/hioa2=C2=A0 -name=3D"EBS 8KB randwrite test"= ; -iodepth=3D64 -runtime=3D60
    > The results was normal, the iops is about 210k=C2=B1 all the time.

    That's not an equivalent test - it's being run direct to the= block
    device, not to a file on the filesytem on the block device, and so
    you won't see artifacts taht are a result of creating worst case
    file fragmentation....

    Cheers,

    Dave.
    --
    Dave Chinner
    david@fromorbit.com

    --001a11490f0279db9205304a2f01-- From bfoster@redhat.com Tue Apr 12 11:42:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 08DA57CA0 for ; Tue, 12 Apr 2016 11:42:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CC97D30406B for ; Tue, 12 Apr 2016 09:42:56 -0700 (PDT) X-ASG-Debug-ID: 1460479375-04cbb02e1bff4b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id A9sdyN7gFcoIVCyg (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 09:42:55 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id EDA837F36F; Tue, 12 Apr 2016 16:42:54 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-153.bos.redhat.com [10.18.41.153]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3CGgsQa003663; Tue, 12 Apr 2016 12:42:54 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 5D15512543E; Tue, 12 Apr 2016 12:42:53 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Cc: linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, dm-devel@redhat.com, Mike Snitzer Subject: [RFC v2 PATCH 04/10] dm: add methods to set and get reserved space Date: Tue, 12 Apr 2016 12:42:47 -0400 X-ASG-Orig-Subj: [RFC v2 PATCH 04/10] dm: add methods to set and get reserved space Message-Id: <1460479373-63317-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1460479373-63317-1-git-send-email-bfoster@redhat.com> References: <1460479373-63317-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: 1460479375 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Snitzer [BF: Condensed to single function.] Signed-off-by: Mike Snitzer --- drivers/md/dm.c | 41 +++++++++++++++++++++++++++++++++++++++++ include/linux/device-mapper.h | 5 +++++ 2 files changed, 46 insertions(+) diff --git a/drivers/md/dm.c b/drivers/md/dm.c index be49057..8f95e78 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -664,6 +664,46 @@ out: return r; } +/* + * FIXME: factor out common helper that can be used by + * multiple block_device_operations -> target methods + * (including dm_blk_ioctl above) + */ + +static int dm_blk_reserve_space(struct block_device *bdev, int mode, + sector_t offset, sector_t len, sector_t *res) +{ + struct mapped_device *md = bdev->bd_disk->private_data; + int srcu_idx; + struct dm_table *map; + struct dm_target *tgt; + int r = -EINVAL; + + map = dm_get_live_table(md, &srcu_idx); + + if (!map || !dm_table_get_size(map)) + goto out; + + /* We only support devices that have a single target */ + if (dm_table_get_num_targets(map) != 1) + goto out; + + tgt = dm_table_get_target(map, 0); + if (!tgt->type->reserve_space) + goto out; + + if (dm_suspended_md(md)) { + r = -EAGAIN; + goto out; + } + + r = tgt->type->reserve_space(tgt, mode, offset, len, res); +out: + dm_put_live_table(md, srcu_idx); + + return r; +} + static struct dm_io *alloc_io(struct mapped_device *md) { return mempool_alloc(md->io_pool, GFP_NOIO); @@ -3723,6 +3763,7 @@ static const struct block_device_operations dm_blk_dops = { .ioctl = dm_blk_ioctl, .getgeo = dm_blk_getgeo, .pr_ops = &dm_pr_ops, + .reserve_space = dm_blk_reserve_space, .owner = THIS_MODULE }; diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h index 0830c9e..b4825db 100644 --- a/include/linux/device-mapper.h +++ b/include/linux/device-mapper.h @@ -116,6 +116,10 @@ typedef void (*dm_io_hints_fn) (struct dm_target *ti, */ typedef int (*dm_busy_fn) (struct dm_target *ti); +typedef int (*dm_reserve_space_fn) (struct dm_target *ti, int mode, + sector_t offset, sector_t len, + sector_t *res); + void dm_error(const char *message); struct dm_dev { @@ -162,6 +166,7 @@ struct target_type { dm_busy_fn busy; dm_iterate_devices_fn iterate_devices; dm_io_hints_fn io_hints; + dm_reserve_space_fn reserve_space; /* For internal device-mapper use. */ struct list_head list; -- 2.4.11 From bfoster@redhat.com Tue Apr 12 11:42:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 83AE37CA2 for ; Tue, 12 Apr 2016 11:42:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 535978F8033 for ; Tue, 12 Apr 2016 09:42:57 -0700 (PDT) X-ASG-Debug-ID: 1460479375-04cbb02e1cff4b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Cs6d1shbyQ6oQOhV (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 09:42:55 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id DD6867F368; Tue, 12 Apr 2016 16:42:54 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-153.bos.redhat.com [10.18.41.153]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3CGgsiM019010; Tue, 12 Apr 2016 12:42:54 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 39E07122F17; Tue, 12 Apr 2016 12:42:53 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Cc: linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, dm-devel@redhat.com Subject: [RFC v2 PATCH 01/10] xfs: refactor xfs_reserve_blocks() to handle ENOSPC correctly Date: Tue, 12 Apr 2016 12:42:44 -0400 X-ASG-Orig-Subj: [RFC v2 PATCH 01/10] xfs: refactor xfs_reserve_blocks() to handle ENOSPC correctly Message-Id: <1460479373-63317-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1460479373-63317-1-git-send-email-bfoster@redhat.com> References: <1460479373-63317-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: 1460479375 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_reserve_blocks() is responsible to update the XFS reserved block pool count at mount time or based on user request. When the caller requests to increase the reserve pool, blocks must be allocated from the global counters such that they are no longer available for general purpose use. If the requested reserve pool size is too large, XFS reserves what blocks are available. The implementation requires looking at the percpu counters and making an educated guess as to how many blocks to try and allocate from xfs_mod_fdblocks(), which can return -ENOSPC if the guess was not accurate due to counters being modified in parallel. xfs_reserve_blocks() retries the guess in this scenario until the allocation succeeds or it is determined that there is no space available in the fs. While not easily reproducible in the current form, the retry code doesn't actually work correctly if xfs_mod_fdblocks() actually fails. The problem is that the percpu calculations use the m_resblks counter to determine how many blocks to allocate, but unconditionally update m_resblks before the block allocation has actually succeeded. Therefore, if xfs_mod_fdblocks() fails, the code jumps to the retry label and uses the already updated m_resblks value to determine how many blocks to try and allocate. If the percpu counters previously suggested that the entire request was available, fdblocks_delta could end up set to 0. In that case, m_resblks is updated to the requested value, yet no blocks have been reserved at all. Refactor xfs_reserve_blocks() to use an explicit loop and make the code easier to follow. Since we have to drop the spinlock across the xfs_mod_fdblocks() call, use a delta value for m_resblks as well and only apply the delta once allocation succeeds. Signed-off-by: Brian Foster --- fs/xfs/xfs_fsops.c | 105 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 60 insertions(+), 45 deletions(-) diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index ee3aaa0a..87d4b1b 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -671,8 +671,11 @@ xfs_reserve_blocks( __uint64_t *inval, xfs_fsop_resblks_t *outval) { - __int64_t lcounter, delta, fdblks_delta; + __int64_t lcounter, delta; + __int64_t fdblks_delta = 0; __uint64_t request; + __int64_t free; + int error = 0; /* If inval is null, report current values and return */ if (inval == (__uint64_t *)NULL) { @@ -686,24 +689,23 @@ xfs_reserve_blocks( request = *inval; /* - * With per-cpu counters, this becomes an interesting - * problem. we needto work out if we are freeing or allocation - * blocks first, then we can do the modification as necessary. + * With per-cpu counters, this becomes an interesting problem. we need + * to work out if we are freeing or allocation blocks first, then we can + * do the modification as necessary. * - * We do this under the m_sb_lock so that if we are near - * ENOSPC, we will hold out any changes while we work out - * 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 do this under the m_sb_lock so that if we are near ENOSPC, we will + * hold out any changes while we work out 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. */ -retry: spin_lock(&mp->m_sb_lock); /* * If our previous reservation was larger than the current value, - * then move any unused blocks back to the free pool. + * then move any unused blocks back to the free pool. Modify the resblks + * counters directly since we shouldn't have any problems unreserving + * space. */ - fdblks_delta = 0; if (mp->m_resblks > request) { lcounter = mp->m_resblks_avail - request; if (lcounter > 0) { /* release unused blocks */ @@ -711,54 +713,67 @@ retry: mp->m_resblks_avail -= lcounter; } mp->m_resblks = request; - } else { - __int64_t free; + if (fdblks_delta) { + spin_unlock(&mp->m_sb_lock); + error = xfs_mod_fdblocks(mp, fdblks_delta, 0); + spin_lock(&mp->m_sb_lock); + } + + goto out; + } + /* + * If the request is larger than the current reservation, reserve the + * blocks before we update the reserve counters. Sample m_fdblocks and + * perform a partial reservation if the request exceeds free space. + */ + error = -ENOSPC; + while (error == -ENOSPC) { free = percpu_counter_sum(&mp->m_fdblocks) - XFS_ALLOC_SET_ASIDE(mp); if (!free) - goto out; /* ENOSPC and fdblks_delta = 0 */ + break; delta = request - mp->m_resblks; lcounter = free - delta; - if (lcounter < 0) { + if (lcounter < 0) /* We can't satisfy the request, just get what we can */ - mp->m_resblks += free; - mp->m_resblks_avail += free; - fdblks_delta = -free; - } else { - fdblks_delta = -delta; - mp->m_resblks = request; - mp->m_resblks_avail += delta; - } - } -out: - if (outval) { - outval->resblks = mp->m_resblks; - outval->resblks_avail = mp->m_resblks_avail; - } - spin_unlock(&mp->m_sb_lock); + fdblks_delta = free; + else + fdblks_delta = delta; - if (fdblks_delta) { /* - * If we are putting blocks back here, m_resblks_avail is - * already at its max so this will put it in the free pool. - * - * If we need space, we'll either succeed in getting it - * from the free block count or we'll get an enospc. If - * we get a ENOSPC, it means things changed while we were - * calculating fdblks_delta and so we should try again to - * see if there is anything left to reserve. + * We'll either succeed in getting space from the free block + * count or we'll get an ENOSPC. If we get a ENOSPC, it means + * things changed while we were calculating fdblks_delta and so + * we should try again to see if there is anything left to + * reserve. * * Don't set the reserved flag here - we don't want to reserve * the extra reserve blocks from the reserve..... */ - int error; - error = xfs_mod_fdblocks(mp, fdblks_delta, 0); - if (error == -ENOSPC) - goto retry; + spin_unlock(&mp->m_sb_lock); + error = xfs_mod_fdblocks(mp, -fdblks_delta, 0); + spin_lock(&mp->m_sb_lock); } - return 0; + + /* + * Update the reserve counters if blocks have been successfully + * allocated. + */ + if (!error && fdblks_delta) { + mp->m_resblks += fdblks_delta; + mp->m_resblks_avail += fdblks_delta; + } + +out: + if (outval) { + outval->resblks = mp->m_resblks; + outval->resblks_avail = mp->m_resblks_avail; + } + + spin_unlock(&mp->m_sb_lock); + return error; } int -- 2.4.11 From bfoster@redhat.com Tue Apr 12 11:42:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0A93F7CA1 for ; Tue, 12 Apr 2016 11:42:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id CE4C1304070 for ; Tue, 12 Apr 2016 09:42:56 -0700 (PDT) X-ASG-Debug-ID: 1460479374-04cb6c2462418660001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id TWkoDGu7Otwt2lqA (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 09:42:55 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D248180F67; Tue, 12 Apr 2016 16:42:54 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-153.bos.redhat.com [10.18.41.153]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3CGgscm027787; Tue, 12 Apr 2016 12:42:54 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 2B656125438; Tue, 12 Apr 2016 12:42:53 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Cc: linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, dm-devel@redhat.com Subject: [RFC v2 PATCH 00/10] dm-thin/xfs: prototype a block reservation allocation model Date: Tue, 12 Apr 2016 12:42:43 -0400 X-ASG-Orig-Subj: [RFC v2 PATCH 00/10] dm-thin/xfs: prototype a block reservation allocation model Message-Id: <1460479373-63317-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: 1460479375 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, This is v2 of the XFS and block device reservation experiment. The significant changes in v2 are that the bdev interface has been condensed to a single callback function, the XFS transaction reservation management has been reworked to make transactions responsible for tracking and releasing excess reservation (for non-delalloc cases) and a workaround for the fallocate over-reservation issue is included. Beyond that, this version adds a bunch of miscellaneous cleanups and fixes some of the nastier locking/leak issues present in the first rfc. Patches 1-2 refactor some XFS reserve pool and block accounting code in preparation for subsequent patches. Patches 3-5 add block/device-mapper reservation support. Patches 6-10 add the core reservation infrastructure and management bits to XFS. See the link to the original rfc below for instructions and further details around the purpose of this series. Finally, note that this is still highly experimental/theoretical and should not be used on production systems. Thoughts, reviews, flames appreciated. Brian rfcv2: - Rebased to 4.6.0-rc3. - Fix compile warnings reported by kbuild. - Fix reservation leakage on fs ENOSPC. - Fix mod_fdblocks locking to avoid BUG() (still racy). - Fix XFS reserve block ENOSPC handling. - Kill block wrappers, condense get/set/provision to a single callback. - Update XFS transaction to track reservation, don't release excess on provision. - Add transaction noblkres mode, use for fallocate reservation optimization. rfc: http://oss.sgi.com/pipermail/xfs/2016-March/047673.html Brian Foster (7): xfs: refactor xfs_reserve_blocks() to handle ENOSPC correctly xfs: replace xfs_mod_fdblocks() bool param with flags xfs: thin block device reservation mechanism xfs: adopt a reserved allocation model on dm-thin devices xfs: handle bdev reservation ENOSPC correctly from XFS reserved pool xfs: support no block reservation transaction mode xfs: use contiguous bdev reservation for file preallocation Joe Thornber (1): dm thin: add methods to set and get reserved space Mike Snitzer (2): block: add block_device_operations methods to set and get reserved space dm: add methods to set and get reserved space drivers/md/dm-thin.c | 181 +++++++++++++++++++++++++++-- drivers/md/dm.c | 41 +++++++ fs/xfs/Makefile | 1 + fs/xfs/libxfs/xfs_alloc.c | 25 ++++ fs/xfs/libxfs/xfs_bmap.c | 17 ++- fs/xfs/libxfs/xfs_shared.h | 2 + fs/xfs/xfs_bmap_util.c | 29 ++++- fs/xfs/xfs_fsops.c | 128 ++++++++++++++------- fs/xfs/xfs_mount.c | 106 +++++++++++++++-- fs/xfs/xfs_mount.h | 12 +- fs/xfs/xfs_thin.c | 260 ++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_thin.h | 31 +++++ fs/xfs/xfs_trace.h | 27 +++++ fs/xfs/xfs_trans.c | 94 +++++++++++++-- fs/xfs/xfs_trans.h | 1 + include/linux/blkdev.h | 6 + include/linux/device-mapper.h | 5 + 17 files changed, 880 insertions(+), 86 deletions(-) create mode 100644 fs/xfs/xfs_thin.c create mode 100644 fs/xfs/xfs_thin.h -- 2.4.11 From bfoster@redhat.com Tue Apr 12 11:42:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B18B87CA0 for ; Tue, 12 Apr 2016 11:42:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 839B5304059 for ; Tue, 12 Apr 2016 09:42:57 -0700 (PDT) X-ASG-Debug-ID: 1460479375-04cbb02e1dff4b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gl7hA8j6mP04DzjG (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 09:42:55 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id DA191C05E169; Tue, 12 Apr 2016 16:42:54 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-153.bos.redhat.com [10.18.41.153]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3CGgs6h024193; Tue, 12 Apr 2016 12:42:54 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 44503125439; Tue, 12 Apr 2016 12:42:53 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Cc: linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, dm-devel@redhat.com Subject: [RFC v2 PATCH 02/10] xfs: replace xfs_mod_fdblocks() bool param with flags Date: Tue, 12 Apr 2016 12:42:45 -0400 X-ASG-Orig-Subj: [RFC v2 PATCH 02/10] xfs: replace xfs_mod_fdblocks() bool param with flags Message-Id: <1460479373-63317-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1460479373-63317-1-git-send-email-bfoster@redhat.com> References: <1460479373-63317-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: 1460479375 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_mod_fdblocks() takes a boolean parameter to indicate whether the requested allocation can dip into the XFS reserve block pool, if necessary, to satisfy the allocation. This function will also require caller control over block device reservation. In preparation, convert the bool parameter to a flags parameter and update all callers to use the appropriate reserved pool flag as appropriate. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_bmap.c | 17 ++++++++--------- fs/xfs/xfs_mount.c | 3 ++- fs/xfs/xfs_mount.h | 4 +++- fs/xfs/xfs_trans.c | 21 ++++++++++++++------- 4 files changed, 27 insertions(+), 18 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index ce41d7f..1a805b0 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -2186,7 +2186,7 @@ xfs_bmap_add_extent_delay_real( (bma->cur ? bma->cur->bc_private.b.allocated : 0)); if (diff > 0) { error = xfs_mod_fdblocks(bma->ip->i_mount, - -((int64_t)diff), false); + -((int64_t)diff), 0); ASSERT(!error); if (error) goto done; @@ -2238,7 +2238,7 @@ xfs_bmap_add_extent_delay_real( ASSERT(temp <= da_old); if (temp < da_old) xfs_mod_fdblocks(bma->ip->i_mount, - (int64_t)(da_old - temp), false); + (int64_t)(da_old - temp), 0); } /* clear out the allocated field, done with it now in any case. */ @@ -2916,8 +2916,7 @@ xfs_bmap_add_extent_hole_delay( } if (oldlen != newlen) { ASSERT(oldlen > newlen); - xfs_mod_fdblocks(ip->i_mount, (int64_t)(oldlen - newlen), - false); + xfs_mod_fdblocks(ip->i_mount, (int64_t)(oldlen - newlen), 0); /* * Nothing to do for disk quota accounting here. */ @@ -4149,13 +4148,13 @@ xfs_bmapi_reserve_delalloc( if (rt) { error = xfs_mod_frextents(mp, -((int64_t)extsz)); } else { - error = xfs_mod_fdblocks(mp, -((int64_t)alen), false); + error = xfs_mod_fdblocks(mp, -((int64_t)alen), 0); } if (error) goto out_unreserve_quota; - error = xfs_mod_fdblocks(mp, -((int64_t)indlen), false); + error = xfs_mod_fdblocks(mp, -((int64_t)indlen), 0); if (error) goto out_unreserve_blocks; @@ -4184,7 +4183,7 @@ out_unreserve_blocks: if (rt) xfs_mod_frextents(mp, extsz); else - xfs_mod_fdblocks(mp, alen, false); + xfs_mod_fdblocks(mp, alen, 0); out_unreserve_quota: if (XFS_IS_QUOTA_ON(mp)) xfs_trans_unreserve_quota_nblks(NULL, ip, (long)alen, 0, rt ? @@ -5093,7 +5092,7 @@ xfs_bmap_del_extent( */ ASSERT(da_old >= da_new); if (da_old > da_new) - xfs_mod_fdblocks(mp, (int64_t)(da_old - da_new), false); + xfs_mod_fdblocks(mp, (int64_t)(da_old - da_new), 0); done: *logflagsp = flags; return error; @@ -5413,7 +5412,7 @@ xfs_bunmapi( goto error0; if (!isrt && wasdel) - xfs_mod_fdblocks(mp, (int64_t)del.br_blockcount, false); + xfs_mod_fdblocks(mp, (int64_t)del.br_blockcount, 0); bno = del.br_startoff - 1; nodelete: diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index cfd4210..50a6ccc 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1150,11 +1150,12 @@ int xfs_mod_fdblocks( struct xfs_mount *mp, int64_t delta, - bool rsvd) + uint32_t flags) { int64_t lcounter; long long res_used; s32 batch; + bool rsvd = (flags & XFS_FDBLOCKS_RSVD); if (delta > 0) { /* diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index eafe257..bd1043f 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -347,8 +347,10 @@ extern void xfs_unmountfs(xfs_mount_t *); extern int xfs_mod_icount(struct xfs_mount *mp, int64_t delta); extern int xfs_mod_ifree(struct xfs_mount *mp, int64_t delta); + +#define XFS_FDBLOCKS_RSVD (1 << 0) extern int xfs_mod_fdblocks(struct xfs_mount *mp, int64_t delta, - bool reserved); + uint32_t flags); extern int xfs_mod_frextents(struct xfs_mount *mp, int64_t delta); extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 20c5366..8aa9d9a 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -172,8 +172,11 @@ xfs_trans_reserve( uint blocks, uint rtextents) { - int error = 0; - bool rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0; + int error = 0; + int flags = 0; + + if (tp->t_flags & XFS_TRANS_RESERVE) + flags |= XFS_FDBLOCKS_RSVD; /* Mark this thread as being in a transaction */ current_set_flags_nested(&tp->t_pflags, PF_FSTRANS); @@ -184,7 +187,8 @@ xfs_trans_reserve( * fail if the count would go below zero. */ if (blocks > 0) { - error = xfs_mod_fdblocks(tp->t_mountp, -((int64_t)blocks), rsvd); + error = xfs_mod_fdblocks(tp->t_mountp, -((int64_t)blocks), + flags); if (error != 0) { current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); return -ENOSPC; @@ -259,7 +263,7 @@ undo_log: undo_blocks: if (blocks > 0) { - xfs_mod_fdblocks(tp->t_mountp, -((int64_t)blocks), rsvd); + xfs_mod_fdblocks(tp->t_mountp, -((int64_t)blocks), flags); tp->t_blk_res = 0; } @@ -543,12 +547,15 @@ xfs_trans_unreserve_and_mod_sb( struct xfs_trans *tp) { 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; + int flags = 0; + + if (tp->t_flags & XFS_TRANS_RESERVE) + flags |= XFS_FDBLOCKS_RSVD; /* calculate deltas */ if (tp->t_blk_res > 0) @@ -572,7 +579,7 @@ xfs_trans_unreserve_and_mod_sb( /* apply the per-cpu counters */ if (blkdelta) { - error = xfs_mod_fdblocks(mp, blkdelta, rsvd); + error = xfs_mod_fdblocks(mp, blkdelta, flags); if (error) goto out; } @@ -680,7 +687,7 @@ out_undo_icount: xfs_mod_icount(mp, -idelta); out_undo_fdblocks: if (blkdelta) - xfs_mod_fdblocks(mp, -blkdelta, rsvd); + xfs_mod_fdblocks(mp, -blkdelta, flags); out: ASSERT(error == 0); return; -- 2.4.11 From bfoster@redhat.com Tue Apr 12 11:42:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5A6857CA2 for ; Tue, 12 Apr 2016 11:42:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2DAB08F8033 for ; Tue, 12 Apr 2016 09:42:58 -0700 (PDT) X-ASG-Debug-ID: 1460479375-04cbb02e1cff4c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id FkZB0omXHxm8zUgO (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 09:42:56 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 77994627DA; Tue, 12 Apr 2016 16:42:55 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-153.bos.redhat.com [10.18.41.153]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3CGgs8P027793; Tue, 12 Apr 2016 12:42:55 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 7CFAD125446; Tue, 12 Apr 2016 12:42:53 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Cc: linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, dm-devel@redhat.com Subject: [RFC v2 PATCH 06/10] xfs: thin block device reservation mechanism Date: Tue, 12 Apr 2016 12:42:49 -0400 X-ASG-Orig-Subj: [RFC v2 PATCH 06/10] xfs: thin block device reservation mechanism Message-Id: <1460479373-63317-7-git-send-email-bfoster@redhat.com> In-Reply-To: <1460479373-63317-1-git-send-email-bfoster@redhat.com> References: <1460479373-63317-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 12 Apr 2016 16:42:55 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460479375 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add block device reservation infrastructure to XFS. This primarily consists of wrappers around the associated block device functions. This mechanism provides the ability to reserve, release and provision a set of blocks in the underlying block device. Block device reservation enables the filesystem to adopt an allocation model that guarantees physical blocks are available for operations on block devices where this is currently not the case (i.e., thin devices). Without such guarantees, overprovisioning of a thin block device results in a read-only state transition and possible shutdown of the fs. Reservation allows the fs to detect when space is not available in the underlying device, avoid the conditions that lead to read-only state transitions and handle the situation gracefully by returning -ENOSPC to userspace. Signed-off-by: Brian Foster --- fs/xfs/Makefile | 1 + fs/xfs/xfs_mount.h | 5 ++ fs/xfs/xfs_thin.c | 260 +++++++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_thin.h | 31 +++++++ fs/xfs/xfs_trace.h | 27 ++++++ 5 files changed, 324 insertions(+) create mode 100644 fs/xfs/xfs_thin.c create mode 100644 fs/xfs/xfs_thin.h diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index 3542d94..b394db7 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -88,6 +88,7 @@ xfs-y += xfs_aops.o \ xfs_super.o \ xfs_symlink.o \ xfs_sysfs.o \ + xfs_thin.o \ xfs_trans.o \ xfs_xattr.o \ kmem.o \ diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index bd1043f..8d54c56 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -148,6 +148,11 @@ typedef struct xfs_mount { */ __uint32_t m_generation; + bool m_thin_reserve; + struct mutex m_thin_res_lock; + uint32_t m_thin_sectpb; + sector_t m_thin_res; + #ifdef DEBUG /* * DEBUG mode instrumentation to test and/or trigger delayed allocation diff --git a/fs/xfs/xfs_thin.c b/fs/xfs/xfs_thin.c new file mode 100644 index 0000000..16e9a03 --- /dev/null +++ b/fs/xfs/xfs_thin.c @@ -0,0 +1,260 @@ +/* + * Copyright (c) 2016 Red Hat, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include "xfs.h" +#include "xfs_fs.h" +#include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" +#include "xfs_bit.h" +#include "xfs_sb.h" +#include "xfs_mount.h" +#include "xfs_da_format.h" +#include "xfs_da_btree.h" +#include "xfs_inode.h" +#include "xfs_dir2.h" +#include "xfs_ialloc.h" +#include "xfs_alloc.h" +#include "xfs_rtalloc.h" +#include "xfs_bmap.h" +#include "xfs_trans.h" +#include "xfs_trans_priv.h" +#include "xfs_log.h" +#include "xfs_error.h" +#include "xfs_quota.h" +#include "xfs_fsops.h" +#include "xfs_trace.h" +#include "xfs_icache.h" +#include "xfs_sysfs.h" +/* XXX: above copied from xfs_mount.c */ +#include "xfs_thin.h" + +/* + * Notes/Issues: + * + * - Reservation support depends on the '-o discard' mount option so freed + * extents are returned to the pool. Note that online discard has not been + * totally reliable in terms of returning freed space to the thin pool. Use + * fstrim as a workaround. + * - The bdev reservation API receives an absolute value reservation from the + * caller as opposed to a delta value. The latter is probably more ideal, but + * the former helps us use the XFS reserve pool as a broad protection layer + * for any potential leaks. For example, free list blocks used for btree + * growth are currently not reserved. With a delta API, _any_ unreserved + * allocations from the fs will slowly and permanently leak the reservation as + * tracked by the bdev. The abs value mechanism covers this kind of slop based + * on the locally maintained reservation. + * - What might be ideal to support a delta reservation API is a model (or + * test mode) that requires a reservation to be attached or somehow + * associated with every bdev allocation when the reserve feature is + * enabled (or one that disables allocation via writes altogether in favor + * of provision calls). Otherwise, any unreserved allocation returns an I/O + * error. Such deterministic behavior helps ensure general testing detects + * problems more reliably. + * - Worst case reservation means each XFS filesystem block is considered a new + * dm block allocation. This translates to a significant amount of space given + * larger dm block sizes. For example, 4k XFS blocks to 64k dm blocks means + * we'll hit ENOSPC sooner and more frequently than typically expected. + * - The xfs_mod_fdblocks() implementation means the XFS reserve pool blocks are + * also reserved from the thin pool. XFS defaults to 8192 reserve pool blocks + * in most cases, which translates to 512MB of reserved space. This can be + * tuned with: 'xfs_io -xc "resblks " '. Note that insufficient + * reserves will result in errors in unexpected areas of code (e.g., page + * discards on writeback, inode unlinked list removal failures, etc.). + */ + +static inline int +bdev_reserve_space( + struct xfs_mount *mp, + int mode, + sector_t offset, + sector_t len, + sector_t *res) +{ + struct block_device *bdev; + const struct block_device_operations *ops; + + bdev = mp->m_ddev_targp->bt_bdev; + ops = bdev->bd_disk->fops; + + return ops->reserve_space(bdev, mode, offset, len, res); +} + +/* + * Reserve blocks from the underlying block device. + */ +int +xfs_thin_reserve( + struct xfs_mount *mp, + sector_t bb) +{ + int error; + sector_t res; + + mutex_lock(&mp->m_thin_res_lock); + + res = mp->m_thin_res + bb; + error = bdev_reserve_space(mp, BDEV_RES_MOD, 0, 0, &res); + if (error) { + if (error == -ENOSPC) + trace_xfs_thin_reserve_enospc(mp, mp->m_thin_res, bb); + goto out; + } + + trace_xfs_thin_reserve(mp, mp->m_thin_res, bb); + mp->m_thin_res += bb; + +out: + mutex_unlock(&mp->m_thin_res_lock); + return error; +} + +static int +__xfs_thin_unreserve( + struct xfs_mount *mp, + sector_t bb) +{ + int error; + sector_t res; + + if (bb > mp->m_thin_res) { + WARN(1, "unres (%llu) exceeds current res (%llu)", + (uint64_t) bb, (uint64_t) mp->m_thin_res); + bb = mp->m_thin_res; + } + + res = mp->m_thin_res - bb; + error = bdev_reserve_space(mp, BDEV_RES_MOD, 0, 0, &res); + if (error) + return error;; + + trace_xfs_thin_unreserve(mp, mp->m_thin_res, bb); + mp->m_thin_res -= bb; + + return error; +} + +/* + * Release a reservation back to the block device. + */ +int +xfs_thin_unreserve( + struct xfs_mount *mp, + sector_t res) +{ + int error; + + mutex_lock(&mp->m_thin_res_lock); + error = __xfs_thin_unreserve(mp, res); + mutex_unlock(&mp->m_thin_res_lock); + + return error; +} + +/* + * Given a recently allocated extent, ask the block device to provision the + * underlying space. + */ +int +xfs_thin_provision( + struct xfs_mount *mp, + xfs_fsblock_t offset, + xfs_fsblock_t len, + sector_t *res) +{ + sector_t ores = *res; + sector_t bbstart, bblen; + int error; + + bbstart = XFS_FSB_TO_DADDR(mp, offset); + bbstart = round_down(bbstart, mp->m_thin_sectpb); + bblen = XFS_FSB_TO_BB(mp, len); + bblen = round_up(bblen, mp->m_thin_sectpb); + + mutex_lock(&mp->m_thin_res_lock); + + WARN_ON(bblen > mp->m_thin_res); + + error = bdev_reserve_space(mp, BDEV_RES_PROVISION, bbstart, bblen, + res); + if (error) + goto out; + ASSERT(ores >= *res); + + trace_xfs_thin_provision(mp, mp->m_thin_res, ores - *res); + + /* + * Update the local reservation based on the blocks that were actually + * allocated. + */ + mp->m_thin_res -= (ores - *res); +out: + mutex_unlock(&mp->m_thin_res_lock); + return error; +} + +int +xfs_thin_init( + struct xfs_mount *mp) +{ + struct block_device *bdev; + const struct block_device_operations *ops; + sector_t res; + int error; + unsigned int io_opt; + + bdev = mp->m_ddev_targp->bt_bdev; + ops = bdev->bd_disk->fops; + + mp->m_thin_reserve = false; + mutex_init(&mp->m_thin_res_lock); + + if (!ops->reserve_space) + goto out; + if (!(mp->m_flags & XFS_MOUNT_DISCARD)) + goto out; + + /* use optimal I/O size as dm-thin block size */ + io_opt = bdev_io_opt(mp->m_super->s_bdev); + if ((io_opt % BBSIZE) || (io_opt < mp->m_sb.sb_blocksize)) + goto out; + mp->m_thin_sectpb = io_opt / BBSIZE; + + /* warn about any preexisting reservation */ + error = bdev_reserve_space(mp, BDEV_RES_GET, 0, 0, &res); + if (error) + goto out; + if (res) { + /* force res count to 0 */ + xfs_warn(mp, "Reset non-zero (%llu sectors) block reservation.", + (uint64_t) res); + res = 0; + error = bdev_reserve_space(mp, BDEV_RES_MOD, 0, 0, &res); + if (error) + goto out; + } + + mp->m_thin_reserve = true; +out: + xfs_notice(mp, "Thin pool reservation %s", mp->m_thin_reserve ? + "enabled" : "disabled"); + if (mp->m_thin_reserve) + xfs_notice(mp, "Thin reserve blocksize: %u sectors", + mp->m_thin_sectpb); + return 0; +} diff --git a/fs/xfs/xfs_thin.h b/fs/xfs/xfs_thin.h new file mode 100644 index 0000000..6d995a0 --- /dev/null +++ b/fs/xfs/xfs_thin.h @@ -0,0 +1,31 @@ +#ifndef __XFS_THIN_H__ +#define __XFS_THIN_H__ + +/* + * Convert an fsb count to a sector reservation. + */ +static inline sector_t +xfs_fsb_res( + struct xfs_mount *mp, + xfs_fsblock_t fsb, + bool contig) +{ + sector_t bb; + + if (contig) { + bb = XFS_FSB_TO_BB(mp, fsb); + bb += (2 * mp->m_thin_sectpb); + bb = round_up(bb, mp->m_thin_sectpb); + } else + bb = fsb * mp->m_thin_sectpb; + + return bb; +} + +int xfs_thin_init(struct xfs_mount *); +int xfs_thin_reserve(struct xfs_mount *, sector_t); +int xfs_thin_unreserve(struct xfs_mount *, sector_t); +int xfs_thin_provision(struct xfs_mount *, xfs_fsblock_t, xfs_fsblock_t, + sector_t *); + +#endif /* __XFS_THIN_H__ */ diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index c8d5842..a7733a1 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -2184,6 +2184,33 @@ DEFINE_DISCARD_EVENT(xfs_discard_toosmall); DEFINE_DISCARD_EVENT(xfs_discard_exclude); DEFINE_DISCARD_EVENT(xfs_discard_busy); +DECLARE_EVENT_CLASS(xfs_thin_class, + TP_PROTO(struct xfs_mount *mp, sector_t total, sector_t res), + TP_ARGS(mp, total, res), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(uint64_t, total) + __field(uint64_t, res) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->total = total; + __entry->res = res; + ), + TP_printk("dev %d:%d total %llu res %llu", + MAJOR(__entry->dev), MINOR(__entry->dev), __entry->total, + __entry->res) +) + +#define DEFINE_THIN_EVENT(name) \ +DEFINE_EVENT(xfs_thin_class, name, \ + TP_PROTO(struct xfs_mount *mp, sector_t total, sector_t res), \ + TP_ARGS(mp, total, res)) +DEFINE_THIN_EVENT(xfs_thin_reserve); +DEFINE_THIN_EVENT(xfs_thin_reserve_enospc); +DEFINE_THIN_EVENT(xfs_thin_unreserve); +DEFINE_THIN_EVENT(xfs_thin_provision); + #endif /* _TRACE_XFS_H */ #undef TRACE_INCLUDE_PATH -- 2.4.11 From bfoster@redhat.com Tue Apr 12 11:42:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0C8BB7CA6 for ; Tue, 12 Apr 2016 11:42:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 962758F8035 for ; Tue, 12 Apr 2016 09:42:58 -0700 (PDT) X-ASG-Debug-ID: 1460479375-04bdf01103413f50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id F6JInF6ITs0FzCaf (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 09:42:55 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7BB1F80F6F; Tue, 12 Apr 2016 16:42:55 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-153.bos.redhat.com [10.18.41.153]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3CGgsbu024199; Tue, 12 Apr 2016 12:42:55 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8B330125462; Tue, 12 Apr 2016 12:42:53 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Cc: linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, dm-devel@redhat.com Subject: [RFC v2 PATCH 07/10] xfs: adopt a reserved allocation model on dm-thin devices Date: Tue, 12 Apr 2016 12:42:50 -0400 X-ASG-Orig-Subj: [RFC v2 PATCH 07/10] xfs: adopt a reserved allocation model on dm-thin devices Message-Id: <1460479373-63317-8-git-send-email-bfoster@redhat.com> In-Reply-To: <1460479373-63317-1-git-send-email-bfoster@redhat.com> References: <1460479373-63317-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: 1460479375 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Adopt a reservation-based block allocation model when XFS runs on top of a dm-thin device with accompanying support. As of today, the filesystem has no indication of available space in the underlying device. If the thin pool is depleted, the filesystem has no recourse but to handle the read-only state change of the device. This results in unexpected higher level behavior, error returns and can result in data loss if the filesystem is ultimately shutdown before more space is provisioned to the pool. The reservation model enables XFS to manage thin pool space similar to how delayed allocation blocks are managed today. Delalloc blocks are reserved up front (e.g., at write time) to guarantee physical space is available at writeback time and thus prevent data loss due to overprovisioning. Similarly, block device reservation allows XFS to reserve space for various operations in advance and thus guarantee an operation will not fail for lack of space, or otherwise return an error to the user. To accomplish this, tie in the device block reservation calls to the existing filesystem reservation mechanism. Each transaction now reserves physical space in the underlying thin pool along with other such reserved resources (e.g., filesystem blocks, log space). Delayed allocation blocks are similarly reserved in the thin device when the associated filesystem blocks are reserved. If a reservation cannot be satisfied, the associated operation returns -ENOSPC as if the filesystem itself were out of space. Note that this is proof-of-concept and highly experimental. The purpose is to explore the potential effectiveness of such a scheme between the filesystem and a thinly provisioned device. As such, the implementation is hacky, broken and geared towards proof-of-concept over correctness or completeness. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_alloc.c | 25 +++++++++++ fs/xfs/xfs_mount.c | 103 +++++++++++++++++++++++++++++++++++++++++----- fs/xfs/xfs_mount.h | 3 ++ fs/xfs/xfs_trans.c | 77 +++++++++++++++++++++++++++++++--- fs/xfs/xfs_trans.h | 1 + 5 files changed, 193 insertions(+), 16 deletions(-) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index a708e38..af21c93 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -35,6 +35,7 @@ #include "xfs_trans.h" #include "xfs_buf_item.h" #include "xfs_log.h" +#include "xfs_thin.h" struct workqueue_struct *xfs_alloc_wq; @@ -652,6 +653,30 @@ xfs_alloc_ag_vextent( XFS_TRANS_SB_RES_FDBLOCKS : XFS_TRANS_SB_FDBLOCKS, -((long)(args->len))); + + if (args->mp->m_thin_reserve) { + sector_t res; + xfs_fsblock_t fsbno = XFS_AGB_TO_FSB(args->mp, + args->agno, + args->agbno); + if (args->wasdel) + res = xfs_fsb_res(args->mp, args->len, false); + else + res = args->tp->t_blk_thin_res; + error = xfs_thin_provision(args->mp, fsbno, args->len, + &res); + WARN_ON(error); + + if (args->wasdel) { + if (res) + error = xfs_thin_unreserve(args->mp, res); + WARN_ON(error); + } else if (args->tp) { + args->tp->t_blk_thin_res = res; + } + + error = 0; + } } XFS_STATS_INC(args->mp, xs_allocx); diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 50a6ccc..d2d9c85 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -41,6 +41,7 @@ #include "xfs_trace.h" #include "xfs_icache.h" #include "xfs_sysfs.h" +#include "xfs_thin.h" static DEFINE_MUTEX(xfs_uuid_table_mutex); @@ -929,6 +930,8 @@ xfs_mountfs( xfs_qm_mount_quotas(mp); } + xfs_thin_init(mp); + /* * Now we are mounted, reserve a small amount of unused space for * privileged transactions. This is needed so that transaction @@ -1147,7 +1150,7 @@ xfs_mod_ifree( */ #define XFS_FDBLOCKS_BATCH 1024 int -xfs_mod_fdblocks( +__xfs_mod_fdblocks( struct xfs_mount *mp, int64_t delta, uint32_t flags) @@ -1156,13 +1159,27 @@ xfs_mod_fdblocks( long long res_used; s32 batch; bool rsvd = (flags & XFS_FDBLOCKS_RSVD); + bool blkres = (flags & XFS_BLK_RES); + int error; + int64_t res_delta = 0; + + ASSERT(!(rsvd && !blkres && delta < 0)); if (delta > 0) { /* - * If the reserve pool is depleted, put blocks back into it - * first. Most of the time the pool is full. + * If the reserve pool is full (the typical case), return the + * blocks to the general fs pool. Otherwise, return what we can + * to the reserve pool first. */ if (likely(mp->m_resblks == mp->m_resblks_avail)) { +main_pool: + if (mp->m_thin_reserve && blkres) { + error = xfs_thin_unreserve(mp, + xfs_fsb_res(mp, delta, false)); + if (error) + return error; + } + percpu_counter_add(&mp->m_fdblocks, delta); return 0; } @@ -1170,17 +1187,69 @@ xfs_mod_fdblocks( spin_lock(&mp->m_sb_lock); res_used = (long long)(mp->m_resblks - mp->m_resblks_avail); - if (res_used > delta) { - mp->m_resblks_avail += delta; + /* + * The reserve pool is not full. Blocks in the reserve pool must + * hold a bdev reservation which means we may need to re-reserve + * blocks depending on what the caller is giving us. + * + * If the blocks are already reserved (i.e., via a transaction + * reservation), simply update the reserve pool counter. If not, + * reserve as many blocks as we can, return those to the reserve + * pool, and then jump back above to return whatever is left + * back to the general filesystem pool. + */ + if (!blkres) { + while (delta) { + if (res_delta >= res_used) + break; + + spin_unlock(&mp->m_sb_lock); + + /* + * XXX: This is racy/leaky. Somebody else could + * replenish m_resblks_avail once we've dropped + * the lock. + */ + error = xfs_thin_reserve(mp, + xfs_fsb_res(mp, 1, false)); + if (error) { + spin_lock(&mp->m_sb_lock); + break; + } + + spin_lock(&mp->m_sb_lock); + + res_delta++; + delta--; + res_used = (long long)(mp->m_resblks - + mp->m_resblks_avail); + } } else { - delta -= res_used; - mp->m_resblks_avail = mp->m_resblks; - percpu_counter_add(&mp->m_fdblocks, delta); + res_delta = min(delta, res_used); + delta -= res_delta; } + + if (res_used > res_delta) + mp->m_resblks_avail += res_delta; + else + mp->m_resblks_avail = mp->m_resblks; spin_unlock(&mp->m_sb_lock); + if (delta) + goto main_pool; return 0; } + /* res calls take positive value */ + if (mp->m_thin_reserve && blkres) { + error = xfs_thin_reserve(mp, xfs_fsb_res(mp, -delta, false)); + if (error == -ENOSPC && rsvd) { + spin_lock(&mp->m_sb_lock); + goto fdblocks_rsvd; + } + if (error) + return error; + } + /* * Taking blocks away, need to be more accurate the closer we * are to zero. @@ -1203,14 +1272,17 @@ xfs_mod_fdblocks( } /* - * lock up the sb for dipping into reserves before releasing the space - * that took us to ENOSPC. + * Release bdev reservation then lock up the sb for dipping into local + * reserves before releasing the space that took us to ENOSPC. */ + if (mp->m_thin_reserve && blkres) + error = xfs_thin_unreserve(mp, xfs_fsb_res(mp, -delta, false)); spin_lock(&mp->m_sb_lock); percpu_counter_add(&mp->m_fdblocks, -delta); if (!rsvd) goto fdblocks_enospc; +fdblocks_rsvd: lcounter = (long long)mp->m_resblks_avail + delta; if (lcounter >= 0) { mp->m_resblks_avail = lcounter; @@ -1227,6 +1299,17 @@ fdblocks_enospc: } int +xfs_mod_fdblocks( + struct xfs_mount *mp, + int64_t delta, + uint32_t flags) +{ + /* unres is the common case */ + flags |= XFS_BLK_RES; + return __xfs_mod_fdblocks(mp, delta, flags); +} + +int xfs_mod_frextents( struct xfs_mount *mp, int64_t delta) diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 8d54c56..958f815 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -354,6 +354,9 @@ extern int xfs_mod_icount(struct xfs_mount *mp, int64_t delta); extern int xfs_mod_ifree(struct xfs_mount *mp, int64_t delta); #define XFS_FDBLOCKS_RSVD (1 << 0) +#define XFS_BLK_RES (1 << 1) +extern int __xfs_mod_fdblocks(struct xfs_mount *mp, int64_t delta, + uint32_t flags); extern int xfs_mod_fdblocks(struct xfs_mount *mp, int64_t delta, uint32_t flags); extern int xfs_mod_frextents(struct xfs_mount *mp, int64_t delta); diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 8aa9d9a..26e6288 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -31,6 +31,7 @@ #include "xfs_log.h" #include "xfs_trace.h" #include "xfs_error.h" +#include "xfs_thin.h" kmem_zone_t *xfs_trans_zone; kmem_zone_t *xfs_log_item_desc_zone; @@ -174,6 +175,7 @@ xfs_trans_reserve( { int error = 0; int flags = 0; + struct xfs_mount *mp = tp->t_mountp; if (tp->t_flags & XFS_TRANS_RESERVE) flags |= XFS_FDBLOCKS_RSVD; @@ -187,13 +189,14 @@ xfs_trans_reserve( * fail if the count would go below zero. */ if (blocks > 0) { - error = xfs_mod_fdblocks(tp->t_mountp, -((int64_t)blocks), - flags); + error = xfs_mod_fdblocks(mp, -((int64_t)blocks), flags); if (error != 0) { current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); return -ENOSPC; } tp->t_blk_res += blocks; + if (mp->m_thin_res) + tp->t_blk_thin_res += xfs_fsb_res(mp, blocks, false); } /* @@ -265,6 +268,8 @@ undo_blocks: if (blocks > 0) { xfs_mod_fdblocks(tp->t_mountp, -((int64_t)blocks), flags); tp->t_blk_res = 0; + if (tp->t_blk_thin_res) + tp->t_blk_thin_res = 0; } current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); @@ -551,6 +556,7 @@ xfs_trans_unreserve_and_mod_sb( int64_t rtxdelta = 0; int64_t idelta = 0; int64_t ifreedelta = 0; + int64_t resdelta = 0; int error; int flags = 0; @@ -558,8 +564,41 @@ xfs_trans_unreserve_and_mod_sb( flags |= XFS_FDBLOCKS_RSVD; /* calculate deltas */ - if (tp->t_blk_res > 0) - blkdelta = tp->t_blk_res; + if (tp->t_blk_res > 0) { + /* + * The transaction may have some number of unused fs blocks and + * unused bdev reservation. It might also have non-reserved free + * blocks (i.e., freed extents) that need to make it back into + * the fs general pool. We need to distinguish between these + * cases when unwinding the unused resources. + * + * We do this as follows: + * + * - resdelta - For every unused fs block and bdev reservation + * combination, account one fs+bdev reserved block that can be + * returned to the fs. These are blocks that can go directly + * back into the XFS reserve pool, if necessary, because they + * are already reserved. If the reserve pool is full, they are + * unreserved and returned to the general pool. + * - blkdelta - Freed filesystem blocks without any bdev + * reservation. These can get into the XFS reserve pool as + * well, but they are reserved from the bdev first. If + * reservation fails, they are returned to the general pool. + * - t_blk_thin_res - Unused bdev reservation from the + * transaction. Extra bdev reservation remains when newly + * allocated fs blocks might have already been provisioned in + * the bdev (due to larger bdev blocks). This reservation is + * returned directly to the bdev. + */ + blkdelta = tp->t_blk_res - tp->t_blk_res_used; + while (blkdelta && tp->t_blk_thin_res) { + tp->t_blk_thin_res -= xfs_fsb_res(mp, 1, false); + blkdelta--; + resdelta++; + } + blkdelta = tp->t_blk_res - resdelta; + } + if ((tp->t_fdblocks_delta != 0) && (xfs_sb_version_haslazysbcount(&mp->m_sb) || (tp->t_flags & XFS_TRANS_SB_DIRTY))) @@ -578,11 +617,34 @@ xfs_trans_unreserve_and_mod_sb( } /* apply the per-cpu counters */ - if (blkdelta) { - error = xfs_mod_fdblocks(mp, blkdelta, flags); + if (resdelta) { + error = __xfs_mod_fdblocks(mp, resdelta, flags | XFS_BLK_RES); if (error) goto out; } + /* + * Return any bdev reservation that hasn't been returned in the form of + * reserved blocks above. Do this before returning unreserved blocks to + * improve the chance that bdev reservation is available if the XFS + * reserve pool must be replenished. + * + * XXX: This logic is kind of wonky now that the bdev res. is tracked + * separately. If we have a bunch of freed blocks, can't we just return + * however many we have reservation for as 'reserved blocks?' Also need + * to fix up the code above to kill the while loop. + */ + if (tp->t_blk_thin_res) { + error = xfs_thin_unreserve(mp, tp->t_blk_thin_res); + if (error) + goto out_undo_resblocks; + tp->t_blk_thin_res = 0; + } + + if (blkdelta) { + error = __xfs_mod_fdblocks(mp, blkdelta, flags); + if (error) + goto out_undo_resblocks; + } if (idelta) { error = xfs_mod_icount(mp, idelta); @@ -688,6 +750,9 @@ out_undo_icount: out_undo_fdblocks: if (blkdelta) xfs_mod_fdblocks(mp, -blkdelta, flags); +out_undo_resblocks: + if (resdelta) + xfs_mod_fdblocks(mp, -resdelta, flags); out: ASSERT(error == 0); return; diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index e7c49cf..18685d9 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -95,6 +95,7 @@ typedef struct xfs_trans { unsigned int t_log_count; /* count for perm log res */ unsigned int t_blk_res; /* # of blocks resvd */ unsigned int t_blk_res_used; /* # of resvd blocks used */ + unsigned int t_blk_thin_res; unsigned int t_rtx_res; /* # of rt extents resvd */ unsigned int t_rtx_res_used; /* # of resvd rt extents used */ struct xlog_ticket *t_ticket; /* log mgr ticket */ -- 2.4.11 From bfoster@redhat.com Tue Apr 12 11:43:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 347837CA2 for ; Tue, 12 Apr 2016 11:43:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D9F1B8F8033 for ; Tue, 12 Apr 2016 09:42:56 -0700 (PDT) X-ASG-Debug-ID: 1460479375-04bdf01104413f50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HNpQqu0EIsIpWoB7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 09:42:55 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5E309766; Tue, 12 Apr 2016 16:42:55 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-153.bos.redhat.com [10.18.41.153]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3CGgtZP024201; Tue, 12 Apr 2016 12:42:55 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id A41B3125487; Tue, 12 Apr 2016 12:42:53 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Cc: linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, dm-devel@redhat.com Subject: [RFC v2 PATCH 09/10] xfs: support no block reservation transaction mode Date: Tue, 12 Apr 2016 12:42:52 -0400 X-ASG-Orig-Subj: [RFC v2 PATCH 09/10] xfs: support no block reservation transaction mode Message-Id: <1460479373-63317-10-git-send-email-bfoster@redhat.com> In-Reply-To: <1460479373-63317-1-git-send-email-bfoster@redhat.com> References: <1460479373-63317-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: 1460479375 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The block device reservation mechanism is tied into the transaction reservation mechanism and assumes the worst case scenario of a 1-1 mapping between filesystem blocks and dm blocks. This might be overkill for certain codepaths that have enough context to not require a worst-case reservation. Define an optional transaction flag to disable block reservation on a per-transaction basis. This allows any particular operation to open code a block device reservation and potentially use a more optimal reservation value. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_shared.h | 2 ++ fs/xfs/xfs_trans.c | 10 ++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/fs/xfs/libxfs/xfs_shared.h b/fs/xfs/libxfs/xfs_shared.h index 81ac870..ba79373 100644 --- a/fs/xfs/libxfs/xfs_shared.h +++ b/fs/xfs/libxfs/xfs_shared.h @@ -183,6 +183,8 @@ int xfs_log_calc_minimum_size(struct xfs_mount *); #define XFS_TRANS_RESERVE 0x20 /* OK to use reserved data blocks */ #define XFS_TRANS_FREEZE_PROT 0x40 /* Transaction has elevated writer count in superblock */ +#define XFS_TRANS_NOBLKRES 0x100 /* do not attempt blkdev reservation */ + /* * Field values for xfs_trans_mod_sb. */ diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 26e6288..343e435 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -174,11 +174,13 @@ xfs_trans_reserve( uint rtextents) { int error = 0; - int flags = 0; + int flags = XFS_BLK_RES; struct xfs_mount *mp = tp->t_mountp; if (tp->t_flags & XFS_TRANS_RESERVE) flags |= XFS_FDBLOCKS_RSVD; + if (tp->t_flags & XFS_TRANS_NOBLKRES) + flags &= ~XFS_BLK_RES; /* Mark this thread as being in a transaction */ current_set_flags_nested(&tp->t_pflags, PF_FSTRANS); @@ -189,13 +191,13 @@ xfs_trans_reserve( * fail if the count would go below zero. */ if (blocks > 0) { - error = xfs_mod_fdblocks(mp, -((int64_t)blocks), flags); + error = __xfs_mod_fdblocks(mp, -((int64_t)blocks), flags); if (error != 0) { current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); return -ENOSPC; } tp->t_blk_res += blocks; - if (mp->m_thin_res) + if (mp->m_thin_res && (flags & XFS_BLK_RES)) tp->t_blk_thin_res += xfs_fsb_res(mp, blocks, false); } @@ -266,7 +268,7 @@ undo_log: undo_blocks: if (blocks > 0) { - xfs_mod_fdblocks(tp->t_mountp, -((int64_t)blocks), flags); + __xfs_mod_fdblocks(tp->t_mountp, -((int64_t)blocks), flags); tp->t_blk_res = 0; if (tp->t_blk_thin_res) tp->t_blk_thin_res = 0; -- 2.4.11 From bfoster@redhat.com Tue Apr 12 11:42:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E03E17CA1 for ; Tue, 12 Apr 2016 11:42:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 32E4FAC002 for ; Tue, 12 Apr 2016 09:42:58 -0700 (PDT) X-ASG-Debug-ID: 1460479375-04cbb02e1dff4c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id PwYutAjVesMcyVxL (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 09:42:56 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 63BADC05E154; Tue, 12 Apr 2016 16:42:55 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-153.bos.redhat.com [10.18.41.153]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3CGgs9W003672; Tue, 12 Apr 2016 12:42:55 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 72006125461; Tue, 12 Apr 2016 12:42:53 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Cc: linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, dm-devel@redhat.com, Joe Thornber Subject: [RFC v2 PATCH 05/10] dm thin: add methods to set and get reserved space Date: Tue, 12 Apr 2016 12:42:48 -0400 X-ASG-Orig-Subj: [RFC v2 PATCH 05/10] dm thin: add methods to set and get reserved space Message-Id: <1460479373-63317-6-git-send-email-bfoster@redhat.com> In-Reply-To: <1460479373-63317-1-git-send-email-bfoster@redhat.com> References: <1460479373-63317-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: 1460479375 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Joe Thornber Experimental reserve interface for XFS guys to play with. I have big reservations (no pun intended) about this patch. [BF: - Support for reservation reduction. - Support for space provisioning. - Condensed to a single function.] Not-Signed-off-by: Joe Thornber Not-Signed-off-by: Mike Snitzer --- drivers/md/dm-thin.c | 181 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 171 insertions(+), 10 deletions(-) diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index 92237b6..32bc5bd 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c @@ -271,6 +271,8 @@ struct pool { process_mapping_fn process_prepared_discard; struct dm_bio_prison_cell **cell_sort_array; + + dm_block_t reserve_count; }; static enum pool_mode get_pool_mode(struct pool *pool); @@ -318,6 +320,8 @@ struct thin_c { */ atomic_t refcount; struct completion can_destroy; + + dm_block_t reserve_count; }; /*----------------------------------------------------------------*/ @@ -1359,24 +1363,19 @@ static void check_low_water_mark(struct pool *pool, dm_block_t free_blocks) } } -static int alloc_data_block(struct thin_c *tc, dm_block_t *result) +static int get_free_blocks(struct pool *pool, dm_block_t *free_blocks) { int r; - dm_block_t free_blocks; - struct pool *pool = tc->pool; - - if (WARN_ON(get_pool_mode(pool) != PM_WRITE)) - return -EINVAL; - r = dm_pool_get_free_block_count(pool->pmd, &free_blocks); + r = dm_pool_get_free_block_count(pool->pmd, free_blocks); if (r) { metadata_operation_failed(pool, "dm_pool_get_free_block_count", r); return r; } - check_low_water_mark(pool, free_blocks); + check_low_water_mark(pool, *free_blocks); - if (!free_blocks) { + if (!*free_blocks) { /* * Try to commit to see if that will free up some * more space. @@ -1385,7 +1384,7 @@ static int alloc_data_block(struct thin_c *tc, dm_block_t *result) if (r) return r; - r = dm_pool_get_free_block_count(pool->pmd, &free_blocks); + r = dm_pool_get_free_block_count(pool->pmd, free_blocks); if (r) { metadata_operation_failed(pool, "dm_pool_get_free_block_count", r); return r; @@ -1397,6 +1396,76 @@ static int alloc_data_block(struct thin_c *tc, dm_block_t *result) } } + return r; +} + +/* + * Returns true iff either: + * i) decrement succeeded (ie. there was reserve left) + * ii) there is extra space in the pool + */ +static bool dec_reserve_count(struct thin_c *tc, dm_block_t free_blocks) +{ + bool r = false; + unsigned long flags; + + if (!free_blocks) + return false; + + spin_lock_irqsave(&tc->pool->lock, flags); + if (tc->reserve_count > 0) { + tc->reserve_count--; + tc->pool->reserve_count--; + r = true; + } else { + if (free_blocks > tc->pool->reserve_count) + r = true; + } + spin_unlock_irqrestore(&tc->pool->lock, flags); + + return r; +} + +static int set_reserve_count(struct thin_c *tc, dm_block_t count) +{ + int r; + dm_block_t free_blocks; + int64_t delta; + unsigned long flags; + + r = get_free_blocks(tc->pool, &free_blocks); + if (r) + return r; + + spin_lock_irqsave(&tc->pool->lock, flags); + delta = count - tc->reserve_count; + if (tc->pool->reserve_count + delta > free_blocks) + r = -ENOSPC; + else { + tc->reserve_count = count; + tc->pool->reserve_count += delta; + } + spin_unlock_irqrestore(&tc->pool->lock, flags); + + return r; +} + +static int alloc_data_block(struct thin_c *tc, dm_block_t *result) +{ + int r; + dm_block_t free_blocks; + struct pool *pool = tc->pool; + + if (WARN_ON(get_pool_mode(pool) != PM_WRITE)) + return -EINVAL; + + r = get_free_blocks(tc->pool, &free_blocks); + if (r) + return r; + + if (!dec_reserve_count(tc, free_blocks)) + return -ENOSPC; + r = dm_pool_alloc_data_block(pool->pmd, result); if (r) { metadata_operation_failed(pool, "dm_pool_alloc_data_block", r); @@ -2880,6 +2949,7 @@ static struct pool *pool_create(struct mapped_device *pool_md, pool->last_commit_jiffies = jiffies; pool->pool_md = pool_md; pool->md_dev = metadata_dev; + pool->reserve_count = 0; __pool_table_insert(pool); return pool; @@ -3936,6 +4006,7 @@ static void thin_dtr(struct dm_target *ti) spin_lock_irqsave(&tc->pool->lock, flags); list_del_rcu(&tc->list); + tc->pool->reserve_count -= tc->reserve_count; spin_unlock_irqrestore(&tc->pool->lock, flags); synchronize_rcu(); @@ -4074,6 +4145,7 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv) init_completion(&tc->can_destroy); list_add_tail_rcu(&tc->list, &tc->pool->active_thins); spin_unlock_irqrestore(&tc->pool->lock, flags); + tc->reserve_count = 0; /* * This synchronize_rcu() call is needed here otherwise we risk a * wake_worker() call finding no bios to process (because the newly @@ -4271,6 +4343,94 @@ static void thin_io_hints(struct dm_target *ti, struct queue_limits *limits) limits->max_discard_sectors = 2048 * 1024 * 16; /* 16G */ } +static int thin_provision_space(struct dm_target *ti, sector_t offset, + sector_t len, sector_t *res) +{ + struct thin_c *tc = ti->private; + struct pool *pool = tc->pool; + sector_t end; + dm_block_t pblock; + dm_block_t vblock; + int error; + struct dm_thin_lookup_result lookup; + + if (!is_factor(offset, pool->sectors_per_block)) + return -EINVAL; + + if (!len || !is_factor(len, pool->sectors_per_block)) + return -EINVAL; + + if (res && !is_factor(*res, pool->sectors_per_block)) + return -EINVAL; + + end = offset + len; + + while (offset < end) { + vblock = offset; + do_div(vblock, pool->sectors_per_block); + + error = dm_thin_find_block(tc->td, vblock, true, &lookup); + if (error == 0) + goto next; + if (error != -ENODATA) + return error; + + error = alloc_data_block(tc, &pblock); + if (error) + return error; + + error = dm_thin_insert_block(tc->td, vblock, pblock); + if (error) + return error; + + if (res && *res) + *res -= pool->sectors_per_block; +next: + offset += pool->sectors_per_block; + } + + return 0; +} + +static int thin_reserve_space(struct dm_target *ti, int mode, sector_t offset, + sector_t len, sector_t *res) +{ + struct thin_c *tc = ti->private; + struct pool *pool = tc->pool; + sector_t blocks; + unsigned long flags; + int error; + + if (mode == BDEV_RES_PROVISION) + return thin_provision_space(ti, offset, len, res); + + /* res required for get/set */ + error = -EINVAL; + if (!res) + return error; + + if (mode == BDEV_RES_GET) { + spin_lock_irqsave(&tc->pool->lock, flags); + *res = tc->reserve_count * pool->sectors_per_block; + spin_unlock_irqrestore(&tc->pool->lock, flags); + error = 0; + } else if (mode == BDEV_RES_MOD) { + /* + * @res must always be a factor of the pool's blocksize; upper + * layers can rely on the bdev's minimum_io_size for this. + */ + if (!is_factor(*res, pool->sectors_per_block)) + return error; + + blocks = *res; + (void) sector_div(blocks, pool->sectors_per_block); + + error = set_reserve_count(tc, blocks); + } + + return error; +} + static struct target_type thin_target = { .name = "thin", .version = {1, 18, 0}, @@ -4285,6 +4445,7 @@ static struct target_type thin_target = { .status = thin_status, .iterate_devices = thin_iterate_devices, .io_hints = thin_io_hints, + .reserve_space = thin_reserve_space, }; /*----------------------------------------------------------------*/ -- 2.4.11 From bfoster@redhat.com Tue Apr 12 11:43:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 430707CAE for ; Tue, 12 Apr 2016 11:43:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id EC0078F8035 for ; Tue, 12 Apr 2016 09:42:56 -0700 (PDT) X-ASG-Debug-ID: 1460479375-04bdf01105413f50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QqI09FiwZ2lBjidi (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 09:42:55 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 61C3B8AE72; Tue, 12 Apr 2016 16:42:55 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-153.bos.redhat.com [10.18.41.153]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3CGgsYG012795; Tue, 12 Apr 2016 12:42:55 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 9764012547B; Tue, 12 Apr 2016 12:42:53 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Cc: linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, dm-devel@redhat.com Subject: [RFC v2 PATCH 08/10] xfs: handle bdev reservation ENOSPC correctly from XFS reserved pool Date: Tue, 12 Apr 2016 12:42:51 -0400 X-ASG-Orig-Subj: [RFC v2 PATCH 08/10] xfs: handle bdev reservation ENOSPC correctly from XFS reserved pool Message-Id: <1460479373-63317-9-git-send-email-bfoster@redhat.com> In-Reply-To: <1460479373-63317-1-git-send-email-bfoster@redhat.com> References: <1460479373-63317-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: 1460479375 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The XFS reserved block pool holds blocks from general allocation for internal purposes. When enabled, these blocks shall also carry a reservation from the block device to guarantee they are usable. The reserved pool allocation code currently uses a retry algorithm based on the available space estimation. It assumes that an inability to allocate blocks based on the estimation is a transient problem. Now that block allocation attempts bdev reservation, however, an ENOSPC could originate from the block device and might not be transient. Because the retry algorithm cannot distinguish between fs block allocation and bdev reservation, separate the two operations in this particular case. If the bdev reservation fails, back off the reservation delta until something can be reserved or return ENOSPC to the caller. Once a bdev reservation is made, attempt to allocate blocks from the fs and return to the original retry algorithm based on the free space estimation. This prevents infinite retries in the event of a reserved pool allocation request that cannot be satisfied from a bdev that supports reservation. Signed-off-by: Brian Foster --- fs/xfs/xfs_fsops.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 87d4b1b..79ae408 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -40,6 +40,7 @@ #include "xfs_trace.h" #include "xfs_log.h" #include "xfs_filestream.h" +#include "xfs_thin.h" /* * File system operations @@ -676,6 +677,7 @@ xfs_reserve_blocks( __uint64_t request; __int64_t free; int error = 0; + sector_t res = 0; /* If inval is null, report current values and return */ if (inval == (__uint64_t *)NULL) { @@ -743,6 +745,28 @@ xfs_reserve_blocks( fdblks_delta = delta; /* + * Reserve pool blocks must carry a block device reservation (if + * enabled). The block device could be much closer to ENOSPC + * than the fs (i.e., a thin or snap device), so try to reserve + * the bdev space first. + */ + spin_unlock(&mp->m_sb_lock); + if (mp->m_thin_reserve) { + while (fdblks_delta) { + res = xfs_fsb_res(mp, fdblks_delta, false); + error = xfs_thin_reserve(mp, res); + if (error != -ENOSPC) + break; + + fdblks_delta >>= 1; + } + if (!fdblks_delta || error) { + spin_lock(&mp->m_sb_lock); + break; + } + } + + /* * We'll either succeed in getting space from the free block * count or we'll get an ENOSPC. If we get a ENOSPC, it means * things changed while we were calculating fdblks_delta and so @@ -752,8 +776,9 @@ xfs_reserve_blocks( * Don't set the reserved flag here - we don't want to reserve * the extra reserve blocks from the reserve..... */ - spin_unlock(&mp->m_sb_lock); - error = xfs_mod_fdblocks(mp, -fdblks_delta, 0); + error = __xfs_mod_fdblocks(mp, -fdblks_delta, 0); + if (error && mp->m_thin_reserve) + xfs_thin_unreserve(mp, res); spin_lock(&mp->m_sb_lock); } -- 2.4.11 From bfoster@redhat.com Tue Apr 12 11:43:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BF59F7CB0 for ; Tue, 12 Apr 2016 11:43:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1A7FAAC002 for ; Tue, 12 Apr 2016 09:42:57 -0700 (PDT) X-ASG-Debug-ID: 1460479375-04cb6c245f418660001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id zMXRBYKpE8sLFMKh (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 09:42:55 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 523BD6541B; Tue, 12 Apr 2016 16:42:55 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-153.bos.redhat.com [10.18.41.153]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3CGgtsg019024; Tue, 12 Apr 2016 12:42:55 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id B2815125488; Tue, 12 Apr 2016 12:42:53 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Cc: linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, dm-devel@redhat.com Subject: [RFC v2 PATCH 10/10] xfs: use contiguous bdev reservation for file preallocation Date: Tue, 12 Apr 2016 12:42:53 -0400 X-ASG-Orig-Subj: [RFC v2 PATCH 10/10] xfs: use contiguous bdev reservation for file preallocation Message-Id: <1460479373-63317-11-git-send-email-bfoster@redhat.com> In-Reply-To: <1460479373-63317-1-git-send-email-bfoster@redhat.com> References: <1460479373-63317-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Tue, 12 Apr 2016 16:42:55 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460479375 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The block device reservation that occurs as part of transaction reservation uses a worst case algorithm to determine the amount of reservation required to satisfy the transaction. This means that one bdev (i.e., device-mapper) block is reserved per required filesystem block, even though the former block size is likely much larger than the latter. Worst case reservation is required in most cases because, from the perspective of the transaction, block allocation can occur throughout the block address space. This is unnecessary for some operations where more context is available, however. xfs_alloc_file_space() is one such case. It calls xfs_bmapi_write() in a loop and once per transaction. Since it also passes nmap == 1, each call maps a single extent and thus allocates contiguous blocks. Based on that, the bdev reservation can be reduced from the worst case 1-1 mapping to a more optimal 1-N mapping of dm blocks to fs blocks (e.g., one dm block can cover many fs blocks). Update xfs_alloc_file_space() to bypass transaction based bdev reservation. Instead, open-code the bdev reservation using the more optimal contiguous reservation value. This allows fallocate requests to consume just about all of the available space in a thin volume without premature ENOSPC errors. Signed-off-by: Brian Foster --- fs/xfs/xfs_bmap_util.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 3b63098..c2e1215 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -40,6 +40,7 @@ #include "xfs_trace.h" #include "xfs_icache.h" #include "xfs_log.h" +#include "xfs_thin.h" /* Kernel only BMAP related definitions and functions */ @@ -1035,9 +1036,11 @@ xfs_alloc_file_space( } /* - * Allocate and setup the transaction. + * Allocate and setup the transaction. The noblkres flags tells + * the reservation infrastructure to skip bdev reservation. */ tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); + tp->t_flags |= XFS_TRANS_NOBLKRES; error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, resblks, resrtextents); /* @@ -1051,6 +1054,30 @@ xfs_alloc_file_space( xfs_trans_cancel(tp); break; } + + /* + * We disabled the transaction bdev reservation because the + * trans infrastructure uses a worst case reservation. Since we + * call xfs_bmapi_write() one mapping at a time, we can assume + * the allocated blocks will be contiguous and thus can use a + * more optimal reservation value. Acquire the reservation here + * and attach it to the transaction. + * + * XXX: Need to take apart data and metadata block parts of res + * (see XFS_DIOSTRAT_SPACE_RES()). The latter still needs + * worst-case. + */ + if (mp->m_thin_res) { + sector_t res = xfs_fsb_res(mp, resblks, true); + + error = xfs_thin_reserve(mp, res); + if (error) { + xfs_trans_cancel(tp); + break; + } + tp->t_blk_thin_res = res; + } + xfs_ilock(ip, XFS_ILOCK_EXCL); error = xfs_trans_reserve_quota_nblks(tp, ip, qblocks, 0, quota_flag); -- 2.4.11 From bfoster@redhat.com Tue Apr 12 11:43:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7F8877CAF for ; Tue, 12 Apr 2016 11:43:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id F1CB6AC001 for ; Tue, 12 Apr 2016 09:42:56 -0700 (PDT) X-ASG-Debug-ID: 1460479375-04cb6c2460418660001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id duHymG7qnN0Fv41a (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 09:42:55 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id DAB187822B; Tue, 12 Apr 2016 16:42:54 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-153.bos.redhat.com [10.18.41.153]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3CGgsHM003661; Tue, 12 Apr 2016 12:42:54 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 509A712543B; Tue, 12 Apr 2016 12:42:53 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Cc: linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, dm-devel@redhat.com, Mike Snitzer Subject: [RFC v2 PATCH 03/10] block: add block_device_operations methods to set and get reserved space Date: Tue, 12 Apr 2016 12:42:46 -0400 X-ASG-Orig-Subj: [RFC v2 PATCH 03/10] block: add block_device_operations methods to set and get reserved space Message-Id: <1460479373-63317-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1460479373-63317-1-git-send-email-bfoster@redhat.com> References: <1460479373-63317-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: 1460479375 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Snitzer [BF: - Killed wrapper functions. - Condensed to single bdev op.] Signed-off-by: Mike Snitzer --- include/linux/blkdev.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 669e419..6c6ea96 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1650,6 +1650,10 @@ struct blk_dax_ctl { pfn_t pfn; }; +#define BDEV_RES_GET 0 +#define BDEV_RES_MOD (1 << 0) +#define BDEV_RES_PROVISION (1 << 1) + struct block_device_operations { int (*open) (struct block_device *, fmode_t); void (*release) (struct gendisk *, fmode_t); @@ -1667,6 +1671,8 @@ struct block_device_operations { int (*getgeo)(struct block_device *, struct hd_geometry *); /* this callback is with swap_lock and sometimes page table lock held */ void (*swap_slot_free_notify) (struct block_device *, unsigned long); + int (*reserve_space) (struct block_device *, int, sector_t, sector_t, + sector_t *); struct module *owner; const struct pr_ops *pr_ops; }; -- 2.4.11 From shyam@zadarastorage.com Tue Apr 12 12:40:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AE1387CA0 for ; Tue, 12 Apr 2016 12:40:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 11E8CAC005 for ; Tue, 12 Apr 2016 10:40:18 -0700 (PDT) X-ASG-Debug-ID: 1460482814-04cbb02e1b1013b0001-NocioJ Received: from mail-wm0-f53.google.com (mail-wm0-f53.google.com [74.125.82.53]) by cuda.sgi.com with ESMTP id DacamuThv0oMQB3v (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 12 Apr 2016 10:40:15 -0700 (PDT) X-Barracuda-Envelope-From: shyam@zadarastorage.com X-Barracuda-Apparent-Source-IP: 74.125.82.53 Received: by mail-wm0-f53.google.com with SMTP id u206so37847586wme.1 for ; Tue, 12 Apr 2016 10:40:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=from:references:in-reply-to:mime-version:thread-index:date :message-id:subject:to:cc; bh=57exUz8lNLFOcbKM/qsUrbmJddk5KTRc2Q7xz6qJ9d0=; b=j2+HR1Cm5JEw8lgW7yG044417MFJwCSkjkkHwgYhfBFTHizA+MNuf2ANjczkPfpjTv Nx8mSC43v/8ByNKEMH2ZEX9E5h/oGGiQw148Jd19UyGynF4TZubJFSsMGBXE5ZkGWElD vfuRjqd58ytmVcBaSVfl8cQ7V/KSVYAQAjoKRikENoT3PQo7QmExvJFKvwUyMlN5SH7k f4xgdR/L+aYve7ulFcgqklHrGPfY/Qvanwk/snFIQP5J2PVpsZGjX1gMVhmKlGym5hYS TZagJoec+l0+jxoWrZz1/SFYU4xQ5gZQVXP5w4xkD/hYpY6rzruu8/mFeDuTo0zMwXh8 3kfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:references:in-reply-to:mime-version :thread-index:date:message-id:subject:to:cc; bh=57exUz8lNLFOcbKM/qsUrbmJddk5KTRc2Q7xz6qJ9d0=; b=JOkAJQWaWKODKjiF7Kd8iS5xHLY0szjY3Lli9f1iAXiw9OBF2P+8F49VY7MEEJlRIw hgCyzGMetlGtQWRiUFOnl3ysbDt6hkHOND5QwHuuOIwYatnwRqOawEn49rp30VIUNKGl RqkLFEy9qy7jw2ZqvChgk91Ft3aqhvqTb4ilW2qvHwbGq9QSvJrUmABsv0MYNa/iYNT0 5ir44ivdO2C40jFgC0WwFll5SagyNnx2DomTYdE75wzQwOHRG5vxXMSewDeESXUz+fwM nOSVWG+Sy4g7XsL89ns6wNIvp7bUyENrg3oI95zVCnhP0Fl2Rmgm5U1TP7wXmjFj4TC0 g6ig== X-Gm-Message-State: AD7BkJK2rYJ4f4DTxeBg3bqTo8/k39eKUPgDCMZTQUdWAdMBwhoFhBGTDbvh0ZUQmVZjT4vK3IoT8oWgqnfJ4w== X-Received: by 10.28.35.86 with SMTP id j83mr24965229wmj.18.1460482814594; Tue, 12 Apr 2016 10:40:14 -0700 (PDT) From: Shyam Kaushik References: <23e35813cb097c7b15686852500cbf97@mail.gmail.com> <20160412082759.GI9088@dastard> In-Reply-To: <20160412082759.GI9088@dastard> MIME-Version: 1.0 X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AdGUlTrrBOLVTNlqQWycRATh+lZWlwASMbpQ Date: Tue, 12 Apr 2016 23:10:13 +0530 Message-ID: <5e9c99552ae829dce9eb574d72085323@mail.gmail.com> Subject: RE: [PATCH] xfs: Abort intent log item in xfs_iflush() upon error to get buf To: Dave Chinner X-ASG-Orig-Subj: RE: [PATCH] xfs: Abort intent log item in xfs_iflush() upon error to get buf Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wm0-f53.google.com[74.125.82.53] X-Barracuda-Start-Time: 1460482815 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28671 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi Dave, Your patch needs a minor correction. At start of xfs_iflush() either we must initialize "bp = NULL" or else xfs_imap_to_bp() when it hits an error need to set "*bpp = NULL". Otherwise with your patch we are having an uninitialized bp that corrupt_out is trying to do xfs_buf_relse(). I included the above minor change & confirmed your patch works great. So pls go ahead & formalize it. Thanks! --Shyam -----Original Message----- From: Dave Chinner [mailto:david@fromorbit.com] Sent: 12 April 2016 13:58 To: Shyam Kaushik Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Abort intent log item in xfs_iflush() upon error to get buf On Tue, Apr 12, 2016 at 12:27:30PM +0530, Shyam Kaushik wrote: > Looking at xfs_iflush(). If an IO fails, it is supposed to unlock the > inode by calling xfs_iflush_abort(), which will also remove it from > the AIL. This can also happen on reclaim of a dirty inode, and if so > we'll still reclaim the inode because reclaim assumes xfs_iflush() > cleans up properly. Which, apparently, it doesn't. > > Fix xfs_iflush() buf get failure to remove intent log item. > > Discovered-by: Dave Chinner > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 96f606d..85414a6 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -3374,8 +3374,9 @@ xfs_iflush( > error = xfs_imap_to_bp(mp, NULL, &ip->i_imap, &dip, &bp, > XBF_TRYLOCK, > 0); > if (error || !bp) { > - xfs_ifunlock(ip); > - return error; > + if (!bp) > + error = -EIO; > + goto abort_out; So that will trigger a failure whenever the underlying buffer is busy (i.e. returns -EAGAIN with bp NULL), not just when an IO or corruption error occurs. The hammer is too big. ;) Great proof of concept, though, as your testing results tell us you have found the root cause of the bug. The patch I wrote earlier today takes the EAGAIN case into account - I'm currently testing it, and have attached it below. Can you run it through your error testing, please, Shyam? I'll update all the reported-by, etc attributions before I post it for proper review. Cheers, Dave. -- Dave Chinner david@fromorbit.com xfs: xfs_iflush_cluster fails to abort on error From: Dave Chinner When a failure due to an inode buffer occurs, the error handling fails to abort the inode writeback correctly. This can result in the inode being reclaimed whilst still in the AIL, leading to use-after-free situations as well as filesystems that cannot be unmounted as the inode log items left in the AIL never get removed. Fix this by ensuring fatal errors from xfs_imap_to_bp() result in the inode flush being aborted correctly. Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 5b84bbc..e1a8020 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -3378,14 +3378,22 @@ xfs_iflush( } /* - * Get the buffer containing the on-disk inode. + * Get the buffer containing the on-disk inode. We are doing a try-lock + * operation here, so we may get an EAGAIN error. In that case, we + * simply want to return with the inode still dirty. + * + * If we get any other error, we effectively have a corruption situation + * and we cannot flush the inode, so we treat it the same as failing + * xfs_iflush_int(). */ error = xfs_imap_to_bp(mp, NULL, &ip->i_imap, &dip, &bp, XBF_TRYLOCK, 0); - if (error || !bp) { + if (error == -EAGAIN) { xfs_ifunlock(ip); return error; } + if (error) + goto corrupt_out; /* * First flush out the inode that xfs_iflush was called with. @@ -3413,7 +3421,8 @@ xfs_iflush( return 0; corrupt_out: - xfs_buf_relse(bp); + if (bp) + xfs_buf_relse(bp); xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); cluster_corrupt_out: error = -EFSCORRUPTED; From BATV+77df179d85046d661d01+4615+infradead.org+hch@bombadil.srs.infradead.org Tue Apr 12 13:31:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D13257CA0 for ; Tue, 12 Apr 2016 13:31:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 48703AC002 for ; Tue, 12 Apr 2016 11:31:11 -0700 (PDT) X-ASG-Debug-ID: 1460485865-04cbb02e1d102b70001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id TXLiO1EDvlfmb2d2 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 12 Apr 2016 11:31:06 -0700 (PDT) X-Barracuda-Envelope-From: BATV+77df179d85046d661d01+4615+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1aq35d-000460-Cd; Tue, 12 Apr 2016 18:31:05 +0000 Date: Tue, 12 Apr 2016 11:31:05 -0700 From: Christoph Hellwig To: david@fromorbit.com Cc: xfs@oss.sgi.com Subject: PAGE_CACHE_* removal in 4.6-rc3 Message-ID: <20160412183105.GA10567@infradead.org> X-ASG-Orig-Subj: PAGE_CACHE_* removal in 4.6-rc3 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1460485865 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28672 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Hi Dave, upstream removed the PAGE_CACHE_* macros in 4.6-rc3, which will cause all kinds of interesting conflicts for FS work. Maybe it's a good idea to rebase for-next ontop of -rc3 so that we can sort this out early? From msnitzer@redhat.com Tue Apr 12 15:05:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8CC037CA0 for ; Tue, 12 Apr 2016 15:05:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5FE118F8037 for ; Tue, 12 Apr 2016 13:05:04 -0700 (PDT) X-ASG-Debug-ID: 1460491502-04cbb02e1c107ed0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 0LDzpe8YOqSI5g7d (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 13:05:03 -0700 (PDT) X-Barracuda-Envelope-From: msnitzer@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 796A264371; Tue, 12 Apr 2016 20:05:02 +0000 (UTC) Received: from localhost (dhcp-25-61.bos.redhat.com [10.18.25.61]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3CK51hF025466 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Tue, 12 Apr 2016 16:05:01 -0400 Date: Tue, 12 Apr 2016 16:04:59 -0400 From: Mike Snitzer To: Brian Foster Cc: xfs@oss.sgi.com, linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, dm-devel@redhat.com, "Darrick J. Wong" Subject: [RFC PATCH] block: wire blkdev_fallocate() to block_device_operations' reserve_space Message-ID: <20160412200459.GA10730@redhat.com> X-ASG-Orig-Subj: [RFC PATCH] block: wire blkdev_fallocate() to block_device_operations' reserve_space References: <1460479373-63317-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460479373-63317-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-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Tue, 12 Apr 2016 20:05:02 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460491503 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Apr 12 2016 at 12:42P -0400, Brian Foster wrote: > Hi all, > > This is v2 of the XFS and block device reservation experiment. The > significant changes in v2 are that the bdev interface has been condensed > to a single callback function, the XFS transaction reservation > management has been reworked to make transactions responsible for > tracking and releasing excess reservation (for non-delalloc cases) and a > workaround for the fallocate over-reservation issue is included. Beyond > that, this version adds a bunch of miscellaneous cleanups and fixes some > of the nastier locking/leak issues present in the first rfc. > > Patches 1-2 refactor some XFS reserve pool and block accounting code in > preparation for subsequent patches. Patches 3-5 add block/device-mapper > reservation support. Patches 6-10 add the core reservation > infrastructure and management bits to XFS. See the link to the original > rfc below for instructions and further details around the purpose of > this series. > > Finally, note that this is still highly experimental/theoretical and > should not be used on production systems. Thoughts, reviews, flames > appreciated. Thanks for carrying on with this work Brian. I've started to review your patchset and Darrick's fallocate patchset. I've pushed a branch to linux-dm.git that combines the 2, see: https://git.kernel.org/cgit/linux/kernel/git/device-mapper/linux-dm.git/log/?h=dm-fallocate and then added this RFC patch, at the end, which relies on both of your patchsets -- you'll see blkdev_ensure_space_exists() has a FIXME which implies it isn't much more than simply stubbed out at this point (completely untested): From: Mike Snitzer Date: Tue, 12 Apr 2016 15:54:31 -0400 Subject: [RFC PATCH] block: wire blkdev_fallocate() to block_device_operations' reserve_space This effectively exposes the primitive for "ensure space exists". It relies on block_device_operations' reserve_space method. Signed-off-by: Mike Snitzer --- block/blk-lib.c | 26 ++++++++++++++++++++++++++ fs/block_dev.c | 20 +++++++++++--------- include/linux/blkdev.h | 2 ++ 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/block/blk-lib.c b/block/blk-lib.c index 9dca6bb..5042a84 100644 --- a/block/blk-lib.c +++ b/block/blk-lib.c @@ -314,3 +314,29 @@ int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, return __blkdev_issue_zeroout(bdev, sector, nr_sects, gfp_mask); } EXPORT_SYMBOL(blkdev_issue_zeroout); + +/** + * blkdev_ensure_space_exists - preallocate a block range + * @bdev: blockdev to preallocate space for + * @sector: start sector + * @nr_sects: number of sectors to preallocate + * @gfp_mask: memory allocation flags (for bio_alloc) + * @flags: FALLOC_FL_* to control behaviour + * + * Description: + * Ensure space exists, or is preallocated, for the sectors in question. + */ +int blkdev_ensure_space_exists(struct block_device *bdev, sector_t sector, + sector_t nr_sects, unsigned long flags) +{ + sector_t res; + const struct block_device_operations *ops = bdev->bd_disk->fops; + + if (!ops->reserve_space) + return -EOPNOTSUPP; + + // FIXME: check with Brian Foster on whether it makes sense to + // use BDEV_RES_GET/BDEV_RES_MOD instead of BDEV_RES_PROVISION? + return ops->reserve_space(bdev, BDEV_RES_PROVISION, sector, nr_sects, &res); +} +EXPORT_SYMBOL(blkdev_ensure_space_exists); diff --git a/fs/block_dev.c b/fs/block_dev.c index 5a2c3ab..b34c07b 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -1801,17 +1801,13 @@ long blkdev_fallocate(struct file *file, int mode, loff_t start, loff_t len) struct request_queue *q = bdev_get_queue(bdev); struct address_space *mapping; loff_t end = start + len - 1; - loff_t bs_mask, isize; + loff_t isize; int error; /* We only support zero range and punch hole. */ if (mode & ~BLKDEV_FALLOC_FL_SUPPORTED) return -EOPNOTSUPP; - /* We haven't a primitive for "ensure space exists" right now. */ - if (!(mode & ~FALLOC_FL_KEEP_SIZE)) - return -EOPNOTSUPP; - /* Only punch if the device can do zeroing discard. */ if ((mode & FALLOC_FL_PUNCH_HOLE) && (!blk_queue_discard(q) || !q->limits.discard_zeroes_data)) @@ -1829,9 +1825,12 @@ long blkdev_fallocate(struct file *file, int mode, loff_t start, loff_t len) return -EINVAL; } - /* Don't allow IO that isn't aligned to logical block size */ - bs_mask = bdev_logical_block_size(bdev) - 1; - if ((start | len) & bs_mask) + /* + * Don't allow IO that isn't aligned to minimum IO size (io_min) + * - for normal device's io_min is usually logical block size + * - but for more exotic devices (e.g. DM thinp) it may be larger + */ + if ((start | len) % bdev_io_min(bdev)) return -EINVAL; /* Invalidate the page cache, including dirty pages. */ @@ -1839,7 +1838,10 @@ long blkdev_fallocate(struct file *file, int mode, loff_t start, loff_t len) truncate_inode_pages_range(mapping, start, end); error = -EINVAL; - if (mode & FALLOC_FL_ZERO_RANGE) + if (!(mode & ~FALLOC_FL_KEEP_SIZE)) + error = blkdev_ensure_space_exists(bdev, start >> 9, len >> 9, + mode); + else if (mode & FALLOC_FL_ZERO_RANGE) error = blkdev_issue_zeroout(bdev, start >> 9, len >> 9, GFP_KERNEL, false); else if (mode & FALLOC_FL_PUNCH_HOLE) diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 6c6ea96..4147af2 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1132,6 +1132,8 @@ extern int blkdev_issue_write_same(struct block_device *bdev, sector_t sector, sector_t nr_sects, gfp_t gfp_mask, struct page *page); extern int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, sector_t nr_sects, gfp_t gfp_mask, bool discard); +extern int blkdev_ensure_space_exists(struct block_device *bdev, sector_t sector, + sector_t nr_sects, unsigned long flags); static inline int sb_issue_discard(struct super_block *sb, sector_t block, sector_t nr_blocks, gfp_t gfp_mask, unsigned long flags) { -- 2.6.4 (Apple Git-63) From tireman@shaw.ca Tue Apr 12 15:15:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C255C7CA0 for ; Tue, 12 Apr 2016 15:15:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id EC501AC004 for ; Tue, 12 Apr 2016 13:15:51 -0700 (PDT) X-ASG-Debug-ID: 1460492147-04cb6c246241f8f0001-NocioJ Received: from smtp-out-no.shaw.ca (smtp-out-no.shaw.ca [64.59.134.12]) by cuda.sgi.com with ESMTP id iBx3KiJ43U77FZSn (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 13:15:47 -0700 (PDT) X-Barracuda-Envelope-From: tireman@shaw.ca X-Barracuda-Apparent-Source-IP: 64.59.134.12 Received: from [192.168.0.2] ([174.5.126.242]) by shaw.ca with SMTP id q4ivag1O7Qeymq4iwa2HYJ; Tue, 12 Apr 2016 14:15:47 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=shaw.ca; s=s20150330; t=1460492147; bh=wBq132t8wi9FTsYFidET+Tml5qpfwXYAAWf7KDm/pok=; h=Subject:To:References:Cc:From:Date:In-Reply-To; b=OZvJ/a+bFpK0eyj203bQnhb9clQKG4GDyMkt8ekVc6t1ns7N4cAjQATSa66AJyy+K nAG+2kqQhb55CaCcsiuvrH/kG0rIrPQRQam5+CQA1QC9bqLTa6s+VKhDLDlkHlNYJm LiBnrUqPwqdKI5i0KC7dRTqNzfVsivJWQQd2i6/rzcSo3q8L0ksjpmyDNLyi4DYElN mPlTfPhzoJDWQHZ/AK7DjbN00H9g9K4EB4HqcBcR2i7i6R9Fin1COv1LK4eYnUML6U D2PX6qNSn7CLr0kuaJK8I3+9PhO3htPMrO6OUZJbNWTidrIqDfk0DyevUFhV2iw6o+ 1T6LNjCTH6Qng== X-Authority-Analysis: v=2.2 cv=H9KZ+KQi c=1 sm=1 tr=0 a=YUpam8ogUlPMk4SS6ACeKg==:117 a=YUpam8ogUlPMk4SS6ACeKg==:17 a=r77TgQKjGQsHNAKrUKIA:9 a=eJfxgxciAAAA:8 a=9WLEFE2BZ1-YUvAmBp0A:9 a=ng8kPizkg589GDEd:21 a=x8ekb2N1LjNCqTQ9:21 a=b7wnn9VzwqchnfsSS7YA:9 Subject: Re: xfs_repair fails after trying to format log cycle? To: Brian Foster X-ASG-Orig-Subj: Re: xfs_repair fails after trying to format log cycle? References: <56F6DE67.60403@shaw.ca> <20160328085541.GA27040@bfoster.bfoster> <570C8D4D.3060304@shaw.ca> <20160412140512.GA59690@bfoster.bfoster> Cc: xfs@oss.sgi.com From: Andrew Ryder Message-ID: <570D578D.5010706@shaw.ca> Date: Tue, 12 Apr 2016 16:16:13 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <20160412140512.GA59690@bfoster.bfoster> Content-Type: multipart/mixed; boundary="------------040307060808030901010803" X-CMAE-Envelope: MS4wfNThvL0EAD7eEYjdqUukiRNHmDTpABa2oFkhpvP7vJXwbiWJSrHYO2dI3mbZkY0KcUj5cUvKJ6XSx1+n8VxdJGupXY8QuLaKoGjxpU/0HFQH2Ya9ZgQU 6TgqD6pK7RBQUlK6Jen0MB8V8+USvd4iem2vq+Z63R1oFV6BiU9tK3nLse42HGXEbn5+JsDrWLrWTA== X-Barracuda-Connect: smtp-out-no.shaw.ca[64.59.134.12] X-Barracuda-Start-Time: 1460492147 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28674 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 This is a multi-part message in MIME format. --------------040307060808030901010803 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit On 04/12/2016 10:05 AM, Brian Foster wrote: > On Tue, Apr 12, 2016 at 01:53:17AM -0400, Andrew Ryder wrote: >> >> >> On 03/28/2016 04:55 AM, Brian Foster wrote: >>> On Sat, Mar 26, 2016 at 03:09:27PM -0400, Andrew Ryder wrote: >>>> Hello, >>>> >>>> I have an mdadm array with a xfs v5 filesystem on it and its begun to give >>>> me issues when trying to mount it as well as complete xfs_repair. Not sure >>>> if anyone might be able to shed some light on what is going on or how to >>>> correct the issue? >>>> >>>> When I try and mount the fs, it complains with: >>>> >>>> [ 388.479847] XFS (md2): Mounting V5 Filesystem >>>> [ 388.494686] XFS (md2): metadata I/O error: block 0x15d6d39c0 >>>> ("xlog_bread_noalign") error 5 numblks 8192 >>>> [ 388.495013] XFS (md2): failed to find log head >>>> [ 388.495018] XFS (md2): log mount/recovery failed: error -5 >>>> [ 388.495090] XFS (md2): log mount failed >>>> >>> >>> So a read I/O error from the kernel... >>> >>>> >>>> This is where its not making any sense for me, If I try and run "xfs_repair >>>> /dev/md2" it fails with: >>>> >>>> Phase 1 - find and verify superblock... >>>> - reporting progress in intervals of 15 minutes >>>> Phase 2 - using internal log >>>> - zero log... >>>> xfs_repair: read failed: Input/output error >>>> failed to find log head >>>> zero_log: cannot find log head/tail (xlog_find_tail=-5) >>>> >>>> fatal error -- ERROR: The log head and/or tail cannot be discovered. Attempt >>>> to mount the >>>> filesystem to replay the log or use the -L option to destroy the log and >>>> attempt a repair. >>>> >>> >>> ... similar read error from xfsprogs... >>> >>>> >>>> But if I run "xfs_repair -L /dev/md2" which gives: >>>> >>>> Phase 1 - find and verify superblock... >>>> - reporting progress in intervals of 15 minutes >>>> Phase 2 - using internal log >>>> - zero log... >>>> xfs_repair: read failed: Input/output error >>>> failed to find log head >>>> zero_log: cannot find log head/tail (xlog_find_tail=-5) >>>> xfs_repair: libxfs_device_zero write failed: Input/output error >>>> >>> >>> ... and it looks like it fails to write as well when trying to zero the >>> log... >>> >>>> then try and re-run "xfs_repair /dev/md2" it starts traversing the >>>> filesystem all the way to "Phase 7" then errors with: >>>> >>>> Phase 7 - verify and correct link counts... >>>> - 14:36:55: verify and correct link counts - 33 of 33 allocation >>>> groups done >>>> Maximum metadata LSN (64:2230592) is ahead of log (0:0). >>>> Format log to cycle 67. >>>> xfs_repair: libxfs_device_zero write failed: Input/output error >>>> >>>> >>>> Yet at this point I can now mount the filesystem.. >>>> >>> >>> ... and this is effectively a repeat of the write error as we try to >>> format the log with a correct LSN based on the metadata LSN tracked by >>> the repair process. Your kernel is old enough that runtime probably >>> won't complain either way (note that 3.19 might be considered a fairly >>> early kernel for using CRC support). Perhaps the first write attempt >>> zeroed enough of the log before it failed that log recovery wasn't >>> required, and thus these problematic I/Os were avoided. >>> >>> What's the history of this fs? Has it been working for some time, just >>> recently formatted? What lead to the need for log recovery? What's the >>> mdadm --detail info, member device size, total array size, xfs_info of >>> the filesystem, etc..? >>> >>> Does xfs_repair run clean at this point? If so, does 'xfs_repair -L' >>> still reproduce the write error (note that I'm assuming you have a clean >>> log such that this command will not cause data loss). If so, an strace >>> of the repair process might be interesting... >>> >>> Brian >> >> >> The filesystem is about a year old as I had one of the Addonics backplane >> boards go bad and after the replacement all was good again.. until the >> RocketRaid 2722 card and its obscure "Task File error" error message came up >> again. >> >> Everything up to this point had been working smoothly since end of Sept 2015 >> after the rebuild. All disks are 2TB in size, partitioned via 'parted' with >> 0% and 100% used for partition boundaries on each drive. Everything had been >> working wonderfully long before but the array was taken out due to some >> issues I had with 3 hitachi drives that refused to work on the RR2722 >> card/drivers. Long story. >> >> I've swapped out two drives in the array and no luck yet as it doesn't seem >> to be hardware failure related.. I've not had any signs of data corruption, >> just meta-data corruption/errors. >> >> If I remember correct, the format applied to the array was done under 3.6.11 >> kernel as >> I'm still going through the same xfs_repair as above to get the array to >> mount. It keeps failing after it tries to format the log to cycle 67. >> >> I'll see if I can get you an strace of things. >> > > FWIW, I created an md array of similar geometry and ran through some > fsstress/xfs_repair sequences just to see if there was anything > obviously broken in the stack here, but I don't hit any issues. > xfs_repair can zero the log and reformat it successfully. This is on a > 4.6.0-rc1 kernel. > > So I think the big question here is why are these certain I/Os failing? > This might ultimately require investigation at the md layer and/or > further down to your storage controller driver, etc. Anyways, here's the > first failed I/O from strace_2.1.txt: > > 02:34:36.309704 pread64(4, 0x7fe772ec0200, 2097152, 3001552175104) = -1 EIO (Input/output error) > > That's a 2MB read during phase 2, which is probably what leads to the > "failed to find log head" error. The read offset is right around the > middle of the array where the internal log resides. What's also > interesting is that it is preceded by a bunch of other read I/Os that > all appear to complete fine, but those are all 512b I/Os. > > What happens if you manually issue the read call that failed? E.g., > umount the filesystem and run the following command directly against the > array: > > xfs_io -dc "pread 3001552175104 2097152" /dev/md2 > > Brian It failed with the same error. I've attached the strace output for the command. The array is fairly full so I'm wondering if something is out of alignment somewhere thats causing this? /dev/md2 5858060288 5245630392 612429896 90% /mnt/md2 When I had the array plugged into another controller which isn't a rocketraid card, it did complain about all the drives not being aligned properly? Somehow it looks like sdk wasn't partitioned the same as the rest, I'm wondering if thats screwing things up? GNU Parted 3.2 Using /dev/sdi Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) p Model: ATA ST2000NC000-1CX1 (scsi) Disk /dev/sdi: 2000GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 2000GB 2000GB Number Start End Size File system Name Flags 1 2048s 3907028991s 3907026944s GNU Parted 3.2 Using /dev/sdk Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) p Model: ATA ST2000DL001-9VT1 (scsi) Disk /dev/sdk: 2000GB Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags: Number Start End Size Type File system Flags 1 512B 2000GB 2000GB primary raid Number Start End Size Type File system Flags 1 1s 3907029167s 3907029167s primary raid GNU Parted 3.2 Using /dev/sdh Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) p Model: ATA ST2000DL001-9VT1 (scsi) Disk /dev/sdh: 2000GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 2000GB 2000GB Number Start End Size File system Name Flags 1 2048s 3907028991s 3907026944s GNU Parted 3.2 Using /dev/sdm Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) p Model: ATA ST2000NC000-1CX1 (scsi) Disk /dev/sdm: 2000GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 2000GB 2000GB Number Start End Size File system Name Flags 1 2048s 3907028991s 3907026944s > >> >> This all began when the RR2722 driver running under 3.18.15 complained and >> .. >> >> Mar 14 07:23:07 Bigmouth kernel: [7177248.090541] /dev/vmnet: port on hub 0 >> successfully opened >> Mar 14 07:26:03 Bigmouth kernel: [7177424.552323] device eth1 left >> promiscuous mode >> Mar 14 07:26:03 Bigmouth kernel: [7177424.552786] bridge-eth1: disabled >> promiscuous mode >> Mar 14 20:10:20 Bigmouth kernel: [7223317.069464] rr272x_1x:Task file error, >> StatusReg=0x51, ErrReg=0x84, LBA[0-3]=0x747dc92f,LBA[4-7]=0x0. >> Mar 14 20:10:20 Bigmouth kernel: [7223317.179811] sd 5:0:1:0: [sdg] >> Mar 14 20:10:21 Bigmouth kernel: [7223317.690439] Result: >> hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK >> Mar 14 20:10:21 Bigmouth kernel: [7223317.700480] sd 5:0:1:0: [sdg] CDB: >> Mar 14 20:10:21 Bigmouth kernel: [7223318.211147] Write(10): 2a 00 74 7d c9 >> 00 00 00 40 00 >> Mar 14 20:10:21 Bigmouth kernel: [7223318.211167] blk_update_request: I/O >> error, dev sdg, sector 1954400512 >> Mar 14 20:10:21 Bigmouth kernel: [7223318.211203] sd 5:0:3:0: [sdi] >> Mar 14 20:10:21 Bigmouth kernel: [7223318.211206] Result: >> hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK >> Mar 14 20:10:21 Bigmouth kernel: [7223318.211209] sd 5:0:3:0: [sdi] CDB: >> Mar 14 20:10:21 Bigmouth kernel: [7223318.211211] Write(10): 2a 00 74 7d c9 >> 00 00 00 40 00 >> Mar 14 20:10:21 Bigmouth kernel: [7223318.211223] blk_update_request: I/O >> error, dev sdi, sector 1954400512 >> Mar 14 20:10:23 Bigmouth kernel: [7223319.957052] XFS (md2): metadata I/O >> error: block 0x15d6d4900 ("xlog_iodone") error 5 numblks 64 >> Mar 14 20:10:23 Bigmouth kernel: [7223319.957064] XFS (md2): >> xfs_do_force_shutdown(0x2) called from line 1181 of file fs/xfs/xfs_log.c. >> Return address = 0xffffffff812fdf96 >> Mar 14 20:10:23 Bigmouth kernel: [7223319.957080] XFS (md2): Log I/O Error >> Detected. Shutting down filesystem >> Mar 14 20:10:23 Bigmouth kernel: [7223319.957083] XFS (md2): Please umount >> the filesystem and rectify the problem(s) >> Mar 14 20:10:23 Bigmouth kernel: [7223319.957093] XFS (md2): xfs_log_force: >> error -5 returned. >> Mar 14 20:10:50 Bigmouth kernel: [7223347.087272] XFS (md2): xfs_log_force: >> error -5 returned. >> Mar 14 20:11:20 Bigmouth kernel: [7223377.190469] XFS (md2): xfs_log_force: >> error -5 returned. >> Mar 14 20:11:50 Bigmouth kernel: [7223407.293952] XFS (md2): xfs_log_force: >> error -5 returned. >> Mar 14 20:12:20 Bigmouth kernel: [7223437.397444] XFS (md2): xfs_log_force: >> error -5 returned. >> Mar 14 20:12:23 Bigmouth kernel: [7223439.791407] nfsd: last server has >> exited, flushing export cache >> Mar 14 20:12:50 Bigmouth kernel: [7223467.500928] XFS (md2): xfs_log_force: >> error -5 returned. >> Mar 14 20:13:20 Bigmouth kernel: [7223497.604420] XFS (md2): xfs_log_force: >> error -5 returned. >> Mar 14 20:13:50 Bigmouth kernel: [7223527.707899] XFS (md2): xfs_log_force: >> error -5 returned. >> Mar 14 20:14:21 Bigmouth kernel: [7223557.811399] XFS (md2): xfs_log_force: >> error -5 returned. >> Mar 14 20:14:51 Bigmouth kernel: [7223587.914932] XFS (md2): xfs_log_force: >> error -5 returned. >> Mar 14 20:15:21 Bigmouth kernel: [7223618.018362] XFS (md2): xfs_log_force: >> error -5 returned. >> Mar 14 20:15:51 Bigmouth kernel: [7223648.121779] XFS (md2): xfs_log_force: >> error -5 returned. >> Mar 14 20:16:19 Bigmouth kernel: [7223676.401069] XFS (md2): xfs_log_force: >> error -5 returned. >> Mar 14 20:16:21 Bigmouth kernel: [7223678.225334] XFS (md2): xfs_log_force: >> error -5 returned. >> Mar 14 20:16:27 Bigmouth kernel: [7223684.541305] XFS (md2): xfs_log_force: >> error -5 returned. >> Mar 14 20:16:27 Bigmouth kernel: [7223684.572176] XFS (md2): xfs_log_force: >> error -5 returned. >> Mar 14 20:16:38 Bigmouth kernel: [7223694.918565] md2: unknown partition >> table >> Mar 14 20:16:43 Bigmouth kernel: [7223700.425290] XFS (md2): Mounting V5 >> Filesystem >> Mar 14 20:16:43 Bigmouth kernel: [7223700.545669] XFS (md2): Starting >> recovery (logdev: internal) >> Mar 14 20:16:44 Bigmouth kernel: [7223701.874245] XFS (md2): Ending recovery >> (logdev: internal) >> Mar 14 20:30:31 Bigmouth kernel: [7224529.528678] md2: unknown partition >> table >> >> >> >> /dev/md2: >> Version : 1.2 >> Creation Time : Tue Oct 13 22:21:27 2015 >> Raid Level : raid5 >> Array Size : 5860147200 (5588.67 GiB 6000.79 GB) >> Used Dev Size : 1953382400 (1862.89 GiB 2000.26 GB) >> Raid Devices : 4 >> Total Devices : 4 >> Persistence : Superblock is persistent >> >> Intent Bitmap : Internal >> >> Update Time : Tue Apr 12 01:19:43 2016 >> State : clean >> Active Devices : 4 >> Working Devices : 4 >> Failed Devices : 0 >> Spare Devices : 0 >> >> Layout : left-symmetric >> Chunk Size : 512K >> >> Name : Bigmouth:2 (local to host Bigmouth) >> UUID : ed979276:3459155c:a32f63da:0c684042 >> Events : 62846 >> >> Number Major Minor RaidDevice State >> 5 8 193 0 active sync /dev/sdm1 >> 6 8 129 1 active sync /dev/sdi1 >> 2 8 177 2 active sync /dev/sdl1 >> 4 8 113 3 active sync /dev/sdh1 >> >> >> meta-data=/dev/md2 isize=512 agcount=33, agsize=45782272 >> blks >> = sectsz=512 attr=2, projid32bit=1 >> = crc=1 finobt=1 spinodes=0 >> data = bsize=4096 blocks=1465036800, imaxpct=5 >> = sunit=128 swidth=384 blks >> naming =version 2 bsize=4096 ascii-ci=0 ftype=1 >> log =internal bsize=4096 blocks=521728, version=2 >> = sectsz=512 sunit=8 blks, lazy-count=1 >> realtime =none extsz=4096 blocks=0, rtextents=0 >> >> >>> >>>> >>>> Checking the drives with smartctl shows no errors nor does 'dmesg' show any >>>> hardware i/o or controller related errors... >>>> >>>> I've tried scrubbing the array and no bad sectors are found either.. >>>> >>>> I'm running kernel 3.19.8 with xfsprogs 4.5. >>>> >>>> Thanks, >>>> Andrew >>>> >>>> _______________________________________________ >>>> xfs mailing list >>>> xfs@oss.sgi.com >>>> http://oss.sgi.com/mailman/listinfo/xfs >>> > --------------040307060808030901010803 Content-Type: text/plain; charset=UTF-8; name="strace_xfs_io.txt" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="strace_xfs_io.txt" 16:02:14.159324 execve("/usr/sbin/xfs_io", ["xfs_io", "-dc", "pread 3001552175104 2097152", "/dev/md2"], [/* 51 vars */]) = 0 16:02:14.160220 brk(NULL) = 0x1ce4000 16:02:14.160345 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e4a2000 16:02:14.160508 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) 16:02:14.160626 open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 16:02:14.160707 fstat(3, {st_mode=S_IFREG|0644, st_size=246250, ...}) = 0 16:02:14.160791 mmap(NULL, 246250, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f1c5e458000 16:02:14.160862 close(3) = 0 16:02:14.160959 open("/usr/lib64/libxcmd.so.0", O_RDONLY|O_CLOEXEC) = 3 16:02:14.161037 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@\37\0\0\0\0\0\0"..., 832) = 832 16:02:14.161111 fstat(3, {st_mode=S_IFREG|0755, st_size=26832, ...}) = 0 16:02:14.161184 mmap(NULL, 2128384, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c5e070000 16:02:14.161254 mprotect(0x7f1c5e076000, 2093056, PROT_NONE) = 0 16:02:14.161325 mmap(0x7f1c5e275000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5000) = 0x7f1c5e275000 16:02:14.161438 mmap(0x7f1c5e277000, 2560, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e277000 16:02:14.161525 close(3) = 0 16:02:14.161605 open("/lib64/libhandle.so.1", O_RDONLY|O_CLOEXEC) = 3 16:02:14.161683 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\17\0\0\0\0\0\0"..., 832) = 832 16:02:14.161755 fstat(3, {st_mode=S_IFREG|0755, st_size=14224, ...}) = 0 16:02:14.161826 mmap(NULL, 2113800, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c5de68000 16:02:14.161896 mprotect(0x7f1c5de6b000, 2093056, PROT_NONE) = 0 16:02:14.161965 mmap(0x7f1c5e06a000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f1c5e06a000 16:02:14.162049 mmap(0x7f1c5e06c000, 264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e06c000 16:02:14.162131 close(3) = 0 16:02:14.162210 open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 16:02:14.162287 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\7\2\0\0\0\0\0"..., 832) = 832 16:02:14.162359 fstat(3, {st_mode=S_IFREG|0755, st_size=1664768, ...}) = 0 16:02:14.162457 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e4a1000 16:02:14.162535 mmap(NULL, 3771992, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c5dac8000 16:02:14.162607 mprotect(0x7f1c5dc57000, 2097152, PROT_NONE) = 0 16:02:14.162679 mmap(0x7f1c5de57000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x18f000) = 0x7f1c5de57000 16:02:14.162764 mmap(0x7f1c5de5d000, 15960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c5de5d000 16:02:14.162849 close(3) = 0 16:02:14.162933 open("/lib64/libreadline.so.6", O_RDONLY|O_CLOEXEC) = 3 16:02:14.163013 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260d\1\0\0\0\0\0"..., 832) = 832 16:02:14.163084 fstat(3, {st_mode=S_IFREG|0555, st_size=415928, ...}) = 0 16:02:14.163155 mmap(NULL, 2518968, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c5d860000 16:02:14.163225 mprotect(0x7f1c5d8bd000, 2097152, PROT_NONE) = 0 16:02:14.163296 mmap(0x7f1c5dabd000, 36864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5d000) = 0x7f1c5dabd000 16:02:14.163389 mmap(0x7f1c5dac6000, 4024, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c5dac6000 16:02:14.163482 close(3) = 0 16:02:14.163568 open("/lib64/libncurses.so.6", O_RDONLY|O_CLOEXEC) = 3 16:02:14.163645 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320W\1\0\0\0\0\0"..., 832) = 832 16:02:14.163716 fstat(3, {st_mode=S_IFREG|0755, st_size=526008, ...}) = 0 16:02:14.163787 mmap(NULL, 2624120, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c5d5d8000 16:02:14.163857 mprotect(0x7f1c5d654000, 2093056, PROT_NONE) = 0 16:02:14.163927 mmap(0x7f1c5d853000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7b000) = 0x7f1c5d853000 16:02:14.164028 mmap(0x7f1c5d858000, 2680, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c5d858000 16:02:14.164113 close(3) = 0 16:02:14.164197 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e4a0000 16:02:14.164281 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e49f000 16:02:14.164355 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e49e000 16:02:14.164455 arch_prctl(ARCH_SET_FS, 0x7f1c5e49f700) = 0 16:02:14.164661 mprotect(0x7f1c5de57000, 16384, PROT_READ) = 0 16:02:14.164806 mprotect(0x7f1c5d853000, 16384, PROT_READ) = 0 16:02:14.165153 mprotect(0x7f1c5dabd000, 8192, PROT_READ) = 0 16:02:14.165231 mprotect(0x7f1c5e06a000, 4096, PROT_READ) = 0 16:02:14.165313 mprotect(0x7f1c5e275000, 4096, PROT_READ) = 0 16:02:14.165402 mprotect(0x618000, 4096, PROT_READ) = 0 16:02:14.165482 mprotect(0x7f1c5e499000, 4096, PROT_READ) = 0 16:02:14.165552 munmap(0x7f1c5e458000, 246250) = 0 16:02:14.165817 brk(NULL) = 0x1ce4000 16:02:14.165876 brk(0x1d05000) = 0x1d05000 16:02:14.165953 open("/usr/lib64/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3 16:02:14.166031 fstat(3, {st_mode=S_IFREG|0644, st_size=3832592, ...}) = 0 16:02:14.166103 mmap(NULL, 3832592, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f1c5d230000 16:02:14.166187 close(3) = 0 16:02:14.166394 open("/dev/md2", O_RDWR|O_DIRECT) = 3 16:02:14.166498 fstatfs(3, {f_type="TMPFS_MAGIC", f_bsize=4096, f_blocks=2560, f_bfree=2560, f_bavail=2560, f_files=8244585, f_ffree=8243843, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=4130}) = 0 16:02:14.166583 fstat(3, {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 16:02:14.166655 fstatfs(3, {f_type="TMPFS_MAGIC", f_bsize=4096, f_blocks=2560, f_bfree=2560, f_bavail=2560, f_files=8244585, f_ffree=8243843, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=4130}) = 0 16:02:14.166730 fstat(3, {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 16:02:14.166822 open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 4 16:02:14.166899 fstat(4, {st_mode=S_IFREG|0644, st_size=2997, ...}) = 0 16:02:14.166969 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e49d000 16:02:14.167040 read(4, "# Locale name alias data base.\n#"..., 4096) = 2997 16:02:14.167154 read(4, "", 4096) = 0 16:02:14.167223 close(4) = 0 16:02:14.167289 munmap(0x7f1c5e49d000, 4096) = 0 16:02:14.167405 open("/usr/share/locale/en_US.utf8/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 16:02:14.167488 open("/usr/share/locale/en_US/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 16:02:14.167564 open("/usr/share/locale/en.utf8/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 16:02:14.167637 open("/usr/share/locale/en/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 16:02:14.168062 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552175104) = 4096 16:02:14.168480 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552179200) = 4096 16:02:14.168744 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552183296) = 4096 16:02:14.168995 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552187392) = 4096 16:02:14.169235 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552191488) = 4096 16:02:14.169479 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552195584) = 4096 16:02:14.169717 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552199680) = 4096 16:02:14.169970 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552203776) = 4096 16:02:14.170215 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552207872) = 4096 16:02:14.170461 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552211968) = 4096 16:02:14.170700 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552216064) = 4096 16:02:14.170940 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552220160) = 4096 16:02:14.171177 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552224256) = 4096 16:02:14.171440 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552228352) = 4096 16:02:14.171680 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552232448) = 4096 16:02:14.171913 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552236544) = 4096 16:02:14.172148 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552240640) = 4096 16:02:14.172402 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552244736) = 4096 16:02:14.172652 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552248832) = 4096 16:02:14.172901 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552252928) = 4096 16:02:14.173135 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552257024) = 4096 16:02:14.173381 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552261120) = 4096 16:02:14.173626 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552265216) = 4096 16:02:14.173859 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552269312) = 4096 16:02:14.174095 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552273408) = 4096 16:02:14.174335 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552277504) = 4096 16:02:14.174591 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552281600) = 4096 16:02:14.174822 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552285696) = 4096 16:02:14.175053 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552289792) = 4096 16:02:14.175285 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552293888) = 4096 16:02:14.175528 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552297984) = 4096 16:02:14.175765 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552302080) = 4096 16:02:14.175988 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552306176) = 4096 16:02:14.176212 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552310272) = 4096 16:02:14.176596 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552314368) = 4096 16:02:14.176860 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552318464) = 4096 16:02:14.177083 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552322560) = 4096 16:02:14.177306 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552326656) = 4096 16:02:14.177535 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552330752) = 4096 16:02:14.177759 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552334848) = 4096 16:02:14.177981 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552338944) = 4096 16:02:14.178231 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552343040) = 4096 16:02:14.178469 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552347136) = 4096 16:02:14.178687 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552351232) = 4096 16:02:14.178915 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552355328) = 4096 16:02:14.179131 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552359424) = 4096 16:02:14.179404 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552363520) = 4096 16:02:14.179635 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552367616) = 4096 16:02:14.179856 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552371712) = 4096 16:02:14.180076 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552375808) = 4096 16:02:14.180299 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552379904) = 4096 16:02:14.180518 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552384000) = 4096 16:02:14.180738 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552388096) = 4096 16:02:14.180983 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552392192) = 4096 16:02:14.181204 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552396288) = 4096 16:02:14.181455 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552400384) = 4096 16:02:14.181677 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552404480) = 4096 16:02:14.181900 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552408576) = 4096 16:02:14.182122 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552412672) = 4096 16:02:14.182345 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552416768) = 4096 16:02:14.182585 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552420864) = 4096 16:02:14.182808 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552424960) = 4096 16:02:14.183041 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552429056) = 4096 16:02:14.183261 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552433152) = 4096 16:02:14.183486 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552437248) = 4096 16:02:14.183707 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552441344) = 4096 16:02:14.183943 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552445440) = 4096 16:02:14.184159 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552449536) = 4096 16:02:14.184398 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552453632) = 4096 16:02:14.184621 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552457728) = 4096 16:02:14.184836 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552461824) = 4096 16:02:14.185075 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552465920) = 4096 16:02:14.185292 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552470016) = 4096 16:02:14.189482 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552474112) = 4096 16:02:14.189973 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552478208) = 4096 16:02:14.190171 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552482304) = 4096 16:02:14.190360 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552486400) = 4096 16:02:14.190573 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552490496) = 4096 16:02:14.190745 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552494592) = 4096 16:02:14.190913 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552498688) = 4096 16:02:14.191098 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552502784) = 4096 16:02:14.191269 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552506880) = 4096 16:02:14.191478 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552510976) = 4096 16:02:14.191692 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552515072) = 4096 16:02:14.191879 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552519168) = 4096 16:02:14.192062 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552523264) = 4096 16:02:14.192246 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552527360) = 4096 16:02:14.192444 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552531456) = 4096 16:02:14.192625 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552535552) = 4096 16:02:14.192806 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552539648) = 4096 16:02:14.192990 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552543744) = 4096 16:02:14.193172 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552547840) = 4096 16:02:14.193351 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552551936) = 4096 16:02:14.193555 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552556032) = 4096 16:02:14.193736 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552560128) = 4096 16:02:14.193913 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552564224) = 4096 16:02:14.194094 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552568320) = 4096 16:02:14.194278 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552572416) = 4096 16:02:14.194468 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552576512) = 4096 16:02:14.194650 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552580608) = 4096 16:02:14.194829 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552584704) = 4096 16:02:14.195009 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552588800) = 4096 16:02:14.195193 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552592896) = 4096 16:02:14.195386 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552596992) = 4096 16:02:14.195579 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552601088) = 4096 16:02:14.195763 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552605184) = 4096 16:02:14.195957 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552609280) = 4096 16:02:14.196141 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552613376) = 4096 16:02:14.196321 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552617472) = 4096 16:02:14.196511 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552621568) = 4096 16:02:14.196697 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552625664) = 4096 16:02:14.197041 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552629760) = 4096 16:02:14.197239 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552633856) = 4096 16:02:14.197486 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552637952) = 4096 16:02:14.197689 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552642048) = 4096 16:02:14.197874 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552646144) = 4096 16:02:14.198057 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552650240) = 4096 16:02:14.198259 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552654336) = 4096 16:02:14.198446 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552658432) = 4096 16:02:14.198639 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552662528) = 4096 16:02:14.198823 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552666624) = 4096 16:02:14.199006 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552670720) = 4096 16:02:14.199188 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552674816) = 4096 16:02:14.199373 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552678912) = 4096 16:02:14.199569 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552683008) = 4096 16:02:14.199749 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552687104) = 4096 16:02:14.199929 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552691200) = 4096 16:02:14.200108 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552695296) = 4096 16:02:14.200304 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552699392) = 4096 16:02:14.200494 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552703488) = 4096 16:02:14.200684 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552707584) = 4096 16:02:14.200867 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552711680) = 4096 16:02:14.201047 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552715776) = 4096 16:02:14.201227 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552719872) = 4096 16:02:14.201417 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552723968) = 4096 16:02:14.201602 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552728064) = 4096 16:02:14.201782 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552732160) = 4096 16:02:14.201962 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552736256) = 4096 16:02:14.202153 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552740352) = 4096 16:02:14.202352 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552744448) = 4096 16:02:14.202564 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552748544) = 4096 16:02:14.202740 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552752640) = 4096 16:02:14.202920 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552756736) = 4096 16:02:14.203101 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552760832) = 4096 16:02:14.203284 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552764928) = 4096 16:02:14.203473 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552769024) = 4096 16:02:14.203654 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552773120) = 4096 16:02:14.203833 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552777216) = 4096 16:02:14.204014 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552781312) = 4096 16:02:14.204198 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552785408) = 4096 16:02:14.204409 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552789504) = 4096 16:02:14.204591 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552793600) = 4096 16:02:14.204770 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552797696) = 4096 16:02:14.204952 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552801792) = 4096 16:02:14.205135 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552805888) = 4096 16:02:14.205316 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552809984) = 4096 16:02:14.205502 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552814080) = 4096 16:02:14.205684 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552818176) = 4096 16:02:14.205865 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552822272) = 4096 16:02:14.206050 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552826368) = 4096 16:02:14.206240 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552830464) = 4096 16:02:14.206446 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552834560) = 4096 16:02:14.206626 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552838656) = 4096 16:02:14.206806 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552842752) = 4096 16:02:14.206988 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552846848) = 4096 16:02:14.207166 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552850944) = 4096 16:02:14.207344 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552855040) = 4096 16:02:14.207539 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552859136) = 4096 16:02:14.207724 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552863232) = 4096 16:02:14.207907 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552867328) = 4096 16:02:14.208084 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552871424) = 4096 16:02:14.208274 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552875520) = 4096 16:02:14.208494 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552879616) = 4096 16:02:14.208675 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552883712) = 4096 16:02:14.208858 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552887808) = 4096 16:02:14.209037 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552891904) = 4096 16:02:14.209217 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552896000) = 4096 16:02:14.209412 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552900096) = 4096 16:02:14.209595 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552904192) = 4096 16:02:14.209774 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552908288) = 4096 16:02:14.209953 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552912384) = 4096 16:02:14.210130 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552916480) = 4096 16:02:14.210320 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552920576) = 4096 16:02:14.210538 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552924672) = 4096 16:02:14.210723 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552928768) = 4096 16:02:14.210903 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552932864) = 4096 16:02:14.211084 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552936960) = 4096 16:02:14.211264 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552941056) = 4096 16:02:14.211452 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552945152) = 4096 16:02:14.211639 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552949248) = 4096 16:02:14.211831 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552953344) = 4096 16:02:14.212012 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552957440) = 4096 16:02:14.212194 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552961536) = 4096 16:02:14.212377 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552965632) = 4096 16:02:14.212579 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552969728) = 4096 16:02:14.212760 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552973824) = 4096 16:02:14.212939 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552977920) = 4096 16:02:14.213118 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552982016) = 4096 16:02:14.213298 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552986112) = 4096 16:02:14.213490 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552990208) = 4096 16:02:14.213672 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552994304) = 4096 16:02:14.213987 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552998400) = 4096 16:02:14.214237 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553002496) = 4096 16:02:14.214493 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553006592) = 4096 16:02:14.214760 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553010688) = 4096 16:02:14.215009 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553014784) = 4096 16:02:14.215258 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553018880) = 4096 16:02:14.215515 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553022976) = 4096 16:02:14.215774 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553027072) = 4096 16:02:14.216026 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553031168) = 4096 16:02:14.216273 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553035264) = 4096 16:02:14.216529 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553039360) = 4096 16:02:14.216801 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553043456) = 4096 16:02:14.217042 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553047552) = 4096 16:02:14.217302 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553051648) = 4096 16:02:14.217557 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553055744) = 4096 16:02:14.217821 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553059840) = 4096 16:02:14.218067 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553063936) = 4096 16:02:14.218312 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553068032) = 4096 16:02:14.218559 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553072128) = 4096 16:02:14.218801 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553076224) = 4096 16:02:14.219045 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553080320) = 4096 16:02:14.219287 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553084416) = 4096 16:02:14.219543 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553088512) = 4096 16:02:14.219794 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553092608) = 4096 16:02:14.220040 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553096704) = 4096 16:02:14.220286 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553100800) = 4096 16:02:14.220541 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553104896) = 4096 16:02:14.220787 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553108992) = 4096 16:02:14.221033 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553113088) = 4096 16:02:14.221280 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553117184) = 4096 16:02:14.221532 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553121280) = 4096 16:02:14.221784 pread64(3, 0x1ce7000, 4096, 3001553125376) = -1 EIO (Input/output error) 16:02:14.222083 dup(2) = 4 16:02:14.222183 fcntl(4, F_GETFL) = 0x8402 (flags O_RDWR|O_APPEND|O_LARGEFILE) 16:02:14.222290 open("/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 16:02:14.222448 open("/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 16:02:14.222616 open("/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 16:02:14.222693 open("/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 16:02:14.222786 fstat(4, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 9), ...}) = 0 16:02:14.222866 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e49d000 16:02:14.222954 write(4, "pread64: Input/output error\n", 28) = 28 16:02:14.223038 close(4) = 0 16:02:14.223103 munmap(0x7f1c5e49d000, 4096) = 0 16:02:14.223249 exit_group(0) = ? 16:02:14.223594 +++ exited with 0 +++ --------------040307060808030901010803-- From darrick.wong@oracle.com Tue Apr 12 15:39:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3E4FF7CA0 for ; Tue, 12 Apr 2016 15:39:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 02EBD304066 for ; Tue, 12 Apr 2016 13:39:11 -0700 (PDT) X-ASG-Debug-ID: 1460493548-04cbb02e1a108fb0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id QyIuXDOzsfCo3QYl (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 13:39:08 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u3CKd7NK013320 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 12 Apr 2016 20:39:07 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u3CKd6To031101 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 12 Apr 2016 20:39:07 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u3CKd6Ia015003; Tue, 12 Apr 2016 20:39:06 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 12 Apr 2016 13:39:05 -0700 Date: Tue, 12 Apr 2016 13:39:04 -0700 From: "Darrick J. Wong" To: Mike Snitzer Cc: Brian Foster , xfs@oss.sgi.com, linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, dm-devel@redhat.com Subject: Re: [RFC PATCH] block: wire blkdev_fallocate() to block_device_operations' reserve_space Message-ID: <20160412203904.GD5812@birch.djwong.org> X-ASG-Orig-Subj: Re: [RFC PATCH] block: wire blkdev_fallocate() to block_device_operations' reserve_space References: <1460479373-63317-1-git-send-email-bfoster@redhat.com> <20160412200459.GA10730@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160412200459.GA10730@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1460493548 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28674 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Apr 12, 2016 at 04:04:59PM -0400, Mike Snitzer wrote: > On Tue, Apr 12 2016 at 12:42P -0400, > Brian Foster wrote: > > > Hi all, > > > > This is v2 of the XFS and block device reservation experiment. The > > significant changes in v2 are that the bdev interface has been condensed > > to a single callback function, the XFS transaction reservation > > management has been reworked to make transactions responsible for > > tracking and releasing excess reservation (for non-delalloc cases) and a > > workaround for the fallocate over-reservation issue is included. Beyond > > that, this version adds a bunch of miscellaneous cleanups and fixes some > > of the nastier locking/leak issues present in the first rfc. > > > > Patches 1-2 refactor some XFS reserve pool and block accounting code in > > preparation for subsequent patches. Patches 3-5 add block/device-mapper > > reservation support. Patches 6-10 add the core reservation > > infrastructure and management bits to XFS. See the link to the original > > rfc below for instructions and further details around the purpose of > > this series. > > > > Finally, note that this is still highly experimental/theoretical and > > should not be used on production systems. Thoughts, reviews, flames > > appreciated. > > Thanks for carrying on with this work Brian. > > I've started to review your patchset and Darrick's fallocate patchset. > I've pushed a branch to linux-dm.git that combines the 2, see: > https://git.kernel.org/cgit/linux/kernel/git/device-mapper/linux-dm.git/log/?h=dm-fallocate > > and then added this RFC patch, at the end, which relies on both of your > patchsets -- you'll see blkdev_ensure_space_exists() has a FIXME which > implies it isn't much more than simply stubbed out at this point > (completely untested): Hmm, ok, but -rc3 broke a bunch of stuff. Guess I should repost with all the PAGE_CACHE_ -> PAGE_ stuff fixed. :) > From: Mike Snitzer > Date: Tue, 12 Apr 2016 15:54:31 -0400 > Subject: [RFC PATCH] block: wire blkdev_fallocate() to block_device_operations' reserve_space > > This effectively exposes the primitive for "ensure space exists". It > relies on block_device_operations' reserve_space method. > > Signed-off-by: Mike Snitzer > --- > block/blk-lib.c | 26 ++++++++++++++++++++++++++ > fs/block_dev.c | 20 +++++++++++--------- > include/linux/blkdev.h | 2 ++ > 3 files changed, 39 insertions(+), 9 deletions(-) > > diff --git a/block/blk-lib.c b/block/blk-lib.c > index 9dca6bb..5042a84 100644 > --- a/block/blk-lib.c > +++ b/block/blk-lib.c > @@ -314,3 +314,29 @@ int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, > return __blkdev_issue_zeroout(bdev, sector, nr_sects, gfp_mask); > } > EXPORT_SYMBOL(blkdev_issue_zeroout); > + > +/** > + * blkdev_ensure_space_exists - preallocate a block range > + * @bdev: blockdev to preallocate space for > + * @sector: start sector > + * @nr_sects: number of sectors to preallocate > + * @gfp_mask: memory allocation flags (for bio_alloc) > + * @flags: FALLOC_FL_* to control behaviour > + * > + * Description: > + * Ensure space exists, or is preallocated, for the sectors in question. > + */ > +int blkdev_ensure_space_exists(struct block_device *bdev, sector_t sector, > + sector_t nr_sects, unsigned long flags) > +{ > + sector_t res; > + const struct block_device_operations *ops = bdev->bd_disk->fops; > + > + if (!ops->reserve_space) > + return -EOPNOTSUPP; > + > + // FIXME: check with Brian Foster on whether it makes sense to > + // use BDEV_RES_GET/BDEV_RES_MOD instead of BDEV_RES_PROVISION? > + return ops->reserve_space(bdev, BDEV_RES_PROVISION, sector, nr_sects, &res); /me thinks BDEV_RES_PROVISION is correct here, because regular-mode file fallocate (for ext4/xfs anyway) allocates blocks and maps them to specific file offsets as unwritten extents. afaict RES_PROVISION -> thin_provision_space() and thin_provision_space() seems to allocate blocks and map them to the device's LBAs. If I'm reading the patches correctly, RES_GET/RES_MOD seem to reserve N blocks but doesn't map them to any specific LBA. > +} > +EXPORT_SYMBOL(blkdev_ensure_space_exists); > diff --git a/fs/block_dev.c b/fs/block_dev.c > index 5a2c3ab..b34c07b 100644 > --- a/fs/block_dev.c > +++ b/fs/block_dev.c > @@ -1801,17 +1801,13 @@ long blkdev_fallocate(struct file *file, int mode, loff_t start, loff_t len) > struct request_queue *q = bdev_get_queue(bdev); > struct address_space *mapping; > loff_t end = start + len - 1; > - loff_t bs_mask, isize; > + loff_t isize; > int error; > > /* We only support zero range and punch hole. */ > if (mode & ~BLKDEV_FALLOC_FL_SUPPORTED) > return -EOPNOTSUPP; > > - /* We haven't a primitive for "ensure space exists" right now. */ > - if (!(mode & ~FALLOC_FL_KEEP_SIZE)) > - return -EOPNOTSUPP; > - > /* Only punch if the device can do zeroing discard. */ > if ((mode & FALLOC_FL_PUNCH_HOLE) && > (!blk_queue_discard(q) || !q->limits.discard_zeroes_data)) > @@ -1829,9 +1825,12 @@ long blkdev_fallocate(struct file *file, int mode, loff_t start, loff_t len) > return -EINVAL; > } > > - /* Don't allow IO that isn't aligned to logical block size */ > - bs_mask = bdev_logical_block_size(bdev) - 1; > - if ((start | len) & bs_mask) > + /* > + * Don't allow IO that isn't aligned to minimum IO size (io_min) > + * - for normal device's io_min is usually logical block size > + * - but for more exotic devices (e.g. DM thinp) it may be larger > + */ > + if ((start | len) % bdev_io_min(bdev)) > return -EINVAL; Noted. Will update the original patch. > /* Invalidate the page cache, including dirty pages. */ > @@ -1839,7 +1838,10 @@ long blkdev_fallocate(struct file *file, int mode, loff_t start, loff_t len) > truncate_inode_pages_range(mapping, start, end); > > error = -EINVAL; > - if (mode & FALLOC_FL_ZERO_RANGE) > + if (!(mode & ~FALLOC_FL_KEEP_SIZE)) > + error = blkdev_ensure_space_exists(bdev, start >> 9, len >> 9, > + mode); > + else if (mode & FALLOC_FL_ZERO_RANGE) This whole thing got converted to a switch statement due to some feedback from hch. Anyway, will try to have a new blockdev fallocate patchset done by the end of the day. (Is there a test case for this?) --D > error = blkdev_issue_zeroout(bdev, start >> 9, len >> 9, > GFP_KERNEL, false); > else if (mode & FALLOC_FL_PUNCH_HOLE) > diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h > index 6c6ea96..4147af2 100644 > --- a/include/linux/blkdev.h > +++ b/include/linux/blkdev.h > @@ -1132,6 +1132,8 @@ extern int blkdev_issue_write_same(struct block_device *bdev, sector_t sector, > sector_t nr_sects, gfp_t gfp_mask, struct page *page); > extern int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, > sector_t nr_sects, gfp_t gfp_mask, bool discard); > +extern int blkdev_ensure_space_exists(struct block_device *bdev, sector_t sector, > + sector_t nr_sects, unsigned long flags); > static inline int sb_issue_discard(struct super_block *sb, sector_t block, > sector_t nr_blocks, gfp_t gfp_mask, unsigned long flags) > { > -- > 2.6.4 (Apple Git-63) > > -- > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From msnitzer@redhat.com Tue Apr 12 15:47:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 91DD97CA1 for ; Tue, 12 Apr 2016 15:47:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5FA22304067 for ; Tue, 12 Apr 2016 13:47:02 -0700 (PDT) X-ASG-Debug-ID: 1460494020-04cbb02e1a1097e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id lV4dtHHd4OfaSd2R (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 13:47:01 -0700 (PDT) X-Barracuda-Envelope-From: msnitzer@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 300DD8F2FD; Tue, 12 Apr 2016 20:47:00 +0000 (UTC) Received: from localhost (dhcp-25-149.bos.redhat.com [10.18.25.149]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3CKkxiY030864 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA256 bits=256 verify=NO); Tue, 12 Apr 2016 16:46:59 -0400 Date: Tue, 12 Apr 2016 16:46:58 -0400 From: Mike Snitzer To: "Darrick J. Wong" Cc: Brian Foster , xfs@oss.sgi.com, linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, dm-devel@redhat.com Subject: Re: [RFC PATCH] block: wire blkdev_fallocate() to block_device_operations' reserve_space Message-ID: <20160412204658.GA1759@redhat.com> X-ASG-Orig-Subj: Re: [RFC PATCH] block: wire blkdev_fallocate() to block_device_operations' reserve_space References: <1460479373-63317-1-git-send-email-bfoster@redhat.com> <20160412200459.GA10730@redhat.com> <20160412203904.GD5812@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160412203904.GD5812@birch.djwong.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460494020 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Apr 12 2016 at 4:39pm -0400, Darrick J. Wong wrote: > On Tue, Apr 12, 2016 at 04:04:59PM -0400, Mike Snitzer wrote: > > On Tue, Apr 12 2016 at 12:42P -0400, > > Brian Foster wrote: > > > > > Hi all, > > > > > > This is v2 of the XFS and block device reservation experiment. The > > > significant changes in v2 are that the bdev interface has been condensed > > > to a single callback function, the XFS transaction reservation > > > management has been reworked to make transactions responsible for > > > tracking and releasing excess reservation (for non-delalloc cases) and a > > > workaround for the fallocate over-reservation issue is included. Beyond > > > that, this version adds a bunch of miscellaneous cleanups and fixes some > > > of the nastier locking/leak issues present in the first rfc. > > > > > > Patches 1-2 refactor some XFS reserve pool and block accounting code in > > > preparation for subsequent patches. Patches 3-5 add block/device-mapper > > > reservation support. Patches 6-10 add the core reservation > > > infrastructure and management bits to XFS. See the link to the original > > > rfc below for instructions and further details around the purpose of > > > this series. > > > > > > Finally, note that this is still highly experimental/theoretical and > > > should not be used on production systems. Thoughts, reviews, flames > > > appreciated. > > > > Thanks for carrying on with this work Brian. > > > > I've started to review your patchset and Darrick's fallocate patchset. > > I've pushed a branch to linux-dm.git that combines the 2, see: > > https://git.kernel.org/cgit/linux/kernel/git/device-mapper/linux-dm.git/log/?h=dm-fallocate > > > > and then added this RFC patch, at the end, which relies on both of your > > patchsets -- you'll see blkdev_ensure_space_exists() has a FIXME which > > implies it isn't much more than simply stubbed out at this point > > (completely untested): > > Hmm, ok, but -rc3 broke a bunch of stuff. Guess I should repost with all > the PAGE_CACHE_ -> PAGE_ stuff fixed. :) Yeah, the kernel.org kbuild robots just spammed us about that same exact breakage. > > From: Mike Snitzer > > Date: Tue, 12 Apr 2016 15:54:31 -0400 > > Subject: [RFC PATCH] block: wire blkdev_fallocate() to block_device_operations' reserve_space > > > > This effectively exposes the primitive for "ensure space exists". It > > relies on block_device_operations' reserve_space method. > > > > Signed-off-by: Mike Snitzer > > --- > > block/blk-lib.c | 26 ++++++++++++++++++++++++++ > > fs/block_dev.c | 20 +++++++++++--------- > > include/linux/blkdev.h | 2 ++ > > 3 files changed, 39 insertions(+), 9 deletions(-) > > > > diff --git a/block/blk-lib.c b/block/blk-lib.c > > index 9dca6bb..5042a84 100644 > > --- a/block/blk-lib.c > > +++ b/block/blk-lib.c > > @@ -314,3 +314,29 @@ int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, > > return __blkdev_issue_zeroout(bdev, sector, nr_sects, gfp_mask); > > } > > EXPORT_SYMBOL(blkdev_issue_zeroout); > > + > > +/** > > + * blkdev_ensure_space_exists - preallocate a block range > > + * @bdev: blockdev to preallocate space for > > + * @sector: start sector > > + * @nr_sects: number of sectors to preallocate > > + * @gfp_mask: memory allocation flags (for bio_alloc) > > + * @flags: FALLOC_FL_* to control behaviour > > + * > > + * Description: > > + * Ensure space exists, or is preallocated, for the sectors in question. > > + */ > > +int blkdev_ensure_space_exists(struct block_device *bdev, sector_t sector, > > + sector_t nr_sects, unsigned long flags) > > +{ > > + sector_t res; > > + const struct block_device_operations *ops = bdev->bd_disk->fops; > > + > > + if (!ops->reserve_space) > > + return -EOPNOTSUPP; > > + > > + // FIXME: check with Brian Foster on whether it makes sense to > > + // use BDEV_RES_GET/BDEV_RES_MOD instead of BDEV_RES_PROVISION? > > + return ops->reserve_space(bdev, BDEV_RES_PROVISION, sector, nr_sects, &res); > > /me thinks BDEV_RES_PROVISION is correct here, because regular-mode file > fallocate (for ext4/xfs anyway) allocates blocks and maps them to specific file > offsets as unwritten extents. afaict RES_PROVISION -> thin_provision_space() > and thin_provision_space() seems to allocate blocks and map them to the > device's LBAs. > > If I'm reading the patches correctly, RES_GET/RES_MOD seem to reserve N blocks > but doesn't map them to any specific LBA. Right that is how I read it too. I just put that FIXME in to cover my ass incase I was being an idiot ;) > > +} > > +EXPORT_SYMBOL(blkdev_ensure_space_exists); > > diff --git a/fs/block_dev.c b/fs/block_dev.c > > index 5a2c3ab..b34c07b 100644 > > --- a/fs/block_dev.c > > +++ b/fs/block_dev.c > > @@ -1801,17 +1801,13 @@ long blkdev_fallocate(struct file *file, int mode, loff_t start, loff_t len) > > struct request_queue *q = bdev_get_queue(bdev); > > struct address_space *mapping; > > loff_t end = start + len - 1; > > - loff_t bs_mask, isize; > > + loff_t isize; > > int error; > > > > /* We only support zero range and punch hole. */ > > if (mode & ~BLKDEV_FALLOC_FL_SUPPORTED) > > return -EOPNOTSUPP; > > > > - /* We haven't a primitive for "ensure space exists" right now. */ > > - if (!(mode & ~FALLOC_FL_KEEP_SIZE)) > > - return -EOPNOTSUPP; > > - > > /* Only punch if the device can do zeroing discard. */ > > if ((mode & FALLOC_FL_PUNCH_HOLE) && > > (!blk_queue_discard(q) || !q->limits.discard_zeroes_data)) > > @@ -1829,9 +1825,12 @@ long blkdev_fallocate(struct file *file, int mode, loff_t start, loff_t len) > > return -EINVAL; > > } > > > > - /* Don't allow IO that isn't aligned to logical block size */ > > - bs_mask = bdev_logical_block_size(bdev) - 1; > > - if ((start | len) & bs_mask) > > + /* > > + * Don't allow IO that isn't aligned to minimum IO size (io_min) > > + * - for normal device's io_min is usually logical block size > > + * - but for more exotic devices (e.g. DM thinp) it may be larger > > + */ > > + if ((start | len) % bdev_io_min(bdev)) > > return -EINVAL; > > Noted. Will update the original patch. OK, thanks. Once your new patchset is available I'll rebase my 'dm-fallocate' test branch accordingly. > > /* Invalidate the page cache, including dirty pages. */ > > @@ -1839,7 +1838,10 @@ long blkdev_fallocate(struct file *file, int mode, loff_t start, loff_t len) > > truncate_inode_pages_range(mapping, start, end); > > > > error = -EINVAL; > > - if (mode & FALLOC_FL_ZERO_RANGE) > > + if (!(mode & ~FALLOC_FL_KEEP_SIZE)) > > + error = blkdev_ensure_space_exists(bdev, start >> 9, len >> 9, > > + mode); > > + else if (mode & FALLOC_FL_ZERO_RANGE) > > This whole thing got converted to a switch statement due to some feedback > from hch. > > Anyway, will try to have a new blockdev fallocate patchset done by the end > of the day. > > (Is there a test case for this?) No, but once my patch is in place to join your patchset with Brian's then any basic fallocate tests against a DM thinp volume _should_ work. /me assumes xfstests has such tests? Only missing bit would be to layer the filesystem ontop of DM thinp? Or extend the tests your added to test DM thinp devices directly. I think Eric Sandeen (now cc'd) made xfstests capable or creating DM thinp volumes for certain tests. From toshi.kani@hpe.com Tue Apr 12 15:47:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B34157CA1 for ; Tue, 12 Apr 2016 15:47:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 77314304067 for ; Tue, 12 Apr 2016 13:47:57 -0700 (PDT) X-ASG-Debug-ID: 1460494074-04bdf01104421ee0001-NocioJ Received: from g1t5425.austin.hp.com (g1t5425.austin.hp.com [15.216.225.55]) by cuda.sgi.com with ESMTP id aEsCoufwWdYiFXxd (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 13:47:54 -0700 (PDT) X-Barracuda-Envelope-From: toshi.kani@hpe.com X-Barracuda-Apparent-Source-IP: 15.216.225.55 Received: from g2t2360.austin.hpecorp.net (g2t2360.austin.hpecorp.net [16.196.225.135]) by g1t5425.austin.hp.com (Postfix) with ESMTP id 236304E; Tue, 12 Apr 2016 20:47:52 +0000 (UTC) Received: from misato.fc.hp.com (misato.fc.hp.com [16.78.168.61]) by g2t2360.austin.hpecorp.net (Postfix) with ESMTP id 206BE49; Tue, 12 Apr 2016 20:47:49 +0000 (UTC) From: Toshi Kani To: akpm@linux-foundation.org, dan.j.williams@intel.com Cc: viro@zeniv.linux.org.uk, willy@linux.intel.com, ross.zwisler@linux.intel.com, kirill.shutemov@linux.intel.com, david@fromorbit.com, jack@suse.cz, tytso@mit.edu, adilger.kernel@dilger.ca, linux-nvdimm@lists.01.org, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org Subject: [PATCH v2 0/5] Align mmap address for DAX pmd mappings Date: Tue, 12 Apr 2016 14:39:14 -0600 X-ASG-Orig-Subj: [PATCH v2 0/5] Align mmap address for DAX pmd mappings Message-Id: <1460493555-31611-1-git-send-email-toshi.kani@hpe.com> X-Mailer: git-send-email 2.5.5 X-Barracuda-Connect: g1t5425.austin.hp.com[15.216.225.55] X-Barracuda-Start-Time: 1460494074 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28674 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header When CONFIG_FS_DAX_PMD is set, DAX supports mmap() using pmd page size. This feature relies on both mmap virtual address and FS block (i.e. physical address) to be aligned by the pmd page size. Users can use mkfs options to specify FS to align block allocations. However, aligning mmap address requires code changes to existing applications for providing a pmd-aligned address to mmap(). For instance, fio with "ioengine=mmap" performs I/Os with mmap() [1]. It calls mmap() with a NULL address, which needs to be changed to provide a pmd-aligned address for testing with DAX pmd mappings. Changing all applications that call mmap() with NULL is undesirable. This patch-set extends filesystems to align an mmap address for a DAX file so that unmodified applications can use DAX pmd mappings. [1]: https://github.com/axboe/fio/blob/master/engines/mmap.c v2: - Change filesystems to provide their get_unmapped_area(). (Matthew Wilcox) - Add more description about the benefit. (Matthew Wilcox) --- Toshi Kani (5): 1/5 dax: add dax_get_unmapped_area for pmd mappings 2/5 ext4: call dax_get_unmapped_area() for DAX pmd mappings 3/5 xfs: call dax_get_unmapped_area() for DAX pmd mappings 4/5 ext2: call dax_get_unmapped_area() for DAX pmd mappings 5/5 block: call dax_get_unmapped_area() for DAX pmd mappings --- fs/block_dev.c | 3 +++ fs/dax.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ fs/ext2/file.c | 3 +++ fs/ext4/file.c | 3 +++ fs/xfs/xfs_file.c | 3 +++ include/linux/dax.h | 2 ++ 6 files changed, 59 insertions(+) From toshi.kani@hpe.com Tue Apr 12 15:48:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 64B397CAE for ; Tue, 12 Apr 2016 15:48:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id BB352AC006 for ; Tue, 12 Apr 2016 13:48:00 -0700 (PDT) X-ASG-Debug-ID: 1460494077-04cb6c245f420ec0001-NocioJ Received: from g1t5424.austin.hp.com (g1t5424.austin.hp.com [15.216.225.54]) by cuda.sgi.com with ESMTP id JrM3r9Dao9rHoQHg (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 13:47:58 -0700 (PDT) X-Barracuda-Envelope-From: toshi.kani@hpe.com X-Barracuda-Apparent-Source-IP: 15.216.225.54 Received: from g2t2360.austin.hpecorp.net (g2t2360.austin.hpecorp.net [16.196.225.135]) by g1t5424.austin.hp.com (Postfix) with ESMTP id 3D01F4D; Tue, 12 Apr 2016 20:47:56 +0000 (UTC) Received: from misato.fc.hp.com (misato.fc.hp.com [16.78.168.61]) by g2t2360.austin.hpecorp.net (Postfix) with ESMTP id 14CE63A; Tue, 12 Apr 2016 20:47:55 +0000 (UTC) From: Toshi Kani To: akpm@linux-foundation.org, dan.j.williams@intel.com Cc: viro@zeniv.linux.org.uk, willy@linux.intel.com, ross.zwisler@linux.intel.com, kirill.shutemov@linux.intel.com, david@fromorbit.com, jack@suse.cz, tytso@mit.edu, adilger.kernel@dilger.ca, linux-nvdimm@lists.01.org, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Toshi Kani Subject: [PATCH v2 1/5] dax: add dax_get_unmapped_area for pmd mappings Date: Tue, 12 Apr 2016 14:39:15 -0600 X-ASG-Orig-Subj: [PATCH v2 1/5] dax: add dax_get_unmapped_area for pmd mappings Message-Id: <1460493555-31611-2-git-send-email-toshi.kani@hpe.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1460493555-31611-1-git-send-email-toshi.kani@hpe.com> References: <1460493555-31611-1-git-send-email-toshi.kani@hpe.com> X-Barracuda-Connect: g1t5424.austin.hp.com[15.216.225.54] X-Barracuda-Start-Time: 1460494078 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28675 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header When CONFIG_FS_DAX_PMD is set, DAX supports mmap() using pmd page size. This feature relies on both mmap virtual address and FS block (i.e. physical address) to be aligned by the pmd page size. Users can use mkfs options to specify FS to align block allocations. However, aligning mmap address requires code changes to existing applications for providing a pmd-aligned address to mmap(). For instance, fio with "ioengine=mmap" performs I/Os with mmap() [1]. It calls mmap() with a NULL address, which needs to be changed to provide a pmd-aligned address for testing with DAX pmd mappings. Changing all applications that call mmap() with NULL is undesirable. Add dax_get_unmapped_area(), which can be called by filesystem's get_unmapped_area to align an mmap address by the pmd size for a DAX file. It calls the default handler, mm->get_unmapped_area(), to find a range and then aligns it for a DAX file. [1]: https://github.com/axboe/fio/blob/master/engines/mmap.c Signed-off-by: Toshi Kani Cc: Alexander Viro Cc: Dan Williams Cc: Matthew Wilcox Cc: Ross Zwisler Cc: Andrew Morton Cc: Kirill A. Shutemov Cc: Dave Chinner Cc: Jan Kara Cc: Theodore Ts'o Cc: Andreas Dilger --- fs/dax.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ include/linux/dax.h | 2 ++ 2 files changed, 47 insertions(+) diff --git a/fs/dax.c b/fs/dax.c index 75ba46d..b54fdb9 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -1158,3 +1158,48 @@ int dax_truncate_page(struct inode *inode, loff_t from, get_block_t get_block) return dax_zero_page_range(inode, from, length, get_block); } EXPORT_SYMBOL_GPL(dax_truncate_page); + +/** + * dax_get_unmapped_area - handle get_unmapped_area for a DAX file + * @filp: The file being mmap'd, if not NULL + * @addr: The mmap address. If NULL, the kernel assigns the address + * @len: The mmap size in bytes + * @pgoff: The page offset in the file where the mapping starts from. + * @flags: The mmap flags + * + * This function can be called by a filesystem for get_unmapped_area(). + * When a target file is a DAX file, it aligns the mmap address at the + * beginning of the file by the pmd size. + * + * When the target file is not a DAX file, @addr is specified, the + * request is not suitable for pmd mappings, or mm->get_unmapped_area() + * failed with extended @len, it simply calls the default handler, + * mm->get_unmapped_area(), with the original arguments. + */ +unsigned long dax_get_unmapped_area(struct file *filp, unsigned long addr, + unsigned long len, unsigned long pgoff, unsigned long flags) +{ + unsigned long off, off_end, off_pmd, len_pmd, addr_pmd; + + if (IS_ENABLED(CONFIG_FS_DAX_PMD) && + filp && !addr && IS_DAX(filp->f_mapping->host)) { + off = pgoff << PAGE_SHIFT; + off_end = off + len; + off_pmd = round_up(off, PMD_SIZE); + + if ((off_end > off_pmd) && ((off_end - off_pmd) >= PMD_SIZE)) { + len_pmd = len + PMD_SIZE; + + addr_pmd = current->mm->get_unmapped_area( + filp, addr, len_pmd, pgoff, flags); + + if (!IS_ERR_VALUE(addr_pmd)) { + addr_pmd += (off - addr_pmd) & (PMD_SIZE - 1); + return addr_pmd; + } + } + } + + return current->mm->get_unmapped_area(filp, addr, len, pgoff, flags); +} +EXPORT_SYMBOL_GPL(dax_get_unmapped_area); diff --git a/include/linux/dax.h b/include/linux/dax.h index 636dd59..9d52de0 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h @@ -10,6 +10,8 @@ ssize_t dax_do_io(struct kiocb *, struct inode *, struct iov_iter *, loff_t, int dax_clear_sectors(struct block_device *bdev, sector_t _sector, long _size); int dax_zero_page_range(struct inode *, loff_t from, unsigned len, get_block_t); int dax_truncate_page(struct inode *, loff_t from, get_block_t); +unsigned long dax_get_unmapped_area(struct file *filp, unsigned long addr, + unsigned long len, unsigned long pgoff, unsigned long flags); int dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t, dax_iodone_t); int __dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t, From toshi.kani@hpe.com Tue Apr 12 15:48:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DEB127CA4 for ; Tue, 12 Apr 2016 15:48:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 60A5EAC006 for ; Tue, 12 Apr 2016 13:48:11 -0700 (PDT) X-ASG-Debug-ID: 1460494089-04bdf01105421f00001-NocioJ Received: from g1t5425.austin.hp.com (g1t5425.austin.hp.com [15.216.225.55]) by cuda.sgi.com with ESMTP id joAgQZfhE2B3LFQ1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 13:48:10 -0700 (PDT) X-Barracuda-Envelope-From: toshi.kani@hpe.com X-Barracuda-Apparent-Source-IP: 15.216.225.55 Received: from g2t2360.austin.hpecorp.net (g2t2360.austin.hpecorp.net [16.196.225.135]) by g1t5425.austin.hp.com (Postfix) with ESMTP id C5B9B5A; Tue, 12 Apr 2016 20:48:09 +0000 (UTC) Received: from misato.fc.hp.com (misato.fc.hp.com [16.78.168.61]) by g2t2360.austin.hpecorp.net (Postfix) with ESMTP id 0A4883A; Tue, 12 Apr 2016 20:48:08 +0000 (UTC) From: Toshi Kani To: akpm@linux-foundation.org, dan.j.williams@intel.com Cc: linux-nvdimm@lists.01.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, Toshi Kani , Dave Chinner , Matthew Wilcox , Ross Zwisler , Subject: [PATCH v2 3/5] xfs: call dax_get_unmapped_area() for DAX pmd mappings Date: Tue, 12 Apr 2016 14:39:30 -0600 X-ASG-Orig-Subj: [PATCH v2 3/5] xfs: call dax_get_unmapped_area() for DAX pmd mappings Message-Id: <1460493572-31667-2-git-send-email-toshi.kani@hpe.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1460493572-31667-1-git-send-email-toshi.kani@hpe.com> References: <1460493572-31667-1-git-send-email-toshi.kani@hpe.com> X-Barracuda-Connect: g1t5425.austin.hp.com[15.216.225.55] X-Barracuda-Start-Time: 1460494090 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28674 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header To support DAX pmd mappings with unmodified applications, filesystems need to align an mmap address by the pmd size. Call dax_get_unmapped_area() from f_op->get_unmapped_area. Note, there is no change in behavior for a non-DAX file. Signed-off-by: Toshi Kani Cc: Dave Chinner Cc: Dan Williams Cc: Matthew Wilcox Cc: Ross Zwisler Cc: --- fs/xfs/xfs_file.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 569938a..51c554b 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -1708,6 +1708,9 @@ const struct file_operations xfs_file_operations = { .open = xfs_file_open, .release = xfs_file_release, .fsync = xfs_file_fsync, +#ifdef CONFIG_FS_DAX + .get_unmapped_area = dax_get_unmapped_area, +#endif .fallocate = xfs_file_fallocate, }; From BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org Tue Apr 12 15:53:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DA38F7CA0 for ; Tue, 12 Apr 2016 15:53:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id AB384304066 for ; Tue, 12 Apr 2016 13:53:24 -0700 (PDT) X-ASG-Debug-ID: 1460494400-04cbb02e1d109b10001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id PTLSCIQNZxIMuFMW (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 12 Apr 2016 13:53:21 -0700 (PDT) X-Barracuda-Envelope-From: BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [67.51.76.21] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1aq5JG-0002lp-Ph; Tue, 12 Apr 2016 20:53:19 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: rpeterso@redhat.com, linux-fsdevel@vger.kernel.org Subject: iomap infrastructure and multipage writes V2 Date: Tue, 12 Apr 2016 13:52:54 -0700 X-ASG-Orig-Subj: iomap infrastructure and multipage writes V2 Message-Id: <1460494382-14547-1-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1460494401 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28675 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This series add a new file system I/O path that uses the iomap structure introduced for the pNFS support and support multi-page buffered writes. This was first started by Dave Chinner a long time ago, then I did beat it into shape for production runs in a very constrained ARM NAS enviroment for Tuxera almost as long ago, and now half a dozen rewrites later it's back. The basic idea is to avoid the crazy per-block get_blocks overhead and make use of extents in the buffered write path by iterating over them instead. Chances since V1: - add support for fiemap - fix a test fail on 1k block sizes - prepare for 64-bit length, this will be used in a follow on patchset From BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org Tue Apr 12 15:53:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 605117CA4 for ; Tue, 12 Apr 2016 15:53:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 16C59304066 for ; Tue, 12 Apr 2016 13:53:30 -0700 (PDT) X-ASG-Debug-ID: 1460494405-04bdf011024220d0001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id MZM3P0gpR2rWH8Ax (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 12 Apr 2016 13:53:27 -0700 (PDT) X-Barracuda-Envelope-From: BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [67.51.76.21] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1aq5JM-0002lw-Rw; Tue, 12 Apr 2016 20:53:25 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: rpeterso@redhat.com, linux-fsdevel@vger.kernel.org Subject: [PATCH 1/8] fs: move struct iomap from exportfs.h to a separate header Date: Tue, 12 Apr 2016 13:52:55 -0700 X-ASG-Orig-Subj: [PATCH 1/8] fs: move struct iomap from exportfs.h to a separate header Message-Id: <1460494382-14547-2-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1460494382-14547-1-git-send-email-hch@lst.de> References: <1460494382-14547-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1460494406 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28675 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Christoph Hellwig --- fs/nfsd/blocklayout.c | 1 + fs/nfsd/blocklayoutxdr.c | 1 + fs/xfs/xfs_pnfs.c | 1 + include/linux/exportfs.h | 16 +--------------- include/linux/iomap.h | 21 +++++++++++++++++++++ 5 files changed, 25 insertions(+), 15 deletions(-) create mode 100644 include/linux/iomap.h diff --git a/fs/nfsd/blocklayout.c b/fs/nfsd/blocklayout.c index e55b524..4df16ae 100644 --- a/fs/nfsd/blocklayout.c +++ b/fs/nfsd/blocklayout.c @@ -2,6 +2,7 @@ * Copyright (c) 2014-2016 Christoph Hellwig. */ #include +#include #include #include #include diff --git a/fs/nfsd/blocklayoutxdr.c b/fs/nfsd/blocklayoutxdr.c index 6c3b316..4ebaaf4 100644 --- a/fs/nfsd/blocklayoutxdr.c +++ b/fs/nfsd/blocklayoutxdr.c @@ -3,6 +3,7 @@ */ #include #include +#include #include #include "nfsd.h" diff --git a/fs/xfs/xfs_pnfs.c b/fs/xfs/xfs_pnfs.c index 3332bae..0a56787 100644 --- a/fs/xfs/xfs_pnfs.c +++ b/fs/xfs/xfs_pnfs.c @@ -1,6 +1,7 @@ /* * Copyright (c) 2014 Christoph Hellwig. */ +#include #include "xfs.h" #include "xfs_format.h" #include "xfs_log_format.h" diff --git a/include/linux/exportfs.h b/include/linux/exportfs.h index d841450..b03c062 100644 --- a/include/linux/exportfs.h +++ b/include/linux/exportfs.h @@ -6,6 +6,7 @@ struct dentry; struct iattr; struct inode; +struct iomap; struct super_block; struct vfsmount; @@ -187,21 +188,6 @@ struct fid { * get_name is not (which is possibly inconsistent) */ -/* types of block ranges for multipage write mappings. */ -#define IOMAP_HOLE 0x01 /* no blocks allocated, need allocation */ -#define IOMAP_DELALLOC 0x02 /* delayed allocation blocks */ -#define IOMAP_MAPPED 0x03 /* blocks allocated @blkno */ -#define IOMAP_UNWRITTEN 0x04 /* blocks allocated @blkno in unwritten state */ - -#define IOMAP_NULL_BLOCK -1LL /* blkno is not valid */ - -struct iomap { - sector_t blkno; /* first sector of mapping */ - loff_t offset; /* file offset of mapping, bytes */ - u64 length; /* length of mapping, bytes */ - int type; /* type of mapping */ -}; - struct export_operations { int (*encode_fh)(struct inode *inode, __u32 *fh, int *max_len, struct inode *parent); diff --git a/include/linux/iomap.h b/include/linux/iomap.h new file mode 100644 index 0000000..1b22197 --- /dev/null +++ b/include/linux/iomap.h @@ -0,0 +1,21 @@ +#ifndef LINUX_IOMAP_H +#define LINUX_IOMAP_H 1 + +#include + +/* types of block ranges for multipage write mappings. */ +#define IOMAP_HOLE 0x01 /* no blocks allocated, need allocation */ +#define IOMAP_DELALLOC 0x02 /* delayed allocation blocks */ +#define IOMAP_MAPPED 0x03 /* blocks allocated @blkno */ +#define IOMAP_UNWRITTEN 0x04 /* blocks allocated @blkno in unwritten state */ + +#define IOMAP_NULL_BLOCK -1LL /* blkno is not valid */ + +struct iomap { + sector_t blkno; /* first sector of mapping */ + loff_t offset; /* file offset of mapping, bytes */ + u64 length; /* length of mapping, bytes */ + int type; /* type of mapping */ +}; + +#endif /* LINUX_IOMAP_H */ -- 2.1.4 From BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org Tue Apr 12 15:53:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4D6977CA0 for ; Tue, 12 Apr 2016 15:53:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C5696AC006 for ; Tue, 12 Apr 2016 13:53:34 -0700 (PDT) X-ASG-Debug-ID: 1460494409-04bdf011044220e0001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id YQZxSxxL9r8bkuWH (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 12 Apr 2016 13:53:30 -0700 (PDT) X-Barracuda-Envelope-From: BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [67.51.76.21] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1aq5JQ-0002mQ-Sm; Tue, 12 Apr 2016 20:53:29 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: rpeterso@redhat.com, linux-fsdevel@vger.kernel.org Subject: [PATCH 2/8] fs: introduce iomap infrastructure Date: Tue, 12 Apr 2016 13:52:56 -0700 X-ASG-Orig-Subj: [PATCH 2/8] fs: introduce iomap infrastructure Message-Id: <1460494382-14547-3-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1460494382-14547-1-git-send-email-hch@lst.de> References: <1460494382-14547-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1460494410 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28675 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Add infrastructure for multipage buffered writes. This is implemented using an main iterator that applies an actor function to a range that can be written. This infrastucture is used to implement a buffered write helper, one to zero file ranges and one to implement the ->page_mkwrite VM operations. All of them borrow a fair amount of code from fs/buffers. for now by using an internal version of __block_write_begin that gets passed an iomap and builds the corresponding buffer head. The file system is gets a set of paired ->iomap_begin and ->iomap_end calls which allow it to map/reserve a range and get a notification once the write code is finished with it. Based on earlier code from Dave Chinner. Signed-off-by: Christoph Hellwig --- fs/Kconfig | 3 + fs/Makefile | 1 + fs/buffer.c | 76 +++++++++- fs/internal.h | 3 + fs/iomap.c | 387 ++++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/iomap.h | 56 +++++++- 6 files changed, 516 insertions(+), 10 deletions(-) create mode 100644 fs/iomap.c diff --git a/fs/Kconfig b/fs/Kconfig index 6725f59..276fcfb 100644 --- a/fs/Kconfig +++ b/fs/Kconfig @@ -10,6 +10,9 @@ config DCACHE_WORD_ACCESS if BLOCK +config FS_IOMAP + bool + source "fs/ext2/Kconfig" source "fs/ext4/Kconfig" source "fs/jbd2/Kconfig" diff --git a/fs/Makefile b/fs/Makefile index 85b6e13..ed2b632 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -49,6 +49,7 @@ obj-$(CONFIG_COREDUMP) += coredump.o obj-$(CONFIG_SYSCTL) += drop_caches.o obj-$(CONFIG_FHANDLE) += fhandle.o +obj-$(CONFIG_FS_IOMAP) += iomap.o obj-y += quota/ diff --git a/fs/buffer.c b/fs/buffer.c index 33be296..a003fd4 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -1891,8 +1892,62 @@ void page_zero_new_buffers(struct page *page, unsigned from, unsigned to) } EXPORT_SYMBOL(page_zero_new_buffers); -int __block_write_begin(struct page *page, loff_t pos, unsigned len, - get_block_t *get_block) +static void +iomap_to_bh(struct inode *inode, sector_t block, struct buffer_head *bh, + struct iomap *iomap) +{ + loff_t offset = block << inode->i_blkbits; + + bh->b_bdev = iomap->bdev; + + /* + * Block points to offset in file we need to map, iomap contains + * the offset at which the map starts. If the map ends before the + * current block, then do not map the buffer and let the caller + * handle it. + */ + BUG_ON(offset >= iomap->offset + iomap->length); + + switch (iomap->type) { + case IOMAP_HOLE: + /* + * If the buffer is not up to date or beyond the current EOF, + * we need to mark it as new to ensure sub-block zeroing is + * executed if necessary. + */ + if (!buffer_uptodate(bh) || + (offset >= i_size_read(inode))) + set_buffer_new(bh); + break; + case IOMAP_DELALLOC: + if (!buffer_uptodate(bh) || + (offset >= i_size_read(inode))) + set_buffer_new(bh); + set_buffer_uptodate(bh); + set_buffer_mapped(bh); + set_buffer_delay(bh); + break; + case IOMAP_UNWRITTEN: + /* + * For unwritten regions, we always need to ensure that + * sub-block writes cause the regions in the block we are not + * writing to are zeroed. Set the buffer as new to ensre this. + */ + set_buffer_new(bh); + set_buffer_unwritten(bh); + /* FALLTHRU */ + case IOMAP_MAPPED: + if (offset >= i_size_read(inode)) + set_buffer_new(bh); + bh->b_blocknr = (iomap->blkno >> (inode->i_blkbits - 9)) + + ((offset - iomap->offset) >> inode->i_blkbits); + set_buffer_mapped(bh); + break; + } +} + +int __block_write_begin_int(struct page *page, loff_t pos, unsigned len, + get_block_t *get_block, struct iomap *iomap) { unsigned from = pos & (PAGE_CACHE_SIZE - 1); unsigned to = from + len; @@ -1928,9 +1983,14 @@ int __block_write_begin(struct page *page, loff_t pos, unsigned len, clear_buffer_new(bh); if (!buffer_mapped(bh)) { WARN_ON(bh->b_size != blocksize); - err = get_block(inode, block, bh, 1); - if (err) - break; + if (get_block) { + err = get_block(inode, block, bh, 1); + if (err) + break; + } else { + iomap_to_bh(inode, block, bh, iomap); + } + if (buffer_new(bh)) { unmap_underlying_metadata(bh->b_bdev, bh->b_blocknr); @@ -1971,6 +2031,12 @@ int __block_write_begin(struct page *page, loff_t pos, unsigned len, page_zero_new_buffers(page, from, to); return err; } + +int __block_write_begin(struct page *page, loff_t pos, unsigned len, + get_block_t *get_block) +{ + return __block_write_begin_int(page, pos, len, get_block, NULL); +} EXPORT_SYMBOL(__block_write_begin); static int __block_commit_write(struct inode *inode, struct page *page, diff --git a/fs/internal.h b/fs/internal.h index b71deee..c0c6f49 100644 --- a/fs/internal.h +++ b/fs/internal.h @@ -11,6 +11,7 @@ struct super_block; struct file_system_type; +struct iomap; struct linux_binprm; struct path; struct mount; @@ -39,6 +40,8 @@ static inline int __sync_blockdev(struct block_device *bdev, int wait) * buffer.c */ extern void guard_bio_eod(int rw, struct bio *bio); +extern int __block_write_begin_int(struct page *page, loff_t pos, unsigned len, + get_block_t *get_block, struct iomap *iomap); /* * char_dev.c diff --git a/fs/iomap.c b/fs/iomap.c new file mode 100644 index 0000000..534cb37 --- /dev/null +++ b/fs/iomap.c @@ -0,0 +1,387 @@ +/* + * Copyright (C) 2010 Red Hat, Inc. + * Copyright (c) 2016 Christoph Hellwig. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "internal.h" + +typedef loff_t (*iomap_actor_t)(struct inode *inode, loff_t pos, loff_t len, + void *data, struct iomap *iomap); + +/* + * Execute a iomap write on a segment of the mapping that spans a + * contiguous range of pages that have identical block mapping state. + * + * This avoids the need to map pages individually, do individual allocations + * for each page and most importantly avoid the need for filesystem specific + * locking per page. Instead, all the operations are amortised over the entire + * range of pages. It is assumed that the filesystems will lock whatever + * resources they require in the iomap_begin call, and release them in the + * iomap_end call. + */ +static loff_t +iomap_apply(struct inode *inode, loff_t pos, loff_t length, unsigned flags, + struct iomap_ops *ops, void *data, iomap_actor_t actor) +{ + struct iomap iomap = { 0 }; + loff_t written = 0, ret; + + /* + * Need to map a range from start position for count bytes. This can + * span multiple pages - it is only guaranteed to return a range of a + * single type of pages (e.g. all into a hole, all mapped or all + * unwritten). Failure at this point has nothing to undo. + * + * If allocation is required for this range, reserve the space now so + * that the allocation is guaranteed to succeed later on. Once we copy + * the data into the page cache pages, then we cannot fail otherwise we + * expose transient stale data. If the reserve fails, we can safely + * back out at this point as there is nothing to undo. + */ + ret = ops->iomap_begin(inode, pos, length, flags, &iomap); + if (ret) + return ret; + if (WARN_ON(iomap.offset > pos)) + return -EIO; + + /* + * Cut down the length to the one actually provided by the filesystem, + * as it might not be able to give us the whole size that we requested. + */ + if (iomap.offset + iomap.length < pos + length) + length = iomap.offset + iomap.length - pos; + + /* + * Now that we have guaranteed that the space allocation will succeed. + * we can do the copy-in page by page without having to worry about + * failures exposing transient data. + */ + written = actor(inode, pos, length, data, &iomap); + + /* + * Now the data has been copied, commit the range we've copied. This + * should not fail unless the filesystem has had a fatal error. + */ + ret = ops->iomap_end(inode, pos, length, written > 0 ? written : 0, + flags, &iomap); + + return written ? written : ret; +} + +static void +iomap_write_failed(struct inode *inode, loff_t pos, unsigned len) +{ + loff_t i_size = i_size_read(inode); + + /* + * Only truncate newly allocated pages beyoned EOF, even if the + * write started inside the existing inode size. + */ + if (pos + len > i_size) + truncate_pagecache_range(inode, max(pos, i_size), pos + len); +} + +static int +iomap_write_begin(struct inode *inode, loff_t pos, unsigned len, unsigned flags, + struct page **pagep, struct iomap *iomap) +{ + pgoff_t index = pos >> PAGE_SHIFT; + struct page *page; + int status = 0; + + BUG_ON(pos + len > iomap->offset + iomap->length); + + page = grab_cache_page_write_begin(inode->i_mapping, index, flags); + if (!page) + return -ENOMEM; + + status = __block_write_begin_int(page, pos, len, NULL, iomap); + if (unlikely(status)) { + unlock_page(page); + page_cache_release(page); + page = NULL; + + iomap_write_failed(inode, pos, len); + } + + *pagep = page; + return status; +} + +static int +iomap_write_end(struct inode *inode, loff_t pos, unsigned len, + unsigned copied, struct page *page) +{ + int ret; + + ret = generic_write_end(NULL, inode->i_mapping, pos, len, + copied, page, NULL); + if (ret < len) + iomap_write_failed(inode, pos, len); + return ret; +} + +static loff_t +iomap_write_actor(struct inode *inode, loff_t pos, loff_t length, void *data, + struct iomap *iomap) +{ + struct iov_iter *i = data; + long status = 0; + ssize_t written = 0; + unsigned int flags = AOP_FLAG_NOFS; + + /* + * Copies from kernel address space cannot fail (NFSD is a big user). + */ + if (!iter_is_iovec(i)) + flags |= AOP_FLAG_UNINTERRUPTIBLE; + + do { + struct page *page; + unsigned long offset; /* Offset into pagecache page */ + unsigned long bytes; /* Bytes to write to page */ + size_t copied; /* Bytes copied from user */ + + offset = (pos & (PAGE_SIZE - 1)); + bytes = min_t(unsigned long, PAGE_SIZE - offset, + iov_iter_count(i)); +again: + if (bytes > length) + bytes = length; + + /* + * Bring in the user page that we will copy from _first_. + * Otherwise there's a nasty deadlock on copying from the + * same page as we're writing to, without it being marked + * up-to-date. + * + * Not only is this an optimisation, but it is also required + * to check that the address is actually valid, when atomic + * usercopies are used, below. + */ + if (unlikely(iov_iter_fault_in_readable(i, bytes))) { + status = -EFAULT; + break; + } + + status = iomap_write_begin(inode, pos, bytes, flags, &page, + iomap); + if (unlikely(status)) + break; + + if (mapping_writably_mapped(inode->i_mapping)) + flush_dcache_page(page); + + pagefault_disable(); + copied = iov_iter_copy_from_user_atomic(page, i, offset, bytes); + pagefault_enable(); + + flush_dcache_page(page); + mark_page_accessed(page); + + status = iomap_write_end(inode, pos, bytes, copied, page); + if (unlikely(status < 0)) + break; + copied = status; + + cond_resched(); + + iov_iter_advance(i, copied); + if (unlikely(copied == 0)) { + /* + * If we were unable to copy any data at all, we must + * fall back to a single segment length write. + * + * If we didn't fallback here, we could livelock + * because not all segments in the iov can be copied at + * once without a pagefault. + */ + bytes = min_t(unsigned long, PAGE_SIZE - offset, + iov_iter_single_seg_count(i)); + goto again; + } + pos += copied; + written += copied; + length -= copied; + + balance_dirty_pages_ratelimited(inode->i_mapping); + } while (iov_iter_count(i) && length); + + return written ? written : status; +} + +ssize_t +iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *iter, + struct iomap_ops *ops) +{ + struct inode *inode = iocb->ki_filp->f_mapping->host; + loff_t pos = iocb->ki_pos, ret = 0, written = 0; + + while (iov_iter_count(iter)) { + ret = iomap_apply(inode, pos, iov_iter_count(iter), + IOMAP_WRITE, ops, iter, iomap_write_actor); + if (ret <= 0) + break; + pos += ret; + written += ret; + } + + return written ? written : ret; +} +EXPORT_SYMBOL_GPL(iomap_file_buffered_write); + +static loff_t +iomap_zero_range_actor(struct inode *inode, loff_t pos, loff_t count, + void *data, struct iomap *iomap) +{ + bool *did_zero = data; + struct page *page; + int status; + loff_t written = 0; + + /* already zeroed? we're done. */ + if (iomap->type == IOMAP_HOLE || iomap->type == IOMAP_UNWRITTEN) + return count; + + do { + unsigned offset, bytes; + + offset = pos & (PAGE_SIZE - 1); /* Within page */ + bytes = min_t(unsigned, PAGE_SIZE - offset, count); + + status = iomap_write_begin(inode, pos, bytes, + AOP_FLAG_UNINTERRUPTIBLE | AOP_FLAG_NOFS, + &page, iomap); + if (status) + break; + + zero_user(page, offset, bytes); + mark_page_accessed(page); + + status = iomap_write_end(inode, pos, bytes, bytes, page); + if (status) + break; + + pos += bytes; + count -= bytes; + written += bytes; + if (did_zero) + *did_zero = true; + } while (count > 0); + + return status ? status : written; +} + +int +iomap_zero_range(struct inode *inode, loff_t pos, loff_t len, bool *did_zero, + struct iomap_ops *ops) +{ + loff_t ret; + + while (len > 0) { + ret = iomap_apply(inode, pos, len, IOMAP_ZERO, + ops, did_zero, iomap_zero_range_actor); + if (ret <= 0) + return ret; + + pos += ret; + len -= ret; + } + + return 0; +} +EXPORT_SYMBOL_GPL(iomap_zero_range); + +int +iomap_truncate_page(struct inode *inode, loff_t pos, bool *did_zero, + struct iomap_ops *ops) +{ + unsigned blocksize = (1 << inode->i_blkbits); + unsigned off = pos & (blocksize - 1); + + /* Block boundary? Nothing to do */ + if (!off) + return 0; + return iomap_zero_range(inode, pos, blocksize - off, did_zero, ops); +} +EXPORT_SYMBOL_GPL(iomap_truncate_page); + +static loff_t +iomap_page_mkwrite_actor(struct inode *inode, loff_t pos, loff_t length, + void *data, struct iomap *iomap) +{ + struct page *page = data; + int ret; + + ret = __block_write_begin_int(page, pos & ~PAGE_MASK, length, + NULL, iomap); + if (ret) + return ret; + + block_commit_write(page, 0, length); + return length; +} + +int iomap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf, + struct iomap_ops *ops) +{ + struct page *page = vmf->page; + struct inode *inode = file_inode(vma->vm_file); + unsigned long length; + loff_t offset, size; + ssize_t ret; + + lock_page(page); + size = i_size_read(inode); + if ((page->mapping != inode->i_mapping) || + (page_offset(page) > size)) { + /* We overload EFAULT to mean page got truncated */ + ret = -EFAULT; + goto out_unlock; + } + + /* page is wholly or partially inside EOF */ + if (((page->index + 1) << PAGE_SHIFT) > size) + length = size & ~PAGE_MASK; + else + length = PAGE_SIZE; + + offset = page_offset(page); + while (length > 0) { + ret = iomap_apply(inode, offset, length, IOMAP_WRITE, + ops, page, iomap_page_mkwrite_actor); + if (unlikely(ret <= 0)) + goto out_unlock; + offset += ret; + length -= ret; + } + + set_page_dirty(page); + wait_for_stable_page(page); + return 0; +out_unlock: + unlock_page(page); + return ret; +} +EXPORT_SYMBOL_GPL(iomap_page_mkwrite); diff --git a/include/linux/iomap.h b/include/linux/iomap.h index 1b22197..854766f 100644 --- a/include/linux/iomap.h +++ b/include/linux/iomap.h @@ -3,19 +3,65 @@ #include -/* types of block ranges for multipage write mappings. */ +struct inode; +struct iov_iter; +struct kiocb; +struct vm_area_struct; +struct vm_fault; + +/* + * Types of block ranges for iomap mappings: + */ #define IOMAP_HOLE 0x01 /* no blocks allocated, need allocation */ #define IOMAP_DELALLOC 0x02 /* delayed allocation blocks */ #define IOMAP_MAPPED 0x03 /* blocks allocated @blkno */ #define IOMAP_UNWRITTEN 0x04 /* blocks allocated @blkno in unwritten state */ +/* + * Magic value for blkno: + */ #define IOMAP_NULL_BLOCK -1LL /* blkno is not valid */ struct iomap { - sector_t blkno; /* first sector of mapping */ - loff_t offset; /* file offset of mapping, bytes */ - u64 length; /* length of mapping, bytes */ - int type; /* type of mapping */ + sector_t blkno; /* first sector of mapping, fs blocks */ + loff_t offset; /* file offset of mapping, bytes */ + u64 length; /* length of mapping, bytes */ + int type; /* type of mapping */ + struct block_device *bdev; /* block device for I/O */ +}; + +/* + * Flags for iomap_begin / iomap_end. No flag implies a read. + */ +#define IOMAP_WRITE (1 << 0) +#define IOMAP_ZERO (1 << 1) + +struct iomap_ops { + /* + * Return the existing mapping at pos, or reserve space starting at + * pos for up to length, as long as we can do it as a single mapping. + * The actual length is returned in iomap->length. + */ + int (*iomap_begin)(struct inode *inode, loff_t pos, loff_t length, + unsigned flags, struct iomap *iomap); + + /* + * Commit and/or unreserve space previous allocated using iomap_begin. + * Written indicates the length of the successful write operation which + * needs to be commited, while the rest needs to be unreserved. + * Written might be zero if no data was written. + */ + int (*iomap_end)(struct inode *inode, loff_t pos, loff_t length, + ssize_t written, unsigned flags, struct iomap *iomap); }; +ssize_t iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *from, + struct iomap_ops *ops); +int iomap_zero_range(struct inode *inode, loff_t pos, loff_t len, + bool *did_zero, struct iomap_ops *ops); +int iomap_truncate_page(struct inode *inode, loff_t pos, bool *did_zero, + struct iomap_ops *ops); +int iomap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf, + struct iomap_ops *ops); + #endif /* LINUX_IOMAP_H */ -- 2.1.4 From BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org Tue Apr 12 15:53:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BB68C7CA0 for ; Tue, 12 Apr 2016 15:53:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8E1A08F8039 for ; Tue, 12 Apr 2016 13:53:37 -0700 (PDT) X-ASG-Debug-ID: 1460494415-04cbb02e1d109b20001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id 0BiLl9bw8S8zeJ34 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 12 Apr 2016 13:53:35 -0700 (PDT) X-Barracuda-Envelope-From: BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [67.51.76.21] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1aq5JW-0002mX-1j; Tue, 12 Apr 2016 20:53:34 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: rpeterso@redhat.com, linux-fsdevel@vger.kernel.org Subject: [PATCH 3/8] xfs: make xfs_bmbt_to_iomap available outside of xfs_pnfs.c Date: Tue, 12 Apr 2016 13:52:57 -0700 X-ASG-Orig-Subj: [PATCH 3/8] xfs: make xfs_bmbt_to_iomap available outside of xfs_pnfs.c Message-Id: <1460494382-14547-4-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1460494382-14547-1-git-send-email-hch@lst.de> References: <1460494382-14547-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1460494415 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28675 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- And ensure it works for RT subvolume files an set the block device, both of which will be needed to be able to use the function in the buffered write path. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_iomap.c | 27 +++++++++++++++++++++++++++ fs/xfs/xfs_iomap.h | 4 ++++ fs/xfs/xfs_pnfs.c | 26 -------------------------- 3 files changed, 31 insertions(+), 26 deletions(-) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 5839135..2f37194 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -15,6 +15,7 @@ * along with this program; if not, write the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include "xfs.h" #include "xfs_fs.h" #include "xfs_shared.h" @@ -940,3 +941,29 @@ error_on_bmapi_transaction: xfs_iunlock(ip, XFS_ILOCK_EXCL); return error; } + +void +xfs_bmbt_to_iomap( + struct xfs_inode *ip, + struct iomap *iomap, + struct xfs_bmbt_irec *imap) +{ + struct xfs_mount *mp = ip->i_mount; + + if (imap->br_startblock == HOLESTARTBLOCK) { + iomap->blkno = IOMAP_NULL_BLOCK; + iomap->type = IOMAP_HOLE; + } else if (imap->br_startblock == DELAYSTARTBLOCK) { + iomap->blkno = IOMAP_NULL_BLOCK; + iomap->type = IOMAP_DELALLOC; + } else { + iomap->blkno = xfs_fsb_to_db(ip, imap->br_startblock); + if (imap->br_state == XFS_EXT_UNWRITTEN) + iomap->type = IOMAP_UNWRITTEN; + else + iomap->type = IOMAP_MAPPED; + } + iomap->offset = XFS_FSB_TO_B(mp, imap->br_startoff); + iomap->length = XFS_FSB_TO_B(mp, imap->br_blockcount); + iomap->bdev = xfs_find_bdev_for_inode(VFS_I(ip)); +} diff --git a/fs/xfs/xfs_iomap.h b/fs/xfs/xfs_iomap.h index 8688e66..718f07c 100644 --- a/fs/xfs/xfs_iomap.h +++ b/fs/xfs/xfs_iomap.h @@ -18,6 +18,7 @@ #ifndef __XFS_IOMAP_H__ #define __XFS_IOMAP_H__ +struct iomap; struct xfs_inode; struct xfs_bmbt_irec; @@ -29,4 +30,7 @@ int xfs_iomap_write_allocate(struct xfs_inode *, xfs_off_t, struct xfs_bmbt_irec *); int xfs_iomap_write_unwritten(struct xfs_inode *, xfs_off_t, xfs_off_t); +void xfs_bmbt_to_iomap(struct xfs_inode *, struct iomap *, + struct xfs_bmbt_irec *); + #endif /* __XFS_IOMAP_H__*/ diff --git a/fs/xfs/xfs_pnfs.c b/fs/xfs/xfs_pnfs.c index 0a56787..dc1a71f 100644 --- a/fs/xfs/xfs_pnfs.c +++ b/fs/xfs/xfs_pnfs.c @@ -80,32 +80,6 @@ xfs_fs_get_uuid( return 0; } -static void -xfs_bmbt_to_iomap( - struct xfs_inode *ip, - struct iomap *iomap, - struct xfs_bmbt_irec *imap) -{ - struct xfs_mount *mp = ip->i_mount; - - if (imap->br_startblock == HOLESTARTBLOCK) { - iomap->blkno = IOMAP_NULL_BLOCK; - iomap->type = IOMAP_HOLE; - } else if (imap->br_startblock == DELAYSTARTBLOCK) { - iomap->blkno = IOMAP_NULL_BLOCK; - iomap->type = IOMAP_DELALLOC; - } else { - iomap->blkno = - XFS_FSB_TO_DADDR(ip->i_mount, imap->br_startblock); - if (imap->br_state == XFS_EXT_UNWRITTEN) - iomap->type = IOMAP_UNWRITTEN; - else - iomap->type = IOMAP_MAPPED; - } - iomap->offset = XFS_FSB_TO_B(mp, imap->br_startoff); - iomap->length = XFS_FSB_TO_B(mp, imap->br_blockcount); -} - /* * Get a layout for the pNFS client. */ -- 2.1.4 From BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org Tue Apr 12 15:53:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B81AC7CA4 for ; Tue, 12 Apr 2016 15:53:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8C61E8F8050 for ; Tue, 12 Apr 2016 13:53:45 -0700 (PDT) X-ASG-Debug-ID: 1460494421-04cb6c2460421530001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id EHpSbEhtFz8RSiqC (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 12 Apr 2016 13:53:42 -0700 (PDT) X-Barracuda-Envelope-From: BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [67.51.76.21] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1aq5Jb-0002mi-Sn; Tue, 12 Apr 2016 20:53:41 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: rpeterso@redhat.com, linux-fsdevel@vger.kernel.org Subject: [PATCH 4/8] xfs: reorder zeroing and flushing sequence in truncate Date: Tue, 12 Apr 2016 13:52:58 -0700 X-ASG-Orig-Subj: [PATCH 4/8] xfs: reorder zeroing and flushing sequence in truncate Message-Id: <1460494382-14547-5-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1460494382-14547-1-git-send-email-hch@lst.de> References: <1460494382-14547-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1460494421 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28675 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Currently zeroing out blocks and waiting for writeout is a bit of a mess in truncate. This patch gives it a clear order in preparation for the iomap path: (1) we first wait for any direct I/O to complete to prevent any races for it (2) we then perform the actual zeroing, and only use the truncate_page helpers for truncating down. The truncate up case already is handled by the separate call to xfs_zero_eof. (3) only then we write back dirty data, as zeroing block may cause dirty pages when using either xfs_zero_eof or the new iomap infrastructure. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_iops.c | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index c5d4eba..1e2086d 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -801,20 +801,35 @@ xfs_setattr_size( return error; /* + * Wait for all direct I/O to complete. + */ + inode_dio_wait(inode); + + /* * File data changes must be complete before we start the transaction to * modify the inode. This needs to be done before joining the inode to * the transaction because the inode cannot be unlocked once it is a * part of the transaction. * - * Start with zeroing any data block beyond EOF that we may expose on - * file extension. + * Start with zeroing any data beyond EOF that we may expose on file + & extension, or zeroing out the rest of the block on a downward + * truncate. */ if (newsize > oldsize) { error = xfs_zero_eof(ip, newsize, oldsize, &did_zeroing); - if (error) - return error; + } else { + if (IS_DAX(inode)) { + error = dax_truncate_page(inode, newsize, + xfs_get_blocks_direct); + } else { + error = block_truncate_page(inode->i_mapping, newsize, + xfs_get_blocks); + } } + if (error) + return error; + /* * We are going to log the inode size change in this transaction so * any previous writes that are beyond the on disk EOF and the new @@ -831,9 +846,6 @@ xfs_setattr_size( return error; } - /* Now wait for all direct I/O to complete. */ - inode_dio_wait(inode); - /* * We've already locked out new page faults, so now we can safely remove * pages from the page cache knowing they won't get refaulted until we @@ -851,13 +863,6 @@ xfs_setattr_size( * to hope that the caller sees ENOMEM and retries the truncate * operation. */ - if (IS_DAX(inode)) - error = dax_truncate_page(inode, newsize, xfs_get_blocks_direct); - else - error = block_truncate_page(inode->i_mapping, newsize, - xfs_get_blocks); - if (error) - return error; truncate_setsize(inode, newsize); error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp); -- 2.1.4 From BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org Tue Apr 12 15:53:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 49A917CA1 for ; Tue, 12 Apr 2016 15:53:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id CF197AC007 for ; Tue, 12 Apr 2016 13:53:51 -0700 (PDT) X-ASG-Debug-ID: 1460494426-04bdf01102422110001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id bBCXDfbADg75VTg0 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 12 Apr 2016 13:53:47 -0700 (PDT) X-Barracuda-Envelope-From: BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [67.51.76.21] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1aq5Jh-0002mp-Bk; Tue, 12 Apr 2016 20:53:46 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: rpeterso@redhat.com, linux-fsdevel@vger.kernel.org Subject: [PATCH 5/8] xfs: implement iomap based buffered write path Date: Tue, 12 Apr 2016 13:52:59 -0700 X-ASG-Orig-Subj: [PATCH 5/8] xfs: implement iomap based buffered write path Message-Id: <1460494382-14547-6-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1460494382-14547-1-git-send-email-hch@lst.de> References: <1460494382-14547-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1460494427 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28675 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Convert XFS to use the new iomap based multipage write path. This involves implementing the ->iomap_begin and ->iomap_end methods, and switching the buffered file write, page_mkwrite and xfs_iozero paths to the new iomap helpers. With this change __xfs_get_blocks will never be used for buffered writes, and the code handling them can be removed. Based on earlier code from Dave Chinner. Signed-off-by: Christoph Hellwig --- fs/xfs/Kconfig | 1 + fs/xfs/xfs_aops.c | 212 ----------------------------------------------------- fs/xfs/xfs_file.c | 71 ++++++++---------- fs/xfs/xfs_iomap.c | 144 ++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_iomap.h | 5 +- fs/xfs/xfs_iops.c | 9 ++- fs/xfs/xfs_trace.h | 3 + 7 files changed, 187 insertions(+), 258 deletions(-) diff --git a/fs/xfs/Kconfig b/fs/xfs/Kconfig index 5d47b4d..35faf12 100644 --- a/fs/xfs/Kconfig +++ b/fs/xfs/Kconfig @@ -4,6 +4,7 @@ config XFS_FS depends on (64BIT || LBDAF) select EXPORTFS select LIBCRC32C + select FS_IOMAP help XFS is a high performance journaling filesystem which originated on the SGI IRIX platform. It is completely multi-threaded, can diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 40645a4..e481c80 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1429,216 +1429,6 @@ xfs_vm_direct_IO( xfs_get_blocks_direct, endio, NULL, flags); } -/* - * Punch out the delalloc blocks we have already allocated. - * - * Don't bother with xfs_setattr given that nothing can have made it to disk yet - * as the page is still locked at this point. - */ -STATIC void -xfs_vm_kill_delalloc_range( - struct inode *inode, - loff_t start, - loff_t end) -{ - struct xfs_inode *ip = XFS_I(inode); - xfs_fileoff_t start_fsb; - xfs_fileoff_t end_fsb; - int error; - - start_fsb = XFS_B_TO_FSB(ip->i_mount, start); - end_fsb = XFS_B_TO_FSB(ip->i_mount, end); - if (end_fsb <= start_fsb) - return; - - xfs_ilock(ip, XFS_ILOCK_EXCL); - error = xfs_bmap_punch_delalloc_range(ip, start_fsb, - end_fsb - start_fsb); - if (error) { - /* something screwed, just bail */ - if (!XFS_FORCED_SHUTDOWN(ip->i_mount)) { - xfs_alert(ip->i_mount, - "xfs_vm_write_failed: unable to clean up ino %lld", - ip->i_ino); - } - } - xfs_iunlock(ip, XFS_ILOCK_EXCL); -} - -STATIC void -xfs_vm_write_failed( - struct inode *inode, - struct page *page, - loff_t pos, - unsigned len) -{ - loff_t block_offset; - loff_t block_start; - loff_t block_end; - loff_t from = pos & (PAGE_CACHE_SIZE - 1); - loff_t to = from + len; - struct buffer_head *bh, *head; - struct xfs_mount *mp = XFS_I(inode)->i_mount; - - /* - * The request pos offset might be 32 or 64 bit, this is all fine - * on 64-bit platform. However, for 64-bit pos request on 32-bit - * platform, the high 32-bit will be masked off if we evaluate the - * block_offset via (pos & PAGE_MASK) because the PAGE_MASK is - * 0xfffff000 as an unsigned long, hence the result is incorrect - * which could cause the following ASSERT failed in most cases. - * In order to avoid this, we can evaluate the block_offset of the - * start of the page by using shifts rather than masks the mismatch - * problem. - */ - block_offset = (pos >> PAGE_CACHE_SHIFT) << PAGE_CACHE_SHIFT; - - ASSERT(block_offset + from == pos); - - head = page_buffers(page); - block_start = 0; - for (bh = head; bh != head || !block_start; - bh = bh->b_this_page, block_start = block_end, - block_offset += bh->b_size) { - block_end = block_start + bh->b_size; - - /* skip buffers before the write */ - if (block_end <= from) - continue; - - /* if the buffer is after the write, we're done */ - if (block_start >= to) - break; - - /* - * Process delalloc and unwritten buffers beyond EOF. We can - * encounter unwritten buffers in the event that a file has - * post-EOF unwritten extents and an extending write happens to - * fail (e.g., an unaligned write that also involves a delalloc - * to the same page). - */ - if (!buffer_delay(bh) && !buffer_unwritten(bh)) - continue; - - if (!xfs_mp_fail_writes(mp) && !buffer_new(bh) && - block_offset < i_size_read(inode)) - continue; - - if (buffer_delay(bh)) - xfs_vm_kill_delalloc_range(inode, block_offset, - block_offset + bh->b_size); - - /* - * This buffer does not contain data anymore. make sure anyone - * who finds it knows that for certain. - */ - clear_buffer_delay(bh); - clear_buffer_uptodate(bh); - clear_buffer_mapped(bh); - clear_buffer_new(bh); - clear_buffer_dirty(bh); - clear_buffer_unwritten(bh); - } - -} - -/* - * This used to call block_write_begin(), but it unlocks and releases the page - * on error, and we need that page to be able to punch stale delalloc blocks out - * on failure. hence we copy-n-waste it here and call xfs_vm_write_failed() at - * the appropriate point. - */ -STATIC int -xfs_vm_write_begin( - struct file *file, - struct address_space *mapping, - loff_t pos, - unsigned len, - unsigned flags, - struct page **pagep, - void **fsdata) -{ - pgoff_t index = pos >> PAGE_CACHE_SHIFT; - struct page *page; - int status; - struct xfs_mount *mp = XFS_I(mapping->host)->i_mount; - - ASSERT(len <= PAGE_CACHE_SIZE); - - page = grab_cache_page_write_begin(mapping, index, flags); - if (!page) - return -ENOMEM; - - status = __block_write_begin(page, pos, len, xfs_get_blocks); - if (xfs_mp_fail_writes(mp)) - status = -EIO; - if (unlikely(status)) { - struct inode *inode = mapping->host; - size_t isize = i_size_read(inode); - - xfs_vm_write_failed(inode, page, pos, len); - unlock_page(page); - - /* - * If the write is beyond EOF, we only want to kill blocks - * allocated in this write, not blocks that were previously - * written successfully. - */ - if (xfs_mp_fail_writes(mp)) - isize = 0; - if (pos + len > isize) { - ssize_t start = max_t(ssize_t, pos, isize); - - truncate_pagecache_range(inode, start, pos + len); - } - - page_cache_release(page); - page = NULL; - } - - *pagep = page; - return status; -} - -/* - * On failure, we only need to kill delalloc blocks beyond EOF in the range of - * this specific write because they will never be written. Previous writes - * beyond EOF where block allocation succeeded do not need to be trashed, so - * only new blocks from this write should be trashed. For blocks within - * EOF, generic_write_end() zeros them so they are safe to leave alone and be - * written with all the other valid data. - */ -STATIC int -xfs_vm_write_end( - struct file *file, - struct address_space *mapping, - loff_t pos, - unsigned len, - unsigned copied, - struct page *page, - void *fsdata) -{ - int ret; - - ASSERT(len <= PAGE_CACHE_SIZE); - - ret = generic_write_end(file, mapping, pos, len, copied, page, fsdata); - if (unlikely(ret < len)) { - struct inode *inode = mapping->host; - size_t isize = i_size_read(inode); - loff_t to = pos + len; - - if (to > isize) { - /* only kill blocks in this write beyond EOF */ - if (pos > isize) - isize = pos; - xfs_vm_kill_delalloc_range(inode, isize, to); - truncate_pagecache_range(inode, isize, to); - } - } - return ret; -} - STATIC sector_t xfs_vm_bmap( struct address_space *mapping, @@ -1749,8 +1539,6 @@ const struct address_space_operations xfs_address_space_operations = { .set_page_dirty = xfs_vm_set_page_dirty, .releasepage = xfs_vm_releasepage, .invalidatepage = xfs_vm_invalidatepage, - .write_begin = xfs_vm_write_begin, - .write_end = xfs_vm_write_end, .bmap = xfs_vm_bmap, .direct_IO = xfs_vm_direct_IO, .migratepage = buffer_migrate_page, diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 98bbd8f..bcedd80 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -37,6 +37,7 @@ #include "xfs_log.h" #include "xfs_icache.h" #include "xfs_pnfs.h" +#include "xfs_iomap.h" #include #include @@ -79,57 +80,27 @@ xfs_rw_ilock_demote( inode_unlock(VFS_I(ip)); } -/* - * xfs_iozero clears the specified range supplied via the page cache (except in - * the DAX case). Writes through the page cache will allocate blocks over holes, - * though the callers usually map the holes first and avoid them. If a block is - * not completely zeroed, then it will be read from disk before being partially - * zeroed. - * - * In the DAX case, we can just directly write to the underlying pages. This - * will not allocate blocks, but will avoid holes and unwritten extents and so - * not do unnecessary work. - */ -int -xfs_iozero( - struct xfs_inode *ip, /* inode */ - loff_t pos, /* offset in file */ - size_t count) /* size of data to zero */ +static int +xfs_dax_zero_range( + struct inode *inode, + loff_t pos, + size_t count) { - struct page *page; - struct address_space *mapping; int status = 0; - - mapping = VFS_I(ip)->i_mapping; do { unsigned offset, bytes; - void *fsdata; offset = (pos & (PAGE_CACHE_SIZE -1)); /* Within page */ bytes = PAGE_CACHE_SIZE - offset; if (bytes > count) bytes = count; - if (IS_DAX(VFS_I(ip))) { - status = dax_zero_page_range(VFS_I(ip), pos, bytes, - xfs_get_blocks_direct); - if (status) - break; - } else { - status = pagecache_write_begin(NULL, mapping, pos, bytes, - AOP_FLAG_UNINTERRUPTIBLE, - &page, &fsdata); - if (status) - break; - - zero_user(page, offset, bytes); + status = dax_zero_page_range(inode, pos, bytes, + xfs_get_blocks_direct); + if (status) + break; - status = pagecache_write_end(NULL, mapping, pos, bytes, - bytes, page, fsdata); - WARN_ON(status <= 0); /* can't return less than zero! */ - status = 0; - } pos += bytes; count -= bytes; } while (count); @@ -137,6 +108,24 @@ xfs_iozero( return status; } +/* + * Clear the specified ranges to zero through either the pagecache or DAX. + * Holes and unwritten extents will be left as-is as they already are zeroed. + */ +int +xfs_iozero( + struct xfs_inode *ip, + loff_t pos, + size_t count) +{ + struct inode *inode = VFS_I(ip); + + if (IS_DAX(VFS_I(ip))) + return xfs_dax_zero_range(inode, pos, count); + else + return iomap_zero_range(inode, pos, count, NULL, &xfs_iomap_ops); +} + int xfs_update_prealloc_flags( struct xfs_inode *ip, @@ -842,7 +831,7 @@ xfs_file_buffered_aio_write( write_retry: trace_xfs_file_buffered_write(ip, iov_iter_count(from), iocb->ki_pos, 0); - ret = generic_perform_write(file, from, iocb->ki_pos); + ret = iomap_file_buffered_write(iocb, from, &xfs_iomap_ops); if (likely(ret >= 0)) iocb->ki_pos += ret; @@ -1558,7 +1547,7 @@ xfs_filemap_page_mkwrite( if (IS_DAX(inode)) { ret = __dax_mkwrite(vma, vmf, xfs_get_blocks_dax_fault, NULL); } else { - ret = block_page_mkwrite(vma, vmf, xfs_get_blocks); + ret = iomap_page_mkwrite(vma, vmf, &xfs_iomap_ops); ret = block_page_mkwrite_return(ret); } diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 2f37194..73de1ec 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -967,3 +967,147 @@ xfs_bmbt_to_iomap( iomap->length = XFS_FSB_TO_B(mp, imap->br_blockcount); iomap->bdev = xfs_find_bdev_for_inode(VFS_I(ip)); } + +static inline bool imap_needs_alloc(struct xfs_bmbt_irec *imap, int nimaps) +{ + return !nimaps || + imap->br_startblock == HOLESTARTBLOCK || + imap->br_startblock == DELAYSTARTBLOCK; +} + +static int +xfs_file_iomap_begin( + struct inode *inode, + loff_t offset, + loff_t length, + unsigned flags, + struct iomap *iomap) +{ + struct xfs_inode *ip = XFS_I(inode); + struct xfs_mount *mp = ip->i_mount; + struct xfs_bmbt_irec imap; + xfs_fileoff_t offset_fsb, end_fsb; + int nimaps = 1, error = 0; + + if (XFS_FORCED_SHUTDOWN(mp)) + return -EIO; + + xfs_ilock(ip, XFS_ILOCK_EXCL); + + ASSERT(offset <= mp->m_super->s_maxbytes); + if ((xfs_fsize_t)offset + length > mp->m_super->s_maxbytes) + length = mp->m_super->s_maxbytes - offset; + offset_fsb = XFS_B_TO_FSBT(mp, offset); + end_fsb = XFS_B_TO_FSB(mp, offset + length); + + error = xfs_bmapi_read(ip, offset_fsb, end_fsb - offset_fsb, &imap, + &nimaps, XFS_BMAPI_ENTIRE); + if (error) { + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return error; + } + + if ((flags & IOMAP_WRITE) && imap_needs_alloc(&imap, nimaps)) { + /* + * We cap the maximum length we map here to MAX_WRITEBACK_PAGES + * pages to keep the chunks of work done where somewhat symmetric + * with the work writeback does. This is a completely arbitrary + * number pulled out of thin air as a best guess for initial + * testing. + * + * Note that the values needs to be less than 32-bits wide until + * the lower level functions are updated. + */ + length = min_t(loff_t, length, 1024 * PAGE_SIZE); + if (xfs_get_extsz_hint(ip)) { + /* + * xfs_iomap_write_direct() expects the shared lock. It + * is unlocked on return. + */ + xfs_ilock_demote(ip, XFS_ILOCK_EXCL); + error = xfs_iomap_write_direct(ip, offset, length, &imap, + nimaps); + } else { + error = xfs_iomap_write_delay(ip, offset, length, &imap); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + } + + if (error) + return error; + + trace_xfs_iomap_alloc(ip, offset, length, 0, &imap); + xfs_bmbt_to_iomap(ip, iomap, &imap); + } else if (nimaps) { + xfs_iunlock(ip, XFS_ILOCK_EXCL); + trace_xfs_iomap_found(ip, offset, length, 0, &imap); + xfs_bmbt_to_iomap(ip, iomap, &imap); + } else { + xfs_iunlock(ip, XFS_ILOCK_EXCL); + trace_xfs_iomap_not_found(ip, offset, length, 0, &imap); + iomap->blkno = IOMAP_NULL_BLOCK; + iomap->type = IOMAP_HOLE; + iomap->offset = offset; + iomap->length = length; + } + + return 0; +} + +static int +xfs_file_iomap_end_delalloc( + struct xfs_inode *ip, + loff_t offset, + loff_t length, + ssize_t written) +{ + struct xfs_mount *mp = ip->i_mount; + xfs_fileoff_t start_fsb; + xfs_fileoff_t end_fsb; + int error = 0; + + start_fsb = XFS_B_TO_FSB(mp, offset + written); + end_fsb = XFS_B_TO_FSB(mp, offset + length - written); + + /* + * Trim back delalloc blocks if we didn't manage to write the whole + * range reserved. + * + * We don't need to care about racing delalloc as we hold i_mutex + * across the reserve/allocate/unreserve calls. If there are delalloc + * blocks in the range, they are ours. + */ + if (start_fsb < end_fsb) { + xfs_ilock(ip, XFS_ILOCK_EXCL); + error = xfs_bmap_punch_delalloc_range(ip, start_fsb, + end_fsb - start_fsb); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + + if (error && !XFS_FORCED_SHUTDOWN(mp)) { + xfs_alert(mp, "%s: unable to clean up ino %lld", + __func__, ip->i_ino); + return error; + } + } + + return 0; +} + +static int +xfs_file_iomap_end( + struct inode *inode, + loff_t offset, + loff_t length, + ssize_t written, + unsigned flags, + struct iomap *iomap) +{ + if ((flags & IOMAP_WRITE) && iomap->type == IOMAP_DELALLOC) + return xfs_file_iomap_end_delalloc(XFS_I(inode), offset, + length, written); + return 0; +} + +struct iomap_ops xfs_iomap_ops = { + .iomap_begin = xfs_file_iomap_begin, + .iomap_end = xfs_file_iomap_end, +}; diff --git a/fs/xfs/xfs_iomap.h b/fs/xfs/xfs_iomap.h index 718f07c..e066d04 100644 --- a/fs/xfs/xfs_iomap.h +++ b/fs/xfs/xfs_iomap.h @@ -18,7 +18,8 @@ #ifndef __XFS_IOMAP_H__ #define __XFS_IOMAP_H__ -struct iomap; +#include + struct xfs_inode; struct xfs_bmbt_irec; @@ -33,4 +34,6 @@ int xfs_iomap_write_unwritten(struct xfs_inode *, xfs_off_t, xfs_off_t); void xfs_bmbt_to_iomap(struct xfs_inode *, struct iomap *, struct xfs_bmbt_irec *); +extern struct iomap_ops xfs_iomap_ops; + #endif /* __XFS_IOMAP_H__*/ diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 1e2086d..6dfa10c 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -38,6 +38,7 @@ #include "xfs_dir2.h" #include "xfs_trans_space.h" #include "xfs_pnfs.h" +#include "xfs_iomap.h" #include #include @@ -822,8 +823,8 @@ xfs_setattr_size( error = dax_truncate_page(inode, newsize, xfs_get_blocks_direct); } else { - error = block_truncate_page(inode->i_mapping, newsize, - xfs_get_blocks); + error = iomap_truncate_page(inode, newsize, + &did_zeroing, &xfs_iomap_ops); } } @@ -838,8 +839,8 @@ xfs_setattr_size( * problem. Note that this includes any block zeroing we did above; * otherwise those blocks may not be zeroed after a crash. */ - if (newsize > ip->i_d.di_size && - (oldsize != ip->i_d.di_size || did_zeroing)) { + if (did_zeroing || + (newsize > ip->i_d.di_size && oldsize != ip->i_d.di_size)) { error = filemap_write_and_wait_range(VFS_I(ip)->i_mapping, ip->i_d.di_size, newsize); if (error) diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 840d52e..86fb345 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -1296,6 +1296,9 @@ DEFINE_IOMAP_EVENT(xfs_map_blocks_alloc); DEFINE_IOMAP_EVENT(xfs_get_blocks_found); DEFINE_IOMAP_EVENT(xfs_get_blocks_alloc); DEFINE_IOMAP_EVENT(xfs_get_blocks_map_direct); +DEFINE_IOMAP_EVENT(xfs_iomap_alloc); +DEFINE_IOMAP_EVENT(xfs_iomap_found); +DEFINE_IOMAP_EVENT(xfs_iomap_not_found); DECLARE_EVENT_CLASS(xfs_simple_io_class, TP_PROTO(struct xfs_inode *ip, xfs_off_t offset, ssize_t count), -- 2.1.4 From BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org Tue Apr 12 15:53:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 70E277CC7 for ; Tue, 12 Apr 2016 15:53:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C9168AC007 for ; Tue, 12 Apr 2016 13:53:57 -0700 (PDT) X-ASG-Debug-ID: 1460494434-04cb6c2462421560001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id EloqFAYbc3PIRYSB (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 12 Apr 2016 13:53:55 -0700 (PDT) X-Barracuda-Envelope-From: BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [67.51.76.21] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1aq5Jp-0002mw-D6; Tue, 12 Apr 2016 20:53:54 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: rpeterso@redhat.com, linux-fsdevel@vger.kernel.org Subject: [PATCH 6/8] xfs: remove buffered write support from __xfs_get_blocks Date: Tue, 12 Apr 2016 13:53:00 -0700 X-ASG-Orig-Subj: [PATCH 6/8] xfs: remove buffered write support from __xfs_get_blocks Message-Id: <1460494382-14547-7-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1460494382-14547-1-git-send-email-hch@lst.de> References: <1460494382-14547-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1460494435 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28675 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_aops.c | 77 +++++++++++++++---------------------------------------- 1 file changed, 21 insertions(+), 56 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index e481c80..cb4f75c 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1130,7 +1130,6 @@ __xfs_get_blocks( sector_t iblock, struct buffer_head *bh_result, int create, - bool direct, bool dax_fault) { struct xfs_inode *ip = XFS_I(inode); @@ -1151,22 +1150,14 @@ __xfs_get_blocks( ASSERT(bh_result->b_size >= (1 << inode->i_blkbits)); size = bh_result->b_size; - if (!create && direct && offset >= i_size_read(inode)) + if (!create && offset >= i_size_read(inode)) return 0; /* * Direct I/O is usually done on preallocated files, so try getting - * a block mapping without an exclusive lock first. For buffered - * writes we already have the exclusive iolock anyway, so avoiding - * a lock roundtrip here by taking the ilock exclusive from the - * beginning is a useful micro optimization. + * a block mapping without an exclusive lock first. */ - if (create && !direct) { - lockmode = XFS_ILOCK_EXCL; - xfs_ilock(ip, lockmode); - } else { - lockmode = xfs_ilock_data_map_shared(ip); - } + lockmode = xfs_ilock_data_map_shared(ip); ASSERT(offset <= mp->m_super->s_maxbytes); if (offset + size > mp->m_super->s_maxbytes) @@ -1185,37 +1176,19 @@ __xfs_get_blocks( (imap.br_startblock == HOLESTARTBLOCK || imap.br_startblock == DELAYSTARTBLOCK) || (IS_DAX(inode) && ISUNWRITTEN(&imap)))) { - if (direct || xfs_get_extsz_hint(ip)) { - /* - * xfs_iomap_write_direct() expects the shared lock. It - * is unlocked on return. - */ - if (lockmode == XFS_ILOCK_EXCL) - xfs_ilock_demote(ip, lockmode); - - error = xfs_iomap_write_direct(ip, offset, size, - &imap, nimaps); - if (error) - return error; - new = 1; + /* + * xfs_iomap_write_direct() expects the shared lock. It + * is unlocked on return. + */ + if (lockmode == XFS_ILOCK_EXCL) + xfs_ilock_demote(ip, lockmode); - } else { - /* - * Delalloc reservations do not require a transaction, - * we can go on without dropping the lock here. If we - * are allocating a new delalloc block, make sure that - * we set the new flag so that we mark the buffer new so - * that we know that it is newly allocated if the write - * fails. - */ - if (nimaps && imap.br_startblock == HOLESTARTBLOCK) - new = 1; - error = xfs_iomap_write_delay(ip, offset, size, &imap); - if (error) - goto out_unlock; + error = xfs_iomap_write_direct(ip, offset, size, + &imap, nimaps); + if (error) + return error; + new = 1; - xfs_iunlock(ip, lockmode); - } trace_xfs_get_blocks_alloc(ip, offset, size, ISUNWRITTEN(&imap) ? XFS_IO_UNWRITTEN : XFS_IO_DELALLOC, &imap); @@ -1236,9 +1209,7 @@ __xfs_get_blocks( } /* trim mapping down to size requested */ - if (direct || size > (1 << inode->i_blkbits)) - xfs_map_trim_size(inode, iblock, bh_result, - &imap, offset, size); + xfs_map_trim_size(inode, iblock, bh_result, &imap, offset, size); /* * For unwritten extents do not report a disk address in the buffered @@ -1251,7 +1222,7 @@ __xfs_get_blocks( if (ISUNWRITTEN(&imap)) set_buffer_unwritten(bh_result); /* direct IO needs special help */ - if (create && direct) { + if (create) { if (dax_fault) ASSERT(!ISUNWRITTEN(&imap)); else @@ -1280,14 +1251,7 @@ __xfs_get_blocks( (new || ISUNWRITTEN(&imap)))) set_buffer_new(bh_result); - if (imap.br_startblock == DELAYSTARTBLOCK) { - BUG_ON(direct); - if (create) { - set_buffer_uptodate(bh_result); - set_buffer_mapped(bh_result); - set_buffer_delay(bh_result); - } - } + BUG_ON(imap.br_startblock == DELAYSTARTBLOCK); return 0; @@ -1303,7 +1267,8 @@ xfs_get_blocks( struct buffer_head *bh_result, int create) { - return __xfs_get_blocks(inode, iblock, bh_result, create, false, false); + BUG_ON(create); + return __xfs_get_blocks(inode, iblock, bh_result, create, false); } int @@ -1313,7 +1278,7 @@ xfs_get_blocks_direct( struct buffer_head *bh_result, int create) { - return __xfs_get_blocks(inode, iblock, bh_result, create, true, false); + return __xfs_get_blocks(inode, iblock, bh_result, create, false); } int @@ -1323,7 +1288,7 @@ xfs_get_blocks_dax_fault( struct buffer_head *bh_result, int create) { - return __xfs_get_blocks(inode, iblock, bh_result, create, true, true); + return __xfs_get_blocks(inode, iblock, bh_result, create, true); } /* -- 2.1.4 From BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org Tue Apr 12 15:54:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 08E597CA1 for ; Tue, 12 Apr 2016 15:54:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7E4E8AC008 for ; Tue, 12 Apr 2016 13:54:05 -0700 (PDT) X-ASG-Debug-ID: 1460494441-04bdf01102422140001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id uydD5AEOsNuyvYaf (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 12 Apr 2016 13:54:02 -0700 (PDT) X-Barracuda-Envelope-From: BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [67.51.76.21] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1aq5Jw-0002oD-SP; Tue, 12 Apr 2016 20:54:01 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: rpeterso@redhat.com, linux-fsdevel@vger.kernel.org Subject: [PATCH 7/8] fs: iomap based fiemap implementation Date: Tue, 12 Apr 2016 13:53:01 -0700 X-ASG-Orig-Subj: [PATCH 7/8] fs: iomap based fiemap implementation Message-Id: <1460494382-14547-8-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1460494382-14547-1-git-send-email-hch@lst.de> References: <1460494382-14547-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1460494442 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28675 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Add a simple fiemap implementation based on iomap_ops, partially based on a previous implementation from Bob Peterson . Signed-off-by: Christoph Hellwig --- fs/iomap.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/iomap.h | 3 ++ 2 files changed, 93 insertions(+) diff --git a/fs/iomap.c b/fs/iomap.c index 534cb37..28a8fcb 100644 --- a/fs/iomap.c +++ b/fs/iomap.c @@ -385,3 +385,93 @@ out_unlock: return ret; } EXPORT_SYMBOL_GPL(iomap_page_mkwrite); + +struct fiemap_ctx { + struct fiemap_extent_info *fi; + struct iomap prev; +}; + +static int iomap_to_fiemap(struct fiemap_extent_info *fi, + struct iomap *iomap, u32 flags) +{ + switch (iomap->type) { + case IOMAP_HOLE: + /* skip holes */ + return 0; + case IOMAP_DELALLOC: + flags |= FIEMAP_EXTENT_DELALLOC | FIEMAP_EXTENT_UNKNOWN; + break; + case IOMAP_UNWRITTEN: + flags |= FIEMAP_EXTENT_UNWRITTEN; + break; + case IOMAP_MAPPED: + break; + } + + return fiemap_fill_next_extent(fi, iomap->offset, + iomap->blkno != IOMAP_NULL_BLOCK ? iomap->blkno << 9: 0, + iomap->length, flags | FIEMAP_EXTENT_MERGED); + +} + +static loff_t +iomap_fiemap_actor(struct inode *inode, loff_t pos, loff_t length, void *data, + struct iomap *iomap) +{ + struct fiemap_ctx *ctx = data; + loff_t ret = length; + + if (iomap->type == IOMAP_HOLE) + return length; + + ret = iomap_to_fiemap(ctx->fi, &ctx->prev, 0); + ctx->prev = *iomap; + switch (ret) { + case 0: /* success */ + return length; + case 1: /* extent array full */ + return 0; + default: + return ret; + } +} + +int iomap_fiemap(struct inode *inode, struct fiemap_extent_info *fi, + loff_t start, loff_t len, struct iomap_ops *ops) +{ + struct fiemap_ctx ctx; + loff_t ret; + + memset(&ctx, 0, sizeof(ctx)); + ctx.fi = fi; + ctx.prev.type = IOMAP_HOLE; + + ret = fiemap_check_flags(fi, FIEMAP_FLAG_SYNC); + if (ret) + return ret; + + ret = filemap_write_and_wait(inode->i_mapping); + if (ret) + return ret; + + while (len > 0) { + ret = iomap_apply(inode, start, len, 0, ops, &ctx, + iomap_fiemap_actor); + if (ret < 0) + return ret; + if (ret == 0) + break; + + start += ret; + len -= ret; + } + + if (ctx.prev.type != IOMAP_HOLE) { + ret = iomap_to_fiemap(fi, &ctx.prev, FIEMAP_EXTENT_LAST); + if (ret < 0) + return ret; + } + + return 0; +} +EXPORT_SYMBOL_GPL(iomap_fiemap); diff --git a/include/linux/iomap.h b/include/linux/iomap.h index 854766f..b3deee1 100644 --- a/include/linux/iomap.h +++ b/include/linux/iomap.h @@ -3,6 +3,7 @@ #include +struct fiemap_extent_info; struct inode; struct iov_iter; struct kiocb; @@ -63,5 +64,7 @@ int iomap_truncate_page(struct inode *inode, loff_t pos, bool *did_zero, struct iomap_ops *ops); int iomap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf, struct iomap_ops *ops); +int iomap_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, + loff_t start, loff_t len, struct iomap_ops *ops); #endif /* LINUX_IOMAP_H */ -- 2.1.4 From BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org Tue Apr 12 15:54:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AD01C7CC5 for ; Tue, 12 Apr 2016 15:54:09 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 80F0E304067 for ; Tue, 12 Apr 2016 13:54:09 -0700 (PDT) X-ASG-Debug-ID: 1460494446-04cbb02e1d109b60001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id 5emsv4ga1FW42Ztj (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 12 Apr 2016 13:54:07 -0700 (PDT) X-Barracuda-Envelope-From: BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [67.51.76.21] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1aq5K2-0002od-3Q; Tue, 12 Apr 2016 20:54:06 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: rpeterso@redhat.com, linux-fsdevel@vger.kernel.org Subject: [PATCH 8/8] xfs: use iomap fiemap implementation Date: Tue, 12 Apr 2016 13:53:02 -0700 X-ASG-Orig-Subj: [PATCH 8/8] xfs: use iomap fiemap implementation Message-Id: <1460494382-14547-9-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1460494382-14547-1-git-send-email-hch@lst.de> References: <1460494382-14547-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1460494447 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28675 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Note that this removes support for the untested FIEMAP_FLAG_XATTR. It could be added relatively easily with iomap ops for the attr fork, but without test coverage I don't feel safe doing this. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_iops.c | 80 ++++--------------------------------------------------- 1 file changed, 5 insertions(+), 75 deletions(-) diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 6dfa10c..6e3614a 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -44,7 +44,7 @@ #include #include #include -#include +#include #include /* @@ -1004,51 +1004,6 @@ xfs_vn_update_time( return xfs_trans_commit(tp); } -#define XFS_FIEMAP_FLAGS (FIEMAP_FLAG_SYNC|FIEMAP_FLAG_XATTR) - -/* - * Call fiemap helper to fill in user data. - * Returns positive errors to xfs_getbmap. - */ -STATIC int -xfs_fiemap_format( - void **arg, - struct getbmapx *bmv, - int *full) -{ - int error; - struct fiemap_extent_info *fieinfo = *arg; - u32 fiemap_flags = 0; - u64 logical, physical, length; - - /* Do nothing for a hole */ - if (bmv->bmv_block == -1LL) - return 0; - - logical = BBTOB(bmv->bmv_offset); - physical = BBTOB(bmv->bmv_block); - length = BBTOB(bmv->bmv_length); - - if (bmv->bmv_oflags & BMV_OF_PREALLOC) - fiemap_flags |= FIEMAP_EXTENT_UNWRITTEN; - else if (bmv->bmv_oflags & BMV_OF_DELALLOC) { - fiemap_flags |= (FIEMAP_EXTENT_DELALLOC | - FIEMAP_EXTENT_UNKNOWN); - physical = 0; /* no block yet */ - } - if (bmv->bmv_oflags & BMV_OF_LAST) - fiemap_flags |= FIEMAP_EXTENT_LAST; - - error = fiemap_fill_next_extent(fieinfo, logical, physical, - length, fiemap_flags); - if (error > 0) { - error = 0; - *full = 1; /* user array now full */ - } - - return error; -} - STATIC int xfs_vn_fiemap( struct inode *inode, @@ -1056,38 +1011,13 @@ xfs_vn_fiemap( u64 start, u64 length) { - xfs_inode_t *ip = XFS_I(inode); - struct getbmapx bm; int error; - error = fiemap_check_flags(fieinfo, XFS_FIEMAP_FLAGS); - if (error) - return error; - - /* Set up bmap header for xfs internal routine */ - bm.bmv_offset = BTOBBT(start); - /* Special case for whole file */ - if (length == FIEMAP_MAX_OFFSET) - bm.bmv_length = -1LL; - else - bm.bmv_length = BTOBB(start + length) - bm.bmv_offset; - - /* We add one because in getbmap world count includes the header */ - bm.bmv_count = !fieinfo->fi_extents_max ? MAXEXTNUM : - fieinfo->fi_extents_max + 1; - bm.bmv_count = min_t(__s32, bm.bmv_count, - (PAGE_SIZE * 16 / sizeof(struct getbmapx))); - bm.bmv_iflags = BMV_IF_PREALLOC | BMV_IF_NO_HOLES; - if (fieinfo->fi_flags & FIEMAP_FLAG_XATTR) - bm.bmv_iflags |= BMV_IF_ATTRFORK; - if (!(fieinfo->fi_flags & FIEMAP_FLAG_SYNC)) - bm.bmv_iflags |= BMV_IF_DELALLOC; - - error = xfs_getbmap(ip, &bm, xfs_fiemap_format, fieinfo); - if (error) - return error; + xfs_ilock(XFS_I(inode), XFS_IOLOCK_SHARED); + error = iomap_fiemap(inode, fieinfo, start, length, &xfs_iomap_ops); + xfs_iunlock(XFS_I(inode), XFS_IOLOCK_SHARED); - return 0; + return error; } STATIC int -- 2.1.4 From david@fromorbit.com Tue Apr 12 16:01:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 75CCB7CA2 for ; Tue, 12 Apr 2016 16:01:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 491C8304075 for ; Tue, 12 Apr 2016 14:01:07 -0700 (PDT) X-ASG-Debug-ID: 1460494863-04cb6c2460421800001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id lkC99jRn2qB0faHP for ; Tue, 12 Apr 2016 14:01:04 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DYDQDzYA1XNaAZLHlegzeBUIJyg3mfaQEBAQEBAQaMEYVohBOGCAQCAoE5TQEBAQEBAQcBAQEBQkCEQgEBBDocIxAIAw4KCSUPBSUDBxoTiCfCHwEBAQEBAQQBAQEBARsZhUCFE4dqgisFmAiIaoUZjxqEA4skhFsqMIoFAQEB Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail04.adl6.internode.on.net with ESMTP; 13 Apr 2016 06:31:03 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aq5Qj-0002pE-K7; Wed, 13 Apr 2016 07:01:01 +1000 Date: Wed, 13 Apr 2016 07:01:01 +1000 From: Dave Chinner To: Eryu Guan Cc: Christoph Hellwig , fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs/259: handle minimum block size more precisely Message-ID: <20160412210101.GA10643@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs/259: handle minimum block size more precisely References: <1460027155-4222-1-git-send-email-eguan@redhat.com> <20160407213231.GD761@dastard> <20160407234837.GA1439@infradead.org> <20160411000238.GB9088@dastard> <20160411113811.GH10345@eguan.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160411113811.GH10345@eguan.usersys.redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1460494864 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28675 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Apr 11, 2016 at 07:38:11PM +0800, Eryu Guan wrote: > On Mon, Apr 11, 2016 at 10:02:38AM +1000, Dave Chinner wrote: > > Which is not at all clear from the patch description. > > > > Seriously, though, this does not belong in common/config. We already > > have a helper function to check what mkfs supports (i.e. > > _scratch_mkfs_xfs_supported()), and if we just want a bare check > > then factor this into a _mkfs_xfs_supported() and supply the > > parameters specific to the test. > > > > Indeed, this is basically what we do with _require_xfs_mkfs_crc(); > > the same thing should be done, but without the "notrun" if -m crc > > s not supported... > > Looking into _require_xfs_mkfs_crc() and _scratch_mkfs_xfs_supported(), > I noticed that they are not the helpers I want. They are testing whether > mkfs.xfs supports CRC (or other mkfs options), what I want is what's the > default behavior of mkfs.xfs (CRC enabled or not). All this, just to avoid testing on an invalid block size when CRCs are enabled. I really don't see why this needs changes to generic infrastructure - it's a test specific problem. How about you simply reverse the block size order that is tested, and capture the output of the actual mkfs command that is being tested, and determine if 512 byte block sizes should be tested based on that output? i.e. for b in 4096 2038 1024 512; do if [ $b -eq 512 -a $_fs_has_crcs -ne 1 ]; then break; fi .... mkfs -b $b .... . $tmp.mkfs done Cheers, Dave. -- Dave Chinner david@fromorbit.com From msnitzer@redhat.com Tue Apr 12 16:04:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 03BB97CA1 for ; Tue, 12 Apr 2016 16:04:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id BD157304067 for ; Tue, 12 Apr 2016 14:04:30 -0700 (PDT) X-ASG-Debug-ID: 1460495068-04cb6c245f421ad0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 0uBtp10odEM2SUVh (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 14:04:29 -0700 (PDT) X-Barracuda-Envelope-From: msnitzer@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B17B8627E7; Tue, 12 Apr 2016 21:04:28 +0000 (UTC) Received: from localhost (dhcp-25-149.bos.redhat.com [10.18.25.149]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3CL4RHD019898 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA256 bits=256 verify=NO); Tue, 12 Apr 2016 17:04:27 -0400 Date: Tue, 12 Apr 2016 17:04:27 -0400 From: Mike Snitzer To: "Darrick J. Wong" Cc: Brian Foster , xfs@oss.sgi.com, linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, dm-devel@redhat.com Subject: Re: [RFC PATCH] block: wire blkdev_fallocate() to block_device_operations' reserve_space Message-ID: <20160412210426.GA1845@redhat.com> X-ASG-Orig-Subj: Re: [RFC PATCH] block: wire blkdev_fallocate() to block_device_operations' reserve_space References: <1460479373-63317-1-git-send-email-bfoster@redhat.com> <20160412200459.GA10730@redhat.com> <20160412203904.GD5812@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160412203904.GD5812@birch.djwong.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 12 Apr 2016 21:04:28 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460495069 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Apr 12 2016 at 4:39pm -0400, Darrick J. Wong wrote: > On Tue, Apr 12, 2016 at 04:04:59PM -0400, Mike Snitzer wrote: > > diff --git a/fs/block_dev.c b/fs/block_dev.c > > index 5a2c3ab..b34c07b 100644 > > --- a/fs/block_dev.c > > +++ b/fs/block_dev.c > > @@ -1801,17 +1801,13 @@ long blkdev_fallocate(struct file *file, int mode, loff_t start, loff_t len) > > struct request_queue *q = bdev_get_queue(bdev); > > struct address_space *mapping; > > loff_t end = start + len - 1; > > - loff_t bs_mask, isize; > > + loff_t isize; > > int error; > > > > /* We only support zero range and punch hole. */ > > if (mode & ~BLKDEV_FALLOC_FL_SUPPORTED) > > return -EOPNOTSUPP; > > > > - /* We haven't a primitive for "ensure space exists" right now. */ > > - if (!(mode & ~FALLOC_FL_KEEP_SIZE)) > > - return -EOPNOTSUPP; > > - > > /* Only punch if the device can do zeroing discard. */ > > if ((mode & FALLOC_FL_PUNCH_HOLE) && > > (!blk_queue_discard(q) || !q->limits.discard_zeroes_data)) > > @@ -1829,9 +1825,12 @@ long blkdev_fallocate(struct file *file, int mode, loff_t start, loff_t len) > > return -EINVAL; > > } > > > > - /* Don't allow IO that isn't aligned to logical block size */ > > - bs_mask = bdev_logical_block_size(bdev) - 1; > > - if ((start | len) & bs_mask) > > + /* > > + * Don't allow IO that isn't aligned to minimum IO size (io_min) > > + * - for normal device's io_min is usually logical block size > > + * - but for more exotic devices (e.g. DM thinp) it may be larger > > + */ > > + if ((start | len) % bdev_io_min(bdev)) > > return -EINVAL; > > Noted. Will update the original patch. BTW, I just noticed your "block: require write_same and discard requests align to logical block size" -- doesn't look right. But maybe I'm just too hyper-focused on DM thinp's needs (which would much prefer these checks be done in terms of minimum_io_size, rather than logical_block_size, and _not_ assuming power-of-2 math will work). But at least for discard: your lbs-based check is fine; since we have discard_granularity to cover thinp's more specific requirements. From david@fromorbit.com Tue Apr 12 16:11:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 19B137CA1 for ; Tue, 12 Apr 2016 16:11:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7EF0EAC01D for ; Tue, 12 Apr 2016 14:11:53 -0700 (PDT) X-ASG-Debug-ID: 1460495510-04cbb02e1b10a2b0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id xG4K17PNDGRqD2yE for ; Tue, 12 Apr 2016 14:11:50 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DuDQBMYw1XNaAZLHlegzdTfYJyg3mfXQwBAQEBAQEGjBGFaIQTGoVuBAICgTlNAQEBAQEBBwEBAQFCQIRCAQEEOhwjEAgDDgoJJQ8FJQMHGhOIJ8IfAQseGYVAhROEDxACAYVzBZgIhXeIDI8aRY5ihFsqMIoFAQEB Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail04.adl6.internode.on.net with ESMTP; 13 Apr 2016 06:41:49 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aq5bA-0002si-QA; Wed, 13 Apr 2016 07:11:48 +1000 Date: Wed, 13 Apr 2016 07:11:48 +1000 From: Dave Chinner To: Brent Bice Cc: Alex Lyakas , xfs@oss.sgi.com, Shyam Kaushik Subject: Re: [PATCH 4/5] xfs: xfs_inode_free() isn't RCU safe Message-ID: <20160412211148.GJ567@dastard> X-ASG-Orig-Subj: Re: [PATCH 4/5] xfs: xfs_inode_free() isn't RCU safe References: <0A92B65A3BF94F60BB36EA3FA716DF1F@alyakaslap> <570CDC0B.3070802@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <570CDC0B.3070802@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: 1460495510 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28675 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Apr 12, 2016 at 05:29:15AM -0600, Brent Bice wrote: > Could you resend it to be sure? I flagged it for redelivery the > day I emailed you so if nobody else has seen it yet then something > still didn't work. I was pretty sure I'd seen it get delivered ok > to oss, but... (shrug) No, it didn't, and it's not in the archives, either. It seems that sgi.com is rejecting quite a bit of legitimate mail lately. I've seen a couple of people in the past couple of weeks send stuff that has reached my private in boxes but not the list. Now this one, too. If someone is having to micro-manage the list to prevent rejections of valid email then that is bad... -Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 12 16:16:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8C6777CA0 for ; Tue, 12 Apr 2016 16:16:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5F293304067 for ; Tue, 12 Apr 2016 14:16:23 -0700 (PDT) X-ASG-Debug-ID: 1460495780-04cb6c2462422610001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id VMs5ARNFOu6Cr71m for ; Tue, 12 Apr 2016 14:16:20 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DYDQBzZA1XNaAZLHlegzeBUIJyg3mfaQEBAQEBAQaMEYVohBOGCAQCAoE5TQEBAQEBAQcBAQEBQkCEQgEBBDocIxAIAxgJJQ8FJQMHGhOIJ8IlAQseGYVAhROKFQEEkxuEbY4DgVuNP0WOYoRbKjCKBQEBAQ Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail04.adl6.internode.on.net with ESMTP; 13 Apr 2016 06:46:19 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aq5fX-0002uP-Cs; Wed, 13 Apr 2016 07:16:19 +1000 Date: Wed, 13 Apr 2016 07:16:19 +1000 From: Dave Chinner To: Shyam Kaushik Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Abort intent log item in xfs_iflush() upon error to get buf Message-ID: <20160412211619.GK567@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: Abort intent log item in xfs_iflush() upon error to get buf References: <23e35813cb097c7b15686852500cbf97@mail.gmail.com> <20160412082759.GI9088@dastard> <5e9c99552ae829dce9eb574d72085323@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5e9c99552ae829dce9eb574d72085323@mail.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: 1460495780 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28675 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Apr 12, 2016 at 11:10:13PM +0530, Shyam Kaushik wrote: > Hi Dave, > > Your patch needs a minor correction. > > At start of xfs_iflush() either we must initialize "bp = NULL" or else > xfs_imap_to_bp() when it hits an error need to set "*bpp = NULL". > Otherwise with your patch we are having an uninitialized bp that > corrupt_out is trying to do xfs_buf_relse(). Ok, I'll check that - I thought that xfs_trans_buf_read_map() was initialising it to zero appropriately, but obviously I missed something. Thanks for testing! Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 12 16:17:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 922DB7CA0 for ; Tue, 12 Apr 2016 16:17:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 58902304062 for ; Tue, 12 Apr 2016 14:17:58 -0700 (PDT) X-ASG-Debug-ID: 1460495875-04bdf01102423010001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id nJuSHFcOyEFKIQVL for ; Tue, 12 Apr 2016 14:17:56 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DWDQBjZQ1XNaAZLHlegzeBUIJyg3mfaQEBAQEBAQaMEYl7hggEAgKBOU0BAQEBAQEHAQEBAUJAhEIBAQQ6HCMQCAMOCgklDwUlAwcaE4gnwiUBCx4ZhUCFE4oVBZgIjgOBW40/RY5ihFsqMIoFAQEB Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail04.adl6.internode.on.net with ESMTP; 13 Apr 2016 06:47:54 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aq5h3-0002uf-Jn; Wed, 13 Apr 2016 07:17:53 +1000 Date: Wed, 13 Apr 2016 07:17:53 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: PAGE_CACHE_* removal in 4.6-rc3 Message-ID: <20160412211753.GL567@dastard> X-ASG-Orig-Subj: Re: PAGE_CACHE_* removal in 4.6-rc3 References: <20160412183105.GA10567@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160412183105.GA10567@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: 1460495875 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28675 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Apr 12, 2016 at 11:31:05AM -0700, Christoph Hellwig wrote: > Hi Dave, > > upstream removed the PAGE_CACHE_* macros in 4.6-rc3, which will cause > all kinds of interesting conflicts for FS work. Maybe it's a good idea > to rebase for-next ontop of -rc3 so that we can sort this out early? Yeah, I was thinking of doing that when I saw that this was merged. I've got a bit of stuff to sort out today, but I'll see what I can do about moving the master branch forward and rebasing the for-next branch on top of it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 12 16:31:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 655087CA0 for ; Tue, 12 Apr 2016 16:31:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 37BDE8F8039 for ; Tue, 12 Apr 2016 14:31:23 -0700 (PDT) X-ASG-Debug-ID: 1460496680-04cbb02e1b10b190001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 4H3a5BwDGDvlC1DW for ; Tue, 12 Apr 2016 14:31:20 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DXDQC5Zw1XNaAZLHlegzeBUIJyg3mfaQEBAQEBAQaMEYl7hggEAgKBOU0BAQEBAQEHAQEBAUJAhEEBAQEDATIBIyMFCwgDDgoJJQ8FJQMHGhOIIAfCGQEBCAIeGYVAhROEGYV8BY1QijiOA48ajyeCZhmBXCowiEiBPQEBAQ Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail04.adl6.internode.on.net with ESMTP; 13 Apr 2016 07:01:19 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aq5u2-000306-LU; Wed, 13 Apr 2016 07:31:18 +1000 Date: Wed, 13 Apr 2016 07:31:18 +1000 From: Dave Chinner To: Songbo Wang Cc: xfs@oss.sgi.com Subject: Re: about the xfs performance Message-ID: <20160412213118.GM567@dastard> X-ASG-Orig-Subj: Re: about the xfs performance References: <20160411231056.GD9088@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1460496680 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28676 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Apr 12, 2016 at 10:07:45PM +0800, Songbo Wang wrote: > Hi Dave, > > Thank you for your reply. I did some test today and described those as > follows: > > Delete the existing test file , and redo the test : fio -ioengine=libaio > -bs=4k -direct=1 -thread -rw=randwrite -size=50G -filename=/mnt/test > -name="EBS 4KB randwrite test" -iodepth=64 -runtime=60 > The iops resultes is 19k±(per second); I continue to fio this test file > untill it was filled to the full. Then I did another test using the same > test case, the results was 210k±(per second).(The results mentioned Yup, that's when the workload goes from allocation bound to being an overwrite workload when there is no allocation occurring. Perhaps you should preallocate the file using the fallocate=posix option. This will move the initial overhead to IO completion, so won't block submission, and the file will not end up a fragmented mess as the written areas will merge back into large single extents as more of the file is written. > yesterday was partial. I used the same test file several times, the > results degraded because of the test file was not fill to the full) > > I try to remake the filesystem using the following command to increase the > internal log size , inode size and agcount num: > mkfs.xfs /dev/hioa2 -f -n size=64k -i size=2048,align=1 -d agcount=2045 -l > size=512m > but it has no help to the result. Of course it won't. Turning random knobs without knowing what they do will not solve the problem. Indeed, if you're workload is performance limited because it is running out of log space, then *reducing the log size* will not solve the issue. Users who tweaking knobs without understanding what they do or how they affect the application is the leading cause of filesystem performance and reliability issues on XFS. Just don't do it - all you'll do is cause something to go wrong when you can least afford it to happen. Cheers, Dave. -- Dave Chinner david@fromorbit.com From bbice@sgi.com Tue Apr 12 16:55:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2847C7CA0 for ; Tue, 12 Apr 2016 16:55:10 -0500 (CDT) Received: from xmail.sgi.com (pv-excas1-dc21.corp.sgi.com [137.38.106.7]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5C991AC005; Tue, 12 Apr 2016 14:55:09 -0700 (PDT) Received: from [134.15.0.33] (134.15.0.33) by xmail.sgi.com (137.38.106.6) with Microsoft SMTP Server (TLS) id 14.3.210.2; Tue, 12 Apr 2016 16:55:08 -0500 Subject: Re: [PATCH 4/5] xfs: xfs_inode_free() isn't RCU safe To: Dave Chinner References: <0A92B65A3BF94F60BB36EA3FA716DF1F@alyakaslap> <570CDC0B.3070802@sgi.com> <20160412211148.GJ567@dastard> CC: Alex Lyakas , , Shyam Kaushik From: Brent Bice Message-ID: <570D6EBB.1010805@sgi.com> Date: Tue, 12 Apr 2016 15:55:07 -0600 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <20160412211148.GJ567@dastard> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [134.15.0.33] On 04/12/2016 03:11 PM, Dave Chinner wrote: > It seems that sgi.com is rejecting quite a bit of legitimate mail > lately. I've seen a couple of people in the past couple of weeks > send stuff that has reached my private in boxes but not the list. > Now this one, too. Yeah, this one wasn't the anti-spam filters that I manage (the barracudas, our private RBL, etc) but spamassassin on oss.sgi.com. So... Dunno. I took a crack at whitelisting Alex's from address in spamassassin (though I haven't looked at it's configs or man pages in about 10 years). > If someone is having to micro-manage the list to prevent rejections > of valid email then that is bad... So true. I only happened to notice because I had someone (I forget who it was several years ago) tweak SA on oss so that rejections get forwarded to me. The idea was I'd look at those (stuff that the cudas missed but spamassassin caught) and use that info to update our filters (the filters that benefit everyone at SGI, not just oss). Anyway, I don't always have the bandwidth to look at every email SA on oss rejects and update spam filters (if possible) and just happened to notice this one and that it wasn't spam. I am a lot more aggressive with the filters for oss because it's such a sore-thumb-target for spammers. For instance, there are large swaths of yahoo IP space being blocked now (for oss only) because over the years I only found one legit sender to oss from a yahoo IP - the rest was all spam/phish. But I've only dropped in yahoo IP ranges that I was seeing spam from. I've gotten aggressive with some Chinese IP space too for similar reasons. If any of the senders you know of having trouble might be in yahoo or chinese IP space let me know and I can look in the logs, but I'd bet a doughnut that if they didn't get a bounce then they're running afoul of spamassassin 'n not the filters I manage. :-( There was talk a while back of taking oss out of SGI and hosting it somewhere in "Da cloud!" (tm) and having someone else in the xfs community own it, wasn't there? Anyone still looking into that? Brent From darrick.wong@oracle.com Tue Apr 12 17:25:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D80227CA0 for ; Tue, 12 Apr 2016 17:25:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8E0C0304062 for ; Tue, 12 Apr 2016 15:25:31 -0700 (PDT) X-ASG-Debug-ID: 1460499924-04bdf011044259b0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 6gLIrUu8vDl25B76 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 15:25:25 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u3CMPN9r005799 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 12 Apr 2016 22:25:23 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u3CMPN6c013267 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 12 Apr 2016 22:25:23 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u3CMPMk1004782; Tue, 12 Apr 2016 22:25:22 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 12 Apr 2016 15:25:21 -0700 Date: Tue, 12 Apr 2016 15:25:20 -0700 From: "Darrick J. Wong" To: Mike Snitzer Cc: linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, Brian Foster , dm-devel@redhat.com, xfs@oss.sgi.com Subject: Re: [RFC PATCH] block: wire blkdev_fallocate() to block_device_operations' reserve_space Message-ID: <20160412222520.GB18517@birch.djwong.org> X-ASG-Orig-Subj: Re: [RFC PATCH] block: wire blkdev_fallocate() to block_device_operations' reserve_space References: <1460479373-63317-1-git-send-email-bfoster@redhat.com> <20160412200459.GA10730@redhat.com> <20160412203904.GD5812@birch.djwong.org> <20160412204658.GA1759@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160412204658.GA1759@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1460499925 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28680 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Apr 12, 2016 at 04:46:58PM -0400, Mike Snitzer wrote: > On Tue, Apr 12 2016 at 4:39pm -0400, > Darrick J. Wong wrote: > > > On Tue, Apr 12, 2016 at 04:04:59PM -0400, Mike Snitzer wrote: > > > On Tue, Apr 12 2016 at 12:42P -0400, > > > Brian Foster wrote: > > > > > > > Hi all, > > > > > > > > This is v2 of the XFS and block device reservation experiment. The > > > > significant changes in v2 are that the bdev interface has been condensed > > > > to a single callback function, the XFS transaction reservation > > > > management has been reworked to make transactions responsible for > > > > tracking and releasing excess reservation (for non-delalloc cases) and a > > > > workaround for the fallocate over-reservation issue is included. Beyond > > > > that, this version adds a bunch of miscellaneous cleanups and fixes some > > > > of the nastier locking/leak issues present in the first rfc. > > > > > > > > Patches 1-2 refactor some XFS reserve pool and block accounting code in > > > > preparation for subsequent patches. Patches 3-5 add block/device-mapper > > > > reservation support. Patches 6-10 add the core reservation > > > > infrastructure and management bits to XFS. See the link to the original > > > > rfc below for instructions and further details around the purpose of > > > > this series. > > > > > > > > Finally, note that this is still highly experimental/theoretical and > > > > should not be used on production systems. Thoughts, reviews, flames > > > > appreciated. > > > > > > Thanks for carrying on with this work Brian. > > > > > > I've started to review your patchset and Darrick's fallocate patchset. > > > I've pushed a branch to linux-dm.git that combines the 2, see: > > > https://git.kernel.org/cgit/linux/kernel/git/device-mapper/linux-dm.git/log/?h=dm-fallocate > > > > > > and then added this RFC patch, at the end, which relies on both of your > > > patchsets -- you'll see blkdev_ensure_space_exists() has a FIXME which > > > implies it isn't much more than simply stubbed out at this point > > > (completely untested): > > > > Hmm, ok, but -rc3 broke a bunch of stuff. Guess I should repost with all > > the PAGE_CACHE_ -> PAGE_ stuff fixed. :) > > Yeah, the kernel.org kbuild robots just spammed us about that same exact > breakage. > > > > From: Mike Snitzer > > > Date: Tue, 12 Apr 2016 15:54:31 -0400 > > > Subject: [RFC PATCH] block: wire blkdev_fallocate() to block_device_operations' reserve_space > > > > > > This effectively exposes the primitive for "ensure space exists". It > > > relies on block_device_operations' reserve_space method. > > > > > > Signed-off-by: Mike Snitzer > > > --- > > > block/blk-lib.c | 26 ++++++++++++++++++++++++++ > > > fs/block_dev.c | 20 +++++++++++--------- > > > include/linux/blkdev.h | 2 ++ > > > 3 files changed, 39 insertions(+), 9 deletions(-) > > > > > > diff --git a/block/blk-lib.c b/block/blk-lib.c > > > index 9dca6bb..5042a84 100644 > > > --- a/block/blk-lib.c > > > +++ b/block/blk-lib.c > > > @@ -314,3 +314,29 @@ int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, > > > return __blkdev_issue_zeroout(bdev, sector, nr_sects, gfp_mask); > > > } > > > EXPORT_SYMBOL(blkdev_issue_zeroout); > > > + > > > +/** > > > + * blkdev_ensure_space_exists - preallocate a block range > > > + * @bdev: blockdev to preallocate space for > > > + * @sector: start sector > > > + * @nr_sects: number of sectors to preallocate > > > + * @gfp_mask: memory allocation flags (for bio_alloc) > > > + * @flags: FALLOC_FL_* to control behaviour > > > + * > > > + * Description: > > > + * Ensure space exists, or is preallocated, for the sectors in question. > > > + */ > > > +int blkdev_ensure_space_exists(struct block_device *bdev, sector_t sector, > > > + sector_t nr_sects, unsigned long flags) > > > +{ > > > + sector_t res; > > > + const struct block_device_operations *ops = bdev->bd_disk->fops; > > > + > > > + if (!ops->reserve_space) > > > + return -EOPNOTSUPP; > > > + > > > + // FIXME: check with Brian Foster on whether it makes sense to > > > + // use BDEV_RES_GET/BDEV_RES_MOD instead of BDEV_RES_PROVISION? > > > + return ops->reserve_space(bdev, BDEV_RES_PROVISION, sector, nr_sects, &res); > > > > /me thinks BDEV_RES_PROVISION is correct here, because regular-mode file > > fallocate (for ext4/xfs anyway) allocates blocks and maps them to specific file > > offsets as unwritten extents. afaict RES_PROVISION -> thin_provision_space() > > and thin_provision_space() seems to allocate blocks and map them to the > > device's LBAs. > > > > If I'm reading the patches correctly, RES_GET/RES_MOD seem to reserve N blocks > > but doesn't map them to any specific LBA. > > Right that is how I read it too. I just put that FIXME in to cover my > ass incase I was being an idiot ;) > > > +} > > > +EXPORT_SYMBOL(blkdev_ensure_space_exists); > > > diff --git a/fs/block_dev.c b/fs/block_dev.c > > > index 5a2c3ab..b34c07b 100644 > > > --- a/fs/block_dev.c > > > +++ b/fs/block_dev.c > > > @@ -1801,17 +1801,13 @@ long blkdev_fallocate(struct file *file, int mode, loff_t start, loff_t len) > > > struct request_queue *q = bdev_get_queue(bdev); > > > struct address_space *mapping; > > > loff_t end = start + len - 1; > > > - loff_t bs_mask, isize; > > > + loff_t isize; > > > int error; > > > > > > /* We only support zero range and punch hole. */ > > > if (mode & ~BLKDEV_FALLOC_FL_SUPPORTED) > > > return -EOPNOTSUPP; > > > > > > - /* We haven't a primitive for "ensure space exists" right now. */ > > > - if (!(mode & ~FALLOC_FL_KEEP_SIZE)) > > > - return -EOPNOTSUPP; > > > - > > > /* Only punch if the device can do zeroing discard. */ > > > if ((mode & FALLOC_FL_PUNCH_HOLE) && > > > (!blk_queue_discard(q) || !q->limits.discard_zeroes_data)) > > > @@ -1829,9 +1825,12 @@ long blkdev_fallocate(struct file *file, int mode, loff_t start, loff_t len) > > > return -EINVAL; > > > } > > > > > > - /* Don't allow IO that isn't aligned to logical block size */ > > > - bs_mask = bdev_logical_block_size(bdev) - 1; > > > - if ((start | len) & bs_mask) > > > + /* > > > + * Don't allow IO that isn't aligned to minimum IO size (io_min) > > > + * - for normal device's io_min is usually logical block size > > > + * - but for more exotic devices (e.g. DM thinp) it may be larger > > > + */ > > > + if ((start | len) % bdev_io_min(bdev)) > > > return -EINVAL; > > > > Noted. Will update the original patch. > > OK, thanks. > > Once your new patchset is available I'll rebase my 'dm-fallocate' test > branch accordingly. > > > > /* Invalidate the page cache, including dirty pages. */ > > > @@ -1839,7 +1838,10 @@ long blkdev_fallocate(struct file *file, int mode, loff_t start, loff_t len) > > > truncate_inode_pages_range(mapping, start, end); > > > > > > error = -EINVAL; > > > - if (mode & FALLOC_FL_ZERO_RANGE) > > > + if (!(mode & ~FALLOC_FL_KEEP_SIZE)) > > > + error = blkdev_ensure_space_exists(bdev, start >> 9, len >> 9, > > > + mode); > > > + else if (mode & FALLOC_FL_ZERO_RANGE) > > > > This whole thing got converted to a switch statement due to some feedback > > from hch. > > > > Anyway, will try to have a new blockdev fallocate patchset done by the end > > of the day. > > > > (Is there a test case for this?) > > No, but once my patch is in place to join your patchset with Brian's > then any basic fallocate tests against a DM thinp volume _should_ work. > > /me assumes xfstests has such tests? Only missing bit would be to layer > the filesystem ontop of DM thinp? Or extend the tests your added to > test DM thinp devices directly. I think Eric Sandeen (now cc'd) made > xfstests capable or creating DM thinp volumes for certain tests. The patches got reviewed but aren't upstream. It looks like it wouldn't be difficult once it lands to make a test case that tests fallocate directly on a thinp device. --D > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org Tue Apr 12 17:27:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EFE557CA1 for ; Tue, 12 Apr 2016 17:27:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B66268F8033 for ; Tue, 12 Apr 2016 15:27:03 -0700 (PDT) X-ASG-Debug-ID: 1460500020-04bdf01103425a30001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id lPflTlzoZGFZ7IM9 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 12 Apr 2016 15:27:01 -0700 (PDT) X-Barracuda-Envelope-From: BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [67.51.76.21] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1aq6lv-0006AM-26 for xfs@oss.sgi.com; Tue, 12 Apr 2016 22:27:00 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: RFC: use iomap infrastructure for all our zeroing needs Date: Tue, 12 Apr 2016 15:26:47 -0700 X-ASG-Orig-Subj: RFC: use iomap infrastructure for all our zeroing needs Message-Id: <1460500013-28334-1-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1460500021 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28680 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This series uses the new iomap infrastructure to simplify all kinds of zeroing operations. The RFC tag is mostly because the DAX path modified in this series hasn't been tested yet, the normal buffered path has been tested and works fine. From BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org Tue Apr 12 17:27:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6991F7CA6 for ; Tue, 12 Apr 2016 17:27:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2E758304062 for ; Tue, 12 Apr 2016 15:27:10 -0700 (PDT) X-ASG-Debug-ID: 1460500027-04cb6c245f425420001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id 3MBQxWvmA5Bzqv2a (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 12 Apr 2016 15:27:08 -0700 (PDT) X-Barracuda-Envelope-From: BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [67.51.76.21] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1aq6m2-0006AZ-4B for xfs@oss.sgi.com; Tue, 12 Apr 2016 22:27:06 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 1/6] iomap: support DAX based zeroing Date: Tue, 12 Apr 2016 15:26:48 -0700 X-ASG-Orig-Subj: [PATCH 1/6] iomap: support DAX based zeroing Message-Id: <1460500013-28334-2-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1460500013-28334-1-git-send-email-hch@lst.de> References: <1460500013-28334-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1460500028 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28679 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This avoid needing a separate inefficient get_block based DAX zero_range implementation in file systems. Signed-off-by: Christoph Hellwig --- fs/iomap.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/fs/iomap.c b/fs/iomap.c index 28a8fcb..a3e7dea 100644 --- a/fs/iomap.c +++ b/fs/iomap.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "internal.h" typedef loff_t (*iomap_actor_t)(struct inode *inode, loff_t pos, loff_t len, @@ -264,6 +265,15 @@ iomap_zero_range_actor(struct inode *inode, loff_t pos, loff_t count, if (iomap->type == IOMAP_HOLE || iomap->type == IOMAP_UNWRITTEN) return count; +#ifdef CONFIG_FS_DAX + if (IS_DAX(inode)) { + status = dax_clear_sectors(iomap->bdev, iomap->blkno, count); + if (status) + return status; + return count; + } +#endif + do { unsigned offset, bytes; -- 2.1.4 From BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org Tue Apr 12 17:27:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AE8807CA1 for ; Tue, 12 Apr 2016 17:27:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 73F158F8035 for ; Tue, 12 Apr 2016 15:27:17 -0700 (PDT) X-ASG-Debug-ID: 1460500034-04bdf01104425a50001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id 8Vhxnzfwm3TVqUhr (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 12 Apr 2016 15:27:15 -0700 (PDT) X-Barracuda-Envelope-From: BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [67.51.76.21] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1aq6m8-0006B4-W9 for xfs@oss.sgi.com; Tue, 12 Apr 2016 22:27:13 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 2/6] xfs: use iomap infrastructure for DAX zeroing Date: Tue, 12 Apr 2016 15:26:49 -0700 X-ASG-Orig-Subj: [PATCH 2/6] xfs: use iomap infrastructure for DAX zeroing Message-Id: <1460500013-28334-3-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1460500013-28334-1-git-send-email-hch@lst.de> References: <1460500013-28334-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1460500034 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28680 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_file.c | 35 +---------------------------------- fs/xfs/xfs_iops.c | 9 ++------- 2 files changed, 3 insertions(+), 41 deletions(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index bcedd80..bd07913 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -80,34 +80,6 @@ xfs_rw_ilock_demote( inode_unlock(VFS_I(ip)); } -static int -xfs_dax_zero_range( - struct inode *inode, - loff_t pos, - size_t count) -{ - int status = 0; - - do { - unsigned offset, bytes; - - offset = (pos & (PAGE_CACHE_SIZE -1)); /* Within page */ - bytes = PAGE_CACHE_SIZE - offset; - if (bytes > count) - bytes = count; - - status = dax_zero_page_range(inode, pos, bytes, - xfs_get_blocks_direct); - if (status) - break; - - pos += bytes; - count -= bytes; - } while (count); - - return status; -} - /* * Clear the specified ranges to zero through either the pagecache or DAX. * Holes and unwritten extents will be left as-is as they already are zeroed. @@ -118,12 +90,7 @@ xfs_iozero( loff_t pos, size_t count) { - struct inode *inode = VFS_I(ip); - - if (IS_DAX(VFS_I(ip))) - return xfs_dax_zero_range(inode, pos, count); - else - return iomap_zero_range(inode, pos, count, NULL, &xfs_iomap_ops); + return iomap_zero_range(VFS_I(ip), pos, count, NULL, &xfs_iomap_ops); } int diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 6e3614a..0c744fc 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -819,13 +819,8 @@ xfs_setattr_size( if (newsize > oldsize) { error = xfs_zero_eof(ip, newsize, oldsize, &did_zeroing); } else { - if (IS_DAX(inode)) { - error = dax_truncate_page(inode, newsize, - xfs_get_blocks_direct); - } else { - error = iomap_truncate_page(inode, newsize, - &did_zeroing, &xfs_iomap_ops); - } + error = iomap_truncate_page(inode, newsize, &did_zeroing, + &xfs_iomap_ops); } if (error) -- 2.1.4 From BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org Tue Apr 12 17:27:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 538087CB3 for ; Tue, 12 Apr 2016 17:27:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1953830405F for ; Tue, 12 Apr 2016 15:27:22 -0700 (PDT) X-ASG-Debug-ID: 1460500038-04bdf01103425a50001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id JWP3RI68ln9IxkHS (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 12 Apr 2016 15:27:19 -0700 (PDT) X-Barracuda-Envelope-From: BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [67.51.76.21] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1aq6mE-0006BW-A8 for xfs@oss.sgi.com; Tue, 12 Apr 2016 22:27:18 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 3/6] xfs: handle 64-bit length in xfs_iozero Date: Tue, 12 Apr 2016 15:26:50 -0700 X-ASG-Orig-Subj: [PATCH 3/6] xfs: handle 64-bit length in xfs_iozero Message-Id: <1460500013-28334-4-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1460500013-28334-1-git-send-email-hch@lst.de> References: <1460500013-28334-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1460500039 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28680 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- We'll want to use this code for large offsets now that we're skipping holes and unwritten extents efficiently. Also rename it to xfs_zero_range to be a bit more descriptive, and tell the caller if we actually did any zeroing. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_file.c | 11 ++++++----- fs/xfs/xfs_inode.h | 3 ++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index bd07913..85369a9 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -85,10 +85,11 @@ xfs_rw_ilock_demote( * Holes and unwritten extents will be left as-is as they already are zeroed. */ int -xfs_iozero( +xfs_zero_range( struct xfs_inode *ip, - loff_t pos, - size_t count) + xfs_off_t pos, + xfs_off_t count, + bool *did_zero) { return iomap_zero_range(VFS_I(ip), pos, count, NULL, &xfs_iomap_ops); } @@ -419,7 +420,7 @@ xfs_zero_last_block( if (isize + zero_len > offset) zero_len = offset - isize; *did_zeroing = true; - return xfs_iozero(ip, isize, zero_len); + return xfs_zero_range(ip, isize, zero_len, NULL); } /* @@ -518,7 +519,7 @@ xfs_zero_eof( if ((zero_off + zero_len) > offset) zero_len = offset - zero_off; - error = xfs_iozero(ip, zero_off, zero_len); + error = xfs_zero_range(ip, zero_off, zero_len, NULL); if (error) return error; diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index e52d7c7..dbb0bcf 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -434,7 +434,8 @@ 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); +int xfs_zero_range(struct xfs_inode *ip, xfs_off_t pos, xfs_off_t count, + bool *did_zero); loff_t __xfs_seek_hole_data(struct inode *inode, loff_t start, loff_t eof, int whence); -- 2.1.4 From BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org Tue Apr 12 17:27:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B6FDC7CB6 for ; Tue, 12 Apr 2016 17:27:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7CCA130405F for ; Tue, 12 Apr 2016 15:27:25 -0700 (PDT) X-ASG-Debug-ID: 1460500042-04cb6c2460425440001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id eugWkowO9w11iPqE (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 12 Apr 2016 15:27:23 -0700 (PDT) X-Barracuda-Envelope-From: BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [67.51.76.21] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1aq6mH-0006Br-NK for xfs@oss.sgi.com; Tue, 12 Apr 2016 22:27:22 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 4/6] xfs: use xfs_zero_range in xfs_zero_eof Date: Tue, 12 Apr 2016 15:26:51 -0700 X-ASG-Orig-Subj: [PATCH 4/6] xfs: use xfs_zero_range in xfs_zero_eof Message-Id: <1460500013-28334-5-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1460500013-28334-1-git-send-email-hch@lst.de> References: <1460500013-28334-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1460500043 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28679 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- We now skip holes in it, so no need to have the caller do it as well. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_file.c | 128 +----------------------------------------------------- 1 file changed, 1 insertion(+), 127 deletions(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 85369a9..6ad30dd 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -381,49 +381,6 @@ out: } /* - * This routine is called to handle zeroing any space in the last block of the - * file that is beyond the EOF. We do this since the size is being increased - * without writing anything to that block and we don't want to read the - * garbage on the disk. - */ -STATIC int /* error (positive) */ -xfs_zero_last_block( - struct xfs_inode *ip, - xfs_fsize_t offset, - 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); - int zero_offset = XFS_B_FSB_OFFSET(mp, isize); - int zero_len; - int nimaps = 1; - int error = 0; - struct xfs_bmbt_irec imap; - - xfs_ilock(ip, XFS_ILOCK_EXCL); - error = xfs_bmapi_read(ip, last_fsb, 1, &imap, &nimaps, 0); - xfs_iunlock(ip, XFS_ILOCK_EXCL); - if (error) - return error; - - ASSERT(nimaps > 0); - - /* - * If the block underlying isize is just a hole, then there - * is nothing to zero. - */ - if (imap.br_startblock == HOLESTARTBLOCK) - return 0; - - zero_len = mp->m_sb.sb_blocksize - zero_offset; - if (isize + zero_len > offset) - zero_len = offset - isize; - *did_zeroing = true; - return xfs_zero_range(ip, isize, zero_len, NULL); -} - -/* * Zero any on disk space between the current EOF and the new, larger EOF. * * This handles the normal case of zeroing the remainder of the last block in @@ -441,94 +398,11 @@ xfs_zero_eof( xfs_fsize_t isize, /* current inode size */ bool *did_zeroing) { - struct xfs_mount *mp = ip->i_mount; - xfs_fileoff_t start_zero_fsb; - xfs_fileoff_t end_zero_fsb; - xfs_fileoff_t zero_count_fsb; - xfs_fileoff_t last_fsb; - xfs_fileoff_t zero_off; - xfs_fsize_t zero_len; - int nimaps; - int error = 0; - struct xfs_bmbt_irec imap; - ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); ASSERT(offset > isize); trace_xfs_zero_eof(ip, isize, offset - isize); - - /* - * First handle zeroing the block on which isize resides. - * - * 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, did_zeroing); - if (error) - return error; - } - - /* - * Calculate the range between the new size and the old where blocks - * needing to be zeroed may exist. - * - * To get the block where the last byte in the file currently resides, - * we need to subtract one from the size and truncate back to a block - * boundary. We subtract 1 in case the size is exactly on a block - * boundary. - */ - last_fsb = isize ? XFS_B_TO_FSBT(mp, isize - 1) : (xfs_fileoff_t)-1; - start_zero_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)isize); - end_zero_fsb = XFS_B_TO_FSBT(mp, offset - 1); - ASSERT((xfs_sfiloff_t)last_fsb < (xfs_sfiloff_t)start_zero_fsb); - if (last_fsb == end_zero_fsb) { - /* - * The size was only incremented on its last block. - * We took care of that above, so just return. - */ - return 0; - } - - ASSERT(start_zero_fsb <= end_zero_fsb); - while (start_zero_fsb <= end_zero_fsb) { - nimaps = 1; - zero_count_fsb = end_zero_fsb - start_zero_fsb + 1; - - xfs_ilock(ip, XFS_ILOCK_EXCL); - error = xfs_bmapi_read(ip, start_zero_fsb, zero_count_fsb, - &imap, &nimaps, 0); - xfs_iunlock(ip, XFS_ILOCK_EXCL); - if (error) - return error; - - ASSERT(nimaps > 0); - - if (imap.br_state == XFS_EXT_UNWRITTEN || - imap.br_startblock == HOLESTARTBLOCK) { - start_zero_fsb = imap.br_startoff + imap.br_blockcount; - ASSERT(start_zero_fsb <= (end_zero_fsb + 1)); - continue; - } - - /* - * There are blocks we need to zero. - */ - zero_off = XFS_FSB_TO_B(mp, start_zero_fsb); - zero_len = XFS_FSB_TO_B(mp, imap.br_blockcount); - - if ((zero_off + zero_len) > offset) - zero_len = offset - zero_off; - - error = xfs_zero_range(ip, zero_off, zero_len, NULL); - if (error) - return error; - - *did_zeroing = true; - start_zero_fsb = imap.br_startoff + imap.br_blockcount; - ASSERT(start_zero_fsb <= (end_zero_fsb + 1)); - } - - return 0; + return xfs_zero_range(ip, isize, offset - isize, did_zeroing); } /* -- 2.1.4 From BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org Tue Apr 12 17:27:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9134F7CA1 for ; Tue, 12 Apr 2016 17:27:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id EDD10AC006 for ; Tue, 12 Apr 2016 15:27:30 -0700 (PDT) X-ASG-Debug-ID: 1460500046-04cbb02e1c10d0e0001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id a2EG30lcqA6eFRU5 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 12 Apr 2016 15:27:27 -0700 (PDT) X-Barracuda-Envelope-From: BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [67.51.76.21] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1aq6mM-0006Bw-0A for xfs@oss.sgi.com; Tue, 12 Apr 2016 22:27:26 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 5/6] xfs: split xfs_free_file_space in manageable pieces Date: Tue, 12 Apr 2016 15:26:52 -0700 X-ASG-Orig-Subj: [PATCH 5/6] xfs: split xfs_free_file_space in manageable pieces Message-Id: <1460500013-28334-6-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1460500013-28334-1-git-send-email-hch@lst.de> References: <1460500013-28334-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1460500047 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28679 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_bmap_util.c | 252 +++++++++++++++++++++++++++---------------------- 1 file changed, 137 insertions(+), 115 deletions(-) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 3246ebc..5d030b0 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1191,30 +1191,132 @@ xfs_zero_remaining_bytes( return error; } +static int +xfs_unmap_extent( + struct xfs_inode *ip, + xfs_fileoff_t startoffset_fsb, + xfs_filblks_t len_fsb, + int *done) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_trans *tp; + struct xfs_bmap_free free_list; + xfs_fsblock_t firstfsb; + uint resblks = XFS_DIOSTRAT_SPACE_RES(mp, 0); + int error; + + error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write, resblks, 0, 0, &tp); + if (error) { + ASSERT(error == -ENOSPC || XFS_FORCED_SHUTDOWN(mp)); + return error; + } + + xfs_ilock(ip, XFS_ILOCK_EXCL); + error = xfs_trans_reserve_quota(tp, mp, ip->i_udquot, ip->i_gdquot, + ip->i_pdquot, resblks, 0, XFS_QMOPT_RES_REGBLKS); + if (error) + goto out_trans_cancel; + + xfs_trans_ijoin(tp, ip, 0); + + xfs_bmap_init(&free_list, &firstfsb); + error = xfs_bunmapi(tp, ip, startoffset_fsb, len_fsb, 0, 2, &firstfsb, + &free_list, done); + if (error) + goto out_bmap_cancel; + + error = xfs_bmap_finish(&tp, &free_list, NULL); + if (error) + goto out_bmap_cancel; + + error = xfs_trans_commit(tp); +out_unlock: + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return error; + +out_bmap_cancel: + xfs_bmap_cancel(&free_list); +out_trans_cancel: + xfs_trans_cancel(tp); + goto out_unlock; +} + +static int +xfs_adjust_extent_unmap_boundaries( + struct xfs_inode *ip, + xfs_fileoff_t *startoffset_fsb, + xfs_fileoff_t *endoffset_fsb) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_bmbt_irec imap; + int nimap, error; + xfs_extlen_t mod = 0; + + nimap = 1; + error = xfs_bmapi_read(ip, *startoffset_fsb, 1, &imap, &nimap, 0); + if (error) + return error; + + if (nimap && imap.br_startblock != HOLESTARTBLOCK) { + xfs_daddr_t block; + + ASSERT(imap.br_startblock != DELAYSTARTBLOCK); + block = imap.br_startblock; + mod = do_div(block, mp->m_sb.sb_rextsize); + if (mod) + *startoffset_fsb += mp->m_sb.sb_rextsize - mod; + } + + nimap = 1; + error = xfs_bmapi_read(ip, *endoffset_fsb - 1, 1, &imap, &nimap, 0); + if (error) + return error; + + if (nimap && imap.br_startblock != HOLESTARTBLOCK) { + ASSERT(imap.br_startblock != DELAYSTARTBLOCK); + mod++; + if (mod && mod != mp->m_sb.sb_rextsize) + *endoffset_fsb -= mod; + } + + return 0; +} + +static int +xfs_flush_unmap_range( + struct xfs_inode *ip, + xfs_off_t offset, + xfs_off_t len) +{ + struct xfs_mount *mp = ip->i_mount; + struct inode *inode = VFS_I(ip); + xfs_off_t rounding, start, end; + int error; + + /* wait for the completion of any pending DIOs */ + inode_dio_wait(inode); + + rounding = max_t(xfs_off_t, 1 << mp->m_sb.sb_blocklog, PAGE_SIZE); + start = round_down(offset, rounding); + end = round_up(offset + len, rounding) - 1; + + error = filemap_write_and_wait_range(inode->i_mapping, start, end); + if (error) + return error; + truncate_pagecache_range(inode, start, end); + return 0; +} + int xfs_free_file_space( struct xfs_inode *ip, xfs_off_t offset, xfs_off_t len) { - int done; - xfs_fileoff_t endoffset_fsb; - int error; - xfs_fsblock_t firstfsb; - xfs_bmap_free_t free_list; - xfs_bmbt_irec_t imap; - xfs_off_t ioffset; - xfs_off_t iendoffset; - xfs_extlen_t mod=0; - xfs_mount_t *mp; - int nimap; - uint resblks; - xfs_off_t rounding; - int rt; + struct xfs_mount *mp = ip->i_mount; xfs_fileoff_t startoffset_fsb; - xfs_trans_t *tp; - - mp = ip->i_mount; + xfs_fileoff_t endoffset_fsb; + int done, error; trace_xfs_free_file_space(ip); @@ -1222,60 +1324,30 @@ xfs_free_file_space( if (error) return error; - error = 0; if (len <= 0) /* if nothing being freed */ - return error; - rt = XFS_IS_REALTIME_INODE(ip); - startoffset_fsb = XFS_B_TO_FSB(mp, offset); - endoffset_fsb = XFS_B_TO_FSBT(mp, offset + len); - - /* wait for the completion of any pending DIOs */ - inode_dio_wait(VFS_I(ip)); + return 0; - rounding = max_t(xfs_off_t, 1 << mp->m_sb.sb_blocklog, PAGE_CACHE_SIZE); - ioffset = round_down(offset, rounding); - iendoffset = round_up(offset + len, rounding) - 1; - error = filemap_write_and_wait_range(VFS_I(ip)->i_mapping, ioffset, - iendoffset); + error = xfs_flush_unmap_range(ip, offset, len); if (error) - goto out; - truncate_pagecache_range(VFS_I(ip), ioffset, iendoffset); + return error; + + startoffset_fsb = XFS_B_TO_FSB(mp, offset); + endoffset_fsb = XFS_B_TO_FSBT(mp, offset + len); /* - * Need to zero the stuff we're not freeing, on disk. - * If it's a realtime file & can't use unwritten extents then we - * actually need to zero the extent edges. Otherwise xfs_bunmapi - * will take care of it for us. + * Need to zero the stuff we're not freeing, on disk. If it's a RT file + * and we can't use unwritten extents then we actually need to ensure + * to zero the whole extent, otherwise we just need to take of block + * boundaries, and xfs_bunmapi will handle the rest. */ - if (rt && !xfs_sb_version_hasextflgbit(&mp->m_sb)) { - nimap = 1; - error = xfs_bmapi_read(ip, startoffset_fsb, 1, - &imap, &nimap, 0); + if (XFS_IS_REALTIME_INODE(ip) && + !xfs_sb_version_hasextflgbit(&mp->m_sb)) { + error = xfs_adjust_extent_unmap_boundaries(ip, &startoffset_fsb, + &endoffset_fsb); if (error) - goto out; - ASSERT(nimap == 0 || nimap == 1); - if (nimap && imap.br_startblock != HOLESTARTBLOCK) { - xfs_daddr_t block; - - ASSERT(imap.br_startblock != DELAYSTARTBLOCK); - block = imap.br_startblock; - mod = do_div(block, mp->m_sb.sb_rextsize); - if (mod) - startoffset_fsb += mp->m_sb.sb_rextsize - mod; - } - nimap = 1; - error = xfs_bmapi_read(ip, endoffset_fsb - 1, 1, - &imap, &nimap, 0); - if (error) - goto out; - ASSERT(nimap == 0 || nimap == 1); - if (nimap && imap.br_startblock != HOLESTARTBLOCK) { - ASSERT(imap.br_startblock != DELAYSTARTBLOCK); - mod++; - if (mod && (mod != mp->m_sb.sb_rextsize)) - endoffset_fsb -= mod; - } + return error; } + if ((done = (endoffset_fsb <= startoffset_fsb))) /* * One contiguous piece to clear @@ -1295,62 +1367,12 @@ xfs_free_file_space( offset + len - 1); } - /* - * free file space until done or until there is an error - */ - resblks = XFS_DIOSTRAT_SPACE_RES(mp, 0); while (!error && !done) { - - /* - * allocate and setup the transaction. Allow this - * transaction to dip into the reserve blocks to ensure - * the freeing of the space succeeds at ENOSPC. - */ - error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write, resblks, 0, 0, - &tp); - if (error) { - ASSERT(error == -ENOSPC || XFS_FORCED_SHUTDOWN(mp)); - break; - } - xfs_ilock(ip, XFS_ILOCK_EXCL); - error = xfs_trans_reserve_quota(tp, mp, - ip->i_udquot, ip->i_gdquot, ip->i_pdquot, - resblks, 0, XFS_QMOPT_RES_REGBLKS); - if (error) - goto error1; - - xfs_trans_ijoin(tp, ip, 0); - - /* - * issue the bunmapi() call to free the blocks - */ - xfs_bmap_init(&free_list, &firstfsb); - error = xfs_bunmapi(tp, ip, startoffset_fsb, - endoffset_fsb - startoffset_fsb, - 0, 2, &firstfsb, &free_list, &done); - if (error) - goto error0; - - /* - * complete the transaction - */ - error = xfs_bmap_finish(&tp, &free_list, NULL); - if (error) - goto error0; - - error = xfs_trans_commit(tp); - xfs_iunlock(ip, XFS_ILOCK_EXCL); + error = xfs_unmap_extent(ip, startoffset_fsb, + endoffset_fsb - startoffset_fsb, &done); } - out: return error; - - error0: - xfs_bmap_cancel(&free_list); - error1: - xfs_trans_cancel(tp); - xfs_iunlock(ip, XFS_ILOCK_EXCL); - goto out; } /* -- 2.1.4 From BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org Tue Apr 12 17:27:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3A7347CBB for ; Tue, 12 Apr 2016 17:27:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E6914304062 for ; Tue, 12 Apr 2016 15:27:36 -0700 (PDT) X-ASG-Debug-ID: 1460500052-04bdf01104425a70001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id ZJiJxbxBpkkcRpXX (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 12 Apr 2016 15:27:33 -0700 (PDT) X-Barracuda-Envelope-From: BATV+cb5880f042a3473401ec+4615+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [67.51.76.21] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1aq6mR-0006CH-UL for xfs@oss.sgi.com; Tue, 12 Apr 2016 22:27:32 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 6/6] kill xfs_zero_remaining_bytes Date: Tue, 12 Apr 2016 15:26:53 -0700 X-ASG-Orig-Subj: [PATCH 6/6] kill xfs_zero_remaining_bytes Message-Id: <1460500013-28334-7-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1460500013-28334-1-git-send-email-hch@lst.de> References: <1460500013-28334-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1460500053 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28680 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --- fs/xfs/xfs_bmap_util.c | 133 ++++++------------------------------------------- 1 file changed, 14 insertions(+), 119 deletions(-) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 5d030b0..0efabc1 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1096,101 +1096,6 @@ error1: /* Just cancel transaction */ return error; } -/* - * Zero file bytes between startoff and endoff inclusive. - * The iolock is held exclusive and no blocks are buffered. - * - * This function is used by xfs_free_file_space() to zero - * partial blocks when the range to free is not block aligned. - * When unreserving space with boundaries that are not block - * aligned we round up the start and round down the end - * boundaries and then use this function to zero the parts of - * the blocks that got dropped during the rounding. - */ -STATIC int -xfs_zero_remaining_bytes( - xfs_inode_t *ip, - xfs_off_t startoff, - xfs_off_t endoff) -{ - xfs_bmbt_irec_t imap; - xfs_fileoff_t offset_fsb; - xfs_off_t lastoffset; - xfs_off_t offset; - xfs_buf_t *bp; - xfs_mount_t *mp = ip->i_mount; - int nimap; - int error = 0; - - /* - * Avoid doing I/O beyond eof - it's not necessary - * since nothing can read beyond eof. The space will - * be zeroed when the file is extended anyway. - */ - if (startoff >= XFS_ISIZE(ip)) - return 0; - - if (endoff > XFS_ISIZE(ip)) - endoff = XFS_ISIZE(ip); - - for (offset = startoff; offset <= endoff; offset = lastoffset + 1) { - uint lock_mode; - - offset_fsb = XFS_B_TO_FSBT(mp, offset); - nimap = 1; - - lock_mode = xfs_ilock_data_map_shared(ip); - error = xfs_bmapi_read(ip, offset_fsb, 1, &imap, &nimap, 0); - xfs_iunlock(ip, lock_mode); - - if (error || nimap < 1) - break; - ASSERT(imap.br_blockcount >= 1); - ASSERT(imap.br_startoff == offset_fsb); - ASSERT(imap.br_startblock != DELAYSTARTBLOCK); - - if (imap.br_startblock == HOLESTARTBLOCK || - imap.br_state == XFS_EXT_UNWRITTEN) { - /* skip the entire extent */ - lastoffset = XFS_FSB_TO_B(mp, imap.br_startoff + - imap.br_blockcount) - 1; - continue; - } - - lastoffset = XFS_FSB_TO_B(mp, imap.br_startoff + 1) - 1; - if (lastoffset > endoff) - lastoffset = endoff; - - /* DAX can just zero the backing device directly */ - if (IS_DAX(VFS_I(ip))) { - error = dax_zero_page_range(VFS_I(ip), offset, - lastoffset - offset + 1, - xfs_get_blocks_direct); - if (error) - return error; - continue; - } - - error = xfs_buf_read_uncached(XFS_IS_REALTIME_INODE(ip) ? - mp->m_rtdev_targp : mp->m_ddev_targp, - xfs_fsb_to_db(ip, imap.br_startblock), - BTOBB(mp->m_sb.sb_blocksize), - 0, &bp, NULL); - if (error) - return error; - - memset(bp->b_addr + - (offset - XFS_FSB_TO_B(mp, imap.br_startoff)), - 0, lastoffset - offset + 1); - - error = xfs_bwrite(bp); - xfs_buf_relse(bp); - if (error) - return error; - } - return error; -} - static int xfs_unmap_extent( struct xfs_inode *ip, @@ -1316,7 +1221,7 @@ xfs_free_file_space( struct xfs_mount *mp = ip->i_mount; xfs_fileoff_t startoffset_fsb; xfs_fileoff_t endoffset_fsb; - int done, error; + int done = 0, error; trace_xfs_free_file_space(ip); @@ -1348,31 +1253,21 @@ xfs_free_file_space( return error; } - if ((done = (endoffset_fsb <= startoffset_fsb))) - /* - * One contiguous piece to clear - */ - error = xfs_zero_remaining_bytes(ip, offset, offset + len - 1); - else { - /* - * Some full blocks, possibly two pieces to clear - */ - if (offset < XFS_FSB_TO_B(mp, startoffset_fsb)) - error = xfs_zero_remaining_bytes(ip, offset, - XFS_FSB_TO_B(mp, startoffset_fsb) - 1); - if (!error && - XFS_FSB_TO_B(mp, endoffset_fsb) < offset + len) - error = xfs_zero_remaining_bytes(ip, - XFS_FSB_TO_B(mp, endoffset_fsb), - offset + len - 1); - } - - while (!error && !done) { - error = xfs_unmap_extent(ip, startoffset_fsb, - endoffset_fsb - startoffset_fsb, &done); + if (endoffset_fsb > startoffset_fsb) { + while (!done) { + error = xfs_unmap_extent(ip, startoffset_fsb, + endoffset_fsb - startoffset_fsb, &done); + if (error) + return error; + } } - return error; + /* + * Now that we've unmap all full blocks we'll have to zero out any + * partial block at the beginning and/or end. xfs_zero_range is + * smart enough to skip any holes, including those we just created. + */ + return xfs_zero_range(ip, offset, len, NULL); } /* -- 2.1.4 From david@fromorbit.com Tue Apr 12 18:29:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EEED17CA2 for ; Tue, 12 Apr 2016 18:29:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 719BEAC005 for ; Tue, 12 Apr 2016 16:29:46 -0700 (PDT) X-ASG-Debug-ID: 1460503783-04cb6c245f4270e0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id DoOADddo1mTSo9b9 for ; Tue, 12 Apr 2016 16:29:43 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AYCwAchA1XNaAZLHlegzeBUIZrn2oBAQEBAQEGjBGFaIQThggEAgKBO00BAQEBAQEHAQEBAUEBQIRCAQEEOhwjEAgDGAklDwUlAwcaE4gnwiQBAQgCHhmFQIUThA8RAYV0BZgIjgOPGkWOYoRbKjCIUYE0AQEB Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail04.adl6.internode.on.net with ESMTP; 13 Apr 2016 08:59:26 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aq7kL-0003Jb-Cw; Wed, 13 Apr 2016 09:29:25 +1000 Date: Wed, 13 Apr 2016 09:29:25 +1000 From: Dave Chinner To: Alex Lyakas Cc: xfs@oss.sgi.com, bbice@sgi.com, Shyam Kaushik Subject: Re: [PATCH 4/5] xfs: xfs_inode_free() isn't RCU safe Message-ID: <20160412232925.GN567@dastard> X-ASG-Orig-Subj: Re: [PATCH 4/5] xfs: xfs_inode_free() isn't RCU safe References: <0A92B65A3BF94F60BB36EA3FA716DF1F@alyakaslap> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <0A92B65A3BF94F60BB36EA3FA716DF1F@alyakaslap> 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: 1460503783 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28681 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Apr 12, 2016 at 11:56:35AM +0300, Alex Lyakas wrote: > Hello Dave, > > Looking at the patch, I see that now we call xfs_idestroy_fork() in RCU callback. This can do the following chain: > > xfs_iext_destroy => xfs_iext_irec_remove => xfs_iext_realloc_indirect=> kmem_realloc => kmem_alloc => kmem_alloc => congestion_wait() > > At least according to documentation, the RCU callback cannot block, since it may be called from softirq context. Is this fine? Right, I forgot about that. Too many forests. I'll reconstruct your patch from the email you appended it to previously and add that to the series to test against. Cheers, Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Tue Apr 12 19:12:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 2A5297CA2 for ; Tue, 12 Apr 2016 19:12:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 938D7AC005 for ; Tue, 12 Apr 2016 17:12:49 -0700 (PDT) X-ASG-Debug-ID: 1460506366-04cbb02e1a1112f0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id fRmOn0yYAYqx4Ltf (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 17:12:47 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u3D0Cjr0006844 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 13 Apr 2016 00:12:46 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u3D0Cj3H024280 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 13 Apr 2016 00:12:45 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u3D0CiOi014480; Wed, 13 Apr 2016 00:12:45 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 12 Apr 2016 17:12:44 -0700 Date: Tue, 12 Apr 2016 17:12:43 -0700 From: "Darrick J. Wong" To: Mike Snitzer Cc: Brian Foster , xfs@oss.sgi.com, linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, dm-devel@redhat.com Subject: Re: [RFC PATCH] block: wire blkdev_fallocate() to block_device_operations' reserve_space Message-ID: <20160413001243.GA25280@birch.djwong.org> X-ASG-Orig-Subj: Re: [RFC PATCH] block: wire blkdev_fallocate() to block_device_operations' reserve_space References: <1460479373-63317-1-git-send-email-bfoster@redhat.com> <20160412200459.GA10730@redhat.com> <20160412203904.GD5812@birch.djwong.org> <20160412210426.GA1845@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160412210426.GA1845@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1460506367 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28682 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Apr 12, 2016 at 05:04:27PM -0400, Mike Snitzer wrote: > On Tue, Apr 12 2016 at 4:39pm -0400, > Darrick J. Wong wrote: > > > On Tue, Apr 12, 2016 at 04:04:59PM -0400, Mike Snitzer wrote: > > > diff --git a/fs/block_dev.c b/fs/block_dev.c > > > index 5a2c3ab..b34c07b 100644 > > > --- a/fs/block_dev.c > > > +++ b/fs/block_dev.c > > > @@ -1801,17 +1801,13 @@ long blkdev_fallocate(struct file *file, int mode, loff_t start, loff_t len) > > > struct request_queue *q = bdev_get_queue(bdev); > > > struct address_space *mapping; > > > loff_t end = start + len - 1; > > > - loff_t bs_mask, isize; > > > + loff_t isize; > > > int error; > > > > > > /* We only support zero range and punch hole. */ > > > if (mode & ~BLKDEV_FALLOC_FL_SUPPORTED) > > > return -EOPNOTSUPP; > > > > > > - /* We haven't a primitive for "ensure space exists" right now. */ > > > - if (!(mode & ~FALLOC_FL_KEEP_SIZE)) > > > - return -EOPNOTSUPP; > > > - > > > /* Only punch if the device can do zeroing discard. */ > > > if ((mode & FALLOC_FL_PUNCH_HOLE) && > > > (!blk_queue_discard(q) || !q->limits.discard_zeroes_data)) > > > @@ -1829,9 +1825,12 @@ long blkdev_fallocate(struct file *file, int mode, loff_t start, loff_t len) > > > return -EINVAL; > > > } > > > > > > - /* Don't allow IO that isn't aligned to logical block size */ > > > - bs_mask = bdev_logical_block_size(bdev) - 1; > > > - if ((start | len) & bs_mask) > > > + /* > > > + * Don't allow IO that isn't aligned to minimum IO size (io_min) > > > + * - for normal device's io_min is usually logical block size > > > + * - but for more exotic devices (e.g. DM thinp) it may be larger > > > + */ > > > + if ((start | len) % bdev_io_min(bdev)) I started by noticing the 64-bit division. However, in researching alignment requirements for fallocate, I noticed that nothing says that we can return -EINVAL for unaligned offset/len for allocate or punch. For file allocations ext4 and xfs simply enlarge the range so that the ends are aligned to the logical block size; for punch they both shrink the range to deallocate until the ends are aligned, and write zeroes to the partial blocks. At least for user-visible fallocate we should do likewise, but for the internal blkdev_ helpers I think it makes more sense to check lbs alignment and let the lower level driver reject the IO if min_io alignment is a hard requirement. Documentation/block/queue-sysfs.txt says that the min_io is the smallest /preferred/ size. But, before that, I'll push out some new fallocate patches for -rc3. > > > return -EINVAL; > > > > Noted. Will update the original patch. > > BTW, I just noticed your "block: require write_same and discard requests > align to logical block size" -- doesn't look right. What happens if we pass a request to thinp that isn't aligned to minimum_io_size? Does it reject the command? > But maybe I'm just too hyper-focused on DM thinp's needs (which would > much prefer these checks be done in terms of minimum_io_size, rather > than logical_block_size, and _not_ assuming power-of-2 math will work). > > But at least for discard: your lbs-based check is fine; since we have > discard_granularity to cover thinp's more specific requirements. --D From tireman@shaw.ca Tue Apr 12 22:02:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 93E637CA0 for ; Tue, 12 Apr 2016 22:02:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 446F28F8033 for ; Tue, 12 Apr 2016 20:02:15 -0700 (PDT) X-ASG-Debug-ID: 1460516530-04cb6c246442dde0001-NocioJ Received: from smtp-out-so.shaw.ca (smtp-out-so.shaw.ca [64.59.136.138]) by cuda.sgi.com with ESMTP id YvjjykyvlaqdiUD4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 20:02:11 -0700 (PDT) X-Barracuda-Envelope-From: tireman@shaw.ca X-Barracuda-Apparent-Source-IP: 64.59.136.138 Received: from [192.168.0.2] ([174.5.126.242]) by shaw.ca with SMTP id qB4CaEedOBLFmqB4DasypQ; Tue, 12 Apr 2016 21:02:10 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=shaw.ca; s=s20150330; t=1460516530; bh=EUdTvO1TiOVnigUTaaLj6hteS7bzrp5Q08DA8Jtr8w4=; h=Subject:To:References:Cc:From:Date:In-Reply-To; b=susDiF72BrpeKEKM4asZJjnZITZQinoBh8fg4ubr0h3Gv1D5M0kI0pDB2OKFK9ZQT Ru5LWhY0Os2OhKxAeLZEC1Z1K0XRoFLEvmjwoa1CzHqk9KknVcqsDI2m5JNVq9RdHN Gq9YFQJF+zjL3kC2rtUKMSkf2OdAcfVZs/X1D5KQMuwGyrbjDjpGPFEYZKNA0FigRP vpg9gKfogNY7Egjq2lv7TgV3gAuUd/xyG+Gl08VsR0wA7Wf+6FlOFNPQ0GVDT17FfC RrdBInOxrDvBb2vicf+W3DtzZF9Ikx2hWyYywEVogfL5p8bvQX+p8j/uhbk0ENlldQ DAqpAvBWTuTBQ== X-Authority-Analysis: v=2.2 cv=W5d6blek c=1 sm=1 tr=0 a=YUpam8ogUlPMk4SS6ACeKg==:117 a=YUpam8ogUlPMk4SS6ACeKg==:17 a=IkcTkHD0fZMA:10 a=eJfxgxciAAAA:8 a=tfiUz3hOQYsGoedWjSgA:9 a=lHgvn6gSd-Uc_CH8:21 a=tEp5FeYdYs-2Urda:21 Subject: Re: xfs_repair fails after trying to format log cycle? To: Brian Foster X-ASG-Orig-Subj: Re: xfs_repair fails after trying to format log cycle? References: <56F6DE67.60403@shaw.ca> <20160328085541.GA27040@bfoster.bfoster> <570C8D4D.3060304@shaw.ca> <20160412140512.GA59690@bfoster.bfoster> <570D578D.5010706@shaw.ca> Cc: xfs@oss.sgi.com From: Andrew Ryder Message-ID: <570DB6CD.1000007@shaw.ca> Date: Tue, 12 Apr 2016 23:02:37 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <570D578D.5010706@shaw.ca> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-CMAE-Envelope: MS4wfIjJfHdLZAlG8NYMjWArTz0VwRB/lTwf1xmwv9HXmSZ6LJs7CM+RY7FNUoo4bYwQXNcDdTof6RAf9GjNIUG4R89laugqLEPAvCUrpzZlu3DfPMilYEqO vkTaQpvWg7KGHEPp5MehaYJ7EV5q3vNebl4O/UBezVbxi7fiJapgQM7AZ68jWs7z/7ZDZyHKVdx32g== X-Barracuda-Connect: smtp-out-so.shaw.ca[64.59.136.138] X-Barracuda-Start-Time: 1460516531 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28686 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 Is it possible the location its searching for at block 02:34:43.887528 pread64(4, 0x7fb8f53e0200, 2097152, 3001552175104) = -1 EIO (Input/output error) is not where the log actually is? If I run xfs_db in r/o mode it returns: xfs_db> blockget xfs_db: error - read only 950272 of 2097152 bytes failed to find log head xlog_is_dirty: cannot find log head/tail (xlog_find_tail=-5) ERROR: cannot find log head/tail, run xfs_repair The value of 950272 is the same if I multiply the 232 lines by 4096 of pread in the "strace_xfs_io.txt" file I get 950272 bytes as well. Yet if I run xfs_logprint it dump about 727MB of log info.. before throwing an error. xfs_logprint: data device: 0x902 log device: 0x902 daddr: 5860130880 length: 4173824 cycle: 63 version: 2 lsn: 63,2283776 tail_lsn: 63,2283456 length of Log Record: 32256 prev offset: 2283712 num ops: 376 uuid: 14bc270b-e658-4f85-b1db-673642ab9d67 format: little endian linux h_size: 32768 ---------------------------------------------------------------------------- Oper (0): tid: 6dd14bc1 len: 8 clientid: TRANS flags: WAS_CONT END Left over region from split log item ---------------------------------------------------------------------------- Oper (1): tid: 6dd14bc1 len: 32 clientid: TRANS flags: none EFD: #regs: 1 num_extents: 1 id: 0xffff88044f10abc0 ---------------------------------------------------------------------------- Oper (2): tid: 6dd14bc1 len: 56 clientid: TRANS flags: none INODE: #regs: 2 ino: 0x360f8c437 flags: 0x1 dsize: 0 blkno: 9905273888 len: 32 boff: 11776 Oper (3): tid: 6dd14bc1 len: 176 clientid: TRANS flags: none INODE CORE magic 0x494e mode 0100644 version 3 format 2 nlink 1 uid 1000 gid 100 atime 0x56d8c8e2 mtime 0x56d8c8e2 ctime 0x56d8c8e2 size 0x0 nblocks 0x0 extsize 0x0 nextents 0x0 < ... skipping to end .... > Oper (0): tid: edbd9f49 len: 0 clientid: TRANS flags: START ---------------------------------------------------------------------------- Oper (1): tid: edbd9f49 len: 16 clientid: TRANS flags: none TRAN: type: CHECKPOINT tid: edbd9f49 num_items: 2 ---------------------------------------------------------------------------- Oper (2): tid: edbd9f49 len: 24 clientid: TRANS flags: none BUF: #regs: 2 start blkno: 0 (0x0) len: 1 bmap size: 1 flags: 0x9000 Oper (3): tid: edbd9f49 len: 128 clientid: TRANS flags: none SUPER BLOCK Buffer: icount: 6360863066640355328 ifree: 1465036800 fdblks: 0 frext: 0 ---------------------------------------------------------------------------- Oper (4): tid: edbd9f49 len: 0 clientid: TRANS flags: COMMIT ============================================================================ ********************************************************************** * ERROR: header cycle=0 block=5120 * ********************************************************************** and if I pull the byte offset value from the daddr value below I get: xfs_db> daddr 5860130880 xfs_db> stack 1: byte offset 3000387010560, length 512 buffer block 5860130880 (fsbno 1073741832), 1 bb inode -1, dir inode -1, type data which is where when xfs_repair actually traverses the fs on the 3rd iteration and it fails after formatting the log to a size of 434,896,896 bytes (1659 iterations of 262144 byte successful writes before error) On 04/12/2016 04:16 PM, Andrew Ryder wrote: > On 04/12/2016 10:05 AM, Brian Foster wrote: >> On Tue, Apr 12, 2016 at 01:53:17AM -0400, Andrew Ryder wrote: >>> >>> >>> On 03/28/2016 04:55 AM, Brian Foster wrote: >>>> On Sat, Mar 26, 2016 at 03:09:27PM -0400, Andrew Ryder wrote: >>>>> Hello, >>>>> >>>>> I have an mdadm array with a xfs v5 filesystem on it and its begun >>>>> to give >>>>> me issues when trying to mount it as well as complete xfs_repair. >>>>> Not sure >>>>> if anyone might be able to shed some light on what is going on or >>>>> how to >>>>> correct the issue? >>>>> >>>>> When I try and mount the fs, it complains with: >>>>> >>>>> [ 388.479847] XFS (md2): Mounting V5 Filesystem >>>>> [ 388.494686] XFS (md2): metadata I/O error: block 0x15d6d39c0 >>>>> ("xlog_bread_noalign") error 5 numblks 8192 >>>>> [ 388.495013] XFS (md2): failed to find log head >>>>> [ 388.495018] XFS (md2): log mount/recovery failed: error -5 >>>>> [ 388.495090] XFS (md2): log mount failed >>>>> >>>> >>>> So a read I/O error from the kernel... >>>> >>>>> >>>>> This is where its not making any sense for me, If I try and run >>>>> "xfs_repair >>>>> /dev/md2" it fails with: >>>>> >>>>> Phase 1 - find and verify superblock... >>>>> - reporting progress in intervals of 15 minutes >>>>> Phase 2 - using internal log >>>>> - zero log... >>>>> xfs_repair: read failed: Input/output error >>>>> failed to find log head >>>>> zero_log: cannot find log head/tail (xlog_find_tail=-5) >>>>> >>>>> fatal error -- ERROR: The log head and/or tail cannot be >>>>> discovered. Attempt >>>>> to mount the >>>>> filesystem to replay the log or use the -L option to destroy the >>>>> log and >>>>> attempt a repair. >>>>> >>>> >>>> ... similar read error from xfsprogs... >>>> >>>>> >>>>> But if I run "xfs_repair -L /dev/md2" which gives: >>>>> >>>>> Phase 1 - find and verify superblock... >>>>> - reporting progress in intervals of 15 minutes >>>>> Phase 2 - using internal log >>>>> - zero log... >>>>> xfs_repair: read failed: Input/output error >>>>> failed to find log head >>>>> zero_log: cannot find log head/tail (xlog_find_tail=-5) >>>>> xfs_repair: libxfs_device_zero write failed: Input/output error >>>>> >>>> >>>> ... and it looks like it fails to write as well when trying to zero the >>>> log... >>>> >>>>> then try and re-run "xfs_repair /dev/md2" it starts traversing the >>>>> filesystem all the way to "Phase 7" then errors with: >>>>> >>>>> Phase 7 - verify and correct link counts... >>>>> - 14:36:55: verify and correct link counts - 33 of 33 >>>>> allocation >>>>> groups done >>>>> Maximum metadata LSN (64:2230592) is ahead of log (0:0). >>>>> Format log to cycle 67. >>>>> xfs_repair: libxfs_device_zero write failed: Input/output error >>>>> >>>>> >>>>> Yet at this point I can now mount the filesystem.. >>>>> >>>> >>>> ... and this is effectively a repeat of the write error as we try to >>>> format the log with a correct LSN based on the metadata LSN tracked by >>>> the repair process. Your kernel is old enough that runtime probably >>>> won't complain either way (note that 3.19 might be considered a fairly >>>> early kernel for using CRC support). Perhaps the first write attempt >>>> zeroed enough of the log before it failed that log recovery wasn't >>>> required, and thus these problematic I/Os were avoided. >>>> >>>> What's the history of this fs? Has it been working for some time, just >>>> recently formatted? What lead to the need for log recovery? What's the >>>> mdadm --detail info, member device size, total array size, xfs_info of >>>> the filesystem, etc..? >>>> >>>> Does xfs_repair run clean at this point? If so, does 'xfs_repair -L' >>>> still reproduce the write error (note that I'm assuming you have a >>>> clean >>>> log such that this command will not cause data loss). If so, an strace >>>> of the repair process might be interesting... >>>> >>>> Brian >>> >>> >>> The filesystem is about a year old as I had one of the Addonics >>> backplane >>> boards go bad and after the replacement all was good again.. until the >>> RocketRaid 2722 card and its obscure "Task File error" error message >>> came up >>> again. >>> >>> Everything up to this point had been working smoothly since end of >>> Sept 2015 >>> after the rebuild. All disks are 2TB in size, partitioned via >>> 'parted' with >>> 0% and 100% used for partition boundaries on each drive. Everything >>> had been >>> working wonderfully long before but the array was taken out due to some >>> issues I had with 3 hitachi drives that refused to work on the RR2722 >>> card/drivers. Long story. >>> >>> I've swapped out two drives in the array and no luck yet as it >>> doesn't seem >>> to be hardware failure related.. I've not had any signs of data >>> corruption, >>> just meta-data corruption/errors. >>> >>> If I remember correct, the format applied to the array was done under >>> 3.6.11 >>> kernel as >>> I'm still going through the same xfs_repair as above to get the array to >>> mount. It keeps failing after it tries to format the log to cycle 67. >>> >>> I'll see if I can get you an strace of things. >>> >> >> FWIW, I created an md array of similar geometry and ran through some >> fsstress/xfs_repair sequences just to see if there was anything >> obviously broken in the stack here, but I don't hit any issues. >> xfs_repair can zero the log and reformat it successfully. This is on a >> 4.6.0-rc1 kernel. >> >> So I think the big question here is why are these certain I/Os failing? >> This might ultimately require investigation at the md layer and/or >> further down to your storage controller driver, etc. Anyways, here's the >> first failed I/O from strace_2.1.txt: >> >> 02:34:36.309704 pread64(4, 0x7fe772ec0200, 2097152, 3001552175104) = >> -1 EIO (Input/output error) >> >> That's a 2MB read during phase 2, which is probably what leads to the >> "failed to find log head" error. The read offset is right around the >> middle of the array where the internal log resides. What's also >> interesting is that it is preceded by a bunch of other read I/Os that >> all appear to complete fine, but those are all 512b I/Os. >> >> What happens if you manually issue the read call that failed? E.g., >> umount the filesystem and run the following command directly against the >> array: >> >> xfs_io -dc "pread 3001552175104 2097152" /dev/md2 >> >> Brian > > It failed with the same error. I've attached the strace output for the > command. > > The array is fairly full so I'm wondering if something is out of > alignment somewhere thats causing this? > > /dev/md2 5858060288 5245630392 612429896 90% /mnt/md2 > > When I had the array plugged into another controller which isn't a > rocketraid card, it did complain about all the drives not being aligned > properly? Somehow it looks like sdk wasn't partitioned the same as the > rest, I'm wondering if thats screwing things up? > > GNU Parted 3.2 > Using /dev/sdi > Welcome to GNU Parted! Type 'help' to view a list of commands. > (parted) p > Model: ATA ST2000NC000-1CX1 (scsi) > Disk /dev/sdi: 2000GB > Sector size (logical/physical): 512B/512B > Partition Table: gpt > Disk Flags: > > Number Start End Size File system Name Flags > 1 1049kB 2000GB 2000GB > Number Start End Size File system Name Flags > 1 2048s 3907028991s 3907026944s > > > GNU Parted 3.2 > Using /dev/sdk > Welcome to GNU Parted! Type 'help' to view a list of commands. > (parted) p > Model: ATA ST2000DL001-9VT1 (scsi) > Disk /dev/sdk: 2000GB > Sector size (logical/physical): 512B/512B > Partition Table: msdos > Disk Flags: > > Number Start End Size Type File system Flags > 1 512B 2000GB 2000GB primary raid > Number Start End Size Type File system Flags > 1 1s 3907029167s 3907029167s primary raid > > > GNU Parted 3.2 > Using /dev/sdh > Welcome to GNU Parted! Type 'help' to view a list of commands. > (parted) p > Model: ATA ST2000DL001-9VT1 (scsi) > Disk /dev/sdh: 2000GB > Sector size (logical/physical): 512B/512B > Partition Table: gpt > Disk Flags: > > Number Start End Size File system Name Flags > 1 1049kB 2000GB 2000GB > Number Start End Size File system Name Flags > 1 2048s 3907028991s 3907026944s > > > GNU Parted 3.2 > Using /dev/sdm > Welcome to GNU Parted! Type 'help' to view a list of commands. > (parted) p > Model: ATA ST2000NC000-1CX1 (scsi) > Disk /dev/sdm: 2000GB > Sector size (logical/physical): 512B/512B > Partition Table: gpt > Disk Flags: > > Number Start End Size File system Name Flags > 1 1049kB 2000GB 2000GB > Number Start End Size File system Name Flags > 1 2048s 3907028991s 3907026944s > > > >> >>> >>> This all began when the RR2722 driver running under 3.18.15 >>> complained and >>> .. >>> >>> Mar 14 07:23:07 Bigmouth kernel: [7177248.090541] /dev/vmnet: port on >>> hub 0 >>> successfully opened >>> Mar 14 07:26:03 Bigmouth kernel: [7177424.552323] device eth1 left >>> promiscuous mode >>> Mar 14 07:26:03 Bigmouth kernel: [7177424.552786] bridge-eth1: disabled >>> promiscuous mode >>> Mar 14 20:10:20 Bigmouth kernel: [7223317.069464] rr272x_1x:Task file >>> error, >>> StatusReg=0x51, ErrReg=0x84, LBA[0-3]=0x747dc92f,LBA[4-7]=0x0. >>> Mar 14 20:10:20 Bigmouth kernel: [7223317.179811] sd 5:0:1:0: [sdg] >>> Mar 14 20:10:21 Bigmouth kernel: [7223317.690439] Result: >>> hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK >>> Mar 14 20:10:21 Bigmouth kernel: [7223317.700480] sd 5:0:1:0: [sdg] CDB: >>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211147] Write(10): 2a 00 74 >>> 7d c9 >>> 00 00 00 40 00 >>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211167] blk_update_request: >>> I/O >>> error, dev sdg, sector 1954400512 >>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211203] sd 5:0:3:0: [sdi] >>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211206] Result: >>> hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK >>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211209] sd 5:0:3:0: [sdi] CDB: >>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211211] Write(10): 2a 00 74 >>> 7d c9 >>> 00 00 00 40 00 >>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211223] blk_update_request: >>> I/O >>> error, dev sdi, sector 1954400512 >>> Mar 14 20:10:23 Bigmouth kernel: [7223319.957052] XFS (md2): metadata >>> I/O >>> error: block 0x15d6d4900 ("xlog_iodone") error 5 numblks 64 >>> Mar 14 20:10:23 Bigmouth kernel: [7223319.957064] XFS (md2): >>> xfs_do_force_shutdown(0x2) called from line 1181 of file >>> fs/xfs/xfs_log.c. >>> Return address = 0xffffffff812fdf96 >>> Mar 14 20:10:23 Bigmouth kernel: [7223319.957080] XFS (md2): Log I/O >>> Error >>> Detected. Shutting down filesystem >>> Mar 14 20:10:23 Bigmouth kernel: [7223319.957083] XFS (md2): Please >>> umount >>> the filesystem and rectify the problem(s) >>> Mar 14 20:10:23 Bigmouth kernel: [7223319.957093] XFS (md2): >>> xfs_log_force: >>> error -5 returned. >>> Mar 14 20:10:50 Bigmouth kernel: [7223347.087272] XFS (md2): >>> xfs_log_force: >>> error -5 returned. >>> Mar 14 20:11:20 Bigmouth kernel: [7223377.190469] XFS (md2): >>> xfs_log_force: >>> error -5 returned. >>> Mar 14 20:11:50 Bigmouth kernel: [7223407.293952] XFS (md2): >>> xfs_log_force: >>> error -5 returned. >>> Mar 14 20:12:20 Bigmouth kernel: [7223437.397444] XFS (md2): >>> xfs_log_force: >>> error -5 returned. >>> Mar 14 20:12:23 Bigmouth kernel: [7223439.791407] nfsd: last server has >>> exited, flushing export cache >>> Mar 14 20:12:50 Bigmouth kernel: [7223467.500928] XFS (md2): >>> xfs_log_force: >>> error -5 returned. >>> Mar 14 20:13:20 Bigmouth kernel: [7223497.604420] XFS (md2): >>> xfs_log_force: >>> error -5 returned. >>> Mar 14 20:13:50 Bigmouth kernel: [7223527.707899] XFS (md2): >>> xfs_log_force: >>> error -5 returned. >>> Mar 14 20:14:21 Bigmouth kernel: [7223557.811399] XFS (md2): >>> xfs_log_force: >>> error -5 returned. >>> Mar 14 20:14:51 Bigmouth kernel: [7223587.914932] XFS (md2): >>> xfs_log_force: >>> error -5 returned. >>> Mar 14 20:15:21 Bigmouth kernel: [7223618.018362] XFS (md2): >>> xfs_log_force: >>> error -5 returned. >>> Mar 14 20:15:51 Bigmouth kernel: [7223648.121779] XFS (md2): >>> xfs_log_force: >>> error -5 returned. >>> Mar 14 20:16:19 Bigmouth kernel: [7223676.401069] XFS (md2): >>> xfs_log_force: >>> error -5 returned. >>> Mar 14 20:16:21 Bigmouth kernel: [7223678.225334] XFS (md2): >>> xfs_log_force: >>> error -5 returned. >>> Mar 14 20:16:27 Bigmouth kernel: [7223684.541305] XFS (md2): >>> xfs_log_force: >>> error -5 returned. >>> Mar 14 20:16:27 Bigmouth kernel: [7223684.572176] XFS (md2): >>> xfs_log_force: >>> error -5 returned. >>> Mar 14 20:16:38 Bigmouth kernel: [7223694.918565] md2: unknown >>> partition >>> table >>> Mar 14 20:16:43 Bigmouth kernel: [7223700.425290] XFS (md2): Mounting V5 >>> Filesystem >>> Mar 14 20:16:43 Bigmouth kernel: [7223700.545669] XFS (md2): Starting >>> recovery (logdev: internal) >>> Mar 14 20:16:44 Bigmouth kernel: [7223701.874245] XFS (md2): Ending >>> recovery >>> (logdev: internal) >>> Mar 14 20:30:31 Bigmouth kernel: [7224529.528678] md2: unknown >>> partition >>> table >>> >>> >>> >>> /dev/md2: >>> Version : 1.2 >>> Creation Time : Tue Oct 13 22:21:27 2015 >>> Raid Level : raid5 >>> Array Size : 5860147200 (5588.67 GiB 6000.79 GB) >>> Used Dev Size : 1953382400 (1862.89 GiB 2000.26 GB) >>> Raid Devices : 4 >>> Total Devices : 4 >>> Persistence : Superblock is persistent >>> >>> Intent Bitmap : Internal >>> >>> Update Time : Tue Apr 12 01:19:43 2016 >>> State : clean >>> Active Devices : 4 >>> Working Devices : 4 >>> Failed Devices : 0 >>> Spare Devices : 0 >>> >>> Layout : left-symmetric >>> Chunk Size : 512K >>> >>> Name : Bigmouth:2 (local to host Bigmouth) >>> UUID : ed979276:3459155c:a32f63da:0c684042 >>> Events : 62846 >>> >>> Number Major Minor RaidDevice State >>> 5 8 193 0 active sync /dev/sdm1 >>> 6 8 129 1 active sync /dev/sdi1 >>> 2 8 177 2 active sync /dev/sdl1 >>> 4 8 113 3 active sync /dev/sdh1 >>> >>> >>> meta-data=/dev/md2 isize=512 agcount=33, >>> agsize=45782272 >>> blks >>> = sectsz=512 attr=2, projid32bit=1 >>> = crc=1 finobt=1 spinodes=0 >>> data = bsize=4096 blocks=1465036800, >>> imaxpct=5 >>> = sunit=128 swidth=384 blks >>> naming =version 2 bsize=4096 ascii-ci=0 ftype=1 >>> log =internal bsize=4096 blocks=521728, version=2 >>> = sectsz=512 sunit=8 blks, >>> lazy-count=1 >>> realtime =none extsz=4096 blocks=0, rtextents=0 >>> >>> >>>> >>>>> >>>>> Checking the drives with smartctl shows no errors nor does 'dmesg' >>>>> show any >>>>> hardware i/o or controller related errors... >>>>> >>>>> I've tried scrubbing the array and no bad sectors are found either.. >>>>> >>>>> I'm running kernel 3.19.8 with xfsprogs 4.5. >>>>> >>>>> Thanks, >>>>> Andrew >>>>> >>>>> _______________________________________________ >>>>> xfs mailing list >>>>> xfs@oss.sgi.com >>>>> http://oss.sgi.com/mailman/listinfo/xfs >>>> >> > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From willy@linux.intel.com Tue Apr 12 22:18:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BB5DF7CA0 for ; Tue, 12 Apr 2016 22:18:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 695B6304066 for ; Tue, 12 Apr 2016 20:18:05 -0700 (PDT) X-ASG-Debug-ID: 1460517484-04bdf0110542e650001-NocioJ Received: from mga04.intel.com ([192.55.52.120]) by cuda.sgi.com with ESMTP id 7zZtFlOmsjxgphO9 for ; Tue, 12 Apr 2016 20:18:04 -0700 (PDT) X-Barracuda-Envelope-From: willy@linux.intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.120 X-ASG-Whitelist: Client Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga104.fm.intel.com with ESMTP; 12 Apr 2016 20:18:03 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,477,1455004800"; d="scan'208";a="783760448" Received: from dbdavenp-mobl1.amr.corp.intel.com (HELO thog.int.wil.cx) ([10.252.134.16]) by orsmga003.jf.intel.com with SMTP; 12 Apr 2016 20:18:02 -0700 Received: by thog.int.wil.cx (Postfix, from userid 1000) id 35DF75FA1C; Tue, 12 Apr 2016 23:18:01 -0400 (EDT) Date: Tue, 12 Apr 2016 23:18:01 -0400 From: Matthew Wilcox To: Toshi Kani Cc: akpm@linux-foundation.org, dan.j.williams@intel.com, viro@zeniv.linux.org.uk, ross.zwisler@linux.intel.com, kirill.shutemov@linux.intel.com, david@fromorbit.com, jack@suse.cz, tytso@mit.edu, adilger.kernel@dilger.ca, linux-nvdimm@lists.01.org, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: [PATCH v2 1/5] dax: add dax_get_unmapped_area for pmd mappings Message-ID: <20160413031801.GO2781@linux.intel.com> X-ASG-Orig-Subj: Re: [PATCH v2 1/5] dax: add dax_get_unmapped_area for pmd mappings References: <1460493555-31611-1-git-send-email-toshi.kani@hpe.com> <1460493555-31611-2-git-send-email-toshi.kani@hpe.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460493555-31611-2-git-send-email-toshi.kani@hpe.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: UNKNOWN[192.55.52.120] X-Barracuda-Start-Time: 1460517484 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Apr 12, 2016 at 02:39:15PM -0600, Toshi Kani wrote: > + * When the target file is not a DAX file, @addr is specified, the > + * request is not suitable for pmd mappings, or mm->get_unmapped_area() > + * failed with extended @len, it simply calls the default handler, > + * mm->get_unmapped_area(), with the original arguments. I think you can lose this paragraph. It describes what the function does, not why it does it ... and we can see what the function does from reading the code. > +unsigned long dax_get_unmapped_area(struct file *filp, unsigned long addr, > + unsigned long len, unsigned long pgoff, unsigned long flags) > +{ > + unsigned long off, off_end, off_pmd, len_pmd, addr_pmd; > + > + if (IS_ENABLED(CONFIG_FS_DAX_PMD) && > + filp && !addr && IS_DAX(filp->f_mapping->host)) { > + off = pgoff << PAGE_SHIFT; > + off_end = off + len; > + off_pmd = round_up(off, PMD_SIZE); > + > + if ((off_end > off_pmd) && ((off_end - off_pmd) >= PMD_SIZE)) { > + len_pmd = len + PMD_SIZE; > + > + addr_pmd = current->mm->get_unmapped_area( > + filp, addr, len_pmd, pgoff, flags); > + > + if (!IS_ERR_VALUE(addr_pmd)) { > + addr_pmd += (off - addr_pmd) & (PMD_SIZE - 1); > + return addr_pmd; > + } > + } > + } > + > + return current->mm->get_unmapped_area(filp, addr, len, pgoff, flags); > +} I think this is one of those functions which is actually improved with gotos, purely to reduce the indentation level. unsigned long dax_get_unmapped_area(struct file *filp, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags) { unsigned long off, off_end, off_pmd, len_pmd, addr_pmd; if (!IS_ENABLED(CONFIG_FS_DAX_PMD) || !filp || addr || !IS_DAX(filp->f_mapping->host)) goto out; off = pgoff << PAGE_SHIFT; off_end = off + len; off_pmd = round_up(off, PMD_SIZE); if ((off_end <= off_pmd) || ((off_end - off_pmd) < PMD_SIZE)) goto out; len_pmd = len + PMD_SIZE; addr_pmd = current->mm->get_unmapped_area(filp, addr, len_pmd, pgoff, flags); if (!IS_ERR_VALUE(addr_pmd)) { addr_pmd += (off - addr_pmd) & (PMD_SIZE - 1); return addr_pmd; } out: return current->mm->get_unmapped_area(filp, addr, len, pgoff, flags); } Now ... back to the original version, some questions: > +unsigned long dax_get_unmapped_area(struct file *filp, unsigned long addr, > + unsigned long len, unsigned long pgoff, unsigned long flags) > +{ > + unsigned long off, off_end, off_pmd, len_pmd, addr_pmd; > + > + if (IS_ENABLED(CONFIG_FS_DAX_PMD) && > + filp && !addr && IS_DAX(filp->f_mapping->host)) { > + off = pgoff << PAGE_SHIFT; > + off_end = off + len; Can off + len wrap here, or did that get checked earlier? > + off_pmd = round_up(off, PMD_SIZE); > + > + if ((off_end > off_pmd) && ((off_end - off_pmd) >= PMD_SIZE)) { We're only going to look for a PMD-aligned mapping if the mapping is at least double PMD_SIZE? I don't understand that decision. Seems to me that if I ask to map offset 4MB, length 2MB, I should get a PMD-aligned mapping. Speaking of offset, we don't have any checks that offset is a multiple of PMD_SIZE. I know that theoretically we could map offset 1.5MB, length 3MB and see the first 0.5MB filled with small pages, then the next 2MB filled with one large page, and the tail filled with small pages, but I think we're better off only looking for PMD-alignment if the user asked for an aligned offset in the file. > + len_pmd = len + PMD_SIZE; > + > + addr_pmd = current->mm->get_unmapped_area( > + filp, addr, len_pmd, pgoff, flags); > + > + if (!IS_ERR_VALUE(addr_pmd)) { > + addr_pmd += (off - addr_pmd) & (PMD_SIZE - 1); ... then you wouldn't need this calculation ;-) > + return addr_pmd; > + } From neustoimabg@reklamatabg.eu Tue Apr 12 22:34:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.4 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY, NORMAL_HTTP_TO_IP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 85BB17CA0 for ; Tue, 12 Apr 2016 22:34:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 158E9AC003 for ; Tue, 12 Apr 2016 20:34:53 -0700 (PDT) X-ASG-Debug-ID: 1460518488-04bdf0110442edf0001-NocioJ Received: from reklamatabg.eu (reklamatabg.eu [37.157.191.235]) by cuda.sgi.com with ESMTP id 4sGlsPe87I7pskHJ for ; Tue, 12 Apr 2016 20:34:49 -0700 (PDT) X-Barracuda-Envelope-From: neustoimabg@reklamatabg.eu X-Barracuda-Apparent-Source-IP: 37.157.191.235 Received: from 37.157.184.243 by reklamatabg.eu (MDaemon PRO v9.6.1) with ESMTP id md50012627452.msg for ; Wed, 13 Apr 2016 06:38:01 +0300 To: xfs@oss.sgi.com Subject: =?UTF-8?B?0J3QsNC80LDQu9C10L3QuNC1INC90LAg0KHQtdC60YHQuCDQvdC+0YnQvdC40YbQuCDQuCDQldGA0L7RgtC40YfQvdC4INC80YDQtdC20LXRgdGC0Lgg0YbQtdC70L7QutGD0L/QvdC4INCx0L7QtNC40YLQsCE=?= Message-ID: <671fc2b56dd066cba29db983bcd319e7@37.157.184.243> X-ASG-Orig-Subj: =?UTF-8?B?0J3QsNC80LDQu9C10L3QuNC1INC90LAg0KHQtdC60YHQuCDQvdC+0YnQvdC40YbQuCDQuCDQldGA0L7RgtC40YfQvdC4INC80YDQtdC20LXRgdGC0Lgg0YbQtdC70L7QutGD0L/QvdC4INCx0L7QtNC40YLQsCE=?= Date: Wed, 13 Apr 2016 05:10:49 +0300 From: "=?UTF-8?B?0J3QldCj0KHQotCe0JjQnNCQLtCx0LM=?=" Reply-To: neustoimabg@reklamatabg.eu MIME-Version: 1.0 X-Mailer-LID: 280 List-Unsubscribe: X-Mailer-RecptId: 11689988 X-Mailer-SID: 384 X-Mailer-Sent-By: 1 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Authenticated-Sender: neustoimabg@reklamatabg.eu X-Lookup-Warning: EHLO lookup on 37.157.184.243 does not match 37.157.191.234 X-MDRemoteIP: 37.157.191.234 X-Return-Path: neustoimabg@reklamatabg.eu X-Envelope-From: neustoimabg@reklamatabg.eu X-MDaemon-Deliver-To: xfs@oss.sgi.com X-Barracuda-Connect: reklamatabg.eu[37.157.191.235] X-Barracuda-Start-Time: 1460518488 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.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, MIME_HTML_ONLY, NORMAL_HTTP_TO_IP X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28686 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.80 BSF_SC7_SA_HREF_WWW_MISMATCH BODY: Custom Phishing Mismatch 0.00 NORMAL_HTTP_TO_IP URI: Uses a dotted-decimal IP address in URL 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message

    www.NEUSTOIMA.bg - Порталът за дамÑко Еротично бельо и дрехи за вÑеки вкуÑ.


    ЛÑтото наближава а Ñ Ð½ÐµÐ³Ð¾ и ÑтраÑтите Ñе разгорещÑват.

    Затова ние Ви предлагаме тази Ñедмица Ð½Ð°Ð¼Ð°Ð»ÐµÐ½Ð¸Ðµ на вÑички Ð¡ÐµÐºÑи мрежеÑти целокупни бодита  и  Ð•ротични Ð½Ð¾Ñ‰Ð½Ð¸Ñ‡ÐºÐ¸ и роклички Ðамалението е валидно за вÑички поръчки направени до 16.04.2016 г. включително.

    Ðаправете Ñи еротичен подарък за Ð’Ð°Ñ Ð¸ за Вашата половинка!

    Разгледайте и другите ни горещи Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°Ð•Ñ€Ð¾Ñ‚Ð¸Ñ‡Ð½Ð¸ коÑтюми и комплекти , СекÑи корÑети и бюÑтиета , СекÑи бодита , СекÑи чорапи и чорапогащиСекÑи прашки и бразилиани Ð¸ още много други артикули. 
      
    Ð’Ñички Ñтоки при Ð½Ð°Ñ Ñа налични ÑÑŠÑ Ñрок за доÑтавка до 1-2 работни Ð´Ð½Ð¸!

       

    Побързайте, количеÑтвата Ñа ограничени.

     

    www.neustoima.bg Ð¡ÐµÐºÑи бельо и дрехи за показване!

      
     
    СъглаÑно Закона за Електронната Ð¢ÑŠÑ€Ð³Ð¾Ð²Ð¸Ñ Ð’Ð¸ информираме, че това може да е непоиÑкано търговÑко Ñъобщение.
    Вие може да го приемете или отхвърлите.
    Ðие може да Ñме получили Ð²Ð°ÑˆÐ¸Ñ Ð¸Ð¼ÐµÐ¹Ð» от ВаÑ, от Ваш партньор или от публичното проÑтранÑтво.  

    Ðко не желаете да получавате повече Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ "Neustoima.bg", молѠОТПИШЕТЕ СЕ ОТ ТУК
    и ще преуÑтановим изпращането на търговÑки ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ ÐºÑŠÐ¼ ВашиÑÑ‚ имейл адреÑ.

    Ðко Ñме Ви обезпокоили, Ð¼Ð¾Ð»Ñ Ð´Ð° ни извините! 

    From darrick.wong@oracle.com Tue Apr 12 23:02:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A97ED7CA1 for ; Tue, 12 Apr 2016 23:02:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 168DF8F8039 for ; Tue, 12 Apr 2016 21:02:06 -0700 (PDT) X-ASG-Debug-ID: 1460520123-04bdf0110442fef0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id cwCm2Fxx6BmjwwLS (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 21:02:04 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u3D41cq3004183 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 13 Apr 2016 04:01:39 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u3D41cMX016741 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 13 Apr 2016 04:01:38 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u3D41b5s011457; Wed, 13 Apr 2016 04:01:38 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 12 Apr 2016 21:01:37 -0700 Subject: [PATCH 2/3] block: require write_same and discard requests align to logical block size From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 2/3] block: require write_same and discard requests align to logical block size To: darrick.wong@oracle.com Cc: axboe@kernel.dk, hch@infradead.org, tytso@mit.edu, martin.petersen@oracle.com, snitzer@redhat.com, linux-api@vger.kernel.org, bfoster@redhat.com, xfs@oss.sgi.com, linux-block@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, Christoph Hellwig Date: Tue, 12 Apr 2016 21:01:35 -0700 Message-ID: <20160413040135.10562.74550.stgit@birch.djwong.org> In-Reply-To: <20160413040121.10562.98998.stgit@birch.djwong.org> References: <20160413040121.10562.98998.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1460520123 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28687 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 Make sure that the offset and length arguments that we're using to construct WRITE SAME and DISCARD requests are actually aligned to the logical block size. Failure to do this causes other errors in other parts of the block layer or the SCSI layer because disks don't support partial logical block writes. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- block/blk-lib.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/block/blk-lib.c b/block/blk-lib.c index 9ebf653..9dca6bb 100644 --- a/block/blk-lib.c +++ b/block/blk-lib.c @@ -49,6 +49,7 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, struct bio *bio; int ret = 0; struct blk_plug plug; + sector_t bs_mask; if (!q) return -ENXIO; @@ -56,6 +57,10 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, if (!blk_queue_discard(q)) return -EOPNOTSUPP; + bs_mask = (bdev_logical_block_size(bdev) >> 9) - 1; + if ((sector | nr_sects) & bs_mask) + return -EINVAL; + /* Zero-sector (unknown) and one-sector granularities are the same. */ granularity = max(q->limits.discard_granularity >> 9, 1U); alignment = (bdev_discard_alignment(bdev) >> 9) % granularity; @@ -148,6 +153,7 @@ int blkdev_issue_write_same(struct block_device *bdev, sector_t sector, DECLARE_COMPLETION_ONSTACK(wait); struct request_queue *q = bdev_get_queue(bdev); unsigned int max_write_same_sectors; + sector_t bs_mask; struct bio_batch bb; struct bio *bio; int ret = 0; @@ -155,6 +161,10 @@ int blkdev_issue_write_same(struct block_device *bdev, sector_t sector, if (!q) return -ENXIO; + bs_mask = (bdev_logical_block_size(bdev) >> 9) - 1; + if ((sector | nr_sects) & bs_mask) + return -EINVAL; + /* Ensure that max_write_same_sectors doesn't overflow bi_size */ max_write_same_sectors = UINT_MAX >> 9; @@ -218,9 +228,14 @@ static int __blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, int ret; struct bio *bio; struct bio_batch bb; + sector_t bs_mask; unsigned int sz; DECLARE_COMPLETION_ONSTACK(wait); + bs_mask = (bdev_logical_block_size(bdev) >> 9) - 1; + if ((sector | nr_sects) & bs_mask) + return -EINVAL; + atomic_set(&bb.done, 1); bb.error = 0; bb.wait = &wait; From darrick.wong@oracle.com Tue Apr 12 23:02:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A70947CA0 for ; Tue, 12 Apr 2016 23:02:09 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E494830405F for ; Tue, 12 Apr 2016 21:02:05 -0700 (PDT) X-ASG-Debug-ID: 1460520121-04cbb02e1c11a640001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id sy1Ml978ZFOZaui9 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 21:02:01 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u3D41TbC004121 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 13 Apr 2016 04:01:30 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u3D41TPv025552 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 13 Apr 2016 04:01:29 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u3D41NNn031010; Wed, 13 Apr 2016 04:01:26 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 12 Apr 2016 21:01:23 -0700 Subject: [RFC DONOTMERGE v8 0/3] fallocate for block devices From: "Darrick J. Wong" X-ASG-Orig-Subj: [RFC DONOTMERGE v8 0/3] fallocate for block devices To: darrick.wong@oracle.com Cc: axboe@kernel.dk, hch@infradead.org, tytso@mit.edu, martin.petersen@oracle.com, snitzer@redhat.com, linux-api@vger.kernel.org, bfoster@redhat.com, xfs@oss.sgi.com, linux-block@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org Date: Tue, 12 Apr 2016 21:01:21 -0700 Message-ID: <20160413040121.10562.98998.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1460520121 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28687 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Hi, This is a redesign of the patch series that fixes various interface problems with the existing "zero out this part of a block device" code. BLKZEROOUT2 is gone. The first patch is still a fix to the existing BLKZEROOUT ioctl to invalidate the page cache if the zeroing command to the underlying device succeeds. The second patch changes the internal block device functions to reject attempts to discard or zeroout that are not aligned to the logical block size. Previously, we only checked that the start/len parameters were 512-byte aligned, which caused kernel BUG_ONs for unaligned IOs to 4k-LBA devices. The third patch creates an fallocate handler for block devices, wires up the FALLOC_FL_PUNCH_HOLE flag to zeroing-discard, and connects FALLOC_FL_ZERO_RANGE to write-same so that we can have a consistent fallocate interface between files and block devices. It also allows the combination of PUNCH_HOLE and NO_HIDE_STALE to invoke non-zeroing discard. The point of this patchset is not to go upstream, but is to be a starting point for a discussion at LSF. Don't merge this! Foremost in my mind is whether or not we require the offset/len parameters to be aligned to logical block size or minimum_io_size; what error code to return for unaligned values; and whether or not we should allow byte ranges and zero blocks with the page cache (like file fallocate does now). It'll also be a jumping off point for Brian Foster and Mike Snitzer's patches to allow bdev clients to ask that space be allocated to a range, and to plumb that out to userspace. Test cases for the new block device fallocate have been submitted to the xfstests list as generic/70[5-7], though the latest versions of those test cases will be attached to this patchset for convenience. Comments and questions are, as always, welcome. Patches are against 4.6-rc3. v7: Strengthen parameter checking and fix various code issues pointed out by Linus and Christoph. v8: More code rearranging, rebase to 4.6-rc3, and dig into alignment issues. --D From darrick.wong@oracle.com Tue Apr 12 23:02:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 530927CA2 for ; Tue, 12 Apr 2016 23:02:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1ACCA30405F for ; Tue, 12 Apr 2016 21:02:12 -0700 (PDT) X-ASG-Debug-ID: 1460520127-04cbb02e1c11a650001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id UABVoGsTuISsT6nh (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 21:02:10 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u3D41YqP028799 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 13 Apr 2016 04:01:34 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u3D41Xa4009519 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 13 Apr 2016 04:01:34 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u3D41Uvh031081; Wed, 13 Apr 2016 04:01:32 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 12 Apr 2016 21:01:30 -0700 Subject: [PATCH 1/3] block: invalidate the page cache when issuing BLKZEROOUT. From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 1/3] block: invalidate the page cache when issuing BLKZEROOUT. To: darrick.wong@oracle.com Cc: axboe@kernel.dk, hch@infradead.org, tytso@mit.edu, martin.petersen@oracle.com, snitzer@redhat.com, linux-api@vger.kernel.org, bfoster@redhat.com, xfs@oss.sgi.com, linux-block@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, Christoph Hellwig Date: Tue, 12 Apr 2016 21:01:28 -0700 Message-ID: <20160413040128.10562.70791.stgit@birch.djwong.org> In-Reply-To: <20160413040121.10562.98998.stgit@birch.djwong.org> References: <20160413040121.10562.98998.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1460520129 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28687 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 Invalidate the page cache (as a regular O_DIRECT write would do) to avoid returning stale cache contents at a later time. v5: Refactor the 4.4 refactoring of the ioctl code into separate functions. Split the page invalidation and the new ioctl into separate patches. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- block/ioctl.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/block/ioctl.c b/block/ioctl.c index 4ff1f92..52b60b2 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -226,7 +226,9 @@ static int blk_ioctl_zeroout(struct block_device *bdev, fmode_t mode, unsigned long arg) { uint64_t range[2]; - uint64_t start, len; + struct address_space *mapping; + uint64_t start, end, len; + int ret; if (!(mode & FMODE_WRITE)) return -EBADF; @@ -236,18 +238,33 @@ static int blk_ioctl_zeroout(struct block_device *bdev, fmode_t mode, start = range[0]; len = range[1]; + end = start + len - 1; if (start & 511) return -EINVAL; if (len & 511) return -EINVAL; - start >>= 9; - len >>= 9; - - if (start + len > (i_size_read(bdev->bd_inode) >> 9)) + if (end >= (uint64_t)i_size_read(bdev->bd_inode)) + return -EINVAL; + if (end < start) return -EINVAL; - return blkdev_issue_zeroout(bdev, start, len, GFP_KERNEL, false); + /* Invalidate the page cache, including dirty pages */ + mapping = bdev->bd_inode->i_mapping; + truncate_inode_pages_range(mapping, start, end); + + ret = blkdev_issue_zeroout(bdev, start >> 9, len >> 9, GFP_KERNEL, + false); + if (ret) + return ret; + + /* + * Invalidate again; if someone wandered in and dirtied a page, + * the caller will be given -EBUSY. + */ + return invalidate_inode_pages2_range(mapping, + start >> PAGE_SHIFT, + end >> PAGE_SHIFT); } static int put_ushort(unsigned long arg, unsigned short val) From darrick.wong@oracle.com Tue Apr 12 23:02:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E21757CA2 for ; Tue, 12 Apr 2016 23:02:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 570198F8037 for ; Tue, 12 Apr 2016 21:02:13 -0700 (PDT) X-ASG-Debug-ID: 1460520130-04cb6c246042fad0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id SSs2U9VR7Ln5PfZw (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 21:02:11 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u3D41lXN004256 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 13 Apr 2016 04:01:47 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u3D41kV3017222 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 13 Apr 2016 04:01:47 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u3D41kbq011535; Wed, 13 Apr 2016 04:01:46 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 12 Apr 2016 21:01:46 -0700 Subject: [PATCH 3/3] block: implement (some of) fallocate for block devices From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 3/3] block: implement (some of) fallocate for block devices To: darrick.wong@oracle.com Cc: axboe@kernel.dk, hch@infradead.org, tytso@mit.edu, martin.petersen@oracle.com, snitzer@redhat.com, linux-api@vger.kernel.org, bfoster@redhat.com, xfs@oss.sgi.com, linux-block@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org Date: Tue, 12 Apr 2016 21:01:42 -0700 Message-ID: <20160413040142.10562.42269.stgit@birch.djwong.org> In-Reply-To: <20160413040121.10562.98998.stgit@birch.djwong.org> References: <20160413040121.10562.98998.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1460520131 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28687 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 After much discussion, it seems that the fallocate feature flag FALLOC_FL_ZERO_RANGE maps nicely to SCSI WRITE SAME; and the feature FALLOC_FL_PUNCH_HOLE maps nicely to the devices that have been whitelisted for zeroing SCSI UNMAP. Punch still requires that FALLOC_FL_KEEP_SIZE is set. A length that goes past the end of the device will be clamped to the device size if KEEP_SIZE is set; or will return -EINVAL if not. Both start and length must be aligned to the device's logical block size. Since the semantics of fallocate are fairly well established already, wire up the two pieces. The other fallocate variants (collapse range, insert range, and allocate blocks) are not supported. v2: Incorporate feedback from Christoph & Linus. Tentatively add a requirement that the fallocate arguments be aligned to logical block size, and put in a few XXX comments ahead of LSF discussion. Signed-off-by: Darrick J. Wong --- fs/block_dev.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ fs/open.c | 3 +- 2 files changed, 89 insertions(+), 1 deletion(-) diff --git a/fs/block_dev.c b/fs/block_dev.c index 20a2c02..5c8eb0c 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include "internal.h" @@ -1790,6 +1791,91 @@ static int blkdev_mmap(struct file *file, struct vm_area_struct *vma) #define blkdev_mmap generic_file_mmap #endif +#define BLKDEV_FALLOC_FL_SUPPORTED \ + (FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | \ + FALLOC_FL_ZERO_RANGE | FALLOC_FL_NO_HIDE_STALE) + +static long blkdev_fallocate(struct file *file, int mode, loff_t start, + loff_t len) +{ + struct block_device *bdev = I_BDEV(bdev_file_inode(file)); + struct request_queue *q = bdev_get_queue(bdev); + struct address_space *mapping; + loff_t end = start + len - 1; + loff_t isize; + int error; + + /* Fail if we don't recognize the flags. */ + if (mode & ~BLKDEV_FALLOC_FL_SUPPORTED) + return -EOPNOTSUPP; + + /* Don't go off the end of the device. */ + isize = i_size_read(bdev->bd_inode); + if (start >= isize) + return -EINVAL; + if (end > isize) { + if (mode & FALLOC_FL_KEEP_SIZE) { + len = isize - start; + end = start + len - 1; + } else + return -EINVAL; + } + + /* + * Don't allow IO that isn't aligned to logical block size. + * XXX: Should zero and punch write zeroes through the page cache + * if start or end aren't lbs aligned? + * XXX: What about thinp which prefers io_min alignment? + */ + if ((start | len) & bdev_logical_block_size(bdev) - 1) + return -EINVAL; + + /* Invalidate the page cache, including dirty pages. */ + mapping = bdev->bd_inode->i_mapping; + truncate_inode_pages_range(mapping, start, end); + + switch (mode) { + case FALLOC_FL_ZERO_RANGE: + case FALLOC_FL_ZERO_RANGE | FALLOC_FL_KEEP_SIZE: + error = blkdev_issue_zeroout(bdev, start >> 9, len >> 9, + GFP_KERNEL, false); + if (error) + return error; + break; + case FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE: + /* Only punch if the device can do zeroing discard. */ + if (!blk_queue_discard(q) || !q->limits.discard_zeroes_data) + return -EOPNOTSUPP; + error = blkdev_issue_discard(bdev, start >> 9, len >> 9, + GFP_KERNEL, 0); + if (error) + return error; + break; + case FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE | FALLOC_FL_NO_HIDE_STALE: + /* + * XXX: a well known search engine vendor interprets this + * flag (in other circumstances) to mean "I don't care if + * we can read stale contents later". Is it appropriate + * to wire this up to the non-zeroing discard? + */ + error = blkdev_issue_discard(bdev, start >> 9, len >> 9, + GFP_KERNEL, 0); + if (error) + return error; + break; + default: + return -EOPNOTSUPP; + } + + /* + * Invalidate again; if someone wandered in and dirtied a page, + * the caller will be given -EBUSY; + */ + return invalidate_inode_pages2_range(mapping, + start >> PAGE_SHIFT, + end >> PAGE_SHIFT); +} + const struct file_operations def_blk_fops = { .open = blkdev_open, .release = blkdev_close, @@ -1804,6 +1890,7 @@ const struct file_operations def_blk_fops = { #endif .splice_read = generic_file_splice_read, .splice_write = iter_file_splice_write, + .fallocate = blkdev_fallocate, }; int ioctl_by_bdev(struct block_device *bdev, unsigned cmd, unsigned long arg) diff --git a/fs/open.c b/fs/open.c index 17cb6b1..f9ebe32 100644 --- a/fs/open.c +++ b/fs/open.c @@ -289,7 +289,8 @@ int vfs_fallocate(struct file *file, int mode, loff_t offset, loff_t len) * Let individual file system decide if it supports preallocation * for directories or not. */ - if (!S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode)) + if (!S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode) && + !S_ISBLK(inode->i_mode)) return -ENODEV; /* Check for wrap through zero too */ From shyam@zadarastorage.com Tue Apr 12 23:02:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 047317CA0 for ; Tue, 12 Apr 2016 23:02:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 40698AC005 for ; Tue, 12 Apr 2016 21:02:30 -0700 (PDT) X-ASG-Debug-ID: 1460520143-04cbb02e1c11a680001-NocioJ Received: from mail-wm0-f52.google.com (mail-wm0-f52.google.com [74.125.82.52]) by cuda.sgi.com with ESMTP id E5glkMEFVbgrcHPr (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 12 Apr 2016 21:02:24 -0700 (PDT) X-Barracuda-Envelope-From: shyam@zadarastorage.com X-Barracuda-Apparent-Source-IP: 74.125.82.52 Received: by mail-wm0-f52.google.com with SMTP id u206so53614866wme.1 for ; Tue, 12 Apr 2016 21:02:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=from:references:in-reply-to:mime-version:thread-index:date :message-id:subject:to:cc; bh=4tQwv2LCOfzg+XuM1tEeuKYbsvJg7g4PV6gQhqt+Srs=; b=qUziRGNdwg9wo0cPsejx132rLimltD/uBN+CWaP9kMw/iFlezLjOCMpjJx8T7YDR33 J0dIyJcqq7iGM5/u7Xn5sFvMtur4ozatJ+QsJSfyPrVF4esPnvuDJBTsEf6wMR4Czlhi koC8/81a3kKDAJSNRhQg2LrwWkaKFV059C+DbL7F+O40AP/y2wSRvUz6tu6/Zpy2Pke0 kvbsH5jat1smQB2HpRvI3HLFplQUYEJk9HbfaIFinbA0bPTOHd/0ZscH6jkeJFqlA9DU XrV4XmmyM8akfIAYMOesHrADn9fRsHGPj3dyoihPfHuizD7qPw4+FP6vyqMXmCxlGU+I jMHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:references:in-reply-to:mime-version :thread-index:date:message-id:subject:to:cc; bh=4tQwv2LCOfzg+XuM1tEeuKYbsvJg7g4PV6gQhqt+Srs=; b=a4EYBHzln/U/eIy8aQfORYqDIUZd1JNRBG9J/QKqfxdGE1GFC5gDydNGXOR/sjLesL tneyYYkxuMzbC+f9rRXVOO4GG0MB1N+dBPTPqv8Yq8aG71z2Kk6y4F/BFRQtOUo9MYk7 KqRMwxsIppnS+At2ZWO2x7OaUldLUuot5F93uoGoQZ0hOzGfXTvEHKozgD/T8GH/8Rl2 z8m847suVDB8TgDcO5INUyy29YoiNuCXl54sCQq7ajlgv2RpNBOEV2sgEriXHfNQVzVw zNw9UpvkFU+Vr6Jwu3EzUmKbw1KyFJFuWcOZmJVAJYkc7HWmiVxwPDoQCHXeIN6SK3Ep 273Q== X-Gm-Message-State: AOPr4FVIM2XNFhltQoAnwrJ73YKX3Ovb0FWPSeV6c94lWaiBceuXQTsNeIJzn4gef3LdZORCU1sVPKQKP1hnRg== X-Received: by 10.28.158.202 with SMTP id h193mr7565499wme.35.1460520143487; Tue, 12 Apr 2016 21:02:23 -0700 (PDT) From: Shyam Kaushik References: <23e35813cb097c7b15686852500cbf97@mail.gmail.com> <20160412082759.GI9088@dastard> <5e9c99552ae829dce9eb574d72085323@mail.gmail.com> <20160412211619.GK567@dastard> In-Reply-To: <20160412211619.GK567@dastard> MIME-Version: 1.0 X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AdGVAJAQ7GnG9mKQR2WkASXG2AnF9wAOIsAw Date: Wed, 13 Apr 2016 09:32:23 +0530 Message-ID: <490d96538225fdaac2d1221081d2e5e4@mail.gmail.com> Subject: RE: [PATCH] xfs: Abort intent log item in xfs_iflush() upon error to get buf To: Dave Chinner X-ASG-Orig-Subj: RE: [PATCH] xfs: Abort intent log item in xfs_iflush() upon error to get buf Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wm0-f52.google.com[74.125.82.52] X-Barracuda-Start-Time: 1460520144 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28687 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Thanks Dave. You are right that xfs_trans_read_buf_map() is initializing it but xfs_imap_to_bp() being in the middle spoils it by passing its own local bp. --Shyam -----Original Message----- From: Dave Chinner [mailto:david@fromorbit.com] Sent: 13 April 2016 02:46 To: Shyam Kaushik Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Abort intent log item in xfs_iflush() upon error to get buf On Tue, Apr 12, 2016 at 11:10:13PM +0530, Shyam Kaushik wrote: > Hi Dave, > > Your patch needs a minor correction. > > At start of xfs_iflush() either we must initialize "bp = NULL" or else > xfs_imap_to_bp() when it hits an error need to set "*bpp = NULL". > Otherwise with your patch we are having an uninitialized bp that > corrupt_out is trying to do xfs_buf_relse(). Ok, I'll check that - I thought that xfs_trans_buf_read_map() was initialising it to zero appropriately, but obviously I missed something. Thanks for testing! Cheers, Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Tue Apr 12 23:04:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 7EB9D7CA1 for ; Tue, 12 Apr 2016 23:04:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id DA4DDAC003 for ; Tue, 12 Apr 2016 21:04:58 -0700 (PDT) X-ASG-Debug-ID: 1460520294-04bdf01103430080001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 4FPc83W3UoAAqf1E (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 12 Apr 2016 21:04:55 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u3D44OH5030938 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 13 Apr 2016 04:04:25 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u3D44OM3017678 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 13 Apr 2016 04:04:24 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u3D44NmK028380; Wed, 13 Apr 2016 04:04:24 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 12 Apr 2016 21:04:23 -0700 Date: Tue, 12 Apr 2016 21:04:21 -0700 From: "Darrick J. Wong" To: darrick.wong@oracle.com Cc: axboe@kernel.dk, hch@infradead.org, tytso@mit.edu, martin.petersen@oracle.com, snitzer@redhat.com, linux-api@vger.kernel.org, bfoster@redhat.com, xfs@oss.sgi.com, linux-block@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, fstests@vger.kernel.org Subject: [PATCH 4/3] block: test fallocate for block devices Message-ID: <20160413040421.GB25280@birch.djwong.org> X-ASG-Orig-Subj: [PATCH 4/3] block: test fallocate for block devices References: <20160413040121.10562.98998.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160413040121.10562.98998.stgit@birch.djwong.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1460520295 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28687 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Now that we're wiring up fallocate's PUNCH_HOLE and ZERO_RANGE features for block devices, add some tests to make sure they work correctly. v2: Update tests to reflect EOD clamping suggested by Linus. Note that the VFS fallocate makes us play some weird games wrt MAX_LFS_FILESIZE. Signed-off-by: Darrick J. Wong --- common/scsi_debug | 6 ++ tests/generic/705 | 89 ++++++++++++++++++++++++++++++++++ tests/generic/705.out | 11 ++++ tests/generic/706 | 86 ++++++++++++++++++++++++++++++++ tests/generic/706.out | 10 ++++ tests/generic/707 | 130 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/707.out | 32 ++++++++++++ tests/generic/group | 3 + 8 files changed, 366 insertions(+), 1 deletion(-) create mode 100755 tests/generic/705 create mode 100644 tests/generic/705.out create mode 100755 tests/generic/706 create mode 100644 tests/generic/706.out create mode 100755 tests/generic/707 create mode 100644 tests/generic/707.out diff --git a/common/scsi_debug b/common/scsi_debug index eb08126..74c3802 100644 --- a/common/scsi_debug +++ b/common/scsi_debug @@ -40,13 +40,17 @@ _get_scsi_debug_dev() logical=${2-512} unaligned=${3-0} size=${4-128} + test -n "$4" && shift + test -n "$3" && shift + test -n "$2" && shift + test -n "$1" && shift phys_exp=0 while [ $logical -lt $physical ]; do let physical=physical/2 let phys_exp=phys_exp+1 done - opts="sector_size=$logical physblk_exp=$phys_exp lowest_aligned=$unaligned dev_size_mb=$size" + opts="sector_size=$logical physblk_exp=$phys_exp lowest_aligned=$unaligned dev_size_mb=$size $@" echo "scsi_debug options $opts" >> $seqres.full modprobe scsi_debug $opts [ $? -eq 0 ] || _fail "scsi_debug modprobe failed" diff --git a/tests/generic/705 b/tests/generic/705 new file mode 100755 index 0000000..f30f2c3 --- /dev/null +++ b/tests/generic/705 @@ -0,0 +1,89 @@ +#! /bin/bash +# FS QA Test No. 705 +# +# Test fallocate(ZERO_RANGE) on a block device, which should be able to +# WRITE SAME (or equivalent) the range. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 7 15 + +_cleanup() +{ + cd / + rm -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/scsi_debug + +# real QA test starts here +_supported_os Linux +_require_scsi_debug +_require_xfs_io_command "fzero" + +echo "Create and format" +dev=$(_get_scsi_debug_dev 512 512 0 4 "lbpws=1 lbpws10=1") +_pwrite_byte 0x62 0 4m $dev >> $seqres.full + +echo "Zero range" +$XFS_IO_PROG -c "fzero -k 512k 1m" $dev + +echo "Zero range without keep_size" +$XFS_IO_PROG -c "fzero 384k 64k" $dev + +echo "Zero range past EOD" +$XFS_IO_PROG -c "fzero -k 3m 4m" $dev + +echo "Check contents" +md5sum $dev | sed -e "s|$dev|SCSI_DEBUG_DEV|g" + +echo "Zero range to MAX_LFS_FILESIZE" +# zod = MAX_LFS_FILESIZE +case "$(getconf LONG_BIT)" in +"32") + zod=$(( ($(getconf PAGE_SIZE) << ($(getconf LONG_BIT) - 1) ) - 1)) + ;; +"64") + zod=9223372036854775807 + ;; +*) + _fail "sizeof(long) == $(getconf LONG_BIT)?" + ;; +esac +$XFS_IO_PROG -c "fzero -k 0 $zod" $dev + +echo "Check contents" +md5sum $dev | sed -e "s|$dev|SCSI_DEBUG_DEV|g" + +echo "Destroy device" +_put_scsi_debug_dev + +# success, all done +status=0 +exit diff --git a/tests/generic/705.out b/tests/generic/705.out new file mode 100644 index 0000000..86d0317 --- /dev/null +++ b/tests/generic/705.out @@ -0,0 +1,11 @@ +QA output created by 705 +Create and format +Zero range +Zero range without keep_size +Zero range past EOD +Check contents +f0cb9070c098aa347f664bead3a219d9 SCSI_DEBUG_DEV +Zero range to MAX_LFS_FILESIZE +Check contents +b5cfa9d6c8febd618f91ac2843d50a1c SCSI_DEBUG_DEV +Destroy device diff --git a/tests/generic/706 b/tests/generic/706 new file mode 100755 index 0000000..dd502e2 --- /dev/null +++ b/tests/generic/706 @@ -0,0 +1,86 @@ +#! /bin/bash +# FS QA Test No. 706 +# +# Test fallocate(PUNCH_HOLE) on a block device, which should be able to +# zero-TRIM (or equivalent) the range. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 7 15 + +_cleanup() +{ + cd / + rm -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/scsi_debug + +# real QA test starts here +_supported_os Linux +_require_scsi_debug +_require_xfs_io_command "fpunch" + +echo "Create and format" +dev=$(_get_scsi_debug_dev 512 512 0 4 "lbpws=1 lbpws10=1") +_pwrite_byte 0x62 0 4m $dev >> $seqres.full + +echo "Zero punch" +$XFS_IO_PROG -c "fpunch 512k 1m" $dev + +echo "Punch range past EOD" +$XFS_IO_PROG -c "fpunch 3m 4m" $dev + +echo "Check contents" +md5sum $dev | sed -e "s|$dev|SCSI_DEBUG_DEV|g" + +echo "Punch to MAX_LFS_FILESIZE" +# zod = MAX_LFS_FILESIZE +case "$(getconf LONG_BIT)" in +"32") + zod=$(( ($(getconf PAGE_SIZE) << ($(getconf LONG_BIT) - 1) ) - 1)) + ;; +"64") + zod=9223372036854775807 + ;; +*) + _fail "sizeof(long) == $(getconf LONG_BIT)?" + ;; +esac +$XFS_IO_PROG -c "fpunch 0 $zod" $dev + +echo "Check contents" +md5sum $dev | sed -e "s|$dev|SCSI_DEBUG_DEV|g" + +echo "Destroy device" +_put_scsi_debug_dev + +# success, all done +status=0 +exit diff --git a/tests/generic/706.out b/tests/generic/706.out new file mode 100644 index 0000000..de8de0c --- /dev/null +++ b/tests/generic/706.out @@ -0,0 +1,10 @@ +QA output created by 706 +Create and format +Zero punch +Punch range past EOD +Check contents +8c6a3fd51601141b56eaebbab3746156 SCSI_DEBUG_DEV +Punch to MAX_LFS_FILESIZE +Check contents +b5cfa9d6c8febd618f91ac2843d50a1c SCSI_DEBUG_DEV +Destroy device diff --git a/tests/generic/707 b/tests/generic/707 new file mode 100755 index 0000000..229b152 --- /dev/null +++ b/tests/generic/707 @@ -0,0 +1,130 @@ +#! /bin/bash +# FS QA Test No. 707 +# +# Test the unsupported fallocate flags on a block device. No collapse +# or insert range, no regular fallocate, no forgetting keep-space on +# zero range, no punching past EOD, no requests that aren't aligned +# with the logicalsector size, and make sure the fallbacks work for +# devices that don't support write_same or discard. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 7 15 + +_cleanup() +{ + cd / + rm -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/scsi_debug + +# real QA test starts here +_supported_os Linux +_require_scsi_debug +_require_xfs_io_command "falloc" +_require_xfs_io_command "finsert" +_require_xfs_io_command "fcollapse" +_require_xfs_io_command "fzero" +_require_xfs_io_command "fpunch" + + +echo "Create and format" +dev=$(_get_scsi_debug_dev 4096 4096 0 4 "lbpws=1 lbpws10=1") +_pwrite_byte 0x62 0 4m $dev >> $seqres.full +$XFS_IO_PROG -c "fsync" $dev + +echo "Regular fallocate" +$XFS_IO_PROG -c "falloc 64k 64k" $dev + +echo "Insert range" +$XFS_IO_PROG -c "finsert 128k 64k" $dev + +echo "Collapse range" +$XFS_IO_PROG -c "fcollapse 256k 64k" $dev + +echo "Unaligned zero range" +$XFS_IO_PROG -c "fzero -k 512 512" $dev + +echo "Unaligned punch" +$XFS_IO_PROG -c "fpunch 512 512" $dev + +echo "Zero range past MAX_LFS_FILESIZE keep size" +# zod = MAX_LFS_FILESIZE +case "$(getconf LONG_BIT)" in +"32") + zod=$(( ($(getconf PAGE_SIZE) << ($(getconf LONG_BIT) - 1) ) - 1)) + ;; +"64") + zod=9223372036854775807 + ;; +*) + _fail "sizeof(long) == $(getconf LONG_BIT)?" + ;; +esac +$XFS_IO_PROG -c "fzero -k 512k $zod" $dev + +echo "Zero range past MAX_LFS_FILESIZE" +$XFS_IO_PROG -c "fzero 512k $zod" $dev + +echo "Zero range to MAX_LFS_FILESIZE fail w/o keepsize" +$XFS_IO_PROG -c "fzero 0 $zod" $dev + +echo "Zero range starts past EOD" +$XFS_IO_PROG -c "fzero -k 900m 1m" $dev + +echo "Punch starts past EOD" +$XFS_IO_PROG -c "fpunch 900m 1m" $dev + +echo "Check contents" +md5sum $dev | sed -e "s|$dev|SCSI_DEBUG_DEV|g" + +echo "Destroy device" +_put_scsi_debug_dev + +echo "Create w/o unmap or writesame and format" +dev=$(_get_scsi_debug_dev 512 512 0 4 "lbpws=0 lbpws10=0 lbpu=0 write_same_length=0 unmap_max_blocks=0") +_pwrite_byte 0x62 0 4m $dev >> $seqres.full +$XFS_IO_PROG -c "fsync" $dev + +echo "Zero punch, no fallback available" +$XFS_IO_PROG -c "fpunch 512k 512k" $dev + +echo "Zero range, write fallback" +$XFS_IO_PROG -c "fzero -k 1536k 512k" $dev + +echo "Check contents" +md5sum $dev | sed -e "s|$dev|SCSI_DEBUG_DEV|g" + +echo "Destroy device" +_put_scsi_debug_dev + +# success, all done +status=0 +exit diff --git a/tests/generic/707.out b/tests/generic/707.out new file mode 100644 index 0000000..a520221 --- /dev/null +++ b/tests/generic/707.out @@ -0,0 +1,32 @@ +QA output created by 707 +Create and format +Regular fallocate +fallocate: Operation not supported +Insert range +fallocate: Operation not supported +Collapse range +fallocate: Operation not supported +Unaligned zero range +fallocate: Invalid argument +Unaligned punch +fallocate: Invalid argument +Zero range past MAX_LFS_FILESIZE keep size +fallocate: File too large +Zero range past MAX_LFS_FILESIZE +fallocate: File too large +Zero range to MAX_LFS_FILESIZE fail w/o keepsize +fallocate: Invalid argument +Zero range starts past EOD +fallocate: Invalid argument +Punch starts past EOD +fallocate: Invalid argument +Check contents +b83f9394092e15bdcda585cd8e776dc6 SCSI_DEBUG_DEV +Destroy device +Create w/o unmap or writesame and format +Zero punch, no fallback available +fallocate: Operation not supported +Zero range, write fallback +Check contents +0fc6bc93cd0cd97e3cde5ea39ea1185d SCSI_DEBUG_DEV +Destroy device diff --git a/tests/generic/group b/tests/generic/group index ef1a423..cc14c80 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -345,3 +345,6 @@ 340 auto 341 auto quick metadata 342 auto quick metadata +705 blockdev quick rw +706 blockdev quick rw +707 blockdev quick rw From david@fromorbit.com Tue Apr 12 23:51:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7C9157CA0 for ; Tue, 12 Apr 2016 23:51:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 211258F8037 for ; Tue, 12 Apr 2016 21:51:36 -0700 (PDT) X-ASG-Debug-ID: 1460523093-04bdf01102431840001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id jave1Q0dEiGiWl4i for ; Tue, 12 Apr 2016 21:51:33 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CLDwBbzw1XNaAZLHlegzeBUIJyg3mfawEBAQEBAQaMEYl7hggEAgKBPU0BAQEBAQEHAQEBAUEBQIRBAQEBAwE6HCMFCwgDDgoJJQ8FJQMHGhOIIAfCNwEBCAIeGYVAhROKFQWYCI4DgXGHdoUzRY5igmYZgVwqMIl6AQEB Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail04.adl6.internode.on.net with ESMTP; 13 Apr 2016 14:21:31 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aqCm1-0003lM-Km; Wed, 13 Apr 2016 14:51:29 +1000 Date: Wed, 13 Apr 2016 14:51:29 +1000 From: Dave Chinner To: Andrew Ryder Cc: Brian Foster , xfs@oss.sgi.com Subject: Re: xfs_repair fails after trying to format log cycle? Message-ID: <20160413045129.GO567@dastard> X-ASG-Orig-Subj: Re: xfs_repair fails after trying to format log cycle? References: <56F6DE67.60403@shaw.ca> <20160328085541.GA27040@bfoster.bfoster> <570C8D4D.3060304@shaw.ca> <20160412140512.GA59690@bfoster.bfoster> <570D578D.5010706@shaw.ca> <570DB6CD.1000007@shaw.ca> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <570DB6CD.1000007@shaw.ca> 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: 1460523093 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28688 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Apr 12, 2016 at 11:02:37PM -0400, Andrew Ryder wrote: > Is it possible the location its searching for at block > > 02:34:43.887528 pread64(4, 0x7fb8f53e0200, 2097152, 3001552175104) = > -1 EIO (Input/output error) so offset is 3001552175104, or roughly around the 3TB mark. Given the log i always placed int eh middle of the filesystem and you have a 6TB device, then the above definitely looks like a valid place to be reading from the log. > xfs_logprint: > data device: 0x902 > log device: 0x902 daddr: 5860130880 length: 4173824 daddr converted to offset is 5860130880 * 512 = 3001552175104, which tells us that the above pread64 failure was definitely coming from an attempt to read the log. That this is coming from the block device from userspace indicates a problem below XFS. There is something going wrong with your underlying block device and/or hardware here; AFAICT it's not related to XFS at all. > >GNU Parted 3.2 > >Using /dev/sdk > >Welcome to GNU Parted! Type 'help' to view a list of commands. > >(parted) p > >Model: ATA ST2000DL001-9VT1 (scsi) > >Disk /dev/sdk: 2000GB > >Sector size (logical/physical): 512B/512B > >Partition Table: msdos > >Disk Flags: > > > >Number Start End Size Type File system Flags > > 1 512B 2000GB 2000GB primary raid > >Number Start End Size Type File system Flags > > 1 1s 3907029167s 3907029167s primary raid Compared to the other devices, it has a different start sector, a different size, and an msdos partition table rather than gpt. Definitely a red flag... > >>>This all began when the RR2722 driver running under 3.18.15 > >>>complained and Reported physical IO errors to a write command. Really, this looks like a hardware issue, not something that can be fixed by running xfs_repair... Cheers, Dave. -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Wed Apr 13 00:32:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1EE017CA0 for ; Wed, 13 Apr 2016 00:32:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D670F30405F for ; Tue, 12 Apr 2016 22:32:16 -0700 (PDT) X-ASG-Debug-ID: 1460525533-04bdf01104432d00001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Ngguo8SAf4rR23h4 for ; Tue, 12 Apr 2016 22:32:14 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BcDwDy2A1XNaAZLHlegzeIO59rAQEBAQEBBpF5i2BNAQEBAQEBBwEBAQFBAUCEby87gQIDB4hUoDyiH4VZih6FCgWYCI4Pjw6PJ4IYAQsBgjYqiioBAQE Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail04.adl6.internode.on.net with ESMTP; 13 Apr 2016 15:02:13 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1aqDPP-0003p0-Q5 for xfs@oss.sgi.com; Wed, 13 Apr 2016 15:32:11 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1aqDOq-0000bZ-A4 for xfs@oss.sgi.com; Wed, 13 Apr 2016 15:31:36 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 00/11 v3] xfs: inode reclaim vs the world Date: Wed, 13 Apr 2016 15:31:21 +1000 X-ASG-Orig-Subj: [PATCH 00/11 v3] xfs: inode reclaim vs the world Message-Id: <1460525492-1170-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1460525533 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28688 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, The inode reclaim patchset has grown somewhat larger with all the fixes I've accrued over the past couple of days for issues that have been reported. I've just re-ordered the patchset to have all the bug fixes that need to go into 4.6-rc up front, followed by other bug fixes, followed by all the cleanups I wrote as I went along fixing things. I want to get this out before LSFMM, so I'm posting this before I've done a full verification that I've got the patches correct, and they are still running through xfstests right now. Patch 1 is new - it fixes a regression introduced in 4.6-rc1 and is caused by clearing the vfs inode i_mode in ->evict_inode, when there is code in evict() that requires the mode to be intact until ->destroy_inode. Patch 2 is new - if fixes the inode log item leak that left a dirty log item on the AIL after the inode had been reclaimed, resulting in unmountable filesystems and a couple of use-after-free vectors. Patch 3 is the original fix for the xfs_iflush_cluster lookup validity checks that were incorect Patch 4 is the original fix for avoiding flushing stale inodes. Patch 5 is new, and comes from Alex @ Zadara to avoid having to reallocate memory when tearing down the inode extent lists. This is a necessary pre-requisite for patch 6. Patch 6 is the original patch that pushed all the inode memory freeing into the RCU callback, so that xfs_iflush_cluster didn't reference freed memory when racing with reclaim. Patch 7 is the original patch that made reclaim races eaasier to detect. Patch 8 is the original patch that drops out of xfs-iflush_cluster on the first inode beyond the end of the current cluster. Patch 9 is the original patch that renames the variables in xfs_iflush_cluster(). Patch 10 and 11 are new patches that simplify the inode reclaim tagging interfaces to remove dependencies on the struct xfs_inode and the inode number where they are not actually required. -Dave. From dave@fromorbit.com Wed Apr 13 00:32:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9228B7CA0 for ; Wed, 13 Apr 2016 00:32:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 45883304062 for ; Tue, 12 Apr 2016 22:32:21 -0700 (PDT) X-ASG-Debug-ID: 1460525533-04bdf01104432d00003-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id D5eZzzmhTy1bBsbl for ; Tue, 12 Apr 2016 22:32:18 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BlDwDy2A1XNaAZLHlWCIM3gVCGa59rAQEBAQEBBpF5iiGBP00BAQEBAQEHAQEBAUEBQIRCAQUnLx4VCBgxOQMHFBmIJ8JbhVmJLkqFMAWYCI4Pjw6PJ4IYAQtCGYFcKjCJegEBAQ Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail04.adl6.internode.on.net with ESMTP; 13 Apr 2016 15:02:13 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1aqDPP-0003p7-TU for xfs@oss.sgi.com; Wed, 13 Apr 2016 15:32:12 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1aqDOq-0000c8-Dr for xfs@oss.sgi.com; Wed, 13 Apr 2016 15:31:36 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 07/11] xfs: mark reclaimed inodes invalid earlier Date: Wed, 13 Apr 2016 15:31:28 +1000 X-ASG-Orig-Subj: [PATCH 07/11] xfs: mark reclaimed inodes invalid earlier Message-Id: <1460525492-1170-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1460525492-1170-1-git-send-email-david@fromorbit.com> References: <1460525492-1170-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1460525538 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28688 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The last thing we do before using call_rcu() on an xfs_inode to be freed is mark it as invalid. This means there is a window between when we know for certain that the inode is going to be freed and when we do actually mark it as "freed". This is important in the context of RCU lookups - we can look up the inode, find that it is valid, and then use it as such not realising that it is in the final stages of being freed. As such, mark the inode as being invalid the moment we know it is going to be reclaimed. This can be done while we still hold the XFS_ILOCK_EXCL and the flush lock in xfs_inode_reclaim, meaning that it occurs well before we remove it from the radix tree, and that the i_flags_lock, the XFS_ILOCK and the inode flush lock all act as synchronisation points for detecting that an inode is about to go away. For defensive purposes, this allows us to add a further check to xfs_iflush_cluster to ensure we skip inodes that are being freed after we grab the XFS_ILOCK_SHARED and the flush lock - we know that if the inode number if valid while we have these locks held we know that it has not progressed through reclaim to the point where it is clean and is about to be freed. [bfoster: fixed __xfs_inode_clear_reclaim() using ip->i_ino after it had already been zeroed.] Signed-off-by: Dave Chinner --- fs/xfs/xfs_icache.c | 40 ++++++++++++++++++++++++++++++++-------- fs/xfs/xfs_inode.c | 13 +++++++++++++ 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index 0c94cde..a60db43 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -114,6 +114,18 @@ xfs_inode_free_callback( kmem_zone_free(xfs_inode_zone, ip); } +static void +__xfs_inode_free( + struct xfs_inode *ip) +{ + /* asserts to verify all state is correct here */ + ASSERT(atomic_read(&ip->i_pincount) == 0); + ASSERT(!xfs_isiflocked(ip)); + XFS_STATS_DEC(ip->i_mount, vn_active); + + call_rcu(&VFS_I(ip)->i_rcu, xfs_inode_free_callback); +} + void xfs_inode_free( struct xfs_inode *ip) @@ -129,12 +141,7 @@ xfs_inode_free( ip->i_ino = 0; spin_unlock(&ip->i_flags_lock); - /* asserts to verify all state is correct here */ - ASSERT(atomic_read(&ip->i_pincount) == 0); - ASSERT(!xfs_isiflocked(ip)); - XFS_STATS_DEC(ip->i_mount, vn_active); - - call_rcu(&VFS_I(ip)->i_rcu, xfs_inode_free_callback); + __xfs_inode_free(ip); } /* @@ -929,6 +936,7 @@ xfs_reclaim_inode( int sync_mode) { struct xfs_buf *bp = NULL; + xfs_ino_t ino = ip->i_ino; /* for radix_tree_delete */ int error; restart: @@ -993,6 +1001,22 @@ restart: xfs_iflock(ip); reclaim: + /* + * Because we use RCU freeing we need to ensure the inode always appears + * to be reclaimed with an invalid inode number when in the free state. + * We do this as early as possible under the ILOCK and flush lock so + * that xfs_iflush_cluster() can be guaranteed to detect races with us + * here. By doing this, we guarantee that once xfs_iflush_cluster has + * locked both the XFS_ILOCK and the flush lock that it will see either + * a valid, flushable inode that will serialise correctly against the + * locks below, or it will see a clean (and invalid) inode that it can + * skip. + */ + spin_lock(&ip->i_flags_lock); + ip->i_flags = XFS_IRECLAIM; + ip->i_ino = 0; + spin_unlock(&ip->i_flags_lock); + xfs_ifunlock(ip); xfs_iunlock(ip, XFS_ILOCK_EXCL); @@ -1006,7 +1030,7 @@ reclaim: */ spin_lock(&pag->pag_ici_lock); if (!radix_tree_delete(&pag->pag_ici_root, - XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino))) + XFS_INO_TO_AGINO(ip->i_mount, ino))) ASSERT(0); __xfs_inode_clear_reclaim(pag, ip); spin_unlock(&pag->pag_ici_lock); @@ -1023,7 +1047,7 @@ reclaim: xfs_qm_dqdetach(ip); xfs_iunlock(ip, XFS_ILOCK_EXCL); - xfs_inode_free(ip); + __xfs_inode_free(ip); return error; out_ifunlock: diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index ad0ad8d..8931375 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -3226,6 +3226,19 @@ xfs_iflush_cluster( continue; } + + /* + * Check the inode number again, just to be certain we are not + * racing with freeing in xfs_reclaim_inode(). See the comments + * in that function for more information as to why the initial + * check is not sufficient. + */ + if (!iq->i_ino) { + xfs_ifunlock(iq); + xfs_iunlock(iq, XFS_ILOCK_SHARED); + continue; + } + /* * arriving here means that this inode can be flushed. First * re-check that it's dirty before flushing. -- 2.7.0 From dave@fromorbit.com Wed Apr 13 00:32:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 59AAD7CA0 for ; Wed, 13 Apr 2016 00:32:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1CB9930405F for ; Tue, 12 Apr 2016 22:32:22 -0700 (PDT) X-ASG-Debug-ID: 1460525533-04bdf01104432d00004-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id GQvyzGSDQ7iRGONV for ; Tue, 12 Apr 2016 22:32:20 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BkDwDy2A1XNaAZLHlegzeBUIZrn2sBAQEBAQEGj2CCGYtgTQEBAQEBAQcBAQEBQQFAhEIBBScvMwgYMTkDBxQZiCfCW4VZih6FCgWYCI4Pjw5FjmKCGAELgjcqMIl6AQEB Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail04.adl6.internode.on.net with ESMTP; 13 Apr 2016 15:02:13 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1aqDPP-0003p4-Rz for xfs@oss.sgi.com; Wed, 13 Apr 2016 15:32:11 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1aqDOq-0000bs-C6 for xfs@oss.sgi.com; Wed, 13 Apr 2016 15:31:36 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 04/11] xfs: skip stale inodes in xfs_iflush_cluster Date: Wed, 13 Apr 2016 15:31:25 +1000 X-ASG-Orig-Subj: [PATCH 04/11] xfs: skip stale inodes in xfs_iflush_cluster Message-Id: <1460525492-1170-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1460525492-1170-1-git-send-email-david@fromorbit.com> References: <1460525492-1170-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1460525540 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28688 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner We don't write back stale inodes so we should skip them in xfs_iflush_cluster, too. cc: # 3.10.x- Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index e302f11..ad0ad8d 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -3194,6 +3194,7 @@ xfs_iflush_cluster( */ spin_lock(&iq->i_flags_lock); if (!iq->i_ino || + __xfs_iflags_test(iq, XFS_ISTALE) || (XFS_INO_TO_AGINO(mp, iq->i_ino) & mask) != first_index) { spin_unlock(&iq->i_flags_lock); continue; -- 2.7.0 From dave@fromorbit.com Wed Apr 13 00:32:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 223E77CAF for ; Wed, 13 Apr 2016 00:32:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D8E3C8F8035 for ; Tue, 12 Apr 2016 22:32:23 -0700 (PDT) X-ASG-Debug-ID: 1460525533-04bdf01104432d00005-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id VWthDcRbqhCVgVyl for ; Tue, 12 Apr 2016 22:32:21 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BkDwDy2A1XNaAZLHlegzeBUIZrn2sBAQEBAQEGj2CCGYtgTQEBAQEBAQcBAQEBQQFAhEIBBScvMwgYMTkDBxQZiCfCW4VZih6FCgWYCI4Pjw5FjmKCGAELgjcqMIl6AQEB Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail04.adl6.internode.on.net with ESMTP; 13 Apr 2016 15:02:13 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1aqDPP-0003p3-RM for xfs@oss.sgi.com; Wed, 13 Apr 2016 15:32:11 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1aqDOq-0000bn-Bi for xfs@oss.sgi.com; Wed, 13 Apr 2016 15:31:36 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 03/11] xfs: fix inode validity check in xfs_iflush_cluster Date: Wed, 13 Apr 2016 15:31:24 +1000 X-ASG-Orig-Subj: [PATCH 03/11] xfs: fix inode validity check in xfs_iflush_cluster Message-Id: <1460525492-1170-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1460525492-1170-1-git-send-email-david@fromorbit.com> References: <1460525492-1170-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1460525541 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28688 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Some careless idiot(*) wrote crap code in commit 1a3e8f3 ("xfs: convert inode cache lookups to use RCU locking") back in late 2010, and so xfs_iflush_cluster checks the wrong inode for whether it is still valid under RCU protection. Fix it to lock and check the correct inode. (*) Careless-idiot: Dave Chinner cc: # 3.10.x- Discovered-by: Brain Foster Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index e97ae5d..e302f11 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -3192,13 +3192,13 @@ xfs_iflush_cluster( * We need to check under the i_flags_lock for a valid inode * here. Skip it if it is not valid or the wrong inode. */ - spin_lock(&ip->i_flags_lock); - if (!ip->i_ino || + spin_lock(&iq->i_flags_lock); + if (!iq->i_ino || (XFS_INO_TO_AGINO(mp, iq->i_ino) & mask) != first_index) { - spin_unlock(&ip->i_flags_lock); + spin_unlock(&iq->i_flags_lock); continue; } - spin_unlock(&ip->i_flags_lock); + spin_unlock(&iq->i_flags_lock); /* * Do an un-protected check to see if the inode is dirty and -- 2.7.0 From dave@fromorbit.com Wed Apr 13 00:32:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1D4DD7CAF for ; Wed, 13 Apr 2016 00:32:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E0F9830405F for ; Tue, 12 Apr 2016 22:32:24 -0700 (PDT) X-ASG-Debug-ID: 1460525536-04cb6c2462432490001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id GIwkKfsy25KDpC2w for ; Tue, 12 Apr 2016 22:32:16 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BkDwDy2A1XNaAZLHlegzeBUIZrn2sBAQEBAQEGj2CCGYtgTQEBAQEBAQcBAQEBQQFAhEIBBScvMwgYMTkDBxQZiCfCW4VZjygFmAiOD48ORY5ighgBC0IZgVwqMIl6AQEB Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail04.adl6.internode.on.net with ESMTP; 13 Apr 2016 15:02:13 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1aqDPP-0003p5-ST for xfs@oss.sgi.com; Wed, 13 Apr 2016 15:32:11 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1aqDOq-0000bx-Cm for xfs@oss.sgi.com; Wed, 13 Apr 2016 15:31:36 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 05/11] xfs: optimise xfs_iext_destroy Date: Wed, 13 Apr 2016 15:31:26 +1000 X-ASG-Orig-Subj: [PATCH 05/11] xfs: optimise xfs_iext_destroy Message-Id: <1460525492-1170-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1460525492-1170-1-git-send-email-david@fromorbit.com> References: <1460525492-1170-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1460525536 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28688 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Alex Lyakas When unmounting XFS, we call: xfs_inode_free => xfs_idestroy_fork => xfs_iext_destroy This goes over the whole indirection array and calls xfs_iext_irec_remove for each one of the erps (from the last one to the first one). As a result, we keep shrinking (reallocating actually) the indirection array until we shrink out all of its elements. When we have files with huge numbers of extents, umount takes 30-80 sec, depending on the amount of files that XFS loaded and the amount of indirection entries of each file. The unmount stack looks like: [] xfs_iext_realloc_indirect+0x40/0x60 [xfs] [] xfs_iext_irec_remove+0xee/0xf0 [xfs] [] xfs_iext_destroy+0x3d/0xb0 [xfs] [] xfs_idestroy_fork+0xb6/0xf0 [xfs] [] xfs_inode_free+0xb2/0xc0 [xfs] [] xfs_reclaim_inode+0x250/0x340 [xfs] [] xfs_reclaim_inodes_ag+0x233/0x370 [xfs] [] xfs_reclaim_inodes+0x1d/0x20 [xfs] [] xfs_unmountfs+0x7b/0x1a0 [xfs] [] xfs_fs_put_super+0x2d/0x70 [xfs] [] generic_shutdown_super+0x76/0x100 [] kill_block_super+0x27/0x70 [] deactivate_locked_super+0x49/0x60 [] deactivate_super+0x4e/0x70 [] cleanup_mnt+0x43/0x90 [] __cleanup_mnt+0x12/0x20 [] task_work_run+0xa7/0xe0 [] do_notify_resume+0x97/0xb0 [] int_signal+0x12/0x17 Further, this reallocation prevents us from freeing the extent list from a RCU callback as allocation can block. Hence if the extent list is in indirect format, optimise the freeing of the extent list to only use kmem_free calls by freeing entire extent buffer pages at a time, rather than extent by extent. Signed-off-by: Alex Lyakas Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_inode_fork.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/fs/xfs/libxfs/xfs_inode_fork.c b/fs/xfs/libxfs/xfs_inode_fork.c index d3d1477..27497e1 100644 --- a/fs/xfs/libxfs/xfs_inode_fork.c +++ b/fs/xfs/libxfs/xfs_inode_fork.c @@ -1519,6 +1519,26 @@ xfs_iext_indirect_to_direct( } /* + * Remove all records from the indirection array. + */ +STATIC void +xfs_iext_irec_remove_all( + struct xfs_ifork *ifp) +{ + int nlists; + int i; + + ASSERT(ifp->if_flags & XFS_IFEXTIREC); + nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; + for (i = 0; i < nlists; i++) { + xfs_ext_irec_t *erp = &ifp->if_u1.if_ext_irec[i]; + if (erp->er_extbuf) + kmem_free(erp->er_extbuf); + } + kmem_free(ifp->if_u1.if_ext_irec); +} + +/* * Free incore file extents. */ void @@ -1526,13 +1546,7 @@ xfs_iext_destroy( xfs_ifork_t *ifp) /* inode fork pointer */ { if (ifp->if_flags & XFS_IFEXTIREC) { - int erp_idx; - int nlists; - - nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; - for (erp_idx = nlists - 1; erp_idx >= 0 ; erp_idx--) { - xfs_iext_irec_remove(ifp, erp_idx); - } + xfs_iext_irec_remove_all(ifp); ifp->if_flags &= ~XFS_IFEXTIREC; } else if (ifp->if_real_bytes) { kmem_free(ifp->if_u1.if_extents); -- 2.7.0 From dave@fromorbit.com Wed Apr 13 00:32:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 597047CB0 for ; Wed, 13 Apr 2016 00:32:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 05DDD8F8033 for ; Tue, 12 Apr 2016 22:32:18 -0700 (PDT) X-ASG-Debug-ID: 1460525533-04bdf01104432d00002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 6fE5cfEBExS2Q868 for ; Tue, 12 Apr 2016 22:32:16 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BkDwDy2A1XNaAZLHlegzeBUIZrn2sBAQEBAQEGkXmKIYE/TQEBAQEBAQcBAQEBQQFAhEIBBScvMwgYMTkDBxQZiCfCW4VZiRhghTAFh3KQFo4Pjw5FjmKCGAELQhmBXCowiEaBNAEBAQ Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail04.adl6.internode.on.net with ESMTP; 13 Apr 2016 15:02:13 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1aqDPP-0003p1-QU for xfs@oss.sgi.com; Wed, 13 Apr 2016 15:32:11 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1aqDOq-0000bd-Aq for xfs@oss.sgi.com; Wed, 13 Apr 2016 15:31:36 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 01/11] xfs: we don't need no steekin ->evict_inode Date: Wed, 13 Apr 2016 15:31:22 +1000 X-ASG-Orig-Subj: [PATCH 01/11] xfs: we don't need no steekin ->evict_inode Message-Id: <1460525492-1170-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1460525492-1170-1-git-send-email-david@fromorbit.com> References: <1460525492-1170-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1460525535 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28688 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Joe Lawrence reported a list_add corruption with 4.6-rc1 when testing some custom md administration code that made it's own block device nodes for the md array. The simple test loop of: for i in {0..100}; do mknod --mode=0600 $tmp/tmp_node b $MAJOR $MINOR mdadm --detail --export $tmp/tmp_node > /dev/null rm -f $tmp/tmp_node done Would produce this warning in bd_acquire() when mdadm opened the device node: list_add double add: new=ffff88043831c7b8, prev=ffff8804380287d8, next=ffff88043831c7b8. And then produce this from bd_forget from kdevtmpfs evicting a block dev inode: list_del corruption. prev->next should be ffff8800bb83eb10, but was ffff88043831c7b8 This is a regression caused by commit c19b3b05 ("xfs: mode di_mode to vfs inode"). The issue is that xfs_inactive() frees the unlinked inode, and the above commit meant that this freeing zeroed the mode in the struct inode. The problem is that after evict() has called ->evict_inode, it expects the i_mode to be intact so that it can call bd_forget() or cd_forget() to drop the reference to the block device inode attached to the XFS inode. In reality, the only thing we do in xfs_fs_evict_inode() that is not generic is call xfs_inactive(). We can move the xfs_inactive() call to xfs_fs_destroy_inode() without any problems at all, and this will leave the VFS inode intact until it is completely done with it. So, remove xfs_fs_evict_inode(), and do the work it used to do in ->destroy_inode instead. Reported-by: Joe Lawrence Signed-off-by: Dave Chinner --- fs/xfs/xfs_super.c | 28 +++++++--------------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index e2f0f52..416421d 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -928,7 +928,7 @@ xfs_fs_alloc_inode( /* * Now that the generic code is guaranteed not to be accessing - * the linux inode, we can reclaim the inode. + * the linux inode, we can inactivate and reclaim the inode. */ STATIC void xfs_fs_destroy_inode( @@ -938,9 +938,14 @@ xfs_fs_destroy_inode( trace_xfs_destroy_inode(ip); - XFS_STATS_INC(ip->i_mount, vn_reclaim); + ASSERT(!rwsem_is_locked(&ip->i_iolock.mr_lock)); + XFS_STATS_INC(ip->i_mount, vn_rele); + XFS_STATS_INC(ip->i_mount, vn_remove); + + xfs_inactive(ip); ASSERT(XFS_FORCED_SHUTDOWN(ip->i_mount) || ip->i_delayed_blks == 0); + XFS_STATS_INC(ip->i_mount, vn_reclaim); /* * We should never get here with one of the reclaim flags already set. @@ -987,24 +992,6 @@ xfs_fs_inode_init_once( "xfsino", ip->i_ino); } -STATIC void -xfs_fs_evict_inode( - struct inode *inode) -{ - xfs_inode_t *ip = XFS_I(inode); - - ASSERT(!rwsem_is_locked(&ip->i_iolock.mr_lock)); - - trace_xfs_evict_inode(ip); - - truncate_inode_pages_final(&inode->i_data); - clear_inode(inode); - XFS_STATS_INC(ip->i_mount, vn_rele); - XFS_STATS_INC(ip->i_mount, vn_remove); - - xfs_inactive(ip); -} - /* * We do an unlocked check for XFS_IDONTCACHE here because we are already * serialised against cache hits here via the inode->i_lock and igrab() in @@ -1673,7 +1660,6 @@ xfs_fs_free_cached_objects( static const struct super_operations xfs_super_operations = { .alloc_inode = xfs_fs_alloc_inode, .destroy_inode = xfs_fs_destroy_inode, - .evict_inode = xfs_fs_evict_inode, .drop_inode = xfs_fs_drop_inode, .put_super = xfs_fs_put_super, .sync_fs = xfs_fs_sync_fs, -- 2.7.0 From dave@fromorbit.com Wed Apr 13 00:32:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6DEAF7CB1 for ; Wed, 13 Apr 2016 00:32:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C0CCCAC003 for ; Tue, 12 Apr 2016 22:32:24 -0700 (PDT) X-ASG-Debug-ID: 1460525538-04cb6c245f432490001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id b7lR4yNUEQNHq5sd for ; Tue, 12 Apr 2016 22:32:19 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BkDwDy2A1XNaAZLHlegzeBUIZrn2sBAQEBAQEGkXmKIYE/TQEBAQEBAQcBAQEBQQFAhEIBBScvMwgYMTkDBxQZiCfCW4VZiRhghTAFmAiOD4Flh3aFM0WOYoIYAQtCGYFcKjCIPwcXB4EWAQEB Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail04.adl6.internode.on.net with ESMTP; 13 Apr 2016 15:02:13 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1aqDPP-0003p6-T4 for xfs@oss.sgi.com; Wed, 13 Apr 2016 15:32:12 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1aqDOq-0000c2-DB for xfs@oss.sgi.com; Wed, 13 Apr 2016 15:31:36 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 06/11] xfs: xfs_inode_free() isn't RCU safe Date: Wed, 13 Apr 2016 15:31:27 +1000 X-ASG-Orig-Subj: [PATCH 06/11] xfs: xfs_inode_free() isn't RCU safe Message-Id: <1460525492-1170-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1460525492-1170-1-git-send-email-david@fromorbit.com> References: <1460525492-1170-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1460525538 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28688 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The xfs_inode freed in xfs_inode_free() has multiple allocated structures attached to it. We free these in xfs_inode_free() before we mark the inode as invalid, and before we run call_rcu() to queue the structure for freeing. Unfortunately, this freeing can race with other accesses that are in the RCU current grace period that have found the inode in the radix tree with a valid state. This includes xfs_iflush_cluster(), which calls xfs_inode_clean(), and that accesses the inode log item on the xfs_inode. The log item structure is freed in xfs_inode_free(), so there is the possibility we can be accessing freed memory in xfs_iflush_cluster() after validating the xfs_inode structure as being valid for this RCU context. Hence we can get spuriously incorrect clean state returned from such checks. This can lead to use thinking the inode is dirty when it is, in fact, clean, and so incorrectly attaching it to the buffer for IO and completion processing. This then leads to use-after-free situations on the xfs_inode itself if the IO completes after the current RCU grace period expires. The buffer callbacks will access the xfs_inode and try to do all sorts of things it shouldn't with freed memory. IOWs, xfs_iflush_cluster() only works correctly when racing with inode reclaim if the inode log item is present and correctly stating the inode is clean. If the inode is being freed, then reclaim has already made sure the inode is clean, and hence xfs_iflush_cluster can skip it. However, we are accessing the inode inode under RCU read lock protection and so also must ensure that all dynamically allocated memory we reference in this context is not freed until the RCU grace period expires. To fix this, move all the potential memory freeing into xfs_inode_free_callback() so that we are guarantee RCU protected lookup code will always have the memory structures it needs available during the RCU grace period that lookup races can occur in. Discovered-by: Brain Foster Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner --- fs/xfs/xfs_icache.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index bf2d607..0c94cde 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -94,13 +94,6 @@ xfs_inode_free_callback( struct inode *inode = container_of(head, struct inode, i_rcu); struct xfs_inode *ip = XFS_I(inode); - kmem_zone_free(xfs_inode_zone, ip); -} - -void -xfs_inode_free( - struct xfs_inode *ip) -{ switch (VFS_I(ip)->i_mode & S_IFMT) { case S_IFREG: case S_IFDIR: @@ -118,6 +111,13 @@ xfs_inode_free( ip->i_itemp = NULL; } + kmem_zone_free(xfs_inode_zone, ip); +} + +void +xfs_inode_free( + struct xfs_inode *ip) +{ /* * Because we use RCU freeing we need to ensure the inode always * appears to be reclaimed with an invalid inode number when in the -- 2.7.0 From dave@fromorbit.com Wed Apr 13 00:32:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 55E257CAF for ; Wed, 13 Apr 2016 00:32:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0E597AC006 for ; Tue, 12 Apr 2016 22:32:24 -0700 (PDT) X-ASG-Debug-ID: 1460525533-04bdf01104432d00006-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 8c6E9byNKHWGb61o for ; Tue, 12 Apr 2016 22:32:23 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BkDwDy2A1XNaAZLHlegzeBUIZrn2sBAQEBAQEGj2CCGYtgTQEBAQEBAQcBAQEBQQFAhEIBBScvMwgYMTkDBxQZiCfCW4VZih6FCgWHZ4cbiQaOD48ORY5ighgBC4I3KjCJegEBAQ Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail04.adl6.internode.on.net with ESMTP; 13 Apr 2016 15:02:13 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1aqDPP-0003p2-Qz for xfs@oss.sgi.com; Wed, 13 Apr 2016 15:32:11 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1aqDOq-0000bi-BJ for xfs@oss.sgi.com; Wed, 13 Apr 2016 15:31:36 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 02/11] xfs: xfs_iflush_cluster fails to abort on error Date: Wed, 13 Apr 2016 15:31:23 +1000 X-ASG-Orig-Subj: [PATCH 02/11] xfs: xfs_iflush_cluster fails to abort on error Message-Id: <1460525492-1170-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1460525492-1170-1-git-send-email-david@fromorbit.com> References: <1460525492-1170-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1460525542 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28688 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When a failure due to an inode buffer occurs, the error handling fails to abort the inode writeback correctly. This can result in the inode being reclaimed whilst still in the AIL, leading to use-after-free situations as well as filesystems that cannot be unmounted as the inode log items left in the AIL never get removed. Fix this by ensuring fatal errors from xfs_imap_to_bp() result in the inode flush being aborted correctly. cc: # 3.10.x- Reported-by: Shyam Kaushik Diagnosed-by: Shyam Kaushik Tested-by: Shyam Kaushik Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index f79ea59..e97ae5d 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -3314,7 +3314,7 @@ xfs_iflush( struct xfs_buf **bpp) { struct xfs_mount *mp = ip->i_mount; - struct xfs_buf *bp; + struct xfs_buf *bp = NULL; struct xfs_dinode *dip; int error; @@ -3356,14 +3356,22 @@ xfs_iflush( } /* - * Get the buffer containing the on-disk inode. + * Get the buffer containing the on-disk inode. We are doing a try-lock + * operation here, so we may get an EAGAIN error. In that case, we + * simply want to return with the inode still dirty. + * + * If we get any other error, we effectively have a corruption situation + * and we cannot flush the inode, so we treat it the same as failing + * xfs_iflush_int(). */ error = xfs_imap_to_bp(mp, NULL, &ip->i_imap, &dip, &bp, XBF_TRYLOCK, 0); - if (error || !bp) { + if (error == -EAGAIN) { xfs_ifunlock(ip); return error; } + if (error) + goto corrupt_out; /* * First flush out the inode that xfs_iflush was called with. @@ -3391,7 +3399,8 @@ xfs_iflush( return 0; corrupt_out: - xfs_buf_relse(bp); + if (bp) + xfs_buf_relse(bp); xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); cluster_corrupt_out: error = -EFSCORRUPTED; -- 2.7.0 From dave@fromorbit.com Wed Apr 13 00:32:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 870287CB7 for ; Wed, 13 Apr 2016 00:32:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 39A6530405F for ; Tue, 12 Apr 2016 22:32:27 -0700 (PDT) X-ASG-Debug-ID: 1460525533-04bdf01104432d00007-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id TzGGSLxFz317R66t for ; Tue, 12 Apr 2016 22:32:24 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BkDwDy2A1XNaAZLHlegzeBUIZrn2sBAQEBAQEGj2CCGYtgTQEBAQEBAQcBAQEBQQFAhEIBBScvMwgYMTkDBxQZiCfCW4VZjygFh3KQFo4Pjw5FjmKCGAELQhmBXCowiXoBAQE Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail04.adl6.internode.on.net with ESMTP; 13 Apr 2016 15:02:13 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1aqDPP-0003p9-UN for xfs@oss.sgi.com; Wed, 13 Apr 2016 15:32:12 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1aqDOq-0000cJ-Eh for xfs@oss.sgi.com; Wed, 13 Apr 2016 15:31:36 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 09/11] xfs: rename variables in xfs_iflush_cluster for clarity Date: Wed, 13 Apr 2016 15:31:30 +1000 X-ASG-Orig-Subj: [PATCH 09/11] xfs: rename variables in xfs_iflush_cluster for clarity Message-Id: <1460525492-1170-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1460525492-1170-1-git-send-email-david@fromorbit.com> References: <1460525492-1170-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1460525544 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28688 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The cluster inode variable uses unconventional naming - iq - which makes it hard to distinguish it between the inode passed into the function - ip - and that is a vector for mistakes to be made. Rename all the cluster inode variables to use a more conventional prefixes to reduce potential future confusion (cilist, cilist_size, cip). Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 74 +++++++++++++++++++++++++++--------------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 26f22cb..ee6799e 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -3149,16 +3149,16 @@ out_release_wip: STATIC int xfs_iflush_cluster( - xfs_inode_t *ip, - xfs_buf_t *bp) + struct xfs_inode *ip, + struct xfs_buf *bp) { - xfs_mount_t *mp = ip->i_mount; + struct xfs_mount *mp = ip->i_mount; struct xfs_perag *pag; unsigned long first_index, mask; unsigned long inodes_per_cluster; - int ilist_size; - xfs_inode_t **ilist; - xfs_inode_t *iq; + int cilist_size; + struct xfs_inode **cilist; + struct xfs_inode *cip; int nr_found; int clcount = 0; int bufwasdelwri; @@ -3167,23 +3167,23 @@ xfs_iflush_cluster( pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); inodes_per_cluster = mp->m_inode_cluster_size >> mp->m_sb.sb_inodelog; - ilist_size = inodes_per_cluster * sizeof(xfs_inode_t *); - ilist = kmem_alloc(ilist_size, KM_MAYFAIL|KM_NOFS); - if (!ilist) + cilist_size = inodes_per_cluster * sizeof(xfs_inode_t *); + cilist = kmem_alloc(cilist_size, KM_MAYFAIL|KM_NOFS); + if (!cilist) goto out_put; mask = ~(((mp->m_inode_cluster_size >> mp->m_sb.sb_inodelog)) - 1); first_index = XFS_INO_TO_AGINO(mp, ip->i_ino) & mask; rcu_read_lock(); /* really need a gang lookup range call here */ - nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void**)ilist, + nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void**)cilist, first_index, inodes_per_cluster); if (nr_found == 0) goto out_free; for (i = 0; i < nr_found; i++) { - iq = ilist[i]; - if (iq == ip) + cip = cilist[i]; + if (cip == ip) continue; /* @@ -3192,10 +3192,10 @@ xfs_iflush_cluster( * We need to check under the i_flags_lock for a valid inode * here. Skip it if it is not valid or the wrong inode. */ - spin_lock(&iq->i_flags_lock); - if (!iq->i_ino || - __xfs_iflags_test(iq, XFS_ISTALE)) { - spin_unlock(&iq->i_flags_lock); + spin_lock(&cip->i_flags_lock); + if (!cip->i_ino || + __xfs_iflags_test(cip, XFS_ISTALE)) { + spin_unlock(&cip->i_flags_lock); continue; } @@ -3204,18 +3204,18 @@ xfs_iflush_cluster( * any more inodes in the list because they will also all be * outside the cluster. */ - if ((XFS_INO_TO_AGINO(mp, iq->i_ino) & mask) != first_index) { - spin_unlock(&iq->i_flags_lock); + if ((XFS_INO_TO_AGINO(mp, cip->i_ino) & mask) != first_index) { + spin_unlock(&cip->i_flags_lock); break; } - spin_unlock(&iq->i_flags_lock); + spin_unlock(&cip->i_flags_lock); /* * Do an un-protected check to see if the inode is dirty and * is a candidate for flushing. These checks will be repeated * later after the appropriate locks are acquired. */ - if (xfs_inode_clean(iq) && xfs_ipincount(iq) == 0) + if (xfs_inode_clean(cip) && xfs_ipincount(cip) == 0) continue; /* @@ -3223,15 +3223,15 @@ xfs_iflush_cluster( * then this inode cannot be flushed and is skipped. */ - if (!xfs_ilock_nowait(iq, XFS_ILOCK_SHARED)) + if (!xfs_ilock_nowait(cip, XFS_ILOCK_SHARED)) continue; - if (!xfs_iflock_nowait(iq)) { - xfs_iunlock(iq, XFS_ILOCK_SHARED); + if (!xfs_iflock_nowait(cip)) { + xfs_iunlock(cip, XFS_ILOCK_SHARED); continue; } - if (xfs_ipincount(iq)) { - xfs_ifunlock(iq); - xfs_iunlock(iq, XFS_ILOCK_SHARED); + if (xfs_ipincount(cip)) { + xfs_ifunlock(cip); + xfs_iunlock(cip, XFS_ILOCK_SHARED); continue; } @@ -3242,9 +3242,9 @@ xfs_iflush_cluster( * in that function for more information as to why the initial * check is not sufficient. */ - if (!iq->i_ino) { - xfs_ifunlock(iq); - xfs_iunlock(iq, XFS_ILOCK_SHARED); + if (!cip->i_ino) { + xfs_ifunlock(cip); + xfs_iunlock(cip, XFS_ILOCK_SHARED); continue; } @@ -3252,18 +3252,18 @@ xfs_iflush_cluster( * arriving here means that this inode can be flushed. First * re-check that it's dirty before flushing. */ - if (!xfs_inode_clean(iq)) { + if (!xfs_inode_clean(cip)) { int error; - error = xfs_iflush_int(iq, bp); + error = xfs_iflush_int(cip, bp); if (error) { - xfs_iunlock(iq, XFS_ILOCK_SHARED); + xfs_iunlock(cip, XFS_ILOCK_SHARED); goto cluster_corrupt_out; } clcount++; } else { - xfs_ifunlock(iq); + xfs_ifunlock(cip); } - xfs_iunlock(iq, XFS_ILOCK_SHARED); + xfs_iunlock(cip, XFS_ILOCK_SHARED); } if (clcount) { @@ -3273,7 +3273,7 @@ xfs_iflush_cluster( out_free: rcu_read_unlock(); - kmem_free(ilist); + kmem_free(cilist); out_put: xfs_perag_put(pag); return 0; @@ -3316,8 +3316,8 @@ cluster_corrupt_out: /* * Unlocks the flush lock */ - xfs_iflush_abort(iq, false); - kmem_free(ilist); + xfs_iflush_abort(cip, false); + kmem_free(cilist); xfs_perag_put(pag); return -EFSCORRUPTED; } -- 2.7.0 From dave@fromorbit.com Wed Apr 13 00:32:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B1A317CB8 for ; Wed, 13 Apr 2016 00:32:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 732B4304062 for ; Tue, 12 Apr 2016 22:32:27 -0700 (PDT) X-ASG-Debug-ID: 1460525536-04cb6c2462432490002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id F1Noqkhzc5Efk0Cd for ; Tue, 12 Apr 2016 22:32:24 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BkDwDy2A1XNaAZLHlegzeBUIZrn2sBAQEBAQEGkXmKIYE/TQEBAQEBAQcBAQEBQQFAhEIBBScvMwgYMTkDBxQZiCfCW4VZiXiFMAWHcpAWjg+PDoQDiySCGAELQhmBXCowiXoBAQE Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail04.adl6.internode.on.net with ESMTP; 13 Apr 2016 15:02:13 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1aqDPP-0003pA-Up for xfs@oss.sgi.com; Wed, 13 Apr 2016 15:32:12 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1aqDOq-0000cO-F5 for xfs@oss.sgi.com; Wed, 13 Apr 2016 15:31:36 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 10/11] xfs: simplify inode reclaim tagging interfaces Date: Wed, 13 Apr 2016 15:31:31 +1000 X-ASG-Orig-Subj: [PATCH 10/11] xfs: simplify inode reclaim tagging interfaces Message-Id: <1460525492-1170-11-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1460525492-1170-1-git-send-email-david@fromorbit.com> References: <1460525492-1170-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1460525544 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28688 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Inode radix tree tagging for reclaim passes a lot of unnecessary variables around. Over time the xfs-perag has grown a xfs_mount backpointer, and an internal agno so we don't need to pass other variables into the tagging functions to supply this information. Rework the functions to pass the minimal variable set required and simplify the internal logic and flow. Signed-off-by: Dave Chinner --- fs/xfs/xfs_icache.c | 97 +++++++++++++++++++++++++++-------------------------- 1 file changed, 49 insertions(+), 48 deletions(-) diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index a60db43..927e7b0 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -37,8 +37,7 @@ #include #include -STATIC void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, - struct xfs_perag *pag, struct xfs_inode *ip); +STATIC void xfs_inode_clear_reclaim_tag(struct xfs_perag *pag, xfs_ino_t ino); /* * Allocate and initialise an xfs_inode. @@ -271,7 +270,7 @@ xfs_iget_cache_hit( */ ip->i_flags &= ~XFS_IRECLAIM_RESET_FLAGS; ip->i_flags |= XFS_INEW; - __xfs_inode_clear_reclaim_tag(mp, pag, ip); + xfs_inode_clear_reclaim_tag(pag, ip->i_ino); inode->i_state = I_NEW; ASSERT(!rwsem_is_locked(&ip->i_iolock.mr_lock)); @@ -768,29 +767,44 @@ xfs_reclaim_worker( } static void -__xfs_inode_set_reclaim_tag( +xfs_perag_set_reclaim_tag( struct xfs_perag *pag, - struct xfs_inode *ip) + xfs_ino_t ino) { - radix_tree_tag_set(&pag->pag_ici_root, - XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), + struct xfs_mount *mp = pag->pag_mount; + + ASSERT(spin_is_locked(&pag->pag_ici_lock)); + if (pag->pag_ici_reclaimable++) + return; + + /* propagate the reclaim tag up into the perag radix tree */ + spin_lock(&mp->m_perag_lock); + radix_tree_tag_set(&mp->m_perag_tree, pag->pag_agno, XFS_ICI_RECLAIM_TAG); + spin_unlock(&mp->m_perag_lock); - if (!pag->pag_ici_reclaimable) { - /* propagate the reclaim tag up into the perag radix tree */ - spin_lock(&ip->i_mount->m_perag_lock); - radix_tree_tag_set(&ip->i_mount->m_perag_tree, - XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), - XFS_ICI_RECLAIM_TAG); - spin_unlock(&ip->i_mount->m_perag_lock); + /* schedule periodic background inode reclaim */ + xfs_reclaim_work_queue(mp); - /* schedule periodic background inode reclaim */ - xfs_reclaim_work_queue(ip->i_mount); + trace_xfs_perag_set_reclaim(mp, pag->pag_agno, -1, _RET_IP_); +} - trace_xfs_perag_set_reclaim(ip->i_mount, pag->pag_agno, - -1, _RET_IP_); - } - pag->pag_ici_reclaimable++; +static void +xfs_perag_clear_reclaim_tag( + struct xfs_perag *pag) +{ + struct xfs_mount *mp = pag->pag_mount; + + ASSERT(spin_is_locked(&pag->pag_ici_lock)); + if (--pag->pag_ici_reclaimable) + return; + + /* clear the reclaim tag from the perag radix tree */ + spin_lock(&mp->m_perag_lock); + radix_tree_tag_clear(&mp->m_perag_tree, pag->pag_agno, + XFS_ICI_RECLAIM_TAG); + spin_unlock(&mp->m_perag_lock); + trace_xfs_perag_clear_reclaim(mp, pag->pag_agno, -1, _RET_IP_); } /* @@ -800,48 +814,35 @@ __xfs_inode_set_reclaim_tag( */ void xfs_inode_set_reclaim_tag( - xfs_inode_t *ip) + struct xfs_inode *ip) { - struct xfs_mount *mp = ip->i_mount; - struct xfs_perag *pag; + struct xfs_mount *mp = ip->i_mount; + struct xfs_perag *pag; pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); spin_lock(&pag->pag_ici_lock); spin_lock(&ip->i_flags_lock); - __xfs_inode_set_reclaim_tag(pag, ip); + + radix_tree_tag_set(&pag->pag_ici_root, XFS_INO_TO_AGINO(mp, ip->i_ino), + XFS_ICI_RECLAIM_TAG); + xfs_perag_set_reclaim_tag(pag, ip->i_ino); __xfs_iflags_set(ip, XFS_IRECLAIMABLE); + spin_unlock(&ip->i_flags_lock); spin_unlock(&pag->pag_ici_lock); xfs_perag_put(pag); } -STATIC void -__xfs_inode_clear_reclaim( - xfs_perag_t *pag, - xfs_inode_t *ip) -{ - pag->pag_ici_reclaimable--; - if (!pag->pag_ici_reclaimable) { - /* clear the reclaim tag from the perag radix tree */ - spin_lock(&ip->i_mount->m_perag_lock); - radix_tree_tag_clear(&ip->i_mount->m_perag_tree, - XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), - XFS_ICI_RECLAIM_TAG); - spin_unlock(&ip->i_mount->m_perag_lock); - trace_xfs_perag_clear_reclaim(ip->i_mount, pag->pag_agno, - -1, _RET_IP_); - } -} STATIC void -__xfs_inode_clear_reclaim_tag( - xfs_mount_t *mp, - xfs_perag_t *pag, - xfs_inode_t *ip) +xfs_inode_clear_reclaim_tag( + struct xfs_perag *pag, + xfs_ino_t ino) { radix_tree_tag_clear(&pag->pag_ici_root, - XFS_INO_TO_AGINO(mp, ip->i_ino), XFS_ICI_RECLAIM_TAG); - __xfs_inode_clear_reclaim(pag, ip); + XFS_INO_TO_AGINO(pag->pag_mount, ino), + XFS_ICI_RECLAIM_TAG); + xfs_perag_clear_reclaim_tag(pag); } /* @@ -1032,7 +1033,7 @@ reclaim: if (!radix_tree_delete(&pag->pag_ici_root, XFS_INO_TO_AGINO(ip->i_mount, ino))) ASSERT(0); - __xfs_inode_clear_reclaim(pag, ip); + xfs_perag_clear_reclaim_tag(pag); spin_unlock(&pag->pag_ici_lock); /* -- 2.7.0 From dave@fromorbit.com Wed Apr 13 00:32:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B9AB77CBC for ; Wed, 13 Apr 2016 00:32:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7BAAD8F8033 for ; Tue, 12 Apr 2016 22:32:28 -0700 (PDT) X-ASG-Debug-ID: 1460525533-04bdf01104432d00008-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id XbH6oAdD1QIUTsgq for ; Tue, 12 Apr 2016 22:32:26 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BkDwDy2A1XNaAZLHlegzeBUIZrn2sBAQEBAQEGj2CCGYtgTQEBAQEBAQcBAQEBQQFAhEIBBScvMwgYMTkDBxQZiCfCW4VZih6FCgWYCIhqhSWPDkWOYoIYAQuCNyowiXoBAQE Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail04.adl6.internode.on.net with ESMTP; 13 Apr 2016 15:02:13 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1aqDPP-0003p8-Tv for xfs@oss.sgi.com; Wed, 13 Apr 2016 15:32:12 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1aqDOq-0000cE-EG for xfs@oss.sgi.com; Wed, 13 Apr 2016 15:31:36 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 08/11] xfs: xfs_iflush_cluster has range issues Date: Wed, 13 Apr 2016 15:31:29 +1000 X-ASG-Orig-Subj: [PATCH 08/11] xfs: xfs_iflush_cluster has range issues Message-Id: <1460525492-1170-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1460525492-1170-1-git-send-email-david@fromorbit.com> References: <1460525492-1170-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1460525546 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28688 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner xfs_iflush_cluster() does a gang lookup on the radix tree, meaning it can find inodes beyond the current cluster if there is sparse cache population. gang lookups return results in ascending index order, so stop trying to cluster inodes once the first inode outside the cluster mask is detected. Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 8931375..26f22cb 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -3194,11 +3194,20 @@ xfs_iflush_cluster( */ spin_lock(&iq->i_flags_lock); if (!iq->i_ino || - __xfs_iflags_test(iq, XFS_ISTALE) || - (XFS_INO_TO_AGINO(mp, iq->i_ino) & mask) != first_index) { + __xfs_iflags_test(iq, XFS_ISTALE)) { spin_unlock(&iq->i_flags_lock); continue; } + + /* + * Once we fall off the end of the cluster, no point checking + * any more inodes in the list because they will also all be + * outside the cluster. + */ + if ((XFS_INO_TO_AGINO(mp, iq->i_ino) & mask) != first_index) { + spin_unlock(&iq->i_flags_lock); + break; + } spin_unlock(&iq->i_flags_lock); /* -- 2.7.0 From dave@fromorbit.com Wed Apr 13 00:32:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B46697CBB for ; Wed, 13 Apr 2016 00:32:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1A558AC003 for ; Tue, 12 Apr 2016 22:32:28 -0700 (PDT) X-ASG-Debug-ID: 1460525538-04cb6c245f432490002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id oCkI1qvPMdE8O7YH for ; Tue, 12 Apr 2016 22:32:24 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BhDwDy2A1XNaAZLHlWCIM3gVCGa59rAQEBAQEBBpF5i2BNAQEBAQEBBwEBAQFBAUCEQgEFJy8zCBgxOQMHFBmIJ8JbhVmJLoV6BYdykBaOD48OjyeCGAELQhmBXCowiXoBAQE Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail04.adl6.internode.on.net with ESMTP; 13 Apr 2016 15:02:13 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1aqDPP-0003pB-VA for xfs@oss.sgi.com; Wed, 13 Apr 2016 15:32:12 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1aqDOq-0000cT-FX for xfs@oss.sgi.com; Wed, 13 Apr 2016 15:31:36 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 11/11] xfs: move reclaim tagging functions Date: Wed, 13 Apr 2016 15:31:32 +1000 X-ASG-Orig-Subj: [PATCH 11/11] xfs: move reclaim tagging functions Message-Id: <1460525492-1170-12-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1460525492-1170-1-git-send-email-david@fromorbit.com> References: <1460525492-1170-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1460525543 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28688 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Rearrange the inode tagging functions so that they are higher up in xfs_cache.c and so there is no need for forward prototypes to be defined. This is purely code movement, no other change. Signed-off-by: Dave Chinner --- fs/xfs/xfs_icache.c | 235 ++++++++++++++++++++++++++-------------------------- 1 file changed, 116 insertions(+), 119 deletions(-) diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index 927e7b0..dab58e1 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -37,8 +37,6 @@ #include #include -STATIC void xfs_inode_clear_reclaim_tag(struct xfs_perag *pag, xfs_ino_t ino); - /* * Allocate and initialise an xfs_inode. */ @@ -172,6 +170,122 @@ xfs_reinit_inode( } /* + * Queue a new inode reclaim pass if there are reclaimable inodes and there + * isn't a reclaim pass already in progress. By default it runs every 5s based + * on the xfs periodic sync default of 30s. Perhaps this should have it's own + * tunable, but that can be done if this method proves to be ineffective or too + * aggressive. + */ +static void +xfs_reclaim_work_queue( + struct xfs_mount *mp) +{ + + rcu_read_lock(); + if (radix_tree_tagged(&mp->m_perag_tree, XFS_ICI_RECLAIM_TAG)) { + queue_delayed_work(mp->m_reclaim_workqueue, &mp->m_reclaim_work, + msecs_to_jiffies(xfs_syncd_centisecs / 6 * 10)); + } + rcu_read_unlock(); +} + +/* + * This is a fast pass over the inode cache to try to get reclaim moving on as + * many inodes as possible in a short period of time. It kicks itself every few + * seconds, as well as being kicked by the inode cache shrinker when memory + * goes low. It scans as quickly as possible avoiding locked inodes or those + * already being flushed, and once done schedules a future pass. + */ +void +xfs_reclaim_worker( + struct work_struct *work) +{ + struct xfs_mount *mp = container_of(to_delayed_work(work), + struct xfs_mount, m_reclaim_work); + + xfs_reclaim_inodes(mp, SYNC_TRYLOCK); + xfs_reclaim_work_queue(mp); +} + +static void +xfs_perag_set_reclaim_tag( + struct xfs_perag *pag, + xfs_ino_t ino) +{ + struct xfs_mount *mp = pag->pag_mount; + + ASSERT(spin_is_locked(&pag->pag_ici_lock)); + if (pag->pag_ici_reclaimable++) + return; + + /* propagate the reclaim tag up into the perag radix tree */ + spin_lock(&mp->m_perag_lock); + radix_tree_tag_set(&mp->m_perag_tree, pag->pag_agno, + XFS_ICI_RECLAIM_TAG); + spin_unlock(&mp->m_perag_lock); + + /* schedule periodic background inode reclaim */ + xfs_reclaim_work_queue(mp); + + trace_xfs_perag_set_reclaim(mp, pag->pag_agno, -1, _RET_IP_); +} + +static void +xfs_perag_clear_reclaim_tag( + struct xfs_perag *pag) +{ + struct xfs_mount *mp = pag->pag_mount; + + ASSERT(spin_is_locked(&pag->pag_ici_lock)); + if (--pag->pag_ici_reclaimable) + return; + + /* clear the reclaim tag from the perag radix tree */ + spin_lock(&mp->m_perag_lock); + radix_tree_tag_clear(&mp->m_perag_tree, pag->pag_agno, + XFS_ICI_RECLAIM_TAG); + spin_unlock(&mp->m_perag_lock); + trace_xfs_perag_clear_reclaim(mp, pag->pag_agno, -1, _RET_IP_); +} + +/* + * We set the inode flag atomically with the radix tree tag. + * Once we get tag lookups on the radix tree, this inode flag + * can go away. + */ +void +xfs_inode_set_reclaim_tag( + struct xfs_inode *ip) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_perag *pag; + + pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); + spin_lock(&pag->pag_ici_lock); + spin_lock(&ip->i_flags_lock); + + radix_tree_tag_set(&pag->pag_ici_root, XFS_INO_TO_AGINO(mp, ip->i_ino), + XFS_ICI_RECLAIM_TAG); + xfs_perag_set_reclaim_tag(pag, ip->i_ino); + __xfs_iflags_set(ip, XFS_IRECLAIMABLE); + + spin_unlock(&ip->i_flags_lock); + spin_unlock(&pag->pag_ici_lock); + xfs_perag_put(pag); +} + +static void +xfs_inode_clear_reclaim_tag( + struct xfs_perag *pag, + xfs_ino_t ino) +{ + radix_tree_tag_clear(&pag->pag_ici_root, + XFS_INO_TO_AGINO(pag->pag_mount, ino), + XFS_ICI_RECLAIM_TAG); + xfs_perag_clear_reclaim_tag(pag); +} + +/* * Check the validity of the inode we just found it the cache */ static int @@ -729,123 +843,6 @@ xfs_inode_ag_iterator_tag( } /* - * Queue a new inode reclaim pass if there are reclaimable inodes and there - * isn't a reclaim pass already in progress. By default it runs every 5s based - * on the xfs periodic sync default of 30s. Perhaps this should have it's own - * tunable, but that can be done if this method proves to be ineffective or too - * aggressive. - */ -static void -xfs_reclaim_work_queue( - struct xfs_mount *mp) -{ - - rcu_read_lock(); - if (radix_tree_tagged(&mp->m_perag_tree, XFS_ICI_RECLAIM_TAG)) { - queue_delayed_work(mp->m_reclaim_workqueue, &mp->m_reclaim_work, - msecs_to_jiffies(xfs_syncd_centisecs / 6 * 10)); - } - rcu_read_unlock(); -} - -/* - * This is a fast pass over the inode cache to try to get reclaim moving on as - * many inodes as possible in a short period of time. It kicks itself every few - * seconds, as well as being kicked by the inode cache shrinker when memory - * goes low. It scans as quickly as possible avoiding locked inodes or those - * already being flushed, and once done schedules a future pass. - */ -void -xfs_reclaim_worker( - struct work_struct *work) -{ - struct xfs_mount *mp = container_of(to_delayed_work(work), - struct xfs_mount, m_reclaim_work); - - xfs_reclaim_inodes(mp, SYNC_TRYLOCK); - xfs_reclaim_work_queue(mp); -} - -static void -xfs_perag_set_reclaim_tag( - struct xfs_perag *pag, - xfs_ino_t ino) -{ - struct xfs_mount *mp = pag->pag_mount; - - ASSERT(spin_is_locked(&pag->pag_ici_lock)); - if (pag->pag_ici_reclaimable++) - return; - - /* propagate the reclaim tag up into the perag radix tree */ - spin_lock(&mp->m_perag_lock); - radix_tree_tag_set(&mp->m_perag_tree, pag->pag_agno, - XFS_ICI_RECLAIM_TAG); - spin_unlock(&mp->m_perag_lock); - - /* schedule periodic background inode reclaim */ - xfs_reclaim_work_queue(mp); - - trace_xfs_perag_set_reclaim(mp, pag->pag_agno, -1, _RET_IP_); -} - -static void -xfs_perag_clear_reclaim_tag( - struct xfs_perag *pag) -{ - struct xfs_mount *mp = pag->pag_mount; - - ASSERT(spin_is_locked(&pag->pag_ici_lock)); - if (--pag->pag_ici_reclaimable) - return; - - /* clear the reclaim tag from the perag radix tree */ - spin_lock(&mp->m_perag_lock); - radix_tree_tag_clear(&mp->m_perag_tree, pag->pag_agno, - XFS_ICI_RECLAIM_TAG); - spin_unlock(&mp->m_perag_lock); - trace_xfs_perag_clear_reclaim(mp, pag->pag_agno, -1, _RET_IP_); -} - -/* - * We set the inode flag atomically with the radix tree tag. - * Once we get tag lookups on the radix tree, this inode flag - * can go away. - */ -void -xfs_inode_set_reclaim_tag( - struct xfs_inode *ip) -{ - struct xfs_mount *mp = ip->i_mount; - struct xfs_perag *pag; - - pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); - spin_lock(&pag->pag_ici_lock); - spin_lock(&ip->i_flags_lock); - - radix_tree_tag_set(&pag->pag_ici_root, XFS_INO_TO_AGINO(mp, ip->i_ino), - XFS_ICI_RECLAIM_TAG); - xfs_perag_set_reclaim_tag(pag, ip->i_ino); - __xfs_iflags_set(ip, XFS_IRECLAIMABLE); - - spin_unlock(&ip->i_flags_lock); - spin_unlock(&pag->pag_ici_lock); - xfs_perag_put(pag); -} - - -STATIC void -xfs_inode_clear_reclaim_tag( - struct xfs_perag *pag, - xfs_ino_t ino) -{ - radix_tree_tag_clear(&pag->pag_ici_root, - XFS_INO_TO_AGINO(pag->pag_mount, ino), - XFS_ICI_RECLAIM_TAG); - xfs_perag_clear_reclaim_tag(pag); -} - -/* * Grab the inode for reclaim exclusively. * Return 0 if we grabbed it, non-zero otherwise. */ -- 2.7.0 From david@fromorbit.com Wed Apr 13 01:49:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id ACDAA7CA0 for ; Wed, 13 Apr 2016 01:49:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 798528F8033 for ; Tue, 12 Apr 2016 23:49:05 -0700 (PDT) X-ASG-Debug-ID: 1460530142-04cbb02e1d11fff0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id D4kfsfnoyiK85i8m for ; Tue, 12 Apr 2016 23:49:02 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2ApEADF6g1XNaAZLHlegzeBUIJyg3mfawEBAQEBAQaMEYVohBOGCAICAQECgT9NAQEBAQEBBwEBAQFBAUCEQQEBAQQnExweFQgDFQMJJQ8FJQMHLYgnwmwZhUCFE4ULhQoFmAiOA48ajyeEWyowiXoBAQE Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail04.adl6.internode.on.net with ESMTP; 13 Apr 2016 16:19:01 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aqEbk-0003yb-MW for xfs@oss.sgi.com; Wed, 13 Apr 2016 16:49:00 +1000 Date: Wed, 13 Apr 2016 16:49:00 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: Re: [PATCH 07/11] xfs: mark reclaimed inodes invalid earlier Message-ID: <20160413064900.GP567@dastard> X-ASG-Orig-Subj: Re: [PATCH 07/11] xfs: mark reclaimed inodes invalid earlier References: <1460525492-1170-1-git-send-email-david@fromorbit.com> <1460525492-1170-8-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460525492-1170-8-git-send-email-david@fromorbit.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: 1460530142 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28690 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 13, 2016 at 03:31:28PM +1000, Dave Chinner wrote: > From: Dave Chinner > > The last thing we do before using call_rcu() on an xfs_inode to be > freed is mark it as invalid. This means there is a window between > when we know for certain that the inode is going to be freed and > when we do actually mark it as "freed". > > This is important in the context of RCU lookups - we can look up the > inode, find that it is valid, and then use it as such not realising > that it is in the final stages of being freed. > > As such, mark the inode as being invalid the moment we know it is > going to be reclaimed. This can be done while we still hold the > XFS_ILOCK_EXCL and the flush lock in xfs_inode_reclaim, meaning that > it occurs well before we remove it from the radix tree, and that > the i_flags_lock, the XFS_ILOCK and the inode flush lock all act as > synchronisation points for detecting that an inode is about to go > away. > > For defensive purposes, this allows us to add a further check to > xfs_iflush_cluster to ensure we skip inodes that are being freed > after we grab the XFS_ILOCK_SHARED and the flush lock - we know that > if the inode number if valid while we have these locks held we know > that it has not progressed through reclaim to the point where it is > clean and is about to be freed. > > [bfoster: fixed __xfs_inode_clear_reclaim() using ip->i_ino after it > had already been zeroed.] And, of course, in reordering this I dropped this fix because it was handled by the reworking of tagging code to use pag->pag_agno. So I've brought that small change forward to this patch (using pag->pag_agno instead of deriving it from the ip->i_ino in __xfs_inode_clear_reclaim()). That means I have to rebase the later cleanup patch too, but the end result of the patch set is identical... Cheers, Dave. -- Dave Chinner david@fromorbit.com From prodjecta@reklamatabg.eu Wed Apr 13 06:26:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.4 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY, NORMAL_HTTP_TO_IP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0AA537CA0 for ; Wed, 13 Apr 2016 06:26:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CD2AA8F8033 for ; Wed, 13 Apr 2016 04:26:06 -0700 (PDT) X-ASG-Debug-ID: 1460546763-04cbb02e1c129230001-NocioJ Received: from reklamatabg.eu (reklamatabg.eu [37.157.191.235]) by cuda.sgi.com with ESMTP id XlCM2CVBHr4gDTm2 for ; Wed, 13 Apr 2016 04:26:03 -0700 (PDT) X-Barracuda-Envelope-From: prodjecta@reklamatabg.eu X-Barracuda-Apparent-Source-IP: 37.157.191.235 Received: from 94.156.237.35 by reklamatabg.eu (MDaemon PRO v9.6.1) with ESMTP id md50012668207.msg for ; Wed, 13 Apr 2016 14:28:36 +0300 To: xfs@oss.sgi.com Subject: =?UTF-8?B?0JDQutGC0YPQsNC70L3QviEg0KPQv9GA0LDQstC70LXQvdC40LUg0L3QsCDQv9GA0L7QtdC60YLQuA==?= Message-ID: <0b45377a7989c46f3cbc6be3ca9ca10b@94.156.237.35> X-ASG-Orig-Subj: =?UTF-8?B?0JDQutGC0YPQsNC70L3QviEg0KPQv9GA0LDQstC70LXQvdC40LUg0L3QsCDQv9GA0L7QtdC60YLQuA==?= Date: Wed, 13 Apr 2016 12:34:43 +0300 From: "=?UTF-8?B?0J/RgNC+0LTQttC10LrRgtCw?=" Reply-To: obucheniaprojecta@mail.bg MIME-Version: 1.0 X-Mailer-LID: 357 List-Unsubscribe: X-Mailer-RecptId: 14386554 X-Mailer-SID: 445 X-Mailer-Sent-By: 1 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Authenticated-Sender: prodjecta@reklamatabg.eu X-Lookup-Warning: EHLO lookup on 94.156.237.35 does not match 37.157.191.234 X-MDRemoteIP: 37.157.191.234 X-Return-Path: prodjecta@reklamatabg.eu X-Envelope-From: prodjecta@reklamatabg.eu X-MDaemon-Deliver-To: xfs@oss.sgi.com X-Barracuda-Connect: reklamatabg.eu[37.157.191.235] X-Barracuda-Start-Time: 1460546763 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MIME_HTML_ONLY, NORMAL_HTTP_TO_IP X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28694 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NORMAL_HTTP_TO_IP URI: Uses a dotted-decimal IP address in URL 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message

    Здравейте,
     
    Станете екÑперти в Управлението на проекти Ñ Ð½Ð°Ð¹-уÑпешните Ð¾Ð±ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¸ Ñе възползвайте от безвъзмездно финанÑиране.
     
    РегиÑтирайте Ñе Ñега Ñ Ð¾Ñ‚Ñтъпка до 40%:

     
    - "Управление на проекти - Подготовка за уÑпех", 18-20.05.2016 - най-уÑпешното обучение по Управление на проекти в БългариÑ, проведено до Ñега повече от 120 пъти!
     
    - "Разработване на проекти по програмите на Ð•С", 12-14.05.2016 - най-пълното и най-подробно обучение по темата, Ñ Ð¿Ñ€ÐµÐ´ÑтавÑне на реални проекти
     
    - Сертифициране по управление на проекти PRINCE2® Foundation, 20-22.06.2016 - близо 100% уÑпех на изпита
     
    - Сертифициране PRINCE2® Practitioner Ñ Ð¸Ð·Ð¿Ð¸Ñ‚ на 22.06.2016 
     
    - Подготовка за Ñертификати Project Management Professional (PMP®)/CAPM®, 15-18.06.2016 - най-добриÑÑ‚ подготвителен ÐºÑƒÑ€Ñ Ð·Ð° PMP®
     
    - Сертифициране Agile Project Management (AgilePM®), 29.06-01.07.2016 - 100% уÑпех на изпита до момента
     
    - Подготовка за Ñертификати на Международната аÑÐ¾Ñ†Ð¸Ð°Ñ†Ð¸Ñ Ð¿Ð¾ управление на проекти (IPMA)
     
    - "Зелен поÑÑ Ð¿Ð¾ ИзготвÑне и изпълнение на проекти по програмите на ЕС (2014-2020)" - единÑтвената Ñертификационна програма по темата

     
    Ðктуални процедури за безвъзмездно финанÑиране от ЕС, по които работим в момента. Свържете Ñе Ñ Ð½Ð°Ñ Ð·Ð° безплатна конÑултациÑ, за да разберете какви Ñа вашите шанÑове за финанÑиране:
     

    -        Процедура „Подкрепа за разработване на иновации от Ñтартиращи предприÑтиÑ

    -        Процедура „Добри и безопаÑни уÑÐ»Ð¾Ð²Ð¸Ñ Ð½Ð° труд“

    -        Процедура "Енергийна ефективноÑÑ‚ в МСП"

     

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

     

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

    Ðамери ни на Facebook.com/UpravlenieNaProekti

    Запознай Ñе Ñ Ð½Ð°Ñ Ð·Ð° 2 минути. Виж нашето ЗÐБÐÐ’ÐО видео!

      


    СъглaÑно закона за електрoнна Ñ‚ÑŠÑ€Ð³Ð¾Ð²Ð¸Ñ Ð§Ð». 6, ал. 1 Ви уведомÑваме, че е възможно това да е непoиÑкано търгoвÑко Ñъобщeние.
    То е eднократно изпрaтено пиÑмо до Ð’aÑˆÐ¸Ñ e-mail адреÑ, който е взет от публичнoто прoÑтранÑтво.
    ИзвинÑваме Ñе за причиненото неудобÑтво, ако Ñме Ви притеÑнили Ñ Ð½Ð°ÑˆÐµÑ‚Ð¾ предложение.
    Ðко не желаете да пoлучавaте ÑÑŠoбщeÐ½Ð¸Ñ Ð¾Ñ‚ "ПРОДЖЕКТÐ", Ð¼Ð¾Ð»Ñ ÐºÐ»Ð¸ÐºÐ½ÐµÑ‚Ðµ ОТПИСВÐÐЕ за автоматично отпиÑване!


    From eguan@redhat.com Wed Apr 13 06:56:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0A9DB7CA0 for ; Wed, 13 Apr 2016 06:56:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B5BD0304062 for ; Wed, 13 Apr 2016 04:56:31 -0700 (PDT) X-ASG-Debug-ID: 1460548589-04bdf0110343f2b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id zENNsJgSFI13fEtp (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 04:56:30 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E208FC04B300; Wed, 13 Apr 2016 11:56:29 +0000 (UTC) Received: from localhost (dhcp-12-159.nay.redhat.com [10.66.12.159]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DBuSnA019193; Wed, 13 Apr 2016 07:56:29 -0400 From: Eryu Guan To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, Eryu Guan Subject: [PATCH v2] xfs/259: test more block sizes and handle minimum block size correctly Date: Wed, 13 Apr 2016 19:56:21 +0800 X-ASG-Orig-Subj: [PATCH v2] xfs/259: test more block sizes and handle minimum block size correctly Message-Id: <1460548581-26505-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460548590 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Currently xfs/259 tests against TEST_DIR for CRC support status to decide whether 512 block size should be tested, which is wrong for this test, because configuration of TEST_DIR is not controlled by test harness and can be different to the configuration being used in the test. Fix it by reversing the block size order that's tested and capture the output of the actual mkfs command that is being tested, and determine if 512 byte block sizes should be tested based on that output. While we're at it, I think the test matrix can be enlarged as well, 4k, 2k, 1k and 512 block size can be tested in each fs size boundary, not only the minimum block size. Suggested-by: Dave Chinner Signed-off-by: Eryu Guan --- v2: - take Dave's suggestion, and make changes only to xfs/259. Thanks Dave and Christoph for spending their time on such a corner case. - test more block sizes tests/xfs/259 | 47 ++++++++++++++++++++++++----------------------- tests/xfs/259.out | 20 ++++++++++++++++---- 2 files changed, 40 insertions(+), 27 deletions(-) diff --git a/tests/xfs/259 b/tests/xfs/259 index 16c1935..17f3c6d 100755 --- a/tests/xfs/259 +++ b/tests/xfs/259 @@ -51,32 +51,33 @@ testfile=$TEST_DIR/259.image # Test various sizes slightly less than 4 TB. Need to handle different # minimum block sizes for CRC enabled filesystems, but use a small log so we # don't write lots of zeros unnecessarily. -xfs_info $TEST_DIR | _filter_mkfs 2> $tmp.mkfs > /dev/null -. $tmp.mkfs -if [ $_fs_has_crcs -eq 1 ]; then - blocksize=1024 - sizes_to_check="1024 2048 4096" - echo "Trying to make (4 TB - 512) B long xfs fs image" -else - blocksize=512 - sizes_to_check="512 1024 2048 4096" -fi - +sizes_to_check="4096 2048 1024 512" +blocksizes="4096 2048 1024 512" four_TB=$(_math "2^42") +# The initial value of _fs_has_crcs is not important, because we start testing +# with 4096 block size, it only matters for 512 block size test +_fs_has_crcs=0 for del in $sizes_to_check; do - ddseek=$(_math "$four_TB - $del") - echo "Trying to make (4 TB - $del) B long xfs fs image" - rm -f "$testfile" - dd if=/dev/zero "of=$testfile" bs=1 count=0 seek=$ddseek \ - >/dev/null 2>&1 || echo "dd failed" - lofile=$(losetup -f) - losetup $lofile "$testfile" - "$MKFS_XFS_PROG" -l size=32m -b size=$blocksize $lofile \ - >/dev/null || echo "mkfs failed!" - sync - losetup -d $lofile + for bs in $blocksizes; do + echo "Trying to make (4TB - ${del}B) long xfs, block size $bs" + # skip tests with 512 block size if the fs created has crc + # enabled by default + if [ $_fs_has_crcs -eq 1 -a $bs -eq 512 ]; then + break; + fi + ddseek=$(_math "$four_TB - $del") + rm -f "$testfile" + dd if=/dev/zero "of=$testfile" bs=1 count=0 seek=$ddseek \ + >/dev/null 2>&1 || echo "dd failed" + lofile=$(losetup -f) + losetup $lofile "$testfile" + $MKFS_XFS_PROG -l size=32m -b size=$bs $lofile | _filter_mkfs \ + >/dev/null 2> $tmp.mkfs || echo "mkfs failed!" + . $tmp.mkfs + sync + losetup -d $lofile + done done status=0 - exit diff --git a/tests/xfs/259.out b/tests/xfs/259.out index 6e0be9a..9fc4920 100644 --- a/tests/xfs/259.out +++ b/tests/xfs/259.out @@ -1,5 +1,17 @@ QA output created by 259 -Trying to make (4 TB - 512) B long xfs fs image -Trying to make (4 TB - 1024) B long xfs fs image -Trying to make (4 TB - 2048) B long xfs fs image -Trying to make (4 TB - 4096) B long xfs fs image +Trying to make (4TB - 4096B) long xfs, block size 4096 +Trying to make (4TB - 4096B) long xfs, block size 2048 +Trying to make (4TB - 4096B) long xfs, block size 1024 +Trying to make (4TB - 4096B) long xfs, block size 512 +Trying to make (4TB - 2048B) long xfs, block size 4096 +Trying to make (4TB - 2048B) long xfs, block size 2048 +Trying to make (4TB - 2048B) long xfs, block size 1024 +Trying to make (4TB - 2048B) long xfs, block size 512 +Trying to make (4TB - 1024B) long xfs, block size 4096 +Trying to make (4TB - 1024B) long xfs, block size 2048 +Trying to make (4TB - 1024B) long xfs, block size 1024 +Trying to make (4TB - 1024B) long xfs, block size 512 +Trying to make (4TB - 512B) long xfs, block size 4096 +Trying to make (4TB - 512B) long xfs, block size 2048 +Trying to make (4TB - 512B) long xfs, block size 1024 +Trying to make (4TB - 512B) long xfs, block size 512 -- 2.5.5 From bfoster@redhat.com Wed Apr 13 07:12:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8E7F47CA0 for ; Wed, 13 Apr 2016 07:12:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 599938F8033 for ; Wed, 13 Apr 2016 05:12:21 -0700 (PDT) X-ASG-Debug-ID: 1460549537-04cb6c246243ee50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8eOb2ZOWHdDIxMED (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 05:12:18 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B121A62640; Wed, 13 Apr 2016 12:12:17 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-153.bos.redhat.com [10.18.41.153]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DCCG9W000866; Wed, 13 Apr 2016 08:12:16 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id B922C125438; Wed, 13 Apr 2016 08:12:15 -0400 (EDT) Date: Wed, 13 Apr 2016 08:12:15 -0400 From: Brian Foster To: Andrew Ryder Cc: xfs@oss.sgi.com Subject: Re: xfs_repair fails after trying to format log cycle? Message-ID: <20160413121214.GA2775@bfoster.bfoster> X-ASG-Orig-Subj: Re: xfs_repair fails after trying to format log cycle? References: <56F6DE67.60403@shaw.ca> <20160328085541.GA27040@bfoster.bfoster> <570C8D4D.3060304@shaw.ca> <20160412140512.GA59690@bfoster.bfoster> <570D578D.5010706@shaw.ca> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <570D578D.5010706@shaw.ca> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Wed, 13 Apr 2016 12:12:17 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460549538 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Apr 12, 2016 at 04:16:13PM -0400, Andrew Ryder wrote: > On 04/12/2016 10:05 AM, Brian Foster wrote: > >On Tue, Apr 12, 2016 at 01:53:17AM -0400, Andrew Ryder wrote: > >> > >> > >>On 03/28/2016 04:55 AM, Brian Foster wrote: ... > >What happens if you manually issue the read call that failed? E.g., > >umount the filesystem and run the following command directly against the > >array: > > > >xfs_io -dc "pread 3001552175104 2097152" /dev/md2 > > > >Brian > > It failed with the same error. I've attached the strace output for the > command. > Thanks, well that is interesting. The larger 2MB read eventually results in this smaller (4k) read that fails: 16:02:14.221784 pread64(3, 0x1ce7000, 4096, 3001553125376) = -1 EIO (Input/output error) So you could repeat that command with offset 3001553125376 and size 4k and just confirm that still fails. As Dave points out, something is wrong with the storage here and that is what needs to be resolved. With regard to the xfs_repair behavior... you're initially hitting a read error when the filesystem scans through the log looking for the head and tail to determine whether the log is dirty. If the log is zeroed, this sequence can be bypassed and the log assumed clean. I suspect by zeroing enough of the log before it fails, your repair sequence is just bypassing the log head/tail discovery that previously scanned areas of the disk that are having issues. In other words, it's just temporarily stepping around the problem until the log progresses back to this address range. What you probably have to do at this point is use the simple I/O error reproducer you have to try and determine why the storage returns an error. It could be anywhere from something broken in the md subsystem, to the controller driver, to a physical problem with the associated disk. I'd suggest to start by reporting to the md mailing list and work down from there... Brian > The array is fairly full so I'm wondering if something is out of alignment > somewhere thats causing this? > > /dev/md2 5858060288 5245630392 612429896 90% /mnt/md2 > > When I had the array plugged into another controller which isn't a > rocketraid card, it did complain about all the drives not being aligned > properly? Somehow it looks like sdk wasn't partitioned the same as the rest, > I'm wondering if thats screwing things up? > > GNU Parted 3.2 > Using /dev/sdi > Welcome to GNU Parted! Type 'help' to view a list of commands. > (parted) p > Model: ATA ST2000NC000-1CX1 (scsi) > Disk /dev/sdi: 2000GB > Sector size (logical/physical): 512B/512B > Partition Table: gpt > Disk Flags: > > Number Start End Size File system Name Flags > 1 1049kB 2000GB 2000GB > Number Start End Size File system Name Flags > 1 2048s 3907028991s 3907026944s > > > GNU Parted 3.2 > Using /dev/sdk > Welcome to GNU Parted! Type 'help' to view a list of commands. > (parted) p > Model: ATA ST2000DL001-9VT1 (scsi) > Disk /dev/sdk: 2000GB > Sector size (logical/physical): 512B/512B > Partition Table: msdos > Disk Flags: > > Number Start End Size Type File system Flags > 1 512B 2000GB 2000GB primary raid > Number Start End Size Type File system Flags > 1 1s 3907029167s 3907029167s primary raid > > > GNU Parted 3.2 > Using /dev/sdh > Welcome to GNU Parted! Type 'help' to view a list of commands. > (parted) p > Model: ATA ST2000DL001-9VT1 (scsi) > Disk /dev/sdh: 2000GB > Sector size (logical/physical): 512B/512B > Partition Table: gpt > Disk Flags: > > Number Start End Size File system Name Flags > 1 1049kB 2000GB 2000GB > Number Start End Size File system Name Flags > 1 2048s 3907028991s 3907026944s > > > GNU Parted 3.2 > Using /dev/sdm > Welcome to GNU Parted! Type 'help' to view a list of commands. > (parted) p > Model: ATA ST2000NC000-1CX1 (scsi) > Disk /dev/sdm: 2000GB > Sector size (logical/physical): 512B/512B > Partition Table: gpt > Disk Flags: > > Number Start End Size File system Name Flags > 1 1049kB 2000GB 2000GB > Number Start End Size File system Name Flags > 1 2048s 3907028991s 3907026944s > > > > > > >> > >>This all began when the RR2722 driver running under 3.18.15 complained and > >>.. > >> > >>Mar 14 07:23:07 Bigmouth kernel: [7177248.090541] /dev/vmnet: port on hub 0 > >>successfully opened > >>Mar 14 07:26:03 Bigmouth kernel: [7177424.552323] device eth1 left > >>promiscuous mode > >>Mar 14 07:26:03 Bigmouth kernel: [7177424.552786] bridge-eth1: disabled > >>promiscuous mode > >>Mar 14 20:10:20 Bigmouth kernel: [7223317.069464] rr272x_1x:Task file error, > >>StatusReg=0x51, ErrReg=0x84, LBA[0-3]=0x747dc92f,LBA[4-7]=0x0. > >>Mar 14 20:10:20 Bigmouth kernel: [7223317.179811] sd 5:0:1:0: [sdg] > >>Mar 14 20:10:21 Bigmouth kernel: [7223317.690439] Result: > >>hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK > >>Mar 14 20:10:21 Bigmouth kernel: [7223317.700480] sd 5:0:1:0: [sdg] CDB: > >>Mar 14 20:10:21 Bigmouth kernel: [7223318.211147] Write(10): 2a 00 74 7d c9 > >>00 00 00 40 00 > >>Mar 14 20:10:21 Bigmouth kernel: [7223318.211167] blk_update_request: I/O > >>error, dev sdg, sector 1954400512 > >>Mar 14 20:10:21 Bigmouth kernel: [7223318.211203] sd 5:0:3:0: [sdi] > >>Mar 14 20:10:21 Bigmouth kernel: [7223318.211206] Result: > >>hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK > >>Mar 14 20:10:21 Bigmouth kernel: [7223318.211209] sd 5:0:3:0: [sdi] CDB: > >>Mar 14 20:10:21 Bigmouth kernel: [7223318.211211] Write(10): 2a 00 74 7d c9 > >>00 00 00 40 00 > >>Mar 14 20:10:21 Bigmouth kernel: [7223318.211223] blk_update_request: I/O > >>error, dev sdi, sector 1954400512 > >>Mar 14 20:10:23 Bigmouth kernel: [7223319.957052] XFS (md2): metadata I/O > >>error: block 0x15d6d4900 ("xlog_iodone") error 5 numblks 64 > >>Mar 14 20:10:23 Bigmouth kernel: [7223319.957064] XFS (md2): > >>xfs_do_force_shutdown(0x2) called from line 1181 of file fs/xfs/xfs_log.c. > >>Return address = 0xffffffff812fdf96 > >>Mar 14 20:10:23 Bigmouth kernel: [7223319.957080] XFS (md2): Log I/O Error > >>Detected. Shutting down filesystem > >>Mar 14 20:10:23 Bigmouth kernel: [7223319.957083] XFS (md2): Please umount > >>the filesystem and rectify the problem(s) > >>Mar 14 20:10:23 Bigmouth kernel: [7223319.957093] XFS (md2): xfs_log_force: > >>error -5 returned. > >>Mar 14 20:10:50 Bigmouth kernel: [7223347.087272] XFS (md2): xfs_log_force: > >>error -5 returned. > >>Mar 14 20:11:20 Bigmouth kernel: [7223377.190469] XFS (md2): xfs_log_force: > >>error -5 returned. > >>Mar 14 20:11:50 Bigmouth kernel: [7223407.293952] XFS (md2): xfs_log_force: > >>error -5 returned. > >>Mar 14 20:12:20 Bigmouth kernel: [7223437.397444] XFS (md2): xfs_log_force: > >>error -5 returned. > >>Mar 14 20:12:23 Bigmouth kernel: [7223439.791407] nfsd: last server has > >>exited, flushing export cache > >>Mar 14 20:12:50 Bigmouth kernel: [7223467.500928] XFS (md2): xfs_log_force: > >>error -5 returned. > >>Mar 14 20:13:20 Bigmouth kernel: [7223497.604420] XFS (md2): xfs_log_force: > >>error -5 returned. > >>Mar 14 20:13:50 Bigmouth kernel: [7223527.707899] XFS (md2): xfs_log_force: > >>error -5 returned. > >>Mar 14 20:14:21 Bigmouth kernel: [7223557.811399] XFS (md2): xfs_log_force: > >>error -5 returned. > >>Mar 14 20:14:51 Bigmouth kernel: [7223587.914932] XFS (md2): xfs_log_force: > >>error -5 returned. > >>Mar 14 20:15:21 Bigmouth kernel: [7223618.018362] XFS (md2): xfs_log_force: > >>error -5 returned. > >>Mar 14 20:15:51 Bigmouth kernel: [7223648.121779] XFS (md2): xfs_log_force: > >>error -5 returned. > >>Mar 14 20:16:19 Bigmouth kernel: [7223676.401069] XFS (md2): xfs_log_force: > >>error -5 returned. > >>Mar 14 20:16:21 Bigmouth kernel: [7223678.225334] XFS (md2): xfs_log_force: > >>error -5 returned. > >>Mar 14 20:16:27 Bigmouth kernel: [7223684.541305] XFS (md2): xfs_log_force: > >>error -5 returned. > >>Mar 14 20:16:27 Bigmouth kernel: [7223684.572176] XFS (md2): xfs_log_force: > >>error -5 returned. > >>Mar 14 20:16:38 Bigmouth kernel: [7223694.918565] md2: unknown partition > >>table > >>Mar 14 20:16:43 Bigmouth kernel: [7223700.425290] XFS (md2): Mounting V5 > >>Filesystem > >>Mar 14 20:16:43 Bigmouth kernel: [7223700.545669] XFS (md2): Starting > >>recovery (logdev: internal) > >>Mar 14 20:16:44 Bigmouth kernel: [7223701.874245] XFS (md2): Ending recovery > >>(logdev: internal) > >>Mar 14 20:30:31 Bigmouth kernel: [7224529.528678] md2: unknown partition > >>table > >> > >> > >> > >>/dev/md2: > >> Version : 1.2 > >> Creation Time : Tue Oct 13 22:21:27 2015 > >> Raid Level : raid5 > >> Array Size : 5860147200 (5588.67 GiB 6000.79 GB) > >> Used Dev Size : 1953382400 (1862.89 GiB 2000.26 GB) > >> Raid Devices : 4 > >> Total Devices : 4 > >> Persistence : Superblock is persistent > >> > >> Intent Bitmap : Internal > >> > >> Update Time : Tue Apr 12 01:19:43 2016 > >> State : clean > >> Active Devices : 4 > >>Working Devices : 4 > >> Failed Devices : 0 > >> Spare Devices : 0 > >> > >> Layout : left-symmetric > >> Chunk Size : 512K > >> > >> Name : Bigmouth:2 (local to host Bigmouth) > >> UUID : ed979276:3459155c:a32f63da:0c684042 > >> Events : 62846 > >> > >> Number Major Minor RaidDevice State > >> 5 8 193 0 active sync /dev/sdm1 > >> 6 8 129 1 active sync /dev/sdi1 > >> 2 8 177 2 active sync /dev/sdl1 > >> 4 8 113 3 active sync /dev/sdh1 > >> > >> > >>meta-data=/dev/md2 isize=512 agcount=33, agsize=45782272 > >>blks > >> = sectsz=512 attr=2, projid32bit=1 > >> = crc=1 finobt=1 spinodes=0 > >>data = bsize=4096 blocks=1465036800, imaxpct=5 > >> = sunit=128 swidth=384 blks > >>naming =version 2 bsize=4096 ascii-ci=0 ftype=1 > >>log =internal bsize=4096 blocks=521728, version=2 > >> = sectsz=512 sunit=8 blks, lazy-count=1 > >>realtime =none extsz=4096 blocks=0, rtextents=0 > >> > >> > >>> > >>>> > >>>>Checking the drives with smartctl shows no errors nor does 'dmesg' show any > >>>>hardware i/o or controller related errors... > >>>> > >>>>I've tried scrubbing the array and no bad sectors are found either.. > >>>> > >>>>I'm running kernel 3.19.8 with xfsprogs 4.5. > >>>> > >>>>Thanks, > >>>>Andrew > >>>> > >>>>_______________________________________________ > >>>>xfs mailing list > >>>>xfs@oss.sgi.com > >>>>http://oss.sgi.com/mailman/listinfo/xfs > >>> > > > 16:02:14.159324 execve("/usr/sbin/xfs_io", ["xfs_io", "-dc", "pread 3001552175104 2097152", "/dev/md2"], [/* 51 vars */]) = 0 > 16:02:14.160220 brk(NULL) = 0x1ce4000 > 16:02:14.160345 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e4a2000 > 16:02:14.160508 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) > 16:02:14.160626 open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 > 16:02:14.160707 fstat(3, {st_mode=S_IFREG|0644, st_size=246250, ...}) = 0 > 16:02:14.160791 mmap(NULL, 246250, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f1c5e458000 > 16:02:14.160862 close(3) = 0 > 16:02:14.160959 open("/usr/lib64/libxcmd.so.0", O_RDONLY|O_CLOEXEC) = 3 > 16:02:14.161037 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@\37\0\0\0\0\0\0"..., 832) = 832 > 16:02:14.161111 fstat(3, {st_mode=S_IFREG|0755, st_size=26832, ...}) = 0 > 16:02:14.161184 mmap(NULL, 2128384, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c5e070000 > 16:02:14.161254 mprotect(0x7f1c5e076000, 2093056, PROT_NONE) = 0 > 16:02:14.161325 mmap(0x7f1c5e275000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5000) = 0x7f1c5e275000 > 16:02:14.161438 mmap(0x7f1c5e277000, 2560, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e277000 > 16:02:14.161525 close(3) = 0 > 16:02:14.161605 open("/lib64/libhandle.so.1", O_RDONLY|O_CLOEXEC) = 3 > 16:02:14.161683 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\17\0\0\0\0\0\0"..., 832) = 832 > 16:02:14.161755 fstat(3, {st_mode=S_IFREG|0755, st_size=14224, ...}) = 0 > 16:02:14.161826 mmap(NULL, 2113800, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c5de68000 > 16:02:14.161896 mprotect(0x7f1c5de6b000, 2093056, PROT_NONE) = 0 > 16:02:14.161965 mmap(0x7f1c5e06a000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f1c5e06a000 > 16:02:14.162049 mmap(0x7f1c5e06c000, 264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e06c000 > 16:02:14.162131 close(3) = 0 > 16:02:14.162210 open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 > 16:02:14.162287 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\7\2\0\0\0\0\0"..., 832) = 832 > 16:02:14.162359 fstat(3, {st_mode=S_IFREG|0755, st_size=1664768, ...}) = 0 > 16:02:14.162457 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e4a1000 > 16:02:14.162535 mmap(NULL, 3771992, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c5dac8000 > 16:02:14.162607 mprotect(0x7f1c5dc57000, 2097152, PROT_NONE) = 0 > 16:02:14.162679 mmap(0x7f1c5de57000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x18f000) = 0x7f1c5de57000 > 16:02:14.162764 mmap(0x7f1c5de5d000, 15960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c5de5d000 > 16:02:14.162849 close(3) = 0 > 16:02:14.162933 open("/lib64/libreadline.so.6", O_RDONLY|O_CLOEXEC) = 3 > 16:02:14.163013 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260d\1\0\0\0\0\0"..., 832) = 832 > 16:02:14.163084 fstat(3, {st_mode=S_IFREG|0555, st_size=415928, ...}) = 0 > 16:02:14.163155 mmap(NULL, 2518968, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c5d860000 > 16:02:14.163225 mprotect(0x7f1c5d8bd000, 2097152, PROT_NONE) = 0 > 16:02:14.163296 mmap(0x7f1c5dabd000, 36864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5d000) = 0x7f1c5dabd000 > 16:02:14.163389 mmap(0x7f1c5dac6000, 4024, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c5dac6000 > 16:02:14.163482 close(3) = 0 > 16:02:14.163568 open("/lib64/libncurses.so.6", O_RDONLY|O_CLOEXEC) = 3 > 16:02:14.163645 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320W\1\0\0\0\0\0"..., 832) = 832 > 16:02:14.163716 fstat(3, {st_mode=S_IFREG|0755, st_size=526008, ...}) = 0 > 16:02:14.163787 mmap(NULL, 2624120, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c5d5d8000 > 16:02:14.163857 mprotect(0x7f1c5d654000, 2093056, PROT_NONE) = 0 > 16:02:14.163927 mmap(0x7f1c5d853000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7b000) = 0x7f1c5d853000 > 16:02:14.164028 mmap(0x7f1c5d858000, 2680, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c5d858000 > 16:02:14.164113 close(3) = 0 > 16:02:14.164197 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e4a0000 > 16:02:14.164281 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e49f000 > 16:02:14.164355 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e49e000 > 16:02:14.164455 arch_prctl(ARCH_SET_FS, 0x7f1c5e49f700) = 0 > 16:02:14.164661 mprotect(0x7f1c5de57000, 16384, PROT_READ) = 0 > 16:02:14.164806 mprotect(0x7f1c5d853000, 16384, PROT_READ) = 0 > 16:02:14.165153 mprotect(0x7f1c5dabd000, 8192, PROT_READ) = 0 > 16:02:14.165231 mprotect(0x7f1c5e06a000, 4096, PROT_READ) = 0 > 16:02:14.165313 mprotect(0x7f1c5e275000, 4096, PROT_READ) = 0 > 16:02:14.165402 mprotect(0x618000, 4096, PROT_READ) = 0 > 16:02:14.165482 mprotect(0x7f1c5e499000, 4096, PROT_READ) = 0 > 16:02:14.165552 munmap(0x7f1c5e458000, 246250) = 0 > 16:02:14.165817 brk(NULL) = 0x1ce4000 > 16:02:14.165876 brk(0x1d05000) = 0x1d05000 > 16:02:14.165953 open("/usr/lib64/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3 > 16:02:14.166031 fstat(3, {st_mode=S_IFREG|0644, st_size=3832592, ...}) = 0 > 16:02:14.166103 mmap(NULL, 3832592, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f1c5d230000 > 16:02:14.166187 close(3) = 0 > 16:02:14.166394 open("/dev/md2", O_RDWR|O_DIRECT) = 3 > 16:02:14.166498 fstatfs(3, {f_type="TMPFS_MAGIC", f_bsize=4096, f_blocks=2560, f_bfree=2560, f_bavail=2560, f_files=8244585, f_ffree=8243843, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=4130}) = 0 > 16:02:14.166583 fstat(3, {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 > 16:02:14.166655 fstatfs(3, {f_type="TMPFS_MAGIC", f_bsize=4096, f_blocks=2560, f_bfree=2560, f_bavail=2560, f_files=8244585, f_ffree=8243843, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=4130}) = 0 > 16:02:14.166730 fstat(3, {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 > 16:02:14.166822 open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 4 > 16:02:14.166899 fstat(4, {st_mode=S_IFREG|0644, st_size=2997, ...}) = 0 > 16:02:14.166969 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e49d000 > 16:02:14.167040 read(4, "# Locale name alias data base.\n#"..., 4096) = 2997 > 16:02:14.167154 read(4, "", 4096) = 0 > 16:02:14.167223 close(4) = 0 > 16:02:14.167289 munmap(0x7f1c5e49d000, 4096) = 0 > 16:02:14.167405 open("/usr/share/locale/en_US.utf8/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = -1 ENOENT (No such file or directory) > 16:02:14.167488 open("/usr/share/locale/en_US/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = -1 ENOENT (No such file or directory) > 16:02:14.167564 open("/usr/share/locale/en.utf8/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = -1 ENOENT (No such file or directory) > 16:02:14.167637 open("/usr/share/locale/en/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = -1 ENOENT (No such file or directory) > 16:02:14.168062 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552175104) = 4096 > 16:02:14.168480 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552179200) = 4096 > 16:02:14.168744 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552183296) = 4096 > 16:02:14.168995 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552187392) = 4096 > 16:02:14.169235 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552191488) = 4096 > 16:02:14.169479 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552195584) = 4096 > 16:02:14.169717 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552199680) = 4096 > 16:02:14.169970 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552203776) = 4096 > 16:02:14.170215 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552207872) = 4096 > 16:02:14.170461 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552211968) = 4096 > 16:02:14.170700 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552216064) = 4096 > 16:02:14.170940 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552220160) = 4096 > 16:02:14.171177 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552224256) = 4096 > 16:02:14.171440 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552228352) = 4096 > 16:02:14.171680 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552232448) = 4096 > 16:02:14.171913 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552236544) = 4096 > 16:02:14.172148 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552240640) = 4096 > 16:02:14.172402 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552244736) = 4096 > 16:02:14.172652 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552248832) = 4096 > 16:02:14.172901 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552252928) = 4096 > 16:02:14.173135 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552257024) = 4096 > 16:02:14.173381 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552261120) = 4096 > 16:02:14.173626 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552265216) = 4096 > 16:02:14.173859 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552269312) = 4096 > 16:02:14.174095 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552273408) = 4096 > 16:02:14.174335 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552277504) = 4096 > 16:02:14.174591 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552281600) = 4096 > 16:02:14.174822 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552285696) = 4096 > 16:02:14.175053 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552289792) = 4096 > 16:02:14.175285 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552293888) = 4096 > 16:02:14.175528 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552297984) = 4096 > 16:02:14.175765 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552302080) = 4096 > 16:02:14.175988 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552306176) = 4096 > 16:02:14.176212 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552310272) = 4096 > 16:02:14.176596 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552314368) = 4096 > 16:02:14.176860 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552318464) = 4096 > 16:02:14.177083 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552322560) = 4096 > 16:02:14.177306 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552326656) = 4096 > 16:02:14.177535 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552330752) = 4096 > 16:02:14.177759 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552334848) = 4096 > 16:02:14.177981 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552338944) = 4096 > 16:02:14.178231 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552343040) = 4096 > 16:02:14.178469 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552347136) = 4096 > 16:02:14.178687 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552351232) = 4096 > 16:02:14.178915 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552355328) = 4096 > 16:02:14.179131 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552359424) = 4096 > 16:02:14.179404 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552363520) = 4096 > 16:02:14.179635 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552367616) = 4096 > 16:02:14.179856 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552371712) = 4096 > 16:02:14.180076 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552375808) = 4096 > 16:02:14.180299 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552379904) = 4096 > 16:02:14.180518 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552384000) = 4096 > 16:02:14.180738 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552388096) = 4096 > 16:02:14.180983 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552392192) = 4096 > 16:02:14.181204 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552396288) = 4096 > 16:02:14.181455 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552400384) = 4096 > 16:02:14.181677 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552404480) = 4096 > 16:02:14.181900 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552408576) = 4096 > 16:02:14.182122 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552412672) = 4096 > 16:02:14.182345 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552416768) = 4096 > 16:02:14.182585 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552420864) = 4096 > 16:02:14.182808 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552424960) = 4096 > 16:02:14.183041 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552429056) = 4096 > 16:02:14.183261 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552433152) = 4096 > 16:02:14.183486 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552437248) = 4096 > 16:02:14.183707 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552441344) = 4096 > 16:02:14.183943 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552445440) = 4096 > 16:02:14.184159 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552449536) = 4096 > 16:02:14.184398 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552453632) = 4096 > 16:02:14.184621 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552457728) = 4096 > 16:02:14.184836 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552461824) = 4096 > 16:02:14.185075 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552465920) = 4096 > 16:02:14.185292 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552470016) = 4096 > 16:02:14.189482 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552474112) = 4096 > 16:02:14.189973 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552478208) = 4096 > 16:02:14.190171 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552482304) = 4096 > 16:02:14.190360 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552486400) = 4096 > 16:02:14.190573 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552490496) = 4096 > 16:02:14.190745 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552494592) = 4096 > 16:02:14.190913 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552498688) = 4096 > 16:02:14.191098 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552502784) = 4096 > 16:02:14.191269 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552506880) = 4096 > 16:02:14.191478 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552510976) = 4096 > 16:02:14.191692 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552515072) = 4096 > 16:02:14.191879 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552519168) = 4096 > 16:02:14.192062 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552523264) = 4096 > 16:02:14.192246 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552527360) = 4096 > 16:02:14.192444 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552531456) = 4096 > 16:02:14.192625 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552535552) = 4096 > 16:02:14.192806 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552539648) = 4096 > 16:02:14.192990 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552543744) = 4096 > 16:02:14.193172 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552547840) = 4096 > 16:02:14.193351 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552551936) = 4096 > 16:02:14.193555 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552556032) = 4096 > 16:02:14.193736 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552560128) = 4096 > 16:02:14.193913 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552564224) = 4096 > 16:02:14.194094 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552568320) = 4096 > 16:02:14.194278 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552572416) = 4096 > 16:02:14.194468 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552576512) = 4096 > 16:02:14.194650 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552580608) = 4096 > 16:02:14.194829 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552584704) = 4096 > 16:02:14.195009 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552588800) = 4096 > 16:02:14.195193 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552592896) = 4096 > 16:02:14.195386 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552596992) = 4096 > 16:02:14.195579 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552601088) = 4096 > 16:02:14.195763 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552605184) = 4096 > 16:02:14.195957 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552609280) = 4096 > 16:02:14.196141 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552613376) = 4096 > 16:02:14.196321 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552617472) = 4096 > 16:02:14.196511 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552621568) = 4096 > 16:02:14.196697 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552625664) = 4096 > 16:02:14.197041 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552629760) = 4096 > 16:02:14.197239 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552633856) = 4096 > 16:02:14.197486 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552637952) = 4096 > 16:02:14.197689 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552642048) = 4096 > 16:02:14.197874 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552646144) = 4096 > 16:02:14.198057 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552650240) = 4096 > 16:02:14.198259 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552654336) = 4096 > 16:02:14.198446 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552658432) = 4096 > 16:02:14.198639 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552662528) = 4096 > 16:02:14.198823 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552666624) = 4096 > 16:02:14.199006 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552670720) = 4096 > 16:02:14.199188 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552674816) = 4096 > 16:02:14.199373 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552678912) = 4096 > 16:02:14.199569 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552683008) = 4096 > 16:02:14.199749 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552687104) = 4096 > 16:02:14.199929 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552691200) = 4096 > 16:02:14.200108 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552695296) = 4096 > 16:02:14.200304 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552699392) = 4096 > 16:02:14.200494 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552703488) = 4096 > 16:02:14.200684 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552707584) = 4096 > 16:02:14.200867 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552711680) = 4096 > 16:02:14.201047 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552715776) = 4096 > 16:02:14.201227 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552719872) = 4096 > 16:02:14.201417 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552723968) = 4096 > 16:02:14.201602 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552728064) = 4096 > 16:02:14.201782 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552732160) = 4096 > 16:02:14.201962 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552736256) = 4096 > 16:02:14.202153 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552740352) = 4096 > 16:02:14.202352 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552744448) = 4096 > 16:02:14.202564 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552748544) = 4096 > 16:02:14.202740 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552752640) = 4096 > 16:02:14.202920 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552756736) = 4096 > 16:02:14.203101 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552760832) = 4096 > 16:02:14.203284 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552764928) = 4096 > 16:02:14.203473 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552769024) = 4096 > 16:02:14.203654 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552773120) = 4096 > 16:02:14.203833 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552777216) = 4096 > 16:02:14.204014 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552781312) = 4096 > 16:02:14.204198 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552785408) = 4096 > 16:02:14.204409 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552789504) = 4096 > 16:02:14.204591 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552793600) = 4096 > 16:02:14.204770 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552797696) = 4096 > 16:02:14.204952 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552801792) = 4096 > 16:02:14.205135 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552805888) = 4096 > 16:02:14.205316 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552809984) = 4096 > 16:02:14.205502 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552814080) = 4096 > 16:02:14.205684 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552818176) = 4096 > 16:02:14.205865 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552822272) = 4096 > 16:02:14.206050 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552826368) = 4096 > 16:02:14.206240 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552830464) = 4096 > 16:02:14.206446 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552834560) = 4096 > 16:02:14.206626 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552838656) = 4096 > 16:02:14.206806 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552842752) = 4096 > 16:02:14.206988 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552846848) = 4096 > 16:02:14.207166 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552850944) = 4096 > 16:02:14.207344 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552855040) = 4096 > 16:02:14.207539 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552859136) = 4096 > 16:02:14.207724 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552863232) = 4096 > 16:02:14.207907 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552867328) = 4096 > 16:02:14.208084 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552871424) = 4096 > 16:02:14.208274 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552875520) = 4096 > 16:02:14.208494 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552879616) = 4096 > 16:02:14.208675 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552883712) = 4096 > 16:02:14.208858 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552887808) = 4096 > 16:02:14.209037 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552891904) = 4096 > 16:02:14.209217 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552896000) = 4096 > 16:02:14.209412 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552900096) = 4096 > 16:02:14.209595 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552904192) = 4096 > 16:02:14.209774 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552908288) = 4096 > 16:02:14.209953 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552912384) = 4096 > 16:02:14.210130 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552916480) = 4096 > 16:02:14.210320 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552920576) = 4096 > 16:02:14.210538 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552924672) = 4096 > 16:02:14.210723 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552928768) = 4096 > 16:02:14.210903 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552932864) = 4096 > 16:02:14.211084 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552936960) = 4096 > 16:02:14.211264 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552941056) = 4096 > 16:02:14.211452 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552945152) = 4096 > 16:02:14.211639 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552949248) = 4096 > 16:02:14.211831 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552953344) = 4096 > 16:02:14.212012 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552957440) = 4096 > 16:02:14.212194 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552961536) = 4096 > 16:02:14.212377 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552965632) = 4096 > 16:02:14.212579 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552969728) = 4096 > 16:02:14.212760 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552973824) = 4096 > 16:02:14.212939 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552977920) = 4096 > 16:02:14.213118 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552982016) = 4096 > 16:02:14.213298 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552986112) = 4096 > 16:02:14.213490 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552990208) = 4096 > 16:02:14.213672 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552994304) = 4096 > 16:02:14.213987 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552998400) = 4096 > 16:02:14.214237 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553002496) = 4096 > 16:02:14.214493 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553006592) = 4096 > 16:02:14.214760 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553010688) = 4096 > 16:02:14.215009 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553014784) = 4096 > 16:02:14.215258 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553018880) = 4096 > 16:02:14.215515 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553022976) = 4096 > 16:02:14.215774 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553027072) = 4096 > 16:02:14.216026 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553031168) = 4096 > 16:02:14.216273 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553035264) = 4096 > 16:02:14.216529 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553039360) = 4096 > 16:02:14.216801 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553043456) = 4096 > 16:02:14.217042 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553047552) = 4096 > 16:02:14.217302 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553051648) = 4096 > 16:02:14.217557 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553055744) = 4096 > 16:02:14.217821 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553059840) = 4096 > 16:02:14.218067 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553063936) = 4096 > 16:02:14.218312 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553068032) = 4096 > 16:02:14.218559 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553072128) = 4096 > 16:02:14.218801 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553076224) = 4096 > 16:02:14.219045 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553080320) = 4096 > 16:02:14.219287 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553084416) = 4096 > 16:02:14.219543 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553088512) = 4096 > 16:02:14.219794 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553092608) = 4096 > 16:02:14.220040 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553096704) = 4096 > 16:02:14.220286 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553100800) = 4096 > 16:02:14.220541 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553104896) = 4096 > 16:02:14.220787 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553108992) = 4096 > 16:02:14.221033 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553113088) = 4096 > 16:02:14.221280 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553117184) = 4096 > 16:02:14.221532 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553121280) = 4096 > 16:02:14.221784 pread64(3, 0x1ce7000, 4096, 3001553125376) = -1 EIO (Input/output error) > 16:02:14.222083 dup(2) = 4 > 16:02:14.222183 fcntl(4, F_GETFL) = 0x8402 (flags O_RDWR|O_APPEND|O_LARGEFILE) > 16:02:14.222290 open("/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) > 16:02:14.222448 open("/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) > 16:02:14.222616 open("/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) > 16:02:14.222693 open("/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) > 16:02:14.222786 fstat(4, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 9), ...}) = 0 > 16:02:14.222866 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e49d000 > 16:02:14.222954 write(4, "pread64: Input/output error\n", 28) = 28 > 16:02:14.223038 close(4) = 0 > 16:02:14.223103 munmap(0x7f1c5e49d000, 4096) = 0 > 16:02:14.223249 exit_group(0) = ? > 16:02:14.223594 +++ exited with 0 +++ > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From EricShang@zhaoxin.com Wed Apr 13 08:45:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7C0D77CA0 for ; Wed, 13 Apr 2016 08:45:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D4F6DAC004 for ; Wed, 13 Apr 2016 06:45:43 -0700 (PDT) X-ASG-Debug-ID: 1460555134-04cbb02e1b138e50001-NocioJ Received: from ZXSHCAS02.zhaoxin.com ([180.169.121.82]) by cuda.sgi.com with ESMTP id wBBX6oIiByc1Hk4I (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 06:45:38 -0700 (PDT) X-Barracuda-Envelope-From: EricShang@zhaoxin.com X-Barracuda-Apparent-Source-IP: 180.169.121.82 Received: from ZXSHMBX02.zhaoxin.com ([fe80::79f8:fe39:431e:beb8]) by ZXSHCAS02.zhaoxin.com ([::1]) with mapi id 14.03.0266.001; Wed, 13 Apr 2016 21:44:56 +0800 From: Eric Shang To: Matthew Wilcox , Toshi Kani CC: "akpm@linux-foundation.org" , "dan.j.williams@intel.com" , "viro@zeniv.linux.org.uk" , "ross.zwisler@linux.intel.com" , "kirill.shutemov@linux.intel.com" , "david@fromorbit.com" , "jack@suse.cz" , "tytso@mit.edu" , "adilger.kernel@dilger.ca" , "linux-nvdimm@lists.01.org" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-kernel@vger.kernel.org" Subject: ext4 error Thread-Topic: ext4 error X-ASG-Orig-Subj: ext4 error Thread-Index: AdGViWQD+9eM4SOlQAe9e4Q1QMF3cQ== Date: Wed, 13 Apr 2016 13:44:55 +0000 Message-ID: <0255994B402DE243B1DFC1057A00655201AC6F@ZXSHMBX02.zhaoxin.com> Accept-Language: zh-CN, en-US Content-Language: zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.30.24.50] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Barracuda-Connect: UNKNOWN[180.169.121.82] X-Barracuda-Start-Time: 1460555138 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.12 X-Barracuda-Spam-Status: No, SCORE=0.12 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28696 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS HI All: I meet an ext4 error, following is the error log. After panic, I check th= e emmc by the tool debufs, the inode 69878 i_nlink is not zero. And this in= ode don't belong to parent dir 6987, it belong to other file(this inode bel= ong to two files when check by debugfs ncheck), I guess than this inode has= beed deleted in memory and already used by other file. But the parent dent= ry buff_head not flush to emmc. But when lookup this dentry can't find it' = in dentry cache, and then lookup_real, read the dentry from emmc, get the f= ile inode which already be deleted.=20 Can any give me some help how to check this issue. My kernel version is 3= .18 form Android . I thinks something wrong with dentry cache flush and dir= ty buff_head flush to emmc. Thanks all! :Sending Trackball (ACTION_MOVE): 0:(-[44802.841647] EXT4-fs error (device = mmcblk0p16): ext4_lookup:1417: inode #69877: comm installd: deleted inode r= eferenced: 69878 5.0[44802.853210] Aborting journal on device mmcblk0p16-8. ,2.[44802.858345] Kernel panic - not syncing: EXT4-fs (device mmcblk0p16): = panic forced after error [44802.858345]=20 [44802.868322] CPU: 1 PID: 216 Comm: installd Tainted: P O 3.18= .0-94.02.04 #1 [44802.876223] [] (unwind_backtrace) from [] (show_stac= k+0x10/0x14) [44802.883927] [] (show_stack) from [] (dump_stack+0x70= /0xbc) [44802.891117] [] (dump_stack) from [] (panic+0xa4/0x21= 8) [44802.897965] [] (panic) from [] (ext4_handle_error+0x= 6c/0xa8) [44802.905330] [] (ext4_handle_error) from [] (__ext4_e= rror_inode+0x6c/0x114) [44802.913909] [] (__ext4_error_inode) from [] (ext4_lo= okup+0xf0/0x148) [44802.921970] [] (ext4_lookup) from [] (lookup_real+0x= 20/0x50) [44802.929336] [] (lookup_real) from [] (__lookup_hash+= 0x34/0x44) [44802.936873] [] (__lookup_hash) from [] (lookup_slow+= 0x38/0x9c) [44802.944414] [] (lookup_slow) from [] (path_lookupat+= 0x228/0x728) [44802.952127] [] (path_lookupat) from [] (filename_loo= kup+0x20/0xbc) [44802.960013] [] (filename_lookup) from [] (user_path_= at_empty+0x50/0x78) [44802.968334] [] (user_path_at_empty) from [] (user_pa= th_at+0x14/0x1c) [44802.976394] [] (user_path_at) from [] (vfs_fstatat+0= x48/0x8c) [44802.983847] [] (vfs_fstatat) from [] (SyS_fstatat64+= 0x14/0x30) [44802.991389] [] (SyS_fstatat64) from [] (ret_fast_sys= call+0x0/0x48) Best Regards EricShang=09 From toshi.kani@hpe.com Wed Apr 13 09:19:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 821777CA2 for ; Wed, 13 Apr 2016 09:19:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 40D4A304062 for ; Wed, 13 Apr 2016 07:19:05 -0700 (PDT) X-ASG-Debug-ID: 1460557143-04cbb02e1b1493a0001-NocioJ Received: from g9t5009.houston.hp.com (g9t5009.houston.hp.com [15.240.92.67]) by cuda.sgi.com with ESMTP id w5vkF3rvWbiiDI09 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 07:19:03 -0700 (PDT) X-Barracuda-Envelope-From: toshi.kani@hpe.com X-Barracuda-Apparent-Source-IP: 15.240.92.67 Received: from g4t3433.houston.hp.com (g4t3433.houston.hp.com [16.210.25.219]) by g9t5009.houston.hp.com (Postfix) with ESMTP id 121B84E; Wed, 13 Apr 2016 14:19:01 +0000 (UTC) Received: from misato.fc.hp.com (misato.fc.hp.com [16.78.168.61]) by g4t3433.houston.hp.com (Postfix) with ESMTP id 8152C46; Wed, 13 Apr 2016 14:18:56 +0000 (UTC) Message-ID: <1460556627.24985.28.camel@hpe.com> Subject: Re: ext4 error From: Toshi Kani X-ASG-Orig-Subj: Re: ext4 error To: Eric Shang , Matthew Wilcox Cc: "akpm@linux-foundation.org" , "dan.j.williams@intel.com" , "viro@zeniv.linux.org.uk" , "ross.zwisler@linux.intel.com" , "kirill.shutemov@linux.intel.com" , "david@fromorbit.com" , "jack@suse.cz" , "tytso@mit.edu" , "adilger.kernel@dilger.ca" , "linux-nvdimm@lists.01.org" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-kernel@vger.kernel.org" Date: Wed, 13 Apr 2016 08:10:27 -0600 In-Reply-To: <0255994B402DE243B1DFC1057A00655201AC6F@ZXSHMBX02.zhaoxin.com> References: <0255994B402DE243B1DFC1057A00655201AC6F@ZXSHMBX02.zhaoxin.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.18.5.2 (3.18.5.2-1.fc23) Mime-Version: 1.0 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: g9t5009.houston.hp.com[15.240.92.67] X-Barracuda-Start-Time: 1460557143 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28697 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, 2016-04-13 at 13:44 +0000, Eric Shang wrote: > HI All: >   I meet an ext4 error, following is the error log. After panic, I check the > emmc by the tool debufs, the inode 69878 i_nlink is not zero. And this inode > don't belong to parent dir 6987, it belong to other file(this inode belong to > two files when check by debugfs ncheck), I guess than this inode has beed > deleted in memory and already used by other file. But the parent dentry > buff_head not flush to emmc. But when lookup this dentry can't find it' in > dentry cache, and then lookup_real, read the dentry from emmc, get the file > inode which already be deleted. >   Can any give me some help how to check this issue. My kernel version is 3.18 > form Android . I thinks something wrong with dentry cache flush and dirty > buff_head flush to emmc. Thanks all! Are you somehow using DAX and my dax_get_unmapped_area patches in your Android 3.18 kernel? I doubt this is the case, but I thought I should check since you reported it to me and Matthew with the same cc list. If you are simply using a distributed Android kernel, you should report it to Android email list or bug tracker. -Toshi From BATV+2309eec8c18ee7cb3638+4616+infradead.org+hch@bombadil.srs.infradead.org Wed Apr 13 09:23:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 895F17CA2 for ; Wed, 13 Apr 2016 09:23:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0329CAC004 for ; Wed, 13 Apr 2016 07:23:18 -0700 (PDT) X-ASG-Debug-ID: 1460557393-04bdf0110445eab0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id P0m4dTXCw4ttq2l3 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 13 Apr 2016 07:23:13 -0700 (PDT) X-Barracuda-Envelope-From: BATV+2309eec8c18ee7cb3638+4616+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1aqLhE-0002Hh-4a; Wed, 13 Apr 2016 14:23:08 +0000 Date: Wed, 13 Apr 2016 07:23:08 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: axboe@kernel.dk, hch@infradead.org, tytso@mit.edu, martin.petersen@oracle.com, snitzer@redhat.com, linux-api@vger.kernel.org, bfoster@redhat.com, xfs@oss.sgi.com, linux-block@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, Christoph Hellwig Subject: Re: [PATCH 2/3] block: require write_same and discard requests align to logical block size Message-ID: <20160413142308.GA8429@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/3] block: require write_same and discard requests align to logical block size References: <20160413040121.10562.98998.stgit@birch.djwong.org> <20160413040135.10562.74550.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160413040135.10562.74550.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1460557393 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28697 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Apr 12, 2016 at 09:01:35PM -0700, Darrick J. Wong wrote: > Make sure that the offset and length arguments that we're using to > construct WRITE SAME and DISCARD requests are actually aligned to the > logical block size. Failure to do this causes other errors in other > parts of the block layer or the SCSI layer because disks don't support > partial logical block writes. FYI, Bart has just been posting a patchset in that includes this, but goes further. Can you take a look at it? From toshi.kani@hpe.com Wed Apr 13 10:03:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5A7097CA7 for ; Wed, 13 Apr 2016 10:03:46 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 261C28F8033 for ; Wed, 13 Apr 2016 08:03:43 -0700 (PDT) X-ASG-Debug-ID: 1460559815-04cb6c246046e250001-NocioJ Received: from g4t3428.houston.hp.com (g4t3428.houston.hp.com [15.201.208.56]) by cuda.sgi.com with ESMTP id 0MSYW1Emo8kSGmYQ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 08:03:35 -0700 (PDT) X-Barracuda-Envelope-From: toshi.kani@hpe.com X-Barracuda-Apparent-Source-IP: 15.201.208.56 Received: from g9t2301.houston.hp.com (g9t2301.houston.hp.com [16.216.185.78]) by g4t3428.houston.hp.com (Postfix) with ESMTP id A60CC52; Wed, 13 Apr 2016 15:03:34 +0000 (UTC) Received: from misato.fc.hp.com (misato.fc.hp.com [16.78.168.61]) by g9t2301.houston.hp.com (Postfix) with ESMTP id A57624C; Wed, 13 Apr 2016 15:03:32 +0000 (UTC) Message-ID: <1460559303.24985.52.camel@hpe.com> Subject: Re: [PATCH v2 1/5] dax: add dax_get_unmapped_area for pmd mappings From: Toshi Kani X-ASG-Orig-Subj: Re: [PATCH v2 1/5] dax: add dax_get_unmapped_area for pmd mappings To: Matthew Wilcox Cc: akpm@linux-foundation.org, dan.j.williams@intel.com, viro@zeniv.linux.org.uk, ross.zwisler@linux.intel.com, kirill.shutemov@linux.intel.com, david@fromorbit.com, jack@suse.cz, tytso@mit.edu, adilger.kernel@dilger.ca, linux-nvdimm@lists.01.org, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org Date: Wed, 13 Apr 2016 08:55:03 -0600 In-Reply-To: <20160413031801.GO2781@linux.intel.com> References: <1460493555-31611-1-git-send-email-toshi.kani@hpe.com> <1460493555-31611-2-git-send-email-toshi.kani@hpe.com> <20160413031801.GO2781@linux.intel.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.18.5.2 (3.18.5.2-1.fc23) Mime-Version: 1.0 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: g4t3428.houston.hp.com[15.201.208.56] X-Barracuda-Start-Time: 1460559815 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28698 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, 2016-04-12 at 23:18 -0400, Matthew Wilcox wrote: > On Tue, Apr 12, 2016 at 02:39:15PM -0600, Toshi Kani wrote: > > > > + * When the target file is not a DAX file, @addr is specified, the > > + * request is not suitable for pmd mappings, or mm- > > >get_unmapped_area() > > + * failed with extended @len, it simply calls the default handler, > > + * mm->get_unmapped_area(), with the original arguments. > > I think you can lose this paragraph.  It describes what the function > does, not why it does it ... and we can see what the function does from > reading the code. Agreed.  I will remove this paragraph. > I think this is one of those functions which is actually improved with > gotos, purely to reduce the indentation level. > > unsigned long dax_get_unmapped_area(struct file *filp, unsigned long > addr, > unsigned long len, unsigned long pgoff, unsigned long > flags) > { > unsigned long off, off_end, off_pmd, len_pmd, addr_pmd; > > if (!IS_ENABLED(CONFIG_FS_DAX_PMD) || >     !filp || addr || !IS_DAX(filp->f_mapping->host)) > goto out; > > off = pgoff << PAGE_SHIFT; > off_end = off + len; > off_pmd = round_up(off, PMD_SIZE); > if ((off_end <= off_pmd) || ((off_end - off_pmd) < PMD_SIZE)) > goto out; > > len_pmd = len + PMD_SIZE; > addr_pmd = current->mm->get_unmapped_area(filp, addr, len_pmd, > pgoff, flags); > > if (!IS_ERR_VALUE(addr_pmd)) { > addr_pmd += (off - addr_pmd) & (PMD_SIZE - 1); > return addr_pmd; > } > >  out: > return current->mm->get_unmapped_area(filp, addr, len, pgoff, > flags); > } Sounds good. > Now ... back to the original version, some questions: > > > > > +unsigned long dax_get_unmapped_area(struct file *filp, unsigned long > > addr, > > + unsigned long len, unsigned long pgoff, unsigned long > > flags) > > +{ > > + unsigned long off, off_end, off_pmd, len_pmd, addr_pmd; > > + > > + if (IS_ENABLED(CONFIG_FS_DAX_PMD) && > > +     filp && !addr && IS_DAX(filp->f_mapping->host)) { > > + off = pgoff << PAGE_SHIFT; > > + off_end = off + len; > > Can off + len wrap here, or did that get checked earlier? Yes, do_mmap() has checked this condition earlier.  But, I think I need to check it for (off + len_pmd). > > > > + off_pmd = round_up(off, PMD_SIZE); > > + > > + if ((off_end > off_pmd) && ((off_end - off_pmd) >= > > PMD_SIZE)) { > > We're only going to look for a PMD-aligned mapping if the mapping is at > least double PMD_SIZE?  I don't understand that decision.  Seems to me > that if I ask to map offset 4MB, length 2MB, I should get a PMD-aligned > mapping. It checks if this request can be covered by a PMD page.  'off_pmd' is the first PMD-aligned offset.  There needs to be at least 2MB from this offset to the end, 'off_end', in order to cover with a PMD page. In your example, 'off_pmd' is still 4MB, which has 2MB to the end.  So, so this request can be covered by a PMD page. Another example, say, offset 4KB and length 2MB.  'off_pmd' is 2MB, which has only 4KB to the end.  So, this request cannot be covered by a PMD page. > Speaking of offset, we don't have any checks that offset is a multiple > of PMD_SIZE.  I know that theoretically we could map offset 1.5MB, length > 3MB and see the first 0.5MB filled with small pages, then the next 2MB > filled with one large page, and the tail filled with small pages, but I > think we're better off only looking for PMD-alignment if the user asked > for an aligned offset in the file. Yes, that's what it checks.  In this case, 'off_pmd' is set to 2MB, which has 2.5MB to the end.  So, it can be covered by a PMD page.  The offset itself does not have to be aligned by 2MB. > > + len_pmd = len + PMD_SIZE; > > + > > + addr_pmd = current->mm->get_unmapped_area( > > + filp, addr, len_pmd, pgoff, > > flags); > > + > > + if (!IS_ERR_VALUE(addr_pmd)) { > > + addr_pmd += (off - addr_pmd) & > > (PMD_SIZE - 1); > > ... then you wouldn't need this calculation ;-) Applications should not be required to provide a 2MB-aligned offset. Thanks, -Toshi From jtulak@redhat.com Wed Apr 13 10:08:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 13D7E7CA7 for ; Wed, 13 Apr 2016 10:08:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D59C58F8033 for ; Wed, 13 Apr 2016 08:08:54 -0700 (PDT) X-ASG-Debug-ID: 1460560132-04cb6c2460470040001-NocioJ Received: from mail-io0-f171.google.com (mail-io0-f171.google.com [209.85.223.171]) by cuda.sgi.com with ESMTP id sEUR8hEpMTcoMwGq (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 13 Apr 2016 08:08:52 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.171 Received: by mail-io0-f171.google.com with SMTP id o126so73856143iod.0 for ; Wed, 13 Apr 2016 08:08:52 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=mangNoyB5toVI4ycDJ4BV+NZTOepSpxDPIHJwlI0oW4=; b=CcoFhKR3af89alIjp4r79iRLCtRNslr080Bi8kQzefEkKU6BZIpXTuHevjzWqLao9v aAvURuyqdbysdOgwj8p3ZXgtm+rkogqw/900VMtqyP4Z4OTk84ORqPwYBYiGTAlgR1Ck K2dEVVQLLMnysSGomTJaH8UK4Q34y5Wj3UK6LRncSb+mTtBcwi7IVqgw3iqSnWXK24Tp pDKONT2SVTISdX7AKmrNAAZldtAHZw4/nDtGu65WF06TNpOIj9e5Hyn4MWj9m700sIq1 uicAEcqJ2pVYk+0T0+S+cx62ai/HP5RVJzxsy/2KHbemzJFoT/PFQJ86sSk2kdpKMVaC qVig== X-Gm-Message-State: AOPr4FXEbTVy8jvJ2zfqF8R0/v3xRjn4h8qXPclwk3j+e8t9X/uD80sOktAno4FQcjUp2JB1ptai9JemNwLXAtmW X-Received: by 10.107.3.149 with SMTP id e21mr10072183ioi.46.1460560132441; Wed, 13 Apr 2016 08:08:52 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.79 with HTTP; Wed, 13 Apr 2016 08:08:33 -0700 (PDT) In-Reply-To: <20160408230843.GE567@dastard> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-18-git-send-email-jtulak@redhat.com> <20160408000910.GB21804@dastard> <20160408230843.GE567@dastard> From: Jan Tulak Date: Wed, 13 Apr 2016 17:08:33 +0200 Message-ID: Subject: Re: [PATCH 17/19] xfsprogs: disable truncating of files To: Dave Chinner X-ASG-Orig-Subj: Re: [PATCH 17/19] xfsprogs: disable truncating of files Cc: xfs-oss Content-Type: multipart/alternative; boundary=001a113eb35ede269b05305f277f X-Barracuda-Connect: mail-io0-f171.google.com[209.85.223.171] X-Barracuda-Start-Time: 1460560132 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28698 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 --001a113eb35ede269b05305f277f Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Sat, Apr 9, 2016 at 1:08 AM, Dave Chinner wrote: > On Fri, Apr 08, 2016 at 12:06:35PM +0200, Jan Tulak wrote: > > On Fri, Apr 8, 2016 at 2:09 AM, Dave Chinner > wrote: > > > > > On Thu, Mar 24, 2016 at 12:15:34PM +0100, jtulak@redhat.com wrote: > > > > From: Jan Tulak > > > > > > > > Unify mkfs.xfs behaviour a bit and never truncate files. If the use= r > > > > is trying to mkfs an existing file, we don't want to destroy anythi= ng > > > > he did with the file before (sparse file, allocations...) > > > > > > Why not? We do that with discard-by-default to block devices, > > > O_TRUNC is exactly the same situation with a file - we completely > > > re-initialise the file from a known state if mkfs has been asked to > > > create the file. > > > > > But AFAIK, we don't zero-out entire spindle devices, > > Unless the controller above them supports discard or whatever > implementation the storage protocol uses (e.g. UNMAP or WRITE_SAME). > e.g, the "spindle devices" often are big raid arrays that are using > thin provisioning, compression and dedupe internally, so running > discard on them does make a significant difference to their > behaviour. > > > we don't ask if the drive skips some blocks (i.e. because they are bad)= , > > That's irrelevant to the issue at hand. > > > and we don't care > > about what an underlaying layer (like LVM) did with the block device. > > Actually, we do, because users care about their storage stack doing > sane management operations automatically. > > That's why we issued a discard - it tells the underlying devices to > re-initialise the storage on this device *if they care about such > things*. Stuff like thinly provisioned devices rely on mkfs > behaviour like this to recycle used storage efficiently and > transparently. The user expects things to "just work" and this is > one of those things that makes it "just work". > > > From > > this point of view, we shouldn't care about the file either. > > > > I can be missing something, though. > > I think you're missing the fact that we don't know what the > *underlying storage* cares about, so we need to tell them in some > way that a device or image file is being re-initialised from > scratch. Whether that is by truncating the image file (so the > filesytem can issue discards on the now unused space) or by issuing > discard ioctls ourselves, it really doesn't matter. The key point is > that we have a mechanism that allows us to notify the underlying > storage of the "this is re-initialised storage" intent of mkfs. > > So from that perspective, the O_TRUNC behaviour should remain. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > All right=E2=80=8B, I will keep the O_TRUNC there. However, should it trunc= ate the file every time, or should we offer a way how to avoid the file truncating? Until now, mkfs behaved differently based on whether -d file was given, or not. Your explanation suggests that we should truncate every time, right? =E2=80=8BCheers, Jan=E2=80=8B --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --001a113eb35ede269b05305f277f Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable


    On Sat, Apr 9, 2016 at 1:08 AM, Dave Chinner <david@fromorb= it.com> wrote:
    On Fri, Apr 08, 2016 at 12:06:35PM +0200, Jan Tulak wrote:
    > On Fri, Apr 8, 2016 at 2:09 AM, Dave Chinner <david@fromorbit.com> wrote:
    >
    > > On Thu, Mar 24, 2016 at 12:15:34PM +0100, jtulak@redhat.com wrote:
    > > > From: Jan Tulak <jtu= lak@redhat.com>
    > > >
    > > > Unify mkfs.xfs behaviour a bit and never truncate files. If = the user
    > > > is trying to mkfs an existing file, we don't want to des= troy anything
    > > > he did with the file before (sparse file, allocations...) > >
    > > Why not? We do that with discard-by-default to block devices,
    > > O_TRUNC is exactly the same situation with a file - we completely=
    > > re-initialise the file from a known state if mkfs has been asked = to
    > > create the file.
    > >
    > But AFAIK, we don't zero-out entire spindle devices,

    Unless the controller above them supports discard or whatever
    implementation the storage protocol uses (e.g. UNMAP or WRITE_SAME).
    e.g, the "spindle devices" often are big raid arrays that are usi= ng
    thin provisioning, compression and dedupe internally, so running
    discard on them does make a significant difference to their
    behaviour.

    > we don't ask if the drive skips some blocks (i.e. because they are= bad),

    That's irrelevant to the issue at hand.

    > and we don't care
    > about what an underlaying layer (like LVM) did with the block device.<= br>
    Actually, we do, because users care about their storage stack doing<= br> sane management operations automatically.

    That's why we issued a discard - it tells the underlying devices to
    re-initialise the storage on this device *if they care about such
    things*. Stuff like thinly provisioned devices rely on mkfs
    behaviour like this to recycle used storage efficiently and
    transparently. The user expects things to "just work" and this is=
    one of those things that makes it "just work".

    > From
    > this point of view, we shouldn't care about the file either.
    >
    > I can be missing something, though.

    I think you're missing the fact that we don't know what the<= br> *underlying storage* cares about, so we need to tell them in some
    way that a device or image file is being re-initialised from
    scratch. Whether that is by truncating the image file (so the
    filesytem can issue discards on the now unused space) or by issuing
    discard ioctls ourselves, it really doesn't matter. The key point is that we have a mechanism that allows us to notify the underlying
    storage of the "this is re-initialised storage" intent of mkfs.
    So from that perspective, the O_TRUNC behaviour should remain.

    Cheers,

    Dave.
    --
    Dave Chinner
    david@fromorbit.com
    <= /blockquote>

    All right=E2=80=8B, I wil= l keep the O_TRUNC there. However, should it truncate the file every time, = or should we offer a way how to avoid the file truncating? Until now, mkfs = behaved differently based on whether -d file was given, or not. Your explan= ation suggests that we should truncate every time, right?
    =


    <= div class=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-serif= ">=E2=80=8BCheers,
    Jan=E2=80=8B


    --
    --001a113eb35ede269b05305f277f-- From njx172@sina.com Wed Apr 13 10:16:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 6E5CB7CB1 for ; Wed, 13 Apr 2016 10:16:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C5F1BAC007 for ; Wed, 13 Apr 2016 08:16:08 -0700 (PDT) X-ASG-Debug-ID: 1460560564-04cbb02e1d1611c0001-NocioJ Received: from smtp2911-210.mail.sina.com.cn (mail2-161.sinamail.sina.com.cn [60.28.2.161]) by cuda.sgi.com with SMTP id 20L34XpTsC5ait5U for ; Wed, 13 Apr 2016 08:16:05 -0700 (PDT) X-Barracuda-Envelope-From: njx172@sina.com X-Barracuda-Apparent-Source-IP: 60.28.2.161 Received: from unknown (HELO webmail.sinamail.sina.com.cn)([172.16.201.32]) by sina.com with SMTP 13 Apr 2016 23:16:04 +0800 (CST) X-Sender: njx172@sina.com X-SMAIL-MID: 6549511295252 Received: by webmail.sinamail.sina.com.cn (Postfix, from userid 496) id 559A64C007C; Wed, 13 Apr 2016 23:16:03 +0800 (CST) Date: Wed, 13 Apr 2016 23:16:03 +0800 Received: from njx172@sina.com([172.16.228.17]) by m0.mail.sina.com.cn via HTTP; Wed, 13 Apr 2016 23:16:03 +0800 (CST) Reply-To: njx172@sina.com From: "=?GBK?B?2nfR3sa8?=" To: "xfs" Subject: =?GBK?B?xvPStc341b69qMnosdjQ3rXEy8TMw7/O?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?GBK?B?xvPStc341b69qMnosdjQ3rXEy8TMw7/O?= X-Priority: 3 X-MessageID: 570e62b3c852adb X-Originating-IP: [172.16.201.32] X-Mailer: Sina WebMail 4.0 Content-Type: multipart/alternative; boundary="=-sinamail_alt_5abd9752ee9101a835dc0bdb596ee18c" Message-Id: <20160413151603.559A64C007C@webmail.sinamail.sina.com.cn> X-Barracuda-Connect: mail2-161.sinamail.sina.com.cn[60.28.2.161] X-Barracuda-Start-Time: 1460560564 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28698 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --=-sinamail_alt_5abd9752ee9101a835dc0bdb596ee18c Content-Type: text/plain; charset=GBK Content-Transfer-Encoding: base64 Content-Disposition: inline CgnN+NW+1q7N+NW+zvPH+AoKCgnM/cu1xOO08svj1/bN+NW+wvCjrMfXo6zH68KTz7XO0rj2yMvT ys/kOmFueW9ja2tlbmVAc2luYS5jb20K --=-sinamail_alt_5abd9752ee9101a835dc0bdb596ee18c Content-Type: text/html; charset=GBK Content-Transfer-Encoding: base64 Content-Disposition: inline PHA+CgnN+NW+1q7N+NW+zvPH+Ao8L3A+CjxwPgoJzP3LtcTjtPLL49f2zfjVvsLwo6zH16Osx+vC k8+1ztK49sjL08rP5DphbnlvY2trZW5lQHNpbmEuY29tCjwvcD4= --=-sinamail_alt_5abd9752ee9101a835dc0bdb596ee18c-- From darrick.wong@oracle.com Wed Apr 13 10:38:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9D4BB7CB4 for ; Wed, 13 Apr 2016 10:38:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6C0C18F8035 for ; Wed, 13 Apr 2016 08:38:44 -0700 (PDT) X-ASG-Debug-ID: 1460561922-04cb6c246247c930001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 1j7vYIXBjuuLVPyx (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 08:38:42 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u3DFcePH003698 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 13 Apr 2016 15:38:40 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u3DFceYh027313 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 13 Apr 2016 15:38:40 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u3DFcdcw008430; Wed, 13 Apr 2016 15:38:39 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 13 Apr 2016 08:38:39 -0700 Date: Wed, 13 Apr 2016 08:38:38 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 00/11 v3] xfs: inode reclaim vs the world Message-ID: <20160413153838.GC18517@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 00/11 v3] xfs: inode reclaim vs the world References: <1460525492-1170-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460525492-1170-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1460561922 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28698 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 > Subject: Re: [PATCH 00/11 v3] xfs: inode reclaim vs the world Does it also have to defeat seven evil X's? ;) --D On Wed, Apr 13, 2016 at 03:31:21PM +1000, Dave Chinner wrote: > Hi folks, > > The inode reclaim patchset has grown somewhat larger with all the > fixes I've accrued over the past couple of days for issues that have > been reported. I've just re-ordered the patchset to have all the bug > fixes that need to go into 4.6-rc up front, followed by other bug > fixes, followed by all the cleanups I wrote as I went along fixing > things. I want to get this out before LSFMM, so I'm posting this > before I've done a full verification that I've got the patches > correct, and they are still running through xfstests right now. > > Patch 1 is new - it fixes a regression introduced in 4.6-rc1 and is > caused by clearing the vfs inode i_mode in ->evict_inode, when there > is code in evict() that requires the mode to be intact until > ->destroy_inode. > > Patch 2 is new - if fixes the inode log item leak that left a dirty > log item on the AIL after the inode had been reclaimed, resulting in > unmountable filesystems and a couple of use-after-free vectors. > > Patch 3 is the original fix for the xfs_iflush_cluster lookup > validity checks that were incorect > > Patch 4 is the original fix for avoiding flushing stale inodes. > > Patch 5 is new, and comes from Alex @ Zadara to avoid having to > reallocate memory when tearing down the inode extent lists. This is > a necessary pre-requisite for patch 6. > > Patch 6 is the original patch that pushed all the inode memory > freeing into the RCU callback, so that xfs_iflush_cluster didn't > reference freed memory when racing with reclaim. > > Patch 7 is the original patch that made reclaim races eaasier to > detect. > > Patch 8 is the original patch that drops out of xfs-iflush_cluster > on the first inode beyond the end of the current cluster. > > Patch 9 is the original patch that renames the variables in > xfs_iflush_cluster(). > > Patch 10 and 11 are new patches that simplify the inode reclaim > tagging interfaces to remove dependencies on the struct xfs_inode > and the inode number where they are not actually required. > > -Dave. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From jtulak@redhat.com Wed Apr 13 10:43:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 288C87CB6 for ; Wed, 13 Apr 2016 10:43:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id DF3B68F8033 for ; Wed, 13 Apr 2016 08:43:36 -0700 (PDT) X-ASG-Debug-ID: 1460562215-04cb6c246247e4c0001-NocioJ Received: from mail-io0-f171.google.com (mail-io0-f171.google.com [209.85.223.171]) by cuda.sgi.com with ESMTP id Q5Lb3ebKtoVRlbMw (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 13 Apr 2016 08:43:35 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.171 Received: by mail-io0-f171.google.com with SMTP id o126so75261837iod.0 for ; Wed, 13 Apr 2016 08:43:35 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=7u8Md6QURm2SU+V7bumteEiKAned5mlc3zP5E4Pb7S4=; b=D2tL3EJvSKETsnbiznT1rd7m1SAoEeY+h1Cmd9mCgtY5RPCJbDhshuMOUr4CIWlBUu hTt1ANdpChtJCxxIbN0EdENRUngQEBnPCHG97QetKLjUnmkf/XPhe4X/RCMTZ+29rwDy DgnHTh1HNX00YuLux6LLQUxswpsBJQ3iJK2cYpARJSDotg+hETu/HD0Y3WzcdPgoNb5A GQ4BB8fPBoWldzFxubK/KFAEnUfEfwtYvRHWD16giV6o57XHnJD9AKtbUgq4eZQQ1D4Z H6wbeY3HV8mTK9HO5CoOADnpYOlEa4AF3QIk9e2A5JARRQDpeil6SI87a3hCnD3L40lY 4qLg== X-Gm-Message-State: AOPr4FWKAOQDNjvXJ8xoTv7k7ByI8770ck+P5mRMYamZ9C8qTdWIqNroZIqAGg1HKBruR5AO5ngghIUWYBG9wZYa X-Received: by 10.107.3.149 with SMTP id e21mr10272249ioi.46.1460562215077; Wed, 13 Apr 2016 08:43:35 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.79 with HTTP; Wed, 13 Apr 2016 08:43:15 -0700 (PDT) In-Reply-To: <5708811C.5090909@sandeen.net> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-16-git-send-email-jtulak@redhat.com> <5706FA7C.7020103@sandeen.net> <5708811C.5090909@sandeen.net> From: Jan Tulak Date: Wed, 13 Apr 2016 17:43:15 +0200 Message-ID: Subject: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices Cc: xfs-oss Content-Type: multipart/alternative; boundary=001a113eb35e00a3fb05305fa44a X-Barracuda-Connect: mail-io0-f171.google.com[209.85.223.171] X-Barracuda-Start-Time: 1460562215 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28698 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 --001a113eb35e00a3fb05305fa44a Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Sat, Apr 9, 2016 at 6:12 AM, Eric Sandeen wrote: > > > On 4/8/16 9:58 AM, Jan Tulak wrote: > > This one causes at least one interesting issue: > > > > #mkfs/mkfs.xfs > > Error accessing specified device (null): Bad address > > Usage: mkfs.xfs > > ... > > > > because: > > > > check_device_type(dfile, &xi.disfile, !dsize, !dfile, > > Nflag ? NULL : &xi.dcreat, > force_overwrite, "d"); > > > > so "dfile" can be NULL, but that function immediately tries to stat > it. > > > > > > =E2=80=8BA simple if NULL, then usage() should take care of this... > > Well, think hard about that. If dfile =3D=3D NULL and bails with usage()= , then > what is the point of having !dfile as a function argument? > > Validation of having a target specified as either -dfile=3D or as the las= t > argument > should probably happen before the call to check_device_type. > > But what about this? case D_NAME: xi.dname =3D getstr(value, &dopts, D_ NAME); [...] if (argc - optind > 1) { [print error] } else if (argc - optind =3D=3D 1) { dfile =3D xi.volname =3D getstr(argv[optind], &dopts, D_NAME); } else dfile =3D xi.dname;=E2=80=8B } [ =E2=80=8B... until the first occurence of dfile] check_device_type(dfile, &xi.disfile, !dsize, !dfile, Nflag ? NULL : &xi.dcreat, force_overwrite, "d"); =E2=80=8B =E2=80=8Bso if there is -d name=3D and nothing at the end, then dfile conta= ins D_NAME value. If there is a path at the end, then, then no matter about -d name, we have dfile filled with something. So I can't find a way how to have dfile =3D=3D NULL without omitting both a path as the last argument, and -dname... The no_name (!dfile) argument is in check_device_type() for a single reason - raising error on if (*isfile && (no_size || no_name)) But !string is true only when string=3D=3DNULL. For an empty string: !"" is= 0. So I don't see the reason for no_name argument at all - it seems to confuse, and in current use can be replaced with test to NULL, or !name. DTTO for xi.logname/xi.rtname. =E2=80=8BCheers, Jan=E2=80=8B --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --001a113eb35e00a3fb05305fa44a Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
    On Sat, Ap= r 9, 2016 at 6:12 AM, Eric Sandeen <sandeen@sandeen.net> wrote:


    On 4/8/16 9:58 AM, Jan Tulak wrote:
    >=C2=A0 =C2=A0 =C2=A0This one causes at least on= e interesting issue:
    >
    >=C2=A0 =C2=A0 =C2=A0#mkfs/mkfs.xfs
    >=C2=A0 =C2=A0 =C2=A0Error accessing specified device (null): Bad addres= s
    >=C2=A0 =C2=A0 =C2=A0Usage: mkfs.xfs
    >=C2=A0 =C2=A0 =C2=A0...
    >
    >=C2=A0 =C2=A0 =C2=A0because:
    >
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0check_device_type(dfile= , &xi.disfile, !dsize, !dfile,
    >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Nflag ? NULL : &xi.dcreat, for= ce_overwrite, "d");
    >
    >=C2=A0 =C2=A0 =C2=A0so "dfile" can be NULL, but that function= immediately tries to stat it.
    >
    >
    > =E2=80=8BA simple if NULL, then usage() should take care of this...
    Well, think hard about that.=C2=A0 If dfile =3D=3D NULL and bails wi= th usage(), then
    what is the point of having !dfile as a function argument?

    Validation of having a target specified as either -dfile=3D or as the last = argument
    should probably happen before the call to check_device_type.


    But what about this?

    = case D_NAME:
    =C2=A0 =C2=A0 =C2=A0 xi.dname =3D getstr(= value, &dopts, D_ =C2=A0 =C2=A0 NAME);

    <= /font>
    [...]

    if (argc - optind > = 1) {
    =C2=A0 =C2=A0 =C2=A0= [print error]
    } else if (argc - optind =3D=3D 1) {
    =C2=A0 =C2=A0 =C2=A0 =C2=A0dfile =3D xi.volna= me =3D getstr(argv[optind], &dopts, D_NAME);
    } else
    =C2=A0 =C2=A0 =C2=A0 =C2=A0dfile =3D xi.dname;=E2=80=8B
    = =C2=A0
    }

    [=E2=80=8B... until the first occurence of dfile]

    check_device_type(dfile, &xi.disfile, !dsize, !dfile,
    =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Nflag ? NULL : &xi.dcreat, force_= overwrite, "d");
    =E2=80=8B
    =E2=80=8Bso if there is -d name= =3D and nothing at the end, then dfile contains D_NAME value. If there is a= path at the end, then, then no matter about -d name, we have dfile filled = with something. So I can't find a way how to have dfile =3D=3D NULL wit= hout omitting both a path as the last argument, and -dname...

    <= /div>
    The no_name (!dfile) argument is in=C2=A0check_device_type() for a = single reason - raising error on
    if (*isfile && (no_size ||= no_name))

    But !string is true only when string=3D=3DN= ULL. For an empty string: !"" is 0. So I don't see the reason= for no_name argument at all - it seems to confuse, and in current use can = be replaced with test to NULL, or !name.

    DTTO for xi.l= ogname/xi.rtname.

    =E2=80=8BCheers,
    J= an=E2=80=8B

    --
    --001a113eb35e00a3fb05305fa44a-- From sandeen@sandeen.net Wed Apr 13 11:17:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4473F7CA0 for ; Wed, 13 Apr 2016 11:17:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1421A304062 for ; Wed, 13 Apr 2016 09:17:49 -0700 (PDT) X-ASG-Debug-ID: 1460564266-04cbb02e1b1745b0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id olGo2ShGLYCOr3AM for ; Wed, 13 Apr 2016 09:17:47 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 9FC5F14A15 for ; Wed, 13 Apr 2016 11:17:46 -0500 (CDT) Subject: Re: [PATCH 17/19] xfsprogs: disable truncating of files To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 17/19] xfsprogs: disable truncating of files References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-18-git-send-email-jtulak@redhat.com> <20160408000910.GB21804@dastard> <20160408230843.GE567@dastard> From: Eric Sandeen Message-ID: <570E7129.3080900@sandeen.net> Date: Wed, 13 Apr 2016 11:17:45 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1460564266 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28699 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/13/16 10:08 AM, Jan Tulak wrote: ... > All right​, I will keep the O_TRUNC there. However, should it > truncate the file every time, or should we offer a way how to avoid > the file truncating? Until now, mkfs behaved differently based on > whether -d file was given, or not. Your explanation suggests that we > should truncate every time, right? There are probably valid reasons to keep size as well as to truncate; it's not immediately clear to me how we should handle it. Honestly, at this point, in the interest of getting the other fixes in, I think I might rather see the truncating behavior unchanged from what we have today; we can tackle that as a separate problem at a later date. What do you think? -Eric > > ​Cheers, > Jan​ From jtulak@redhat.com Wed Apr 13 11:23:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 1AB627CA7 for ; Wed, 13 Apr 2016 11:23:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8E044AC003 for ; Wed, 13 Apr 2016 09:23:45 -0700 (PDT) X-ASG-Debug-ID: 1460564620-04bdf011054886b0001-NocioJ Received: from mail-ig0-f181.google.com (mail-ig0-f181.google.com [209.85.213.181]) by cuda.sgi.com with ESMTP id qPGonS4L1mkq9Gmw (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 13 Apr 2016 09:23:41 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.181 Received: by mail-ig0-f181.google.com with SMTP id f1so124781250igr.1 for ; Wed, 13 Apr 2016 09:23:41 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=KgWv5i7kUDVEup29hHyOH8dQQaO17KAvG6Tj0dEAFn4=; b=NxSSdduMK/TMceHChbHKIA3gQiylXpdo+Css+iXwT5vndnminhGEd64fGP/zaPAVf2 Rzu8ZMmVgry0r5NBQIqLDLXnbc3WsXgJx0OhI++Kp2A/NvKTJU3pDw4uiXVpJULdFEki gDwcwMaFkFdD4m36O+rvIXYsn4+Ser4qEj8WXuO96TBkhtkRxa2OhvNP9B4fw1xF+48J CsiEBMFPDP/w/deT/FLBdgOJ7Y9y97Hj524uwny7rC8bmHshKD2U+Ml/6ze5wyMV0KZ3 jR00CGqQXQer9HLWrHdwIJAEEhEPljMdd3vm0q+NOFc39ldAl0i8F2Em7CMlXVq4tmk2 8Cgg== X-Gm-Message-State: AOPr4FWlZURkLxApne4bNWkcitiIs/yF6iP0ThOFfVgWQzwhs9Pg4XydtbeRhDmyapO+m5Kd/iWHnWHBvaZgioZS X-Received: by 10.50.112.10 with SMTP id im10mr11604899igb.93.1460564620583; Wed, 13 Apr 2016 09:23:40 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.79 with HTTP; Wed, 13 Apr 2016 09:23:21 -0700 (PDT) In-Reply-To: <570E7129.3080900@sandeen.net> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-18-git-send-email-jtulak@redhat.com> <20160408000910.GB21804@dastard> <20160408230843.GE567@dastard> <570E7129.3080900@sandeen.net> From: Jan Tulak Date: Wed, 13 Apr 2016 18:23:21 +0200 Message-ID: Subject: Re: [PATCH 17/19] xfsprogs: disable truncating of files To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH 17/19] xfsprogs: disable truncating of files Cc: xfs-oss Content-Type: multipart/alternative; boundary=047d7b1637ad61cda40530603377 X-Barracuda-Connect: mail-ig0-f181.google.com[209.85.213.181] X-Barracuda-Start-Time: 1460564621 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28700 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 --047d7b1637ad61cda40530603377 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Wed, Apr 13, 2016 at 6:17 PM, Eric Sandeen wrote: > On 4/13/16 10:08 AM, Jan Tulak wrote: > > ... > > > All right=E2=80=8B, I will keep the O_TRUNC there. However, should it > > truncate the file every time, or should we offer a way how to avoid > > the file truncating? Until now, mkfs behaved differently based on > > whether -d file was given, or not. Your explanation suggests that we > > should truncate every time, right? > > There are probably valid reasons to keep size as well as to truncate; > it's not immediately clear to me how we should handle it. > > Honestly, at this point, in the interest of getting the other fixes in, > I think I might rather see the truncating behavior unchanged from what > we have today; we can tackle that as a separate problem at a later date. > > What do you think? > > =E2=80=8BFor keeping the size, the easiest way might be to implicitly set= xi.dsize (or whatever) to the current size. Of course, after a check for -d file,name,size combo. AFAIK (without looking to the code, I'm just ending for today and in the middle of shutting everything down :-) ), we =E2=80=8B= do the truncation after the combo check. So this should be no big issue... I will look on this tomorrow, to know better. Cheers, Jan --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --047d7b1637ad61cda40530603377 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable


    On Wed, Apr 13, 2016 at 6:17 PM, Eric Sandeen <sandeen@sand= een.net> wrote:
    On 4/13/16 10:08 AM, Jan = Tulak wrote:

    ...

    > All right=E2=80=8B, I will keep the O_TRUNC there. However, should it<= br> > truncate the file every time, or should we offer a way how to avoid > the file truncating? Until now, mkfs behaved differently based on
    > whether -d file was given, or not. Your explanation suggests that we > should truncate every time, right?

    There are probably valid reasons to keep size as well as to truncate= ;
    it's not immediately clear to me how we should handle it.

    Honestly, at this point, in the interest of getting the other fixes in,
    I think I might rather see the truncating behavior unchanged from what
    we have today; we can tackle that as a separate problem at a later date.
    What do you think?

    =E2=80=8BFor keeping the size, the easiest way mig= ht be to implicitly set xi.dsize (or whatever) to the current size. Of cour= se, after a check for -d file,name,size combo. AFAIK (without looking to th= e code, I'm just ending for today and in the middle of shutting everyth= ing down :-) ), we =E2=80=8Bdo the truncation after=C2=A0the combo ch= eck. So this should be no big issue... I will look on this tomorrow, to kno= w better.

    Cheers,
    Jan



    --=
    Jan Tulak
    jtulak@redhat.com= =C2=A0/ jan@tulak.me<= /div>
    --047d7b1637ad61cda40530603377-- From sandeen@sandeen.net Wed Apr 13 11:25:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 82DE17CA7 for ; Wed, 13 Apr 2016 11:25:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 544668F8033 for ; Wed, 13 Apr 2016 09:25:55 -0700 (PDT) X-ASG-Debug-ID: 1460564753-04cbb02e1d1756c0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id N7E7pnTMyqmbIsqX for ; Wed, 13 Apr 2016 09:25:53 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 44ACE14A15; Wed, 13 Apr 2016 11:25:53 -0500 (CDT) Subject: Re: [PATCH 17/19] xfsprogs: disable truncating of files To: Jan Tulak X-ASG-Orig-Subj: Re: [PATCH 17/19] xfsprogs: disable truncating of files References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-18-git-send-email-jtulak@redhat.com> <20160408000910.GB21804@dastard> <20160408230843.GE567@dastard> <570E7129.3080900@sandeen.net> Cc: xfs-oss From: Eric Sandeen Message-ID: <570E7310.1090806@sandeen.net> Date: Wed, 13 Apr 2016 11:25:52 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1460564753 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28699 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 4/13/16 11:23 AM, Jan Tulak wrote: > > > On Wed, Apr 13, 2016 at 6:17 PM, Eric Sandeen > wrote: > > On 4/13/16 10:08 AM, Jan Tulak wrote: > > ... > > > All right​, I will keep the O_TRUNC there. However, should it > > truncate the file every time, or should we offer a way how to avoid > > the file truncating? Until now, mkfs behaved differently based on > > whether -d file was given, or not. Your explanation suggests that we > > should truncate every time, right? > > There are probably valid reasons to keep size as well as to truncate; > it's not immediately clear to me how we should handle it. > > Honestly, at this point, in the interest of getting the other fixes in, > I think I might rather see the truncating behavior unchanged from what > we have today; we can tackle that as a separate problem at a later date. > > What do you think? > > ​For keeping the size, the easiest way might be to implicitly set > xi.dsize (or whatever) to the current size. Of course, after a check > for -d file,name,size combo. AFAIK (without looking to the code, I'm > just ending for today and in the middle of shutting everything down > :-) ), we ​do the truncation after the combo check. So this should be > no big issue... I will look on this tomorrow, to know better. I'm just saying; let's not change current behavior without good reason. If it requires a lot of discussion, let's keep current behavior in all cases for now, so that we can move the larger patchset forward. Thanks, -Eric From BATV+2309eec8c18ee7cb3638+4616+infradead.org+hch@bombadil.srs.infradead.org Wed Apr 13 11:41:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EB0CA7CA6 for ; Wed, 13 Apr 2016 11:41:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A9DF68F8037 for ; Wed, 13 Apr 2016 09:41:13 -0700 (PDT) X-ASG-Debug-ID: 1460565670-04bdf0110448a840001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 5b35dGIt1kfwizIn (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 13 Apr 2016 09:41:11 -0700 (PDT) X-Barracuda-Envelope-From: BATV+2309eec8c18ee7cb3638+4616+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1aqNqo-0004Ug-KY; Wed, 13 Apr 2016 16:41:10 +0000 Date: Wed, 13 Apr 2016 09:41:10 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com, viro@zeniv.linux.org.uk Subject: Re: [PATCH 01/11] xfs: we don't need no steekin ->evict_inode Message-ID: <20160413164110.GA8475@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 01/11] xfs: we don't need no steekin ->evict_inode References: <1460525492-1170-1-git-send-email-david@fromorbit.com> <1460525492-1170-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460525492-1170-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1460565671 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28700 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Al has been very unhappy about our destroy_inode abuse, and I'd reluctant to make it worse. Why do we need to play games with i_mode when freeing? From BATV+2309eec8c18ee7cb3638+4616+infradead.org+hch@bombadil.srs.infradead.org Wed Apr 13 11:41:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C03297CA6 for ; Wed, 13 Apr 2016 11:41:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 915D98F8035 for ; Wed, 13 Apr 2016 09:41:41 -0700 (PDT) X-ASG-Debug-ID: 1460565699-04cb6c246248ca70001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id LF36vL0l6Bpwvtcj (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 13 Apr 2016 09:41:40 -0700 (PDT) X-Barracuda-Envelope-From: BATV+2309eec8c18ee7cb3638+4616+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1aqNrH-0004ay-9Z; Wed, 13 Apr 2016 16:41:39 +0000 Date: Wed, 13 Apr 2016 09:41:39 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 02/11] xfs: xfs_iflush_cluster fails to abort on error Message-ID: <20160413164139.GB8475@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 02/11] xfs: xfs_iflush_cluster fails to abort on error References: <1460525492-1170-1-git-send-email-david@fromorbit.com> <1460525492-1170-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460525492-1170-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1460565699 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28699 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+2309eec8c18ee7cb3638+4616+infradead.org+hch@bombadil.srs.infradead.org Wed Apr 13 11:45:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 69C407CA0 for ; Wed, 13 Apr 2016 11:45:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 298C4304059 for ; Wed, 13 Apr 2016 09:45:13 -0700 (PDT) X-ASG-Debug-ID: 1460565911-04cbb02e1d178870001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id K0OVX1AAKqd0BQdA (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 13 Apr 2016 09:45:11 -0700 (PDT) X-Barracuda-Envelope-From: BATV+2309eec8c18ee7cb3638+4616+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1aqNuh-0006YI-0p; Wed, 13 Apr 2016 16:45:11 +0000 Date: Wed, 13 Apr 2016 09:45:11 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 05/11] xfs: optimise xfs_iext_destroy Message-ID: <20160413164510.GC8475@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 05/11] xfs: optimise xfs_iext_destroy References: <1460525492-1170-1-git-send-email-david@fromorbit.com> <1460525492-1170-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460525492-1170-6-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1460565911 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28699 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > /* > + * Remove all records from the indirection array. > + */ > +STATIC void > +xfs_iext_irec_remove_all( > + struct xfs_ifork *ifp) > +{ > + int nlists; > + int i; > + > + ASSERT(ifp->if_flags & XFS_IFEXTIREC); > + nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; > + for (i = 0; i < nlists; i++) { > + xfs_ext_irec_t *erp = &ifp->if_u1.if_ext_irec[i]; Can we avoid the typedef for new code? > + if (erp->er_extbuf) > + kmem_free(erp->er_extbuf); no need to check for NULL before a kmem_free, e.g. this whole loop could just be: for (i = 0; i < nlists; i++) kmem_free(ifp->if_u1.if_ext_irec[i].er_extbuf); > { > if (ifp->if_flags & XFS_IFEXTIREC) { > - int erp_idx; > - int nlists; > - > - nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; > - for (erp_idx = nlists - 1; erp_idx >= 0 ; erp_idx--) { > - xfs_iext_irec_remove(ifp, erp_idx); > - } > + xfs_iext_irec_remove_all(ifp); > ifp->if_flags &= ~XFS_IFEXTIREC; I'd be tempted to just move clearing of the flag into xfs_iext_irec_remove_all if we change the patch anyway. Otherwise this looks fine to me. From Joe.Lawrence@stratus.com Wed Apr 13 12:16:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5BFCF7CA4 for ; Wed, 13 Apr 2016 12:16:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 90D90AC003 for ; Wed, 13 Apr 2016 10:16:26 -0700 (PDT) X-ASG-Debug-ID: 1460567782-04bdf01103491e40001-NocioJ Received: from na01-bl2-obe.outbound.protection.outlook.com (mail-eopbgr640114.outbound.protection.outlook.com [40.107.64.114]) by cuda.sgi.com with ESMTP id 42WGfqFDw2AQpOoK (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 10:16:23 -0700 (PDT) X-Barracuda-Envelope-From: Joe.Lawrence@stratus.com X-Barracuda-Apparent-Source-IP: 40.107.64.114 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=StratusTechnologies.onmicrosoft.com; s=selector1-stratus-com; h=From:To:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=s1E6w5WWWxYox/8y0519lF0Pc3BmQ/6L+SI9dUDgl7o=; b=Qs9YpN3RsT3abljJvcT+9TwOfYwAG7AisLOzRKx7H5BqTOUtZTKYrhl6Jesn0PGYdqI+KkaQgMKHbgA8Xf6nu+3UfYcIa5nrC4oBJTOqkrmbo4F5pwOXpkqo4gRQcSUPBe5EbpWEq+cHZ/ShiXCYNuv+wfJPq0/IFdWXJQRXeB8= Authentication-Results: stratus.com; dkim=none (message not signed) header.d=none;stratus.com; dmarc=none action=none header.from=stratus.com; Received: from jlaw-desktop.mno.stratus.com (198.97.41.12) by CY1PR0801MB2249.namprd08.prod.outlook.com (10.167.11.26) with Microsoft SMTP Server (TLS) id 15.1.453.26; Wed, 13 Apr 2016 17:16:21 +0000 Subject: Re: list_add corruption after "xfs: mode di_mode to vfs inode" To: , X-ASG-Orig-Subj: Re: list_add corruption after "xfs: mode di_mode to vfs inode" References: <56FC9FA6.1080700@stratus.com> <20160401024413.GB2072@devil.localdomain> <20160412075423.GG9088@dastard> From: Joe Lawrence Message-ID: <570E7EE0.2020004@stratus.com> Date: Wed, 13 Apr 2016 13:16:16 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.0 MIME-Version: 1.0 In-Reply-To: <20160412075423.GG9088@dastard> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit X-Originating-IP: [198.97.41.12] X-ClientProxiedBy: BN3PR09CA0035.namprd09.prod.outlook.com (10.160.111.173) To CY1PR0801MB2249.namprd08.prod.outlook.com (10.167.11.26) X-MS-Office365-Filtering-Correlation-Id: eed8f7f3-a840-4786-82c7-08d363bf558d X-Microsoft-Exchange-Diagnostics: 1;CY1PR0801MB2249;2:GjzkznWIcvvuU8i5+QzAPMcTRG/jUKzHQGCpM9iurWDs+q3gTvjNluwY7kO4gDRYPmcIqDupnU1Ch7NkHU2ZThqluMZi//IvSZ9YYwJ5K62ZVn1+I8iKKtaX+XsvETywzrfv6sx+Q3IQAMpQTy5Wk6bwjnedoD0Hu04CaHOzzfPTJJLNdjcAg+oURrc5ZP+r;3:Oo0qQ8BDoCyxSONnnFgm4jilk4vcq+jGyAeCfxQ0T4xIIXvEXzKs5+6zAB4QhFf+9n4v++XnBgcP1y7pjerSujob85As/TqNA8/1mi1u+7IgSmrMZo6NpS9s947LCRYT;25:kpJ0c2T/RLQZNmhPiIxkNY1V01wnEQunAHxUtBcKUGhq31Vhvt3Tr1151lCpIGEnzztRYydv5tmbVtwuPez0cd13L36ttlOxl1t5ZJHUkjaZT6soZscVr9eVda84rlkkfijpFk0YKiAAfnLvH8DrBuSTXY4zJYJVO71RWf0nVJcaS9EmF34xPeK85f6rZaUOOGXec8zEA5n9NaFdTohsmllFCIudwmgBExdx+FDoKeZj1M2JtYcdyDueqE5OJ3kaQp8zf676e6OdlyUe/5GVdAZDgA3yWZlCy5CITb4dpWeDvNSMRh7wgY5at138AcigruIkx/t8eb3SwKnj6sKwlg== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0801MB2249; X-Microsoft-Exchange-Diagnostics: 1;CY1PR0801MB2249;20:Jfu/5/rCIyFd0duN2iJBiSEpDP06/30OriXTlDSV2jMV9Z9MbkG8K/qffsC/xVeqzBM3ozh2KyuiCxhhVJLWufRjqMGUlbOs7CD0pePRf8LEap2Ww9rFQSgoWSZ1YK0nQylyreU4KVqCTeMGn/1fgV8clENCCL02aQpZhCTWum02lHcgw+jqZEatSBhiYTsOyrN8slxhuTn4cmvkftqDdSWTXceIYokUH8EhUNio/2hMS6DLwDOzqDZA3g1j6IzxRM3uAAq3x73RQ0l3UupMhrxS20PIKAxBcsdWAH5WhmBN5WnZ1TMCLPjdwfpetuZ287RL+jp/XRCx6SXS9ib1+Iup0pPuKpA/NJ/UGFpteGByQK49G3FYfnbCmid4tLai3OVlIw0TzH2i7E4jWbdhmxKf8kwfTTRehOlppV32QcrV/cRlWdXTKJtkuRw1SK/P2/d0TblU4MSWXrPZI14+s2aGmXV6CS60Vt0hcESOEFSTt13i6B0CoCIWF19+JHq2;4:atsOyeRgT/p3Mxe/0dfrz3GBd1QntMK6j+M23LF7kR96jRWvKWd9245d+f9SbkWIVCGzFqDVoTpG0DTHHsG3AXxhxXmvvIxYMu2yUb9MCyUHnfrlYuAULFUb3T3TUgyq+j+GgsyQt3MHlxWvHo2HkIrR4RhUse4pwkqVGr2i/gMlrfEnuTJeuD5M3cqjk29OSKLmEBRLnszmj7DDdMPP/VvZVl/yp1uKissHEE3VM0Xw7wXghGp4qPEotgSkmL4Ls+HWF0Mi4LiVWHjLwBrSdbJC/Wj11s0I0DTWZtm8w4TLLfDGJ/5S9lySWbXTFG2tdGteHY/UDAIfbdrXUHJ3crTx29feQv7KCJDLIqwwGN4Yxa2nG4oKWUQ6CKprF8Hf X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046);SRVR:CY1PR0801MB2249;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0801MB2249; X-Forefront-PRVS: 0911D5CE78 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(43784003)(377454003)(24454002)(42186005)(66066001)(5008740100001)(47776003)(65806001)(586003)(5004730100002)(19580405001)(2950100001)(86362001)(5001770100001)(4001350100001)(107886002)(77096005)(189998001)(3846002)(6116002)(33656002)(87266999)(54356999)(64126003)(230700001)(65816999)(50986999)(92566002)(81166005)(76176999)(2906002)(19580395003)(50466002)(1096002)(23746002)(36756003)(83506001)(80316001);DIR:OUT;SFP:1102;SCL:1;SRVR:CY1PR0801MB2249;H:jlaw-desktop.mno.stratus.com;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?Windows-1252?Q?1;CY1PR0801MB2249;23:v6Ad9p0zGWYZXIM2vVws204itsqsdHWvG/9?= =?Windows-1252?Q?PF6mYChDaSSH9xia+YlsO5OaUi+iWvwlzQi8Ea7BRD9avlJTBqvrKCpE?= =?Windows-1252?Q?nDGdikMBqRebtx3iQb3PVsDksjDfvv/AHadD+TBi2Xa5PvGwM14cUYEh?= =?Windows-1252?Q?ty2Gfgs7YgHmv/2qVh1KzVl9QVEc5xjmAB/ouBlb7MbxPpcDyVJd7/VO?= =?Windows-1252?Q?DeLZbSc9fbaymhQjET+zLGN8uXVDhwQD6uiIkqmS7TpR13jfbQjLetJl?= =?Windows-1252?Q?E5PLU9f8FZ0P3uTFQbUTxmpIVrhXO8huuOFlvvks0e81aFGwHk9Mqi6a?= =?Windows-1252?Q?OX98AYSLB2fA+7DyyRi+oFoDRmnSOUYKXWrMTuxb55U/F6esMxVh+/ZB?= =?Windows-1252?Q?ov9ZCjr5uLhxIqiK05lJGojxp+TIHYg/Zm0cCWDrGpgfU2w0W0t/4Yj6?= =?Windows-1252?Q?9DnJOP2uhcCDgloxXXD3xsDd22BfXmTepQLXqhvFgf/O8QhgPTC20fnF?= =?Windows-1252?Q?lBVEBzsqxhSQAEi1Vk/Qq4dQkqZKfe4gZHxuN6UFO21bR3pA8VE+yS3f?= =?Windows-1252?Q?YLGUWIibXUrofUvGr14rVWboXHbH9ZLSyrMAJd3dyeVwijTNNXTfZkLm?= =?Windows-1252?Q?f/Ar+nO4PdHV+vfY6EffTTJr6F7qPkBXdGW07Rlqw1vQ+6kv8Ay28eTN?= =?Windows-1252?Q?vKLOdNTvCuYkpZluGGB5245369Bwq5lLFTUG2HxAaBsjINHXfO1xpi5b?= =?Windows-1252?Q?rqCmfgRAqnu/zRo3WP9tHMVaqmLX6SxaYj6aekpXV+TqJbX9QpN/yMOF?= =?Windows-1252?Q?EJHXl6sypJo6+bhFrGjwDHyUvyOq5MAQ+xINAQe2OoUqAUkitBqSIoUf?= =?Windows-1252?Q?repnkngdajr0WzCnNmiLMzCVXpvM5TR9KpAhmy8R9oJhsqQrFYJZtlpK?= =?Windows-1252?Q?8gD512cCgOjGjxSUTpCEJPNcZ14ShZX833nKvckBsex50HiV5vgKrmap?= =?Windows-1252?Q?qE/XPBjFeRzn4sTWSBFpQ2z1w7bxaiTTslXCJ6XKtTZyJU4I4ffgglqf?= =?Windows-1252?Q?Gb4T2eE7TvZCH8lGkUOgBldNhXqKs03+7KTPi9/EdePiIUutqFsLEbbH?= =?Windows-1252?Q?1zc5T8zNkDIlV1YqU0eqYHI/mfXtalJ62fRuGRXcW5587?= X-Microsoft-Exchange-Diagnostics: 1;CY1PR0801MB2249;5:WVJdmk39l8f7lsC3ZT9sLjLgHMs1BrOcc13jGz1XiV0ciiXHojIZ/AcISUC8mJxXb7dlHwg1oMnM8ep/t2D1pidiWmjveqY5WTz+XheABE64F3aR96asBnu7qQDrqY7oeX1IUNeoMFrV8YhXaZBt6w==;24:7zMgn/zEVMKlWgcZNoZ24n5/J/lN061lmmcCIpRpHISt8UMohlYM48TNi6MEY9+Npgd4Az+pSYzwW62RUr55ZPakcz3KDgmSYi1RDizYSGc=;20:+3ugimDV7v8wzd89Yk53lcPpUqC4toK9mWx/0mVVjJQEBodnO9APUHKAIhh6vuweMu5CYgLpFBDYVmRIoF7G+QKRxGn0uFl1gtMQegDpPbsorI3q6RhM5IDYCe9lSG/WRKa/FP43NpSlqReORHmJzWDz9VY0j8dVovoO15XFtKU= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: stratus.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Apr 2016 17:16:21.0393 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR0801MB2249 X-Barracuda-Connect: mail-eopbgr640114.outbound.protection.outlook.com[40.107.64.114] X-Barracuda-Start-Time: 1460567782 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28702 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 04/12/2016 03:54 AM, Dave Chinner wrote: > On Fri, Apr 01, 2016 at 01:44:13PM +1100, Dave Chinner wrote: >> On Wed, Mar 30, 2016 at 11:55:18PM -0400, Joe Lawrence wrote: >>> Hi Dave, >>> >>> Upon loading 4.6-rc1, I noticed a few linked list corruption messages in >>> dmesg shortly after boot up. I bisected the kernel, landing on: >>> >>> [c19b3b05ae440de50fffe2ac2a9b27392a7448e9] xfs: mode di_mode to vfs inode >>> >>> If I revert c19b3b05ae44 from 4.6-rc1, the warnings stop. >>> >>> WARNING: CPU: 35 PID: 6715 at lib/list_debug.c:29 __list_add+0x65/0xc0 >>> list_add corruption. next->prev should be prev (ffff882030928a00), but was ffff88103f00c300. (next=ffff88100fde5ce8). >> ..... >>> [] ? bdev_test+0x20/0x20 >>> [] __list_add+0x65/0xc0 >>> [] bd_acquire+0xc8/0xd0 >>> [] blkdev_open+0x39/0x70 >>> [] do_dentry_open+0x227/0x320 >>> [] ? blkdev_get_by_dev+0x50/0x50 >>> [] vfs_open+0x57/0x60 >>> [] path_openat+0x1ba/0x1340 >>> [] do_filp_open+0x91/0x100 >>> [] ? __alloc_fd+0x46/0x180 >>> [] do_sys_open+0x124/0x210 >>> [] SyS_open+0x1e/0x20 >>> [] do_syscall_64+0x62/0x110 >>> [] entry_SYSCALL64_slow_path+0x25/0x25 >> .... >>> According to the bd_acquire+0xc8 offset, we're in bd_acquire() >>> attempting the list add: >> .... >>> 713 bdev = bdget(inode->i_rdev); >>> 714 if (bdev) { >>> 715 spin_lock(&bdev_lock); >>> 716 if (!inode->i_bdev) { >>> 717 /* >>> 718 * We take an additional reference to bd_inode, >>> 719 * and it's released in clear_inode() of inode. >>> 720 * So, we can access it via ->i_mapping always >>> 721 * without igrab(). >>> 722 */ >>> 723 bdgrab(bdev); >>> 724 inode->i_bdev = bdev; >>> 725 inode->i_mapping = bdev->bd_inode->i_mapping; >>> 726 list_add(&inode->i_devices, &bdev->bd_inodes); >> >> So the bdev->bd_inodes list is corrupt, and this call trace is >> just the messenger. > .... >>> I'm not really sure why the bisect landed on c19b3b05ae44 "xfs: mode >>> di_mode to vfs inode", but as I mentioned, reverting it made the list >>> warnings go away. >> >> Neither am I at this point as it's the bdev inode (not an xfs >> inode) that has a corrupted list. I'll have to try to reproduce this. > > Patch below should fix the problem. Smoke tested only at this point. Thanks Dave, this looks good on both the QEMU and on the originating hardware instances. Let me know if there are any additional tests that I can run, otherwise consider this Tested-by. BTW, cuda.sgi.com is rejecting my mail to the list (even though I subscribed), so apologies for this not making it out to xfs@oss.sgi.com. Thanks again, -- Joe From hack.coo@gmail.com Wed Apr 13 12:27:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,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 EFC3F7CA7 for ; Wed, 13 Apr 2016 12:27:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 62236AC005 for ; Wed, 13 Apr 2016 10:27:10 -0700 (PDT) X-ASG-Debug-ID: 1460568427-04cb6c2462497240001-NocioJ Received: from mail-yw0-f193.google.com (mail-yw0-f193.google.com [209.85.161.193]) by cuda.sgi.com with ESMTP id J7aKGALXZ779out6 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 13 Apr 2016 10:27:07 -0700 (PDT) X-Barracuda-Envelope-From: hack.coo@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.161.193 Received: by mail-yw0-f193.google.com with SMTP id h6so7592097ywc.1 for ; Wed, 13 Apr 2016 10:27:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=JtS2JF45s8ETwDZZqLCkruCZg2wJ6p3lLnSztUvOlzM=; b=HDb1zDAA9vXDo8xOSJUg2euAcckszwSy/f/hwQMaraPd00UkqSkFwCbwOnouqlIJLG FuiiRgRVUJYmvnA/6fYxK4gjQVZVc2JtJos19aG2RPXTD+/uuWENvAYuy92Pg4AYmBjU JCRPeVhSZo/51SBIYXpcQpvJ9XZw6/OQ9OCbnGR9nmHVRSVbEgcFmGLLrKz+zuyUCnS4 AocQn8r+P1FCykMkXahzO70c94exbbOAaYTHe16FCRu6eygPEnJe6ID1FRNm9Un6kVf8 spXc96WVgoyOOzOeR27NZPt2jlnwsm0fQi91qSPBPdLPHBaX3hjPqEtdhbJaOAMMSUd9 FkmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=JtS2JF45s8ETwDZZqLCkruCZg2wJ6p3lLnSztUvOlzM=; b=XiRBLtHe1S8J7O4IXs8HOQrgPbKZQsQZYIBryu1JVZQwc9TEGqs3yX9dZorZb9cOVK qYP9Mfbh+hXgA0NMu9Ra/3hU6CB/4lN58m05lOFerTnMxonF3LdVzswFf+Svp21HDkdP tYLe61yiMfiFcY+UpUgg/z9U4jWqJazFMLJKWlFAWvRaWycTVLL+RBPpUgXSQ5qoN92+ Q6Lmq/TylEKmQppWB2tgkr+aPdhYvtF7gqtpMmDgcMFtsBOzPwk2FcadKMj03SVTe0TX PZnxinuv4Rms0BSQiM/8rw3vOsHQa01kjTh4UYI/aE2jix8lnJQLv20rry2eQOvN5s4C 3D4A== X-Gm-Message-State: AOPr4FW1czgM+X1Oq+LxnWvKUz64r6gfrOSnZPc7twwxZAsXfJinHpxBAgTP3QssEBfjccRoCN7Y91MSLp3rxA== MIME-Version: 1.0 X-Received: by 10.37.4.3 with SMTP id 3mr629131ybe.81.1460568427118; Wed, 13 Apr 2016 10:27:07 -0700 (PDT) Received: by 10.37.89.10 with HTTP; Wed, 13 Apr 2016 10:27:07 -0700 (PDT) In-Reply-To: <20160412213118.GM567@dastard> References: <20160411231056.GD9088@dastard> <20160412213118.GM567@dastard> Date: Thu, 14 Apr 2016 01:27:07 +0800 Message-ID: Subject: Re: about the xfs performance From: Songbo Wang X-ASG-Orig-Subj: Re: about the xfs performance To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a11c015ba44ce260530611642 X-Barracuda-Connect: mail-yw0-f193.google.com[209.85.161.193] X-Barracuda-Start-Time: 1460568427 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28702 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --001a11c015ba44ce260530611642 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hi Dave, Thank you for your suggestion, and very appreciate for your reply! 2016-04-13 5:31 GMT+08:00 Dave Chinner : > On Tue, Apr 12, 2016 at 10:07:45PM +0800, Songbo Wang wrote: > > Hi Dave, > > > > Thank you for your reply. I did some test today and described those as > > follows: > > > > Delete the existing test file , and redo the test : fio -ioengine=3Dlib= aio > > -bs=3D4k -direct=3D1 -thread -rw=3Drandwrite -size=3D50G -filename=3D/m= nt/test > > -name=3D"EBS 4KB randwrite test" -iodepth=3D64 -runtime=3D60 > > The iops resultes is 19k=C4=85(per second); I continue to fio this tes= t file > > untill it was filled to the full. Then I did another test using the sam= e > > test case, the results was 210k=C4=85(per second).(The results mentione= d > > Yup, that's when the workload goes from allocation bound to being an > overwrite workload when there is no allocation occurring. > > Perhaps you should preallocate the file using the fallocate=3Dposix > option. This will move the initial overhead to IO completion, so > won't block submission, and the file will not end up a fragmented > mess as the written areas will merge back into large single extents > as more of the file is written. > > > yesterday was partial. I used the same test file several times, the > > results degraded because of the test file was not fill to the full) > > > > I try to remake the filesystem using the following command to increase > the > > internal log size , inode size and agcount num: > > mkfs.xfs /dev/hioa2 -f -n size=3D64k -i size=3D2048,align=3D1 -d agcoun= t=3D2045 > -l > > size=3D512m > > but it has no help to the result. > > Of course it won't. Turning random knobs without knowing what they > do will not solve the problem. Indeed, if you're workload is > performance limited because it is running out of log space, then > *reducing the log size* will not solve the issue. > > Users who tweaking knobs without understanding what they do or how > they affect the application is the leading cause of filesystem > performance and reliability issues on XFS. Just don't do it - all > you'll do is cause something to go wrong when you can least afford > it to happen. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --001a11c015ba44ce260530611642 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
    Hi Dave,
    =C2=A0 =C2=A0
    Thank you for your su= ggestion, =C2=A0and very appreciate for your reply!

    2016-04-13 5:31 GMT+08:00 D= ave Chinner <david@fromorbit.com>:
    On Tue, Apr 12, 2016 at 10:07:45PM +0800, Songb= o Wang wrote:
    > Hi Dave,
    >
    > Thank you for your reply. I did some test today and described those as=
    > follows:
    >
    > Delete the existing test file , and redo the test : fio -ioengine=3Dli= baio
    > -bs=3D4k -direct=3D1 -thread -rw=3Drandwrite -size=3D50G -filename=3D/= mnt/test
    > -name=3D"EBS 4KB randwrite test" -iodepth=3D64 -runtime=3D60=
    > The iops resultes is 19k=C4=85(per second);=C2=A0 I continue to= fio this test file
    > untill it was filled to the full. Then I did another = test using the same
    > test case, the results was 210k=C4=85(per second).(The results = mentioned

    Yup, that's when the workload goes from allocation bound to being an overwrite workload when there is no allocation occurring.

    Perhaps you should preallocate the file using the fallocate=3Dposix
    option. This will move the initial overhead to IO completion, so
    won't block submission, and the file will not end up a fragmented
    mess as the written areas will merge back into large single extents
    as more of the file is written.

    > yesterday was partial.=C2=A0 I used the same test file several times, = the
    > results degraded because of the test file was not fill to the full) >
    > I try to remake the filesystem using the following command to increase= the
    > internal log size , inode size and agcount num:
    > mkfs.xfs /dev/hioa2 -f -n size=3D64k -i size=3D2048,align=3D1 -d agcou= nt=3D2045 -l
    > size=3D512m
    > but it has no help to the result.

    Of course it won't. Turning random knobs without knowing what th= ey
    do will not solve the problem. Indeed, if you're workload is
    performance limited because it is running out of log space, then
    *reducing the log size* will not solve the issue.

    Users who tweaking knobs without understanding what they do or how
    they affect the application is the leading cause of filesystem
    performance and reliability issues on XFS. Just don't do it - all
    you'll do is cause something to go wrong when you can least afford
    it to happen.

    Cheers,

    Dave.
    --
    Dave Chinner
    david@fromorbit.com

    --001a11c015ba44ce260530611642-- From darrick.wong@oracle.com Wed Apr 13 12:44:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 6733E7CB3 for ; Wed, 13 Apr 2016 12:44:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id CF775AC005 for ; Wed, 13 Apr 2016 10:44:53 -0700 (PDT) X-ASG-Debug-ID: 1460569490-04cb6c246249c710001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id zxUdMGD9eIuA9H0f (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 10:44:50 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u3DHinXC022759 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 13 Apr 2016 17:44:49 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u3DHimmk029934 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 13 Apr 2016 17:44:48 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u3DHiiEn014640; Wed, 13 Apr 2016 17:44:45 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 13 Apr 2016 10:44:43 -0700 Date: Wed, 13 Apr 2016 10:44:42 -0700 From: "Darrick J. Wong" To: Brian Foster Cc: xfs@oss.sgi.com, linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, dm-devel@redhat.com, Joe Thornber , snitzer@redhat.com Subject: Re: [RFC v2 PATCH 05/10] dm thin: add methods to set and get reserved space Message-ID: <20160413174442.GD18517@birch.djwong.org> X-ASG-Orig-Subj: Re: [RFC v2 PATCH 05/10] dm thin: add methods to set and get reserved space References: <1460479373-63317-1-git-send-email-bfoster@redhat.com> <1460479373-63317-6-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460479373-63317-6-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1460569490 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28702 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Apr 12, 2016 at 12:42:48PM -0400, Brian Foster wrote: > From: Joe Thornber > > Experimental reserve interface for XFS guys to play with. > > I have big reservations (no pun intended) about this patch. > > [BF: > - Support for reservation reduction. > - Support for space provisioning. > - Condensed to a single function.] > > Not-Signed-off-by: Joe Thornber > Not-Signed-off-by: Mike Snitzer > --- > drivers/md/dm-thin.c | 181 ++++++++++++++++++++++++++++++++++++++++++++++++--- > 1 file changed, 171 insertions(+), 10 deletions(-) > > diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c > index 92237b6..32bc5bd 100644 > --- a/drivers/md/dm-thin.c > +++ b/drivers/md/dm-thin.c > @@ -271,6 +271,8 @@ struct pool { > process_mapping_fn process_prepared_discard; > > struct dm_bio_prison_cell **cell_sort_array; > + > + dm_block_t reserve_count; > }; > > static enum pool_mode get_pool_mode(struct pool *pool); > @@ -318,6 +320,8 @@ struct thin_c { > */ > atomic_t refcount; > struct completion can_destroy; > + > + dm_block_t reserve_count; > }; > > /*----------------------------------------------------------------*/ > @@ -1359,24 +1363,19 @@ static void check_low_water_mark(struct pool *pool, dm_block_t free_blocks) > } > } > > -static int alloc_data_block(struct thin_c *tc, dm_block_t *result) > +static int get_free_blocks(struct pool *pool, dm_block_t *free_blocks) > { > int r; > - dm_block_t free_blocks; > - struct pool *pool = tc->pool; > - > - if (WARN_ON(get_pool_mode(pool) != PM_WRITE)) > - return -EINVAL; > > - r = dm_pool_get_free_block_count(pool->pmd, &free_blocks); > + r = dm_pool_get_free_block_count(pool->pmd, free_blocks); > if (r) { > metadata_operation_failed(pool, "dm_pool_get_free_block_count", r); > return r; > } > > - check_low_water_mark(pool, free_blocks); > + check_low_water_mark(pool, *free_blocks); > > - if (!free_blocks) { > + if (!*free_blocks) { > /* > * Try to commit to see if that will free up some > * more space. > @@ -1385,7 +1384,7 @@ static int alloc_data_block(struct thin_c *tc, dm_block_t *result) > if (r) > return r; > > - r = dm_pool_get_free_block_count(pool->pmd, &free_blocks); > + r = dm_pool_get_free_block_count(pool->pmd, free_blocks); > if (r) { > metadata_operation_failed(pool, "dm_pool_get_free_block_count", r); > return r; > @@ -1397,6 +1396,76 @@ static int alloc_data_block(struct thin_c *tc, dm_block_t *result) > } > } > > + return r; > +} > + > +/* > + * Returns true iff either: > + * i) decrement succeeded (ie. there was reserve left) > + * ii) there is extra space in the pool > + */ > +static bool dec_reserve_count(struct thin_c *tc, dm_block_t free_blocks) > +{ > + bool r = false; > + unsigned long flags; > + > + if (!free_blocks) > + return false; > + > + spin_lock_irqsave(&tc->pool->lock, flags); > + if (tc->reserve_count > 0) { > + tc->reserve_count--; > + tc->pool->reserve_count--; > + r = true; > + } else { > + if (free_blocks > tc->pool->reserve_count) > + r = true; > + } > + spin_unlock_irqrestore(&tc->pool->lock, flags); > + > + return r; > +} > + > +static int set_reserve_count(struct thin_c *tc, dm_block_t count) > +{ > + int r; > + dm_block_t free_blocks; > + int64_t delta; > + unsigned long flags; > + > + r = get_free_blocks(tc->pool, &free_blocks); > + if (r) > + return r; > + > + spin_lock_irqsave(&tc->pool->lock, flags); > + delta = count - tc->reserve_count; > + if (tc->pool->reserve_count + delta > free_blocks) > + r = -ENOSPC; > + else { > + tc->reserve_count = count; > + tc->pool->reserve_count += delta; > + } > + spin_unlock_irqrestore(&tc->pool->lock, flags); > + > + return r; > +} > + > +static int alloc_data_block(struct thin_c *tc, dm_block_t *result) > +{ > + int r; > + dm_block_t free_blocks; > + struct pool *pool = tc->pool; > + > + if (WARN_ON(get_pool_mode(pool) != PM_WRITE)) > + return -EINVAL; > + > + r = get_free_blocks(tc->pool, &free_blocks); > + if (r) > + return r; > + > + if (!dec_reserve_count(tc, free_blocks)) > + return -ENOSPC; > + > r = dm_pool_alloc_data_block(pool->pmd, result); > if (r) { > metadata_operation_failed(pool, "dm_pool_alloc_data_block", r); > @@ -2880,6 +2949,7 @@ static struct pool *pool_create(struct mapped_device *pool_md, > pool->last_commit_jiffies = jiffies; > pool->pool_md = pool_md; > pool->md_dev = metadata_dev; > + pool->reserve_count = 0; > __pool_table_insert(pool); > > return pool; > @@ -3936,6 +4006,7 @@ static void thin_dtr(struct dm_target *ti) > > spin_lock_irqsave(&tc->pool->lock, flags); > list_del_rcu(&tc->list); > + tc->pool->reserve_count -= tc->reserve_count; > spin_unlock_irqrestore(&tc->pool->lock, flags); > synchronize_rcu(); > > @@ -4074,6 +4145,7 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv) > init_completion(&tc->can_destroy); > list_add_tail_rcu(&tc->list, &tc->pool->active_thins); > spin_unlock_irqrestore(&tc->pool->lock, flags); > + tc->reserve_count = 0; > /* > * This synchronize_rcu() call is needed here otherwise we risk a > * wake_worker() call finding no bios to process (because the newly > @@ -4271,6 +4343,94 @@ static void thin_io_hints(struct dm_target *ti, struct queue_limits *limits) > limits->max_discard_sectors = 2048 * 1024 * 16; /* 16G */ > } > > +static int thin_provision_space(struct dm_target *ti, sector_t offset, > + sector_t len, sector_t *res) > +{ > + struct thin_c *tc = ti->private; > + struct pool *pool = tc->pool; > + sector_t end; > + dm_block_t pblock; > + dm_block_t vblock; > + int error; > + struct dm_thin_lookup_result lookup; > + > + if (!is_factor(offset, pool->sectors_per_block)) > + return -EINVAL; > + > + if (!len || !is_factor(len, pool->sectors_per_block)) > + return -EINVAL; > + > + if (res && !is_factor(*res, pool->sectors_per_block)) > + return -EINVAL; > + > + end = offset + len; > + > + while (offset < end) { > + vblock = offset; > + do_div(vblock, pool->sectors_per_block); > + > + error = dm_thin_find_block(tc->td, vblock, true, &lookup); > + if (error == 0) > + goto next; > + if (error != -ENODATA) > + return error; > + > + error = alloc_data_block(tc, &pblock); So this means that if fallocate wants to BDEV_RES_PROVISION N blocks, it must first increase the reservation (BDEV_RES_MOD) by N blocks to avoid using up space that was previously reserved by some other caller. I think? > + if (error) > + return error; > + > + error = dm_thin_insert_block(tc->td, vblock, pblock); Having reserved and mapped blocks, what happens when we try to read them? Do we actually get zeroes, or does the read go straight through to whatever happens to be in the disk blocks? I don't think it's correct that we could BDEV_RES_PROVISION and end up with stale credit card numbers from some other thin device. (PS: I don't know enough about thinp to know if this has already been taken care of. I didn't see anything, but who knows what I missed. :)) --D > + if (error) > + return error; > + > + if (res && *res) > + *res -= pool->sectors_per_block; > +next: > + offset += pool->sectors_per_block; > + } > + > + return 0; > +} > + > +static int thin_reserve_space(struct dm_target *ti, int mode, sector_t offset, > + sector_t len, sector_t *res) > +{ > + struct thin_c *tc = ti->private; > + struct pool *pool = tc->pool; > + sector_t blocks; > + unsigned long flags; > + int error; > + > + if (mode == BDEV_RES_PROVISION) > + return thin_provision_space(ti, offset, len, res); > + > + /* res required for get/set */ > + error = -EINVAL; > + if (!res) > + return error; > + > + if (mode == BDEV_RES_GET) { > + spin_lock_irqsave(&tc->pool->lock, flags); > + *res = tc->reserve_count * pool->sectors_per_block; > + spin_unlock_irqrestore(&tc->pool->lock, flags); > + error = 0; > + } else if (mode == BDEV_RES_MOD) { > + /* > + * @res must always be a factor of the pool's blocksize; upper > + * layers can rely on the bdev's minimum_io_size for this. > + */ > + if (!is_factor(*res, pool->sectors_per_block)) > + return error; > + > + blocks = *res; > + (void) sector_div(blocks, pool->sectors_per_block); > + > + error = set_reserve_count(tc, blocks); > + } > + > + return error; > +} > + > static struct target_type thin_target = { > .name = "thin", > .version = {1, 18, 0}, > @@ -4285,6 +4445,7 @@ static struct target_type thin_target = { > .status = thin_status, > .iterate_devices = thin_iterate_devices, > .io_hints = thin_io_hints, > + .reserve_space = thin_reserve_space, > }; > > /*----------------------------------------------------------------*/ > -- > 2.4.11 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From tdm@sgi.com Wed Apr 13 12:47:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 3D49F7CBB for ; Wed, 13 Apr 2016 12:47:20 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21.corp.sgi.com [137.38.106.9]) by relay1.corp.sgi.com (Postfix) with ESMTP id E57A28F8037; Wed, 13 Apr 2016 10:47:16 -0700 (PDT) Received: from P-EXMB4-DC21.corp.sgi.com ([169.254.6.28]) by pv-excas2-dc21.corp.sgi.com ([137.38.106.9]) with mapi id 14.03.0210.002; Wed, 13 Apr 2016 12:46:52 -0500 From: Troy McCorkell To: Joe Lawrence , "xfs@oss.sgi.com" , "dchinner@redhat.com" Subject: RE: list_add corruption after "xfs: mode di_mode to vfs inode" Thread-Topic: list_add corruption after "xfs: mode di_mode to vfs inode" Thread-Index: AQHRi8BoVSkW/RtIKUaGhpmowsxSmJ+GXV6AgAIvUgD//7RzLQ== Date: Wed, 13 Apr 2016 17:46:52 +0000 Message-ID: References: <56FC9FA6.1080700@stratus.com> <20160401024413.GB2072@devil.localdomain> <20160412075423.GG9088@dastard>,<570E7EE0.2020004@stratus.com> In-Reply-To: <570E7EE0.2020004@stratus.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [128.162.233.137] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 =0A= Joe,=0A= I'll forward your email to our IT group to update the spam filters.=0A= Sorry for the inconvenience.=0A= -Troy=0A= =0A= ________________________________________=0A= From: xfs-bounces@oss.sgi.com [xfs-bounces@oss.sgi.com] on behalf of Joe La= wrence [joe.lawrence@stratus.com]=0A= Sent: Wednesday, April 13, 2016 12:16 PM=0A= To: xfs@oss.sgi.com; dchinner@redhat.com=0A= Subject: Re: list_add corruption after "xfs: mode di_mode to vfs inode"=0A= =0A= On 04/12/2016 03:54 AM, Dave Chinner wrote:=0A= > On Fri, Apr 01, 2016 at 01:44:13PM +1100, Dave Chinner wrote:=0A= >> On Wed, Mar 30, 2016 at 11:55:18PM -0400, Joe Lawrence wrote:=0A= >>> Hi Dave,=0A= >>>=0A= >>> Upon loading 4.6-rc1, I noticed a few linked list corruption messages i= n=0A= >>> dmesg shortly after boot up. I bisected the kernel, landing on:=0A= >>>=0A= >>> [c19b3b05ae440de50fffe2ac2a9b27392a7448e9] xfs: mode di_mode to vfs i= node=0A= >>>=0A= >>> If I revert c19b3b05ae44 from 4.6-rc1, the warnings stop.=0A= >>>=0A= >>> WARNING: CPU: 35 PID: 6715 at lib/list_debug.c:29 __list_add+0x65/0xc0= =0A= >>> list_add corruption. next->prev should be prev (ffff882030928a00), but = was ffff88103f00c300. (next=3Dffff88100fde5ce8).=0A= >> .....=0A= >>> [] ? bdev_test+0x20/0x20=0A= >>> [] __list_add+0x65/0xc0=0A= >>> [] bd_acquire+0xc8/0xd0=0A= >>> [] blkdev_open+0x39/0x70=0A= >>> [] do_dentry_open+0x227/0x320=0A= >>> [] ? blkdev_get_by_dev+0x50/0x50=0A= >>> [] vfs_open+0x57/0x60=0A= >>> [] path_openat+0x1ba/0x1340=0A= >>> [] do_filp_open+0x91/0x100=0A= >>> [] ? __alloc_fd+0x46/0x180=0A= >>> [] do_sys_open+0x124/0x210=0A= >>> [] SyS_open+0x1e/0x20=0A= >>> [] do_syscall_64+0x62/0x110=0A= >>> [] entry_SYSCALL64_slow_path+0x25/0x25=0A= >> ....=0A= >>> According to the bd_acquire+0xc8 offset, we're in bd_acquire()=0A= >>> attempting the list add:=0A= >> ....=0A= >>> 713 bdev =3D bdget(inode->i_rdev);=0A= >>> 714 if (bdev) {=0A= >>> 715 spin_lock(&bdev_lock);=0A= >>> 716 if (!inode->i_bdev) {=0A= >>> 717 /*=0A= >>> 718 * We take an additional reference to bd_i= node,=0A= >>> 719 * and it's released in clear_inode() of i= node.=0A= >>> 720 * So, we can access it via ->i_mapping al= ways=0A= >>> 721 * without igrab().=0A= >>> 722 */=0A= >>> 723 bdgrab(bdev);=0A= >>> 724 inode->i_bdev =3D bdev;=0A= >>> 725 inode->i_mapping =3D bdev->bd_inode->i_map= ping;=0A= >>> 726 list_add(&inode->i_devices, &bdev->bd_inod= es);=0A= >>=0A= >> So the bdev->bd_inodes list is corrupt, and this call trace is=0A= >> just the messenger.=0A= > ....=0A= >>> I'm not really sure why the bisect landed on c19b3b05ae44 "xfs: mode=0A= >>> di_mode to vfs inode", but as I mentioned, reverting it made the list= =0A= >>> warnings go away.=0A= >>=0A= >> Neither am I at this point as it's the bdev inode (not an xfs=0A= >> inode) that has a corrupted list. I'll have to try to reproduce this.=0A= >=0A= > Patch below should fix the problem. Smoke tested only at this point.=0A= =0A= Thanks Dave, this looks good on both the QEMU and on the originating=0A= hardware instances.=0A= =0A= Let me know if there are any additional tests that I can run, otherwise=0A= consider this Tested-by.=0A= =0A= BTW, cuda.sgi.com is rejecting my mail to the list (even though I=0A= subscribed), so apologies for this not making it out to xfs@oss.sgi.com.=0A= =0A= Thanks again,=0A= =0A= -- Joe=0A= =0A= _______________________________________________=0A= xfs mailing list=0A= xfs@oss.sgi.com=0A= http://oss.sgi.com/mailman/listinfo/xfs=0A= From zlang@redhat.com Wed Apr 13 13:23:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 45D417CA0 for ; Wed, 13 Apr 2016 13:23:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B004CAC005 for ; Wed, 13 Apr 2016 11:22:58 -0700 (PDT) X-ASG-Debug-ID: 1460571776-04cb6c24624a3280001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QchlQSyeWM9aunie (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 11:22:57 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B83BE3D7; Wed, 13 Apr 2016 18:22:56 +0000 (UTC) Received: from localhost (vpn1-4-201.pek2.redhat.com [10.72.4.201]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DIMtJx002283; Wed, 13 Apr 2016 14:22:56 -0400 From: Zorro Lang To: xfs@oss.sgi.com Cc: linux-fsdevel@vger.kernel.org, sandeen@redhat.com, Zorro Lang Subject: [PATCH] xfs: group quota is still enforced if mount v5 xfs with gqnoenforce and pqnoenforce Date: Thu, 14 Apr 2016 02:22:52 +0800 X-ASG-Orig-Subj: [PATCH] xfs: group quota is still enforced if mount v5 xfs with gqnoenforce and pqnoenforce Message-Id: <1460571772-20285-1-git-send-email-zlang@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: 1460571777 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This's a regression bug caused by: 2e74af0 xfs: convert mount option parsing to tokens xfstests xfs/299 can reproduce this bug, it will fail when do gpnoenforce test, the error output as below(diff with 299.out): *** push past the soft block limit [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------] -[NAME] 140 100 500 00 [--------] 4 4 10 00 [--------] 0 0 0 00 [--------] +[NAME] 140 100 500 00 [7 days] 4 4 10 00 [--------] 0 0 0 00 [--------] *** push past the hard inode limit (expect EDQUOT) [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------] -[NAME] 140 100 500 00 [--------] 16 4 10 00 [--none--] 0 0 0 00 [--------] +[NAME] 140 100 500 00 [7 days] 10 4 10 00 [7 days] 0 0 0 00 [--------] *** push past the hard block limit (expect EDQUOT) [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------] -[NAME] 540 100 500 00 [--none--] 16 4 10 00 [--none--] 0 0 0 00 [--------] +[NAME] 500 100 500 00 [7 days] 10 4 10 00 [7 days] 0 0 0 00 [--------] It shows that group quota is still enforced. But this bug only can be reproduced when mount v5 xfs with gqnoenforce and pqnoenforce options. The reason as I found is a missed "break" in xfs_parseargs() function. After deal with "pqnoenforce", it should break. But the code keep running into "gquota/grpquota" lines, and make gquota enforced. Signed-off-by: Zorro Lang --- Hi, This's a tiny bug(only one line patch). But it's belong to regression bug and take me a few hours to find the problem. So I hope it can be fixed:) Thanks, Zorro fs/xfs/xfs_super.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 187e14b..f3c0ffc 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -350,6 +350,7 @@ xfs_parseargs( case Opt_pqnoenforce: mp->m_qflags |= (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE); mp->m_qflags &= ~XFS_PQUOTA_ENFD; + break; case Opt_gquota: case Opt_grpquota: mp->m_qflags |= (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE | -- 2.5.5 From sandeen@sandeen.net Wed Apr 13 13:30:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 699E17CA7 for ; Wed, 13 Apr 2016 13:30:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3BF548F8039 for ; Wed, 13 Apr 2016 11:30:27 -0700 (PDT) X-ASG-Debug-ID: 1460572225-04cb6c24604a4180001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id DoAPjizLfBFMJGGO for ; Wed, 13 Apr 2016 11:30:25 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id A3BCF14A15 for ; Wed, 13 Apr 2016 13:30:25 -0500 (CDT) Subject: Re: [PATCH] xfs: group quota is still enforced if mount v5 xfs with gqnoenforce and pqnoenforce To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: group quota is still enforced if mount v5 xfs with gqnoenforce and pqnoenforce References: <1460571772-20285-1-git-send-email-zlang@redhat.com> From: Eric Sandeen Message-ID: <570E9040.8010409@sandeen.net> Date: Wed, 13 Apr 2016 13:30:24 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: <1460571772-20285-1-git-send-email-zlang@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1460572225 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28704 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This looks fine, but I think Eryu already sent this patch on 3/31: [PATCH] xfs: add missing break in xfs_parseargs() -Eric On 4/13/16 1:22 PM, Zorro Lang wrote: > This's a regression bug caused by: > > 2e74af0 xfs: convert mount option parsing to tokens > > xfstests xfs/299 can reproduce this bug, it will fail when do > gpnoenforce test, the error output as below(diff with 299.out): > > *** push past the soft block limit > [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------] > -[NAME] 140 100 500 00 [--------] 4 4 10 00 [--------] 0 0 0 00 [--------] > +[NAME] 140 100 500 00 [7 days] 4 4 10 00 [--------] 0 0 0 00 [--------] > > *** push past the hard inode limit (expect EDQUOT) > [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------] > -[NAME] 140 100 500 00 [--------] 16 4 10 00 [--none--] 0 0 0 00 [--------] > +[NAME] 140 100 500 00 [7 days] 10 4 10 00 [7 days] 0 0 0 00 [--------] > > *** push past the hard block limit (expect EDQUOT) > [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------] > -[NAME] 540 100 500 00 [--none--] 16 4 10 00 [--none--] 0 0 0 00 [--------] > +[NAME] 500 100 500 00 [7 days] 10 4 10 00 [7 days] 0 0 0 00 [--------] > > It shows that group quota is still enforced. But this bug only can > be reproduced when mount v5 xfs with gqnoenforce and pqnoenforce > options. The reason as I found is a missed "break" in xfs_parseargs() > function. > > After deal with "pqnoenforce", it should break. But the code keep > running into "gquota/grpquota" lines, and make gquota enforced. > > Signed-off-by: Zorro Lang > --- > > Hi, > > This's a tiny bug(only one line patch). But it's belong to > regression bug and take me a few hours to find the problem. > So I hope it can be fixed:) > > Thanks, > Zorro > > fs/xfs/xfs_super.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index 187e14b..f3c0ffc 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -350,6 +350,7 @@ xfs_parseargs( > case Opt_pqnoenforce: > mp->m_qflags |= (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE); > mp->m_qflags &= ~XFS_PQUOTA_ENFD; > + break; > case Opt_gquota: > case Opt_grpquota: > mp->m_qflags |= (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE | > From bfoster@redhat.com Wed Apr 13 13:34:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4F0267CB3 for ; Wed, 13 Apr 2016 13:34:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0662C304039 for ; Wed, 13 Apr 2016 11:33:59 -0700 (PDT) X-ASG-Debug-ID: 1460572434-04bdf011054a2c40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id u8VT3sI98bXvcRh1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 11:33:55 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 526AF776; Wed, 13 Apr 2016 18:33:54 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-153.bos.redhat.com [10.18.41.153]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DIXrxs007712; Wed, 13 Apr 2016 14:33:54 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 862F5125438; Wed, 13 Apr 2016 14:33:52 -0400 (EDT) Date: Wed, 13 Apr 2016 14:33:52 -0400 From: Brian Foster To: "Darrick J. Wong" Cc: xfs@oss.sgi.com, linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, dm-devel@redhat.com, Joe Thornber , snitzer@redhat.com Subject: Re: [RFC v2 PATCH 05/10] dm thin: add methods to set and get reserved space Message-ID: <20160413183352.GB2775@bfoster.bfoster> X-ASG-Orig-Subj: Re: [RFC v2 PATCH 05/10] dm thin: add methods to set and get reserved space References: <1460479373-63317-1-git-send-email-bfoster@redhat.com> <1460479373-63317-6-git-send-email-bfoster@redhat.com> <20160413174442.GD18517@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160413174442.GD18517@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460572434 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Apr 13, 2016 at 10:44:42AM -0700, Darrick J. Wong wrote: > On Tue, Apr 12, 2016 at 12:42:48PM -0400, Brian Foster wrote: > > From: Joe Thornber > > > > Experimental reserve interface for XFS guys to play with. > > > > I have big reservations (no pun intended) about this patch. > > > > [BF: > > - Support for reservation reduction. > > - Support for space provisioning. > > - Condensed to a single function.] > > > > Not-Signed-off-by: Joe Thornber > > Not-Signed-off-by: Mike Snitzer > > --- > > drivers/md/dm-thin.c | 181 ++++++++++++++++++++++++++++++++++++++++++++++++--- > > 1 file changed, 171 insertions(+), 10 deletions(-) > > > > diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c > > index 92237b6..32bc5bd 100644 > > --- a/drivers/md/dm-thin.c > > +++ b/drivers/md/dm-thin.c ... > > @@ -4271,6 +4343,94 @@ static void thin_io_hints(struct dm_target *ti, struct queue_limits *limits) > > limits->max_discard_sectors = 2048 * 1024 * 16; /* 16G */ > > } > > > > +static int thin_provision_space(struct dm_target *ti, sector_t offset, > > + sector_t len, sector_t *res) > > +{ > > + struct thin_c *tc = ti->private; > > + struct pool *pool = tc->pool; > > + sector_t end; > > + dm_block_t pblock; > > + dm_block_t vblock; > > + int error; > > + struct dm_thin_lookup_result lookup; > > + > > + if (!is_factor(offset, pool->sectors_per_block)) > > + return -EINVAL; > > + > > + if (!len || !is_factor(len, pool->sectors_per_block)) > > + return -EINVAL; > > + > > + if (res && !is_factor(*res, pool->sectors_per_block)) > > + return -EINVAL; > > + > > + end = offset + len; > > + > > + while (offset < end) { > > + vblock = offset; > > + do_div(vblock, pool->sectors_per_block); > > + > > + error = dm_thin_find_block(tc->td, vblock, true, &lookup); > > + if (error == 0) > > + goto next; > > + if (error != -ENODATA) > > + return error; > > + > > + error = alloc_data_block(tc, &pblock); > > So this means that if fallocate wants to BDEV_RES_PROVISION N blocks, it must > first increase the reservation (BDEV_RES_MOD) by N blocks to avoid using up > space that was previously reserved by some other caller. I think? > Yes, assuming this is being called from a filesystem using the reservation mechanism. > > + if (error) > > + return error; > > + > > + error = dm_thin_insert_block(tc->td, vblock, pblock); > > Having reserved and mapped blocks, what happens when we try to read them? > Do we actually get zeroes, or does the read go straight through to whatever > happens to be in the disk blocks? I don't think it's correct that we could > BDEV_RES_PROVISION and end up with stale credit card numbers from some other > thin device. > Agree, but I'm not really sure how this works in thinp tbh. fallocate wasn't really on my mind when doing this. I was simply trying to cobble together what I could to facilitate making progress on the fs parts (e.g., I just needed a call that allocated blocks and consumed reservation in the process). Skimming through the dm-thin code, it looks like a (configurable) block zeroing mechanism can be triggered from somewhere around provision_block()->schedule_zero(), depending on whether the incoming write overwrites the newly allocated block. If that's the case, then I suspect that means reads would just fall through to the block and return whatever was on disk. This code would probably need to tie into that zeroing mechanism one way or another to deal with that issue. (Though somebody who actually knows something about dm-thin should verify that. :) Brian > (PS: I don't know enough about thinp to know if this has already been taken > care of. I didn't see anything, but who knows what I missed. :)) > > --D > > > + if (error) > > + return error; > > + > > + if (res && *res) > > + *res -= pool->sectors_per_block; > > +next: > > + offset += pool->sectors_per_block; > > + } > > + > > + return 0; > > +} > > + > > +static int thin_reserve_space(struct dm_target *ti, int mode, sector_t offset, > > + sector_t len, sector_t *res) > > +{ > > + struct thin_c *tc = ti->private; > > + struct pool *pool = tc->pool; > > + sector_t blocks; > > + unsigned long flags; > > + int error; > > + > > + if (mode == BDEV_RES_PROVISION) > > + return thin_provision_space(ti, offset, len, res); > > + > > + /* res required for get/set */ > > + error = -EINVAL; > > + if (!res) > > + return error; > > + > > + if (mode == BDEV_RES_GET) { > > + spin_lock_irqsave(&tc->pool->lock, flags); > > + *res = tc->reserve_count * pool->sectors_per_block; > > + spin_unlock_irqrestore(&tc->pool->lock, flags); > > + error = 0; > > + } else if (mode == BDEV_RES_MOD) { > > + /* > > + * @res must always be a factor of the pool's blocksize; upper > > + * layers can rely on the bdev's minimum_io_size for this. > > + */ > > + if (!is_factor(*res, pool->sectors_per_block)) > > + return error; > > + > > + blocks = *res; > > + (void) sector_div(blocks, pool->sectors_per_block); > > + > > + error = set_reserve_count(tc, blocks); > > + } > > + > > + return error; > > +} > > + > > static struct target_type thin_target = { > > .name = "thin", > > .version = {1, 18, 0}, > > @@ -4285,6 +4445,7 @@ static struct target_type thin_target = { > > .status = thin_status, > > .iterate_devices = thin_iterate_devices, > > .io_hints = thin_io_hints, > > + .reserve_space = thin_reserve_space, > > }; > > > > /*----------------------------------------------------------------*/ > > -- > > 2.4.11 > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > -- > To unsubscribe from this list: send the line "unsubscribe linux-block" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From noreply@mbf.co.za Wed Apr 13 13:54:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3478C7CAE for ; Wed, 13 Apr 2016 13:54:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0A5DFAC003 for ; Wed, 13 Apr 2016 11:54:01 -0700 (PDT) X-ASG-Debug-ID: 1460573632-04cbb02e1c1950a0001-NocioJ Received: from gogw0408.mail.goo.jp (gogw0408.mail.goo.jp [153.153.65.9]) by cuda.sgi.com with ESMTP id lLGKajleCzYHymag for ; Wed, 13 Apr 2016 11:53:53 -0700 (PDT) X-Barracuda-Envelope-From: noreply@mbf.co.za X-Barracuda-Apparent-Source-IP: 153.153.65.9 Received: from ntt.pod01.gv-mta-ucb002 (gv-mta-ucb002.mail.goo.jp [180.8.112.201]) by gogw0408.mail.goo.jp (Postfix) with ESMTP id 10C361100403; Thu, 14 Apr 2016 03:53:51 +0900 (JST) Received: from gzcstore012.mail.goo.jp ([180.8.112.235]) by ntt.pod01.gv-mta-ucb002 with id hutq1s00154mytg01utqV6; Wed, 13 Apr 2016 18:53:51 +0000 Date: Thu, 14 Apr 2016 03:53:50 +0900 (JST) From: Money Box Financials Reply-To: moneyboxfinancials@consultant.com Message-ID: <145353981.42804904.1460573630414.JavaMail.root@goo.jp> In-Reply-To: <385426986.42791367.1460567848419.JavaMail.root@goo.jp> Subject: Special 5% Loan Offer For All Types Of Loan MIME-Version: 1.0 X-ASG-Orig-Subj: Special 5% Loan Offer For All Types Of Loan Content-Type: multipart/mixed; boundary="----=_Part_42804902_536289690.1460573630399" X-Originating-IP: [41.13.10.228] X-Barracuda-Connect: gogw0408.mail.goo.jp[153.153.65.9] X-Barracuda-Start-Time: 1460573632 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.21 X-Barracuda-Spam-Status: No, SCORE=1.21 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28706 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 1.21 MISSING_HEADERS Missing To: header 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; ------=_Part_42804902_536289690.1460573630399 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Money Box Financials 80 Mangold Street, Newton Park, Port Elizabeth 6055, South Africa. Dear Valued Customer, Whether you want to give your lifestyle a boost or have an unexpected expense to deal with, a Loan from Money Box Financials is the cost-effective way of making it happen. We are flexible: you can borrow from R10 000 to R30,000.000, and affordable repayment periods range from 12 to 240 months for all types of loan at only 5% interest rate per year. Regards, Gina Nel (Mrs.) Senior Loan Administrator Money Box Financials ------=_Part_42804902_536289690.1460573630399 Content-Type: application/pdf; name="Welcome To Money Box Financials.pdf" Content-Disposition: attachment; filename="Welcome To Money Box Financials.pdf" Content-Transfer-Encoding: base64 JVBERi0xLjUNJeLjz9MNCjcgMCBvYmoNPDwvTGluZWFyaXplZCAxL0wgMzM0MzM1L08gOS9FIDMz MDQ2Ny9OIDEvVCAzMzQwNDQvSCBbIDUxOSAxNzNdPj4NZW5kb2JqDSAgICAgICAgICAgICAgICAg DQoyNyAwIG9iag08PC9EZWNvZGVQYXJtczw8L0NvbHVtbnMgNS9QcmVkaWN0b3IgMTI+Pi9GaWx0 ZXIvRmxhdGVEZWNvZGUvSURbPEM1QTkyRTI3OUIyRDY0NDc5NTJENEMwNTRBOTcyMTk0PjwwMEMw QTBDNDM2RjU0NDREQkM3Mjc1MTQ2ODQxQ0VDNz5dL0luZGV4WzcgNDldL0luZm8gNiAwIFIvTGVu Z3RoIDEwNi9QcmV2IDMzNDA0NS9Sb290IDggMCBSL1NpemUgNTYvVHlwZS9YUmVmL1dbMSAzIDFd Pj5zdHJlYW0NCmjeYmJkYBBgYGJgYFoCIhk8wOzdIJLtAYjkWAAiWR+DSJYbYPYjMCkJVqMOZkuB Vf4HkoybXEDkFg6QiLYpiGQEqWGq7gOxa91BpEApkPyjF8rABLR9GtheBsZBSgI99fcZQIABAHlB EW0NCmVuZHN0cmVhbQ1lbmRvYmoNc3RhcnR4cmVmDQowDQolJUVPRg0KICAgICAgICAgICAgICAg ICAgIA0KNTUgMCBvYmoNPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0kgMTA0L0xlbmd0aCA5My9TIDM4 Pj5zdHJlYW0NCmjeYmBgEGJgYPJnYGBgZX/OgAoYgZiFgaMBWUwIihkY1RkEGbwY9RzOK1gfkO3g e8P+hIWB8WfjNjPl1XqCAQUMTJ/O1Siwq/M+d4DoZGZgFc+AmnoCIMAA1FUQtg0KZW5kc3RyZWFt DWVuZG9iag04IDAgb2JqDTw8L0xhbmcoZW4tVVMpL01ldGFkYXRhIDEgMCBSL1BhZ2VzIDUgMCBS L1R5cGUvQ2F0YWxvZz4+DWVuZG9iag05IDAgb2JqDTw8L0Fubm90c1syOCAwIFJdL0NvbnRlbnRz WzExIDAgUiAxMiAwIFIgMTMgMCBSIDE0IDAgUiAxNSAwIFIgMTYgMCBSIDE3IDAgUiAxOCAwIFJd L0Nyb3BCb3hbMCAwIDYxMiA3OTJdL0dyb3VwPDwvQ1MvRGV2aWNlUkdCL1MvVHJhbnNwYXJlbmN5 L1R5cGUvR3JvdXA+Pi9NZWRpYUJveFswIDAgNjEyIDc5Ml0vUGFyZW50IDUgMCBSL1Jlc291cmNl czw8L0V4dEdTdGF0ZTw8L0dTMjUgMjkgMCBSL0dTMjYgMzAgMCBSPj4vRm9udDw8L0YxIDMzIDAg Ui9GMiAzNiAwIFIvRjMgMzkgMCBSL0Y0IDQ1IDAgUi9GNSA0OCAwIFIvRjYgNTEgMCBSL0Y3IDU0 IDAgUj4+L1Byb2NTZXRbL1BERi9UZXh0L0ltYWdlQi9JbWFnZUMvSW1hZ2VJXS9YT2JqZWN0PDwv SW1hZ2U0IDI1IDAgUi9JbWFnZTYgMjYgMCBSPj4+Pi9Sb3RhdGUgMC9UYWJzL1MvVHlwZS9QYWdl Pj4NZW5kb2JqDTEwIDAgb2JqDTw8L0ZpbHRlci9GbGF0ZURlY29kZS9GaXJzdCAyMDcvTGVuZ3Ro IDE0MDYvTiAyNy9UeXBlL09ialN0bT4+c3RyZWFtDQpo3qSYa0/jOBSG/4o/gnYhvjtejaottxkk mJUoM6yE+BDaDETbJqgNK/j3+x476Y22G0CVa8c+tk98npy8rUwZZ9IzoSxTnAmHSjApOFOSaZky pZjjhinNUoPKMMENei1mCM+UY0JbGKdMWIdrrORTwTQWhQHTtFaqsBKTyuNaMam5Y1ozaWCsDWqN a8ukNRh3TKZOM40thDBMY0npODPYQruUwURZ55iR2FIqZrA0xySjyVnBvnxJ+iiD5MfVeXL9+pQn /WFdVCVd702yYlxXf0yqMn+9r15+FWVWDotsPPtzWJWz53GdlfXhsJrs93rJ0QDL3DCO5hnTyVU+ rG8V94dc4UbVIfwwnB/CU+H0oTZ3yeD5vqb9Loryn14Pk48uk+/VdJKNox+nL/XXQZ3VeTLMGD80 XHj7v3YiWPRnw7ysmTM86f/7cFOM6kccgEiOs6dvefHwGIdO8mh2IHFxNs4eZji65Kwq66Oj6uX2 wMB1GmMCEaAZd2HwrBjnEkEDBleh43s2wakdHZ+cnv52nI2L+2kR+m/iVprz5LxG/7BfPoxzxpPL 7CX6hKNQyaDOJz/hXrwbmkiOTYunupomfzf+wo1e71ZKi12XPwo+UqE2uUrfklH4XaeyupoBkAak UVunKWDzzALKdlxLHqC2mvwwguYbEEp2fOtH06oSaBJ+VHuwiidEOxGupQpWpm1Rn5HRN0U84zFQ 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 GpXwSoLiS8jJq4iKfyX+/fiv4g0xvvic/AqKs8d54lSnNra4cbUVOheXMfcbqI91XJw3syLKKaKc bqdS7nYKcuxxfO1QnY/ZX7ErUVEiKqo7SvFFoXpUpDtS0S7dkaovst/giiib26Zol26bGuezwaJ5 zIqYWFsRZXVbFX+xdYJV8VmLSyt81j59K0gVHiFI2EGqWeuFcLorsK63x4kwgfd5e21Nbm5Vh5km VQXME6cExPmBjBrt6queHDCeHyD/5Cl17UJsqm8XSmltIFb7H1s9f+7GjVSSUhVIqakL3JRSXxVo hfBpohuCUtrjqKQ+d9qSZUtyc5dOw2XakqW5+g9yYpmWy9WM2s+Spchrn2V6nnJ/MXE10KlLkJZK 49JfbvV/PYn/dAf++1M7ab9kMLJbOYdalPXA2cBZQCtwJrAOWAusAc4AVgOrgJXACmA5sAxYCiwB TgcWAQuBBcB8YB4wFzgNmAPMBmYBM4EZQAvQDEwHmoBG4FRgGtAATAWmAJOBeqAOOAU4GfADtUAN MAmoBiYCE4DxwDhgLFAFjAFGA6OASqACKAfKgFKgBBgJ+IBiYARwEjAcGAYMBYYARcBgYBAwEBgA FAL9gX5AX6AAyAf6AHlALtAbyAGygSwgE8gAegFeIB1IAzyAG0gFUoBkwAUkAYlAAhAPxAFOIBaI AaIBB2AHooBIwAZEAFbAAoQDZsAEGIEwwDCyG1cVUAABELUI2EQX0An8BBwA9gP/BP4B/B34EfgB +B74DvgW+Ab4GvgK+BLYB+wFvgD+BnwOfAZ8CnwCfAx8BHwI/BX4ANgDvA+8B7wLvAO8DfwF+DPw FvAm8CfgDeB14I/Aa8AfgFeBV4CXgZeAF4EXgOeB54BngWeAp4GngN3Ak8ATwOPALuAx4FHg98Aj wMPAQ8BOoAN4EHgA2AHcD2wHgkA7EADuA+4F7gG2AVuBu4G7gDuBO4DbgduA3wG3ArcANwM3ATcC NwDXA9cB1wLXAFcDVwFXAlcAlwNbgM3AZcClwCXAxcAmYCNwEXAh0AZcAJwPnAdsAM6llpGtAutf YP0LrH+B9S+w/gXWv8D6F1j/AutfYP0LrH+B9S+w/gXWv8D6F1j/AutfYP2LxQD2AIE9QGAPENgD BPYAgT1AYA8Q2AME9gCBPUBgDxDYAwT2AIE9QGAPENgDBPYAgT1AYA8Q2AME9gCBPUBgDxDYAwT2 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 mOZimotpLqa5mOZimotpLqa5mOZimotpLqa5mOZimotpLqa5mOZimotpLqa5mOZimotpLqa5lONS jks5LuW4lONSjks5LuW4lONSjks5LuW4lONSjks5LuW4lOVSlktZLmW5lOVSlktZLmW51M2lbi51 c6mbS91c6uZSN5e6udTNpW4udXOpm0vdXOrmUjeXurnUzaVuLnVzqZtL3Vzq5lJ39GkuFbhUGO/G /+7CKBeGuTDMgQIHSvdNw9Qdpu4wdYepO0zdYeoWqFugboG6BeoWqFugboG6BeoWqFugboG6BeoW qFugboG6BeoWqFugboG6BeoWqFugboG6BeoWqDNMnWHqDFNnmDrD1BmmzjB1hqNPmAzvmAzv6P6s 9bwydossbpXFePR+vheLrPf3W7c/aFd3KD6ED+MwfARTcTgudM5FuBiX4Iewg6T1GK3HaD1G6zFa j9F6jNZjtB6j9Ritx2g9RusxWo/ReozWY7Qeo/VY9ENa99O6X8RZEWd1QUYXZHRBRhdkxvX/SwfQ /X+qfDv4WOmbjf99tffzo58f/fzo50c/P/r50c+Pfn7086OfH/386OdHPz/6+dHPj35+9POjnx/9 /OjnRz8/+vnRz49+fvRTMEvBLAWzFMxSMEvBLAWzFMzqhoxuyOiGjG7I6IaMbsjohoxuyOiGjG7I 6IaMbsjohoxuyOiGjG7I/F90Q4ZDGQ5lOJThUIZDGQ5lOJThUIZDGQ5lOJThUIZDGQ5lOJThUIZD GQ5lOJThUIZDGQ5lxtf4ofH/Cnkyr7K8ypo2WdMmTfss7UsaZ2mcpXGWxlkaZ2mcpXGWxlkaZ2mc pXGWxlkaZ2mcpXGWxlkaZ2mcpXGWxlkaZ2mcpXGWxlkal3LMyjErx6wcs3LMyjErx6wcs3LMyjEr x6wcs3LMyjErx6wcs4lSLczEtZgF9SbHrByz0T5mcf6ve0al3TLe6QUztfB/6hF792vtUd2Z6rak bivTbZt12oE6rTKa9t5EmWk1rsVc9+U3uNbNYUhlDzm7qDeHrM6j3nUshQsUHn3frmlIdQ+p7iHV PaS6h1T30P+naTOk+oZU35DqG1J9Q6pvSPUNqb6h/6e7otLdSpFSr7133zIaxfc8V+TS7uhbtG2i bRP/Bvk3SNvSnU0nJybRt4++fePzb6HHd7tHuMdOaZHn7g99dO2jax9d++jaR9c+uvbRtYmuTXRt omsTXZvo2kTXJro20bWJrk10baJrE12b6NpE1ya6NtG1ia5NdG2iaxNdm+jaRNcmujbRtUlNDaqp QTU1qKYG1dSgmhpUU4NqapDufXTvo3sf3fvo3kf3Prr30b2P7n1076N7H9376N5H9z6699G9j+59 dO+jex/d++jeR/c+uvfRvS9RynMmrsUsXIfrMTv0jWu8c08nFKP9Y89EU2Iv2XG+rC5fCfNjr4X6 2A77jHxYGNsZWuImZ/wYd6/HhWXxE0P6vd9W/na0T/xfxv9doNLvFPYnN4Y1HFvic5fiZR3wSmiL rVTpr+I111zl+HrYGFvjTrfN1dodO9AfTY4N6NS8PW7BTmgMu8JwPAo98XJU4BB3/8eF3vjxYUf8 MzgBJ4VC/LSwJVkdssmLQnPyUpgRyR85XhE2Jq+EmZCc41jrOBf20Mk6WDGTt0FXJhd6/S7PmX3J +zxehId8xpKwM/mEz1+G/wg7kr/D055r8Pg5RzklWzzXirVY73EKG/3chR7nDYae5A6MhZ6qA0Ku 6kBMgbvDKneHVUd6fnporrKnrxJX1U1htOq2sKPqHtyPx0Iu+sc9qnbyqUjV9VQdpOogVd+h6laq pqi6nqo7qLqequupWaDmCDVHKDlCyRFKjlBxJxXzVMxTMU/BQQp2UnA9BddTsJOC6ymYomCKgp0U TP2Ngp0UHKTgIAUHKZiiYCcFOyk4SMFBCq6n3iD1BqmXp16ecoMUy1MsT7E8pfKUylNqkFIjlBqh 1AilRig1QqkRSo1QaoRSI5Rav0epTkoNUipPqTyl8pQaiQ6PPRnmxJ4J/0GpRjW4m0KPU2VbbFO4 RJ3NjA2Eh1X3t2Ojdto7wxfV2Z/i8bAyXhZ+Hk+Gy1V7e/yAMDV+WHRx/KPhGpV/ePzY8GWqPab6 z1RzD8a/GObGTw8X7PntrO74v4RH4ueF6fGasLz0+0uy+qOZ9JJV4hW8Ft5yxbf5sckV064w4FOH fOIWn7hdL52ml77gjvBJjr0UWr2r1C9vjPdIf/Rh717rnau9c6vY0mJL+IS28X44MbR550thtXe9 7V3Pesf+3rHZ9brH+9dd9XgPH6ZPj/H4uLDJu3pEuTL6kMraMf7OlSrrVaxSMa979xpV1WYX2e7Y Ebaqjq2qY6vK2KoyNquMzapis6rYoSp2qIodKqKoIooqoqgiNquEokooqoStnNvKuR1cK03+/mgv 8ZSJfInrPem6f5Drc1gVdtG1i57p5HWh4PNHfP6Izx9J3u/xL0LB54xEE71rVORXeceWUt3bCT9p ljwjl1dCi2c3xlrNkZKGm0KGbq0+d73PXR+d56oLnT1fT/WOV8sfQq2r13rnMCV2UWKXT+ilRKDE 6J6+GqXEaCwVlvrEBpXUEsuqnkocEC6KT+HGQTgYR4Sr40fio2Fb/ON8PhrHcI/u8S95/fTx310+ XjTH671e6o5Sd1Tv9VJ4lMKBwkHv9VKhltKBEgspsZASC/VfL7V3UXsXtXdRO+i/Xv3XS/VdVN9F rVrKj1KsNvmUSbQUz4erkysd30Az1mADOvGW17odN/uMLeHqqij8qWpSWFpVhnJM9fgoTDehFoSF erCXm7uq7g1bqu7DIjyAxWFplFCRI6pxC6dPMH3eNX3eNX3e5fopOv1dnf6uTn9XV78bHcqPkpcF 2g/Rfsi7ysyoYTNq2Iwalvuo3EflPirvIXkPyXtIrkNyHTJfhs2XYbNl2GwZNluG1few2TIs1lFx DpkVw2bFsFkxPKHSFReogHu5v4L7d3L/zthyjjbipfBabKVV8VW8Fh5TBbtjaz3fprZSYWZsQ3gh 1omN6MJb2BRuinU7bkGvz9zqmEYf+qMFqqUhlvHzNmRV3qBjDtvD1bEhDPt5BDtCjdnUYnKnTO6U Dv62GbUmtttr7+DdsDz2Z8dgFZ6AGErza6Jqm+TnMnOqMsyPJ/ycDDPG59nejvtgX+yHA8JpqvUs 1XqWaj3L2npj/ANhVvyDXjsUh0XfiU91PBxHmHlH4qPhX+NHefwxfNzjo/EJP38Kx4SvmJH/ZrI8 xbUFXFvAtQWq/Rzz8rb4yc45BZ8NP4l/zvFUnBbmxT/v+AV8MXxXV5wV/zs/nx6u0hnf3vMbs0/p kFnx86OD499DTXjTfP1tsia0JKfjirBbl+zWIXfqkN2qZIEqWaBKFiQXeP0n+HfcjJ/h1mhK8jb8 HAudf4/n7sV9Hi/C/T7nQY9/4fhwmJF8FI9hSbgx+aswy2o2L/mkx7/Bb/FUOFNXnWmFm6cCF6jA BfYHN1rl5iX/M/wk+Qyedd5znnveeS/4eTkaPb/S49c8v8rnNnnudbzhuWasQYvPasVarHP+euem sMFrnTC9VfcCXXtmclN4QeeeaRWdp3vP0r1nJns9pwaTajD5NtRhsh8DYUVSHSbVYTILNZjcjiEM mwAjKPi5GJYnd2KXn9+FmkuqOVNhfpW6q1J3VfGwvGqi46Qw05SYaUrMrKrweLLpUQk1WJUMK6qq sJef98Y+nt8X+2F/zx8QUlb6lJU+VXWQzzvYOYfgA/ggDsWHnHuY1z+Cqa5/uOdMWNNoftW80KLD F1TdFE2p4nUVr6t4XXULbsVtXrsrzNL5C0yqM02qM02qM02BBabVmVUP+pzF4n7YZz7m85d4/Cs8 jl+Hq6OppsRVpsTvxlfml8fX81dNgj4dv1Bnf1dnP6Nrl+na1dbcvI59Ucf26spW3dikC5frwnW6 7u911vd00jIdc5uOeVXH9OmSe3TJOl3QqPp/pfq/rvpXqP7Sn1Q4WcW/Gf038+oJkfzWirU2tswq 9YyZ8AfPPYeXrXOveG1l6DA9O6xcK8ysQSvXM9bAQdEOWL2esXo9Y34tEfmr5tSAyNeYRStFnTJv tpg3W0TeZ163iXy7md1mZreZJytF/5RZ8JRZ8JQod4vym6U9j9VrbfLfTNqLwjNWsGesYGutYM/o zUG9OWgFW6s/n9Cfg/rzCf35hP58wgq2NnmD9/0Ut+DW0GGqd5jqHXpz0Gq21mq21oTvMOE79OYT VrNn9OYTeukpdf+UOn9KTQ9YT9qsJ23qdsCa0qZWB9TpSnW5RF0uUZdL1OKAWtui1raotS1qa0Bt DairLepqi7paaS1qU1MrrXDPqKknrHBrrRwd6mOJ+hhQH1vsIJerg0a8ZIf2WvgDpbdaHVrVwpdN 8y7TvEs9vE7VHqq2ULVFTfze5N5E2VUmdRdlV1F2ldrYpjbeNo3XmcbrTON1auRTamTMlO00ZTvV ygZ1kjZZm03WZpO1Wc20m6YbTNGUybnORGw1EVupvpXqW6m91QRsNQFbTcBWE7DVBGyl7FZTr9XU azXpWk20lCnWaYp1mmIpU6zZFGs2wVIm2AYTbINptcG06jSdOk2nTtOp03RqNp2aTadm02mDqdRp KnXumUrNplGnaZQyjdZxZ5XJ0mWydHFpFYdWmS6bTJdNJsgm06LLtOgyGbpMhi6ToYtTLZxq4VSL qbDJBOjiVAunWnR+F6dW6fxWHd+q41t1fKuOb9XxrTq+Wbc36/ZO3d6p2zt1e7Nu79TtXVxs0eVd urxLl3fp8i73xP12x6V99YnhnegkXVa6z7pURy3SUYt01Mt8nq9rdvL1cb428LVBt2T42svXpTxd ytOlOqKoC4q8mM+L+TqgyI/5Kr6oyhep8kWqfBEv5qvyoiovqvJFqnyRat5Jr6V0Wqqad9JqKa16 adWrqnfSq1cl76RPA30a6NNAn17VvFM176RRA40a6LNU9RZV7yKVu1PODXJ8JdymYsdksNyjHWLP hyfV5qboAzLb4VFaZgMyG5DZkKyazYGMzJpl1iy6HaJrFl2z6HaIrllUO0S0Q0QDIhoQ0YBodohm h2gGRDMgmmZRlO5lB6LDXCnvShtcKe1KaVfqp2HpHrUlXvrXdMsdK6zC/e4LBx13oOBnfUSLEVqM uGqeFiOunHfltCunXTlNixFXz7t63tXTrp529RZXL90fpt0jbDIvd4Q3Zf2mK4+6YpdZ9pyJu97E Ld0f/H584pY5a3TPPVRmz59hOi5+XvSZceV6vNLllZ7xR6V7u93jOk7a864Rj7I+v8PnD9sNp+xp sxTeJc9KSkSYZE9ahnJM9fgoLA5DPmPTuDOtzt5oFSnFOBod5TNe9cof6Dfis/7ojLf/cn8/vt5E 5ks5KlAZ/iirc2XzAzqO0HETHTfRsXR/vYl+I2L4oxheFcOrYniVln993/1BHPq++++pzj9SLx7l uNj5D3uudM89Qc656CDxDYtpWEzbxLRtzzc420U/EC/9i8YVYbs4totjuxi2u/awaw+79rDrbnPd ba67zfW2ud4219ruOsOusS060qc/L/s/yXzV+6ZsG52fcqXC+FStHP9NkZ/u8XKD7GtKv9Hzl+kj 41Wu+ryrPu+qz/8vJ09p0kx1XmnKHOVYmhiLnfu3E2Py+Cq6wz5gp3vrMr5+K1yx57c73nTl74z/ xuhnxL3Jmb/nWrP7gg7xv0ilZe+bIKWVIUWpxbwurbtvU2sxtRbL50WfeotPW8rFZnu3DgoupuBi TjZTcbGOSOmIFEeb5feirkjJcZMcN8lxE1eb7cE67ME67Lc6/mZypLjczOXm9ybHVJ9xZFgs9xfl vYnLzePT44NU30j1jePfRuRNkZ3hFVEPUn5jvPTvd1eMf4czSO2N1N4oykERDlJ5I5U3UnkjlTdS eSOVN1J4oysNUngjdTdSdyN1N1J3o67Km7q7rH6qR4Xlw4tRzCq4y05pZxS3G3nNo2GP+qKpHuXc wxTtT3L2Jzkr5ZiVcsxKObbnO8KMPcuQfXzRipex0mWsdGNWujH79aLVLmOPXrSvyNmTF61uY1a3 MavbmH130b67aGUbs7KN2XfkrGwZe4+clWbMSjNmdRmLJlvLd4rkIWt3zppd2te97ao5Dj7GwcfG p8pkq/1o/ACT5JiQlcGAs7Lxk6K9TRj3PNHxrpOKJvqcrT6n9J1rsZSBjJPj3yBkSudT4gD9dFIo er70rawzvG9LdKBHpexHZT8q+9HxzM+3V/heaH9f5qMyHx3PusWxFWuxEV2QncxGZTYqs9HoI662 hr55+q6n7/r335m7dtZV0rTNu0LaFdLv3Y0/Pf6NX5q2edqup23+r+7Q13ucGv8WcPxOnbbrXT1N 2/Xvv1uPJsg8Hx0Zr/LTAeFhu6Wc3VLObiknpmfF9Cy18nZMA3ZMpW/XBum0zc4ox4F3OPAbDvzG feR+7iNLvx1Z2vUM2PUMiOtZu5sBu5sBu5sBu5sBu5kBu5kB8TxrJzNgF5MT07N2FAN2FAN2FAN2 EwNRuWh+58o7XLHoijtcbaerve5qr0dHeHUz3frEuEGMG5xZ2PMd9v9w6CQ7u9PU9el0WBL6aLiL hrvec+lpzzV4/Jzj83Zarzm+37X1HqfwF/feck6P87eEDX/l4hSq9VCth2o9lOqhVI+4u/d8J9VD kR6K9FCjhxo91OihRg81eqjRQ4keSvRQoYcKPVTooUJP9AF5viXHt+T4lhy3y7FNjuvkuE6O6+xU S1W3Tj7r7CozdpUZubxlZ1mqwHVyWSeXdXaSGXmsk8c6ebwlh7fksE4O6+SwbvxPUR4R/350RLQo ujDcH12Ei3F1eCSaHe6I5uDHqMVc9IZF0VakMeKcneH2aBd24x28G26f8PHQMuFofAKfxKdwDI7F cfg0jsdncAJOxEk4Gafgs/gcTsVp+Dy+gC/iS/g7nI4v4ys4A3+PM/EPOAtfxT/ibHwN52Aavo6a 6KAJK8KLE14Kv5/wMl7BSryK18LyCauwGk14PSyf+HC4Y+IjeBTNHq/Bm5DrxD8jhNsn7RPun7Rf WDTJLnuSXfYku+xJB+FgHIKecMekrHMGMRTuKDsaJ+OycH/ZDFyOH2FmeKTsWtC9bGFoKWsJy8vc 8ZQfFZaXfwwfD78vPxqfwQkefx7nh0XlF+B74fby+7AEPR5vxhbwrHwgPFKewXavjXpcCLdXxEJL RRwTMQllsFOssFOsmIxKJJBEFfbC3tgH+2I/7I/PheUVp+L7fr7Ycb7jrx3rw+8r8qFlss+avL/9 8Xej/cKaaH+YftGBmIKD8DF8HEfjE/gkzsbXcA6m4ev4Bs7FN/FP+Da+gwvDQyr3IZX7kMqdG10T FkczcS1m4TrMDvWquV4116vmetVcP/FnYc3EW3ArbsPPsRC34w7cibtwN+7BvXjY+x7Bo6Ge6w9N Wh/WTOrCW+hGj+ffduxD1uuDGPLcu2FNWRnKMRmVOBiH4KM4CnQoo4PqqC870fFkx9Mc/wHfxffw fVTjsvCQynlI5Tykch5SOXNVztwy+ZbJVwXVV/yopE10R2iJ7sRduBv34F48jl+jHk/gSTThdbyB ZqzBm2hBK9ZiHdrQjhR6w9NmwtNmwtNmwupoB0aRRwFj2BmWmRPLzIll5sQyc2LZxP7QMnEAGWxD Fu5OJuawHUMYxgjcsUwcRel9f0YIy/Tb0+VmQbneL9fr5Xq9XJ+XTwury//Z8Vs43zkX4HthWfml Hl+DmZiF6/Bj3IiboN/KaVROo3IaldNIPy0r/6XjEsdljs+DDuV0KKdDOR302tN67Wm99rRee1qv rdZrq8u3IYvt3jvqeXrou2UTjo0mRvtGk1BW+rdGSv+kAkp/d3glEkiO/zuS+0Z74dRoSnQaLgxz 1PgcNT5Hjc9U49PV+HQ1Pl2NT1fj06PrfcLsMEOdz1DnM9T5DHU+I6qL9o5uwE9xI27Cv+Nm/Ay3 4FY8F304+iN6w2yOzubobI7ezdF6jtZztJ6j9Rytj0p/g/TOUMvVWq7WcrWWq7UTHgjtEx7EQ/gF HsYjeBS/xGNYgl/hcfwa9XgCT+I3+C2ewlIsw3/gd3gaDfjP0B77dLR37PhoSuxExy/hrDAn9tVw dexsnOtxTVgQmx4ui12Ky8Jl9mxnxy8I19i3nR3/vuM1oSk+M7TGW6JJ8dbogPg6u952d+UdUWW8 N9THt9qLpKOPx9927Cv93UCO26L9Jl4T7TtxJq7FLFyH6zEbc/Bj1GIu5uHhMMO8mGFezJi4Ntp7 4jq0oR0dWI8UNqATG9GFt0BP1V6r2mvNmjmT9g3tqn62GTNj0rao0nyZY77MMV9mTNod7VsWh9oq 2w/74wgcHWaUfcLxeJwQTTFTZpSd4ufLwhzzY475Mcf8mGN+zDQ/Zpof082P6WVqqWw21FLZ/aG9 7IHxP0HfXv4hfBiH4SM4HtNCvU6brdNm67Ta8iujvcuvwnwswB24z/MPOz4afVg31Zb/xs89zt+M LVBzOudunXO3zqnXOfXlg9Hk8hy2O3/U6+pPB9WWj0V7VxwQ2isOxBQchINxCD6AD+JQiLVCrBVi rRBrxVQcjiNwJD6KH/isC3ERaj2ei3mhffKE0F55Xri68nzUhssq50HfVOqbSn1TqW8q9U2lvqm8 DT/HQtwO+VbeibtwN+7BvbgPi3A/HsCDeAiL8QvQp/IRPIpf4jEsifZOzMGPUYu5mAfaJmib+An0 d0J/J/R3Qn8nxJkQZ0KcCXEmxJkQZ0KcCXEmxJkQZ0KMCTEmxJgQY0KMCTEmxJgQY/KT0d57TUYl EqV/ATn+pk7pNY1KP5X+7pGDYrNMs6Rpliz9Yw6mWdI0S5oNSbMoaZolx/9Xhb2wX+i0A+i0A+i0 A+i0A+i0A+i0A+i0A+i0A+i0A+i0A+g0+fY3+fa3E8jYCWTsBDJ2Ahk7gYydQMZOIGMnkLETyNgJ ZOwEMqbkJabkJabkJdEPQy6qwXRcisswA5fjR7gCV+IqXB1qTNQrTNQrTNQrTNQrTNQrTNMzTNMz TNMzTNMzTNMzTNNK07TSNK00TStN00rTtNI0rTRNK03TStO00rrbZd3tsu52WXe7rLtd1t0u625X VPq+ox5P4Ek8Fx1i8h5i/c1Zf3PW35z1N2f9zVl/c9bfnPU3Z/3NWX9z1t+c9Tdn/c2Z1lea1lea 1ldGfe5l+zGADLYhi0HksB1DGMZIuM9kf9xkf9xkf9xkf9xkf9xUv95Uv95Uv95Uv95Uv96ePmVP n7KnT9nTp+zpU/b0KXv6lD19yp4+ZU+fsqdP2dOn7OlT9vQpe/qUPX3Knj5lT5+yp0/Z06fs6VP2 9Cl7+pQ9fcqePmVPn7KnT9nTp+zpU/b0KXv6lD19yp4+ZU+fsqdP2dOn7OlT9vQpe/qUPX1qwjei KRPOxTfxT/hnPBDarERtVqI2K1GblajNStRmJWqzErVZidqsRG1WojYrUZuVqM1K1GYlarMStVmJ 2qxEbVaiNitRm5WozUrUZiVqsxK1WYnarERt7iUa3Eu84F7iBfcSL7iXeMG9xAvuJRrcSzS4l2hw L9HgXqJhwhtR5YRmrMGbUaVVLGkVS1rFkrFTS39G1fErjmeFeVazaVazaeOr2QUhG7sQNVa3961q sRkha2X7gpVtupXtC1a26e7FF8b/i7ozgY+iyN9+dVdPV09PTwghBAj3jbqux7q64oHroq4KIqso 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 ujrq6qiro66Oujrq6qiro64uUlD3WzI8SoZrygpyeI2wo3Y1alejdkQsRONCNC4k0/08eQit/Wjt V5YxUgtwYgU1V8paMr+WzK8l82tpxYoPxfhQjA9hZT0z5gZ5ghFwghFwghFwgrFUytxQhEcePPLg UTEeFeNRMR4V41ExHhXjUSEeFeJRIR4V4lEhHhXiUSEeFeJRIR4V4lEhHhXiUSEeFeJRIR4V4lEh HhXiUSEeFeJRIR4V4lEhHhXiUSEe+fHIj0d+PPLjkR+P/HjkxyM/I6SWEVLLCKllhNQyQmoZIbWM kFpGSC0jpJYRUssIqWWE1DJCahkhtYyQWkZILR4X43ExHhfjcTEeF+NxMR4X43ExHnvw2IPHHjz2 4LEHjz147MFjDx578NiDxx489uCxB489eOzBYw8ee/DYg8cePPbgsQePPXjsEXNwUMNBDQd1/N6F izrOHce5MM5FcC6CcxGcM/xvjf+f4p6Ge5ryJNeexuln5A4cPImDJ3HwJA6exMFaHKwnT47iYgAX A7io4aKGixouario4aKGixouario4aKGixouario4aKGixouario4aKGixouario4aKGixouario 4aKGixouario4aKGixouRXApgksRXIrgUgSXIrgUwaUILkVwKYJLEVyK4FIElyK4FMGlCC5puKTh koZLGi5puKThkoZLGi4FcCmASwFcCuBSAJcCuBTApQAuBXApgEsBXArgUgCXArgUwKUALgVwKYBL AVwK4FIAlwK4FBB9cCmKS1FzNK4RWbgQwYV6XKjHgSgOGN+b6lG3HnXrUbcedetRtx51o6gbRd0o 6kZRN4q6UdSNom4UdaOoG0XdKOpGUTeKulHUjaJuFHWjqBtF3SjqRlE3irpR1I2ibhR1o6hTjzr1 qFOPOvWoU4869ahTjzr1ogczQ4yZIcYs/B3reZryJFE8ZeYPvef4BdjM/ZdkjBEXY8TFGHExRlyM ERdjxMUYcTFGXAytY2gdQ+sYWsfQOobWMbSOoXUMrWNoHUPrGFrH0DqG1jG0jqF1DK1jaB1D6xha x9A6htYxtI6J2WjtQ2sfPdbosTF/1TAKahgFNYyCGlP/cyPgGbJ8A7Phs7ARngN28Irxk41/nu0+ /PDhhw8/fPjhww8ffvjww4cfPvzw4YcPP3z44cMPH3748MOHHz788OGHDz98+OHDDx9++PDDhx8+ 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 1mXIYF2GkqzLkMHs9q/Mbk8XvcTjdKZTHaa/M8ctYEZ7onhDvEHVxftgtJWZyx7PXPYE8bX4GszV sdiKYpqYhvQZYK4VWeuhrPhRzAOXXSAWIHS6DzVYBaeaWCyWIGWZWIbQaeGUYz2ISmK1WIO4U4Wo ItaLDYg7bYiqYqfYhbhTiCgvdgtL5VgnooL0pEDcqUVUkYEMEHeaERVYM6KSTMgEUjLBm2syY67N jPlUZsx/k2VlAdIdb64pK4M3nyyrgjfXZN5cS9aQNRA/SWImBQ59KtUBhz4d8fqyPp0kzwCTrslM +hR5Jph0TdlENkH5jknXZA59EXPoi5lDX8Qc+mJmz83BmweANw8EVy7BXLk0c+V85sr1/PfAlc8A V/6MGvqf+99QE2bMZ6UpWQSsZGFYySKLlSxaMIc+jzl0Y1a1OJeZdH3mzZoZs2bGHDFX1syVSweL g8XgwUuDZUhx/DiH+fF5afy4NPPjvGBTsAmhY8DNmQHrNAbcnBmwUAoMWDP31cx985jjNmd2q9N4 bR5z2ebMYjWz2NLMYpuDudbE2b2ctTmz1YSqq+rCsp6qB0vHWZszW01yU818VDMHPYc56HlpHPR8 5qDZzEFzmIOWZg6ax1wzT/VWvcFcn1RPUl3mmvWZXzZQA9QApDt+WYb5ZWM1VA2lZsws66qXwCwb MLPMZ2bZUL2iXqcm4JejkeI4ZUtmkw3Vu+pd5HKcsi5zypbglO8j7zgwy3xmlvWYWTZUn6rPUMLn 6nPYf6G+gL1jlvnMLOsxs2zIzPIsNU1NQwmOXzZmflmX+WVD5peNmF82Y35ZRs1T83DWMcs9nHKV WocUxyzrMbOsz8yypdqtdlMD5pQNmFM2BKfMRdyxyUbMJhvrivp4asKc8izmlJcwp2zKDLIxM8hL mEGexQwyX5+uT0foGGQzZpBn6Sa6Ccp0eiuG9VYC1lsxrLdiWG8lSNOOuoD1VgLWWwn0xfpi1O5U VwJWXTGsunIuq65ksepKC1ZdyWXVlVxWXQlYdSVg1ZWAVVcMq65kpamuGFZdCVl1xbDqSi6rrgSs umJYdSVIU10JWHXFsOpKwKorWay6ksuqKwGrrhhWXclNU10JWHXFsOpKC1ZdCVh1JUhTXQlYdSXO qiuGVVcCVl1pkaa6ErDqimHVlYBVVwyrrgSsuhKw6oph1ZWAVVfOZtWVc1l1JYtVV/7CqisXsOrK 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 yIPqCfUk/911la62qe1qh9qpdqndao/aq35T+9R+dUAdVIfUYXVEHVXH1O/quDqhTqpT6rQ6o86q c+q8uqAuqkvqsrqirqpr6rq6oW6qW+q2uqOiKsONuNn1M7qKflZX1dV0df2crqFr6lr6eV1bv6Dr 6Lq6nn5R19cv6Qb6Zf2KflU31K/pRrqxbqKb6mb6df2Gbq5b6ET7r5X918b+a6fb6zd1ku6gO+pO Oll31l10V52iu+lU3V330G/pnvZfL/2O7q376L76Xd1Pv6f76wF6oB6kB+shOk2/r4fqD/QwPVyP 0B/qkfojPUqP1mP0WD1Of6zH6wl6op6kJ+speqr+RE/Tn+rpeo6eq7/Q8/SX+is9Xy/QX+uF+hu9 iP92u/5OL9FL9TK9XK/Q/9Ar9fd6lf5Br9Zr9Fq9Tq/XP+oN+if9s96of9Gb9Gb9q96it+p0vU1v 1zv0Tr1L79Z79F79m96n9+sD+qA+pA/rI/qoPqZ/18f1CX1Sn9Kn9Rl9Vp/T5/UFfVFf1zf0TX1L 39Z3dFRnxFCMoz/TM/RMPUt/rmfrS/qyvqKv6mtxPeLeiusZ93Zcr7h34nrH9YnrG/duXL+49+L6 xw2IG+i97fXy3vF6e328vt67Xj/vPa+/N9Ab5A32hnhp3vveUO8Db5g33BvhjfcmeBO9Sd5kb4o3 1fvEm+Z96k33PvNmeDO9Wd7n3mxvjveFN8/70vvKm+8t8L72FnrfeP/wVnrfe6u8H7zV3hpvrbfB +8nb6P3ibfI2e796W7ytXrq3zdvu7fQOeoe9o97v3gnvlHfOu+Bd8i57V7yr3jXvunfDu+nd8m57 US8jTGEnLMIyrMJuOBQ+HD4SPho+Fv49fDx8InwyfCp8OnwmfDZ8Lnw+fCF8MXwpfDl8JXw1fC18 PXwjfDN8K3w7fCccDWdEKOJERERGVMSNhCI6EhOJjcRFvEg4EomYSJZI1ki2SPbIPZH4SI5Izsi9 kVyR+yK5I/dH8kQeiDwYeSiSN5Ivkj9SIFIwUihSODIhMjEyKTI5MiUyNfJJZFrk08j0yGeRGZGZ kVn4lhr39nGPvY+YImwExZ3zT2Qtu79vky/Y/X2HbCQb0y7ZTL5Oe7Cb/iaTZTLtszveu7RfjpQj 6bAcJ8fREezsR7FvHcO+9Tv2rePYt07IRfLb/2nvO+CiSLZ36/RMD0NP0+ScQZFMDxkVEwJGgmBC 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 uW5fDkcsSitbJK1XDW1tqxwuqYSCuc2/fKl4WN4D5aNmxX/e7XZNq550/Na2T6cEFs6ZMuVE+6R3 aup7F+yTXly8qK1j6SIyrCdIsqWe9NKMhpbJTUMqeKZV+sNzm6Q/T69IySTG4yv3FfvHZNtHXHx9 wv5Jj8s1k2uaJ02Rvn+gW/p+yuQ6MfY5W9TqpUtI6bMHyLU3LF236mIS+c5mfezuB7vScfZj8OQm 4k5T4+l9wl+lYrRanYYht2CBVsdya3helafKV5epitVTVTXqBaoZ6tWqRWodoC/A3tOqIzrQaQmn VvErVUTF8oRhOdTSWp2W1wHPM9Ar/9kfoRPyeCcCzAY0BUUD4b31Fl+91+Opx6UAbyGNcG0KCqhH oC2Hcv5muJnn6gOkfr3Q39fXp1DTh9VPFmrLtQzUo9eJW95JnHpGlSgtmd1/bLZ0M5NCDnj27SOZ 0lH+yMUFTFT/F3Rn4rlWvY2jNMDb+0Env+63aAVSwWdRMgpZajSNMgp5nB+h19v1Hj0LWoPOrBe0 8TpRn8JmcF6dVz9MN0w/QTtWt1Lfoe3U36u9T7dNH5mrC+jamDae09HHWE0ReXy7QchjKHhGx2o5 LH/SLMB4mvCLRpry6/VIPXCsWsuq9VqeaYO9JjARHtvs0+Kda9S/MwrnT3vqEZYCOk90mlDxYpSd hXE9qa/3eKhlgaeKOImFChTiVL0trZFOSd/itZU8jWewgjzNftq/gll/0c4f6bcxX+LKT5Y/5vZx a8EMWTDLP9ocw2fExozlx8YH+ED8PH6OeV78DcmL01szjeQrUfREpfqN5rzUVNcuj2DcFRWVJZKs Du+BHG8OMaeJaUxamroj9qls7CmKDOxwf04O9vd0IZ4sjyWigJ78ejJUhWeGHojQmYlWsq6kFOWE ufPwYNFT5bLg8XFwNouTrRrbnZFbYIiJ9hfnLhyUMDll6OLiHceun9lM0h7qujfwUoazgJBbiI9Y pG0k+QuVzWQZOdSVERlpzeiMGhERE/38/Tc9kJmZolXVjy60ELM5/dBL/RyOvlv+gh+B0lCABMj3 u0tIScIU8yxzG98Wq4rcahK0YO9iozSWtXBQVEXrOzT7E5UxCedOK8MqVMYjAHY+VU1lORUQESQ0 AIsyOn6E9N570zb7zdIu0lL9m0VvnpBun7XWNz87tTT7jk3MSFyf3Wkp+ShD3x1VJR2Wvtz6iJjQ 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 y9d9pFyjsyNffeCTGu8I7kIJzBRWF0uca6CEbdzqNppbBr0x+apmwSvbXmpzBboIAP4FBetU8g0K ZW5kc3RyZWFtDWVuZG9iag0yNSAwIG9iag08PC9CaXRzUGVyQ29tcG9uZW50IDgvQ29sb3JTcGFj ZS9EZXZpY2VSR0IvRmlsdGVyL0RDVERlY29kZS9IZWlnaHQgOTEvSW50ZXJwb2xhdGUgdHJ1ZS9M ZW5ndGggMzc4NC9TdWJ0eXBlL0ltYWdlL1R5cGUvWE9iamVjdC9XaWR0aCAyNDA+PnN0cmVhbQ0K /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABbAPADASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKr3N5bWUfmXNzDCn96W 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 RwBgKkajOB9MDvgVT+zavr2Gvmk0rT2/5dYZP9Ik/wCuki8IP9lDn/a7Vtx2ltDPLPFbxRzS43yK oDPjpuI5P41ZoAp2On2mnWq29lbxwQr0SNcD3PuT3PerlFFABRRRQAVz94DreqPpQ/5B9tta+P8A z0c4ZYfpjDN7FV5DHHQVyNpo/iW0F3a21/p9vBNdTT/avJeWc73LAbSQoKghc5YYA4oA6S9v7TTr Vri9uYbeBfvSSsFX8zWONT1TWQE0y0aztj/y/XsZBI9UiOGP1faPY9KsWnhyxgulvbnzr6+XO26u 28x0z/cGAqf8BAraoAy9O0S2092m3S3F667ZLudt0j85xnGFGf4VAHtWpRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAf/2Q0KZW5kc3RyZWFtDWVuZG9iag0yNiAwIG9iag08PC9CaXRz UGVyQ29tcG9uZW50IDgvQ29sb3JTcGFjZS9EZXZpY2VSR0IvRmlsdGVyL0RDVERlY29kZS9IZWln aHQgMTI4L0ludGVycG9sYXRlIHRydWUvTGVuZ3RoIDE0MzU3L1N1YnR5cGUvSW1hZ2UvVHlwZS9Y T2JqZWN0L1dpZHRoIDMzNT4+c3RyZWFtDQr/2P/gABBKRklGAAEBAQEsASwAAP/hDvpFeGlmAABJ SSoACAAAAAcAEgEDAAEAAAABAAAAGgEFAAEAAABiAAAAGwEFAAEAAABqAAAAKAEDAAEAAAACAAAA MQECABwAAAByAAAAMgECABQAAACOAAAAaYcEAAEAAACiAAAAzAAAAMDGLQAQJwAAwMYtABAnAABB ZG9iZSBQaG90b3Nob3AgQ1M0IFdpbmRvd3MAMjAxMTowMzowNyAxMTozMDoxNAADAAGgAwABAAAA AQAAAAKgBAABAAAATwEAAAOgBAABAAAAgAAAAAAAAAAGAAMBAwABAAAABgAAABoBBQABAAAAGgEA ABsBBQABAAAAIgEAACgBAwABAAAAAgAAAAECBAABAAAAKgEAAAICBAABAAAAyA0AAAAAAABIAAAA AQAAAEgAAAABAAAA/9j/4AAQSkZJRgABAgAASABIAAD/7QAMQWRvYmVfQ00AAf/uAA5BZG9iZQBk gAAAAAH/2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwMDAwMDAwMDAwM DAwMDAwMDAwMDAwMDAwMDAwBDQsLDQ4NEA4OEBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwM DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAD0AoAMBIgACEQEDEQH/3QAEAAr/xAE/AAAB BQEBAQEBAQAAAAAAAAADAAECBAUGBwgJCgsBAAEFAQEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAA AQQBAwIEAgUHBggFAwwzAQACEQMEIRIxBUFRYRMicYEyBhSRobFCIyQVUsFiMzRygtFDByWSU/Dh 8WNzNRaisoMmRJNUZEXCo3Q2F9JV4mXys4TD03Xj80YnlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW 5vY3R1dnd4eXp7fH1+f3EQACAgECBAQDBAUGBwcGBTUBAAIRAyExEgRBUWFxIhMFMoGRFKGxQiPB UtHwMyRi4XKCkkNTFWNzNPElBhaisoMHJjXC0kSTVKMXZEVVNnRl4vKzhMPTdePzRpSkhbSVxNTk 9KW1xdXl9VZmdoaWprbG1ub2JzdHV2d3h5ent8f/2gAMAwEAAhEDEQA/APVUkDOzK8HEsy7WWWMq EuZSx1th1j2VVBz3Ly3rv+N7qGQX0dCxxh1glpycgB939nH/AJmn/rvrJKfTupdV6b0rHOT1HJrx aR+fY4CT+6xv0rH/AMhiB0f6x9E63X6nS8yvJgS6sGLG/wDGUP23M/tMXg9ON176y9RIrbf1XPd9 J7juLWz7S+yw+lj0/wCZWp9V6TX0aynb1KjJ6k0k3VYZeTjkfQ/Xm7a32/mPrr/m3oqfodJeJ9C/ xm/Wnpz2Y9zh1eokBtNwPrn+TVkVD1Hu/wCOruXrPQOtHrGF9ofi2YVrXbLKLS0kGA/R1Zd7fd+d sf8A8GgSAQO+ynTSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkySl0kydJT/AP/Q9Nz8ynAwcjPvn0cS p99m3U7a2mx+3+VtavLGdQw/rNfRf9cej1dMw+q7/wBm9bxz6LmFk/o8u+xzm2b2N/RWZFez/R0e k/1avRPrf/4lOs/+Ecj/AM9PXH/Waqt/+J3Cse0OdTjYL6ifzXTTVuH/AFux7ElPKP8Aqfl3U5GZ 9UeoDrWE0Gu9lBdRktaZ/R34zvT9et/5v+m/0Sh9X/qB1vq7gXVHExwfcXiHDxlp9tX9v9L/AMCu 4zOj9O+p/wBYegZvSGHHoz7B0vNpBJ9X1R+q3v3f4Vlzd91n+E/z1Zs6znU0HCocMeup9gfaNXum x7vpH+a+kos2Xgrpd7brMk+GvFl0v6qfVT6thteU9r8q2GuLiS7XSX7f0mz+W/ZSt/o+GzBuzceu fSFrX1gmSGuYz2T/ACXBy5zpvRsvqFjXljmYznA23vkF4n3enu99rn/6T6C6bp1llmb1I2N2Ft7W NadfaK69rv7c71HiJlISMa19Mv0j6ZbyWQNkExrXQ9dv3nlf8V3VepZOFfjdTyX5dljWZ2Lba8vf 6NrrcV9XvP0cfJwrP+3VDpXXM13136tm5eTYOkMw8p9GMXl1TWYN2PhW5TK59PdbdTmLF6Jnj6vf Vn6v/WUNZs+z9RwL3OmXE2ZOf0+r2/vZeI6r/wBCFo4X1fsq6lV0D+bvt+qt1FpJmL772/aX7j/3 ZuserLM6PSPq7l/WXAr671vqGbVkdQb62LjYl5pqxqX+7GbS2v8AnLvS2WWXW/5n79DqPWes4n1X +svSMrLsf1LoRpbV1Csmux9GQWWYlj7Gbf1ltfqV3OZ/58/Sro/qR1TEyvqxhVBwrv6dQzEzaLCG vqsx2/Z7W3MPur/mt/vXJdcsHUOi/XXrtB34GWcXFw7I0sGIW1X3VO+jbQ++17arWfuJKejwOrZ1 n1U6tiZthZ1rotF+NlWNJDi5lTn4mfXP6TblUeney3/Seosy4Z/VG/UvBd1HMxG5/T7bcq7FuNdt j2Y+Jc19lh37/e5/0/31a+vNR6S+3r1ctxM3Ft6b1YNBOljHt6bmljdvuoyn/ZrLX7/0GR+jWXkd P6Z1Bv1DxOrNa/Dd0242Ne81iW42G5n6Rjq3fS/lpKeo6d9URg5bcl3Weq5jWte04+Vlb6nB7TX7 mMrrduZu3Vu3+x6z+mfWCzoHTOr4XW7X5GR0Al9V1pJsyca4l3TX+q4fpL7LD9is/wBHcr/Q/q99 TOlZ32jozKa8x7HVDZe6xxYS2x7fTsut/wBE38xU/rP03Cyfrh9WLLq5e+zIbYQY3toqOdjMtj+c ZTlVtuYxySmeBg9WxuldNq6nmXnqHUco3Zz22EFjrWWW/Zafc9tVONtrq9Kv9D7PYtA03dP6lh10 5d+Q3Jc9ltFz/U9rWOf6zNP0fpva1F67VVc/p9V4Dqn5MWAmAR6dqq5GL07AzMJ3S4rybr21vrrd u30n+f8AUYS72Vt/Sb1WnfHI9pR1v1fo6RixS3J7EddUrKLOs5ORbddZXhUWOooppeWbnM9tt1r2 e53v/m1LEbfh9Qd0u659+LkVOsxn2EmxpaQy6n1R7nfT3sUuiWspsy+nPIbfTfY9rDy6u13rV2t/ e+ml6jcv6wM9Eh9eBS8WvGoFlxbtqn95tde9EAVGV+syo/8AqSH+CkVQP6RP/o0Wq3qWXgY+R02w m/qFTxXhOeZNrbj+r2uJ+l6Pu9f/AItbOFjuxsWuh9jrnsbD7XklznHVziT/AClhXWZWU+3r+MN1 eE7bi1j/AAtLNzc2z/rm5/of8UugovqyKWX0u3V2NDmOHcHVHCbJsk0P1d/5u/mVDc67fL/df//R 7763f+JTrP8A4Ryf/PT1yP1k/wDyNY3/AIUwf+qx13vUMKnqGBkYGRPo5dT6bNph22xprftd+9tc uW+ufQciv/F5b0XprLMx+LVj11NaJscyl9RnYz6b/Sr/ADElK/xgf0r6rf8Ap5xfyouOeiYbXZmY Dk5j7bSzG0dtiyxjXen9Bn0f5y7/AK2g/X/XJ+qx/wDNzi/lTY3RszqGVc6oelR61m6940MPcP0b P8K7/oKvzF3DhjxS1q9f3fUxZbuNCzqvk9b6t1DIrqocccveBTTUdSZ/wln5+3/Cf4LYukwrW2Z2 ft1FdjKyfMVse7/q1nYbKKN1HQqhkZB9t3Ubdamnv+k/w7m/9x8b9H/pX1rS6Z0xnTqXsFjrrLXm y61/Lnn6Ttv5qGGM7sni1uR/RGnyx/xkYxK7J4u56f4LlNwumM6c7Avwan4GMcm6nCa1npD7PY1z NrXf4R1jnv8A69lqul2OMx+e7Erb1Fn6kbnPg+k4DMbWLdm9zN3+CbV/O/8AB/pFddg4rg5prBDh Y12p1Fx339/8I4JWYWNY7e5pD9/qb2uLTu2+jO5p/OqHpqXhyD9Lt/6EyVLu891HoP1Y6vl152b0 iu+2xuO+y4k1uP2h3o1eqyot+0Pr2/pPV/wa0Lq8LI6YcGzAZ+ynbKq6mhvplgtZS1hohnpN/wAJ Vs/wf+jtWizAxGMDG1w1oraBJ0FLvUobz/gnqI6dhh7n+nJcd2pJAO8X/oxP6Pdc31XbEqydxt+P +Kqpd2n1HJqysXNw76K7azTedr4sYRVDHNuZG33b2uazf/21YodV6H0XIpwcXI6bTmMomjDqsADK m7N8NkO2V7MVjPa1Xv2Zh+79GYeLGlu50bbfdexrZ2tbY73qw+tj3Mc4SanbmHwJa6uf8yx6IE9b Pav+6UBLu8703pP1dw7G9QwukY+Hk1srtosG1pDMjfT7ngfo37fU3sZ6n8hXcjJxrn4+c/DFt+Gy +6uwkA1Bh+zZPpOI+lazds/f/wCDV89OxDWKxXtDW1sYQSC0VFxo2Onc3097kh0/DDHV+n7Xtexw JJltp33N5/Pf7k2sv7w2/wCd/iqqXdqZ9+FdacfOoZbTWXGXEPILa3XOc6qPZ+j3t+n6n/BoWOcH Bc51eBXi3uFW0t26i4v2tdY1u5np+k71v/Ri0HdPxTYbdnvLi/k7d5aanP8ATnZ763bXoGP0pjGv F0OLxW0bC4bfS3Gt7HPe+xrtz/3/AGfQQMJ8V0Ls1Khp+70QYm7082p1B2DmMZZlYHrurY97iTtc 1rH+i9tb/a5+/wDnKf5tllamy/Fxsc4FWIyuTYx9AdDCGhhe71du5/qNuqb9BX/sGIWFhZuBaWGS SS1x9R+507vc/wByVmBi2SS0tc5xeXNc5rpcAx/vYQ7a9jG+1L252ZDh4iALof4X6KuE3eltajOr rFdNOMa8VhqqHDdvqtDq2+j/ACN7GWo3SGtHT6ttTMcHcfSr+gJc76H9b6SL9jxtf0YEuY/v9KsN bW7+xsap0010V+nUNrASQJJjcS88/wApydGMgQSQaBCQDer/AP/S9VSSSSU5/VeiYHVnYb8tri/A yK8vGc10EWVHe2fzXsd9F6rYvRsiyn0eoWzjB9jhiVEhrt732/rVv07f5z+Zb+h/f9ZbKZMmIkgy OwPXSutrZCJ36LMYytjWVtDGNENa0QAB2aApJJJ65SSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpS SSSSn//Z/+IMWElDQ19QUk9GSUxFAAEBAAAMSExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYA MQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAAAAEAAPbWAAEAAAAA0y1IUCAgAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARY3BydAAAAVAAAAAzZGVz YwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAAAiwAAAAU YlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAAA0wAAACGdmlldwAAA9QA AAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAABDwAAAgMZ1RSQwAA BDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3bGV0dC1QYWNr YXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAASc1JH QiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA b6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAA AAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMu Y2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAA AAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAA AAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAA AAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJ RUM2MTk2Ni0yLjEAAAAAAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVD NjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD 7cwABBMLAANcngAAAAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAA AAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAt ADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcA vADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4AT4BRQFMAVIBWQFg AWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB+gIDAgwCFAIdAiYCLwI4AkEC SwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNy A34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE 8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQav BsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I 0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5 C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgO Ew4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExEx EU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0U zhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihiv GNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUd Hh1HHXAdmR3DHeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHO IfsiJyJVIoIiryLdIwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3Jugn GCdJJ3onqyfcKA0oPyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyi LNctDC1BLXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy 1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlC OX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNA ZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fA SAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP 3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4Fgv WH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxh T2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqf avdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0 zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+wn8j f4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhpiM6JM4mZif6K ZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSKlPSVX5XJ ljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFHobai JqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6h rxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8 IbybvRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5 yjjKt8s2y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DY ZNjo2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf 56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32 +/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf///9sAQwAIBgYHBgUIBwcHCQkICgwUDQwL CwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwY DQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy /8AAEQgAgAFPAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQ AAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYX GBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqS k5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz 9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQE AAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1 Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKj pKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwD AQACEQMRAD8A9/ooooAKKKKACiisjWvE+keHoGl1K9jiwM7M/MfoKANeivK7f46+HZdVe3kinjtu iz7ev4V6FpWv6XrcKyafexTAjOFbkfhQBpUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRXPeLfFUfhPThdyWVxdbsgJCMn 8aAOhJxyelcz4i8e+H/DUbG9vozKP+WKHLGvBvFHxk8Qa2zwWbHT7c8bU4Yj3rzyaaW4kMk8ryO3 VnbJp2A9X8UfHLVNR32+iwraQnjzTyxFeW3t/d6lOZr25knkPOXYmq1aOlaFqetzrDp1nLOzHGVU 4H1NAzOxx04qzY6le6bMJbK6lgccgoxFet6P8ILDR7VdT8ZanFbxqNxtw2D9DXB+N5vC8uqD/hGI ZI4BnzC3Rj2xQB1nhz44a3pmyHVIkvYRxu6MBXrnh34p+GfECqq3i205/wCWUxwc+1fJ9KCVIYMV I7g4oA+4kkSVQ8bqynoVOafXyn4N8TeNbOVE0q4lktweVmJ2Yr6P8Kapd6voiXN8sa3Ico/l/dJA HT86nmV+W+pN1exu0UUUxhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFJS0AFFFFAB RRRQAUUlLQAUUlLQAUUUUAFNdEkQo6hlPBBFOqlrGpRaPo19qU3MdpA8zD1CgnH6UAcP4t+GfhPW WO5otPvX+6yOFyfcV454o+EviHw6WmhiF7aDkSRcnH0rElvfEnjbXp7mE3VxduTIUhJwg9vQV6h8 JPiDeJqh8J+IXbe2Vt3m+8GH8Bz60wPDXRo3KSKVcdVYYIrq/CnxB1nwfbzQab5Xly5J3pk59a9q 8Tad8OPE189jcXtpBf52h4SFIb+tea+KPgxrmj7rjSz/AGhadRs+8B9KAOH1rxDqviC6a41O8knY nhSeB9BWXV6HR9RnvDaJZy+evDKV+79a7vw18MZ72RGuY2nf+4n3R9TUTqRhuTKajucFp+k3uqSh LWEsD1c8KPxr0fwv8Lpbp0eeM3L9cdEX/GvXdB+H9np8SG5CnaOIkGB+PrXTXF7p2jW4DvHCg6IO 9ZOU5K791fiQ3KW+iPObrwpeaJaBzCn2deoj6L+Fdl4J/wCQE/8A13b+QrZt7m11WyLxMssEgKn+ orL8KQfZdPurbP8AqruRM+uMCsoUVCqpRd0yI01Gaa6mZ8RfGj+CNGtb5LYTma48krnp8pOf0qb4 feMk8beHpNQ8nyZIp2hkjz0IAIP5MK4/9oL/AJE/Tf8Ar/H/AKLeqPwo/wCKa+IfiHwszfupY0ub fPcDDDH1SQf9812HQe1V5H4l+Mp0bxlc6HbWInSCZYfMz1bA3fkSR+FeqX15Fp+n3N7OdsNvE0rn 0VRk/wAq+S5baW4ttP8AEV0D9p1XV5jnsQpQkj/gUjD8KAPrtmCqWYgADJJ7V4/4k+M0n9qvpfha wa+mQ7TKFyCfYenvW/8AGXxFLoPgSWO3fZcX8gtlYHlVIJY/kMfjTvhR4MtfDvhK0u5YVbUL2MTy uwGVDDKqPTAI/GgDiW+KvjjRytxrGgn7LnLER7cD616p4P8AGOm+M9K+2WD4dMCWJvvIf8K3Lm1g vIHguYUlicYZXGQa8G0+2b4a/HOHToGZdM1MqiKTwUkOF/75cY+lAHoPxJ+IUngRtNCWgn+2CXPO NuzZ/wDFV03hbxBb+KPDlnq9tws6fOn9xxwy/ga8q+PcS3GqeE4JPuSSTo30JiBpvwyvZ/BHj3U/ A2pORDNIXtGbu2Mgj/eXH4igD1vxHqraH4b1HVFj8w2kDShPXAzVHwR4kbxZ4VttYeHyTMzrsz02 sR/SmfEL/knniD/rxl/9BrE+C/8AyS/Tv+uk3/oxqAOTvPjdfw6reWVvojz/AGaZ4iU56MRn9Kj/ AOF36z/0LVx/3zU/wehim8aeNBLEj4uBjcoOP3klexfYrT/n2h/79imB594C+I2oeLdel0+60eWz jS2aYSOMAkMox/49+lP0j4jzSfEObwlq9kLWYFlhkzxIRyv5rz9eK9Ajt4Im3Rwxo2MZVQDXkvxt 8OTpDY+MNMBS8051EzKOdmcq34Nx9DSA9frgPH/xG/4RHUdP0yztPtl/d8+UDyAThfzOfyrf8PeK rLWvBsHiFpFjg8gyXHPEbKPnH4EGvLPhzZTePfiPqXjW/Q/ZbWTFqrDjdjCD/gK8/U0Aeparrl1o +m2Ms9urXEy4lUHhWwCcfjWX/wAJlqH/AECpPyqfx5/x6Wf++38q6pEQxrlF6DtXG/aTqyjGVkrG L5pTaTsczp3jJJ7pba9t2tmY4BbpmuqrkPHNvbrZ20wVVm8wrkDkrgk/qBWxf30th4ZN03+vEKgZ /vkAfzNVTqSi5Rm721uOMmm1LoZ+teLEsrg2llEZ7gcHHQH0rMPiXxBCPNmsP3X+7V7wdpMa2Z1G Zd80zHYW5wAev1JzXVFQwIYAg9iKiEKtVc7la/QlRnNczdjI0PxBb6yhVRsnUZZD/SjX9WuNIt47 iKASxFtrnP3T2rnNath4e8RW1/bDbDIdxUdOD8w/I12l1bRX1nJbyjMcq4NXCVScZQbtJFRcmnF7 oj02+j1LT4rqPo45H909xUGuaumjWBnI3SMdqJ6n/wDVXN+G7mTRdan0i7OFdvkJ6bux/EU24z4o 8VLCpJsrbqR0IB5/M8fSo+sN01b4np8yfaNx032Op0e8nv8ATo7q4i8oycqv+z2NaFNChVCqAABg AdqdXXFNKzNlogrkPik7J8M9dKnB8gD8C6g119cd8VP+SZa5/wBcV/8AQ1qhnE/s92cA0XWLzy1M 7XKxbiOQoXOPzY1k/HfQI9M1TTPEdgvkSTsYpWj4/eLgq31xn8q3f2e/+RX1b/r9H/oAqT9oL/kT 9N/6/wAf+i3pgeOaD4E8ReJdNuNV063eSKJiN5Jy7Dk4Net/Bfxvc3rT+FtYdjd26lrdpD8xUcMh z3H+Ndd8Io0j+F+i7FA3LIx9z5r15f8AENY/Bnxq03WbX93HOYruUL05YpIPxAJ/GgD1TWdJsrrx lYQvAipNETJtUDcRuIz+VdE8mnaLa4JigjUdB1rmfF15NYa9Z3VvjzUgO3PuSP61ydzc3F7KZLqZ pGPqeBXmzrqlKVld3OSVVQk9NTqNV8bSy7otOTav/PVv6Vys0stzIZLiRpHPUk0zgDk8Ve07SL7V JAttEQneRuBXJKc6r11OdylUep1fgMOLK85Pl+aAv1xz/StPw3Ks9vfSr9172Vh9Mike2Ph/wvNH aKZJY4ycjqWPU/59KreCP+QE/wD13b+Qr0aacHCm+zOyHuuMPI4j9oP/AJE/TP8Ar/H/AKLes7xb /wAUz8RvBPiYfJBcwR21w3QcAKxP/AZB/wB81o/tB/8AIn6b/wBf4/8ARb1b+K+j/wBp/CWG5Rcy 2Cw3Ax124Ct+jZ/Cuw3NL4yax/ZPw5vURtst862qY9GOW/8AHVYfjXm/j7R/7B8K/DrTiu2SPzGl GOjsYmb9Sat67rH/AAsLWfh7o4bzFliS6vQOhOcOD7gRSf8AfVa3x4/4/fCX/XxL/OKgCr+0S7eT 4dj52M1wT9R5eP5mvbIUWKCONBhVUKAOwAryz496S954PtNRjQsbG5+f2Rxgn/voJXbeCNfh8S+E NO1GOQNI0KpOO6yAYYH8aQHQ14f8YQF+JXhF4v8AX7o/rxMNv65r3CvCdSmXxx+0DYQ2p8yz0kpv kXp+6Jcn8XIWhAXPjt/yG/B//Xab/wBChq/8a/Dk5tLPxdpmUvtLdfMZBzszlW/4Cf0Jqh8dv+Q3 4P8A+u03/oUNeyXdrDfWc1pcoJIJkMciHoykYIpgcJqfiKHxV8FdS1aHAabTpBKgP3JAuGH50vwW /wCSX6b/ANdJv/RjV5bHczeA38ZeCb92FpdWkslmx6FtpKn/AIEvH1FepfBb/kl+nf8AXSb/ANGN QB5L4cu/Ftr4u8T/APCK24mZrtvtAPYeY+3+tdX/AGx8X/8AoGpVn4NZ/wCE18ben2gf+jJK9moA 4j4eXni+7XUf+EqthDt8v7Pjv97d/wCy1199ZwajYXFldRiSCeNo5EPcEYNWKKQHyzqD694V/tn4 dQB5EvbyPySM5ZCeMf73yZ+hr6J8H+HIfCvhiy0mEKWiTMrgffkPLH868x8ZY/4aH8M8D/Uw/wDo cle10wOR8d/8etn/AL7fyqESeL9oxGlTePP+PSz/AN9v5V1kf+rX6CuH2fPWnq1tsYcvNN6nnNy9 9BqkFx4hheSFTwB0rofF06zeHYZYW3RySoQR3GCRVzxZ5X/CPXHmYzldmfXcP6ZrIFtJdfDxBgl4 wZFHsHP/ALLWcoOHPTTvdX8yXFx5o+R0OhqF0KxAHHkKfzGa0awfCV8l3okUQYGSD5GHt2P5VvV2 0WnTTXY3g7xTOT8dhfsFqT180j8Mf/qrpbQk2UBb73lrn8q5HxVL/aet2WlQnJBwxHYsRn8gM/jX XzSxWts8sjbYo1yT6AVjTadWcumhEHecmcf44S3Se1lRsXeMHb12jofzrR8Fx2y6Q0kRBmZyJfUY 6D8v51m6JA/iHX59UukzBGcIp6Z7D8Bz9TTLdm8L+KWt2JFlcHjPTaeh/A8Vzxlap7Zr3Xp/wTJP 3vadGd1RSZpa9I6grjvip/yTLXP+uK/+hrXY1x3xV/5Jjrn/AFxX/wBDWgDkP2e/+RX1b/r9H/oC 1J+0H/yJ+mf9f4/9FvUf7Pf/ACK+rf8AX6P/AEBak/aD/wCRP0z/AK/x/wCi3p9QOo+Ev/JL9E/6 5yf+jXryn9oL/kb9N/68B/6MevVvhL/yS/RP+ucn/o168p/aD/5HDTP+vAf+jHoA9H8XsWn09mPJ tFJ/OsOzsbrUJfLtYWkPc44FdRq1tHea5olvKMxyW6hh6jmund9O0W15McEajoOprzJUPaVJSbsk cjpc8229DC0nwXDBtlv282T+4OgrbvNT07RoMSOkYA4jUc/lXK6r40mn3Q6cnlr081uv4Vy0rvNI ZJpGkc8ksc0PEU6S5aS+YnVhBWpo9W03U7bV7Qz25JTJVlI5Bql4YgFtaXsC/djvJUX6DArN8CRM lhdzHhHlAH4Dk/r+laPheYXNneTr0kvJXH0ODXRTnz8knvqbQlzcre5y3xj8N6p4n8N2NppUHnTR 3YkYZ6LsYfzIrrnsYdR8Ktpdyy7Z7T7LJz0JTaf51a1eWWDSbl4VJcRt07cdfwrGtWgt/D2nme2c B54sfNyzHGGrWdXllY0crOx518I/h3rPh/xTcalrVuI1gtmjt+c/MzDJH4Bv++q3fi54X1jxHd+H X0u385bSWVpucbcmPH/oJrur3V2t9S+wQ27SzmISrjpjJH9Kk07UzeC4SWIwz27bZEPuMg/lVe1i 5cocyvYn1CwttU064sLuMSW9whjkU9wa8Lk8JeN/htqs83hkteabIciPG78x2NewNr88duL2SyZL IkfOT8wBOM1b1LVRYXFtAIWle5D7AvquP8aSrRtcOdHjVx4i+KPiaBtOg0prISja8u3GAfftXoPw 48AQ+CtNkeZhNqd1g3EvXH+yPx5ro9P1N57yWzuLcwXCIJAOzKTjP51VfXpmWW5trNpbOEkNIOrA dSKHWja4c6OL+LXhfVvEWqeGpNMgEq2kkjS89AWjI/8AQTXqVZUt1byarpnyszzRyNE4PAG0E5FJ Nqd0bqaK1s2kWE4dzwCcZwKPaJBzI4X4w+A5/FNhaahpkatqNq3lkE43xn/A/wAzW/8ADDRr7QPA dlp2oxeVcxvKWX2Lkj9DWjqt8t/4Ta7gLIshQjnkfvACP0NdBTjNSdl5P7xqV2fPVv4Y+IugeIdZ vNEtljS9uHYk87l3sV/nWjv+Mf8AcT/vkV69d6w8OpNYQWzSz+UJRjpgkg/yqqviG4mikaCwdngJ E4/ukdhSdaCdhc6OR8CN8Qj4jx4mVRp/kt0H8fGP616dWdJqqDS4b2GNpfP2iJF6kt0qO11SZr9L O8t/JlkQvGQcg46j9RTdSN7BzI4PxP4V1e/+M2ha7bW+7T7aOJZZM9MM5P8AMV6jWK+tTPd3Nra2 jSy277WPbGAR/X8qnh1eKbRm1Hy3wgO6MDkMDgj86Sqxelw5kZ3i7TrvUbe1W1j3lHYt+VZok8YK MbU4/wBmt6PVriO5gjvLQwpcPsRs9GxkA/lUl5qkkV79jtLczzKoeTHRQemfrXPKEJNzUmjNxTfN dnNjQ9d1m4j/ALVmCQKckD/Cuzigjht0gRQI0UIF9qo2GsR3kd3I6NCLVtsm/tgZNVf7elSJbuWz ZLFsfvSeQp6MfaqpqnT1ve/UcVGOph32g6lo1+13ozFomP8Aq/T2xQ2s+J7hPJSyKMeN+2ulv9W+ x3lvaJA0ss6MybfUY/xqpHrlzLJLbR2DG7hP7xOwBGQfxrKVOEZNRk15IhwSdk7EXhzw8+nyNe3r b7x8++3PX8aXxVBqN7BHZ2MW6Nzulb+QrQi1q3fRf7TYFUAIKHruBxj654qKLWJkuIEvbVoEnbZG xP8AEegP1rXlpqn7NPR/1+Jdo8vKi3pWnppmnRWqc7Rlm/vMeprP8T6O2q6cDCoNzCcp7g9RU1zr EialLYQWzSzoivx0wc//AFvzpq6tJdaReSxQstzAWjePurDv+RzVSdNxdPp/kN8rXKSaCb0aWkN+ m2eL5M/3h2NatZmg3E9zo1tJcKQ+xRuP8YwOfxrTrSl8CKj8KCuO+KpA+GOuZ/54r/6GtdjVa/sL bU7GayvIhLbzLtdD3FaFHlH7PZ/4pfVv+v0f+gCpP2g/+RP0z/r/AB/6Leu88L+EdO8IxXkOmB1h uZRKUY52nGP6Vwf7Qf8AyJ+mf9f4/wDRb0wOo+Ev/JL9E/65yf8Ao168p/aD/wCRw0z/AK8B/wCj Hr1b4S/8kv0T/rnJ/wCjXryn9oP/AJHDTP8ArwH/AKMegD0zxHcyWd/pVxDjzI7VSufXmucubq4v pfNupmkbPc8Ct7xb/rtO/wCvRawrSzuL+YQ2sRkY9+wrxcQ26rijz6t3NogJA6mtjSPDd7qxDlTD b93bqfpXTaN4Pgs9s17iaYc7f4V/xq9qviKz0oCBB51x0WGMZrWGFUVzVXZFxoJLmqFfWriDw74c +yW2Fd1McYzzz1b+Zpvggg6C+Onnt/IVnwaBf6/eC/1hjFGfuQr1A9K661tIbK3WC3QJGvQCumnG UqnPayWiNoKTlzbIj1ME6VeADJ8h8Af7prGvFc+HdGARiwltsjHI6V0Z5GD0pMDAGBgVtOnzXNZR uZKqf+EukbacfYQA2OPvnioYWmj1TxBJFGS4SMxgjhmEZx+tbuBnOOfWgAAk45PWj2fn1uHKcPey Jc6Azme4nu3jBeLB2oeCePbmt65YT65osqKWjKTENjp8oxWssESlisagt94gdacEVQoCgBeBgdKi NFrd9vwdyVAyWRm8Wk4IB0/G7HGfMqhpupppWhfY5oXN3bho/KC/fbJx+ea6fAznHPTNMMUZkDmN S46NjmqdN3vF66/iPld7ox5xIdd0VmiKnyZdwA4U7RxVL7QJ729F/PPE8c7LHDHwGQdD75rp8AkH jI6U0wxtIJDGpcdGI5pSpN7P+rWBwOTj3N4EMQjbzY5ArJjkHzc/yNdhTAiAH5R8xyeOpp9VTp8n Xol9w4xsZESn/hLLhtp2/Y0AbHH3m4qLTFYQazlCCbuUjI6/KK28DOcc+tIFAzx160ez1v6/iHKc us9xbeGNIVN0UblEncD5o1wefzxSQPAniKwaKSeWPbIhlk5G44wK6gorIUZQVPGMcUghjVQojUBT kDHQ1n7F6a7W/Ank8zL0hSNR1glSM3IwSOo2LWdFNdWvhm+kgjYSi7k6jkKZOTj6ZNdQAATxjPWk 2jBGBg9RVulpZPv+I+Tz7nIXL2yXGnyxz3NwEuUaR35Cjn+taazrpmv6g9yriO6WN43AyPlGCK2R BCqFFiQKeoA4NZ95a3xvDNbSI8bKAYpBwpHcVHs3HVf10FytamXbq+qWXiFYkKPO5CKeD/qxj8/6 1XLWc2mJCXu5ZZEWM2p9ehH0H9K6LTLFrKKVpX3zzyGWVvc4GB7AAVbEMQkMgjUOerY5pKi2lcSh oZUse3xLpwCkqltIN3p92naerDxDrBKkA+Tg46/JWtgZzgZ9aMAEnHJ61r7PW/nf8LF8utzkfs00 3hJtsb7o7tpSg6sokJP6c1Niyurm0ijlubljKr4Y8Jjnca6gAAYAAFRpDFESUjVSepAxms/Ybak+ zM20UjxPqLFTjyYQGx/vVXskcvr42Nlpjt46/IOlbuBnOBk96UADOB161p7P9fxK5TM8PTLLoVoF BBjiWNgRjDADIrUpioqAhVCg8nAp9XBcsUmNKysFFFFUMKzNc0DTvEenmy1O3WeHO4A9j0yPzrTo oAzPD2iW3hzQ7fSbMsbe33bN3XDMW/rXhH7QR/4rDTR/1Dx/6Mevoquf8TeDNF8WQhdTtVeRV2pK PvKPagDG1m0S+1nRbWQkJJbqrEenNdOq6boFl1jgiUdT1Nc54hFxa+INM+xQtNLDCNoxx1I5q7Z+ G572cXmuTmeTqsIPyLXFFtVJcq1vuc6vzystSGTVNU8ROYdLjNvadGuHHJ+lauk+HLPS/wB5gzXB +9LJya1o40iQJGoVRwABT63jS15p6s0jT1vLVhRRRWxoFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAM2L5m/aN+Mbu +KfRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFAH//2Q0KZW5kc3RyZWFtDWVuZG9iag0xIDAgb2JqDTw8L0xlbmd0aCAz MTYxL1N1YnR5cGUvWE1ML1R5cGUvTWV0YWRhdGE+PnN0cmVhbQ0KPD94cGFja2V0IGJlZ2luPSLv u78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJh ZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS40LWMwMDUgNzguMTQ3MzI2 LCAyMDEyLzA4LzIzLTEzOjAzOjAzICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0 dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRl c2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5h ZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnBkZj0iaHR0cDovL25zLmFkb2Jl LmNvbS9wZGYvMS4zLyIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5j b20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMv ZWxlbWVudHMvMS4xLyI+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE2LTAzLTAyVDEzOjU2 OjU4PC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5jb252ZXJ0b25s aW5lZnJlZS5jb208L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIw MTYtMDMtMDJUMTU6NTc6MjArMDI6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8eG1wOk1l dGFkYXRhRGF0ZT4yMDE2LTAzLTAyVDE1OjU3OjIwKzAyOjAwPC94bXA6TWV0YWRhdGFEYXRlPgog ICAgICAgICA8cGRmOlByb2R1Y2VyPmNvbnZlcnRvbmxpbmVmcmVlLmNvbTwvcGRmOlByb2R1Y2Vy PgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD51dWlkOjUyYmQ0OWJjLWE4MTEtNDA2Ni1iMWE0 LWE4MmQ4NDJkYmE0MDwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOkluc3RhbmNl SUQ+dXVpZDoxNDc2YTJmYS04NTE5LTQ1OGMtYTRlOS02NjliZmRjOWYxYzQ8L3htcE1NOkluc3Rh bmNlSUQ+CiAgICAgICAgIDxkYzpmb3JtYXQ+YXBwbGljYXRpb24vcGRmPC9kYzpmb3JtYXQ+CiAg ICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAg 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 ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBl bmQ9InciPz4NCmVuZHN0cmVhbQ1lbmRvYmoNMiAwIG9iag08PC9GaWx0ZXIvRmxhdGVEZWNvZGUv Rmlyc3QgNC9MZW5ndGggNDgvTiAxL1R5cGUvT2JqU3RtPj5zdHJlYW0NCmjeMlUwULCx0XfOL80r UTDU985MKY62BIoFxeqHVBak6gckpqcW29kBBBgA1ncLgA0KZW5kc3RyZWFtDWVuZG9iag0zIDAg b2JqDTw8L0ZpbHRlci9GbGF0ZURlY29kZS9GaXJzdCA0L0xlbmd0aCAxMDcvTiAxL1R5cGUvT2Jq U3RtPj5zdHJlYW0NCmjeMlMwULCx0XcuSk0syczPc0ksSdVwsTIyMDQzMDYwMjQ2NTO1iNKEyOcX aSTn55WlFpXk5+Vk5qWmFaWm6iXn52rq++anoOs0NTU3MtA2MFI3MFDX1A8oyk8pTU7FZYCdHUCA AQDw+CpHDQplbmRzdHJlYW0NZW5kb2JqDTQgMCBvYmoNPDwvRGVjb2RlUGFybXM8PC9Db2x1bW5z IDQvUHJlZGljdG9yIDEyPj4vRmlsdGVyL0ZsYXRlRGVjb2RlL0lEWzxDNUE5MkUyNzlCMkQ2NDQ3 OTUyRDRDMDU0QTk3MjE5ND48MDBDMEEwQzQzNkY1NDQ0REJDNzI3NTE0Njg0MUNFQzc+XS9JbmZv IDYgMCBSL0xlbmd0aCAzOS9Sb290IDggMCBSL1NpemUgNy9UeXBlL1hSZWYvV1sxIDMgMF0+PnN0 cmVhbQ0KaN5iYgACJkZWrsdMDAy8y4AEYw+QYDjBxPj7hSqIxQgQYABJPQUUDQplbmRzdHJlYW0N ZW5kb2JqDXN0YXJ0eHJlZg0KMTE2DQolJUVPRg0K ------=_Part_42804902_536289690.1460573630399-- From zorro.lang@gmail.com Wed Apr 13 14:07:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 15A197CA7 for ; Wed, 13 Apr 2016 14:07:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DB206304059 for ; Wed, 13 Apr 2016 12:07:04 -0700 (PDT) X-ASG-Debug-ID: 1460574421-04cbb02e1b19b770001-NocioJ Received: from mail-yw0-f180.google.com (mail-yw0-f180.google.com [209.85.161.180]) by cuda.sgi.com with ESMTP id Cpz4tCXS5Plv5yGr (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 13 Apr 2016 12:07:02 -0700 (PDT) X-Barracuda-Envelope-From: zorro.lang@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.161.180 Received: by mail-yw0-f180.google.com with SMTP id d68so80619098ywe.1 for ; Wed, 13 Apr 2016 12:07:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=qGOYW0eQzjmZqzfPlOWdD/DwcfUmf5rVMyIJZxxNzcQ=; b=HzqBX9lTMsQ2L3xK1hpmW8fZ8458dXeCKCeae8OJGrC/Fa6L/0Xc/L7+H2KWJC5m2s b7dZBd38PH29N8XuM+8bAvRh/MOLde36SETN2PLwxDs35U2ZglOIQmMg+eX688Ze3Dex 0mJnjIfu96G/ReYJArdikOE5sQ8BP22FaOJMfSxB1SBiZwZCvfnFurTfnvghvHTjPmGj +suZWzmyqcn21b151Nl4MVNCtGII4xktsSOcqkSs+NbqEFTvOa85Eu+qmvNSbfOwKChh mgKZpTzQoEUG205W2AmkWngQ2SaC6b0zMjFXEpXn+uFeCiYCXQydu2ifCh7sbmYBz1St LHhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=qGOYW0eQzjmZqzfPlOWdD/DwcfUmf5rVMyIJZxxNzcQ=; b=Ebf3fPgAs+dX4ATR1ERo35HEb0tw0d/ZYJIu8ENB9ePMUYYXAxLNuZALLD+xUoYut9 G4+PbjBcVno0ZmiuHkekAlRyZiuemZUjHaPvpznUoFWs4YdZ+8Yafhbkek0X44JaDUw8 hJU02gw5pnRBO6OeZ5UeWM57Sf5HBirTc7edmyqfgiI/drSZGNi6GO/UwSuoe6d9iL1/ EuJ6OEeC6ouehSoD6ChA0d3EgNa6hWkVWm4yBtCgGtR6M5RThwehTtRQnqasLnUdJC2a e6Eu8zItxbTlWDbSrL1B2mVmD+LYboCI4XP6weNQRd2cZsiHpveBx+WnzsFSvLWPcoXF Xl9w== X-Gm-Message-State: AOPr4FVqeD3yyob4v7ko/W3TYnkO8IoEABAGGnsTZrZcgYnmkgzj5QYOGJ5K/X2ZaPws43Fq00f10Pq0WEeGSg== MIME-Version: 1.0 X-Received: by 10.129.51.80 with SMTP id z77mr6311148ywz.94.1460574421746; Wed, 13 Apr 2016 12:07:01 -0700 (PDT) Received: by 10.13.203.147 with HTTP; Wed, 13 Apr 2016 12:07:01 -0700 (PDT) Received: by 10.13.203.147 with HTTP; Wed, 13 Apr 2016 12:07:01 -0700 (PDT) In-Reply-To: <570E9040.8010409@sandeen.net> References: <1460571772-20285-1-git-send-email-zlang@redhat.com> <570E9040.8010409@sandeen.net> Date: Thu, 14 Apr 2016 03:07:01 +0800 Message-ID: Subject: Re: [PATCH] xfs: group quota is still enforced if mount v5 xfs with gqnoenforce and pqnoenforce From: Zorro Lang X-ASG-Orig-Subj: Re: [PATCH] xfs: group quota is still enforced if mount v5 xfs with gqnoenforce and pqnoenforce To: Eric Sandeen Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a11413da89389100530627b34 X-Barracuda-Connect: mail-yw0-f180.google.com[209.85.161.180] X-Barracuda-Start-Time: 1460574422 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28706 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --001a11413da89389100530627b34 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable 2016=E5=B9=B44=E6=9C=8814=E6=97=A5 02:30=EF=BC=8C"Eric Sandeen" =E5=86=99=E9=81=93=EF=BC=9A > > This looks fine, but I think Eryu already sent this patch on 3/31: > > [PATCH] xfs: add missing break in xfs_parseargs() Hi, Sorry for this duplicate patch... I think I missed that patch email from mail list. Please ignore this DUP patch. Thanks, Zorro > > -Eric > > On 4/13/16 1:22 PM, Zorro Lang wrote: > > This's a regression bug caused by: > > > > 2e74af0 xfs: convert mount option parsing to tokens > > > > xfstests xfs/299 can reproduce this bug, it will fail when do > > gpnoenforce test, the error output as below(diff with 299.out): > > > > *** push past the soft block limit > > [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------] > > -[NAME] 140 100 500 00 [--------] 4 4 10 00 [--------] 0 0 0 00 [--------] > > +[NAME] 140 100 500 00 [7 days] 4 4 10 00 [--------] 0 0 0 00 [--------] > > > > *** push past the hard inode limit (expect EDQUOT) > > [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------] > > -[NAME] 140 100 500 00 [--------] 16 4 10 00 [--none--] 0 0 0 00 [--------] > > +[NAME] 140 100 500 00 [7 days] 10 4 10 00 [7 days] 0 0 0 00 [--------] > > > > *** push past the hard block limit (expect EDQUOT) > > [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------] > > -[NAME] 540 100 500 00 [--none--] 16 4 10 00 [--none--] 0 0 0 00 [--------] > > +[NAME] 500 100 500 00 [7 days] 10 4 10 00 [7 days] 0 0 0 00 [--------] > > > > It shows that group quota is still enforced. But this bug only can > > be reproduced when mount v5 xfs with gqnoenforce and pqnoenforce > > options. The reason as I found is a missed "break" in xfs_parseargs() > > function. > > > > After deal with "pqnoenforce", it should break. But the code keep > > running into "gquota/grpquota" lines, and make gquota enforced. > > > > Signed-off-by: Zorro Lang > > --- > > > > Hi, > > > > This's a tiny bug(only one line patch). But it's belong to > > regression bug and take me a few hours to find the problem. > > So I hope it can be fixed:) > > > > Thanks, > > Zorro > > > > fs/xfs/xfs_super.c | 1 + > > 1 file changed, 1 insertion(+) > > > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > > index 187e14b..f3c0ffc 100644 > > --- a/fs/xfs/xfs_super.c > > +++ b/fs/xfs/xfs_super.c > > @@ -350,6 +350,7 @@ xfs_parseargs( > > case Opt_pqnoenforce: > > mp->m_qflags |=3D (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE); > > mp->m_qflags &=3D ~XFS_PQUOTA_ENFD; > > + break; > > case Opt_gquota: > > case Opt_grpquota: > > mp->m_qflags |=3D (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE | > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs --001a11413da89389100530627b34 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable


    2016=E5=B9=B44=E6=9C=8814=E6=97=A5 02:30=EF=BC=8C"Eric Sandeen" &= lt;sandeen@sandeen.net>=E5=86= =99=E9=81=93=EF=BC=9A
    >
    > This looks fine, but I think Eryu already sent this patch on 3/31:
    >
    > [PATCH] xfs: add missing break in xfs_parseargs()

    Hi,

    Sorry for this duplicate patch... I think I missed that patc= h email from mail list. Please ignore this DUP patch.

    Thanks,
    Zorro

    >
    > -Eric
    >
    > On 4/13/16 1:22 PM, Zorro Lang wrote:
    > > This's a regression bug caused by:
    > >
    > >=C2=A0 =C2=A02e74af0 xfs: convert mount option parsing to tokens > >
    > > xfstests xfs/299 can reproduce this bug, it will fail when do
    > > gpnoenforce test, the error output as below(diff with 299.out): > >
    > >=C2=A0 *** push past the soft block limit
    > >=C2=A0 =C2=A0[ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 = 00 [--------]
    > >=C2=A0 =C2=A0-[NAME] 140 100 500 00 [--------] 4 4 10 00 [--------= ] 0 0 0 00 [--------]
    > >=C2=A0 =C2=A0+[NAME] 140 100 500 00 [7 days] 4 4 10 00 [--------] = 0 0 0 00 [--------]
    > >
    > >=C2=A0 *** push past the hard inode limit (expect EDQUOT)
    > >=C2=A0 =C2=A0[ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 = 00 [--------]
    > >=C2=A0 =C2=A0-[NAME] 140 100 500 00 [--------] 16 4 10 00 [--none-= -] 0 0 0 00 [--------]
    > >=C2=A0 =C2=A0+[NAME] 140 100 500 00 [7 days] 10 4 10 00 [7 days] 0= 0 0 00 [--------]
    > >
    > >=C2=A0 *** push past the hard block limit (expect EDQUOT)
    > >=C2=A0 =C2=A0[ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 = 00 [--------]
    > >=C2=A0 =C2=A0-[NAME] 540 100 500 00 [--none--] 16 4 10 00 [--none-= -] 0 0 0 00 [--------]
    > >=C2=A0 =C2=A0+[NAME] 500 100 500 00 [7 days] 10 4 10 00 [7 days] 0= 0 0 00 [--------]
    > >
    > > It shows that group quota is still enforced. But this bug only ca= n
    > > be reproduced when mount v5 xfs with gqnoenforce and pqnoenforce<= br> > > options. The reason as I found is a missed "break" in x= fs_parseargs()
    > > function.
    > >
    > > After deal with "pqnoenforce", it should break. But the= code keep
    > > running into "gquota/grpquota" lines, and make gquota e= nforced.
    > >
    > > Signed-off-by: Zorro Lang <zlang@redhat.com>
    > > ---
    > >
    > > Hi,
    > >
    > > This's a tiny bug(only one line patch). But it's belong t= o
    > > regression bug and take me a few hours to find the problem.
    > > So I hope it can be fixed:)
    > >
    > > Thanks,
    > > Zorro
    > >
    > >=C2=A0 fs/xfs/xfs_super.c | 1 +
    > >=C2=A0 1 file changed, 1 insertion(+)
    > >
    > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
    > > index 187e14b..f3c0ffc 100644
    > > --- a/fs/xfs/xfs_super.c
    > > +++ b/fs/xfs/xfs_super.c
    > > @@ -350,6 +350,7 @@ xfs_parseargs(
    > >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0case Opt_pq= noenforce:
    > >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0mp->m_qflags |=3D (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE)= ;
    > >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0mp->m_qflags &=3D ~XFS_PQUOTA_ENFD;
    > > +=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=A0case Opt_gq= uota:
    > >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0case Opt_gr= pquota:
    > >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0mp->m_qflags |=3D (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE = |
    > >
    >
    > _______________________________________________
    > xfs mailing list
    > xfs@oss.sgi.com
    > http://oss.sgi.com= /mailman/listinfo/xfs

    --001a11413da89389100530627b34-- From mchristi@redhat.com Wed Apr 13 14:36:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B709B7CBA for ; Wed, 13 Apr 2016 14:36:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6E3E88F8035 for ; Wed, 13 Apr 2016 12:36:37 -0700 (PDT) X-ASG-Debug-ID: 1460576195-04bdf011024b3160001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id kegU7Le23PljXDiI (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:36:35 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5D74F201E9; Wed, 13 Apr 2016 19:36:34 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU8u018278; Wed, 13 Apr 2016 15:36:30 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Subject: [PATCH 00/42] v5: separate operations from flags in the bio/request structs Date: Wed, 13 Apr 2016 14:35:46 -0500 X-ASG-Orig-Subj: [PATCH 00/42] v5: separate operations from flags in the bio/request structs Message-Id: <1460576188-5751-1-git-send-email-mchristi@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: 1460576195 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The following patches begin to cleanup the request->cmd_flags and bio->bi_rw mess. We currently use cmd_flags to specify the operation, attributes and state of the request. For bi_rw we use it for similar info and also the priority but then also have another bi_flags field for state. At some point, we abused them so much we just made cmd_flags 64 bits, so we could add more. The following patches seperate the operation (read, write discard, flush, etc) from cmd_flags/bi_rw. This patchset was made against linux-next from today April 13 (git tag next-20160413). I put a git tree here: https://github.com/mikechristie/linux-kernel.git The patches are in the op branch. v5: 1. Missed crypto fs submit_bio_wait call. 2. Change nfs bi_rw check to bi_op. 3. btrfs. Convert finish_parity_scrub. 4. Reworked against Jens's QUEUE_FLAG patches so I could drop my similar code. 5. Separated the core block layer change into multiple patches for merging, elevator, stats, mq and non mq request allocation to try and make it easier to read. v4: 1. Rebased to current linux-next tree. v3: 1. Used "=" instead of "|=" to setup bio bi_rw. 2. Removed __get_request cmd_flags compat code. 3. Merged initial dm related changes requested by Mike Snitzer. 4. Fixed ubd kbuild errors in flush related patches. 5. Fix 80 char col issues in several patches. 6. Fix issue with one of the btrfs patches where it looks like I reverted a patch when trying to fix a merge error. v2 1. Dropped arguments from submit_bio, and had callers setup bio. 2. Add REQ_OP_FLUSH for request_fn users and renamed REQ_FLUSH to REQ_PREFLUSH for make_request_fn users. 3. Dropped bio/rq_data_dir functions, and added a op_is_write function instead. From mchristi@redhat.com Wed Apr 13 14:36:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4E7087CBB for ; Wed, 13 Apr 2016 14:36:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0594B8F8035 for ; Wed, 13 Apr 2016 12:36:41 -0700 (PDT) X-ASG-Debug-ID: 1460576199-04bdf011024b3190001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id aUmWCUKCLTqxqCEr (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:36:39 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 33D117F6B9; Wed, 13 Apr 2016 19:36:39 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU8w018278; Wed, 13 Apr 2016 15:36:36 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 02/42] block: add REQ_OP definitions and bi_op/op fields Date: Wed, 13 Apr 2016 14:35:48 -0500 X-ASG-Orig-Subj: [PATCH 02/42] block: add REQ_OP definitions and bi_op/op fields Message-Id: <1460576188-5751-3-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576199 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie The following patches separate the operation (write, read, discard, etc) from the rq_flag_bits flags. This patch adds definitions for request/bio operations, adds fields to the request/bio to set them, and some temporary compat code so the kernel/modules can use either one. In the final patches this compat code will be removed when everything is converted. In this patch the REQ_OPs match the REQ rq_flag_bits ones for compat reasons while all the code is converted in this set. In the last patches that will abe removed and the bi_op field will be shrunk. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- block/blk-core.c | 19 ++++++++++++++++--- include/linux/blk_types.h | 15 ++++++++++++++- include/linux/blkdev.h | 1 + include/linux/fs.h | 37 +++++++++++++++++++++++++++++++++++-- 4 files changed, 66 insertions(+), 6 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index f3895c1..6bcc22e 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1698,7 +1698,8 @@ void init_request_from_bio(struct request *req, struct bio *bio) { req->cmd_type = REQ_TYPE_FS; - req->cmd_flags |= bio->bi_rw & REQ_COMMON_MASK; + /* tmp compat. Allow users to set bi_op or bi_rw */ + req->cmd_flags |= (bio->bi_rw | bio->bi_op) & REQ_COMMON_MASK; if (bio->bi_rw & REQ_RAHEAD) req->cmd_flags |= REQ_FAILFAST_MASK; @@ -2033,6 +2034,12 @@ blk_qc_t generic_make_request(struct bio *bio) struct bio_list bio_list_on_stack; blk_qc_t ret = BLK_QC_T_NONE; + /* tmp compat. Allow users to set either one or both. + * This will be removed when we have converted + * everyone in the next patches. + */ + bio->bi_rw |= bio->bi_op; + if (!generic_make_request_checks(bio)) goto out; @@ -2102,6 +2109,12 @@ EXPORT_SYMBOL(generic_make_request); */ blk_qc_t submit_bio(struct bio *bio) { + /* tmp compat. Allow users to set either one or both. + * This will be removed when we have converted + * everyone in the next patches. + */ + bio->bi_rw |= bio->bi_op; + /* * If it's a regular read/write or a barrier with data attached, * go through the normal accounting stuff before submission. @@ -2975,8 +2988,8 @@ EXPORT_SYMBOL_GPL(__blk_end_request_err); void blk_rq_bio_prep(struct request_queue *q, struct request *rq, struct bio *bio) { - /* Bit 0 (R/W) is identical in rq->cmd_flags and bio->bi_rw */ - rq->cmd_flags |= bio->bi_rw & REQ_WRITE; + /* tmp compat. Allow users to set bi_op or bi_rw */ + rq->cmd_flags |= bio_data_dir(bio); if (bio_has_data(bio)) rq->nr_phys_segments = bio_phys_segments(q, bio); diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index 86a38ea..6e49c91 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -48,9 +48,15 @@ struct bio { struct block_device *bi_bdev; unsigned int bi_flags; /* status, command, etc */ int bi_error; - unsigned long bi_rw; /* bottom bits READ/WRITE, + unsigned long bi_rw; /* bottom bits rq_flags_bits * top bits priority */ + /* + * this will be a u8 in the next patches and bi_rw can be shrunk to + * a u32. For compat in these transistional patches op is a int here. + */ + int bi_op; /* REQ_OP */ + struct bvec_iter bi_iter; @@ -242,6 +248,13 @@ enum rq_flag_bits { #define REQ_HASHED (1ULL << __REQ_HASHED) #define REQ_MQ_INFLIGHT (1ULL << __REQ_MQ_INFLIGHT) +enum req_op { + REQ_OP_READ, + REQ_OP_WRITE = REQ_WRITE, + REQ_OP_DISCARD = REQ_DISCARD, + REQ_OP_WRITE_SAME = REQ_WRITE_SAME, +}; + typedef unsigned int blk_qc_t; #define BLK_QC_T_NONE -1U #define BLK_QC_T_SHIFT 16 diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index f3f232f..e2b2881 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -96,6 +96,7 @@ struct request { struct request_queue *q; struct blk_mq_ctx *mq_ctx; + int op; u64 cmd_flags; unsigned cmd_type; unsigned long atomic_flags; diff --git a/include/linux/fs.h b/include/linux/fs.h index 69bdd03..96ace0f 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2452,15 +2452,48 @@ extern void make_bad_inode(struct inode *); extern bool is_bad_inode(struct inode *); #ifdef CONFIG_BLOCK + +static inline bool op_is_write(int op) +{ + switch (op) { + case REQ_OP_WRITE: + case REQ_OP_WRITE_SAME: + case REQ_OP_DISCARD: + return true; + default: + return false; + } +} + /* * return READ, READA, or WRITE */ -#define bio_rw(bio) ((bio)->bi_rw & (RW_MASK | RWA_MASK)) +static inline int bio_rw(struct bio *bio) +{ + /* + * tmp cpmpat. Allow users to set either op or rw, until + * all code is converted in the next patches. + */ + if (op_is_write(bio->bi_op)) + return WRITE; + + return bio->bi_rw & (RW_MASK | RWA_MASK); +} /* * return data direction, READ or WRITE */ -#define bio_data_dir(bio) ((bio)->bi_rw & 1) +static inline int bio_data_dir(struct bio *bio) +{ + /* + * tmp cpmpat. Allow users to set either op or rw, until + * all code is converted in the next patches. + */ + if (op_is_write(bio->bi_op)) + return WRITE; + + return bio->bi_rw & 1; +} extern void check_disk_size_change(struct gendisk *disk, struct block_device *bdev); -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:36:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E5FB07CCE for ; Wed, 13 Apr 2016 14:36:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B83738F8035 for ; Wed, 13 Apr 2016 12:36:45 -0700 (PDT) X-ASG-Debug-ID: 1460576202-04cbb02e1d1a0900001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BRo3LChDKOiqlyhy (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:36:43 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 892FB8110F; Wed, 13 Apr 2016 19:36:41 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU8x018278; Wed, 13 Apr 2016 15:36:39 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 03/42] block, fs, mm, drivers: set bi_op to REQ_OP Date: Wed, 13 Apr 2016 14:35:49 -0500 X-ASG-Orig-Subj: [PATCH 03/42] block, fs, mm, drivers: set bi_op to REQ_OP Message-Id: <1460576188-5751-4-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576203 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch converts the simple bi_rw use cases in the block, drivers, mm and fs code to set the bio->bi_op to a REQ_OP. These should be simple one liner cases, so I just did them in one patch. The next patches handle the more complicated cases in a module per patch. v5: 1. Add missed crypto call. 2. Change nfs bi_rw check to bi_op. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- block/bio.c | 8 +++++--- block/blk-flush.c | 1 + block/blk-lib.c | 7 ++++--- block/blk-map.c | 2 +- drivers/block/floppy.c | 2 +- drivers/block/pktcdvd.c | 4 ++-- drivers/lightnvm/rrpc.c | 4 ++-- drivers/scsi/osd/osd_initiator.c | 8 ++++---- fs/crypto/crypto.c | 2 +- fs/exofs/ore.c | 2 +- fs/ext4/crypto.c | 2 +- fs/ext4/page-io.c | 8 +++++--- fs/ext4/readpage.c | 2 +- fs/jfs/jfs_logmgr.c | 2 ++ fs/jfs/jfs_metapage.c | 4 ++-- fs/logfs/dev_bdev.c | 12 ++++++------ fs/nfs/blocklayout/blocklayout.c | 4 ++-- mm/page_io.c | 4 ++-- 18 files changed, 43 insertions(+), 35 deletions(-) diff --git a/block/bio.c b/block/bio.c index f319b78..921de2e 100644 --- a/block/bio.c +++ b/block/bio.c @@ -587,6 +587,7 @@ void __bio_clone_fast(struct bio *bio, struct bio *bio_src) */ bio->bi_bdev = bio_src->bi_bdev; bio_set_flag(bio, BIO_CLONED); + bio->bi_op = bio_src->bi_op; bio->bi_rw = bio_src->bi_rw; bio->bi_iter = bio_src->bi_iter; bio->bi_io_vec = bio_src->bi_io_vec; @@ -669,6 +670,7 @@ struct bio *bio_clone_bioset(struct bio *bio_src, gfp_t gfp_mask, return NULL; bio->bi_bdev = bio_src->bi_bdev; + bio->bi_op = bio_src->bi_op; bio->bi_rw = bio_src->bi_rw; bio->bi_iter.bi_sector = bio_src->bi_iter.bi_sector; bio->bi_iter.bi_size = bio_src->bi_iter.bi_size; @@ -1177,7 +1179,7 @@ struct bio *bio_copy_user_iov(struct request_queue *q, goto out_bmd; if (iter->type & WRITE) - bio->bi_rw |= REQ_WRITE; + bio->bi_op = REQ_OP_WRITE; ret = 0; @@ -1347,7 +1349,7 @@ struct bio *bio_map_user_iov(struct request_queue *q, * set data direction, and check if mapped pages need bouncing */ if (iter->type & WRITE) - bio->bi_rw |= REQ_WRITE; + bio->bi_op = REQ_OP_WRITE; bio_set_flag(bio, BIO_USER_MAPPED); @@ -1540,7 +1542,7 @@ struct bio *bio_copy_kern(struct request_queue *q, void *data, unsigned int len, bio->bi_private = data; } else { bio->bi_end_io = bio_copy_kern_endio; - bio->bi_rw |= REQ_WRITE; + bio->bi_op = REQ_OP_WRITE; } return bio; diff --git a/block/blk-flush.c b/block/blk-flush.c index f2fbf9a..b05acca 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c @@ -484,6 +484,7 @@ int blkdev_issue_flush(struct block_device *bdev, gfp_t gfp_mask, bio = bio_alloc(gfp_mask, 0); bio->bi_bdev = bdev; + bio->bi_op = REQ_OP_WRITE; bio->bi_rw = WRITE_FLUSH; ret = submit_bio_wait(bio); diff --git a/block/blk-lib.c b/block/blk-lib.c index 87e3de4..d01b5f2 100644 --- a/block/blk-lib.c +++ b/block/blk-lib.c @@ -42,7 +42,7 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, { DECLARE_COMPLETION_ONSTACK(wait); struct request_queue *q = bdev_get_queue(bdev); - int type = REQ_WRITE | REQ_DISCARD; + int type = 0; unsigned int granularity; int alignment; struct bio_batch bb; @@ -102,6 +102,7 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, bio->bi_end_io = bio_batch_end_io; bio->bi_bdev = bdev; bio->bi_private = &bb; + bio->bi_op = REQ_OP_DISCARD; bio->bi_rw = type; bio->bi_iter.bi_size = req_sects << 9; @@ -178,7 +179,7 @@ int blkdev_issue_write_same(struct block_device *bdev, sector_t sector, bio->bi_io_vec->bv_page = page; bio->bi_io_vec->bv_offset = 0; bio->bi_io_vec->bv_len = bdev_logical_block_size(bdev); - bio->bi_rw = REQ_WRITE | REQ_WRITE_SAME; + bio->bi_op = REQ_OP_WRITE_SAME; if (nr_sects > max_write_same_sectors) { bio->bi_iter.bi_size = max_write_same_sectors << 9; @@ -240,7 +241,7 @@ static int __blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, bio->bi_bdev = bdev; bio->bi_end_io = bio_batch_end_io; bio->bi_private = &bb; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; while (nr_sects != 0) { sz = min((sector_t) PAGE_SIZE >> 9 , nr_sects); diff --git a/block/blk-map.c b/block/blk-map.c index a54f054..c489ecd 100644 --- a/block/blk-map.c +++ b/block/blk-map.c @@ -255,7 +255,7 @@ int blk_rq_map_kern(struct request_queue *q, struct request *rq, void *kbuf, return PTR_ERR(bio); if (!reading) - bio->bi_rw |= REQ_WRITE; + bio->bi_op = REQ_OP_WRITE; if (do_copy) rq->cmd_flags |= REQ_COPY_USER; diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 73ded25..84b1584 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c @@ -3822,7 +3822,7 @@ static int __floppy_read_block_0(struct block_device *bdev, int drive) bio.bi_flags |= (1 << BIO_QUIET); bio.bi_private = &cbdata; bio.bi_end_io = floppy_rb0_cb; - bio.bi_rw = READ; + bio.bi_op = REQ_OP_READ; submit_bio(&bio); process_fd_request(); diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c index d06c62e..a4ecbd3 100644 --- a/drivers/block/pktcdvd.c +++ b/drivers/block/pktcdvd.c @@ -1074,7 +1074,7 @@ static void pkt_gather_data(struct pktcdvd_device *pd, struct packet_data *pkt) BUG(); atomic_inc(&pkt->io_wait); - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; pkt_queue_bio(pd, bio); frames_read++; } @@ -1336,7 +1336,7 @@ static void pkt_start_write(struct pktcdvd_device *pd, struct packet_data *pkt) /* Start the write request */ atomic_set(&pkt->io_wait, 1); - pkt->w_bio->bi_rw = WRITE; + pkt->w_bio->bi_op = REQ_OP_WRITE; pkt_queue_bio(pd, pkt->w_bio); } diff --git a/drivers/lightnvm/rrpc.c b/drivers/lightnvm/rrpc.c index 3ab6495..fd9b629 100644 --- a/drivers/lightnvm/rrpc.c +++ b/drivers/lightnvm/rrpc.c @@ -342,7 +342,7 @@ try: /* Perform read to do GC */ bio->bi_iter.bi_sector = rrpc_get_sector(rev->addr); - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; bio->bi_private = &wait; bio->bi_end_io = rrpc_end_sync_bio; @@ -364,7 +364,7 @@ try: reinit_completion(&wait); bio->bi_iter.bi_sector = rrpc_get_sector(rev->addr); - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; bio->bi_private = &wait; bio->bi_end_io = rrpc_end_sync_bio; diff --git a/drivers/scsi/osd/osd_initiator.c b/drivers/scsi/osd/osd_initiator.c index 3b11aad..edcba56 100644 --- a/drivers/scsi/osd/osd_initiator.c +++ b/drivers/scsi/osd/osd_initiator.c @@ -726,7 +726,7 @@ static int _osd_req_list_objects(struct osd_request *or, return PTR_ERR(bio); } - bio->bi_rw &= ~REQ_WRITE; + bio->bi_op = REQ_OP_READ; or->in.bio = bio; or->in.total_bytes = bio->bi_iter.bi_size; return 0; @@ -839,7 +839,7 @@ int osd_req_write_kern(struct osd_request *or, if (IS_ERR(bio)) return PTR_ERR(bio); - bio->bi_rw |= REQ_WRITE; /* FIXME: bio_set_dir() */ + bio->bi_op = REQ_OP_WRITE; osd_req_write(or, obj, offset, bio, len); return 0; } @@ -956,7 +956,7 @@ static int _osd_req_finalize_cdb_cont(struct osd_request *or, const u8 *cap_key) if (IS_ERR(bio)) return PTR_ERR(bio); - bio->bi_rw |= REQ_WRITE; + bio->bi_op = REQ_OP_WRITE; /* integrity check the continuation before the bio is linked * with the other data segments since the continuation @@ -1077,7 +1077,7 @@ int osd_req_write_sg_kern(struct osd_request *or, if (IS_ERR(bio)) return PTR_ERR(bio); - bio->bi_rw |= REQ_WRITE; + bio->bi_op = REQ_OP_WRITE; osd_req_write_sg(or, obj, bio, sglist, numentries); return 0; diff --git a/fs/crypto/crypto.c b/fs/crypto/crypto.c index d25fc11..acf76a1 100644 --- a/fs/crypto/crypto.c +++ b/fs/crypto/crypto.c @@ -317,7 +317,7 @@ int fscrypt_zeroout_range(struct inode *inode, pgoff_t lblk, bio->bi_bdev = inode->i_sb->s_bdev; bio->bi_iter.bi_sector = pblk << (inode->i_sb->s_blocksize_bits - 9); - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; ret = bio_add_page(bio, ciphertext_page, inode->i_sb->s_blocksize, 0); if (ret != inode->i_sb->s_blocksize) { diff --git a/fs/exofs/ore.c b/fs/exofs/ore.c index 7bd8ac8..c40ed74 100644 --- a/fs/exofs/ore.c +++ b/fs/exofs/ore.c @@ -878,7 +878,7 @@ static int _write_mirror(struct ore_io_state *ios, int cur_comp) } else { bio = master_dev->bio; /* FIXME: bio_set_dir() */ - bio->bi_rw |= REQ_WRITE; + bio->bi_op = REQ_OP_WRITE; } osd_req_write(or, _ios_obj(ios, cur_comp), diff --git a/fs/ext4/crypto.c b/fs/ext4/crypto.c index e5aead0..13d4b80 100644 --- a/fs/ext4/crypto.c +++ b/fs/ext4/crypto.c @@ -427,7 +427,7 @@ int ext4_encrypted_zeroout(struct inode *inode, ext4_lblk_t lblk, bio->bi_bdev = inode->i_sb->s_bdev; bio->bi_iter.bi_sector = pblk << (inode->i_sb->s_blocksize_bits - 9); - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; ret = bio_add_page(bio, ciphertext_page, inode->i_sb->s_blocksize, 0); if (ret != inode->i_sb->s_blocksize) { diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c index 0caec87..90768f0 100644 --- a/fs/ext4/page-io.c +++ b/fs/ext4/page-io.c @@ -339,10 +339,12 @@ void ext4_io_submit(struct ext4_io_submit *io) struct bio *bio = io->io_bio; if (bio) { - int io_op = io->io_wbc->sync_mode == WB_SYNC_ALL ? - WRITE_SYNC : WRITE; + int io_op_flags = io->io_wbc->sync_mode == WB_SYNC_ALL ? + WRITE_SYNC : 0; + bio_get(io->io_bio); - io->io_bio->bi_rw = io_op; + io->io_bio->bi_op = REQ_OP_WRITE; + io->io_bio->bi_rw = io_op_flags; submit_bio(io->io_bio); bio_put(io->io_bio); } diff --git a/fs/ext4/readpage.c b/fs/ext4/readpage.c index 8eee8e18..bc4bfeb 100644 --- a/fs/ext4/readpage.c +++ b/fs/ext4/readpage.c @@ -259,7 +259,7 @@ int ext4_mpage_readpages(struct address_space *mapping, bio->bi_iter.bi_sector = blocks[0] << (blkbits - 9); bio->bi_end_io = mpage_end_io; bio->bi_private = ctx; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; } length = first_hole << blkbits; diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c index 3ee3f32..d315c1e 100644 --- a/fs/jfs/jfs_logmgr.c +++ b/fs/jfs/jfs_logmgr.c @@ -2002,6 +2002,7 @@ static int lbmRead(struct jfs_log * log, int pn, struct lbuf ** bpp) bio->bi_end_io = lbmIODone; bio->bi_private = bp; + bio->bi_op = REQ_OP_READ; bio->bi_rw = READ_SYNC; /*check if journaling to disk has been disabled*/ if (log->no_integrity) { @@ -2146,6 +2147,7 @@ static void lbmStartIO(struct lbuf * bp) bio->bi_end_io = lbmIODone; bio->bi_private = bp; + bio->bi_op = REQ_OP_WRITE; bio->bi_rw = WRITE_SYNC; /* check if journaling to disk has been disabled */ diff --git a/fs/jfs/jfs_metapage.c b/fs/jfs/jfs_metapage.c index 9725443..048342f 100644 --- a/fs/jfs/jfs_metapage.c +++ b/fs/jfs/jfs_metapage.c @@ -434,7 +434,7 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc) bio->bi_iter.bi_sector = pblock << (inode->i_blkbits - 9); bio->bi_end_io = metapage_write_end_io; bio->bi_private = page; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; /* Don't call bio_add_page yet, we may add to this vec */ bio_offset = offset; @@ -515,7 +515,7 @@ static int metapage_readpage(struct file *fp, struct page *page) pblock << (inode->i_blkbits - 9); bio->bi_end_io = metapage_read_end_io; bio->bi_private = page; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; len = xlen << inode->i_blkbits; offset = block_offset << inode->i_blkbits; if (bio_add_page(bio, page, len, offset) < len) diff --git a/fs/logfs/dev_bdev.c b/fs/logfs/dev_bdev.c index 29704bd..5c02271 100644 --- a/fs/logfs/dev_bdev.c +++ b/fs/logfs/dev_bdev.c @@ -14,7 +14,7 @@ #define PAGE_OFS(ofs) ((ofs) & (PAGE_SIZE-1)) -static int sync_request(struct page *page, struct block_device *bdev, int rw) +static int sync_request(struct page *page, struct block_device *bdev, int op) { struct bio bio; struct bio_vec bio_vec; @@ -29,7 +29,7 @@ static int sync_request(struct page *page, struct block_device *bdev, int rw) bio.bi_bdev = bdev; bio.bi_iter.bi_sector = page->index * (PAGE_SIZE >> 9); bio.bi_iter.bi_size = PAGE_SIZE; - bio.bi_rw = rw; + bio.bi_op = op; return submit_bio_wait(&bio); } @@ -96,7 +96,7 @@ static int __bdev_writeseg(struct super_block *sb, u64 ofs, pgoff_t index, bio->bi_iter.bi_sector = ofs >> 9; bio->bi_private = sb; bio->bi_end_io = writeseg_end_io; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; atomic_inc(&super->s_pending_writes); submit_bio(bio); @@ -124,7 +124,7 @@ static int __bdev_writeseg(struct super_block *sb, u64 ofs, pgoff_t index, bio->bi_iter.bi_sector = ofs >> 9; bio->bi_private = sb; bio->bi_end_io = writeseg_end_io; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; atomic_inc(&super->s_pending_writes); submit_bio(bio); return 0; @@ -188,7 +188,7 @@ static int do_erase(struct super_block *sb, u64 ofs, pgoff_t index, bio->bi_iter.bi_sector = ofs >> 9; bio->bi_private = sb; bio->bi_end_io = erase_end_io; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; atomic_inc(&super->s_pending_writes); submit_bio(bio); @@ -210,7 +210,7 @@ static int do_erase(struct super_block *sb, u64 ofs, pgoff_t index, bio->bi_iter.bi_sector = ofs >> 9; bio->bi_private = sb; bio->bi_end_io = erase_end_io; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; atomic_inc(&super->s_pending_writes); submit_bio(bio); return 0; diff --git a/fs/nfs/blocklayout/blocklayout.c b/fs/nfs/blocklayout/blocklayout.c index 4c79f4d..7b6af2e 100644 --- a/fs/nfs/blocklayout/blocklayout.c +++ b/fs/nfs/blocklayout/blocklayout.c @@ -107,7 +107,7 @@ bl_submit_bio(struct bio *bio) if (bio) { get_parallel(bio->bi_private); dprintk("%s submitting %s bio %u@%llu\n", __func__, - bio->bi_rw == READ ? "read" : "write", + bio->bi_op == READ ? "read" : "write", bio->bi_iter.bi_size, (unsigned long long)bio->bi_iter.bi_sector); submit_bio(bio); @@ -175,7 +175,7 @@ retry: disk_addr >> SECTOR_SHIFT, end_io, par); if (!bio) return ERR_PTR(-ENOMEM); - bio->bi_rw = rw; + bio->bi_op = rw; } if (bio_add_page(bio, page, *len, offset) < *len) { bio = bl_submit_bio(bio); diff --git a/mm/page_io.c b/mm/page_io.c index 85cc7e1..24da235 100644 --- a/mm/page_io.c +++ b/mm/page_io.c @@ -317,7 +317,7 @@ int __swap_writepage(struct page *page, struct writeback_control *wbc, ret = -ENOMEM; goto out; } - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; if (wbc->sync_mode == WB_SYNC_ALL) bio->bi_rw |= REQ_SYNC; count_vm_event(PSWPOUT); @@ -370,7 +370,7 @@ int swap_readpage(struct page *page) ret = -ENOMEM; goto out; } - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; count_vm_event(PSWPIN); submit_bio(bio); out: -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:36:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B9EA47CCD for ; Wed, 13 Apr 2016 14:36:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7F9968F8035 for ; Wed, 13 Apr 2016 12:36:44 -0700 (PDT) X-ASG-Debug-ID: 1460576197-04cbb02e1d1a08e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 9qIDw54EneQAZkTH (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:36:37 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D26693683C; Wed, 13 Apr 2016 19:36:36 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU8v018278; Wed, 13 Apr 2016 15:36:34 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 01/42] block/fs/drivers: remove rw argument from submit_bio Date: Wed, 13 Apr 2016 14:35:47 -0500 X-ASG-Orig-Subj: [PATCH 01/42] block/fs/drivers: remove rw argument from submit_bio Message-Id: <1460576188-5751-2-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576197 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This has callers of submit_bio/submit_bio_wait set the bio->bi_rw instead of passing it in. This makes that use the same as generic_make_request and how we set the other bio fields. v5: 1. Missed crypto fs submit_bio_wait call. v2: 1. Set bi_rw instead of ORing it. For cloned bios, I still OR it to keep the old behavior incase there bits we wanted to keep. Signed-off-by: Mike Christie Reviewed-by: Bart Van Assche Reviewed-by: Christoph Hellwig --- block/bio.c | 7 +++---- block/blk-core.c | 11 ++++------- block/blk-flush.c | 3 ++- block/blk-lib.c | 9 ++++++--- drivers/block/drbd/drbd_actlog.c | 2 +- drivers/block/drbd/drbd_bitmap.c | 4 ++-- drivers/block/floppy.c | 3 ++- drivers/block/xen-blkback/blkback.c | 4 +++- drivers/block/xen-blkfront.c | 4 ++-- drivers/md/bcache/debug.c | 6 ++++-- drivers/md/bcache/journal.c | 2 +- drivers/md/bcache/super.c | 4 ++-- drivers/md/dm-bufio.c | 3 ++- drivers/md/dm-io.c | 3 ++- drivers/md/dm-log-writes.c | 9 ++++++--- drivers/md/dm-thin.c | 3 ++- drivers/md/md.c | 10 +++++++--- drivers/md/raid1.c | 3 ++- drivers/md/raid10.c | 4 +++- drivers/md/raid5-cache.c | 7 ++++--- drivers/target/target_core_iblock.c | 24 +++++++++++++----------- fs/btrfs/check-integrity.c | 18 ++++++++++-------- fs/btrfs/check-integrity.h | 4 ++-- fs/btrfs/disk-io.c | 3 ++- fs/btrfs/extent_io.c | 7 ++++--- fs/btrfs/raid56.c | 17 ++++++++++++----- fs/btrfs/scrub.c | 15 ++++++++++----- fs/btrfs/volumes.c | 14 +++++++------- fs/buffer.c | 3 ++- fs/crypto/crypto.c | 3 ++- fs/direct-io.c | 3 ++- fs/ext4/crypto.c | 3 ++- fs/ext4/page-io.c | 3 ++- fs/ext4/readpage.c | 9 +++++---- fs/f2fs/data.c | 13 ++++++++----- fs/f2fs/segment.c | 6 ++++-- fs/gfs2/lops.c | 3 ++- fs/gfs2/meta_io.c | 3 ++- fs/gfs2/ops_fstype.c | 3 ++- fs/hfsplus/wrapper.c | 3 ++- fs/jfs/jfs_logmgr.c | 6 ++++-- fs/jfs/jfs_metapage.c | 10 ++++++---- fs/logfs/dev_bdev.c | 15 ++++++++++----- fs/mpage.c | 3 ++- fs/nfs/blocklayout/blocklayout.c | 22 ++++++++++++---------- fs/nilfs2/segbuf.c | 3 ++- fs/ocfs2/cluster/heartbeat.c | 12 +++++++----- fs/xfs/xfs_aops.c | 15 ++++++++++----- fs/xfs/xfs_buf.c | 4 ++-- include/linux/bio.h | 2 +- include/linux/fs.h | 2 +- kernel/power/swap.c | 5 +++-- mm/page_io.c | 10 ++++++---- 53 files changed, 221 insertions(+), 146 deletions(-) diff --git a/block/bio.c b/block/bio.c index 807d25e..f319b78 100644 --- a/block/bio.c +++ b/block/bio.c @@ -865,21 +865,20 @@ static void submit_bio_wait_endio(struct bio *bio) /** * submit_bio_wait - submit a bio, and wait until it completes - * @rw: whether to %READ or %WRITE, or maybe to %READA (read ahead) * @bio: The &struct bio which describes the I/O * * Simple wrapper around submit_bio(). Returns 0 on success, or the error from * bio_endio() on failure. */ -int submit_bio_wait(int rw, struct bio *bio) +int submit_bio_wait(struct bio *bio) { struct submit_bio_ret ret; - rw |= REQ_SYNC; init_completion(&ret.event); bio->bi_private = &ret; bio->bi_end_io = submit_bio_wait_endio; - submit_bio(rw, bio); + bio->bi_rw |= REQ_SYNC; + submit_bio(bio); wait_for_completion_io(&ret.event); return ret.error; diff --git a/block/blk-core.c b/block/blk-core.c index c502277..f3895c1 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -2093,7 +2093,6 @@ EXPORT_SYMBOL(generic_make_request); /** * submit_bio - submit a bio to the block device layer for I/O - * @rw: whether to %READ or %WRITE, or maybe to %READA (read ahead) * @bio: The &struct bio which describes the I/O * * submit_bio() is very similar in purpose to generic_make_request(), and @@ -2101,10 +2100,8 @@ EXPORT_SYMBOL(generic_make_request); * interfaces; @bio must be presetup and ready for I/O. * */ -blk_qc_t submit_bio(int rw, struct bio *bio) +blk_qc_t submit_bio(struct bio *bio) { - bio->bi_rw |= rw; - /* * If it's a regular read/write or a barrier with data attached, * go through the normal accounting stuff before submission. @@ -2112,12 +2109,12 @@ blk_qc_t submit_bio(int rw, struct bio *bio) if (bio_has_data(bio)) { unsigned int count; - if (unlikely(rw & REQ_WRITE_SAME)) + if (unlikely(bio->bi_rw & REQ_WRITE_SAME)) count = bdev_logical_block_size(bio->bi_bdev) >> 9; else count = bio_sectors(bio); - if (rw & WRITE) { + if (bio->bi_rw & WRITE) { count_vm_events(PGPGOUT, count); } else { task_io_account_read(bio->bi_iter.bi_size); @@ -2128,7 +2125,7 @@ blk_qc_t submit_bio(int rw, struct bio *bio) char b[BDEVNAME_SIZE]; printk(KERN_DEBUG "%s(%d): %s block %Lu on %s (%u sectors)\n", current->comm, task_pid_nr(current), - (rw & WRITE) ? "WRITE" : "READ", + (bio->bi_rw & WRITE) ? "WRITE" : "READ", (unsigned long long)bio->bi_iter.bi_sector, bdevname(bio->bi_bdev, b), count); diff --git a/block/blk-flush.c b/block/blk-flush.c index 9c423e5..f2fbf9a 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c @@ -484,8 +484,9 @@ int blkdev_issue_flush(struct block_device *bdev, gfp_t gfp_mask, bio = bio_alloc(gfp_mask, 0); bio->bi_bdev = bdev; + bio->bi_rw = WRITE_FLUSH; - ret = submit_bio_wait(WRITE_FLUSH, bio); + ret = submit_bio_wait(bio); /* * The driver must store the error location in ->bi_sector, if diff --git a/block/blk-lib.c b/block/blk-lib.c index 9ebf653..87e3de4 100644 --- a/block/blk-lib.c +++ b/block/blk-lib.c @@ -102,13 +102,14 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, bio->bi_end_io = bio_batch_end_io; bio->bi_bdev = bdev; bio->bi_private = &bb; + bio->bi_rw = type; bio->bi_iter.bi_size = req_sects << 9; nr_sects -= req_sects; sector = end_sect; atomic_inc(&bb.done); - submit_bio(type, bio); + submit_bio(bio); /* * We can loop for a long time in here, if someone does @@ -177,6 +178,7 @@ int blkdev_issue_write_same(struct block_device *bdev, sector_t sector, bio->bi_io_vec->bv_page = page; bio->bi_io_vec->bv_offset = 0; bio->bi_io_vec->bv_len = bdev_logical_block_size(bdev); + bio->bi_rw = REQ_WRITE | REQ_WRITE_SAME; if (nr_sects > max_write_same_sectors) { bio->bi_iter.bi_size = max_write_same_sectors << 9; @@ -188,7 +190,7 @@ int blkdev_issue_write_same(struct block_device *bdev, sector_t sector, } atomic_inc(&bb.done); - submit_bio(REQ_WRITE | REQ_WRITE_SAME, bio); + submit_bio(bio); } /* Wait for bios in-flight */ @@ -238,6 +240,7 @@ static int __blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, bio->bi_bdev = bdev; bio->bi_end_io = bio_batch_end_io; bio->bi_private = &bb; + bio->bi_rw = WRITE; while (nr_sects != 0) { sz = min((sector_t) PAGE_SIZE >> 9 , nr_sects); @@ -249,7 +252,7 @@ static int __blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, } ret = 0; atomic_inc(&bb.done); - submit_bio(WRITE, bio); + submit_bio(bio); } /* Wait for bios in-flight */ diff --git a/drivers/block/drbd/drbd_actlog.c b/drivers/block/drbd/drbd_actlog.c index 10459a1..6069e15 100644 --- a/drivers/block/drbd/drbd_actlog.c +++ b/drivers/block/drbd/drbd_actlog.c @@ -177,7 +177,7 @@ static int _drbd_md_sync_page_io(struct drbd_device *device, if (drbd_insert_fault(device, (rw & WRITE) ? DRBD_FAULT_MD_WR : DRBD_FAULT_MD_RD)) bio_io_error(bio); else - submit_bio(rw, bio); + submit_bio(bio); wait_until_done_or_force_detached(device, bdev, &device->md_io.done); if (!bio->bi_error) err = device->md_io.error; diff --git a/drivers/block/drbd/drbd_bitmap.c b/drivers/block/drbd/drbd_bitmap.c index 92d6fc0..e8959fe 100644 --- a/drivers/block/drbd/drbd_bitmap.c +++ b/drivers/block/drbd/drbd_bitmap.c @@ -1011,12 +1011,12 @@ static void bm_page_io_async(struct drbd_bm_aio_ctx *ctx, int page_nr) __must_ho bio_add_page(bio, page, len, 0); bio->bi_private = ctx; bio->bi_end_io = drbd_bm_endio; + bio->bi_rw = rw; if (drbd_insert_fault(device, (rw & WRITE) ? DRBD_FAULT_MD_WR : DRBD_FAULT_MD_RD)) { - bio->bi_rw |= rw; bio_io_error(bio); } else { - submit_bio(rw, bio); + submit_bio(bio); /* this should not count as user activity and cause the * resync to throttle -- see drbd_rs_should_slow_down(). */ atomic_add(len >> 9, &device->rs_sect_ev); diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 84708a5..73ded25 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c @@ -3822,8 +3822,9 @@ static int __floppy_read_block_0(struct block_device *bdev, int drive) bio.bi_flags |= (1 << BIO_QUIET); bio.bi_private = &cbdata; bio.bi_end_io = floppy_rb0_cb; + bio.bi_rw = READ; - submit_bio(READ, &bio); + submit_bio(&bio); process_fd_request(); init_completion(&cbdata.complete); diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c index 4809c150..79fe493 100644 --- a/drivers/block/xen-blkback/blkback.c +++ b/drivers/block/xen-blkback/blkback.c @@ -1369,6 +1369,7 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, bio->bi_private = pending_req; bio->bi_end_io = end_block_io_op; bio->bi_iter.bi_sector = preq.sector_number; + bio->bi_rw = operation; } preq.sector_number += seg[i].nsec; @@ -1386,13 +1387,14 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, bio->bi_bdev = preq.bdev; bio->bi_private = pending_req; bio->bi_end_io = end_block_io_op; + bio->bi_rw = operation; } atomic_set(&pending_req->pendcnt, nbio); blk_start_plug(&plug); for (i = 0; i < nbio; i++) - submit_bio(operation, biolist[i]); + submit_bio(biolist[i]); /* Let the I/Os go.. */ blk_finish_plug(&plug); diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index ca13df8..52963a2 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c @@ -2114,7 +2114,7 @@ static int blkif_recover(struct blkfront_info *info) bio_trim(cloned_bio, offset, size); cloned_bio->bi_private = split_bio; cloned_bio->bi_end_io = split_bio_end; - submit_bio(cloned_bio->bi_rw, cloned_bio); + submit_bio(cloned_bio); } /* * Now we have to wait for all those smaller bios to @@ -2123,7 +2123,7 @@ static int blkif_recover(struct blkfront_info *info) continue; } /* We don't need to split this bio */ - submit_bio(bio->bi_rw, bio); + submit_bio(bio); } return 0; diff --git a/drivers/md/bcache/debug.c b/drivers/md/bcache/debug.c index 8b1f1d5..52b6bcf 100644 --- a/drivers/md/bcache/debug.c +++ b/drivers/md/bcache/debug.c @@ -52,9 +52,10 @@ void bch_btree_verify(struct btree *b) bio->bi_bdev = PTR_CACHE(b->c, &b->key, 0)->bdev; bio->bi_iter.bi_sector = PTR_OFFSET(&b->key, 0); bio->bi_iter.bi_size = KEY_SIZE(&v->key) << 9; + bio->bi_rw = REQ_META|READ_SYNC; bch_bio_map(bio, sorted); - submit_bio_wait(REQ_META|READ_SYNC, bio); + submit_bio_wait(bio); bch_bbio_free(bio, b->c); memcpy(ondisk, sorted, KEY_SIZE(&v->key) << 9); @@ -113,11 +114,12 @@ void bch_data_verify(struct cached_dev *dc, struct bio *bio) check = bio_clone(bio, GFP_NOIO); if (!check) return; + check->bi_rw |= READ_SYNC; if (bio_alloc_pages(check, GFP_NOIO)) goto out_put; - submit_bio_wait(READ_SYNC, check); + submit_bio_wait(check); bio_for_each_segment(bv, bio, iter) { void *p1 = kmap_atomic(bv.bv_page); diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c index 29eba72..af3f9f7 100644 --- a/drivers/md/bcache/journal.c +++ b/drivers/md/bcache/journal.c @@ -418,7 +418,7 @@ static void journal_discard_work(struct work_struct *work) struct journal_device *ja = container_of(work, struct journal_device, discard_work); - submit_bio(0, &ja->discard_bio); + submit_bio(&ja->discard_bio); } static void do_journal_discard(struct cache *ca) diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index f5dbb4e..1eb526a7 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c @@ -212,7 +212,7 @@ static void __write_super(struct cache_sb *sb, struct bio *bio) unsigned i; bio->bi_iter.bi_sector = SB_SECTOR; - bio->bi_rw = REQ_SYNC|REQ_META; + bio->bi_rw = REQ_WRITE|REQ_SYNC|REQ_META; bio->bi_iter.bi_size = SB_SIZE; bch_bio_map(bio, NULL); @@ -238,7 +238,7 @@ static void __write_super(struct cache_sb *sb, struct bio *bio) pr_debug("ver %llu, flags %llu, seq %llu", sb->version, sb->flags, sb->seq); - submit_bio(REQ_WRITE, bio); + submit_bio(bio); } static void bch_write_bdev_super_unlock(struct closure *cl) diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c index cd77216..9d3ee7f 100644 --- a/drivers/md/dm-bufio.c +++ b/drivers/md/dm-bufio.c @@ -634,6 +634,7 @@ static void use_inline_bio(struct dm_buffer *b, int rw, sector_t block, * the dm_buffer's inline bio is local to bufio. */ b->bio.bi_private = end_io; + b->bio.bi_rw = rw; /* * We assume that if len >= PAGE_SIZE ptr is page-aligned. @@ -660,7 +661,7 @@ static void use_inline_bio(struct dm_buffer *b, int rw, sector_t block, ptr += PAGE_SIZE; } while (len > 0); - submit_bio(rw, &b->bio); + submit_bio(&b->bio); } static void submit_io(struct dm_buffer *b, int rw, sector_t block, diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c index 06d426e..50f17e3 100644 --- a/drivers/md/dm-io.c +++ b/drivers/md/dm-io.c @@ -322,6 +322,7 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, bio->bi_iter.bi_sector = where->sector + (where->count - remaining); bio->bi_bdev = where->bdev; bio->bi_end_io = endio; + bio->bi_rw = rw; store_io_and_region_in_bio(bio, io, region); if (rw & REQ_DISCARD) { @@ -355,7 +356,7 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, } atomic_inc(&io->count); - submit_bio(rw, bio); + submit_bio(bio); } while (remaining); } diff --git a/drivers/md/dm-log-writes.c b/drivers/md/dm-log-writes.c index 608302e..addcc4b 100644 --- a/drivers/md/dm-log-writes.c +++ b/drivers/md/dm-log-writes.c @@ -205,6 +205,7 @@ static int write_metadata(struct log_writes_c *lc, void *entry, bio->bi_bdev = lc->logdev->bdev; bio->bi_end_io = log_end_io; bio->bi_private = lc; + bio->bi_rw = WRITE; page = alloc_page(GFP_KERNEL); if (!page) { @@ -226,7 +227,7 @@ static int write_metadata(struct log_writes_c *lc, void *entry, DMERR("Couldn't add page to the log block"); goto error_bio; } - submit_bio(WRITE, bio); + submit_bio(bio); return 0; error_bio: bio_put(bio); @@ -269,6 +270,7 @@ static int log_one_block(struct log_writes_c *lc, bio->bi_bdev = lc->logdev->bdev; bio->bi_end_io = log_end_io; bio->bi_private = lc; + bio->bi_rw = WRITE; for (i = 0; i < block->vec_cnt; i++) { /* @@ -279,7 +281,7 @@ static int log_one_block(struct log_writes_c *lc, block->vecs[i].bv_len, 0); if (ret != block->vecs[i].bv_len) { atomic_inc(&lc->io_blocks); - submit_bio(WRITE, bio); + submit_bio(bio); bio = bio_alloc(GFP_KERNEL, block->vec_cnt - i); if (!bio) { DMERR("Couldn't alloc log bio"); @@ -290,6 +292,7 @@ static int log_one_block(struct log_writes_c *lc, bio->bi_bdev = lc->logdev->bdev; bio->bi_end_io = log_end_io; bio->bi_private = lc; + bio->bi_rw = WRITE; ret = bio_add_page(bio, block->vecs[i].bv_page, block->vecs[i].bv_len, 0); @@ -301,7 +304,7 @@ static int log_one_block(struct log_writes_c *lc, } sector += block->vecs[i].bv_len >> SECTOR_SHIFT; } - submit_bio(WRITE, bio); + submit_bio(bio); out: kfree(block->data); kfree(block); diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index 04e7f3b..69d86e1 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c @@ -366,8 +366,9 @@ static int __blkdev_issue_discard_async(struct block_device *bdev, sector_t sect bio->bi_iter.bi_sector = sector; bio->bi_bdev = bdev; bio->bi_iter.bi_size = nr_sects << 9; + bio->bi_rw = type; - submit_bio(type, bio); + submit_bio(bio); return 0; } diff --git a/drivers/md/md.c b/drivers/md/md.c index 5d61e76..ec3c98d 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -392,8 +392,9 @@ static void submit_flushes(struct work_struct *ws) bi->bi_end_io = md_end_flush; bi->bi_private = rdev; bi->bi_bdev = rdev->bdev; + bi->bi_rw = WRITE_FLUSH; atomic_inc(&mddev->flush_pending); - submit_bio(WRITE_FLUSH, bi); + submit_bio(bi); rcu_read_lock(); rdev_dec_pending(rdev, mddev); } @@ -740,9 +741,10 @@ void md_super_write(struct mddev *mddev, struct md_rdev *rdev, bio_add_page(bio, page, size, 0); bio->bi_private = rdev; bio->bi_end_io = super_written; + bio->bi_rw = WRITE_FLUSH_FUA; atomic_inc(&mddev->pending_writes); - submit_bio(WRITE_FLUSH_FUA, bio); + submit_bio(bio); } void md_super_wait(struct mddev *mddev) @@ -759,6 +761,7 @@ int sync_page_io(struct md_rdev *rdev, sector_t sector, int size, bio->bi_bdev = (metadata_op && rdev->meta_bdev) ? rdev->meta_bdev : rdev->bdev; + bio->bi_rw = rw; if (metadata_op) bio->bi_iter.bi_sector = sector + rdev->sb_start; else if (rdev->mddev->reshape_position != MaxSector && @@ -768,7 +771,8 @@ int sync_page_io(struct md_rdev *rdev, sector_t sector, int size, else bio->bi_iter.bi_sector = sector + rdev->data_offset; bio_add_page(bio, page, size, 0); - submit_bio_wait(rw, bio); + + submit_bio_wait(bio); ret = !bio->bi_error; bio_put(bio); diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index a7f2b9c..424df7e 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -2208,7 +2208,8 @@ static int narrow_write_error(struct r1bio *r1_bio, int i) bio_trim(wbio, sector - r1_bio->sector, sectors); wbio->bi_iter.bi_sector += rdev->data_offset; wbio->bi_bdev = rdev->bdev; - if (submit_bio_wait(WRITE, wbio) < 0) + + if (submit_bio_wait(wbio) < 0) /* failure! */ ok = rdev_set_badblocks(rdev, sector, sectors, 0) diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index e3fd725..4736be8 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -2474,7 +2474,9 @@ static int narrow_write_error(struct r10bio *r10_bio, int i) choose_data_offset(r10_bio, rdev) + (sector - r10_bio->sector)); wbio->bi_bdev = rdev->bdev; - if (submit_bio_wait(WRITE, wbio) < 0) + wbio->bi_rw = WRITE; + + if (submit_bio_wait(wbio) < 0) /* Failure! */ ok = rdev_set_badblocks(rdev, sector, sectors, 0) diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c index 9531f5f..2d56fdc 100644 --- a/drivers/md/raid5-cache.c +++ b/drivers/md/raid5-cache.c @@ -254,7 +254,7 @@ static void r5l_submit_current_io(struct r5l_log *log) __r5l_set_io_unit_state(io, IO_UNIT_IO_START); spin_unlock_irqrestore(&log->io_list_lock, flags); - submit_bio(WRITE, io->current_bio); + submit_bio(io->current_bio); } static struct bio *r5l_bio_alloc(struct r5l_log *log) @@ -373,7 +373,7 @@ static void r5l_append_payload_page(struct r5l_log *log, struct page *page) io->current_bio = r5l_bio_alloc(log); bio_chain(io->current_bio, prev); - submit_bio(WRITE, prev); + submit_bio(prev); } if (!bio_add_page(io->current_bio, page, PAGE_SIZE, 0)) @@ -686,7 +686,8 @@ void r5l_flush_stripe_to_raid(struct r5l_log *log) bio_reset(&log->flush_bio); log->flush_bio.bi_bdev = log->rdev->bdev; log->flush_bio.bi_end_io = r5l_log_flush_endio; - submit_bio(WRITE_FLUSH, &log->flush_bio); + log->flush_bio.bi_rw = WRITE_FLUSH; + submit_bio(&log->flush_bio); } static void r5l_write_super(struct r5l_log *log, sector_t cp); diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c index 026a758..c887f7d 100644 --- a/drivers/target/target_core_iblock.c +++ b/drivers/target/target_core_iblock.c @@ -312,7 +312,7 @@ static void iblock_bio_done(struct bio *bio) } static struct bio * -iblock_get_bio(struct se_cmd *cmd, sector_t lba, u32 sg_num) +iblock_get_bio(struct se_cmd *cmd, sector_t lba, u32 sg_num, int rw) { struct iblock_dev *ib_dev = IBLOCK_DEV(cmd->se_dev); struct bio *bio; @@ -334,18 +334,19 @@ iblock_get_bio(struct se_cmd *cmd, sector_t lba, u32 sg_num) bio->bi_private = cmd; bio->bi_end_io = &iblock_bio_done; bio->bi_iter.bi_sector = lba; + bio->bi_rw = rw; return bio; } -static void iblock_submit_bios(struct bio_list *list, int rw) +static void iblock_submit_bios(struct bio_list *list) { struct blk_plug plug; struct bio *bio; blk_start_plug(&plug); while ((bio = bio_list_pop(list))) - submit_bio(rw, bio); + submit_bio(bio); blk_finish_plug(&plug); } @@ -387,9 +388,10 @@ iblock_execute_sync_cache(struct se_cmd *cmd) bio = bio_alloc(GFP_KERNEL, 0); bio->bi_end_io = iblock_end_io_flush; bio->bi_bdev = ib_dev->ibd_bd; + bio->bi_rw = WRITE_FLUSH; if (!immed) bio->bi_private = cmd; - submit_bio(WRITE_FLUSH, bio); + submit_bio(bio); return 0; } @@ -478,7 +480,7 @@ iblock_execute_write_same(struct se_cmd *cmd) goto fail; cmd->priv = ibr; - bio = iblock_get_bio(cmd, block_lba, 1); + bio = iblock_get_bio(cmd, block_lba, 1, WRITE); if (!bio) goto fail_free_ibr; @@ -491,7 +493,7 @@ iblock_execute_write_same(struct se_cmd *cmd) while (bio_add_page(bio, sg_page(sg), sg->length, sg->offset) != sg->length) { - bio = iblock_get_bio(cmd, block_lba, 1); + bio = iblock_get_bio(cmd, block_lba, 1, WRITE); if (!bio) goto fail_put_bios; @@ -504,7 +506,7 @@ iblock_execute_write_same(struct se_cmd *cmd) sectors -= 1; } - iblock_submit_bios(&list, WRITE); + iblock_submit_bios(&list); return 0; fail_put_bios: @@ -712,7 +714,7 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, return 0; } - bio = iblock_get_bio(cmd, block_lba, sgl_nents); + bio = iblock_get_bio(cmd, block_lba, sgl_nents, rw); if (!bio) goto fail_free_ibr; @@ -732,11 +734,11 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, while (bio_add_page(bio, sg_page(sg), sg->length, sg->offset) != sg->length) { if (bio_cnt >= IBLOCK_MAX_BIO_PER_TASK) { - iblock_submit_bios(&list, rw); + iblock_submit_bios(&list); bio_cnt = 0; } - bio = iblock_get_bio(cmd, block_lba, sg_num); + bio = iblock_get_bio(cmd, block_lba, sg_num, rw); if (!bio) goto fail_put_bios; @@ -756,7 +758,7 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, goto fail_put_bios; } - iblock_submit_bios(&list, rw); + iblock_submit_bios(&list); iblock_complete_cmd(cmd); return 0; diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index 516e19d..9400acd 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c @@ -1673,6 +1673,7 @@ static int btrfsic_read_block(struct btrfsic_state *state, } bio->bi_bdev = block_ctx->dev->bdev; bio->bi_iter.bi_sector = dev_bytenr >> 9; + bio->bi_rw = READ; for (j = i; j < num_pages; j++) { ret = bio_add_page(bio, block_ctx->pagev[j], @@ -1685,7 +1686,7 @@ static int btrfsic_read_block(struct btrfsic_state *state, "btrfsic: error, failed to add a single page!\n"); return -1; } - if (submit_bio_wait(READ, bio)) { + if (submit_bio_wait(bio)) { printk(KERN_INFO "btrfsic: read error at logical %llu dev %s!\n", block_ctx->start, block_ctx->dev->name); @@ -2918,9 +2919,10 @@ int btrfsic_submit_bh(int rw, struct buffer_head *bh) return submit_bh(rw, bh); } -static void __btrfsic_submit_bio(int rw, struct bio *bio) +static void __btrfsic_submit_bio(struct bio *bio) { struct btrfsic_dev_state *dev_state; + int rw = bio->bi_rw; if (!btrfsic_is_initialized) return; @@ -3016,16 +3018,16 @@ leave: mutex_unlock(&btrfsic_mutex); } -void btrfsic_submit_bio(int rw, struct bio *bio) +void btrfsic_submit_bio(struct bio *bio) { - __btrfsic_submit_bio(rw, bio); - submit_bio(rw, bio); + __btrfsic_submit_bio(bio); + submit_bio(bio); } -int btrfsic_submit_bio_wait(int rw, struct bio *bio) +int btrfsic_submit_bio_wait(struct bio *bio) { - __btrfsic_submit_bio(rw, bio); - return submit_bio_wait(rw, bio); + __btrfsic_submit_bio(bio); + return submit_bio_wait(bio); } int btrfsic_mount(struct btrfs_root *root, diff --git a/fs/btrfs/check-integrity.h b/fs/btrfs/check-integrity.h index 13b8566..c04e249 100644 --- a/fs/btrfs/check-integrity.h +++ b/fs/btrfs/check-integrity.h @@ -21,8 +21,8 @@ #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY int btrfsic_submit_bh(int rw, struct buffer_head *bh); -void btrfsic_submit_bio(int rw, struct bio *bio); -int btrfsic_submit_bio_wait(int rw, struct bio *bio); +void btrfsic_submit_bio(struct bio *bio); +int btrfsic_submit_bio_wait(struct bio *bio); #else #define btrfsic_submit_bh submit_bh #define btrfsic_submit_bio submit_bio diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index aeb0905..0bd25e4 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -3476,12 +3476,13 @@ static int write_dev_flush(struct btrfs_device *device, int wait) bio->bi_end_io = btrfs_end_empty_barrier; bio->bi_bdev = device->bdev; + bio->bi_rw = WRITE_FLUSH; init_completion(&device->flush_wait); bio->bi_private = &device->flush_wait; device->flush_bio = bio; bio_get(bio); - btrfsic_submit_bio(WRITE_FLUSH, bio); + btrfsic_submit_bio(bio); return 0; } diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index b67d6d2..fdeb8fa 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -2040,9 +2040,10 @@ int repair_io_failure(struct inode *inode, u64 start, u64 length, u64 logical, return -EIO; } bio->bi_bdev = dev->bdev; + bio->bi_rw = WRITE_SYNC; bio_add_page(bio, page, length, pg_offset); - if (btrfsic_submit_bio_wait(WRITE_SYNC, bio)) { + if (btrfsic_submit_bio_wait(bio)) { /* try to remap that extent elsewhere? */ bio_put(bio); btrfs_dev_stat_inc_and_print(dev, BTRFS_DEV_STAT_WRITE_ERRS); @@ -2725,14 +2726,14 @@ static int __must_check submit_one_bio(int rw, struct bio *bio, start = page_offset(page) + bvec->bv_offset; bio->bi_private = NULL; - + bio->bi_rw = rw; bio_get(bio); if (tree->ops && tree->ops->submit_bio_hook) ret = tree->ops->submit_bio_hook(page->mapping->host, rw, bio, mirror_num, bio_flags, start); else - btrfsic_submit_bio(rw, bio); + btrfsic_submit_bio(bio); bio_put(bio); return ret; diff --git a/fs/btrfs/raid56.c b/fs/btrfs/raid56.c index 0b7792e..439d7eb 100644 --- a/fs/btrfs/raid56.c +++ b/fs/btrfs/raid56.c @@ -1320,7 +1320,9 @@ write_data: bio->bi_private = rbio; bio->bi_end_io = raid_write_end_io; - submit_bio(WRITE, bio); + bio->bi_rw = WRITE; + + submit_bio(bio); } return; @@ -1573,11 +1575,12 @@ static int raid56_rmw_stripe(struct btrfs_raid_bio *rbio) bio->bi_private = rbio; bio->bi_end_io = raid_rmw_end_io; + bio->bi_rw = READ; btrfs_bio_wq_end_io(rbio->fs_info, bio, BTRFS_WQ_ENDIO_RAID56); - submit_bio(READ, bio); + submit_bio(bio); } /* the actual write will happen once the reads are done */ return 0; @@ -2097,11 +2100,12 @@ static int __raid56_parity_recover(struct btrfs_raid_bio *rbio) bio->bi_private = rbio; bio->bi_end_io = raid_recover_end_io; + bio->bi_rw = READ; btrfs_bio_wq_end_io(rbio->fs_info, bio, BTRFS_WQ_ENDIO_RAID56); - submit_bio(READ, bio); + submit_bio(bio); } out: return 0; @@ -2433,7 +2437,9 @@ submit_write: bio->bi_private = rbio; bio->bi_end_io = raid_write_end_io; - submit_bio(WRITE, bio); + bio->bi_rw = WRITE; + + submit_bio(bio); } return; @@ -2610,11 +2616,12 @@ static void raid56_parity_scrub_stripe(struct btrfs_raid_bio *rbio) bio->bi_private = rbio; bio->bi_end_io = raid56_parity_scrub_end_io; + bio->bi_rw = READ; btrfs_bio_wq_end_io(rbio->fs_info, bio, BTRFS_WQ_ENDIO_RAID56); - submit_bio(READ, bio); + submit_bio(bio); } /* the actual write will happen once the reads are done */ return; diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 2ff2876..184cb57 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -1504,8 +1504,9 @@ static void scrub_recheck_block(struct btrfs_fs_info *fs_info, sblock->no_io_error_seen = 0; } else { bio->bi_iter.bi_sector = page->physical >> 9; + bio->bi_rw = READ; - if (btrfsic_submit_bio_wait(READ, bio)) + if (btrfsic_submit_bio_wait(bio)) sblock->no_io_error_seen = 0; } @@ -1583,6 +1584,7 @@ static int scrub_repair_page_from_good_copy(struct scrub_block *sblock_bad, return -EIO; bio->bi_bdev = page_bad->dev->bdev; bio->bi_iter.bi_sector = page_bad->physical >> 9; + bio->bi_rw = WRITE; ret = bio_add_page(bio, page_good->page, PAGE_SIZE, 0); if (PAGE_SIZE != ret) { @@ -1590,7 +1592,7 @@ static int scrub_repair_page_from_good_copy(struct scrub_block *sblock_bad, return -EIO; } - if (btrfsic_submit_bio_wait(WRITE, bio)) { + if (btrfsic_submit_bio_wait(bio)) { btrfs_dev_stat_inc_and_print(page_bad->dev, BTRFS_DEV_STAT_WRITE_ERRS); btrfs_dev_replace_stats_inc( @@ -1684,6 +1686,7 @@ again: bio->bi_end_io = scrub_wr_bio_end_io; bio->bi_bdev = sbio->dev->bdev; bio->bi_iter.bi_sector = sbio->physical >> 9; + bio->bi_rw = WRITE; sbio->err = 0; } else if (sbio->physical + sbio->page_count * PAGE_SIZE != spage->physical_for_dev_replace || @@ -1731,7 +1734,7 @@ static void scrub_wr_submit(struct scrub_ctx *sctx) * orders the requests before sending them to the driver which * doubled the write performance on spinning disks when measured * with Linux 3.5 */ - btrfsic_submit_bio(WRITE, sbio->bio); + btrfsic_submit_bio(sbio->bio); } static void scrub_wr_bio_end_io(struct bio *bio) @@ -2041,7 +2044,7 @@ static void scrub_submit(struct scrub_ctx *sctx) sbio = sctx->bios[sctx->curr]; sctx->curr = -1; scrub_pending_bio_inc(sctx); - btrfsic_submit_bio(READ, sbio->bio); + btrfsic_submit_bio(sbio->bio); } static int scrub_add_page_to_rd_bio(struct scrub_ctx *sctx, @@ -2088,6 +2091,7 @@ again: bio->bi_end_io = scrub_bio_end_io; bio->bi_bdev = sbio->dev->bdev; bio->bi_iter.bi_sector = sbio->physical >> 9; + bio->bi_rw = READ; sbio->err = 0; } else if (sbio->physical + sbio->page_count * PAGE_SIZE != spage->physical || @@ -4389,6 +4393,7 @@ static int write_page_nocow(struct scrub_ctx *sctx, bio->bi_iter.bi_size = 0; bio->bi_iter.bi_sector = physical_for_dev_replace >> 9; bio->bi_bdev = dev->bdev; + bio->bi_rw = WRITE_SYNC; ret = bio_add_page(bio, page, PAGE_SIZE, 0); if (ret != PAGE_SIZE) { leave_with_eio: @@ -4397,7 +4402,7 @@ leave_with_eio: return -EIO; } - if (btrfsic_submit_bio_wait(WRITE_SYNC, bio)) + if (btrfsic_submit_bio_wait(bio)) goto leave_with_eio; bio_put(bio); diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 4dc66e6..318215d 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -462,7 +462,7 @@ loop_lock: sync_pending = 0; } - btrfsic_submit_bio(cur->bi_rw, cur); + btrfsic_submit_bio(cur); num_run++; batch_run++; @@ -5938,7 +5938,7 @@ static void btrfs_end_bio(struct bio *bio) */ static noinline void btrfs_schedule_bio(struct btrfs_root *root, struct btrfs_device *device, - int rw, struct bio *bio) + struct bio *bio) { int should_queue = 1; struct btrfs_pending_bios *pending_bios; @@ -5949,9 +5949,9 @@ static noinline void btrfs_schedule_bio(struct btrfs_root *root, } /* don't bother with additional async steps for reads, right now */ - if (!(rw & REQ_WRITE)) { + if (!(bio->bi_rw & REQ_WRITE)) { bio_get(bio); - btrfsic_submit_bio(rw, bio); + btrfsic_submit_bio(bio); bio_put(bio); return; } @@ -5965,7 +5965,6 @@ static noinline void btrfs_schedule_bio(struct btrfs_root *root, atomic_inc(&root->fs_info->nr_async_bios); WARN_ON(bio->bi_next); bio->bi_next = NULL; - bio->bi_rw |= rw; spin_lock(&device->io_lock); if (bio->bi_rw & REQ_SYNC) @@ -5999,6 +5998,7 @@ static void submit_stripe_bio(struct btrfs_root *root, struct btrfs_bio *bbio, btrfs_io_bio(bio)->stripe_index = dev_nr; bio->bi_end_io = btrfs_end_bio; bio->bi_iter.bi_sector = physical >> 9; + bio->bi_rw |= rw; #ifdef DEBUG { struct rcu_string *name; @@ -6017,9 +6017,9 @@ static void submit_stripe_bio(struct btrfs_root *root, struct btrfs_bio *bbio, btrfs_bio_counter_inc_noblocked(root->fs_info); if (async) - btrfs_schedule_bio(root, dev, rw, bio); + btrfs_schedule_bio(root, dev, bio); else - btrfsic_submit_bio(rw, bio); + btrfsic_submit_bio(bio); } static void bbio_error(struct btrfs_bio *bbio, struct bio *bio, u64 logical) diff --git a/fs/buffer.c b/fs/buffer.c index af0d9a8..7ed7869 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -3030,8 +3030,9 @@ static int submit_bh_wbc(int rw, struct buffer_head *bh, rw |= REQ_META; if (buffer_prio(bh)) rw |= REQ_PRIO; + bio->bi_rw = rw; - submit_bio(rw, bio); + submit_bio(bio); return 0; } diff --git a/fs/crypto/crypto.c b/fs/crypto/crypto.c index da70520..d25fc11 100644 --- a/fs/crypto/crypto.c +++ b/fs/crypto/crypto.c @@ -317,6 +317,7 @@ int fscrypt_zeroout_range(struct inode *inode, pgoff_t lblk, bio->bi_bdev = inode->i_sb->s_bdev; bio->bi_iter.bi_sector = pblk << (inode->i_sb->s_blocksize_bits - 9); + bio->bi_rw = WRITE; ret = bio_add_page(bio, ciphertext_page, inode->i_sb->s_blocksize, 0); if (ret != inode->i_sb->s_blocksize) { @@ -326,7 +327,7 @@ int fscrypt_zeroout_range(struct inode *inode, pgoff_t lblk, err = -EIO; goto errout; } - err = submit_bio_wait(WRITE, bio); + err = submit_bio_wait(bio); if ((err == 0) && bio->bi_error) err = -EIO; bio_put(bio); diff --git a/fs/direct-io.c b/fs/direct-io.c index 4720377..1890ad2 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -374,6 +374,7 @@ dio_bio_alloc(struct dio *dio, struct dio_submit *sdio, bio->bi_bdev = bdev; bio->bi_iter.bi_sector = first_sector; + bio->bi_rw = dio->rw; if (dio->is_async) bio->bi_end_io = dio_bio_end_aio; else @@ -411,7 +412,7 @@ static inline void dio_bio_submit(struct dio *dio, struct dio_submit *sdio) sdio->logical_offset_in_bio); dio->bio_cookie = BLK_QC_T_NONE; } else - dio->bio_cookie = submit_bio(dio->rw, bio); + dio->bio_cookie = submit_bio(bio); sdio->bio = NULL; sdio->boundary = 0; diff --git a/fs/ext4/crypto.c b/fs/ext4/crypto.c index db9ae6e..e5aead0 100644 --- a/fs/ext4/crypto.c +++ b/fs/ext4/crypto.c @@ -427,6 +427,7 @@ int ext4_encrypted_zeroout(struct inode *inode, ext4_lblk_t lblk, bio->bi_bdev = inode->i_sb->s_bdev; bio->bi_iter.bi_sector = pblk << (inode->i_sb->s_blocksize_bits - 9); + bio->bi_rw = WRITE; ret = bio_add_page(bio, ciphertext_page, inode->i_sb->s_blocksize, 0); if (ret != inode->i_sb->s_blocksize) { @@ -438,7 +439,7 @@ int ext4_encrypted_zeroout(struct inode *inode, ext4_lblk_t lblk, err = -EIO; goto errout; } - err = submit_bio_wait(WRITE, bio); + err = submit_bio_wait(bio); if ((err == 0) && bio->bi_error) err = -EIO; bio_put(bio); diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c index f124b24..0caec87 100644 --- a/fs/ext4/page-io.c +++ b/fs/ext4/page-io.c @@ -342,7 +342,8 @@ void ext4_io_submit(struct ext4_io_submit *io) int io_op = io->io_wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE; bio_get(io->io_bio); - submit_bio(io_op, io->io_bio); + io->io_bio->bi_rw = io_op; + submit_bio(io->io_bio); bio_put(io->io_bio); } io->io_bio = NULL; diff --git a/fs/ext4/readpage.c b/fs/ext4/readpage.c index 13f3476..8eee8e18 100644 --- a/fs/ext4/readpage.c +++ b/fs/ext4/readpage.c @@ -236,7 +236,7 @@ int ext4_mpage_readpages(struct address_space *mapping, */ if (bio && (last_block_in_bio != blocks[0] - 1)) { submit_and_realloc: - submit_bio(READ, bio); + submit_bio(bio); bio = NULL; } if (bio == NULL) { @@ -259,6 +259,7 @@ int ext4_mpage_readpages(struct address_space *mapping, bio->bi_iter.bi_sector = blocks[0] << (blkbits - 9); bio->bi_end_io = mpage_end_io; bio->bi_private = ctx; + bio->bi_rw = READ; } length = first_hole << blkbits; @@ -268,14 +269,14 @@ int ext4_mpage_readpages(struct address_space *mapping, if (((map.m_flags & EXT4_MAP_BOUNDARY) && (relative_block == map.m_len)) || (first_hole != blocks_per_page)) { - submit_bio(READ, bio); + submit_bio(bio); bio = NULL; } else last_block_in_bio = blocks[blocks_per_page - 1]; goto next_page; confused: if (bio) { - submit_bio(READ, bio); + submit_bio(bio); bio = NULL; } if (!PageUptodate(page)) @@ -288,6 +289,6 @@ int ext4_mpage_readpages(struct address_space *mapping, } BUG_ON(pages && !list_empty(pages)); if (bio) - submit_bio(READ, bio); + submit_bio(bio); return 0; } diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index c29bcf4..74cf5cb 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -109,8 +109,9 @@ static void __submit_merged_bio(struct f2fs_bio_info *io) trace_f2fs_submit_read_bio(io->sbi->sb, fio, io->bio); else trace_f2fs_submit_write_bio(io->sbi->sb, fio, io->bio); + io->bio->bi_rw = fio->rw; - submit_bio(fio->rw, io->bio); + submit_bio(io->bio); io->bio = NULL; } @@ -227,8 +228,9 @@ int f2fs_submit_page_bio(struct f2fs_io_info *fio) bio_put(bio); return -EFAULT; } + bio->bi_rw = fio->rw; - submit_bio(fio->rw, bio); + submit_bio(bio); return 0; } @@ -983,7 +985,7 @@ got_it: */ if (bio && (last_block_in_bio != block_nr - 1)) { submit_and_realloc: - submit_bio(READ, bio); + submit_bio(bio); bio = NULL; } if (bio == NULL) { @@ -1012,6 +1014,7 @@ submit_and_realloc: bio->bi_iter.bi_sector = SECTOR_FROM_BLOCK(block_nr); bio->bi_end_io = f2fs_read_end_io; bio->bi_private = ctx; + bio->bi_rw = READ; } if (bio_add_page(bio, page, blocksize, 0) < blocksize) @@ -1026,7 +1029,7 @@ set_error_page: goto next_page; confused: if (bio) { - submit_bio(READ, bio); + submit_bio(bio); bio = NULL; } unlock_page(page); @@ -1036,7 +1039,7 @@ next_page: } BUG_ON(pages && !list_empty(pages)); if (bio) - submit_bio(READ, bio); + submit_bio(bio); return 0; } diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 299c784..0928d57 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -404,7 +404,8 @@ repeat: fcc->dispatch_list = llist_reverse_order(fcc->dispatch_list); bio->bi_bdev = sbi->sb->s_bdev; - ret = submit_bio_wait(WRITE_FLUSH, bio); + bio->bi_rw = WRITE_FLUSH; + ret = submit_bio_wait(bio); llist_for_each_entry_safe(cmd, next, fcc->dispatch_list, llnode) { @@ -436,7 +437,8 @@ int f2fs_issue_flush(struct f2fs_sb_info *sbi) int ret; bio->bi_bdev = sbi->sb->s_bdev; - ret = submit_bio_wait(WRITE_FLUSH, bio); + bio->bi_rw = WRITE_FLUSH; + ret = submit_bio_wait(bio); bio_put(bio); return ret; } diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c index d5369a1..ce28242 100644 --- a/fs/gfs2/lops.c +++ b/fs/gfs2/lops.c @@ -240,7 +240,8 @@ void gfs2_log_flush_bio(struct gfs2_sbd *sdp, int rw) { if (sdp->sd_log_bio) { atomic_inc(&sdp->sd_log_in_flight); - submit_bio(rw, sdp->sd_log_bio); + sdp->sd_log_bio->bi_rw = rw; + submit_bio(sdp->sd_log_bio); sdp->sd_log_bio = NULL; } } diff --git a/fs/gfs2/meta_io.c b/fs/gfs2/meta_io.c index 0448524..f8d33e8 100644 --- a/fs/gfs2/meta_io.c +++ b/fs/gfs2/meta_io.c @@ -230,7 +230,8 @@ static void gfs2_submit_bhs(int rw, struct buffer_head *bhs[], int num) bio_add_page(bio, bh->b_page, bh->b_size, bh_offset(bh)); } bio->bi_end_io = gfs2_meta_read_endio; - submit_bio(rw, bio); + bio->bi_rw = rw; + submit_bio(bio); } /** diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index 49b0bff..141b560 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c @@ -246,7 +246,8 @@ static int gfs2_read_super(struct gfs2_sbd *sdp, sector_t sector, int silent) bio->bi_end_io = end_bio_io_page; bio->bi_private = page; - submit_bio(READ_SYNC | REQ_META, bio); + bio->bi_rw = READ_SYNC | REQ_META; + submit_bio(bio); wait_on_page_locked(page); bio_put(bio); if (!PageUptodate(page)) { diff --git a/fs/hfsplus/wrapper.c b/fs/hfsplus/wrapper.c index cc62356..d026bb3 100644 --- a/fs/hfsplus/wrapper.c +++ b/fs/hfsplus/wrapper.c @@ -65,6 +65,7 @@ int hfsplus_submit_bio(struct super_block *sb, sector_t sector, bio = bio_alloc(GFP_NOIO, 1); bio->bi_iter.bi_sector = sector; bio->bi_bdev = sb->s_bdev; + bio->bi_rw = rw; if (!(rw & WRITE) && data) *data = (u8 *)buf + offset; @@ -83,7 +84,7 @@ int hfsplus_submit_bio(struct super_block *sb, sector_t sector, buf = (u8 *)buf + len; } - ret = submit_bio_wait(rw, bio); + ret = submit_bio_wait(bio); out: bio_put(bio); return ret < 0 ? ret : 0; diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c index 63759d7..3ee3f32 100644 --- a/fs/jfs/jfs_logmgr.c +++ b/fs/jfs/jfs_logmgr.c @@ -2002,12 +2002,13 @@ static int lbmRead(struct jfs_log * log, int pn, struct lbuf ** bpp) bio->bi_end_io = lbmIODone; bio->bi_private = bp; + bio->bi_rw = READ_SYNC; /*check if journaling to disk has been disabled*/ if (log->no_integrity) { bio->bi_iter.bi_size = 0; lbmIODone(bio); } else { - submit_bio(READ_SYNC, bio); + submit_bio(bio); } wait_event(bp->l_ioevent, (bp->l_flag != lbmREAD)); @@ -2145,13 +2146,14 @@ static void lbmStartIO(struct lbuf * bp) bio->bi_end_io = lbmIODone; bio->bi_private = bp; + bio->bi_rw = WRITE_SYNC; /* check if journaling to disk has been disabled */ if (log->no_integrity) { bio->bi_iter.bi_size = 0; lbmIODone(bio); } else { - submit_bio(WRITE_SYNC, bio); + submit_bio(bio); INCREMENT(lmStat.submitted); } } diff --git a/fs/jfs/jfs_metapage.c b/fs/jfs/jfs_metapage.c index b60e015..9725443 100644 --- a/fs/jfs/jfs_metapage.c +++ b/fs/jfs/jfs_metapage.c @@ -411,7 +411,7 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc) inc_io(page); if (!bio->bi_iter.bi_size) goto dump_bio; - submit_bio(WRITE, bio); + submit_bio(bio); nr_underway++; bio = NULL; } else @@ -434,6 +434,7 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc) bio->bi_iter.bi_sector = pblock << (inode->i_blkbits - 9); bio->bi_end_io = metapage_write_end_io; bio->bi_private = page; + bio->bi_rw = WRITE; /* Don't call bio_add_page yet, we may add to this vec */ bio_offset = offset; @@ -448,7 +449,7 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc) if (!bio->bi_iter.bi_size) goto dump_bio; - submit_bio(WRITE, bio); + submit_bio(bio); nr_underway++; } if (redirty) @@ -506,7 +507,7 @@ static int metapage_readpage(struct file *fp, struct page *page) insert_metapage(page, NULL); inc_io(page); if (bio) - submit_bio(READ, bio); + submit_bio(bio); bio = bio_alloc(GFP_NOFS, 1); bio->bi_bdev = inode->i_sb->s_bdev; @@ -514,6 +515,7 @@ static int metapage_readpage(struct file *fp, struct page *page) pblock << (inode->i_blkbits - 9); bio->bi_end_io = metapage_read_end_io; bio->bi_private = page; + bio->bi_rw = READ; len = xlen << inode->i_blkbits; offset = block_offset << inode->i_blkbits; if (bio_add_page(bio, page, len, offset) < len) @@ -523,7 +525,7 @@ static int metapage_readpage(struct file *fp, struct page *page) block_offset++; } if (bio) - submit_bio(READ, bio); + submit_bio(bio); else unlock_page(page); diff --git a/fs/logfs/dev_bdev.c b/fs/logfs/dev_bdev.c index cc26f8f..29704bd 100644 --- a/fs/logfs/dev_bdev.c +++ b/fs/logfs/dev_bdev.c @@ -29,8 +29,9 @@ static int sync_request(struct page *page, struct block_device *bdev, int rw) bio.bi_bdev = bdev; bio.bi_iter.bi_sector = page->index * (PAGE_SIZE >> 9); bio.bi_iter.bi_size = PAGE_SIZE; + bio.bi_rw = rw; - return submit_bio_wait(rw, &bio); + return submit_bio_wait(&bio); } static int bdev_readpage(void *_sb, struct page *page) @@ -95,8 +96,9 @@ static int __bdev_writeseg(struct super_block *sb, u64 ofs, pgoff_t index, bio->bi_iter.bi_sector = ofs >> 9; bio->bi_private = sb; bio->bi_end_io = writeseg_end_io; + bio->bi_rw = WRITE; atomic_inc(&super->s_pending_writes); - submit_bio(WRITE, bio); + submit_bio(bio); ofs += i * PAGE_SIZE; index += i; @@ -122,8 +124,9 @@ static int __bdev_writeseg(struct super_block *sb, u64 ofs, pgoff_t index, bio->bi_iter.bi_sector = ofs >> 9; bio->bi_private = sb; bio->bi_end_io = writeseg_end_io; + bio->bi_rw = WRITE; atomic_inc(&super->s_pending_writes); - submit_bio(WRITE, bio); + submit_bio(bio); return 0; } @@ -185,8 +188,9 @@ static int do_erase(struct super_block *sb, u64 ofs, pgoff_t index, bio->bi_iter.bi_sector = ofs >> 9; bio->bi_private = sb; bio->bi_end_io = erase_end_io; + bio->bi_rw = WRITE; atomic_inc(&super->s_pending_writes); - submit_bio(WRITE, bio); + submit_bio(bio); ofs += i * PAGE_SIZE; index += i; @@ -206,8 +210,9 @@ static int do_erase(struct super_block *sb, u64 ofs, pgoff_t index, bio->bi_iter.bi_sector = ofs >> 9; bio->bi_private = sb; bio->bi_end_io = erase_end_io; + bio->bi_rw = WRITE; atomic_inc(&super->s_pending_writes); - submit_bio(WRITE, bio); + submit_bio(bio); return 0; } diff --git a/fs/mpage.c b/fs/mpage.c index eedc644..2c251ec 100644 --- a/fs/mpage.c +++ b/fs/mpage.c @@ -59,8 +59,9 @@ static void mpage_end_io(struct bio *bio) static struct bio *mpage_bio_submit(int rw, struct bio *bio) { bio->bi_end_io = mpage_end_io; + bio->bi_rw = rw; guard_bio_eod(rw, bio); - submit_bio(rw, bio); + submit_bio(bio); return NULL; } diff --git a/fs/nfs/blocklayout/blocklayout.c b/fs/nfs/blocklayout/blocklayout.c index 17a42e4..4c79f4d 100644 --- a/fs/nfs/blocklayout/blocklayout.c +++ b/fs/nfs/blocklayout/blocklayout.c @@ -102,14 +102,15 @@ static inline void put_parallel(struct parallel_io *p) } static struct bio * -bl_submit_bio(int rw, struct bio *bio) +bl_submit_bio(struct bio *bio) { if (bio) { get_parallel(bio->bi_private); dprintk("%s submitting %s bio %u@%llu\n", __func__, - rw == READ ? "read" : "write", bio->bi_iter.bi_size, + bio->bi_rw == READ ? "read" : "write", + bio->bi_iter.bi_size, (unsigned long long)bio->bi_iter.bi_sector); - submit_bio(rw, bio); + submit_bio(bio); } return NULL; } @@ -158,7 +159,7 @@ do_add_page_to_bio(struct bio *bio, int npg, int rw, sector_t isect, if (disk_addr < map->start || disk_addr >= map->start + map->len) { if (!dev->map(dev, disk_addr, map)) return ERR_PTR(-EIO); - bio = bl_submit_bio(rw, bio); + bio = bl_submit_bio(bio); } disk_addr += map->disk_offset; disk_addr -= map->start; @@ -174,9 +175,10 @@ retry: disk_addr >> SECTOR_SHIFT, end_io, par); if (!bio) return ERR_PTR(-ENOMEM); + bio->bi_rw = rw; } if (bio_add_page(bio, page, *len, offset) < *len) { - bio = bl_submit_bio(rw, bio); + bio = bl_submit_bio(bio); goto retry; } return bio; @@ -252,7 +254,7 @@ bl_read_pagelist(struct nfs_pgio_header *header) for (i = pg_index; i < header->page_array.npages; i++) { if (extent_length <= 0) { /* We've used up the previous extent */ - bio = bl_submit_bio(READ, bio); + bio = bl_submit_bio(bio); /* Get the next one */ if (!ext_tree_lookup(bl, isect, &be, false)) { @@ -273,7 +275,7 @@ bl_read_pagelist(struct nfs_pgio_header *header) } if (is_hole(&be)) { - bio = bl_submit_bio(READ, bio); + bio = bl_submit_bio(bio); /* Fill hole w/ zeroes w/o accessing device */ dprintk("%s Zeroing page for hole\n", __func__); zero_user_segment(pages[i], pg_offset, pg_len); @@ -306,7 +308,7 @@ bl_read_pagelist(struct nfs_pgio_header *header) header->res.count = (isect << SECTOR_SHIFT) - header->args.offset; } out: - bl_submit_bio(READ, bio); + bl_submit_bio(bio); blk_finish_plug(&plug); put_parallel(par); return PNFS_ATTEMPTED; @@ -398,7 +400,7 @@ bl_write_pagelist(struct nfs_pgio_header *header, int sync) for (i = pg_index; i < header->page_array.npages; i++) { if (extent_length <= 0) { /* We've used up the previous extent */ - bio = bl_submit_bio(WRITE, bio); + bio = bl_submit_bio(bio); /* Get the next one */ if (!ext_tree_lookup(bl, isect, &be, true)) { header->pnfs_error = -EINVAL; @@ -427,7 +429,7 @@ bl_write_pagelist(struct nfs_pgio_header *header, int sync) header->res.count = header->args.count; out: - bl_submit_bio(WRITE, bio); + bl_submit_bio(bio); blk_finish_plug(&plug); put_parallel(par); return PNFS_ATTEMPTED; diff --git a/fs/nilfs2/segbuf.c b/fs/nilfs2/segbuf.c index f63620c..7666f1d 100644 --- a/fs/nilfs2/segbuf.c +++ b/fs/nilfs2/segbuf.c @@ -368,7 +368,8 @@ static int nilfs_segbuf_submit_bio(struct nilfs_segment_buffer *segbuf, bio->bi_end_io = nilfs_end_bio_write; bio->bi_private = segbuf; - submit_bio(mode, bio); + bio->bi_rw = mode; + submit_bio(bio); segbuf->sb_nbio++; wi->bio = NULL; diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c index 6e04b1a..e37373d 100644 --- a/fs/ocfs2/cluster/heartbeat.c +++ b/fs/ocfs2/cluster/heartbeat.c @@ -530,7 +530,7 @@ static void o2hb_bio_end_io(struct bio *bio) static struct bio *o2hb_setup_one_bio(struct o2hb_region *reg, struct o2hb_bio_wait_ctxt *wc, unsigned int *current_slot, - unsigned int max_slots) + unsigned int max_slots, int rw) { int len, current_page; unsigned int vec_len, vec_start; @@ -556,6 +556,7 @@ static struct bio *o2hb_setup_one_bio(struct o2hb_region *reg, bio->bi_bdev = reg->hr_bdev; bio->bi_private = wc; bio->bi_end_io = o2hb_bio_end_io; + bio->bi_rw = rw; vec_start = (cs << bits) % PAGE_SIZE; while(cs < max_slots) { @@ -591,7 +592,8 @@ static int o2hb_read_slots(struct o2hb_region *reg, o2hb_bio_wait_init(&wc); while(current_slot < max_slots) { - bio = o2hb_setup_one_bio(reg, &wc, ¤t_slot, max_slots); + bio = o2hb_setup_one_bio(reg, &wc, ¤t_slot, max_slots, + READ); if (IS_ERR(bio)) { status = PTR_ERR(bio); mlog_errno(status); @@ -599,7 +601,7 @@ static int o2hb_read_slots(struct o2hb_region *reg, } atomic_inc(&wc.wc_num_reqs); - submit_bio(READ, bio); + submit_bio(bio); } status = 0; @@ -623,7 +625,7 @@ static int o2hb_issue_node_write(struct o2hb_region *reg, slot = o2nm_this_node(); - bio = o2hb_setup_one_bio(reg, write_wc, &slot, slot+1); + bio = o2hb_setup_one_bio(reg, write_wc, &slot, slot+1, WRITE_SYNC); if (IS_ERR(bio)) { status = PTR_ERR(bio); mlog_errno(status); @@ -631,7 +633,7 @@ static int o2hb_issue_node_write(struct o2hb_region *reg, } atomic_inc(&write_wc->wc_num_reqs); - submit_bio(WRITE_SYNC, bio); + submit_bio(bio); status = 0; bail: diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index e5c3a45..5852c5a 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -439,7 +439,10 @@ xfs_submit_ioend( ioend->io_bio->bi_private = ioend; ioend->io_bio->bi_end_io = xfs_end_bio; - + if (wbc->sync_mode) + ioend->io_bio->bi_rw = WRITE_SYNC; + else + ioend->io_bio->bi_rw = WRITE; /* * If we are failing the IO now, just mark the ioend with an * error and finish it. This will run IO completion immediately @@ -452,8 +455,7 @@ xfs_submit_ioend( return status; } - submit_bio(wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE, - ioend->io_bio); + submit_bio(ioend->io_bio); return 0; } @@ -511,8 +513,11 @@ xfs_chain_bio( bio_chain(ioend->io_bio, new); bio_get(ioend->io_bio); /* for xfs_destroy_ioend */ - submit_bio(wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE, - ioend->io_bio); + if (wbc->sync_mode) + ioend->io_bio->bi_rw = WRITE_SYNC; + else + ioend->io_bio->bi_rw = WRITE; + submit_bio(ioend->io_bio); ioend->io_bio = new; } diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 9a2191b..079bb77 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1170,7 +1170,7 @@ next_chunk: bio->bi_iter.bi_sector = sector; bio->bi_end_io = xfs_buf_bio_end_io; bio->bi_private = bp; - + bio->bi_rw = rw; for (; size && nr_pages; nr_pages--, page_index++) { int rbytes, nbytes = PAGE_SIZE - offset; @@ -1194,7 +1194,7 @@ next_chunk: flush_kernel_vmap_range(bp->b_addr, xfs_buf_vmap_len(bp)); } - submit_bio(rw, bio); + submit_bio(bio); if (size) goto next_chunk; } else { diff --git a/include/linux/bio.h b/include/linux/bio.h index 6b7481f..4724810 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -473,7 +473,7 @@ static inline void bio_io_error(struct bio *bio) struct request_queue; extern int bio_phys_segments(struct request_queue *, struct bio *); -extern int submit_bio_wait(int rw, struct bio *bio); +extern int submit_bio_wait(struct bio *bio); extern void bio_advance(struct bio *, unsigned); extern void bio_init(struct bio *); diff --git a/include/linux/fs.h b/include/linux/fs.h index e3c0b7e..69bdd03 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2704,7 +2704,7 @@ static inline void remove_inode_hash(struct inode *inode) extern void inode_sb_list_add(struct inode *inode); #ifdef CONFIG_BLOCK -extern blk_qc_t submit_bio(int, struct bio *); +extern blk_qc_t submit_bio(struct bio *); extern int bdev_read_only(struct block_device *); #endif extern int set_blocksize(struct block_device *, int); diff --git a/kernel/power/swap.c b/kernel/power/swap.c index 12cd989..4d050eb 100644 --- a/kernel/power/swap.c +++ b/kernel/power/swap.c @@ -260,6 +260,7 @@ static int hib_submit_io(int rw, pgoff_t page_off, void *addr, bio = bio_alloc(__GFP_RECLAIM | __GFP_HIGH, 1); bio->bi_iter.bi_sector = page_off * (PAGE_SIZE >> 9); bio->bi_bdev = hib_resume_bdev; + bio->bi_rw = rw; if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) { printk(KERN_ERR "PM: Adding page to bio failed at %llu\n", @@ -272,9 +273,9 @@ static int hib_submit_io(int rw, pgoff_t page_off, void *addr, bio->bi_end_io = hib_end_io; bio->bi_private = hb; atomic_inc(&hb->count); - submit_bio(rw, bio); + submit_bio(bio); } else { - error = submit_bio_wait(rw, bio); + error = submit_bio_wait(bio); bio_put(bio); } diff --git a/mm/page_io.c b/mm/page_io.c index 985f23c..85cc7e1 100644 --- a/mm/page_io.c +++ b/mm/page_io.c @@ -259,7 +259,7 @@ int __swap_writepage(struct page *page, struct writeback_control *wbc, bio_end_io_t end_write_func) { struct bio *bio; - int ret, rw = WRITE; + int ret; struct swap_info_struct *sis = page_swap_info(page); if (sis->flags & SWP_FILE) { @@ -317,12 +317,13 @@ int __swap_writepage(struct page *page, struct writeback_control *wbc, ret = -ENOMEM; goto out; } + bio->bi_rw = WRITE; if (wbc->sync_mode == WB_SYNC_ALL) - rw |= REQ_SYNC; + bio->bi_rw |= REQ_SYNC; count_vm_event(PSWPOUT); set_page_writeback(page); unlock_page(page); - submit_bio(rw, bio); + submit_bio(bio); out: return ret; } @@ -369,8 +370,9 @@ int swap_readpage(struct page *page) ret = -ENOMEM; goto out; } + bio->bi_rw = READ; count_vm_event(PSWPIN); - submit_bio(READ, bio); + submit_bio(bio); out: return ret; } -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:36:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 40BB37CBA for ; Wed, 13 Apr 2016 14:36:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C7EB5304053 for ; Wed, 13 Apr 2016 12:36:48 -0700 (PDT) X-ASG-Debug-ID: 1460576206-04bdf011044b31e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id yGMCiIw91JAQHjBu (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:36:46 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3CDA78111F; Wed, 13 Apr 2016 19:36:46 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU91018278; Wed, 13 Apr 2016 15:36:43 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 05/42] fs: have ll_rw_block users pass in op and flags separately Date: Wed, 13 Apr 2016 14:35:51 -0500 X-ASG-Orig-Subj: [PATCH 05/42] fs: have ll_rw_block users pass in op and flags separately Message-Id: <1460576188-5751-6-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576206 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This has ll_rw_block users pass in the operation and flags separately, so ll_rw_block can setup bio->bi_op and bio-bi_rw on the bio that is submitted. v2: 1. Fix for kbuild error in ll_rw_block comments. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- fs/buffer.c | 19 ++++++++++--------- fs/ext4/inode.c | 6 +++--- fs/ext4/namei.c | 3 ++- fs/ext4/super.c | 2 +- fs/gfs2/bmap.c | 2 +- fs/gfs2/meta_io.c | 4 ++-- fs/gfs2/quota.c | 2 +- fs/isofs/compress.c | 2 +- fs/jbd2/journal.c | 2 +- fs/jbd2/recovery.c | 4 ++-- fs/ocfs2/aops.c | 2 +- fs/ocfs2/super.c | 2 +- fs/reiserfs/journal.c | 8 ++++---- fs/reiserfs/stree.c | 4 ++-- fs/reiserfs/super.c | 2 +- fs/squashfs/block.c | 4 ++-- fs/udf/dir.c | 2 +- fs/udf/directory.c | 2 +- fs/udf/inode.c | 2 +- fs/ufs/balloc.c | 2 +- include/linux/buffer_head.h | 2 +- 21 files changed, 40 insertions(+), 38 deletions(-) diff --git a/fs/buffer.c b/fs/buffer.c index 1e1a474..68c8f27 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -588,7 +588,7 @@ void write_boundary_block(struct block_device *bdev, struct buffer_head *bh = __find_get_block(bdev, bblock + 1, blocksize); if (bh) { if (buffer_dirty(bh)) - ll_rw_block(WRITE, 1, &bh); + ll_rw_block(REQ_OP_WRITE, 0, 1, &bh); put_bh(bh); } } @@ -1395,7 +1395,7 @@ void __breadahead(struct block_device *bdev, sector_t block, unsigned size) { struct buffer_head *bh = __getblk(bdev, block, size); if (likely(bh)) { - ll_rw_block(READA, 1, &bh); + ll_rw_block(REQ_OP_READ, READA, 1, &bh); brelse(bh); } } @@ -1955,7 +1955,7 @@ int __block_write_begin(struct page *page, loff_t pos, unsigned len, if (!buffer_uptodate(bh) && !buffer_delay(bh) && !buffer_unwritten(bh) && (block_start < from || block_end > to)) { - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); *wait_bh++=bh; } } @@ -2852,7 +2852,7 @@ int block_truncate_page(struct address_space *mapping, if (!buffer_uptodate(bh) && !buffer_delay(bh) && !buffer_unwritten(bh)) { err = -EIO; - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); wait_on_buffer(bh); /* Uhhuh. Read error. Complain and punt. */ if (!buffer_uptodate(bh)) @@ -3052,7 +3052,8 @@ EXPORT_SYMBOL(submit_bh); /** * ll_rw_block: low-level access to block devices (DEPRECATED) - * @rw: whether to %READ or %WRITE or maybe %READA (readahead) + * @op: whether to %READ or %WRITE + * @op_flags: rq_flag_bits or %READA (readahead) * @nr: number of &struct buffer_heads in the array * @bhs: array of pointers to &struct buffer_head * @@ -3075,7 +3076,7 @@ EXPORT_SYMBOL(submit_bh); * All of the buffers must be for the same device, and must also be a * multiple of the current approved size for the device. */ -void ll_rw_block(int rw, int nr, struct buffer_head *bhs[]) +void ll_rw_block(int op, int op_flags, int nr, struct buffer_head *bhs[]) { int i; @@ -3084,18 +3085,18 @@ void ll_rw_block(int rw, int nr, struct buffer_head *bhs[]) if (!trylock_buffer(bh)) continue; - if (rw == WRITE) { + if (op == WRITE) { if (test_clear_buffer_dirty(bh)) { bh->b_end_io = end_buffer_write_sync; get_bh(bh); - submit_bh(rw, 0, bh); + submit_bh(op, op_flags, bh); continue; } } else { if (!buffer_uptodate(bh)) { bh->b_end_io = end_buffer_read_sync; get_bh(bh); - submit_bh(rw, 0, bh); + submit_bh(op, op_flags, bh); continue; } } diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index d15d92e..fe96d2e 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -963,7 +963,7 @@ struct buffer_head *ext4_bread(handle_t *handle, struct inode *inode, return bh; if (!bh || buffer_uptodate(bh)) return bh; - ll_rw_block(READ | REQ_META | REQ_PRIO, 1, &bh); + ll_rw_block(REQ_OP_READ, REQ_META | REQ_PRIO, 1, &bh); wait_on_buffer(bh); if (buffer_uptodate(bh)) return bh; @@ -1117,7 +1117,7 @@ static int ext4_block_write_begin(struct page *page, loff_t pos, unsigned len, if (!buffer_uptodate(bh) && !buffer_delay(bh) && !buffer_unwritten(bh) && (block_start < from || block_end > to)) { - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); *wait_bh++ = bh; decrypt = ext4_encrypted_inode(inode) && S_ISREG(inode->i_mode); @@ -3603,7 +3603,7 @@ static int __ext4_block_zero_page_range(handle_t *handle, if (!buffer_uptodate(bh)) { err = -EIO; - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); wait_on_buffer(bh); /* Uhhuh. Read error. Complain and punt. */ if (!buffer_uptodate(bh)) diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 9cab638..c3cc775 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c @@ -1447,7 +1447,8 @@ restart: } bh_use[ra_max] = bh; if (bh) - ll_rw_block(READ | REQ_META | REQ_PRIO, + ll_rw_block(REQ_OP_READ, + REQ_META | REQ_PRIO, 1, &bh); } } diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 80ee248..1a3e586 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -4281,7 +4281,7 @@ static journal_t *ext4_get_dev_journal(struct super_block *sb, goto out_bdev; } journal->j_private = sb; - ll_rw_block(READ | REQ_META | REQ_PRIO, 1, &journal->j_sb_buffer); + ll_rw_block(REQ_OP_READ, REQ_META | REQ_PRIO, 1, &journal->j_sb_buffer); wait_on_buffer(journal->j_sb_buffer); if (!buffer_uptodate(journal->j_sb_buffer)) { ext4_msg(sb, KERN_ERR, "I/O error on journal device"); diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c index 06d79aa..fd6389c 100644 --- a/fs/gfs2/bmap.c +++ b/fs/gfs2/bmap.c @@ -974,7 +974,7 @@ static int gfs2_block_truncate_page(struct address_space *mapping, loff_t from) if (!buffer_uptodate(bh)) { err = -EIO; - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); wait_on_buffer(bh); /* Uhhuh. Read error. Complain and punt. */ if (!buffer_uptodate(bh)) diff --git a/fs/gfs2/meta_io.c b/fs/gfs2/meta_io.c index 3c63087..f56f3ca 100644 --- a/fs/gfs2/meta_io.c +++ b/fs/gfs2/meta_io.c @@ -448,7 +448,7 @@ struct buffer_head *gfs2_meta_ra(struct gfs2_glock *gl, u64 dblock, u32 extlen) if (buffer_uptodate(first_bh)) goto out; if (!buffer_locked(first_bh)) - ll_rw_block(READ_SYNC | REQ_META, 1, &first_bh); + ll_rw_block(REQ_OP_READ, READ_SYNC | REQ_META, 1, &first_bh); dblock++; extlen--; @@ -457,7 +457,7 @@ struct buffer_head *gfs2_meta_ra(struct gfs2_glock *gl, u64 dblock, u32 extlen) bh = gfs2_getbuf(gl, dblock, CREATE); if (!buffer_uptodate(bh) && !buffer_locked(bh)) - ll_rw_block(READA | REQ_META, 1, &bh); + ll_rw_block(REQ_OP_READ, READA | REQ_META, 1, &bh); brelse(bh); dblock++; extlen--; diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index ce7d69a..62a6823 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c @@ -730,7 +730,7 @@ static int gfs2_write_buf_to_page(struct gfs2_inode *ip, unsigned long index, if (PageUptodate(page)) set_buffer_uptodate(bh); if (!buffer_uptodate(bh)) { - ll_rw_block(READ | REQ_META, 1, &bh); + ll_rw_block(REQ_OP_READ, REQ_META, 1, &bh); wait_on_buffer(bh); if (!buffer_uptodate(bh)) goto unlock_out; diff --git a/fs/isofs/compress.c b/fs/isofs/compress.c index 2e4e834..2ce5b75 100644 --- a/fs/isofs/compress.c +++ b/fs/isofs/compress.c @@ -81,7 +81,7 @@ static loff_t zisofs_uncompress_block(struct inode *inode, loff_t block_start, blocknum = block_start >> bufshift; memset(bhs, 0, (needblocks + 1) * sizeof(struct buffer_head *)); haveblocks = isofs_get_blocks(inode, blocknum, bhs, needblocks); - ll_rw_block(READ, haveblocks, bhs); + ll_rw_block(REQ_OP_READ, 0, haveblocks, bhs); curbh = 0; curpage = 0; diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index 6d7e33a..3675b8e 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c @@ -1497,7 +1497,7 @@ static int journal_get_superblock(journal_t *journal) J_ASSERT(bh != NULL); if (!buffer_uptodate(bh)) { - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); wait_on_buffer(bh); if (!buffer_uptodate(bh)) { printk(KERN_ERR diff --git a/fs/jbd2/recovery.c b/fs/jbd2/recovery.c index 08a456b..6daf0c9 100644 --- a/fs/jbd2/recovery.c +++ b/fs/jbd2/recovery.c @@ -104,7 +104,7 @@ static int do_readahead(journal_t *journal, unsigned int start) if (!buffer_uptodate(bh) && !buffer_locked(bh)) { bufs[nbufs++] = bh; if (nbufs == MAXBUF) { - ll_rw_block(READ, nbufs, bufs); + ll_rw_block(REQ_OP_READ, 0, nbufs, bufs); journal_brelse_array(bufs, nbufs); nbufs = 0; } @@ -113,7 +113,7 @@ static int do_readahead(journal_t *journal, unsigned int start) } if (nbufs) - ll_rw_block(READ, nbufs, bufs); + ll_rw_block(REQ_OP_READ, 0, nbufs, bufs); err = 0; failed: diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index ad15773..8f0c138 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c @@ -640,7 +640,7 @@ int ocfs2_map_page_blocks(struct page *page, u64 *p_blkno, !buffer_new(bh) && ocfs2_should_read_blk(inode, page, block_start) && (block_start < from || block_end > to)) { - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); *wait_bh++=bh; } diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index d7cae33..3971146 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c @@ -1819,7 +1819,7 @@ static int ocfs2_get_sector(struct super_block *sb, if (!buffer_dirty(*bh)) clear_buffer_uptodate(*bh); unlock_buffer(*bh); - ll_rw_block(READ, 1, bh); + ll_rw_block(REQ_OP_READ, 0, 1, bh); wait_on_buffer(*bh); if (!buffer_uptodate(*bh)) { mlog_errno(-EIO); diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c index 6945e71..bc2dde2 100644 --- a/fs/reiserfs/journal.c +++ b/fs/reiserfs/journal.c @@ -870,7 +870,7 @@ loop_next: */ if (buffer_dirty(bh) && unlikely(bh->b_page->mapping == NULL)) { spin_unlock(lock); - ll_rw_block(WRITE, 1, &bh); + ll_rw_block(REQ_OP_WRITE, 0, 1, &bh); spin_lock(lock); } put_bh(bh); @@ -1057,7 +1057,7 @@ static int flush_commit_list(struct super_block *s, if (tbh) { if (buffer_dirty(tbh)) { depth = reiserfs_write_unlock_nested(s); - ll_rw_block(WRITE, 1, &tbh); + ll_rw_block(REQ_OP_WRITE, 0, 1, &tbh); reiserfs_write_lock_nested(s, depth); } put_bh(tbh) ; @@ -2244,7 +2244,7 @@ abort_replay: } } /* read in the log blocks, memcpy to the corresponding real block */ - ll_rw_block(READ, get_desc_trans_len(desc), log_blocks); + ll_rw_block(REQ_OP_READ, 0, get_desc_trans_len(desc), log_blocks); for (i = 0; i < get_desc_trans_len(desc); i++) { wait_on_buffer(log_blocks[i]); @@ -2346,7 +2346,7 @@ static struct buffer_head *reiserfs_breada(struct block_device *dev, } else bhlist[j++] = bh; } - ll_rw_block(READ, j, bhlist); + ll_rw_block(REQ_OP_READ, 0, j, bhlist); for (i = 1; i < j; i++) brelse(bhlist[i]); bh = bhlist[0]; diff --git a/fs/reiserfs/stree.c b/fs/reiserfs/stree.c index 5feacd6..64b29b5 100644 --- a/fs/reiserfs/stree.c +++ b/fs/reiserfs/stree.c @@ -551,7 +551,7 @@ static int search_by_key_reada(struct super_block *s, if (!buffer_uptodate(bh[j])) { if (depth == -1) depth = reiserfs_write_unlock_nested(s); - ll_rw_block(READA, 1, bh + j); + ll_rw_block(REQ_OP_READ, READA, 1, bh + j); } brelse(bh[j]); } @@ -660,7 +660,7 @@ int search_by_key(struct super_block *sb, const struct cpu_key *key, if (!buffer_uptodate(bh) && depth == -1) depth = reiserfs_write_unlock_nested(sb); - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); wait_on_buffer(bh); if (depth != -1) diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index b8f2d1e..9938a51 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c @@ -1661,7 +1661,7 @@ static int read_super_block(struct super_block *s, int offset) /* after journal replay, reread all bitmap and super blocks */ static int reread_meta_blocks(struct super_block *s) { - ll_rw_block(READ, 1, &SB_BUFFER_WITH_SB(s)); + ll_rw_block(REQ_OP_READ, 0, 1, &SB_BUFFER_WITH_SB(s)); wait_on_buffer(SB_BUFFER_WITH_SB(s)); if (!buffer_uptodate(SB_BUFFER_WITH_SB(s))) { reiserfs_warning(s, "reiserfs-2504", "error reading the super"); diff --git a/fs/squashfs/block.c b/fs/squashfs/block.c index 2c26184..ce62a38 100644 --- a/fs/squashfs/block.c +++ b/fs/squashfs/block.c @@ -124,7 +124,7 @@ int squashfs_read_data(struct super_block *sb, u64 index, int length, goto block_release; bytes += msblk->devblksize; } - ll_rw_block(READ, b, bh); + ll_rw_block(REQ_OP_READ, 0, b, bh); } else { /* * Metadata block. @@ -156,7 +156,7 @@ int squashfs_read_data(struct super_block *sb, u64 index, int length, goto block_release; bytes += msblk->devblksize; } - ll_rw_block(READ, b - 1, bh + 1); + ll_rw_block(REQ_OP_READ, 0, b - 1, bh + 1); } for (i = 0; i < b; i++) { diff --git a/fs/udf/dir.c b/fs/udf/dir.c index b51b371..cfadce0 100644 --- a/fs/udf/dir.c +++ b/fs/udf/dir.c @@ -113,7 +113,7 @@ static int udf_readdir(struct file *file, struct dir_context *ctx) brelse(tmp); } if (num) { - ll_rw_block(READA, num, bha); + ll_rw_block(REQ_OP_READ, READA, num, bha); for (i = 0; i < num; i++) brelse(bha[i]); } diff --git a/fs/udf/directory.c b/fs/udf/directory.c index c763fda..71f3e0b 100644 --- a/fs/udf/directory.c +++ b/fs/udf/directory.c @@ -87,7 +87,7 @@ struct fileIdentDesc *udf_fileident_read(struct inode *dir, loff_t *nf_pos, brelse(tmp); } if (num) { - ll_rw_block(READA, num, bha); + ll_rw_block(REQ_OP_READ, READA, num, bha); for (i = 0; i < num; i++) brelse(bha[i]); } diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 2dc461e..a401bdbe 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c @@ -1200,7 +1200,7 @@ struct buffer_head *udf_bread(struct inode *inode, int block, if (buffer_uptodate(bh)) return bh; - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); wait_on_buffer(bh); if (buffer_uptodate(bh)) diff --git a/fs/ufs/balloc.c b/fs/ufs/balloc.c index 0447b94..67e085d 100644 --- a/fs/ufs/balloc.c +++ b/fs/ufs/balloc.c @@ -292,7 +292,7 @@ static void ufs_change_blocknr(struct inode *inode, sector_t beg, if (!buffer_mapped(bh)) map_bh(bh, inode->i_sb, oldb + pos); if (!buffer_uptodate(bh)) { - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); wait_on_buffer(bh); if (!buffer_uptodate(bh)) { ufs_error(inode->i_sb, __func__, diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index bc9a45d..d1dd293 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h @@ -187,7 +187,7 @@ struct buffer_head *alloc_buffer_head(gfp_t gfp_flags); void free_buffer_head(struct buffer_head * bh); void unlock_buffer(struct buffer_head *bh); void __lock_buffer(struct buffer_head *bh); -void ll_rw_block(int, int, struct buffer_head * bh[]); +void ll_rw_block(int, int, int, struct buffer_head * bh[]); int sync_dirty_buffer(struct buffer_head *bh); int __sync_dirty_buffer(struct buffer_head *bh, int op_flags); void write_dirty_buffer(struct buffer_head *bh, int op_flags); -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:36:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 92A297CD9 for ; Wed, 13 Apr 2016 14:36:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id F17F4AC005 for ; Wed, 13 Apr 2016 12:36:50 -0700 (PDT) X-ASG-Debug-ID: 1460576208-04cbb02e1a1a0910001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id WsjMxkz6KECA3Qr5 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:36:49 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 99FA37F09A; Wed, 13 Apr 2016 19:36:48 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU92018278; Wed, 13 Apr 2016 15:36:46 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 06/42] direct-io: set bi_op to REQ_OP Date: Wed, 13 Apr 2016 14:35:52 -0500 X-ASG-Orig-Subj: [PATCH 06/42] direct-io: set bi_op to REQ_OP Message-Id: <1460576188-5751-7-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576209 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has the dio code set the bio bi_op to a REQ_OP and bio op_flags to rq_flag_bits. It also begins to convert btrfs's dio_submit_t because of the dio submit_io callout use. In the btrfs_submit_direct change, I OR'd the op and flag back together. It is only temporary. The next patched will completely convert all the btrfs code paths. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- fs/btrfs/inode.c | 9 +++++---- fs/direct-io.c | 35 +++++++++++++++++++++-------------- include/linux/fs.h | 2 +- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 9cc2256..d999fdf 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -8401,14 +8401,14 @@ out_err: return 0; } -static void btrfs_submit_direct(int rw, struct bio *dio_bio, - struct inode *inode, loff_t file_offset) +static void btrfs_submit_direct(struct bio *dio_bio, struct inode *inode, + loff_t file_offset) { struct btrfs_dio_private *dip = NULL; struct bio *io_bio = NULL; struct btrfs_io_bio *btrfs_bio; int skip_sum; - int write = rw & REQ_WRITE; + bool write = (dio_bio->bi_op == REQ_OP_WRITE); int ret = 0; skip_sum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM; @@ -8459,7 +8459,8 @@ static void btrfs_submit_direct(int rw, struct bio *dio_bio, dio_data->unsubmitted_oe_range_end; } - ret = btrfs_submit_direct_hook(rw, dip, skip_sum); + ret = btrfs_submit_direct_hook(dio_bio->bi_op | dio_bio->bi_rw, dip, + skip_sum); if (!ret) return; diff --git a/fs/direct-io.c b/fs/direct-io.c index 1890ad2..64bfab0 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -108,7 +108,8 @@ struct dio_submit { /* dio_state communicated between submission path and end_io */ struct dio { int flags; /* doesn't change */ - int rw; + int op; + int op_flags; blk_qc_t bio_cookie; struct block_device *bio_bdev; struct inode *inode; @@ -163,7 +164,7 @@ static inline int dio_refill_pages(struct dio *dio, struct dio_submit *sdio) ret = iov_iter_get_pages(sdio->iter, dio->pages, LONG_MAX, DIO_PAGES, &sdio->from); - if (ret < 0 && sdio->blocks_available && (dio->rw & WRITE)) { + if (ret < 0 && sdio->blocks_available && (dio->op == REQ_OP_WRITE)) { struct page *page = ZERO_PAGE(0); /* * A memory fault, but the filesystem has some outstanding @@ -242,7 +243,8 @@ static ssize_t dio_complete(struct dio *dio, loff_t offset, ssize_t ret, transferred = dio->result; /* Check for short read case */ - if ((dio->rw == READ) && ((offset + transferred) > dio->i_size)) + if ((dio->op == REQ_OP_READ) && + ((offset + transferred) > dio->i_size)) transferred = dio->i_size - offset; } @@ -265,7 +267,7 @@ static ssize_t dio_complete(struct dio *dio, loff_t offset, ssize_t ret, inode_dio_end(dio->inode); if (is_async) { - if (dio->rw & WRITE) { + if (dio->op == REQ_OP_WRITE) { int err; err = generic_write_sync(dio->iocb->ki_filp, offset, @@ -374,7 +376,8 @@ dio_bio_alloc(struct dio *dio, struct dio_submit *sdio, bio->bi_bdev = bdev; bio->bi_iter.bi_sector = first_sector; - bio->bi_rw = dio->rw; + bio->bi_op = dio->op; + bio->bi_rw = dio->op_flags; if (dio->is_async) bio->bi_end_io = dio_bio_end_aio; else @@ -402,14 +405,13 @@ static inline void dio_bio_submit(struct dio *dio, struct dio_submit *sdio) dio->refcount++; spin_unlock_irqrestore(&dio->bio_lock, flags); - if (dio->is_async && dio->rw == READ && dio->should_dirty) + if (dio->is_async && dio->op == REQ_OP_READ && dio->should_dirty) bio_set_pages_dirty(bio); dio->bio_bdev = bio->bi_bdev; if (sdio->submit_io) { - sdio->submit_io(dio->rw, bio, dio->inode, - sdio->logical_offset_in_bio); + sdio->submit_io(bio, dio->inode, sdio->logical_offset_in_bio); dio->bio_cookie = BLK_QC_T_NONE; } else dio->bio_cookie = submit_bio(bio); @@ -478,14 +480,14 @@ static int dio_bio_complete(struct dio *dio, struct bio *bio) if (bio->bi_error) dio->io_error = -EIO; - if (dio->is_async && dio->rw == READ && dio->should_dirty) { + if (dio->is_async && dio->op == REQ_OP_READ && dio->should_dirty) { err = bio->bi_error; bio_check_pages_dirty(bio); /* transfers ownership */ } else { bio_for_each_segment_all(bvec, bio, i) { struct page *page = bvec->bv_page; - if (dio->rw == READ && !PageCompound(page) && + if (dio->op == REQ_OP_READ && !PageCompound(page) && dio->should_dirty) set_page_dirty_lock(page); put_page(page); @@ -638,7 +640,7 @@ static int get_more_blocks(struct dio *dio, struct dio_submit *sdio, * which may decide to handle it or also return an unmapped * buffer head. */ - create = dio->rw & WRITE; + create = dio->op == REQ_OP_WRITE; if (dio->flags & DIO_SKIP_HOLES) { if (sdio->block_in_file < (i_size_read(dio->inode) >> sdio->blkbits)) @@ -788,7 +790,7 @@ submit_page_section(struct dio *dio, struct dio_submit *sdio, struct page *page, { int ret = 0; - if (dio->rw & WRITE) { + if (dio->op == REQ_OP_WRITE) { /* * Read accounting is performed in submit_bio() */ @@ -988,7 +990,7 @@ do_holes: loff_t i_size_aligned; /* AKPM: eargh, -ENOTBLK is a hack */ - if (dio->rw & WRITE) { + if (dio->op == REQ_OP_WRITE) { put_page(page); return -ENOTBLK; } @@ -1201,7 +1203,12 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, dio->is_async = true; dio->inode = inode; - dio->rw = iov_iter_rw(iter) == WRITE ? WRITE_ODIRECT : READ; + if (iov_iter_rw(iter) == WRITE) { + dio->op = REQ_OP_WRITE; + dio->op_flags = WRITE_ODIRECT; + } else { + dio->op = REQ_OP_READ; + } /* * For AIO O_(D)SYNC writes we need to defer completions to a workqueue diff --git a/include/linux/fs.h b/include/linux/fs.h index 96ace0f..f3f2f66 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2792,7 +2792,7 @@ extern int generic_file_open(struct inode * inode, struct file * filp); extern int nonseekable_open(struct inode * inode, struct file * filp); #ifdef CONFIG_BLOCK -typedef void (dio_submit_t)(int rw, struct bio *bio, struct inode *inode, +typedef void (dio_submit_t)(struct bio *bio, struct inode *inode, loff_t file_offset); enum { -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:36:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 70FB27CCF for ; Wed, 13 Apr 2016 14:36:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A6F64AC005 for ; Wed, 13 Apr 2016 12:36:49 -0700 (PDT) X-ASG-Debug-ID: 1460576204-04cb6c24644b4f70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8goLP2585j47VINE (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:36:46 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id F05F9C05E17F; Wed, 13 Apr 2016 19:36:43 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU90018278; Wed, 13 Apr 2016 15:36:41 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 04/42] fs: have submit_bh users pass in op and flags separately Date: Wed, 13 Apr 2016 14:35:50 -0500 X-ASG-Orig-Subj: [PATCH 04/42] fs: have submit_bh users pass in op and flags separately Message-Id: <1460576188-5751-5-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576206 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This has submit_bh users pass in the operation and flags separately, so submit_bh_wbc can setup bio->bi_op and bio-bi_rw on the bio that is submitted. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- drivers/md/bitmap.c | 4 ++-- fs/btrfs/check-integrity.c | 24 ++++++++++---------- fs/btrfs/check-integrity.h | 2 +- fs/btrfs/disk-io.c | 4 ++-- fs/buffer.c | 54 +++++++++++++++++++++++---------------------- fs/ext4/balloc.c | 2 +- fs/ext4/ialloc.c | 2 +- fs/ext4/inode.c | 2 +- fs/ext4/mmp.c | 4 ++-- fs/fat/misc.c | 2 +- fs/gfs2/bmap.c | 2 +- fs/gfs2/dir.c | 2 +- fs/gfs2/meta_io.c | 6 ++--- fs/jbd2/commit.c | 6 ++--- fs/jbd2/journal.c | 8 +++---- fs/nilfs2/btnode.c | 6 ++--- fs/nilfs2/btnode.h | 2 +- fs/nilfs2/btree.c | 6 +++-- fs/nilfs2/gcinode.c | 5 +++-- fs/nilfs2/mdt.c | 11 ++++----- fs/ntfs/aops.c | 6 ++--- fs/ntfs/compress.c | 2 +- fs/ntfs/file.c | 2 +- fs/ntfs/logfile.c | 2 +- fs/ntfs/mft.c | 4 ++-- fs/ocfs2/buffer_head_io.c | 8 +++---- fs/reiserfs/inode.c | 4 ++-- fs/reiserfs/journal.c | 6 ++--- fs/ufs/util.c | 2 +- include/linux/buffer_head.h | 9 ++++---- 30 files changed, 103 insertions(+), 96 deletions(-) diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index 3fe86b5..8b2e16f 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c @@ -294,7 +294,7 @@ static void write_page(struct bitmap *bitmap, struct page *page, int wait) atomic_inc(&bitmap->pending_writes); set_buffer_locked(bh); set_buffer_mapped(bh); - submit_bh(WRITE | REQ_SYNC, bh); + submit_bh(REQ_OP_WRITE, REQ_SYNC, bh); bh = bh->b_this_page; } @@ -389,7 +389,7 @@ static int read_page(struct file *file, unsigned long index, atomic_inc(&bitmap->pending_writes); set_buffer_locked(bh); set_buffer_mapped(bh); - submit_bh(READ, bh); + submit_bh(REQ_OP_READ, 0, bh); } block++; bh = bh->b_this_page; diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index 9400acd..f82190f 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c @@ -2856,12 +2856,12 @@ static struct btrfsic_dev_state *btrfsic_dev_state_lookup( return ds; } -int btrfsic_submit_bh(int rw, struct buffer_head *bh) +int btrfsic_submit_bh(int op, int op_flags, struct buffer_head *bh) { struct btrfsic_dev_state *dev_state; if (!btrfsic_is_initialized) - return submit_bh(rw, bh); + return submit_bh(op, op_flags, bh); mutex_lock(&btrfsic_mutex); /* since btrfsic_submit_bh() might also be called before @@ -2870,26 +2870,26 @@ int btrfsic_submit_bh(int rw, struct buffer_head *bh) /* Only called to write the superblock (incl. FLUSH/FUA) */ if (NULL != dev_state && - (rw & WRITE) && bh->b_size > 0) { + (op == REQ_OP_WRITE) && bh->b_size > 0) { u64 dev_bytenr; dev_bytenr = 4096 * bh->b_blocknr; if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) printk(KERN_INFO - "submit_bh(rw=0x%x, blocknr=%llu (bytenr %llu)," - " size=%zu, data=%p, bdev=%p)\n", - rw, (unsigned long long)bh->b_blocknr, + "submit_bh(op=0x%x,0x%x, blocknr=%llu " + "(bytenr %llu), size=%zu, data=%p, bdev=%p)\n", + op, op_flags, (unsigned long long)bh->b_blocknr, dev_bytenr, bh->b_size, bh->b_data, bh->b_bdev); btrfsic_process_written_block(dev_state, dev_bytenr, &bh->b_data, 1, NULL, - NULL, bh, rw); - } else if (NULL != dev_state && (rw & REQ_FLUSH)) { + NULL, bh, op_flags); + } else if (NULL != dev_state && (op_flags & REQ_FLUSH)) { if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) printk(KERN_INFO - "submit_bh(rw=0x%x FLUSH, bdev=%p)\n", - rw, bh->b_bdev); + "submit_bh(op=0x%x,0x%x FLUSH, bdev=%p)\n", + op, op_flags, bh->b_bdev); if (!dev_state->dummy_block_for_bio_bh_flush.is_iodone) { if ((dev_state->state->print_mask & (BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH | @@ -2907,7 +2907,7 @@ int btrfsic_submit_bh(int rw, struct buffer_head *bh) block->never_written = 0; block->iodone_w_error = 0; block->flush_gen = dev_state->last_flush_gen + 1; - block->submit_bio_bh_rw = rw; + block->submit_bio_bh_rw = op_flags; block->orig_bio_bh_private = bh->b_private; block->orig_bio_bh_end_io.bh = bh->b_end_io; block->next_in_same_bio = NULL; @@ -2916,7 +2916,7 @@ int btrfsic_submit_bh(int rw, struct buffer_head *bh) } } mutex_unlock(&btrfsic_mutex); - return submit_bh(rw, bh); + return submit_bh(op, op_flags, bh); } static void __btrfsic_submit_bio(struct bio *bio) diff --git a/fs/btrfs/check-integrity.h b/fs/btrfs/check-integrity.h index c04e249..f78dff1 100644 --- a/fs/btrfs/check-integrity.h +++ b/fs/btrfs/check-integrity.h @@ -20,7 +20,7 @@ #define __BTRFS_CHECK_INTEGRITY__ #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY -int btrfsic_submit_bh(int rw, struct buffer_head *bh); +int btrfsic_submit_bh(int op, int op_flags, struct buffer_head *bh); void btrfsic_submit_bio(struct bio *bio); int btrfsic_submit_bio_wait(struct bio *bio); #else diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 0bd25e4..9a13c85 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -3410,9 +3410,9 @@ static int write_dev_supers(struct btrfs_device *device, * to go down lazy. */ if (i == 0) - ret = btrfsic_submit_bh(WRITE_FUA, bh); + ret = btrfsic_submit_bh(REQ_OP_WRITE, WRITE_FUA, bh); else - ret = btrfsic_submit_bh(WRITE_SYNC, bh); + ret = btrfsic_submit_bh(REQ_OP_WRITE, WRITE_SYNC, bh); if (ret) errors++; } diff --git a/fs/buffer.c b/fs/buffer.c index 7ed7869..1e1a474 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -45,7 +45,7 @@ #include static int fsync_buffers_list(spinlock_t *lock, struct list_head *list); -static int submit_bh_wbc(int rw, struct buffer_head *bh, +static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh, unsigned long bio_flags, struct writeback_control *wbc); @@ -1225,7 +1225,7 @@ static struct buffer_head *__bread_slow(struct buffer_head *bh) } else { get_bh(bh); bh->b_end_io = end_buffer_read_sync; - submit_bh(READ, bh); + submit_bh(REQ_OP_READ, 0, bh); wait_on_buffer(bh); if (buffer_uptodate(bh)) return bh; @@ -1697,7 +1697,7 @@ static int __block_write_full_page(struct inode *inode, struct page *page, struct buffer_head *bh, *head; unsigned int blocksize, bbits; int nr_underway = 0; - int write_op = (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE); + int write_flags = (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : 0); head = create_page_buffers(page, inode, (1 << BH_Dirty)|(1 << BH_Uptodate)); @@ -1786,7 +1786,7 @@ static int __block_write_full_page(struct inode *inode, struct page *page, do { struct buffer_head *next = bh->b_this_page; if (buffer_async_write(bh)) { - submit_bh_wbc(write_op, bh, 0, wbc); + submit_bh_wbc(REQ_OP_WRITE, write_flags, bh, 0, wbc); nr_underway++; } bh = next; @@ -1840,7 +1840,7 @@ recover: struct buffer_head *next = bh->b_this_page; if (buffer_async_write(bh)) { clear_buffer_dirty(bh); - submit_bh_wbc(write_op, bh, 0, wbc); + submit_bh_wbc(REQ_OP_WRITE, write_flags, bh, 0, wbc); nr_underway++; } bh = next; @@ -2248,7 +2248,7 @@ int block_read_full_page(struct page *page, get_block_t *get_block) if (buffer_uptodate(bh)) end_buffer_async_read(bh, 1); else - submit_bh(READ, bh); + submit_bh(REQ_OP_READ, 0, bh); } return 0; } @@ -2582,7 +2582,7 @@ int nobh_write_begin(struct address_space *mapping, if (block_start < from || block_end > to) { lock_buffer(bh); bh->b_end_io = end_buffer_read_nobh; - submit_bh(READ, bh); + submit_bh(REQ_OP_READ, 0, bh); nr_reads++; } } @@ -2949,7 +2949,7 @@ static void end_bio_bh_io_sync(struct bio *bio) * errors, this only handles the "we need to be able to * do IO at the final sector" case. */ -void guard_bio_eod(int rw, struct bio *bio) +void guard_bio_eod(int op, struct bio *bio) { sector_t maxsector; struct bio_vec *bvec = &bio->bi_io_vec[bio->bi_vcnt - 1]; @@ -2979,13 +2979,13 @@ void guard_bio_eod(int rw, struct bio *bio) bvec->bv_len -= truncated_bytes; /* ..and clear the end of the buffer for reads */ - if ((rw & RW_MASK) == READ) { + if (op == REQ_OP_READ) { zero_user(bvec->bv_page, bvec->bv_offset + bvec->bv_len, truncated_bytes); } } -static int submit_bh_wbc(int rw, struct buffer_head *bh, +static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh, unsigned long bio_flags, struct writeback_control *wbc) { struct bio *bio; @@ -2999,7 +2999,7 @@ static int submit_bh_wbc(int rw, struct buffer_head *bh, /* * Only clear out a write error when rewriting */ - if (test_set_buffer_req(bh) && (rw & WRITE)) + if (test_set_buffer_req(bh) && (op == REQ_OP_WRITE)) clear_buffer_write_io_error(bh); /* @@ -3022,29 +3022,31 @@ static int submit_bh_wbc(int rw, struct buffer_head *bh, bio->bi_end_io = end_bio_bh_io_sync; bio->bi_private = bh; bio->bi_flags |= bio_flags; + bio->bi_op = op; /* Take care of bh's that straddle the end of the device */ - guard_bio_eod(rw, bio); + guard_bio_eod(op, bio); if (buffer_meta(bh)) - rw |= REQ_META; + op_flags |= REQ_META; if (buffer_prio(bh)) - rw |= REQ_PRIO; - bio->bi_rw = rw; + op_flags |= REQ_PRIO; + bio->bi_rw = op_flags; submit_bio(bio); return 0; } -int _submit_bh(int rw, struct buffer_head *bh, unsigned long bio_flags) +int _submit_bh(int op, int op_flags, struct buffer_head *bh, + unsigned long bio_flags) { - return submit_bh_wbc(rw, bh, bio_flags, NULL); + return submit_bh_wbc(op, op_flags, bh, bio_flags, NULL); } EXPORT_SYMBOL_GPL(_submit_bh); -int submit_bh(int rw, struct buffer_head *bh) +int submit_bh(int op, int op_flags, struct buffer_head *bh) { - return submit_bh_wbc(rw, bh, 0, NULL); + return submit_bh_wbc(op, op_flags, bh, 0, NULL); } EXPORT_SYMBOL(submit_bh); @@ -3086,14 +3088,14 @@ void ll_rw_block(int rw, int nr, struct buffer_head *bhs[]) if (test_clear_buffer_dirty(bh)) { bh->b_end_io = end_buffer_write_sync; get_bh(bh); - submit_bh(WRITE, bh); + submit_bh(rw, 0, bh); continue; } } else { if (!buffer_uptodate(bh)) { bh->b_end_io = end_buffer_read_sync; get_bh(bh); - submit_bh(rw, bh); + submit_bh(rw, 0, bh); continue; } } @@ -3102,7 +3104,7 @@ void ll_rw_block(int rw, int nr, struct buffer_head *bhs[]) } EXPORT_SYMBOL(ll_rw_block); -void write_dirty_buffer(struct buffer_head *bh, int rw) +void write_dirty_buffer(struct buffer_head *bh, int op_flags) { lock_buffer(bh); if (!test_clear_buffer_dirty(bh)) { @@ -3111,7 +3113,7 @@ void write_dirty_buffer(struct buffer_head *bh, int rw) } bh->b_end_io = end_buffer_write_sync; get_bh(bh); - submit_bh(rw, bh); + submit_bh(REQ_OP_WRITE, op_flags, bh); } EXPORT_SYMBOL(write_dirty_buffer); @@ -3120,7 +3122,7 @@ EXPORT_SYMBOL(write_dirty_buffer); * and then start new I/O and then wait upon it. The caller must have a ref on * the buffer_head. */ -int __sync_dirty_buffer(struct buffer_head *bh, int rw) +int __sync_dirty_buffer(struct buffer_head *bh, int op_flags) { int ret = 0; @@ -3129,7 +3131,7 @@ int __sync_dirty_buffer(struct buffer_head *bh, int rw) if (test_clear_buffer_dirty(bh)) { get_bh(bh); bh->b_end_io = end_buffer_write_sync; - ret = submit_bh(rw, bh); + ret = submit_bh(REQ_OP_WRITE, op_flags, bh); wait_on_buffer(bh); if (!ret && !buffer_uptodate(bh)) ret = -EIO; @@ -3392,7 +3394,7 @@ int bh_submit_read(struct buffer_head *bh) get_bh(bh); bh->b_end_io = end_buffer_read_sync; - submit_bh(READ, bh); + submit_bh(REQ_OP_READ, 0, bh); wait_on_buffer(bh); if (buffer_uptodate(bh)) return 0; diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c index fe1f50f..d06823b 100644 --- a/fs/ext4/balloc.c +++ b/fs/ext4/balloc.c @@ -470,7 +470,7 @@ ext4_read_block_bitmap_nowait(struct super_block *sb, ext4_group_t block_group) trace_ext4_read_block_bitmap_load(sb, block_group); bh->b_end_io = ext4_end_bitmap_read; get_bh(bh); - submit_bh(READ | REQ_META | REQ_PRIO, bh); + submit_bh(REQ_OP_READ, REQ_META | REQ_PRIO, bh); return bh; verify: err = ext4_validate_block_bitmap(sb, desc, block_group, bh); diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index 69bb343..337ad70 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c @@ -214,7 +214,7 @@ ext4_read_inode_bitmap(struct super_block *sb, ext4_group_t block_group) trace_ext4_load_inode_bitmap(sb, block_group); bh->b_end_io = ext4_end_bitmap_read; get_bh(bh); - submit_bh(READ | REQ_META | REQ_PRIO, bh); + submit_bh(REQ_OP_READ, REQ_META | REQ_PRIO, bh); wait_on_buffer(bh); if (!buffer_uptodate(bh)) { put_bh(bh); diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 8f44605..d15d92e 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -4186,7 +4186,7 @@ make_io: trace_ext4_load_inode(inode); get_bh(bh); bh->b_end_io = end_buffer_read_sync; - submit_bh(READ | REQ_META | REQ_PRIO, bh); + submit_bh(REQ_OP_READ, REQ_META | REQ_PRIO, bh); wait_on_buffer(bh); if (!buffer_uptodate(bh)) { EXT4_ERROR_INODE_BLOCK(inode, block, diff --git a/fs/ext4/mmp.c b/fs/ext4/mmp.c index 2444527..cef1db4 100644 --- a/fs/ext4/mmp.c +++ b/fs/ext4/mmp.c @@ -52,7 +52,7 @@ static int write_mmp_block(struct super_block *sb, struct buffer_head *bh) lock_buffer(bh); bh->b_end_io = end_buffer_write_sync; get_bh(bh); - submit_bh(WRITE_SYNC | REQ_META | REQ_PRIO, bh); + submit_bh(REQ_OP_WRITE, WRITE_SYNC | REQ_META | REQ_PRIO, bh); wait_on_buffer(bh); sb_end_write(sb); if (unlikely(!buffer_uptodate(bh))) @@ -88,7 +88,7 @@ static int read_mmp_block(struct super_block *sb, struct buffer_head **bh, get_bh(*bh); lock_buffer(*bh); (*bh)->b_end_io = end_buffer_read_sync; - submit_bh(READ_SYNC | REQ_META | REQ_PRIO, *bh); + submit_bh(REQ_OP_READ, READ_SYNC | REQ_META | REQ_PRIO, *bh); wait_on_buffer(*bh); if (!buffer_uptodate(*bh)) { ret = -EIO; diff --git a/fs/fat/misc.c b/fs/fat/misc.c index c4589e9..8a86981 100644 --- a/fs/fat/misc.c +++ b/fs/fat/misc.c @@ -267,7 +267,7 @@ int fat_sync_bhs(struct buffer_head **bhs, int nr_bhs) int i, err = 0; for (i = 0; i < nr_bhs; i++) - write_dirty_buffer(bhs[i], WRITE); + write_dirty_buffer(bhs[i], 0); for (i = 0; i < nr_bhs; i++) { wait_on_buffer(bhs[i]); diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c index 24ce1cd..06d79aa 100644 --- a/fs/gfs2/bmap.c +++ b/fs/gfs2/bmap.c @@ -285,7 +285,7 @@ static void gfs2_metapath_ra(struct gfs2_glock *gl, if (trylock_buffer(rabh)) { if (!buffer_uptodate(rabh)) { rabh->b_end_io = end_buffer_read_sync; - submit_bh(READA | REQ_META, rabh); + submit_bh(REQ_OP_READ, READA | REQ_META, rabh); continue; } unlock_buffer(rabh); diff --git a/fs/gfs2/dir.c b/fs/gfs2/dir.c index 4a01f30..97a7d47 100644 --- a/fs/gfs2/dir.c +++ b/fs/gfs2/dir.c @@ -1510,7 +1510,7 @@ static void gfs2_dir_readahead(struct inode *inode, unsigned hsize, u32 index, continue; } bh->b_end_io = end_buffer_read_sync; - submit_bh(READA | REQ_META, bh); + submit_bh(REQ_OP_READ, READA | REQ_META, bh); continue; } brelse(bh); diff --git a/fs/gfs2/meta_io.c b/fs/gfs2/meta_io.c index f8d33e8..3c63087 100644 --- a/fs/gfs2/meta_io.c +++ b/fs/gfs2/meta_io.c @@ -37,8 +37,8 @@ static int gfs2_aspace_writepage(struct page *page, struct writeback_control *wb { struct buffer_head *bh, *head; int nr_underway = 0; - int write_op = REQ_META | REQ_PRIO | - (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE); + int write_flags = REQ_META | REQ_PRIO | + (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : 0); BUG_ON(!PageLocked(page)); BUG_ON(!page_has_buffers(page)); @@ -79,7 +79,7 @@ static int gfs2_aspace_writepage(struct page *page, struct writeback_control *wb do { struct buffer_head *next = bh->b_this_page; if (buffer_async_write(bh)) { - submit_bh(write_op, bh); + submit_bh(REQ_OP_WRITE, write_flags, bh); nr_underway++; } bh = next; diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c index 2ad98d6..956bcf0 100644 --- a/fs/jbd2/commit.c +++ b/fs/jbd2/commit.c @@ -155,9 +155,9 @@ static int journal_submit_commit_record(journal_t *journal, if (journal->j_flags & JBD2_BARRIER && !jbd2_has_feature_async_commit(journal)) - ret = submit_bh(WRITE_SYNC | WRITE_FLUSH_FUA, bh); + ret = submit_bh(REQ_OP_WRITE, WRITE_SYNC | WRITE_FLUSH_FUA, bh); else - ret = submit_bh(WRITE_SYNC, bh); + ret = submit_bh(REQ_OP_WRITE, WRITE_SYNC, bh); *cbh = bh; return ret; @@ -714,7 +714,7 @@ start_journal_io: clear_buffer_dirty(bh); set_buffer_uptodate(bh); bh->b_end_io = journal_end_buffer_io_sync; - submit_bh(WRITE_SYNC, bh); + submit_bh(REQ_OP_WRITE, WRITE_SYNC, bh); } cond_resched(); stats.run.rs_blocks_logged += bufs; diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index 435f0b2..6d7e33a 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c @@ -1345,15 +1345,15 @@ static int journal_reset(journal_t *journal) return jbd2_journal_start_thread(journal); } -static int jbd2_write_superblock(journal_t *journal, int write_op) +static int jbd2_write_superblock(journal_t *journal, int write_flags) { struct buffer_head *bh = journal->j_sb_buffer; journal_superblock_t *sb = journal->j_superblock; int ret; - trace_jbd2_write_superblock(journal, write_op); + trace_jbd2_write_superblock(journal, write_flags); if (!(journal->j_flags & JBD2_BARRIER)) - write_op &= ~(REQ_FUA | REQ_FLUSH); + write_flags &= ~(REQ_FUA | REQ_FLUSH); lock_buffer(bh); if (buffer_write_io_error(bh)) { /* @@ -1373,7 +1373,7 @@ static int jbd2_write_superblock(journal_t *journal, int write_op) jbd2_superblock_csum_set(journal, sb); get_bh(bh); bh->b_end_io = end_buffer_write_sync; - ret = submit_bh(write_op, bh); + ret = submit_bh(REQ_OP_WRITE, write_flags, bh); wait_on_buffer(bh); if (buffer_write_io_error(bh)) { clear_buffer_write_io_error(bh); diff --git a/fs/nilfs2/btnode.c b/fs/nilfs2/btnode.c index e0c9daf..87baf87 100644 --- a/fs/nilfs2/btnode.c +++ b/fs/nilfs2/btnode.c @@ -67,7 +67,7 @@ nilfs_btnode_create_block(struct address_space *btnc, __u64 blocknr) } int nilfs_btnode_submit_block(struct address_space *btnc, __u64 blocknr, - sector_t pblocknr, int mode, + sector_t pblocknr, int mode, int mode_flags, struct buffer_head **pbh, sector_t *submit_ptr) { struct buffer_head *bh; @@ -100,7 +100,7 @@ int nilfs_btnode_submit_block(struct address_space *btnc, __u64 blocknr, } } - if (mode == READA) { + if (mode_flags & REQ_RAHEAD) { if (pblocknr != *submit_ptr + 1 || !trylock_buffer(bh)) { err = -EBUSY; /* internal code */ brelse(bh); @@ -119,7 +119,7 @@ int nilfs_btnode_submit_block(struct address_space *btnc, __u64 blocknr, bh->b_blocknr = pblocknr; /* set block address for read */ bh->b_end_io = end_buffer_read_sync; get_bh(bh); - submit_bh(mode, bh); + submit_bh(mode, mode_flags, bh); bh->b_blocknr = blocknr; /* set back to the given block address */ *submit_ptr = pblocknr; err = 0; diff --git a/fs/nilfs2/btnode.h b/fs/nilfs2/btnode.h index d876b56..3f93197 100644 --- a/fs/nilfs2/btnode.h +++ b/fs/nilfs2/btnode.h @@ -47,7 +47,7 @@ void nilfs_btnode_cache_clear(struct address_space *); struct buffer_head *nilfs_btnode_create_block(struct address_space *btnc, __u64 blocknr); int nilfs_btnode_submit_block(struct address_space *, __u64, sector_t, int, - struct buffer_head **, sector_t *); + int, struct buffer_head **, sector_t *); void nilfs_btnode_delete(struct buffer_head *); int nilfs_btnode_prepare_change_key(struct address_space *, struct nilfs_btnode_chkey_ctxt *); diff --git a/fs/nilfs2/btree.c b/fs/nilfs2/btree.c index 3a3821b..5d6a2c6 100644 --- a/fs/nilfs2/btree.c +++ b/fs/nilfs2/btree.c @@ -480,7 +480,8 @@ static int __nilfs_btree_get_block(const struct nilfs_bmap *btree, __u64 ptr, sector_t submit_ptr = 0; int ret; - ret = nilfs_btnode_submit_block(btnc, ptr, 0, READ, &bh, &submit_ptr); + ret = nilfs_btnode_submit_block(btnc, ptr, 0, REQ_OP_READ, 0, &bh, + &submit_ptr); if (ret) { if (ret != -EEXIST) return ret; @@ -496,7 +497,8 @@ static int __nilfs_btree_get_block(const struct nilfs_bmap *btree, __u64 ptr, n > 0 && i < ra->ncmax; n--, i++) { ptr2 = nilfs_btree_node_get_ptr(ra->node, i, ra->ncmax); - ret = nilfs_btnode_submit_block(btnc, ptr2, 0, READA, + ret = nilfs_btnode_submit_block(btnc, ptr2, 0, + REQ_OP_READ, REQ_RAHEAD, &ra_bh, &submit_ptr); if (likely(!ret || ret == -EEXIST)) brelse(ra_bh); diff --git a/fs/nilfs2/gcinode.c b/fs/nilfs2/gcinode.c index 0224b78..90be270 100644 --- a/fs/nilfs2/gcinode.c +++ b/fs/nilfs2/gcinode.c @@ -106,7 +106,7 @@ int nilfs_gccache_submit_read_data(struct inode *inode, sector_t blkoff, bh->b_blocknr = pbn; bh->b_end_io = end_buffer_read_sync; get_bh(bh); - submit_bh(READ, bh); + submit_bh(REQ_OP_READ, 0, bh); if (vbn) bh->b_blocknr = vbn; out: @@ -143,7 +143,8 @@ int nilfs_gccache_submit_read_node(struct inode *inode, sector_t pbn, int ret; ret = nilfs_btnode_submit_block(&NILFS_I(inode)->i_btnode_cache, - vbn ? : pbn, pbn, READ, out_bh, &pbn); + vbn ? : pbn, pbn, REQ_OP_READ, 0, + out_bh, &pbn); if (ret == -EEXIST) /* internal code (cache hit) */ ret = 0; return ret; diff --git a/fs/nilfs2/mdt.c b/fs/nilfs2/mdt.c index f6982b9..27aee74 100644 --- a/fs/nilfs2/mdt.c +++ b/fs/nilfs2/mdt.c @@ -124,7 +124,7 @@ static int nilfs_mdt_create_block(struct inode *inode, unsigned long block, static int nilfs_mdt_submit_block(struct inode *inode, unsigned long blkoff, - int mode, struct buffer_head **out_bh) + int mode, int mode_flags, struct buffer_head **out_bh) { struct buffer_head *bh; __u64 blknum = 0; @@ -138,7 +138,7 @@ nilfs_mdt_submit_block(struct inode *inode, unsigned long blkoff, if (buffer_uptodate(bh)) goto out; - if (mode == READA) { + if (mode_flags & REQ_RAHEAD) { if (!trylock_buffer(bh)) { ret = -EBUSY; goto failed_bh; @@ -160,7 +160,7 @@ nilfs_mdt_submit_block(struct inode *inode, unsigned long blkoff, bh->b_end_io = end_buffer_read_sync; get_bh(bh); - submit_bh(mode, bh); + submit_bh(mode, mode_flags, bh); ret = 0; trace_nilfs2_mdt_submit_block(inode, inode->i_ino, blkoff, mode); @@ -184,7 +184,7 @@ static int nilfs_mdt_read_block(struct inode *inode, unsigned long block, int i, nr_ra_blocks = NILFS_MDT_MAX_RA_BLOCKS; int err; - err = nilfs_mdt_submit_block(inode, block, READ, &first_bh); + err = nilfs_mdt_submit_block(inode, block, REQ_OP_READ, 0, &first_bh); if (err == -EEXIST) /* internal code */ goto out; @@ -194,7 +194,8 @@ static int nilfs_mdt_read_block(struct inode *inode, unsigned long block, if (readahead) { blkoff = block + 1; for (i = 0; i < nr_ra_blocks; i++, blkoff++) { - err = nilfs_mdt_submit_block(inode, blkoff, READA, &bh); + err = nilfs_mdt_submit_block(inode, blkoff, REQ_OP_READ, + REQ_RAHEAD, &bh); if (likely(!err || err == -EEXIST)) brelse(bh); else if (err != -EBUSY) diff --git a/fs/ntfs/aops.c b/fs/ntfs/aops.c index 97768a1..fe251f1 100644 --- a/fs/ntfs/aops.c +++ b/fs/ntfs/aops.c @@ -362,7 +362,7 @@ handle_zblock: for (i = 0; i < nr; i++) { tbh = arr[i]; if (likely(!buffer_uptodate(tbh))) - submit_bh(READ, tbh); + submit_bh(REQ_OP_READ, 0, tbh); else ntfs_end_buffer_async_read(tbh, 1); } @@ -877,7 +877,7 @@ lock_retry_remap: do { struct buffer_head *next = bh->b_this_page; if (buffer_async_write(bh)) { - submit_bh(WRITE, bh); + submit_bh(REQ_OP_WRITE, 0, bh); need_end_writeback = false; } bh = next; @@ -1202,7 +1202,7 @@ lock_retry_remap: BUG_ON(!buffer_mapped(tbh)); get_bh(tbh); tbh->b_end_io = end_buffer_write_sync; - submit_bh(WRITE, tbh); + submit_bh(REQ_OP_WRITE, 0, tbh); } /* Synchronize the mft mirror now if not @sync. */ if (is_mft && !sync) diff --git a/fs/ntfs/compress.c b/fs/ntfs/compress.c index f2b5e74..f8eb043 100644 --- a/fs/ntfs/compress.c +++ b/fs/ntfs/compress.c @@ -670,7 +670,7 @@ lock_retry_remap: } get_bh(tbh); tbh->b_end_io = end_buffer_read_sync; - submit_bh(READ, tbh); + submit_bh(REQ_OP_READ, 0, tbh); } /* Wait for io completion on all buffer heads. */ diff --git a/fs/ntfs/file.c b/fs/ntfs/file.c index 91117ad..d96f0c1 100644 --- a/fs/ntfs/file.c +++ b/fs/ntfs/file.c @@ -553,7 +553,7 @@ static inline int ntfs_submit_bh_for_read(struct buffer_head *bh) lock_buffer(bh); get_bh(bh); bh->b_end_io = end_buffer_read_sync; - return submit_bh(READ, bh); + return submit_bh(REQ_OP_READ, 0, bh); } /** diff --git a/fs/ntfs/logfile.c b/fs/ntfs/logfile.c index 9d71213..761f12f 100644 --- a/fs/ntfs/logfile.c +++ b/fs/ntfs/logfile.c @@ -821,7 +821,7 @@ map_vcn: * completed ignore errors afterwards as we can assume * that if one buffer worked all of them will work. */ - submit_bh(WRITE, bh); + submit_bh(REQ_OP_WRITE, 0, bh); if (should_wait) { should_wait = false; wait_on_buffer(bh); diff --git a/fs/ntfs/mft.c b/fs/ntfs/mft.c index 37b2501..d15d492 100644 --- a/fs/ntfs/mft.c +++ b/fs/ntfs/mft.c @@ -592,7 +592,7 @@ int ntfs_sync_mft_mirror(ntfs_volume *vol, const unsigned long mft_no, clear_buffer_dirty(tbh); get_bh(tbh); tbh->b_end_io = end_buffer_write_sync; - submit_bh(WRITE, tbh); + submit_bh(REQ_OP_WRITE, 0, tbh); } /* Wait on i/o completion of buffers. */ for (i_bhs = 0; i_bhs < nr_bhs; i_bhs++) { @@ -785,7 +785,7 @@ int write_mft_record_nolock(ntfs_inode *ni, MFT_RECORD *m, int sync) clear_buffer_dirty(tbh); get_bh(tbh); tbh->b_end_io = end_buffer_write_sync; - submit_bh(WRITE, tbh); + submit_bh(REQ_OP_WRITE, 0, tbh); } /* Synchronize the mft mirror now if not @sync. */ if (!sync && ni->mft_no < vol->mftmirr_size) diff --git a/fs/ocfs2/buffer_head_io.c b/fs/ocfs2/buffer_head_io.c index fe50ded..fb775c9 100644 --- a/fs/ocfs2/buffer_head_io.c +++ b/fs/ocfs2/buffer_head_io.c @@ -79,7 +79,7 @@ int ocfs2_write_block(struct ocfs2_super *osb, struct buffer_head *bh, get_bh(bh); /* for end_buffer_write_sync() */ bh->b_end_io = end_buffer_write_sync; - submit_bh(WRITE, bh); + submit_bh(REQ_OP_WRITE, 0, bh); wait_on_buffer(bh); @@ -149,7 +149,7 @@ int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block, clear_buffer_uptodate(bh); get_bh(bh); /* for end_buffer_read_sync() */ bh->b_end_io = end_buffer_read_sync; - submit_bh(READ, bh); + submit_bh(REQ_OP_READ, 0, bh); } for (i = nr; i > 0; i--) { @@ -305,7 +305,7 @@ int ocfs2_read_blocks(struct ocfs2_caching_info *ci, u64 block, int nr, if (validate) set_buffer_needs_validate(bh); bh->b_end_io = end_buffer_read_sync; - submit_bh(READ, bh); + submit_bh(REQ_OP_READ, 0, bh); continue; } } @@ -419,7 +419,7 @@ int ocfs2_write_super_or_backup(struct ocfs2_super *osb, get_bh(bh); /* for end_buffer_write_sync() */ bh->b_end_io = end_buffer_write_sync; ocfs2_compute_meta_ecc(osb->sb, bh->b_data, &di->i_check); - submit_bh(WRITE, bh); + submit_bh(REQ_OP_WRITE, 0, bh); wait_on_buffer(bh); diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index d5c2e9c..b72c23a 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c @@ -2668,7 +2668,7 @@ static int reiserfs_write_full_page(struct page *page, do { struct buffer_head *next = bh->b_this_page; if (buffer_async_write(bh)) { - submit_bh(WRITE, bh); + submit_bh(REQ_OP_WRITE, 0, bh); nr++; } put_bh(bh); @@ -2728,7 +2728,7 @@ fail: struct buffer_head *next = bh->b_this_page; if (buffer_async_write(bh)) { clear_buffer_dirty(bh); - submit_bh(WRITE, bh); + submit_bh(REQ_OP_WRITE, 0, bh); nr++; } put_bh(bh); diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c index 2ace90e..6945e71 100644 --- a/fs/reiserfs/journal.c +++ b/fs/reiserfs/journal.c @@ -652,7 +652,7 @@ static void submit_logged_buffer(struct buffer_head *bh) BUG(); if (!buffer_uptodate(bh)) BUG(); - submit_bh(WRITE, bh); + submit_bh(REQ_OP_WRITE, 0, bh); } static void submit_ordered_buffer(struct buffer_head *bh) @@ -662,7 +662,7 @@ static void submit_ordered_buffer(struct buffer_head *bh) clear_buffer_dirty(bh); if (!buffer_uptodate(bh)) BUG(); - submit_bh(WRITE, bh); + submit_bh(REQ_OP_WRITE, 0, bh); } #define CHUNK_SIZE 32 @@ -2269,7 +2269,7 @@ abort_replay: /* flush out the real blocks */ for (i = 0; i < get_desc_trans_len(desc); i++) { set_buffer_dirty(real_blocks[i]); - write_dirty_buffer(real_blocks[i], WRITE); + write_dirty_buffer(real_blocks[i], 0); } for (i = 0; i < get_desc_trans_len(desc); i++) { wait_on_buffer(real_blocks[i]); diff --git a/fs/ufs/util.c b/fs/ufs/util.c index a409e3e7..f41ad0a 100644 --- a/fs/ufs/util.c +++ b/fs/ufs/util.c @@ -118,7 +118,7 @@ void ubh_sync_block(struct ufs_buffer_head *ubh) unsigned i; for (i = 0; i < ubh->count; i++) - write_dirty_buffer(ubh->bh[i], WRITE); + write_dirty_buffer(ubh->bh[i], 0); for (i = 0; i < ubh->count; i++) wait_on_buffer(ubh->bh[i]); diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index d48daa3..bc9a45d 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h @@ -189,10 +189,11 @@ void unlock_buffer(struct buffer_head *bh); void __lock_buffer(struct buffer_head *bh); void ll_rw_block(int, int, struct buffer_head * bh[]); int sync_dirty_buffer(struct buffer_head *bh); -int __sync_dirty_buffer(struct buffer_head *bh, int rw); -void write_dirty_buffer(struct buffer_head *bh, int rw); -int _submit_bh(int rw, struct buffer_head *bh, unsigned long bio_flags); -int submit_bh(int, struct buffer_head *); +int __sync_dirty_buffer(struct buffer_head *bh, int op_flags); +void write_dirty_buffer(struct buffer_head *bh, int op_flags); +int _submit_bh(int op, int op_flags, struct buffer_head *bh, + unsigned long bio_flags); +int submit_bh(int, int, struct buffer_head *); void write_boundary_block(struct block_device *bdev, sector_t bblock, unsigned blocksize); int bh_uptodate_or_lock(struct buffer_head *bh); -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:36:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 74CA47CE5 for ; Wed, 13 Apr 2016 14:36:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id BBB9CAC007 for ; Wed, 13 Apr 2016 12:36:53 -0700 (PDT) X-ASG-Debug-ID: 1460576211-04cbb02e1a1a0920001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HxDgBDvA6ubBK8sA (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:36:51 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id DD3DA201EA; Wed, 13 Apr 2016 19:36:50 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU93018278; Wed, 13 Apr 2016 15:36:48 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 07/42] btrfs: have submit_one_bio users setup bio bi_op Date: Wed, 13 Apr 2016 14:35:53 -0500 X-ASG-Orig-Subj: [PATCH 07/42] btrfs: have submit_one_bio users setup bio bi_op Message-Id: <1460576188-5751-8-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576211 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has btrfs's submit_one_bio callers set the bio->bi_op to a REQ_OP and the bi_rw to rq_flag_bits. The next patches will continue to convert btrfs, so submit_bio_hook and merge_bio_hook related code will be modified to take only the bio. I did not do it in this patch to try and keep it smaller. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- fs/btrfs/extent_io.c | 88 +++++++++++++++++++++++++++------------------------- 1 file changed, 45 insertions(+), 43 deletions(-) diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index fdeb8fa..45fa3be 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -2377,7 +2377,7 @@ static int bio_readpage_error(struct bio *failed_bio, u64 phy_offset, int read_mode; int ret; - BUG_ON(failed_bio->bi_rw & REQ_WRITE); + BUG_ON(failed_bio->bi_op == REQ_OP_WRITE); ret = btrfs_get_io_failure_record(inode, start, end, &failrec); if (ret) @@ -2403,6 +2403,8 @@ static int bio_readpage_error(struct bio *failed_bio, u64 phy_offset, free_io_failure(inode, failrec); return -EIO; } + bio->bi_op = REQ_OP_READ; + bio->bi_rw = read_mode; pr_debug("Repair Read Error: submitting new read[%#x] to this_mirror=%d, in_validation=%d\n", read_mode, failrec->this_mirror, failrec->in_validation); @@ -2714,8 +2716,8 @@ struct bio *btrfs_io_bio_alloc(gfp_t gfp_mask, unsigned int nr_iovecs) } -static int __must_check submit_one_bio(int rw, struct bio *bio, - int mirror_num, unsigned long bio_flags) +static int __must_check submit_one_bio(struct bio *bio, int mirror_num, + unsigned long bio_flags) { int ret = 0; struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1; @@ -2726,12 +2728,12 @@ static int __must_check submit_one_bio(int rw, struct bio *bio, start = page_offset(page) + bvec->bv_offset; bio->bi_private = NULL; - bio->bi_rw = rw; bio_get(bio); if (tree->ops && tree->ops->submit_bio_hook) - ret = tree->ops->submit_bio_hook(page->mapping->host, rw, bio, - mirror_num, bio_flags, start); + ret = tree->ops->submit_bio_hook(page->mapping->host, + bio->bi_rw, bio, mirror_num, + bio_flags, start); else btrfsic_submit_bio(bio); @@ -2739,20 +2741,20 @@ static int __must_check submit_one_bio(int rw, struct bio *bio, return ret; } -static int merge_bio(int rw, struct extent_io_tree *tree, struct page *page, +static int merge_bio(struct extent_io_tree *tree, struct page *page, unsigned long offset, size_t size, struct bio *bio, unsigned long bio_flags) { int ret = 0; if (tree->ops && tree->ops->merge_bio_hook) - ret = tree->ops->merge_bio_hook(rw, page, offset, size, bio, - bio_flags); + ret = tree->ops->merge_bio_hook(bio->bi_op, page, offset, size, + bio, bio_flags); BUG_ON(ret < 0); return ret; } -static int submit_extent_page(int rw, struct extent_io_tree *tree, +static int submit_extent_page(int op, int op_flags, struct extent_io_tree *tree, struct writeback_control *wbc, struct page *page, sector_t sector, size_t size, unsigned long offset, @@ -2780,10 +2782,9 @@ static int submit_extent_page(int rw, struct extent_io_tree *tree, if (prev_bio_flags != bio_flags || !contig || force_bio_submit || - merge_bio(rw, tree, page, offset, page_size, bio, bio_flags) || + merge_bio(tree, page, offset, page_size, bio, bio_flags) || bio_add_page(bio, page, page_size, offset) < page_size) { - ret = submit_one_bio(rw, bio, mirror_num, - prev_bio_flags); + ret = submit_one_bio(bio, mirror_num, prev_bio_flags); if (ret < 0) { *bio_ret = NULL; return ret; @@ -2804,6 +2805,8 @@ static int submit_extent_page(int rw, struct extent_io_tree *tree, bio_add_page(bio, page, page_size, offset); bio->bi_end_io = end_io_func; bio->bi_private = tree; + bio->bi_op = op; + bio->bi_rw = op_flags; if (wbc) { wbc_init_bio(wbc, bio); wbc_account_io(wbc, page, page_size); @@ -2812,7 +2815,7 @@ static int submit_extent_page(int rw, struct extent_io_tree *tree, if (bio_ret) *bio_ret = bio; else - ret = submit_one_bio(rw, bio, mirror_num, bio_flags); + ret = submit_one_bio(bio, mirror_num, bio_flags); return ret; } @@ -2876,7 +2879,7 @@ static int __do_readpage(struct extent_io_tree *tree, get_extent_t *get_extent, struct extent_map **em_cached, struct bio **bio, int mirror_num, - unsigned long *bio_flags, int rw, + unsigned long *bio_flags, int read_flags, u64 *prev_em_start) { struct inode *inode = page->mapping->host; @@ -3059,8 +3062,8 @@ static int __do_readpage(struct extent_io_tree *tree, } pnr -= page->index; - ret = submit_extent_page(rw, tree, NULL, page, - sector, disk_io_size, pg_offset, + ret = submit_extent_page(REQ_OP_READ, read_flags, tree, NULL, + page, sector, disk_io_size, pg_offset, bdev, bio, pnr, end_bio_extent_readpage, mirror_num, *bio_flags, @@ -3091,7 +3094,7 @@ static inline void __do_contiguous_readpages(struct extent_io_tree *tree, get_extent_t *get_extent, struct extent_map **em_cached, struct bio **bio, int mirror_num, - unsigned long *bio_flags, int rw, + unsigned long *bio_flags, u64 *prev_em_start) { struct inode *inode; @@ -3112,7 +3115,7 @@ static inline void __do_contiguous_readpages(struct extent_io_tree *tree, for (index = 0; index < nr_pages; index++) { __do_readpage(tree, pages[index], get_extent, em_cached, bio, - mirror_num, bio_flags, rw, prev_em_start); + mirror_num, bio_flags, 0, prev_em_start); put_page(pages[index]); } } @@ -3122,7 +3125,7 @@ static void __extent_readpages(struct extent_io_tree *tree, int nr_pages, get_extent_t *get_extent, struct extent_map **em_cached, struct bio **bio, int mirror_num, - unsigned long *bio_flags, int rw, + unsigned long *bio_flags, u64 *prev_em_start) { u64 start = 0; @@ -3144,7 +3147,7 @@ static void __extent_readpages(struct extent_io_tree *tree, index - first_index, start, end, get_extent, em_cached, bio, mirror_num, bio_flags, - rw, prev_em_start); + prev_em_start); start = page_start; end = start + PAGE_SIZE - 1; first_index = index; @@ -3155,7 +3158,7 @@ static void __extent_readpages(struct extent_io_tree *tree, __do_contiguous_readpages(tree, &pages[first_index], index - first_index, start, end, get_extent, em_cached, bio, - mirror_num, bio_flags, rw, + mirror_num, bio_flags, prev_em_start); } @@ -3163,7 +3166,7 @@ static int __extent_read_full_page(struct extent_io_tree *tree, struct page *page, get_extent_t *get_extent, struct bio **bio, int mirror_num, - unsigned long *bio_flags, int rw) + unsigned long *bio_flags, int read_flags) { struct inode *inode = page->mapping->host; struct btrfs_ordered_extent *ordered; @@ -3183,7 +3186,7 @@ static int __extent_read_full_page(struct extent_io_tree *tree, } ret = __do_readpage(tree, page, get_extent, NULL, bio, mirror_num, - bio_flags, rw, NULL); + bio_flags, read_flags, NULL); return ret; } @@ -3195,9 +3198,9 @@ int extent_read_full_page(struct extent_io_tree *tree, struct page *page, int ret; ret = __extent_read_full_page(tree, page, get_extent, &bio, mirror_num, - &bio_flags, READ); + &bio_flags, 0); if (bio) - ret = submit_one_bio(READ, bio, mirror_num, bio_flags); + ret = submit_one_bio(bio, mirror_num, bio_flags); return ret; } @@ -3438,7 +3441,8 @@ static noinline_for_stack int __extent_writepage_io(struct inode *inode, page->index, cur, end); } - ret = submit_extent_page(write_flags, tree, wbc, page, + ret = submit_extent_page(REQ_OP_WRITE, write_flags, + tree, wbc, page, sector, iosize, pg_offset, bdev, &epd->bio, max_nr, end_bio_extent_writepage, @@ -3478,13 +3482,11 @@ static int __extent_writepage(struct page *page, struct writeback_control *wbc, size_t pg_offset = 0; loff_t i_size = i_size_read(inode); unsigned long end_index = i_size >> PAGE_SHIFT; - int write_flags; + int write_flags = 0; unsigned long nr_written = 0; if (wbc->sync_mode == WB_SYNC_ALL) write_flags = WRITE_SYNC; - else - write_flags = WRITE; trace___extent_writepage(page, inode, wbc); @@ -3728,7 +3730,7 @@ static noinline_for_stack int write_one_eb(struct extent_buffer *eb, u64 offset = eb->start; unsigned long i, num_pages; unsigned long bio_flags = 0; - int rw = (epd->sync_io ? WRITE_SYNC : WRITE) | REQ_META; + int write_flags = (epd->sync_io ? WRITE_SYNC : 0) | REQ_META; int ret = 0; clear_bit(EXTENT_BUFFER_WRITE_ERR, &eb->bflags); @@ -3742,9 +3744,10 @@ static noinline_for_stack int write_one_eb(struct extent_buffer *eb, clear_page_dirty_for_io(p); set_page_writeback(p); - ret = submit_extent_page(rw, tree, wbc, p, offset >> 9, - PAGE_SIZE, 0, bdev, &epd->bio, - -1, end_bio_extent_buffer_writepage, + ret = submit_extent_page(REQ_OP_WRITE, write_flags, tree, wbc, + p, offset >> 9, PAGE_SIZE, 0, bdev, + &epd->bio, -1, + end_bio_extent_buffer_writepage, 0, epd->bio_flags, bio_flags, false); epd->bio_flags = bio_flags; if (ret) { @@ -4054,13 +4057,13 @@ retry: static void flush_epd_write_bio(struct extent_page_data *epd) { if (epd->bio) { - int rw = WRITE; int ret; + epd->bio->bi_op = REQ_OP_WRITE; if (epd->sync_io) - rw = WRITE_SYNC; + epd->bio->bi_rw = WRITE_SYNC; - ret = submit_one_bio(rw, epd->bio, 0, epd->bio_flags); + ret = submit_one_bio(epd->bio, 0, epd->bio_flags); BUG_ON(ret < 0); /* -ENOMEM */ epd->bio = NULL; } @@ -4187,19 +4190,19 @@ int extent_readpages(struct extent_io_tree *tree, if (nr < ARRAY_SIZE(pagepool)) continue; __extent_readpages(tree, pagepool, nr, get_extent, &em_cached, - &bio, 0, &bio_flags, READ, &prev_em_start); + &bio, 0, &bio_flags, &prev_em_start); nr = 0; } if (nr) __extent_readpages(tree, pagepool, nr, get_extent, &em_cached, - &bio, 0, &bio_flags, READ, &prev_em_start); + &bio, 0, &bio_flags, &prev_em_start); if (em_cached) free_extent_map(em_cached); BUG_ON(!list_empty(pages)); if (bio) - return submit_one_bio(READ, bio, 0, bio_flags); + return submit_one_bio(bio, 0, bio_flags); return 0; } @@ -5221,7 +5224,7 @@ int read_extent_buffer_pages(struct extent_io_tree *tree, err = __extent_read_full_page(tree, page, get_extent, &bio, mirror_num, &bio_flags, - READ | REQ_META); + REQ_META); if (err) ret = err; } else { @@ -5230,8 +5233,7 @@ int read_extent_buffer_pages(struct extent_io_tree *tree, } if (bio) { - err = submit_one_bio(READ | REQ_META, bio, mirror_num, - bio_flags); + err = submit_one_bio(bio, mirror_num, bio_flags); if (err) return err; } -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:36:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EB98B7CE5 for ; Wed, 13 Apr 2016 14:36:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id BFC9B304059 for ; Wed, 13 Apr 2016 12:36:57 -0700 (PDT) X-ASG-Debug-ID: 1460576216-04cbb02e1b1a0950001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id RORiOLTPIA7f1UXS (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:36:56 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CB7C212B34; Wed, 13 Apr 2016 19:36:55 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU95018278; Wed, 13 Apr 2016 15:36:53 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 09/42] btrfs: update __btrfs_map_block for bi_op transition Date: Wed, 13 Apr 2016 14:35:55 -0500 X-ASG-Orig-Subj: [PATCH 09/42] btrfs: update __btrfs_map_block for bi_op transition Message-Id: <1460576188-5751-10-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576216 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie We no longer pass in a bitmap of rq_flag_bits bits to __btrfs_map_block. It will always be a REQ_OP, or the btrfs specific REQ_GET_READ_MIRRORS, so this drops the bit tests. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- fs/btrfs/extent-tree.c | 2 +- fs/btrfs/inode.c | 2 +- fs/btrfs/volumes.c | 55 +++++++++++++++++++++++++++----------------------- fs/btrfs/volumes.h | 4 ++-- 4 files changed, 34 insertions(+), 29 deletions(-) diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 99decfb..f4bc8c1 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -2053,7 +2053,7 @@ int btrfs_discard_extent(struct btrfs_root *root, u64 bytenr, /* Tell the block device(s) that the sectors can be discarded */ - ret = btrfs_map_block(root->fs_info, REQ_DISCARD, + ret = btrfs_map_block(root->fs_info, REQ_OP_DISCARD, bytenr, &num_bytes, &bbio, 0); /* Error condition is -ENOMEM */ if (!ret) { diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index f693490..c2dc75b 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -8300,7 +8300,7 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, int i; map_length = orig_bio->bi_iter.bi_size; - ret = btrfs_map_block(root->fs_info, rw, start_sector << 9, + ret = btrfs_map_block(root->fs_info, orig_bio->bi_op, start_sector << 9, &map_length, NULL, 0); if (ret) return -EIO; diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 96fdf4b..dc56558 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -5212,7 +5212,7 @@ void btrfs_put_bbio(struct btrfs_bio *bbio) kfree(bbio); } -static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, +static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int op, u64 logical, u64 *length, struct btrfs_bio **bbio_ret, int mirror_num, int need_raid_map) @@ -5290,7 +5290,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, raid56_full_stripe_start *= full_stripe_len; } - if (rw & REQ_DISCARD) { + if (op == REQ_OP_DISCARD) { /* we don't discard raid56 yet */ if (map->type & BTRFS_BLOCK_GROUP_RAID56_MASK) { ret = -EOPNOTSUPP; @@ -5303,7 +5303,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, For other RAID types and for RAID[56] reads, just allow a single stripe (on a single disk). */ if ((map->type & BTRFS_BLOCK_GROUP_RAID56_MASK) && - (rw & REQ_WRITE)) { + (op == REQ_OP_WRITE)) { max_len = stripe_len * nr_data_stripes(map) - (offset - raid56_full_stripe_start); } else { @@ -5328,8 +5328,8 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, btrfs_dev_replace_set_lock_blocking(dev_replace); if (dev_replace_is_ongoing && mirror_num == map->num_stripes + 1 && - !(rw & (REQ_WRITE | REQ_DISCARD | REQ_GET_READ_MIRRORS)) && - dev_replace->tgtdev != NULL) { + op != REQ_OP_WRITE && op != REQ_OP_DISCARD && + op != REQ_GET_READ_MIRRORS && dev_replace->tgtdev != NULL) { /* * in dev-replace case, for repair case (that's the only * case where the mirror is selected explicitly when @@ -5416,15 +5416,17 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, (offset + *length); if (map->type & BTRFS_BLOCK_GROUP_RAID0) { - if (rw & REQ_DISCARD) + if (op == REQ_OP_DISCARD) num_stripes = min_t(u64, map->num_stripes, stripe_nr_end - stripe_nr_orig); stripe_nr = div_u64_rem(stripe_nr, map->num_stripes, &stripe_index); - if (!(rw & (REQ_WRITE | REQ_DISCARD | REQ_GET_READ_MIRRORS))) + if (op != REQ_OP_WRITE && op != REQ_OP_DISCARD && + op != REQ_GET_READ_MIRRORS) mirror_num = 1; } else if (map->type & BTRFS_BLOCK_GROUP_RAID1) { - if (rw & (REQ_WRITE | REQ_DISCARD | REQ_GET_READ_MIRRORS)) + if (op == REQ_OP_WRITE || op == REQ_OP_DISCARD || + op == REQ_GET_READ_MIRRORS) num_stripes = map->num_stripes; else if (mirror_num) stripe_index = mirror_num - 1; @@ -5437,7 +5439,8 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, } } else if (map->type & BTRFS_BLOCK_GROUP_DUP) { - if (rw & (REQ_WRITE | REQ_DISCARD | REQ_GET_READ_MIRRORS)) { + if (op == REQ_OP_WRITE || REQ_OP_DISCARD || + op == REQ_GET_READ_MIRRORS) { num_stripes = map->num_stripes; } else if (mirror_num) { stripe_index = mirror_num - 1; @@ -5451,9 +5454,9 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, stripe_nr = div_u64_rem(stripe_nr, factor, &stripe_index); stripe_index *= map->sub_stripes; - if (rw & (REQ_WRITE | REQ_GET_READ_MIRRORS)) + if (op == REQ_OP_WRITE || op == REQ_GET_READ_MIRRORS) num_stripes = map->sub_stripes; - else if (rw & REQ_DISCARD) + else if (op == REQ_OP_DISCARD) num_stripes = min_t(u64, map->sub_stripes * (stripe_nr_end - stripe_nr_orig), map->num_stripes); @@ -5471,7 +5474,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, } else if (map->type & BTRFS_BLOCK_GROUP_RAID56_MASK) { if (need_raid_map && - ((rw & (REQ_WRITE | REQ_GET_READ_MIRRORS)) || + (op == REQ_OP_WRITE || op == REQ_GET_READ_MIRRORS || mirror_num > 1)) { /* push stripe_nr back to the start of the full stripe */ stripe_nr = div_u64(raid56_full_stripe_start, @@ -5499,8 +5502,8 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, /* We distribute the parity blocks across stripes */ div_u64_rem(stripe_nr + stripe_index, map->num_stripes, &stripe_index); - if (!(rw & (REQ_WRITE | REQ_DISCARD | - REQ_GET_READ_MIRRORS)) && mirror_num <= 1) + if ((op != REQ_OP_WRITE && op != REQ_OP_DISCARD && + op != REQ_GET_READ_MIRRORS) && mirror_num <= 1) mirror_num = 1; } } else { @@ -5517,9 +5520,9 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, num_alloc_stripes = num_stripes; if (dev_replace_is_ongoing) { - if (rw & (REQ_WRITE | REQ_DISCARD)) + if (op == REQ_OP_WRITE || op == REQ_OP_DISCARD) num_alloc_stripes <<= 1; - if (rw & REQ_GET_READ_MIRRORS) + if (op == REQ_GET_READ_MIRRORS) num_alloc_stripes++; tgtdev_indexes = num_stripes; } @@ -5534,7 +5537,8 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, /* build raid_map */ if (map->type & BTRFS_BLOCK_GROUP_RAID56_MASK && - need_raid_map && ((rw & (REQ_WRITE | REQ_GET_READ_MIRRORS)) || + need_raid_map && + ((op == REQ_OP_WRITE || op == REQ_GET_READ_MIRRORS) || mirror_num > 1)) { u64 tmp; unsigned rot; @@ -5559,7 +5563,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, RAID6_Q_STRIPE; } - if (rw & REQ_DISCARD) { + if (op == REQ_OP_DISCARD) { u32 factor = 0; u32 sub_stripes = 0; u64 stripes_per_dev = 0; @@ -5639,14 +5643,15 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, } } - if (rw & (REQ_WRITE | REQ_GET_READ_MIRRORS)) + if (op == REQ_OP_WRITE || op == REQ_GET_READ_MIRRORS) max_errors = btrfs_chunk_max_errors(map); if (bbio->raid_map) sort_parity_stripes(bbio, num_stripes); tgtdev_indexes = 0; - if (dev_replace_is_ongoing && (rw & (REQ_WRITE | REQ_DISCARD)) && + if (dev_replace_is_ongoing && + (op == REQ_OP_WRITE || op == REQ_OP_DISCARD) && dev_replace->tgtdev != NULL) { int index_where_to_add; u64 srcdev_devid = dev_replace->srcdev->devid; @@ -5681,7 +5686,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, } } num_stripes = index_where_to_add; - } else if (dev_replace_is_ongoing && (rw & REQ_GET_READ_MIRRORS) && + } else if (dev_replace_is_ongoing && (op == REQ_GET_READ_MIRRORS) && dev_replace->tgtdev != NULL) { u64 srcdev_devid = dev_replace->srcdev->devid; int index_srcdev = 0; @@ -5756,21 +5761,21 @@ out: return ret; } -int btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, +int btrfs_map_block(struct btrfs_fs_info *fs_info, int op, u64 logical, u64 *length, struct btrfs_bio **bbio_ret, int mirror_num) { - return __btrfs_map_block(fs_info, rw, logical, length, bbio_ret, + return __btrfs_map_block(fs_info, op, logical, length, bbio_ret, mirror_num, 0); } /* For Scrub/replace */ -int btrfs_map_sblock(struct btrfs_fs_info *fs_info, int rw, +int btrfs_map_sblock(struct btrfs_fs_info *fs_info, int op, u64 logical, u64 *length, struct btrfs_bio **bbio_ret, int mirror_num, int need_raid_map) { - return __btrfs_map_block(fs_info, rw, logical, length, bbio_ret, + return __btrfs_map_block(fs_info, op, logical, length, bbio_ret, mirror_num, need_raid_map); } diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h index febdb7b..c64229e 100644 --- a/fs/btrfs/volumes.h +++ b/fs/btrfs/volumes.h @@ -421,10 +421,10 @@ int btrfs_account_dev_extents_size(struct btrfs_device *device, u64 start, u64 end, u64 *length); void btrfs_get_bbio(struct btrfs_bio *bbio); void btrfs_put_bbio(struct btrfs_bio *bbio); -int btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, +int btrfs_map_block(struct btrfs_fs_info *fs_info, int op, u64 logical, u64 *length, struct btrfs_bio **bbio_ret, int mirror_num); -int btrfs_map_sblock(struct btrfs_fs_info *fs_info, int rw, +int btrfs_map_sblock(struct btrfs_fs_info *fs_info, int op, u64 logical, u64 *length, struct btrfs_bio **bbio_ret, int mirror_num, int need_raid_map); -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:36:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0C3297CE6 for ; Wed, 13 Apr 2016 14:36:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 06CAAAC005 for ; Wed, 13 Apr 2016 12:36:56 -0700 (PDT) X-ASG-Debug-ID: 1460576213-04cbb02e1c1a0940001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id bgG5NcHpcxEnJDAt (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:36:54 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 56DCE62644; Wed, 13 Apr 2016 19:36:53 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU94018278; Wed, 13 Apr 2016 15:36:50 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 08/42] btrfs: set bi_op tp REQ_OP Date: Wed, 13 Apr 2016 14:35:54 -0500 X-ASG-Orig-Subj: [PATCH 08/42] btrfs: set bi_op tp REQ_OP Message-Id: <1460576188-5751-9-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Wed, 13 Apr 2016 19:36:53 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460576214 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has btrfs use the bio bi_op for REQ_OP and bi_rw for rq_flag_bits. v5: - Misset bi_rw to REQ_OP_WRITE in finish_parity_scrub Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- fs/btrfs/check-integrity.c | 19 +++++++++---------- fs/btrfs/compression.c | 4 ++++ fs/btrfs/disk-io.c | 7 ++++--- fs/btrfs/inode.c | 20 +++++++++++++------- fs/btrfs/raid56.c | 10 +++++----- fs/btrfs/scrub.c | 9 +++++---- fs/btrfs/volumes.c | 20 ++++++++++---------- 7 files changed, 50 insertions(+), 39 deletions(-) diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index f82190f..c4a48e8 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c @@ -1673,7 +1673,7 @@ static int btrfsic_read_block(struct btrfsic_state *state, } bio->bi_bdev = block_ctx->dev->bdev; bio->bi_iter.bi_sector = dev_bytenr >> 9; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; for (j = i; j < num_pages; j++) { ret = bio_add_page(bio, block_ctx->pagev[j], @@ -2922,7 +2922,6 @@ int btrfsic_submit_bh(int op, int op_flags, struct buffer_head *bh) static void __btrfsic_submit_bio(struct bio *bio) { struct btrfsic_dev_state *dev_state; - int rw = bio->bi_rw; if (!btrfsic_is_initialized) return; @@ -2932,7 +2931,7 @@ static void __btrfsic_submit_bio(struct bio *bio) * btrfsic_mount(), this might return NULL */ dev_state = btrfsic_dev_state_lookup(bio->bi_bdev); if (NULL != dev_state && - (rw & WRITE) && NULL != bio->bi_io_vec) { + (bio->bi_op == REQ_OP_WRITE) && NULL != bio->bi_io_vec) { unsigned int i; u64 dev_bytenr; u64 cur_bytenr; @@ -2944,9 +2943,9 @@ static void __btrfsic_submit_bio(struct bio *bio) if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) printk(KERN_INFO - "submit_bio(rw=0x%x, bi_vcnt=%u," + "submit_bio(rw=%d,0x%lx, bi_vcnt=%u," " bi_sector=%llu (bytenr %llu), bi_bdev=%p)\n", - rw, bio->bi_vcnt, + bio->bi_op, bio->bi_rw, bio->bi_vcnt, (unsigned long long)bio->bi_iter.bi_sector, dev_bytenr, bio->bi_bdev); @@ -2977,18 +2976,18 @@ static void __btrfsic_submit_bio(struct bio *bio) btrfsic_process_written_block(dev_state, dev_bytenr, mapped_datav, bio->bi_vcnt, bio, &bio_is_patched, - NULL, rw); + NULL, bio->bi_rw); while (i > 0) { i--; kunmap(bio->bi_io_vec[i].bv_page); } kfree(mapped_datav); - } else if (NULL != dev_state && (rw & REQ_FLUSH)) { + } else if (NULL != dev_state && (bio->bi_rw & REQ_FLUSH)) { if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) printk(KERN_INFO - "submit_bio(rw=0x%x FLUSH, bdev=%p)\n", - rw, bio->bi_bdev); + "submit_bio(rw=%d,0x%lx FLUSH, bdev=%p)\n", + bio->bi_op, bio->bi_rw, bio->bi_bdev); if (!dev_state->dummy_block_for_bio_bh_flush.is_iodone) { if ((dev_state->state->print_mask & (BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH | @@ -3006,7 +3005,7 @@ static void __btrfsic_submit_bio(struct bio *bio) block->never_written = 0; block->iodone_w_error = 0; block->flush_gen = dev_state->last_flush_gen + 1; - block->submit_bio_bh_rw = rw; + block->submit_bio_bh_rw = bio->bi_rw; block->orig_bio_bh_private = bio->bi_private; block->orig_bio_bh_end_io.bio = bio->bi_end_io; block->next_in_same_bio = NULL; diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index ff61a41..334a00c 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c @@ -363,6 +363,7 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start, kfree(cb); return -ENOMEM; } + bio->bi_op = REQ_OP_WRITE; bio->bi_private = cb; bio->bi_end_io = end_compressed_bio_write; atomic_inc(&cb->pending_bios); @@ -408,6 +409,7 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start, bio = compressed_bio_alloc(bdev, first_byte, GFP_NOFS); BUG_ON(!bio); + bio->bi_op = REQ_OP_WRITE; bio->bi_private = cb; bio->bi_end_io = end_compressed_bio_write; bio_add_page(bio, page, PAGE_SIZE, 0); @@ -646,6 +648,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, comp_bio = compressed_bio_alloc(bdev, cur_disk_byte, GFP_NOFS); if (!comp_bio) goto fail2; + comp_bio->bi_op = REQ_OP_READ; comp_bio->bi_private = cb; comp_bio->bi_end_io = end_compressed_bio_read; atomic_inc(&cb->pending_bios); @@ -699,6 +702,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, comp_bio = compressed_bio_alloc(bdev, cur_disk_byte, GFP_NOFS); BUG_ON(!comp_bio); + comp_bio->bi_op = REQ_OP_READ; comp_bio->bi_private = cb; comp_bio->bi_end_io = end_compressed_bio_read; diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 9a13c85..932268b 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -727,7 +727,7 @@ static void end_workqueue_bio(struct bio *bio) fs_info = end_io_wq->info; end_io_wq->error = bio->bi_error; - if (bio->bi_rw & REQ_WRITE) { + if (bio->bi_op == REQ_OP_WRITE) { if (end_io_wq->metadata == BTRFS_WQ_ENDIO_METADATA) { wq = fs_info->endio_meta_write_workers; func = btrfs_endio_meta_write_helper; @@ -873,7 +873,7 @@ int btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, struct inode *inode, atomic_inc(&fs_info->nr_async_submits); - if (rw & REQ_SYNC) + if (bio->bi_rw & REQ_SYNC) btrfs_set_work_high_priority(&async->work); btrfs_queue_work(fs_info->workers, &async->work); @@ -951,7 +951,7 @@ static int btree_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, int async = check_async_write(inode, bio_flags); int ret; - if (!(rw & REQ_WRITE)) { + if (bio->bi_op != REQ_OP_WRITE) { /* * called for a read, do the setup so that checksum validation * can happen in the async kernel threads @@ -3476,6 +3476,7 @@ static int write_dev_flush(struct btrfs_device *device, int wait) bio->bi_end_io = btrfs_end_empty_barrier; bio->bi_bdev = device->bdev; + bio->bi_op = REQ_OP_WRITE; bio->bi_rw = WRITE_FLUSH; init_completion(&device->flush_wait); bio->bi_private = &device->flush_wait; diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index d999fdf..f693490 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -1894,7 +1894,7 @@ static int btrfs_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, if (btrfs_is_free_space_inode(inode)) metadata = BTRFS_WQ_ENDIO_FREE_SPACE; - if (!(rw & REQ_WRITE)) { + if (bio->bi_op != REQ_OP_WRITE) { ret = btrfs_bio_wq_end_io(root->fs_info, bio, metadata); if (ret) goto out; @@ -7751,7 +7751,7 @@ static inline int submit_dio_repair_bio(struct inode *inode, struct bio *bio, struct btrfs_root *root = BTRFS_I(inode)->root; int ret; - BUG_ON(rw & REQ_WRITE); + BUG_ON(bio->bi_op == REQ_OP_WRITE); bio_get(bio); @@ -7811,7 +7811,7 @@ static int dio_read_error(struct inode *inode, struct bio *failed_bio, int read_mode; int ret; - BUG_ON(failed_bio->bi_rw & REQ_WRITE); + BUG_ON(failed_bio->bi_op == REQ_OP_WRITE); ret = btrfs_get_io_failure_record(inode, start, end, &failrec); if (ret) @@ -7839,6 +7839,8 @@ static int dio_read_error(struct inode *inode, struct bio *failed_bio, free_io_failure(inode, failrec); return -EIO; } + bio->bi_op = REQ_OP_READ; + bio->bi_rw = read_mode; btrfs_debug(BTRFS_I(inode)->root->fs_info, "Repair DIO Read Error: submitting new dio read[%#x] to this_mirror=%d, in_validation=%d\n", @@ -8153,8 +8155,8 @@ static void btrfs_end_dio_bio(struct bio *bio) if (err) btrfs_warn(BTRFS_I(dip->inode)->root->fs_info, - "direct IO failed ino %llu rw %lu sector %#Lx len %u err no %d", - btrfs_ino(dip->inode), bio->bi_rw, + "direct IO failed ino %llu rw %d,%lu sector %#Lx len %u err no %d", + btrfs_ino(dip->inode), bio->bi_op, bio->bi_rw, (unsigned long long)bio->bi_iter.bi_sector, bio->bi_iter.bi_size, err); @@ -8232,7 +8234,7 @@ static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, int async_submit) { struct btrfs_dio_private *dip = bio->bi_private; - int write = rw & REQ_WRITE; + bool write = bio->bi_op == REQ_OP_WRITE; struct btrfs_root *root = BTRFS_I(inode)->root; int ret; @@ -8319,6 +8321,8 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, if (!bio) return -ENOMEM; + bio->bi_op = orig_bio->bi_op; + bio->bi_rw = orig_bio->bi_rw; bio->bi_private = dip; bio->bi_end_io = btrfs_end_dio_bio; btrfs_io_bio(bio)->logical = file_offset; @@ -8356,12 +8360,14 @@ next_block: start_sector, GFP_NOFS); if (!bio) goto out_err; + bio->bi_op = orig_bio->bi_op; + bio->bi_rw = orig_bio->bi_rw; bio->bi_private = dip; bio->bi_end_io = btrfs_end_dio_bio; btrfs_io_bio(bio)->logical = file_offset; map_length = orig_bio->bi_iter.bi_size; - ret = btrfs_map_block(root->fs_info, rw, + ret = btrfs_map_block(root->fs_info, orig_bio->bi_op, start_sector << 9, &map_length, NULL, 0); if (ret) { diff --git a/fs/btrfs/raid56.c b/fs/btrfs/raid56.c index 439d7eb..dea2dd9 100644 --- a/fs/btrfs/raid56.c +++ b/fs/btrfs/raid56.c @@ -1320,7 +1320,7 @@ write_data: bio->bi_private = rbio; bio->bi_end_io = raid_write_end_io; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; submit_bio(bio); } @@ -1575,7 +1575,7 @@ static int raid56_rmw_stripe(struct btrfs_raid_bio *rbio) bio->bi_private = rbio; bio->bi_end_io = raid_rmw_end_io; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; btrfs_bio_wq_end_io(rbio->fs_info, bio, BTRFS_WQ_ENDIO_RAID56); @@ -2100,7 +2100,7 @@ static int __raid56_parity_recover(struct btrfs_raid_bio *rbio) bio->bi_private = rbio; bio->bi_end_io = raid_recover_end_io; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; btrfs_bio_wq_end_io(rbio->fs_info, bio, BTRFS_WQ_ENDIO_RAID56); @@ -2437,7 +2437,7 @@ submit_write: bio->bi_private = rbio; bio->bi_end_io = raid_write_end_io; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; submit_bio(bio); } @@ -2616,7 +2616,7 @@ static void raid56_parity_scrub_stripe(struct btrfs_raid_bio *rbio) bio->bi_private = rbio; bio->bi_end_io = raid56_parity_scrub_end_io; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; btrfs_bio_wq_end_io(rbio->fs_info, bio, BTRFS_WQ_ENDIO_RAID56); diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 184cb57..155b547 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -1504,7 +1504,7 @@ static void scrub_recheck_block(struct btrfs_fs_info *fs_info, sblock->no_io_error_seen = 0; } else { bio->bi_iter.bi_sector = page->physical >> 9; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; if (btrfsic_submit_bio_wait(bio)) sblock->no_io_error_seen = 0; @@ -1584,7 +1584,7 @@ static int scrub_repair_page_from_good_copy(struct scrub_block *sblock_bad, return -EIO; bio->bi_bdev = page_bad->dev->bdev; bio->bi_iter.bi_sector = page_bad->physical >> 9; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; ret = bio_add_page(bio, page_good->page, PAGE_SIZE, 0); if (PAGE_SIZE != ret) { @@ -1686,7 +1686,7 @@ again: bio->bi_end_io = scrub_wr_bio_end_io; bio->bi_bdev = sbio->dev->bdev; bio->bi_iter.bi_sector = sbio->physical >> 9; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; sbio->err = 0; } else if (sbio->physical + sbio->page_count * PAGE_SIZE != spage->physical_for_dev_replace || @@ -2091,7 +2091,7 @@ again: bio->bi_end_io = scrub_bio_end_io; bio->bi_bdev = sbio->dev->bdev; bio->bi_iter.bi_sector = sbio->physical >> 9; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; sbio->err = 0; } else if (sbio->physical + sbio->page_count * PAGE_SIZE != spage->physical || @@ -4393,6 +4393,7 @@ static int write_page_nocow(struct scrub_ctx *sctx, bio->bi_iter.bi_size = 0; bio->bi_iter.bi_sector = physical_for_dev_replace >> 9; bio->bi_bdev = dev->bdev; + bio->bi_op = REQ_OP_WRITE; bio->bi_rw = WRITE_SYNC; ret = bio_add_page(bio, page, PAGE_SIZE, 0); if (ret != PAGE_SIZE) { diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 318215d..96fdf4b 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -5884,7 +5884,7 @@ static void btrfs_end_bio(struct bio *bio) BUG_ON(stripe_index >= bbio->num_stripes); dev = bbio->stripes[stripe_index].dev; if (dev->bdev) { - if (bio->bi_rw & WRITE) + if (bio->bi_op == REQ_OP_WRITE) btrfs_dev_stat_inc(dev, BTRFS_DEV_STAT_WRITE_ERRS); else @@ -5949,7 +5949,7 @@ static noinline void btrfs_schedule_bio(struct btrfs_root *root, } /* don't bother with additional async steps for reads, right now */ - if (!(bio->bi_rw & REQ_WRITE)) { + if (bio->bi_op == REQ_OP_READ) { bio_get(bio); btrfsic_submit_bio(bio); bio_put(bio); @@ -5998,15 +5998,14 @@ static void submit_stripe_bio(struct btrfs_root *root, struct btrfs_bio *bbio, btrfs_io_bio(bio)->stripe_index = dev_nr; bio->bi_end_io = btrfs_end_bio; bio->bi_iter.bi_sector = physical >> 9; - bio->bi_rw |= rw; #ifdef DEBUG { struct rcu_string *name; rcu_read_lock(); name = rcu_dereference(dev->name); - pr_debug("btrfs_map_bio: rw %d, sector=%llu, dev=%lu " - "(%s id %llu), size=%u\n", rw, + pr_debug("btrfs_map_bio: rw %d 0x%x, sector=%llu, dev=%lu " + "(%s id %llu), size=%u\n", bio->bi_op, bio->bi_rw, (u64)bio->bi_iter.bi_sector, (u_long)dev->bdev->bd_dev, name->str, dev->devid, bio->bi_iter.bi_size); rcu_read_unlock(); @@ -6053,8 +6052,8 @@ int btrfs_map_bio(struct btrfs_root *root, int rw, struct bio *bio, map_length = length; btrfs_bio_counter_inc_blocked(root->fs_info); - ret = __btrfs_map_block(root->fs_info, rw, logical, &map_length, &bbio, - mirror_num, 1); + ret = __btrfs_map_block(root->fs_info, bio->bi_op, logical, + &map_length, &bbio, mirror_num, 1); if (ret) { btrfs_bio_counter_dec(root->fs_info); return ret; @@ -6068,10 +6067,10 @@ int btrfs_map_bio(struct btrfs_root *root, int rw, struct bio *bio, atomic_set(&bbio->stripes_pending, bbio->num_stripes); if ((bbio->map_type & BTRFS_BLOCK_GROUP_RAID56_MASK) && - ((rw & WRITE) || (mirror_num > 1))) { + ((bio->bi_op == REQ_OP_WRITE) || (mirror_num > 1))) { /* In this case, map_length has been set to the length of a single stripe; not the whole write */ - if (rw & WRITE) { + if (bio->bi_op == REQ_OP_WRITE) { ret = raid56_parity_write(root, bio, bbio, map_length); } else { ret = raid56_parity_recover(root, bio, bbio, map_length, @@ -6090,7 +6089,8 @@ int btrfs_map_bio(struct btrfs_root *root, int rw, struct bio *bio, for (dev_nr = 0; dev_nr < total_devs; dev_nr++) { dev = bbio->stripes[dev_nr].dev; - if (!dev || !dev->bdev || (rw & WRITE && !dev->writeable)) { + if (!dev || !dev->bdev || + (bio->bi_op == REQ_OP_WRITE && !dev->writeable)) { bbio_error(bbio, first_bio, logical); continue; } -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 487E07CF5 for ; Wed, 13 Apr 2016 14:37:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0C7408F8035 for ; Wed, 13 Apr 2016 12:37:00 -0700 (PDT) X-ASG-Debug-ID: 1460576218-04cbb02e1a1a0980001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id dGDweAzIzYIKaBel (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:36:58 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 29EF13455B8; Wed, 13 Apr 2016 19:36:58 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU96018278; Wed, 13 Apr 2016 15:36:55 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 10/42] btrfs: use bio fields for op and flags Date: Wed, 13 Apr 2016 14:35:56 -0500 X-ASG-Orig-Subj: [PATCH 10/42] btrfs: use bio fields for op and flags Message-Id: <1460576188-5751-11-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576218 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie The bio bi_op and bi_rw is now setup, so there is no need to pass around the rq_flag_bits bits too. btrfs users should should access the bio. v2: 1. Fix merge_bio issue where instead of removing rw/op argument I passed it in again to the merge_bio related functions. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- fs/btrfs/compression.c | 13 ++++++------- fs/btrfs/ctree.h | 2 +- fs/btrfs/disk-io.c | 30 ++++++++++++------------------ fs/btrfs/disk-io.h | 2 +- fs/btrfs/extent_io.c | 12 +++++------- fs/btrfs/extent_io.h | 8 ++++---- fs/btrfs/inode.c | 44 ++++++++++++++++++++------------------------ fs/btrfs/volumes.c | 6 +++--- fs/btrfs/volumes.h | 2 +- 9 files changed, 53 insertions(+), 66 deletions(-) diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index 334a00c..356ac36 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c @@ -374,7 +374,7 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start, page = compressed_pages[pg_index]; page->mapping = inode->i_mapping; if (bio->bi_iter.bi_size) - ret = io_tree->ops->merge_bio_hook(WRITE, page, 0, + ret = io_tree->ops->merge_bio_hook(page, 0, PAGE_SIZE, bio, 0); else @@ -402,7 +402,7 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start, BUG_ON(ret); /* -ENOMEM */ } - ret = btrfs_map_bio(root, WRITE, bio, 0, 1); + ret = btrfs_map_bio(root, bio, 0, 1); BUG_ON(ret); /* -ENOMEM */ bio_put(bio); @@ -433,7 +433,7 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start, BUG_ON(ret); /* -ENOMEM */ } - ret = btrfs_map_bio(root, WRITE, bio, 0, 1); + ret = btrfs_map_bio(root, bio, 0, 1); BUG_ON(ret); /* -ENOMEM */ bio_put(bio); @@ -659,7 +659,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, page->index = em_start >> PAGE_SHIFT; if (comp_bio->bi_iter.bi_size) - ret = tree->ops->merge_bio_hook(READ, page, 0, + ret = tree->ops->merge_bio_hook(page, 0, PAGE_SIZE, comp_bio, 0); else @@ -690,8 +690,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, sums += DIV_ROUND_UP(comp_bio->bi_iter.bi_size, root->sectorsize); - ret = btrfs_map_bio(root, READ, comp_bio, - mirror_num, 0); + ret = btrfs_map_bio(root, comp_bio, mirror_num, 0); if (ret) { bio->bi_error = ret; bio_endio(comp_bio); @@ -721,7 +720,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, BUG_ON(ret); /* -ENOMEM */ } - ret = btrfs_map_bio(root, READ, comp_bio, mirror_num, 0); + ret = btrfs_map_bio(root, comp_bio, mirror_num, 0); if (ret) { bio->bi_error = ret; bio_endio(comp_bio); diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index a0c6aca..4e50f59 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -4087,7 +4087,7 @@ int btrfs_create_subvol_root(struct btrfs_trans_handle *trans, struct btrfs_root *new_root, struct btrfs_root *parent_root, u64 new_dirid); -int btrfs_merge_bio_hook(int rw, struct page *page, unsigned long offset, +int btrfs_merge_bio_hook(struct page *page, unsigned long offset, size_t size, struct bio *bio, unsigned long bio_flags); int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf); diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 932268b..bea6df6 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -124,7 +124,6 @@ struct async_submit_bio { struct list_head list; extent_submit_bio_hook_t *submit_bio_start; extent_submit_bio_hook_t *submit_bio_done; - int rw; int mirror_num; unsigned long bio_flags; /* @@ -797,7 +796,7 @@ static void run_one_async_start(struct btrfs_work *work) int ret; async = container_of(work, struct async_submit_bio, work); - ret = async->submit_bio_start(async->inode, async->rw, async->bio, + ret = async->submit_bio_start(async->inode, async->bio, async->mirror_num, async->bio_flags, async->bio_offset); if (ret) @@ -830,9 +829,8 @@ static void run_one_async_done(struct btrfs_work *work) return; } - async->submit_bio_done(async->inode, async->rw, async->bio, - async->mirror_num, async->bio_flags, - async->bio_offset); + async->submit_bio_done(async->inode, async->bio, async->mirror_num, + async->bio_flags, async->bio_offset); } static void run_one_async_free(struct btrfs_work *work) @@ -844,7 +842,7 @@ static void run_one_async_free(struct btrfs_work *work) } int btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, struct inode *inode, - int rw, struct bio *bio, int mirror_num, + struct bio *bio, int mirror_num, unsigned long bio_flags, u64 bio_offset, extent_submit_bio_hook_t *submit_bio_start, @@ -857,7 +855,6 @@ int btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, struct inode *inode, return -ENOMEM; async->inode = inode; - async->rw = rw; async->bio = bio; async->mirror_num = mirror_num; async->submit_bio_start = submit_bio_start; @@ -903,9 +900,8 @@ static int btree_csum_one_bio(struct bio *bio) return ret; } -static int __btree_submit_bio_start(struct inode *inode, int rw, - struct bio *bio, int mirror_num, - unsigned long bio_flags, +static int __btree_submit_bio_start(struct inode *inode, struct bio *bio, + int mirror_num, unsigned long bio_flags, u64 bio_offset) { /* @@ -915,7 +911,7 @@ static int __btree_submit_bio_start(struct inode *inode, int rw, return btree_csum_one_bio(bio); } -static int __btree_submit_bio_done(struct inode *inode, int rw, struct bio *bio, +static int __btree_submit_bio_done(struct inode *inode, struct bio *bio, int mirror_num, unsigned long bio_flags, u64 bio_offset) { @@ -925,7 +921,7 @@ static int __btree_submit_bio_done(struct inode *inode, int rw, struct bio *bio, * when we're called for a write, we're already in the async * submission context. Just jump into btrfs_map_bio */ - ret = btrfs_map_bio(BTRFS_I(inode)->root, rw, bio, mirror_num, 1); + ret = btrfs_map_bio(BTRFS_I(inode)->root, bio, mirror_num, 1); if (ret) { bio->bi_error = ret; bio_endio(bio); @@ -944,7 +940,7 @@ static int check_async_write(struct inode *inode, unsigned long bio_flags) return 1; } -static int btree_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, +static int btree_submit_bio_hook(struct inode *inode, struct bio *bio, int mirror_num, unsigned long bio_flags, u64 bio_offset) { @@ -960,21 +956,19 @@ static int btree_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, bio, BTRFS_WQ_ENDIO_METADATA); if (ret) goto out_w_error; - ret = btrfs_map_bio(BTRFS_I(inode)->root, rw, bio, - mirror_num, 0); + ret = btrfs_map_bio(BTRFS_I(inode)->root, bio, mirror_num, 0); } else if (!async) { ret = btree_csum_one_bio(bio); if (ret) goto out_w_error; - ret = btrfs_map_bio(BTRFS_I(inode)->root, rw, bio, - mirror_num, 0); + ret = btrfs_map_bio(BTRFS_I(inode)->root, bio, mirror_num, 0); } else { /* * kthread helpers are used to submit writes so that * checksumming can happen in parallel across all CPUs */ ret = btrfs_wq_submit_bio(BTRFS_I(inode)->root->fs_info, - inode, rw, bio, mirror_num, 0, + inode, bio, mirror_num, 0, bio_offset, __btree_submit_bio_start, __btree_submit_bio_done); diff --git a/fs/btrfs/disk-io.h b/fs/btrfs/disk-io.h index 8e79d00..73c21a2 100644 --- a/fs/btrfs/disk-io.h +++ b/fs/btrfs/disk-io.h @@ -122,7 +122,7 @@ void btrfs_csum_final(u32 crc, char *result); int btrfs_bio_wq_end_io(struct btrfs_fs_info *info, struct bio *bio, enum btrfs_wq_endio_type metadata); int btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, struct inode *inode, - int rw, struct bio *bio, int mirror_num, + struct bio *bio, int mirror_num, unsigned long bio_flags, u64 bio_offset, extent_submit_bio_hook_t *submit_bio_start, extent_submit_bio_hook_t *submit_bio_done); diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 45fa3be..3bac80d 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -2409,8 +2409,7 @@ static int bio_readpage_error(struct bio *failed_bio, u64 phy_offset, pr_debug("Repair Read Error: submitting new read[%#x] to this_mirror=%d, in_validation=%d\n", read_mode, failrec->this_mirror, failrec->in_validation); - ret = tree->ops->submit_bio_hook(inode, read_mode, bio, - failrec->this_mirror, + ret = tree->ops->submit_bio_hook(inode, bio, failrec->this_mirror, failrec->bio_flags, 0); if (ret) { free_io_failure(inode, failrec); @@ -2731,9 +2730,8 @@ static int __must_check submit_one_bio(struct bio *bio, int mirror_num, bio_get(bio); if (tree->ops && tree->ops->submit_bio_hook) - ret = tree->ops->submit_bio_hook(page->mapping->host, - bio->bi_rw, bio, mirror_num, - bio_flags, start); + ret = tree->ops->submit_bio_hook(page->mapping->host, bio, + mirror_num, bio_flags, start); else btrfsic_submit_bio(bio); @@ -2747,8 +2745,8 @@ static int merge_bio(struct extent_io_tree *tree, struct page *page, { int ret = 0; if (tree->ops && tree->ops->merge_bio_hook) - ret = tree->ops->merge_bio_hook(bio->bi_op, page, offset, size, - bio, bio_flags); + ret = tree->ops->merge_bio_hook(page, offset, size, bio, + bio_flags); BUG_ON(ret < 0); return ret; diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h index b5e0ade..f8db2fd 100644 --- a/fs/btrfs/extent_io.h +++ b/fs/btrfs/extent_io.h @@ -63,9 +63,9 @@ struct btrfs_root; struct btrfs_io_bio; struct io_failure_record; -typedef int (extent_submit_bio_hook_t)(struct inode *inode, int rw, - struct bio *bio, int mirror_num, - unsigned long bio_flags, u64 bio_offset); +typedef int (extent_submit_bio_hook_t)(struct inode *inode, struct bio *bio, + int mirror_num, unsigned long bio_flags, + u64 bio_offset); struct extent_io_ops { int (*fill_delalloc)(struct inode *inode, struct page *locked_page, u64 start, u64 end, int *page_started, @@ -73,7 +73,7 @@ struct extent_io_ops { int (*writepage_start_hook)(struct page *page, u64 start, u64 end); int (*writepage_io_hook)(struct page *page, u64 start, u64 end); extent_submit_bio_hook_t *submit_bio_hook; - int (*merge_bio_hook)(int rw, struct page *page, unsigned long offset, + int (*merge_bio_hook)(struct page *page, unsigned long offset, size_t size, struct bio *bio, unsigned long bio_flags); int (*readpage_io_failed_hook)(struct page *page, int failed_mirror); diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index c2dc75b..bd214ab 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -1807,7 +1807,7 @@ static void btrfs_clear_bit_hook(struct inode *inode, * extent_io.c merge_bio_hook, this must check the chunk tree to make sure * we don't create bios that span stripes or chunks */ -int btrfs_merge_bio_hook(int rw, struct page *page, unsigned long offset, +int btrfs_merge_bio_hook(struct page *page, unsigned long offset, size_t size, struct bio *bio, unsigned long bio_flags) { @@ -1822,7 +1822,7 @@ int btrfs_merge_bio_hook(int rw, struct page *page, unsigned long offset, length = bio->bi_iter.bi_size; map_length = length; - ret = btrfs_map_block(root->fs_info, rw, logical, + ret = btrfs_map_block(root->fs_info, bio->bi_op, logical, &map_length, NULL, 0); /* Will always return 0 with map_multi == NULL */ BUG_ON(ret < 0); @@ -1839,9 +1839,8 @@ int btrfs_merge_bio_hook(int rw, struct page *page, unsigned long offset, * At IO completion time the cums attached on the ordered extent record * are inserted into the btree */ -static int __btrfs_submit_bio_start(struct inode *inode, int rw, - struct bio *bio, int mirror_num, - unsigned long bio_flags, +static int __btrfs_submit_bio_start(struct inode *inode, struct bio *bio, + int mirror_num, unsigned long bio_flags, u64 bio_offset) { struct btrfs_root *root = BTRFS_I(inode)->root; @@ -1860,14 +1859,14 @@ static int __btrfs_submit_bio_start(struct inode *inode, int rw, * At IO completion time the cums attached on the ordered extent record * are inserted into the btree */ -static int __btrfs_submit_bio_done(struct inode *inode, int rw, struct bio *bio, +static int __btrfs_submit_bio_done(struct inode *inode, struct bio *bio, int mirror_num, unsigned long bio_flags, u64 bio_offset) { struct btrfs_root *root = BTRFS_I(inode)->root; int ret; - ret = btrfs_map_bio(root, rw, bio, mirror_num, 1); + ret = btrfs_map_bio(root, bio, mirror_num, 1); if (ret) { bio->bi_error = ret; bio_endio(bio); @@ -1879,7 +1878,7 @@ static int __btrfs_submit_bio_done(struct inode *inode, int rw, struct bio *bio, * extent_io.c submission hook. This does the right thing for csum calculation * on write, or reading the csums from the tree before a read */ -static int btrfs_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, +static int btrfs_submit_bio_hook(struct inode *inode, struct bio *bio, int mirror_num, unsigned long bio_flags, u64 bio_offset) { @@ -1916,7 +1915,7 @@ static int btrfs_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, goto mapit; /* we're doing a write, do the async checksumming */ ret = btrfs_wq_submit_bio(BTRFS_I(inode)->root->fs_info, - inode, rw, bio, mirror_num, + inode, bio, mirror_num, bio_flags, bio_offset, __btrfs_submit_bio_start, __btrfs_submit_bio_done); @@ -1928,7 +1927,7 @@ static int btrfs_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, } mapit: - ret = btrfs_map_bio(root, rw, bio, mirror_num, 0); + ret = btrfs_map_bio(root, bio, mirror_num, 0); out: if (ret < 0) { @@ -7746,7 +7745,7 @@ err: } static inline int submit_dio_repair_bio(struct inode *inode, struct bio *bio, - int rw, int mirror_num) + int mirror_num) { struct btrfs_root *root = BTRFS_I(inode)->root; int ret; @@ -7760,7 +7759,7 @@ static inline int submit_dio_repair_bio(struct inode *inode, struct bio *bio, if (ret) goto err; - ret = btrfs_map_bio(root, rw, bio, mirror_num, 0); + ret = btrfs_map_bio(root, bio, mirror_num, 0); err: bio_put(bio); return ret; @@ -7846,8 +7845,7 @@ static int dio_read_error(struct inode *inode, struct bio *failed_bio, "Repair DIO Read Error: submitting new dio read[%#x] to this_mirror=%d, in_validation=%d\n", read_mode, failrec->this_mirror, failrec->in_validation); - ret = submit_dio_repair_bio(inode, bio, read_mode, - failrec->this_mirror); + ret = submit_dio_repair_bio(inode, bio, failrec->this_mirror); if (ret) { free_io_failure(inode, failrec); bio_put(bio); @@ -8137,7 +8135,7 @@ static void btrfs_endio_direct_write(struct bio *bio) bio_put(bio); } -static int __btrfs_submit_bio_start_direct_io(struct inode *inode, int rw, +static int __btrfs_submit_bio_start_direct_io(struct inode *inode, struct bio *bio, int mirror_num, unsigned long bio_flags, u64 offset) { @@ -8230,7 +8228,7 @@ static inline int btrfs_lookup_and_bind_dio_csum(struct btrfs_root *root, } static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, - int rw, u64 file_offset, int skip_sum, + u64 file_offset, int skip_sum, int async_submit) { struct btrfs_dio_private *dip = bio->bi_private; @@ -8255,8 +8253,7 @@ static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, if (write && async_submit) { ret = btrfs_wq_submit_bio(root->fs_info, - inode, rw, bio, 0, 0, - file_offset, + inode, bio, 0, 0, file_offset, __btrfs_submit_bio_start_direct_io, __btrfs_submit_bio_done); goto err; @@ -8275,13 +8272,13 @@ static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, goto err; } map: - ret = btrfs_map_bio(root, rw, bio, 0, async_submit); + ret = btrfs_map_bio(root, bio, 0, async_submit); err: bio_put(bio); return ret; } -static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, +static int btrfs_submit_direct_hook(struct btrfs_dio_private *dip, int skip_sum) { struct inode *inode = dip->inode; @@ -8342,7 +8339,7 @@ next_block: * before we're done setting it up */ atomic_inc(&dip->pending_bios); - ret = __btrfs_submit_dio_bio(bio, inode, rw, + ret = __btrfs_submit_dio_bio(bio, inode, file_offset, skip_sum, async_submit); if (ret) { @@ -8387,7 +8384,7 @@ next_block: } submit: - ret = __btrfs_submit_dio_bio(bio, inode, rw, file_offset, skip_sum, + ret = __btrfs_submit_dio_bio(bio, inode, file_offset, skip_sum, async_submit); if (!ret) return 0; @@ -8465,8 +8462,7 @@ static void btrfs_submit_direct(struct bio *dio_bio, struct inode *inode, dio_data->unsubmitted_oe_range_end; } - ret = btrfs_submit_direct_hook(dio_bio->bi_op | dio_bio->bi_rw, dip, - skip_sum); + ret = btrfs_submit_direct_hook(dip, skip_sum); if (!ret) return; diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index dc56558..2100514 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -5995,7 +5995,7 @@ static noinline void btrfs_schedule_bio(struct btrfs_root *root, static void submit_stripe_bio(struct btrfs_root *root, struct btrfs_bio *bbio, struct bio *bio, u64 physical, int dev_nr, - int rw, int async) + int async) { struct btrfs_device *dev = bbio->stripes[dev_nr].dev; @@ -6040,7 +6040,7 @@ static void bbio_error(struct btrfs_bio *bbio, struct bio *bio, u64 logical) } } -int btrfs_map_bio(struct btrfs_root *root, int rw, struct bio *bio, +int btrfs_map_bio(struct btrfs_root *root, struct bio *bio, int mirror_num, int async_submit) { struct btrfs_device *dev; @@ -6107,7 +6107,7 @@ int btrfs_map_bio(struct btrfs_root *root, int rw, struct bio *bio, bio = first_bio; submit_stripe_bio(root, bbio, bio, - bbio->stripes[dev_nr].physical, dev_nr, rw, + bbio->stripes[dev_nr].physical, dev_nr, async_submit); } btrfs_bio_counter_dec(root->fs_info); diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h index c64229e..372974d0 100644 --- a/fs/btrfs/volumes.h +++ b/fs/btrfs/volumes.h @@ -437,7 +437,7 @@ int btrfs_alloc_chunk(struct btrfs_trans_handle *trans, struct btrfs_root *extent_root, u64 type); void btrfs_mapping_init(struct btrfs_mapping_tree *tree); void btrfs_mapping_tree_free(struct btrfs_mapping_tree *tree); -int btrfs_map_bio(struct btrfs_root *root, int rw, struct bio *bio, +int btrfs_map_bio(struct btrfs_root *root, struct bio *bio, int mirror_num, int async_submit); int btrfs_open_devices(struct btrfs_fs_devices *fs_devices, fmode_t flags, void *holder); -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 368957CD5 for ; Wed, 13 Apr 2016 14:37:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 05ED08F8039 for ; Wed, 13 Apr 2016 12:37:05 -0700 (PDT) X-ASG-Debug-ID: 1460576220-04cb6c24644b4fe0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Dw6iqPo70r1G4008 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:01 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8343A57; Wed, 13 Apr 2016 19:37:00 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU97018278; Wed, 13 Apr 2016 15:36:58 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 11/42] f2fs: set bi_op to REQ_OP Date: Wed, 13 Apr 2016 14:35:57 -0500 X-ASG-Orig-Subj: [PATCH 11/42] f2fs: set bi_op to REQ_OP Message-Id: <1460576188-5751-12-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576221 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has f2fs use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- fs/f2fs/checkpoint.c | 10 ++++++---- fs/f2fs/data.c | 33 ++++++++++++++++++++------------- fs/f2fs/f2fs.h | 5 +++-- fs/f2fs/gc.c | 9 ++++++--- fs/f2fs/inline.c | 3 ++- fs/f2fs/node.c | 8 +++++--- fs/f2fs/segment.c | 10 +++++++--- fs/f2fs/trace.c | 7 ++++--- include/trace/events/f2fs.h | 34 +++++++++++++++++++++------------- 9 files changed, 74 insertions(+), 45 deletions(-) diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c index b92782f..6f9dc16 100644 --- a/fs/f2fs/checkpoint.c +++ b/fs/f2fs/checkpoint.c @@ -55,14 +55,15 @@ static struct page *__get_meta_page(struct f2fs_sb_info *sbi, pgoff_t index, struct f2fs_io_info fio = { .sbi = sbi, .type = META, - .rw = READ_SYNC | REQ_META | REQ_PRIO, + .op = REQ_OP_READ, + .op_flags = READ_SYNC | REQ_META | REQ_PRIO, .old_blkaddr = index, .new_blkaddr = index, .encrypted_page = NULL, }; if (unlikely(!is_meta)) - fio.rw &= ~REQ_META; + fio.op_flags &= ~REQ_META; repeat: page = grab_cache_page(mapping, index); if (!page) { @@ -149,13 +150,14 @@ int ra_meta_pages(struct f2fs_sb_info *sbi, block_t start, int nrpages, struct f2fs_io_info fio = { .sbi = sbi, .type = META, - .rw = sync ? (READ_SYNC | REQ_META | REQ_PRIO) : READA, + .op = REQ_OP_READ, + .op_flags = sync ? (READ_SYNC | REQ_META | REQ_PRIO) : READA, .encrypted_page = NULL, }; struct blk_plug plug; if (unlikely(type == META_POR)) - fio.rw &= ~REQ_META; + fio.op_flags &= ~REQ_META; blk_start_plug(&plug); for (; nrpages-- > 0; blkno++) { diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 74cf5cb..03b6362 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -105,11 +105,12 @@ static void __submit_merged_bio(struct f2fs_bio_info *io) if (!io->bio) return; - if (is_read_io(fio->rw)) + if (is_read_io(fio->op)) trace_f2fs_submit_read_bio(io->sbi->sb, fio, io->bio); else trace_f2fs_submit_write_bio(io->sbi->sb, fio, io->bio); - io->bio->bi_rw = fio->rw; + io->bio->bi_op = fio->op; + io->bio->bi_rw = fio->op_flags; submit_bio(io->bio); io->bio = NULL; @@ -177,10 +178,12 @@ static void __f2fs_submit_merged_bio(struct f2fs_sb_info *sbi, /* change META to META_FLUSH in the checkpoint procedure */ if (type >= META_FLUSH) { io->fio.type = META_FLUSH; + io->fio.op = REQ_OP_WRITE; if (test_opt(sbi, NOBARRIER)) - io->fio.rw = WRITE_FLUSH | REQ_META | REQ_PRIO; + io->fio.op_flags = WRITE_FLUSH | REQ_META | REQ_PRIO; else - io->fio.rw = WRITE_FLUSH_FUA | REQ_META | REQ_PRIO; + io->fio.op_flags = WRITE_FLUSH_FUA | REQ_META | + REQ_PRIO; } __submit_merged_bio(io); out: @@ -222,13 +225,14 @@ int f2fs_submit_page_bio(struct f2fs_io_info *fio) f2fs_trace_ios(fio, 0); /* Allocate a new bio */ - bio = __bio_alloc(fio->sbi, fio->new_blkaddr, 1, is_read_io(fio->rw)); + bio = __bio_alloc(fio->sbi, fio->new_blkaddr, 1, is_read_io(fio->op)); if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) { bio_put(bio); return -EFAULT; } - bio->bi_rw = fio->rw; + bio->bi_op = fio->op; + bio->bi_rw = fio->op_flags; submit_bio(bio); return 0; @@ -239,7 +243,7 @@ void f2fs_submit_page_mbio(struct f2fs_io_info *fio) struct f2fs_sb_info *sbi = fio->sbi; enum page_type btype = PAGE_TYPE_OF_BIO(fio->type); struct f2fs_bio_info *io; - bool is_read = is_read_io(fio->rw); + bool is_read = is_read_io(fio->op); struct page *bio_page; io = is_read ? &sbi->read_io : &sbi->write_io[btype]; @@ -254,7 +258,7 @@ void f2fs_submit_page_mbio(struct f2fs_io_info *fio) inc_page_count(sbi, F2FS_WRITEBACK); if (io->bio && (io->last_block_in_bio != fio->new_blkaddr - 1 || - io->fio.rw != fio->rw)) + (io->fio.op != fio->op || io->fio.op_flags != fio->op_flags))) __submit_merged_bio(io); alloc_new: if (io->bio == NULL) { @@ -359,7 +363,7 @@ int f2fs_get_block(struct dnode_of_data *dn, pgoff_t index) } struct page *get_read_data_page(struct inode *inode, pgoff_t index, - int rw, bool for_write) + int op_flags, bool for_write) { struct address_space *mapping = inode->i_mapping; struct dnode_of_data dn; @@ -369,7 +373,8 @@ struct page *get_read_data_page(struct inode *inode, pgoff_t index, struct f2fs_io_info fio = { .sbi = F2FS_I_SB(inode), .type = DATA, - .rw = rw, + .op = REQ_OP_READ, + .op_flags = op_flags, .encrypted_page = NULL, }; @@ -1014,7 +1019,7 @@ submit_and_realloc: bio->bi_iter.bi_sector = SECTOR_FROM_BLOCK(block_nr); bio->bi_end_io = f2fs_read_end_io; bio->bi_private = ctx; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; } if (bio_add_page(bio, page, blocksize, 0) < blocksize) @@ -1156,7 +1161,8 @@ static int f2fs_write_data_page(struct page *page, struct f2fs_io_info fio = { .sbi = sbi, .type = DATA, - .rw = (wbc->sync_mode == WB_SYNC_ALL) ? WRITE_SYNC : WRITE, + .op = REQ_OP_WRITE, + .op_flags = (wbc->sync_mode == WB_SYNC_ALL) ? WRITE_SYNC : 0, .page = page, .encrypted_page = NULL, }; @@ -1594,7 +1600,8 @@ repeat: struct f2fs_io_info fio = { .sbi = sbi, .type = DATA, - .rw = READ_SYNC, + .op = REQ_OP_READ, + .op_flags = READ_SYNC, .old_blkaddr = blkaddr, .new_blkaddr = blkaddr, .page = page, diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 3f15513..bc488e2 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -636,14 +636,15 @@ enum page_type { struct f2fs_io_info { struct f2fs_sb_info *sbi; /* f2fs_sb_info pointer */ enum page_type type; /* contains DATA/NODE/META/META_FLUSH */ - int rw; /* contains R/RS/W/WS with REQ_META/REQ_PRIO */ + int op; /* contains REQ_OP_ */ + int op_flags; /* rq_flag_bits */ block_t new_blkaddr; /* new block address to be written */ block_t old_blkaddr; /* old block address before Cow */ struct page *page; /* page to be written */ struct page *encrypted_page; /* encrypted page */ }; -#define is_read_io(rw) (((rw) & 1) == READ) +#define is_read_io(rw) (rw == READ) struct f2fs_bio_info { struct f2fs_sb_info *sbi; /* f2fs superblock */ struct bio *bio; /* bios to merge */ diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c index b0051a9..fbd4b88 100644 --- a/fs/f2fs/gc.c +++ b/fs/f2fs/gc.c @@ -546,7 +546,8 @@ static void move_encrypted_block(struct inode *inode, block_t bidx) struct f2fs_io_info fio = { .sbi = F2FS_I_SB(inode), .type = DATA, - .rw = READ_SYNC, + .op = REQ_OP_READ, + .op_flags = READ_SYNC, .encrypted_page = NULL, }; struct dnode_of_data dn; @@ -620,7 +621,8 @@ static void move_encrypted_block(struct inode *inode, block_t bidx) /* allocate block address */ f2fs_wait_on_page_writeback(dn.node_page, NODE, true); - fio.rw = WRITE_SYNC; + fio.op = REQ_OP_WRITE; + fio.op_flags = WRITE_SYNC; fio.new_blkaddr = newaddr; f2fs_submit_page_mbio(&fio); @@ -657,7 +659,8 @@ static void move_data_page(struct inode *inode, block_t bidx, int gc_type) struct f2fs_io_info fio = { .sbi = F2FS_I_SB(inode), .type = DATA, - .rw = WRITE_SYNC, + .op = REQ_OP_WRITE, + .op_flags = WRITE_SYNC, .page = page, .encrypted_page = NULL, }; diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c index 7720565..d3f7292 100644 --- a/fs/f2fs/inline.c +++ b/fs/f2fs/inline.c @@ -108,7 +108,8 @@ int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page) struct f2fs_io_info fio = { .sbi = F2FS_I_SB(dn->inode), .type = DATA, - .rw = WRITE_SYNC | REQ_PRIO, + .op = REQ_OP_WRITE, + .op_flags = WRITE_SYNC | REQ_PRIO, .page = page, .encrypted_page = NULL, }; diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index 095fc2c..c6935c5 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c @@ -1043,14 +1043,15 @@ fail: * 0: f2fs_put_page(page, 0) * LOCKED_PAGE or error: f2fs_put_page(page, 1) */ -static int read_node_page(struct page *page, int rw) +static int read_node_page(struct page *page, int op_flags) { struct f2fs_sb_info *sbi = F2FS_P_SB(page); struct node_info ni; struct f2fs_io_info fio = { .sbi = sbi, .type = NODE, - .rw = rw, + .op = REQ_OP_READ, + .op_flags = op_flags, .page = page, .encrypted_page = NULL, }; @@ -1389,7 +1390,8 @@ static int f2fs_write_node_page(struct page *page, struct f2fs_io_info fio = { .sbi = sbi, .type = NODE, - .rw = (wbc->sync_mode == WB_SYNC_ALL) ? WRITE_SYNC : WRITE, + .op = REQ_OP_WRITE, + .op_flags = (wbc->sync_mode == WB_SYNC_ALL) ? WRITE_SYNC : 0, .page = page, .encrypted_page = NULL, }; diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 0928d57..e271f16 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -255,7 +255,8 @@ static int __commit_inmem_pages(struct inode *inode, struct f2fs_io_info fio = { .sbi = sbi, .type = DATA, - .rw = WRITE_SYNC | REQ_PRIO, + .op = REQ_OP_WRITE, + .op_flags = WRITE_SYNC | REQ_PRIO, .encrypted_page = NULL, }; bool submit_bio = false; @@ -404,6 +405,7 @@ repeat: fcc->dispatch_list = llist_reverse_order(fcc->dispatch_list); bio->bi_bdev = sbi->sb->s_bdev; + bio->bi_op = REQ_OP_WRITE; bio->bi_rw = WRITE_FLUSH; ret = submit_bio_wait(bio); @@ -437,6 +439,7 @@ int f2fs_issue_flush(struct f2fs_sb_info *sbi) int ret; bio->bi_bdev = sbi->sb->s_bdev; + bio->bi_op = REQ_OP_WRITE; bio->bi_rw = WRITE_FLUSH; ret = submit_bio_wait(bio); bio_put(bio); @@ -1401,7 +1404,8 @@ void write_meta_page(struct f2fs_sb_info *sbi, struct page *page) struct f2fs_io_info fio = { .sbi = sbi, .type = META, - .rw = WRITE_SYNC | REQ_META | REQ_PRIO, + .op = REQ_OP_WRITE, + .op_flags = WRITE_SYNC | REQ_META | REQ_PRIO, .old_blkaddr = page->index, .new_blkaddr = page->index, .page = page, @@ -1409,7 +1413,7 @@ void write_meta_page(struct f2fs_sb_info *sbi, struct page *page) }; if (unlikely(page->index >= MAIN_BLKADDR(sbi))) - fio.rw &= ~REQ_META; + fio.op_flags &= ~REQ_META; set_page_writeback(page); f2fs_submit_page_mbio(&fio); diff --git a/fs/f2fs/trace.c b/fs/f2fs/trace.c index 562ce08..73b4e1d 100644 --- a/fs/f2fs/trace.c +++ b/fs/f2fs/trace.c @@ -25,11 +25,11 @@ static inline void __print_last_io(void) if (!last_io.len) return; - trace_printk("%3x:%3x %4x %-16s %2x %5x %12x %4x\n", + trace_printk("%3x:%3x %4x %-16s %2x %5x %5x %12x %4x\n", last_io.major, last_io.minor, last_io.pid, "----------------", last_io.type, - last_io.fio.rw, + last_io.fio.op, last_io.fio.op_flags, last_io.fio.new_blkaddr, last_io.len); memset(&last_io, 0, sizeof(last_io)); @@ -101,7 +101,8 @@ void f2fs_trace_ios(struct f2fs_io_info *fio, int flush) if (last_io.major == major && last_io.minor == minor && last_io.pid == pid && last_io.type == __file_type(inode, pid) && - last_io.fio.rw == fio->rw && + last_io.fio.op == fio->op && + last_io.fio.op_flags == fio->op_flags && last_io.fio.new_blkaddr + last_io.len == fio->new_blkaddr) { last_io.len++; diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h index 0f56584..db75d69 100644 --- a/include/trace/events/f2fs.h +++ b/include/trace/events/f2fs.h @@ -56,17 +56,21 @@ TRACE_DEFINE_ENUM(CP_DISCARD); { IPU, "IN-PLACE" }, \ { OPU, "OUT-OF-PLACE" }) -#define F2FS_BIO_MASK(t) (t & (READA | WRITE_FLUSH_FUA)) +#define F2FS_BIO_FLAG_MASK(t) (t & (READA | WRITE_FLUSH_FUA)) #define F2FS_BIO_EXTRA_MASK(t) (t & (REQ_META | REQ_PRIO)) -#define show_bio_type(type) show_bio_base(type), show_bio_extra(type) +#define show_bio_type(op, op_flags) show_bio_op(op), \ + show_bio_op_flags(op_flags), show_bio_extra(op_flags) -#define show_bio_base(type) \ - __print_symbolic(F2FS_BIO_MASK(type), \ +#define show_bio_op(op) \ + __print_symbolic(op, \ { READ, "READ" }, \ + { WRITE, "WRITE" }) + +#define show_bio_op_flags(flags) \ + __print_symbolic(F2FS_BIO_FLAG_MASK(flags), \ { READA, "READAHEAD" }, \ { READ_SYNC, "READ_SYNC" }, \ - { WRITE, "WRITE" }, \ { WRITE_SYNC, "WRITE_SYNC" }, \ { WRITE_FLUSH, "WRITE_FLUSH" }, \ { WRITE_FUA, "WRITE_FUA" }, \ @@ -730,7 +734,8 @@ DECLARE_EVENT_CLASS(f2fs__submit_page_bio, __field(pgoff_t, index) __field(block_t, old_blkaddr) __field(block_t, new_blkaddr) - __field(int, rw) + __field(int, op) + __field(int, op_flags) __field(int, type) ), @@ -740,17 +745,18 @@ DECLARE_EVENT_CLASS(f2fs__submit_page_bio, __entry->index = page->index; __entry->old_blkaddr = fio->old_blkaddr; __entry->new_blkaddr = fio->new_blkaddr; - __entry->rw = fio->rw; + __entry->op = fio->op; + __entry->op_flags = fio->op_flags; __entry->type = fio->type; ), TP_printk("dev = (%d,%d), ino = %lu, page_index = 0x%lx, " - "oldaddr = 0x%llx, newaddr = 0x%llx rw = %s%s, type = %s", + "oldaddr = 0x%llx, newaddr = 0x%llx rw = %s%si%s, type = %s", show_dev_ino(__entry), (unsigned long)__entry->index, (unsigned long long)__entry->old_blkaddr, (unsigned long long)__entry->new_blkaddr, - show_bio_type(__entry->rw), + show_bio_type(__entry->op, __entry->op_flags), show_block_type(__entry->type)) ); @@ -781,7 +787,8 @@ DECLARE_EVENT_CLASS(f2fs__submit_bio, TP_STRUCT__entry( __field(dev_t, dev) - __field(int, rw) + __field(int, op) + __field(int, op_flags) __field(int, type) __field(sector_t, sector) __field(unsigned int, size) @@ -789,15 +796,16 @@ DECLARE_EVENT_CLASS(f2fs__submit_bio, TP_fast_assign( __entry->dev = sb->s_dev; - __entry->rw = fio->rw; + __entry->op = fio->op; + __entry->op_flags = fio->op_flags; __entry->type = fio->type; __entry->sector = bio->bi_iter.bi_sector; __entry->size = bio->bi_iter.bi_size; ), - TP_printk("dev = (%d,%d), %s%s, %s, sector = %lld, size = %u", + TP_printk("dev = (%d,%d), %s%s%s, %s, sector = %lld, size = %u", show_dev(__entry), - show_bio_type(__entry->rw), + show_bio_type(__entry->op, __entry->op_flags), show_block_type(__entry->type), (unsigned long long)__entry->sector, __entry->size) -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6895A7CF7 for ; Wed, 13 Apr 2016 14:37:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C82F5AC008 for ; Wed, 13 Apr 2016 12:37:04 -0700 (PDT) X-ASG-Debug-ID: 1460576222-04cb6c24644b4ff0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Zm5orElGz7xBKert (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:03 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id BCB8AC049E17; Wed, 13 Apr 2016 19:37:02 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU98018278; Wed, 13 Apr 2016 15:37:00 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 12/42] gfs2: set bi_op to REQ_OP Date: Wed, 13 Apr 2016 14:35:58 -0500 X-ASG-Orig-Subj: [PATCH 12/42] gfs2: set bi_op to REQ_OP Message-Id: <1460576188-5751-13-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576223 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has gfs2 use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- fs/gfs2/log.c | 8 ++++---- fs/gfs2/lops.c | 12 +++++++----- fs/gfs2/lops.h | 2 +- fs/gfs2/meta_io.c | 8 +++++--- fs/gfs2/ops_fstype.c | 1 + 5 files changed, 18 insertions(+), 13 deletions(-) diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c index 0ff028c..e58ccef0 100644 --- a/fs/gfs2/log.c +++ b/fs/gfs2/log.c @@ -657,7 +657,7 @@ static void log_write_header(struct gfs2_sbd *sdp, u32 flags) struct gfs2_log_header *lh; unsigned int tail; u32 hash; - int rw = WRITE_FLUSH_FUA | REQ_META; + int op_flags = WRITE_FLUSH_FUA | REQ_META; struct page *page = mempool_alloc(gfs2_page_pool, GFP_NOIO); enum gfs2_freeze_state state = atomic_read(&sdp->sd_freeze_state); lh = page_address(page); @@ -682,12 +682,12 @@ static void log_write_header(struct gfs2_sbd *sdp, u32 flags) if (test_bit(SDF_NOBARRIERS, &sdp->sd_flags)) { gfs2_ordered_wait(sdp); log_flush_wait(sdp); - rw = WRITE_SYNC | REQ_META | REQ_PRIO; + op_flags = WRITE_SYNC | REQ_META | REQ_PRIO; } sdp->sd_log_idle = (tail == sdp->sd_log_flush_head); gfs2_log_write_page(sdp, page); - gfs2_log_flush_bio(sdp, rw); + gfs2_log_flush_bio(sdp, REQ_OP_WRITE, op_flags); log_flush_wait(sdp); if (sdp->sd_log_tail != tail) @@ -738,7 +738,7 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, gfs2_ordered_write(sdp); lops_before_commit(sdp, tr); - gfs2_log_flush_bio(sdp, WRITE); + gfs2_log_flush_bio(sdp, REQ_OP_WRITE, 0); if (sdp->sd_log_head != sdp->sd_log_flush_head) { log_flush_wait(sdp); diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c index ce28242..c1099b4 100644 --- a/fs/gfs2/lops.c +++ b/fs/gfs2/lops.c @@ -230,17 +230,19 @@ static void gfs2_end_log_write(struct bio *bio) /** * gfs2_log_flush_bio - Submit any pending log bio * @sdp: The superblock - * @rw: The rw flags + * @op: REQ_OP + * @op_flags: rq_flag_bits * * Submit any pending part-built or full bio to the block device. If * there is no pending bio, then this is a no-op. */ -void gfs2_log_flush_bio(struct gfs2_sbd *sdp, int rw) +void gfs2_log_flush_bio(struct gfs2_sbd *sdp, int op, int op_flags) { if (sdp->sd_log_bio) { atomic_inc(&sdp->sd_log_in_flight); - sdp->sd_log_bio->bi_rw = rw; + sdp->sd_log_bio->bi_op = op; + sdp->sd_log_bio->bi_rw = op_flags; submit_bio(sdp->sd_log_bio); sdp->sd_log_bio = NULL; } @@ -300,7 +302,7 @@ static struct bio *gfs2_log_get_bio(struct gfs2_sbd *sdp, u64 blkno) nblk >>= sdp->sd_fsb2bb_shift; if (blkno == nblk) return bio; - gfs2_log_flush_bio(sdp, WRITE); + gfs2_log_flush_bio(sdp, REQ_OP_WRITE, 0); } return gfs2_log_alloc_bio(sdp, blkno); @@ -329,7 +331,7 @@ static void gfs2_log_write(struct gfs2_sbd *sdp, struct page *page, bio = gfs2_log_get_bio(sdp, blkno); ret = bio_add_page(bio, page, size, offset); if (ret == 0) { - gfs2_log_flush_bio(sdp, WRITE); + gfs2_log_flush_bio(sdp, REQ_OP_WRITE, 0); bio = gfs2_log_alloc_bio(sdp, blkno); ret = bio_add_page(bio, page, size, offset); WARN_ON(ret == 0); diff --git a/fs/gfs2/lops.h b/fs/gfs2/lops.h index a65a7ba..e529f53 100644 --- a/fs/gfs2/lops.h +++ b/fs/gfs2/lops.h @@ -27,7 +27,7 @@ extern const struct gfs2_log_operations gfs2_databuf_lops; extern const struct gfs2_log_operations *gfs2_log_ops[]; extern void gfs2_log_write_page(struct gfs2_sbd *sdp, struct page *page); -extern void gfs2_log_flush_bio(struct gfs2_sbd *sdp, int rw); +extern void gfs2_log_flush_bio(struct gfs2_sbd *sdp, int op, int op_flags); extern void gfs2_pin(struct gfs2_sbd *sdp, struct buffer_head *bh); static inline unsigned int buf_limit(struct gfs2_sbd *sdp) diff --git a/fs/gfs2/meta_io.c b/fs/gfs2/meta_io.c index f56f3ca..55ae188 100644 --- a/fs/gfs2/meta_io.c +++ b/fs/gfs2/meta_io.c @@ -213,7 +213,8 @@ static void gfs2_meta_read_endio(struct bio *bio) * Submit several consecutive buffer head I/O requests as a single bio I/O * request. (See submit_bh_wbc.) */ -static void gfs2_submit_bhs(int rw, struct buffer_head *bhs[], int num) +static void gfs2_submit_bhs(int op, int op_flags, struct buffer_head *bhs[], + int num) { struct buffer_head *bh = bhs[0]; struct bio *bio; @@ -230,7 +231,8 @@ static void gfs2_submit_bhs(int rw, struct buffer_head *bhs[], int num) bio_add_page(bio, bh->b_page, bh->b_size, bh_offset(bh)); } bio->bi_end_io = gfs2_meta_read_endio; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; submit_bio(bio); } @@ -281,7 +283,7 @@ int gfs2_meta_read(struct gfs2_glock *gl, u64 blkno, int flags, } } - gfs2_submit_bhs(READ_SYNC | REQ_META | REQ_PRIO, bhs, num); + gfs2_submit_bhs(REQ_OP_READ, READ_SYNC | REQ_META | REQ_PRIO, bhs, num); if (!(flags & DIO_WAIT)) return 0; diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index 141b560..fda3e71 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c @@ -246,6 +246,7 @@ static int gfs2_read_super(struct gfs2_sbd *sdp, sector_t sector, int silent) bio->bi_end_io = end_bio_io_page; bio->bi_private = page; + bio->bi_op = REQ_OP_READ; bio->bi_rw = READ_SYNC | REQ_META; submit_bio(bio); wait_on_page_locked(page); -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A638F7CD5 for ; Wed, 13 Apr 2016 14:37:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 11845AC005 for ; Wed, 13 Apr 2016 12:37:06 -0700 (PDT) X-ASG-Debug-ID: 1460576225-04cbb02e1c1a09d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 9sqni9F0W2pJPGxq (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:05 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1D44CC05E176; Wed, 13 Apr 2016 19:37:05 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU99018278; Wed, 13 Apr 2016 15:37:02 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 13/42] xfs: set bi_op to REQ_OP Date: Wed, 13 Apr 2016 14:35:59 -0500 X-ASG-Orig-Subj: [PATCH 13/42] xfs: set bi_op to REQ_OP Message-Id: <1460576188-5751-14-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576225 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has xfs use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Acked-by: Dave Chinner --- fs/xfs/xfs_aops.c | 3 +-- fs/xfs/xfs_buf.c | 27 +++++++++++++++------------ 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 5852c5a..6c20336 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -439,10 +439,9 @@ xfs_submit_ioend( ioend->io_bio->bi_private = ioend; ioend->io_bio->bi_end_io = xfs_end_bio; + ioend->io_bio->bi_op = REQ_OP_WRITE; if (wbc->sync_mode) ioend->io_bio->bi_rw = WRITE_SYNC; - else - ioend->io_bio->bi_rw = WRITE; /* * If we are failing the IO now, just mark the ioend with an * error and finish it. This will run IO completion immediately diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 079bb77..917774e 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1131,7 +1131,8 @@ xfs_buf_ioapply_map( int map, int *buf_offset, int *count, - int rw) + int op, + int op_flags) { int page_index; int total_nr_pages = bp->b_page_count; @@ -1170,7 +1171,8 @@ next_chunk: bio->bi_iter.bi_sector = sector; bio->bi_end_io = xfs_buf_bio_end_io; bio->bi_private = bp; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; for (; size && nr_pages; nr_pages--, page_index++) { int rbytes, nbytes = PAGE_SIZE - offset; @@ -1214,7 +1216,8 @@ _xfs_buf_ioapply( struct xfs_buf *bp) { struct blk_plug plug; - int rw; + int op; + int op_flags = 0; int offset; int size; int i; @@ -1233,14 +1236,13 @@ _xfs_buf_ioapply( bp->b_ioend_wq = bp->b_target->bt_mount->m_buf_workqueue; if (bp->b_flags & XBF_WRITE) { + op = REQ_OP_WRITE; if (bp->b_flags & XBF_SYNCIO) - rw = WRITE_SYNC; - else - rw = WRITE; + op_flags = WRITE_SYNC; if (bp->b_flags & XBF_FUA) - rw |= REQ_FUA; + op_flags |= REQ_FUA; if (bp->b_flags & XBF_FLUSH) - rw |= REQ_FLUSH; + op_flags |= REQ_FLUSH; /* * Run the write verifier callback function if it exists. If @@ -1270,13 +1272,14 @@ _xfs_buf_ioapply( } } } else if (bp->b_flags & XBF_READ_AHEAD) { - rw = READA; + op = REQ_OP_READ; + op_flags = REQ_RAHEAD; } else { - rw = READ; + op = REQ_OP_READ; } /* we only use the buffer cache for meta-data */ - rw |= REQ_META; + op_flags |= REQ_META; /* * Walk all the vectors issuing IO on them. Set up the initial offset @@ -1288,7 +1291,7 @@ _xfs_buf_ioapply( size = BBTOB(bp->b_io_length); blk_start_plug(&plug); for (i = 0; i < bp->b_map_count; i++) { - xfs_buf_ioapply_map(bp, i, &offset, &size, rw); + xfs_buf_ioapply_map(bp, i, &offset, &size, op, op_flags); if (bp->b_error) break; if (size <= 0) -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 44B1D7CFE for ; Wed, 13 Apr 2016 14:37:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B2872AC00A for ; Wed, 13 Apr 2016 12:37:08 -0700 (PDT) X-ASG-Debug-ID: 1460576227-04bdf011044b3250001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id LRdBDZSKoiKAert0 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:07 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6521C7F6C1; Wed, 13 Apr 2016 19:37:07 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9A018278; Wed, 13 Apr 2016 15:37:05 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 14/42] hfsplus: set bi_op to REQ_OP Date: Wed, 13 Apr 2016 14:36:00 -0500 X-ASG-Orig-Subj: [PATCH 14/42] hfsplus: set bi_op to REQ_OP Message-Id: <1460576188-5751-15-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576227 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has hfsplus use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- fs/hfsplus/hfsplus_fs.h | 2 +- fs/hfsplus/part_tbl.c | 5 +++-- fs/hfsplus/super.c | 6 ++++-- fs/hfsplus/wrapper.c | 15 +++++++++------ 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/fs/hfsplus/hfsplus_fs.h b/fs/hfsplus/hfsplus_fs.h index f91a1fa..80154aa 100644 --- a/fs/hfsplus/hfsplus_fs.h +++ b/fs/hfsplus/hfsplus_fs.h @@ -525,7 +525,7 @@ int hfsplus_compare_dentry(const struct dentry *parent, /* wrapper.c */ int hfsplus_submit_bio(struct super_block *sb, sector_t sector, void *buf, - void **data, int rw); + void **data, int op, int op_flags); int hfsplus_read_wrapper(struct super_block *sb); /* time macros */ diff --git a/fs/hfsplus/part_tbl.c b/fs/hfsplus/part_tbl.c index eb355d8..63164eb 100644 --- a/fs/hfsplus/part_tbl.c +++ b/fs/hfsplus/part_tbl.c @@ -112,7 +112,8 @@ static int hfs_parse_new_pmap(struct super_block *sb, void *buf, if ((u8 *)pm - (u8 *)buf >= buf_size) { res = hfsplus_submit_bio(sb, *part_start + HFS_PMAP_BLK + i, - buf, (void **)&pm, READ); + buf, (void **)&pm, REQ_OP_READ, + 0); if (res) return res; } @@ -136,7 +137,7 @@ int hfs_part_find(struct super_block *sb, return -ENOMEM; res = hfsplus_submit_bio(sb, *part_start + HFS_PMAP_BLK, - buf, &data, READ); + buf, &data, REQ_OP_READ, 0); if (res) goto out; diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c index c359113..d3646c2 100644 --- a/fs/hfsplus/super.c +++ b/fs/hfsplus/super.c @@ -219,7 +219,8 @@ static int hfsplus_sync_fs(struct super_block *sb, int wait) error2 = hfsplus_submit_bio(sb, sbi->part_start + HFSPLUS_VOLHEAD_SECTOR, - sbi->s_vhdr_buf, NULL, WRITE_SYNC); + sbi->s_vhdr_buf, NULL, REQ_OP_WRITE, + WRITE_SYNC); if (!error) error = error2; if (!write_backup) @@ -227,7 +228,8 @@ static int hfsplus_sync_fs(struct super_block *sb, int wait) error2 = hfsplus_submit_bio(sb, sbi->part_start + sbi->sect_count - 2, - sbi->s_backup_vhdr_buf, NULL, WRITE_SYNC); + sbi->s_backup_vhdr_buf, NULL, REQ_OP_WRITE, + WRITE_SYNC); if (!error) error2 = error; out: diff --git a/fs/hfsplus/wrapper.c b/fs/hfsplus/wrapper.c index d026bb3..c5c916d 100644 --- a/fs/hfsplus/wrapper.c +++ b/fs/hfsplus/wrapper.c @@ -30,7 +30,8 @@ struct hfsplus_wd { * @sector: block to read or write, for blocks of HFSPLUS_SECTOR_SIZE bytes * @buf: buffer for I/O * @data: output pointer for location of requested data - * @rw: direction of I/O + * @op: direction of I/O + * @op_flags: request op flags * * The unit of I/O is hfsplus_min_io_size(sb), which may be bigger than * HFSPLUS_SECTOR_SIZE, and @buf must be sized accordingly. On reads @@ -44,7 +45,7 @@ struct hfsplus_wd { * will work correctly. */ int hfsplus_submit_bio(struct super_block *sb, sector_t sector, - void *buf, void **data, int rw) + void *buf, void **data, int op, int op_flags) { struct bio *bio; int ret = 0; @@ -65,9 +66,10 @@ int hfsplus_submit_bio(struct super_block *sb, sector_t sector, bio = bio_alloc(GFP_NOIO, 1); bio->bi_iter.bi_sector = sector; bio->bi_bdev = sb->s_bdev; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; - if (!(rw & WRITE) && data) + if (op != WRITE && data) *data = (u8 *)buf + offset; while (io_size > 0) { @@ -182,7 +184,7 @@ int hfsplus_read_wrapper(struct super_block *sb) reread: error = hfsplus_submit_bio(sb, part_start + HFSPLUS_VOLHEAD_SECTOR, sbi->s_vhdr_buf, (void **)&sbi->s_vhdr, - READ); + REQ_OP_READ, 0); if (error) goto out_free_backup_vhdr; @@ -214,7 +216,8 @@ reread: error = hfsplus_submit_bio(sb, part_start + part_size - 2, sbi->s_backup_vhdr_buf, - (void **)&sbi->s_backup_vhdr, READ); + (void **)&sbi->s_backup_vhdr, REQ_OP_READ, + 0); if (error) goto out_free_backup_vhdr; -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 946D47D07 for ; Wed, 13 Apr 2016 14:37:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 59C778F8035 for ; Wed, 13 Apr 2016 12:37:11 -0700 (PDT) X-ASG-Debug-ID: 1460576229-04cbb02e1b1a0a20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id jMIu1XP6DKTawpoB (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:10 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A4C7E64060; Wed, 13 Apr 2016 19:37:09 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9B018278; Wed, 13 Apr 2016 15:37:07 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 15/42] mpage: set bi_op to REQ_OP Date: Wed, 13 Apr 2016 14:36:01 -0500 X-ASG-Orig-Subj: [PATCH 15/42] mpage: set bi_op to REQ_OP Message-Id: <1460576188-5751-16-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 13 Apr 2016 19:37:09 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460576230 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has mpage.c use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- fs/mpage.c | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/fs/mpage.c b/fs/mpage.c index 2c251ec..89f58f1 100644 --- a/fs/mpage.c +++ b/fs/mpage.c @@ -56,11 +56,12 @@ static void mpage_end_io(struct bio *bio) bio_put(bio); } -static struct bio *mpage_bio_submit(int rw, struct bio *bio) +static struct bio *mpage_bio_submit(int op, int op_flags, struct bio *bio) { bio->bi_end_io = mpage_end_io; - bio->bi_rw = rw; - guard_bio_eod(rw, bio); + bio->bi_op = op; + bio->bi_rw = op_flags; + guard_bio_eod(op, bio); submit_bio(bio); return NULL; } @@ -270,7 +271,7 @@ do_mpage_readpage(struct bio *bio, struct page *page, unsigned nr_pages, * This page will go to BIO. Do we need to send this BIO off first? */ if (bio && (*last_block_in_bio != blocks[0] - 1)) - bio = mpage_bio_submit(READ, bio); + bio = mpage_bio_submit(REQ_OP_READ, 0, bio); alloc_new: if (bio == NULL) { @@ -287,7 +288,7 @@ alloc_new: length = first_hole << blkbits; if (bio_add_page(bio, page, length, 0) < length) { - bio = mpage_bio_submit(READ, bio); + bio = mpage_bio_submit(REQ_OP_READ, 0, bio); goto alloc_new; } @@ -295,7 +296,7 @@ alloc_new: nblocks = map_bh->b_size >> blkbits; if ((buffer_boundary(map_bh) && relative_block == nblocks) || (first_hole != blocks_per_page)) - bio = mpage_bio_submit(READ, bio); + bio = mpage_bio_submit(REQ_OP_READ, 0, bio); else *last_block_in_bio = blocks[blocks_per_page - 1]; out: @@ -303,7 +304,7 @@ out: confused: if (bio) - bio = mpage_bio_submit(READ, bio); + bio = mpage_bio_submit(REQ_OP_READ, 0, bio); if (!PageUptodate(page)) block_read_full_page(page, get_block); else @@ -385,7 +386,7 @@ mpage_readpages(struct address_space *mapping, struct list_head *pages, } BUG_ON(!list_empty(pages)); if (bio) - mpage_bio_submit(READ, bio); + mpage_bio_submit(REQ_OP_READ, 0, bio); return 0; } EXPORT_SYMBOL(mpage_readpages); @@ -406,7 +407,7 @@ int mpage_readpage(struct page *page, get_block_t get_block) bio = do_mpage_readpage(bio, page, 1, &last_block_in_bio, &map_bh, &first_logical_block, get_block, gfp); if (bio) - mpage_bio_submit(READ, bio); + mpage_bio_submit(REQ_OP_READ, 0, bio); return 0; } EXPORT_SYMBOL(mpage_readpage); @@ -487,7 +488,7 @@ static int __mpage_writepage(struct page *page, struct writeback_control *wbc, struct buffer_head map_bh; loff_t i_size = i_size_read(inode); int ret = 0; - int wr = (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE); + int op_flags = (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : 0); if (page_has_buffers(page)) { struct buffer_head *head = page_buffers(page); @@ -596,7 +597,7 @@ page_is_mapped: * This page will go to BIO. Do we need to send this BIO off first? */ if (bio && mpd->last_block_in_bio != blocks[0] - 1) - bio = mpage_bio_submit(wr, bio); + bio = mpage_bio_submit(REQ_OP_WRITE, op_flags, bio); alloc_new: if (bio == NULL) { @@ -623,7 +624,7 @@ alloc_new: wbc_account_io(wbc, page, PAGE_SIZE); length = first_unmapped << blkbits; if (bio_add_page(bio, page, length, 0) < length) { - bio = mpage_bio_submit(wr, bio); + bio = mpage_bio_submit(REQ_OP_WRITE, op_flags, bio); goto alloc_new; } @@ -633,7 +634,7 @@ alloc_new: set_page_writeback(page); unlock_page(page); if (boundary || (first_unmapped != blocks_per_page)) { - bio = mpage_bio_submit(wr, bio); + bio = mpage_bio_submit(REQ_OP_WRITE, op_flags, bio); if (boundary_block) { write_boundary_block(boundary_bdev, boundary_block, 1 << blkbits); @@ -645,7 +646,7 @@ alloc_new: confused: if (bio) - bio = mpage_bio_submit(wr, bio); + bio = mpage_bio_submit(REQ_OP_WRITE, op_flags, bio); if (mpd->use_writepage) { ret = mapping->a_ops->writepage(page, wbc); @@ -702,9 +703,9 @@ mpage_writepages(struct address_space *mapping, ret = write_cache_pages(mapping, wbc, __mpage_writepage, &mpd); if (mpd.bio) { - int wr = (wbc->sync_mode == WB_SYNC_ALL ? - WRITE_SYNC : WRITE); - mpage_bio_submit(wr, mpd.bio); + int op_flags = (wbc->sync_mode == WB_SYNC_ALL ? + WRITE_SYNC : 0); + mpage_bio_submit(REQ_OP_WRITE, op_flags, mpd.bio); } } blk_finish_plug(&plug); @@ -723,9 +724,9 @@ int mpage_writepage(struct page *page, get_block_t get_block, }; int ret = __mpage_writepage(page, wbc, &mpd); if (mpd.bio) { - int wr = (wbc->sync_mode == WB_SYNC_ALL ? - WRITE_SYNC : WRITE); - mpage_bio_submit(wr, mpd.bio); + int op_flags = (wbc->sync_mode == WB_SYNC_ALL ? + WRITE_SYNC : 0); + mpage_bio_submit(REQ_OP_WRITE, op_flags, mpd.bio); } return ret; } -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 86BB87CD4 for ; Wed, 13 Apr 2016 14:37:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0001EAC004 for ; Wed, 13 Apr 2016 12:37:13 -0700 (PDT) X-ASG-Debug-ID: 1460576232-04cbb02e1d1a0a50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BOa03hSRzxP3o2XB (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:12 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0ED317AE9D; Wed, 13 Apr 2016 19:37:12 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9C018278; Wed, 13 Apr 2016 15:37:09 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 16/42] nilfs: set bi_op to REQ_OP Date: Wed, 13 Apr 2016 14:36:02 -0500 X-ASG-Orig-Subj: [PATCH 16/42] nilfs: set bi_op to REQ_OP Message-Id: <1460576188-5751-17-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576232 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has nilfs use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- fs/nilfs2/segbuf.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/fs/nilfs2/segbuf.c b/fs/nilfs2/segbuf.c index 7666f1d..7b13e14 100644 --- a/fs/nilfs2/segbuf.c +++ b/fs/nilfs2/segbuf.c @@ -350,7 +350,8 @@ static void nilfs_end_bio_write(struct bio *bio) } static int nilfs_segbuf_submit_bio(struct nilfs_segment_buffer *segbuf, - struct nilfs_write_info *wi, int mode) + struct nilfs_write_info *wi, int mode, + int mode_flags) { struct bio *bio = wi->bio; int err; @@ -368,7 +369,8 @@ static int nilfs_segbuf_submit_bio(struct nilfs_segment_buffer *segbuf, bio->bi_end_io = nilfs_end_bio_write; bio->bi_private = segbuf; - bio->bi_rw = mode; + bio->bi_op = mode; + bio->bi_rw = mode_flags; submit_bio(bio); segbuf->sb_nbio++; @@ -442,7 +444,7 @@ static int nilfs_segbuf_submit_bh(struct nilfs_segment_buffer *segbuf, return 0; } /* bio is FULL */ - err = nilfs_segbuf_submit_bio(segbuf, wi, mode); + err = nilfs_segbuf_submit_bio(segbuf, wi, mode, 0); /* never submit current bh */ if (likely(!err)) goto repeat; @@ -466,19 +468,19 @@ static int nilfs_segbuf_write(struct nilfs_segment_buffer *segbuf, { struct nilfs_write_info wi; struct buffer_head *bh; - int res = 0, rw = WRITE; + int res = 0; wi.nilfs = nilfs; nilfs_segbuf_prepare_write(segbuf, &wi); list_for_each_entry(bh, &segbuf->sb_segsum_buffers, b_assoc_buffers) { - res = nilfs_segbuf_submit_bh(segbuf, &wi, bh, rw); + res = nilfs_segbuf_submit_bh(segbuf, &wi, bh, REQ_OP_WRITE); if (unlikely(res)) goto failed_bio; } list_for_each_entry(bh, &segbuf->sb_payload_buffers, b_assoc_buffers) { - res = nilfs_segbuf_submit_bh(segbuf, &wi, bh, rw); + res = nilfs_segbuf_submit_bh(segbuf, &wi, bh, REQ_OP_WRITE); if (unlikely(res)) goto failed_bio; } @@ -488,8 +490,8 @@ static int nilfs_segbuf_write(struct nilfs_segment_buffer *segbuf, * Last BIO is always sent through the following * submission. */ - rw |= REQ_SYNC; - res = nilfs_segbuf_submit_bio(segbuf, &wi, rw); + res = nilfs_segbuf_submit_bio(segbuf, &wi, REQ_OP_WRITE, + REQ_SYNC); } failed_bio: -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4FB6C7D11 for ; Wed, 13 Apr 2016 14:37:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C5771AC004 for ; Wed, 13 Apr 2016 12:37:15 -0700 (PDT) X-ASG-Debug-ID: 1460576234-04bdf011054b32a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id jXThjHJhv3hR5mBv (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:14 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6161F85542; Wed, 13 Apr 2016 19:37:14 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9D018278; Wed, 13 Apr 2016 15:37:12 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 17/42] ocfs2: set bi_op to REQ_OP Date: Wed, 13 Apr 2016 14:36:03 -0500 X-ASG-Orig-Subj: [PATCH 17/42] ocfs2: set bi_op to REQ_OP Message-Id: <1460576188-5751-18-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576234 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has ocfs2 use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- fs/ocfs2/cluster/heartbeat.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c index e37373d..0619a20 100644 --- a/fs/ocfs2/cluster/heartbeat.c +++ b/fs/ocfs2/cluster/heartbeat.c @@ -530,7 +530,8 @@ static void o2hb_bio_end_io(struct bio *bio) static struct bio *o2hb_setup_one_bio(struct o2hb_region *reg, struct o2hb_bio_wait_ctxt *wc, unsigned int *current_slot, - unsigned int max_slots, int rw) + unsigned int max_slots, int op, + int op_flags) { int len, current_page; unsigned int vec_len, vec_start; @@ -556,7 +557,8 @@ static struct bio *o2hb_setup_one_bio(struct o2hb_region *reg, bio->bi_bdev = reg->hr_bdev; bio->bi_private = wc; bio->bi_end_io = o2hb_bio_end_io; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; vec_start = (cs << bits) % PAGE_SIZE; while(cs < max_slots) { @@ -593,7 +595,7 @@ static int o2hb_read_slots(struct o2hb_region *reg, while(current_slot < max_slots) { bio = o2hb_setup_one_bio(reg, &wc, ¤t_slot, max_slots, - READ); + REQ_OP_READ, 0); if (IS_ERR(bio)) { status = PTR_ERR(bio); mlog_errno(status); @@ -625,7 +627,8 @@ static int o2hb_issue_node_write(struct o2hb_region *reg, slot = o2nm_this_node(); - bio = o2hb_setup_one_bio(reg, write_wc, &slot, slot+1, WRITE_SYNC); + bio = o2hb_setup_one_bio(reg, write_wc, &slot, slot+1, REQ_OP_WRITE, + WRITE_SYNC); if (IS_ERR(bio)) { status = PTR_ERR(bio); mlog_errno(status); -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 728557D14 for ; Wed, 13 Apr 2016 14:37:18 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1592E8F8049 for ; Wed, 13 Apr 2016 12:37:18 -0700 (PDT) X-ASG-Debug-ID: 1460576236-04bdf011044b32b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id XX6WHRNiyDSFNkEH (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:16 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9614280086; Wed, 13 Apr 2016 19:37:16 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9E018278; Wed, 13 Apr 2016 15:37:14 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 18/42] pm: set bi_op to REQ_OP Date: Wed, 13 Apr 2016 14:36:04 -0500 X-ASG-Orig-Subj: [PATCH 18/42] pm: set bi_op to REQ_OP Message-Id: <1460576188-5751-19-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576236 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has the pm code use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- kernel/power/swap.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/kernel/power/swap.c b/kernel/power/swap.c index 4d050eb..adbcb1b 100644 --- a/kernel/power/swap.c +++ b/kernel/power/swap.c @@ -250,7 +250,7 @@ static void hib_end_io(struct bio *bio) bio_put(bio); } -static int hib_submit_io(int rw, pgoff_t page_off, void *addr, +static int hib_submit_io(int op, int op_flags, pgoff_t page_off, void *addr, struct hib_bio_batch *hb) { struct page *page = virt_to_page(addr); @@ -260,7 +260,8 @@ static int hib_submit_io(int rw, pgoff_t page_off, void *addr, bio = bio_alloc(__GFP_RECLAIM | __GFP_HIGH, 1); bio->bi_iter.bi_sector = page_off * (PAGE_SIZE >> 9); bio->bi_bdev = hib_resume_bdev; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) { printk(KERN_ERR "PM: Adding page to bio failed at %llu\n", @@ -296,7 +297,8 @@ static int mark_swapfiles(struct swap_map_handle *handle, unsigned int flags) { int error; - hib_submit_io(READ_SYNC, swsusp_resume_block, swsusp_header, NULL); + hib_submit_io(REQ_OP_READ, READ_SYNC, swsusp_resume_block, + swsusp_header, NULL); if (!memcmp("SWAP-SPACE",swsusp_header->sig, 10) || !memcmp("SWAPSPACE2",swsusp_header->sig, 10)) { memcpy(swsusp_header->orig_sig,swsusp_header->sig, 10); @@ -305,8 +307,8 @@ static int mark_swapfiles(struct swap_map_handle *handle, unsigned int flags) swsusp_header->flags = flags; if (flags & SF_CRC32_MODE) swsusp_header->crc32 = handle->crc32; - error = hib_submit_io(WRITE_SYNC, swsusp_resume_block, - swsusp_header, NULL); + error = hib_submit_io(REQ_OP_WRITE, WRITE_SYNC, + swsusp_resume_block, swsusp_header, NULL); } else { printk(KERN_ERR "PM: Swap header not found!\n"); error = -ENODEV; @@ -379,7 +381,7 @@ static int write_page(void *buf, sector_t offset, struct hib_bio_batch *hb) } else { src = buf; } - return hib_submit_io(WRITE_SYNC, offset, src, hb); + return hib_submit_io(REQ_OP_WRITE, WRITE_SYNC, offset, src, hb); } static void release_swap_writer(struct swap_map_handle *handle) @@ -982,7 +984,8 @@ static int get_swap_reader(struct swap_map_handle *handle, return -ENOMEM; } - error = hib_submit_io(READ_SYNC, offset, tmp->map, NULL); + error = hib_submit_io(REQ_OP_READ, READ_SYNC, offset, + tmp->map, NULL); if (error) { release_swap_reader(handle); return error; @@ -1006,7 +1009,7 @@ static int swap_read_page(struct swap_map_handle *handle, void *buf, offset = handle->cur->entries[handle->k]; if (!offset) return -EFAULT; - error = hib_submit_io(READ_SYNC, offset, buf, hb); + error = hib_submit_io(REQ_OP_READ, READ_SYNC, offset, buf, hb); if (error) return error; if (++handle->k >= MAP_PAGE_ENTRIES) { @@ -1508,7 +1511,8 @@ int swsusp_check(void) if (!IS_ERR(hib_resume_bdev)) { set_blocksize(hib_resume_bdev, PAGE_SIZE); clear_page(swsusp_header); - error = hib_submit_io(READ_SYNC, swsusp_resume_block, + error = hib_submit_io(REQ_OP_READ, READ_SYNC, + swsusp_resume_block, swsusp_header, NULL); if (error) goto put; @@ -1516,7 +1520,8 @@ int swsusp_check(void) if (!memcmp(HIBERNATE_SIG, swsusp_header->sig, 10)) { memcpy(swsusp_header->sig, swsusp_header->orig_sig, 10); /* Reset swap signature now */ - error = hib_submit_io(WRITE_SYNC, swsusp_resume_block, + error = hib_submit_io(REQ_OP_WRITE, WRITE_SYNC, + swsusp_resume_block, swsusp_header, NULL); } else { error = -EINVAL; @@ -1560,10 +1565,12 @@ int swsusp_unmark(void) { int error; - hib_submit_io(READ_SYNC, swsusp_resume_block, swsusp_header, NULL); + hib_submit_io(REQ_OP_READ, READ_SYNC, swsusp_resume_block, + swsusp_header, NULL); if (!memcmp(HIBERNATE_SIG,swsusp_header->sig, 10)) { memcpy(swsusp_header->sig,swsusp_header->orig_sig, 10); - error = hib_submit_io(WRITE_SYNC, swsusp_resume_block, + error = hib_submit_io(REQ_OP_WRITE, WRITE_SYNC, + swsusp_resume_block, swsusp_header, NULL); } else { printk(KERN_ERR "PM: Cannot find swsusp signature!\n"); -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 42DDC7CEA for ; Wed, 13 Apr 2016 14:37:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id BB5F6AC005 for ; Wed, 13 Apr 2016 12:37:25 -0700 (PDT) X-ASG-Debug-ID: 1460576241-04bdf011054b32d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id tRintlO4dtdeYyZb (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:21 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2618C62652; Wed, 13 Apr 2016 19:37:21 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9G018278; Wed, 13 Apr 2016 15:37:18 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 20/42] dm: pass dm stats data dir instead of bi_rw Date: Wed, 13 Apr 2016 14:36:06 -0500 X-ASG-Orig-Subj: [PATCH 20/42] dm: pass dm stats data dir instead of bi_rw Message-Id: <1460576188-5751-21-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Wed, 13 Apr 2016 19:37:21 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460576241 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com From: Mike Christie It looks like dm stats cares about the data direction (READ vs WRITE) and does not need the bio/request flags. Commands like REQ_FLUSH, REQ_DISCARD and REQ_WRITE_SAME are currently always set with REQ_WRITE, so the extra check for REQ_DISCARD in dm_stats_account_io is not needed. This patch has it use the bio and request data_dir helpers instead of accessing the bi_rw/cmd_flags directly. This makes the next patches that remove the operation from the cmd_flags and bi_rw easier, because we will no longer have the REQ_WRITE bit set for operations like discards. This patch is compile tested only. v2: 1. Merged Mike Snitzer's fixes to pass in int instead of unsigned long. 2. Fix 80 char col issues. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- drivers/md/dm-stats.c | 9 ++++----- drivers/md/dm.c | 21 ++++++++++++--------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/drivers/md/dm-stats.c b/drivers/md/dm-stats.c index 8289804..4fba26c 100644 --- a/drivers/md/dm-stats.c +++ b/drivers/md/dm-stats.c @@ -514,11 +514,10 @@ static void dm_stat_round(struct dm_stat *s, struct dm_stat_shared *shared, } static void dm_stat_for_entry(struct dm_stat *s, size_t entry, - unsigned long bi_rw, sector_t len, + int idx, sector_t len, struct dm_stats_aux *stats_aux, bool end, unsigned long duration_jiffies) { - unsigned long idx = bi_rw & REQ_WRITE; struct dm_stat_shared *shared = &s->stat_shared[entry]; struct dm_stat_percpu *p; @@ -584,7 +583,7 @@ static void dm_stat_for_entry(struct dm_stat *s, size_t entry, #endif } -static void __dm_stat_bio(struct dm_stat *s, unsigned long bi_rw, +static void __dm_stat_bio(struct dm_stat *s, int bi_rw, sector_t bi_sector, sector_t end_sector, bool end, unsigned long duration_jiffies, struct dm_stats_aux *stats_aux) @@ -645,8 +644,8 @@ void dm_stats_account_io(struct dm_stats *stats, unsigned long bi_rw, last = raw_cpu_ptr(stats->last); stats_aux->merged = (bi_sector == (ACCESS_ONCE(last->last_sector) && - ((bi_rw & (REQ_WRITE | REQ_DISCARD)) == - (ACCESS_ONCE(last->last_rw) & (REQ_WRITE | REQ_DISCARD))) + ((bi_rw == WRITE) == + (ACCESS_ONCE(last->last_rw) == WRITE)) )); ACCESS_ONCE(last->last_sector) = end_sector; ACCESS_ONCE(last->last_rw) = bi_rw; diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 5432da7..98fea0e 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -723,8 +723,9 @@ static void start_io_acct(struct dm_io *io) atomic_inc_return(&md->pending[rw])); if (unlikely(dm_stats_used(&md->stats))) - dm_stats_account_io(&md->stats, bio->bi_rw, bio->bi_iter.bi_sector, - bio_sectors(bio), false, 0, &io->stats_aux); + dm_stats_account_io(&md->stats, bio_data_dir(bio), + bio->bi_iter.bi_sector, bio_sectors(bio), + false, 0, &io->stats_aux); } static void end_io_acct(struct dm_io *io) @@ -738,8 +739,9 @@ static void end_io_acct(struct dm_io *io) generic_end_io_acct(rw, &dm_disk(md)->part0, io->start_time); if (unlikely(dm_stats_used(&md->stats))) - dm_stats_account_io(&md->stats, bio->bi_rw, bio->bi_iter.bi_sector, - bio_sectors(bio), true, duration, &io->stats_aux); + dm_stats_account_io(&md->stats, bio_data_dir(bio), + bio->bi_iter.bi_sector, bio_sectors(bio), + true, duration, &io->stats_aux); /* * After this is decremented the bio must not be touched if it is @@ -1121,9 +1123,9 @@ static void rq_end_stats(struct mapped_device *md, struct request *orig) if (unlikely(dm_stats_used(&md->stats))) { struct dm_rq_target_io *tio = tio_from_request(orig); tio->duration_jiffies = jiffies - tio->duration_jiffies; - dm_stats_account_io(&md->stats, orig->cmd_flags, blk_rq_pos(orig), - tio->n_sectors, true, tio->duration_jiffies, - &tio->stats_aux); + dm_stats_account_io(&md->stats, rq_data_dir(orig), + blk_rq_pos(orig), tio->n_sectors, true, + tio->duration_jiffies, &tio->stats_aux); } } @@ -2082,8 +2084,9 @@ static void dm_start_request(struct mapped_device *md, struct request *orig) struct dm_rq_target_io *tio = tio_from_request(orig); tio->duration_jiffies = jiffies; tio->n_sectors = blk_rq_sectors(orig); - dm_stats_account_io(&md->stats, orig->cmd_flags, blk_rq_pos(orig), - tio->n_sectors, false, 0, &tio->stats_aux); + dm_stats_account_io(&md->stats, rq_data_dir(orig), + blk_rq_pos(orig), tio->n_sectors, false, 0, + &tio->stats_aux); } /* -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 769D27D16 for ; Wed, 13 Apr 2016 14:37:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0C73B304059 for ; Wed, 13 Apr 2016 12:37:25 -0700 (PDT) X-ASG-Debug-ID: 1460576239-04bdf011044b32c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ghHSMEl94WL23Pc0 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:19 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D7A933B752; Wed, 13 Apr 2016 19:37:18 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9F018278; Wed, 13 Apr 2016 15:37:16 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 19/42] dm: set bi_op to REQ_OP Date: Wed, 13 Apr 2016 14:36:05 -0500 X-ASG-Orig-Subj: [PATCH 19/42] dm: set bi_op to REQ_OP Message-Id: <1460576188-5751-20-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576239 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has dm use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- drivers/md/dm-bufio.c | 8 +++--- drivers/md/dm-crypt.c | 1 + drivers/md/dm-io.c | 57 ++++++++++++++++++++++------------------- drivers/md/dm-kcopyd.c | 25 +++++++++--------- drivers/md/dm-log-writes.c | 6 ++--- drivers/md/dm-log.c | 5 ++-- drivers/md/dm-raid1.c | 11 +++++--- drivers/md/dm-snap-persistent.c | 24 +++++++++-------- drivers/md/dm-thin.c | 7 ++--- drivers/md/dm.c | 1 + include/linux/dm-io.h | 3 ++- 11 files changed, 82 insertions(+), 66 deletions(-) diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c index 9d3ee7f..b6055f2 100644 --- a/drivers/md/dm-bufio.c +++ b/drivers/md/dm-bufio.c @@ -574,7 +574,8 @@ static void use_dmio(struct dm_buffer *b, int rw, sector_t block, { int r; struct dm_io_request io_req = { - .bi_rw = rw, + .bi_op = rw, + .bi_op_flags = 0, .notify.fn = dmio_complete, .notify.context = b, .client = b->c->dm_io, @@ -634,7 +635,7 @@ static void use_inline_bio(struct dm_buffer *b, int rw, sector_t block, * the dm_buffer's inline bio is local to bufio. */ b->bio.bi_private = end_io; - b->bio.bi_rw = rw; + b->bio.bi_op = rw; /* * We assume that if len >= PAGE_SIZE ptr is page-aligned. @@ -1327,7 +1328,8 @@ EXPORT_SYMBOL_GPL(dm_bufio_write_dirty_buffers); int dm_bufio_issue_flush(struct dm_bufio_client *c) { struct dm_io_request io_req = { - .bi_rw = WRITE_FLUSH, + .bi_op = REQ_OP_WRITE, + .bi_op_flags = WRITE_FLUSH, .mem.type = DM_IO_KMEM, .mem.ptr.addr = NULL, .client = c->dm_io, diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index 4f3cb35..70fbf11 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c @@ -1136,6 +1136,7 @@ static void clone_init(struct dm_crypt_io *io, struct bio *clone) clone->bi_private = io; clone->bi_end_io = crypt_endio; clone->bi_bdev = cc->dev->bdev; + clone->bi_op = io->base_bio->bi_op; clone->bi_rw = io->base_bio->bi_rw; } diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c index 50f17e3..0f723ca 100644 --- a/drivers/md/dm-io.c +++ b/drivers/md/dm-io.c @@ -278,8 +278,9 @@ static void km_dp_init(struct dpages *dp, void *data) /*----------------------------------------------------------------- * IO routines that accept a list of pages. *---------------------------------------------------------------*/ -static void do_region(int rw, unsigned region, struct dm_io_region *where, - struct dpages *dp, struct io *io) +static void do_region(int op, int op_flags, unsigned region, + struct dm_io_region *where, struct dpages *dp, + struct io *io) { struct bio *bio; struct page *page; @@ -295,24 +296,25 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, /* * Reject unsupported discard and write same requests. */ - if (rw & REQ_DISCARD) + if (op == REQ_OP_DISCARD) special_cmd_max_sectors = q->limits.max_discard_sectors; - else if (rw & REQ_WRITE_SAME) + else if (op == REQ_OP_WRITE_SAME) special_cmd_max_sectors = q->limits.max_write_same_sectors; - if ((rw & (REQ_DISCARD | REQ_WRITE_SAME)) && special_cmd_max_sectors == 0) { + if ((op == REQ_OP_DISCARD || op == REQ_OP_WRITE_SAME) && + special_cmd_max_sectors == 0) { dec_count(io, region, -EOPNOTSUPP); return; } /* - * where->count may be zero if rw holds a flush and we need to + * where->count may be zero if op holds a flush and we need to * send a zero-sized flush. */ do { /* * Allocate a suitably sized-bio. */ - if ((rw & REQ_DISCARD) || (rw & REQ_WRITE_SAME)) + if ((op == REQ_OP_DISCARD) || (op == REQ_OP_WRITE_SAME)) num_bvecs = 1; else num_bvecs = min_t(int, BIO_MAX_PAGES, @@ -322,14 +324,15 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, bio->bi_iter.bi_sector = where->sector + (where->count - remaining); bio->bi_bdev = where->bdev; bio->bi_end_io = endio; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; store_io_and_region_in_bio(bio, io, region); - if (rw & REQ_DISCARD) { + if (op == REQ_OP_DISCARD) { num_sectors = min_t(sector_t, special_cmd_max_sectors, remaining); bio->bi_iter.bi_size = num_sectors << SECTOR_SHIFT; remaining -= num_sectors; - } else if (rw & REQ_WRITE_SAME) { + } else if (op == REQ_OP_WRITE_SAME) { /* * WRITE SAME only uses a single page. */ @@ -360,7 +363,7 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, } while (remaining); } -static void dispatch_io(int rw, unsigned int num_regions, +static void dispatch_io(int op, int op_flags, unsigned int num_regions, struct dm_io_region *where, struct dpages *dp, struct io *io, int sync) { @@ -370,7 +373,7 @@ static void dispatch_io(int rw, unsigned int num_regions, BUG_ON(num_regions > DM_IO_MAX_REGIONS); if (sync) - rw |= REQ_SYNC; + op_flags |= REQ_SYNC; /* * For multiple regions we need to be careful to rewind @@ -378,8 +381,8 @@ static void dispatch_io(int rw, unsigned int num_regions, */ for (i = 0; i < num_regions; i++) { *dp = old_pages; - if (where[i].count || (rw & REQ_FLUSH)) - do_region(rw, i, where + i, dp, io); + if (where[i].count || (op_flags & REQ_FLUSH)) + do_region(op, op_flags, i, where + i, dp, io); } /* @@ -403,13 +406,13 @@ static void sync_io_complete(unsigned long error, void *context) } static int sync_io(struct dm_io_client *client, unsigned int num_regions, - struct dm_io_region *where, int rw, struct dpages *dp, - unsigned long *error_bits) + struct dm_io_region *where, int op, int op_flags, + struct dpages *dp, unsigned long *error_bits) { struct io *io; struct sync_io sio; - if (num_regions > 1 && (rw & RW_MASK) != WRITE) { + if (num_regions > 1 && !op_is_write(op)) { WARN_ON(1); return -EIO; } @@ -426,7 +429,7 @@ static int sync_io(struct dm_io_client *client, unsigned int num_regions, io->vma_invalidate_address = dp->vma_invalidate_address; io->vma_invalidate_size = dp->vma_invalidate_size; - dispatch_io(rw, num_regions, where, dp, io, 1); + dispatch_io(op, op_flags, num_regions, where, dp, io, 1); wait_for_completion_io(&sio.wait); @@ -437,12 +440,12 @@ static int sync_io(struct dm_io_client *client, unsigned int num_regions, } static int async_io(struct dm_io_client *client, unsigned int num_regions, - struct dm_io_region *where, int rw, struct dpages *dp, - io_notify_fn fn, void *context) + struct dm_io_region *where, int op, int op_flags, + struct dpages *dp, io_notify_fn fn, void *context) { struct io *io; - if (num_regions > 1 && (rw & RW_MASK) != WRITE) { + if (num_regions > 1 && !op_is_write(op)) { WARN_ON(1); fn(1, context); return -EIO; @@ -458,7 +461,7 @@ static int async_io(struct dm_io_client *client, unsigned int num_regions, io->vma_invalidate_address = dp->vma_invalidate_address; io->vma_invalidate_size = dp->vma_invalidate_size; - dispatch_io(rw, num_regions, where, dp, io, 0); + dispatch_io(op, op_flags, num_regions, where, dp, io, 0); return 0; } @@ -481,7 +484,7 @@ static int dp_init(struct dm_io_request *io_req, struct dpages *dp, case DM_IO_VMA: flush_kernel_vmap_range(io_req->mem.ptr.vma, size); - if ((io_req->bi_rw & RW_MASK) == READ) { + if (io_req->bi_op == REQ_OP_READ) { dp->vma_invalidate_address = io_req->mem.ptr.vma; dp->vma_invalidate_size = size; } @@ -519,10 +522,12 @@ int dm_io(struct dm_io_request *io_req, unsigned num_regions, if (!io_req->notify.fn) return sync_io(io_req->client, num_regions, where, - io_req->bi_rw, &dp, sync_error_bits); + io_req->bi_op, io_req->bi_op_flags, &dp, + sync_error_bits); - return async_io(io_req->client, num_regions, where, io_req->bi_rw, - &dp, io_req->notify.fn, io_req->notify.context); + return async_io(io_req->client, num_regions, where, io_req->bi_op, + io_req->bi_op_flags, &dp, io_req->notify.fn, + io_req->notify.context); } EXPORT_SYMBOL(dm_io); diff --git a/drivers/md/dm-kcopyd.c b/drivers/md/dm-kcopyd.c index 1452ed9..4182bc7d 100644 --- a/drivers/md/dm-kcopyd.c +++ b/drivers/md/dm-kcopyd.c @@ -465,10 +465,10 @@ static void complete_io(unsigned long error, void *context) io_job_finish(kc->throttle); if (error) { - if (job->rw & WRITE) - job->write_err |= error; - else + if (job->rw == READ) job->read_err = 1; + else + job->write_err |= error; if (!test_bit(DM_KCOPYD_IGNORE_ERROR, &job->flags)) { push(&kc->complete_jobs, job); @@ -477,13 +477,11 @@ static void complete_io(unsigned long error, void *context) } } - if (job->rw & WRITE) - push(&kc->complete_jobs, job); - - else { + if (job->rw == READ) { job->rw = WRITE; push(&kc->io_jobs, job); - } + } else + push(&kc->complete_jobs, job); wake(kc); } @@ -496,7 +494,8 @@ static int run_io_job(struct kcopyd_job *job) { int r; struct dm_io_request io_req = { - .bi_rw = job->rw, + .bi_op = job->rw, + .bi_op_flags = 0, .mem.type = DM_IO_PAGE_LIST, .mem.ptr.pl = job->pages, .mem.offset = 0, @@ -550,10 +549,10 @@ static int process_jobs(struct list_head *jobs, struct dm_kcopyd_client *kc, if (r < 0) { /* error this rogue job */ - if (job->rw & WRITE) - job->write_err = (unsigned long) -1L; - else + if (job->rw == READ) job->read_err = 1; + else + job->write_err = (unsigned long) -1L; push(&kc->complete_jobs, job); break; } @@ -734,7 +733,7 @@ int dm_kcopyd_copy(struct dm_kcopyd_client *kc, struct dm_io_region *from, /* * Use WRITE SAME to optimize zeroing if all dests support it. */ - job->rw = WRITE | REQ_WRITE_SAME; + job->rw = REQ_OP_WRITE_SAME; for (i = 0; i < job->num_dests; i++) if (!bdev_write_same(job->dests[i].bdev)) { job->rw = WRITE; diff --git a/drivers/md/dm-log-writes.c b/drivers/md/dm-log-writes.c index addcc4b..27630c5 100644 --- a/drivers/md/dm-log-writes.c +++ b/drivers/md/dm-log-writes.c @@ -205,7 +205,7 @@ static int write_metadata(struct log_writes_c *lc, void *entry, bio->bi_bdev = lc->logdev->bdev; bio->bi_end_io = log_end_io; bio->bi_private = lc; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; page = alloc_page(GFP_KERNEL); if (!page) { @@ -270,7 +270,7 @@ static int log_one_block(struct log_writes_c *lc, bio->bi_bdev = lc->logdev->bdev; bio->bi_end_io = log_end_io; bio->bi_private = lc; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; for (i = 0; i < block->vec_cnt; i++) { /* @@ -292,7 +292,7 @@ static int log_one_block(struct log_writes_c *lc, bio->bi_bdev = lc->logdev->bdev; bio->bi_end_io = log_end_io; bio->bi_private = lc; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; ret = bio_add_page(bio, block->vecs[i].bv_page, block->vecs[i].bv_len, 0); diff --git a/drivers/md/dm-log.c b/drivers/md/dm-log.c index 627d191..4ca2d1d 100644 --- a/drivers/md/dm-log.c +++ b/drivers/md/dm-log.c @@ -293,7 +293,7 @@ static void header_from_disk(struct log_header_core *core, struct log_header_dis static int rw_header(struct log_c *lc, int rw) { - lc->io_req.bi_rw = rw; + lc->io_req.bi_op = rw; return dm_io(&lc->io_req, 1, &lc->header_location, NULL); } @@ -306,7 +306,8 @@ static int flush_header(struct log_c *lc) .count = 0, }; - lc->io_req.bi_rw = WRITE_FLUSH; + lc->io_req.bi_op = REQ_OP_WRITE; + lc->io_req.bi_op_flags = WRITE_FLUSH; return dm_io(&lc->io_req, 1, &null_location, NULL); } diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c index b3ccf1e..8a86bc3 100644 --- a/drivers/md/dm-raid1.c +++ b/drivers/md/dm-raid1.c @@ -260,7 +260,8 @@ static int mirror_flush(struct dm_target *ti) struct dm_io_region io[ms->nr_mirrors]; struct mirror *m; struct dm_io_request io_req = { - .bi_rw = WRITE_FLUSH, + .bi_op = REQ_OP_WRITE, + .bi_op_flags = WRITE_FLUSH, .mem.type = DM_IO_KMEM, .mem.ptr.addr = NULL, .client = ms->io_client, @@ -541,7 +542,8 @@ static void read_async_bio(struct mirror *m, struct bio *bio) { struct dm_io_region io; struct dm_io_request io_req = { - .bi_rw = READ, + .bi_op = REQ_OP_READ, + .bi_op_flags = 0, .mem.type = DM_IO_BIO, .mem.ptr.bio = bio, .notify.fn = read_callback, @@ -654,7 +656,8 @@ static void do_write(struct mirror_set *ms, struct bio *bio) struct dm_io_region io[ms->nr_mirrors], *dest = io; struct mirror *m; struct dm_io_request io_req = { - .bi_rw = WRITE | (bio->bi_rw & WRITE_FLUSH_FUA), + .bi_op = REQ_OP_WRITE, + .bi_op_flags = bio->bi_rw & WRITE_FLUSH_FUA, .mem.type = DM_IO_BIO, .mem.ptr.bio = bio, .notify.fn = write_callback, @@ -663,7 +666,7 @@ static void do_write(struct mirror_set *ms, struct bio *bio) }; if (bio->bi_rw & REQ_DISCARD) { - io_req.bi_rw |= REQ_DISCARD; + io_req.bi_op = REQ_OP_DISCARD; io_req.mem.type = DM_IO_KMEM; io_req.mem.ptr.addr = NULL; } diff --git a/drivers/md/dm-snap-persistent.c b/drivers/md/dm-snap-persistent.c index 4d39093..b8cf956 100644 --- a/drivers/md/dm-snap-persistent.c +++ b/drivers/md/dm-snap-persistent.c @@ -226,8 +226,8 @@ static void do_metadata(struct work_struct *work) /* * Read or write a chunk aligned and sized block of data from a device. */ -static int chunk_io(struct pstore *ps, void *area, chunk_t chunk, int rw, - int metadata) +static int chunk_io(struct pstore *ps, void *area, chunk_t chunk, int op, + int op_flags, int metadata) { struct dm_io_region where = { .bdev = dm_snap_cow(ps->store->snap)->bdev, @@ -235,7 +235,8 @@ static int chunk_io(struct pstore *ps, void *area, chunk_t chunk, int rw, .count = ps->store->chunk_size, }; struct dm_io_request io_req = { - .bi_rw = rw, + .bi_op = op, + .bi_op_flags = op_flags, .mem.type = DM_IO_VMA, .mem.ptr.vma = area, .client = ps->io_client, @@ -281,14 +282,14 @@ static void skip_metadata(struct pstore *ps) * Read or write a metadata area. Remembering to skip the first * chunk which holds the header. */ -static int area_io(struct pstore *ps, int rw) +static int area_io(struct pstore *ps, int op, int op_flags) { int r; chunk_t chunk; chunk = area_location(ps, ps->current_area); - r = chunk_io(ps, ps->area, chunk, rw, 0); + r = chunk_io(ps, ps->area, chunk, op, op_flags, 0); if (r) return r; @@ -302,7 +303,8 @@ static void zero_memory_area(struct pstore *ps) static int zero_disk_area(struct pstore *ps, chunk_t area) { - return chunk_io(ps, ps->zero_area, area_location(ps, area), WRITE, 0); + return chunk_io(ps, ps->zero_area, area_location(ps, area), + REQ_OP_WRITE, 0, 0); } static int read_header(struct pstore *ps, int *new_snapshot) @@ -334,7 +336,7 @@ static int read_header(struct pstore *ps, int *new_snapshot) if (r) return r; - r = chunk_io(ps, ps->header_area, 0, READ, 1); + r = chunk_io(ps, ps->header_area, 0, REQ_OP_READ, 0, 1); if (r) goto bad; @@ -395,7 +397,7 @@ static int write_header(struct pstore *ps) dh->version = cpu_to_le32(ps->version); dh->chunk_size = cpu_to_le32(ps->store->chunk_size); - return chunk_io(ps, ps->header_area, 0, WRITE, 1); + return chunk_io(ps, ps->header_area, 0, REQ_OP_WRITE, 0, 1); } /* @@ -739,7 +741,7 @@ static void persistent_commit_exception(struct dm_exception_store *store, /* * Commit exceptions to disk. */ - if (ps->valid && area_io(ps, WRITE_FLUSH_FUA)) + if (ps->valid && area_io(ps, REQ_OP_WRITE, WRITE_FLUSH_FUA)) ps->valid = 0; /* @@ -779,7 +781,7 @@ static int persistent_prepare_merge(struct dm_exception_store *store, return 0; ps->current_area--; - r = area_io(ps, READ); + r = area_io(ps, REQ_OP_READ, 0); if (r < 0) return r; ps->current_committed = ps->exceptions_per_area; @@ -816,7 +818,7 @@ static int persistent_commit_merge(struct dm_exception_store *store, for (i = 0; i < nr_merged; i++) clear_exception(ps, ps->current_committed - 1 - i); - r = area_io(ps, WRITE_FLUSH_FUA); + r = area_io(ps, REQ_OP_WRITE, WRITE_FLUSH_FUA); if (r < 0) return r; diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index 69d86e1..6049078 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c @@ -339,7 +339,7 @@ static int __blkdev_issue_discard_async(struct block_device *bdev, sector_t sect struct bio *parent_bio) { struct request_queue *q = bdev_get_queue(bdev); - int type = REQ_WRITE | REQ_DISCARD; + int op_flags = 0; struct bio *bio; if (!q || !nr_sects) @@ -351,7 +351,7 @@ static int __blkdev_issue_discard_async(struct block_device *bdev, sector_t sect if (flags & BLKDEV_DISCARD_SECURE) { if (!blk_queue_secdiscard(q)) return -EOPNOTSUPP; - type |= REQ_SECURE; + op_flags |= REQ_SECURE; } /* @@ -366,7 +366,8 @@ static int __blkdev_issue_discard_async(struct block_device *bdev, sector_t sect bio->bi_iter.bi_sector = sector; bio->bi_bdev = bdev; bio->bi_iter.bi_size = nr_sects << 9; - bio->bi_rw = type; + bio->bi_op = REQ_OP_DISCARD; + bio->bi_rw = op_flags; submit_bio(bio); diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 1b2f962..5432da7 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -2412,6 +2412,7 @@ static struct mapped_device *alloc_dev(int minor) bio_init(&md->flush_bio); md->flush_bio.bi_bdev = md->bdev; + md->flush_bio.bi_op = REQ_OP_WRITE; md->flush_bio.bi_rw = WRITE_FLUSH; dm_stats_init(&md->stats); diff --git a/include/linux/dm-io.h b/include/linux/dm-io.h index a68cbe5..b91b023 100644 --- a/include/linux/dm-io.h +++ b/include/linux/dm-io.h @@ -57,7 +57,8 @@ struct dm_io_notify { */ struct dm_io_client; struct dm_io_request { - int bi_rw; /* READ|WRITE - not READA */ + int bi_op; /* REQ_OP */ + int bi_op_flags; /* rq_flag_bits */ struct dm_io_memory mem; /* Memory to use for io */ struct dm_io_notify notify; /* Synchronous if notify.fn is NULL */ struct dm_io_client *client; /* Client memory handler */ -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AD2F37CEA for ; Wed, 13 Apr 2016 14:37:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2F849AC004 for ; Wed, 13 Apr 2016 12:37:27 -0700 (PDT) X-ASG-Debug-ID: 1460576243-04bdf011034b32d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id SRoh708B3SFeCXko (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:23 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 74826201E8; Wed, 13 Apr 2016 19:37:23 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9H018278; Wed, 13 Apr 2016 15:37:21 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 21/42] bcache: set bi_op to REQ_OP Date: Wed, 13 Apr 2016 14:36:07 -0500 X-ASG-Orig-Subj: [PATCH 21/42] bcache: set bi_op to REQ_OP Message-Id: <1460576188-5751-22-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576243 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has bcache use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- drivers/md/bcache/btree.c | 2 ++ drivers/md/bcache/debug.c | 2 ++ drivers/md/bcache/io.c | 2 +- drivers/md/bcache/journal.c | 7 ++++--- drivers/md/bcache/movinggc.c | 2 +- drivers/md/bcache/request.c | 9 +++++---- drivers/md/bcache/super.c | 26 +++++++++++++++----------- drivers/md/bcache/writeback.c | 4 ++-- 8 files changed, 32 insertions(+), 22 deletions(-) diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c index 22b9e34..752a44f 100644 --- a/drivers/md/bcache/btree.c +++ b/drivers/md/bcache/btree.c @@ -295,6 +295,7 @@ static void bch_btree_node_read(struct btree *b) closure_init_stack(&cl); bio = bch_bbio_alloc(b->c); + bio->bi_op = REQ_OP_READ; bio->bi_rw = REQ_META|READ_SYNC; bio->bi_iter.bi_size = KEY_SIZE(&b->key) << 9; bio->bi_end_io = btree_node_read_endio; @@ -397,6 +398,7 @@ static void do_btree_node_write(struct btree *b) b->bio->bi_end_io = btree_node_write_endio; b->bio->bi_private = cl; + b->bio->bi_op = REQ_OP_WRITE; b->bio->bi_rw = REQ_META|WRITE_SYNC|REQ_FUA; b->bio->bi_iter.bi_size = roundup(set_bytes(i), block_bytes(b->c)); bch_bio_map(b->bio, i); diff --git a/drivers/md/bcache/debug.c b/drivers/md/bcache/debug.c index 52b6bcf..8df9e66 100644 --- a/drivers/md/bcache/debug.c +++ b/drivers/md/bcache/debug.c @@ -52,6 +52,7 @@ void bch_btree_verify(struct btree *b) bio->bi_bdev = PTR_CACHE(b->c, &b->key, 0)->bdev; bio->bi_iter.bi_sector = PTR_OFFSET(&b->key, 0); bio->bi_iter.bi_size = KEY_SIZE(&v->key) << 9; + bio->bi_op = REQ_OP_READ; bio->bi_rw = REQ_META|READ_SYNC; bch_bio_map(bio, sorted); @@ -114,6 +115,7 @@ void bch_data_verify(struct cached_dev *dc, struct bio *bio) check = bio_clone(bio, GFP_NOIO); if (!check) return; + check->bi_op = REQ_OP_READ; check->bi_rw |= READ_SYNC; if (bio_alloc_pages(check, GFP_NOIO)) diff --git a/drivers/md/bcache/io.c b/drivers/md/bcache/io.c index 86a0bb8..f10a9a0 100644 --- a/drivers/md/bcache/io.c +++ b/drivers/md/bcache/io.c @@ -111,7 +111,7 @@ void bch_bbio_count_io_errors(struct cache_set *c, struct bio *bio, struct bbio *b = container_of(bio, struct bbio, bio); struct cache *ca = PTR_CACHE(c, &b->key, 0); - unsigned threshold = bio->bi_rw & REQ_WRITE + unsigned threshold = op_is_write(bio->bi_op) ? c->congested_write_threshold_us : c->congested_read_threshold_us; diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c index af3f9f7..68fa0f0 100644 --- a/drivers/md/bcache/journal.c +++ b/drivers/md/bcache/journal.c @@ -54,7 +54,7 @@ reread: left = ca->sb.bucket_size - offset; bio_reset(bio); bio->bi_iter.bi_sector = bucket + offset; bio->bi_bdev = ca->bdev; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; bio->bi_iter.bi_size = len << 9; bio->bi_end_io = journal_read_endio; @@ -452,7 +452,7 @@ static void do_journal_discard(struct cache *ca) bio->bi_iter.bi_sector = bucket_to_sector(ca->set, ca->sb.d[ja->discard_idx]); bio->bi_bdev = ca->bdev; - bio->bi_rw = REQ_WRITE|REQ_DISCARD; + bio->bi_op = REQ_OP_DISCARD; bio->bi_max_vecs = 1; bio->bi_io_vec = bio->bi_inline_vecs; bio->bi_iter.bi_size = bucket_bytes(ca); @@ -626,7 +626,8 @@ static void journal_write_unlocked(struct closure *cl) bio_reset(bio); bio->bi_iter.bi_sector = PTR_OFFSET(k, i); bio->bi_bdev = ca->bdev; - bio->bi_rw = REQ_WRITE|REQ_SYNC|REQ_META|REQ_FLUSH|REQ_FUA; + bio->bi_op = REQ_OP_WRITE; + bio->bi_rw = REQ_SYNC|REQ_META|REQ_FLUSH|REQ_FUA; bio->bi_iter.bi_size = sectors << 9; bio->bi_end_io = journal_write_endio; diff --git a/drivers/md/bcache/movinggc.c b/drivers/md/bcache/movinggc.c index b929fc9..f33860a 100644 --- a/drivers/md/bcache/movinggc.c +++ b/drivers/md/bcache/movinggc.c @@ -163,7 +163,7 @@ static void read_moving(struct cache_set *c) moving_init(io); bio = &io->bio.bio; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; bio->bi_end_io = read_moving_endio; if (bio_alloc_pages(bio, GFP_KERNEL)) diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c index 25fa844..cd6837c 100644 --- a/drivers/md/bcache/request.c +++ b/drivers/md/bcache/request.c @@ -253,7 +253,7 @@ static void bch_data_insert_start(struct closure *cl) trace_bcache_cache_insert(k); bch_keylist_push(&op->insert_keys); - n->bi_rw |= REQ_WRITE; + n->bi_op = REQ_OP_WRITE; bch_submit_bbio(n, op->c, k, 0); } while (n != bio); @@ -383,7 +383,7 @@ static bool check_should_bypass(struct cached_dev *dc, struct bio *bio) if (mode == CACHE_MODE_NONE || (mode == CACHE_MODE_WRITEAROUND && - (bio->bi_rw & REQ_WRITE))) + op_is_write(bio->bi_op))) goto skip; if (bio->bi_iter.bi_sector & (c->sb.block_size - 1) || @@ -404,7 +404,7 @@ static bool check_should_bypass(struct cached_dev *dc, struct bio *bio) if (!congested && mode == CACHE_MODE_WRITEBACK && - (bio->bi_rw & REQ_WRITE) && + op_is_write(bio->bi_op) && (bio->bi_rw & REQ_SYNC)) goto rescale; @@ -657,7 +657,7 @@ static inline struct search *search_alloc(struct bio *bio, s->cache_miss = NULL; s->d = d; s->recoverable = 1; - s->write = (bio->bi_rw & REQ_WRITE) != 0; + s->write = op_is_write(bio->bi_op); s->read_dirty_data = 0; s->start_time = jiffies; @@ -925,6 +925,7 @@ static void cached_dev_write(struct cached_dev *dc, struct search *s) struct bio *flush = bio_alloc_bioset(GFP_NOIO, 0, dc->disk.bio_split); + flush->bi_op = REQ_OP_WRITE; flush->bi_rw = WRITE_FLUSH; flush->bi_bdev = bio->bi_bdev; flush->bi_end_io = request_endio; diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index 1eb526a7..16e6108 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c @@ -212,7 +212,8 @@ static void __write_super(struct cache_sb *sb, struct bio *bio) unsigned i; bio->bi_iter.bi_sector = SB_SECTOR; - bio->bi_rw = REQ_WRITE|REQ_SYNC|REQ_META; + bio->bi_op = REQ_OP_WRITE; + bio->bi_rw = REQ_SYNC|REQ_META; bio->bi_iter.bi_size = SB_SIZE; bch_bio_map(bio, NULL); @@ -333,7 +334,7 @@ static void uuid_io_unlock(struct closure *cl) up(&c->uuid_write_mutex); } -static void uuid_io(struct cache_set *c, unsigned long rw, +static void uuid_io(struct cache_set *c, int op, unsigned long op_flags, struct bkey *k, struct closure *parent) { struct closure *cl = &c->uuid_write; @@ -348,7 +349,8 @@ static void uuid_io(struct cache_set *c, unsigned long rw, for (i = 0; i < KEY_PTRS(k); i++) { struct bio *bio = bch_bbio_alloc(c); - bio->bi_rw = REQ_SYNC|REQ_META|rw; + bio->bi_op = op; + bio->bi_rw = REQ_SYNC|REQ_META|op_flags; bio->bi_iter.bi_size = KEY_SIZE(k) << 9; bio->bi_end_io = uuid_endio; @@ -357,12 +359,12 @@ static void uuid_io(struct cache_set *c, unsigned long rw, bch_submit_bbio(bio, c, k, i); - if (!(rw & WRITE)) + if (op != REQ_OP_WRITE) break; } bch_extent_to_text(buf, sizeof(buf), k); - pr_debug("%s UUIDs at %s", rw & REQ_WRITE ? "wrote" : "read", buf); + pr_debug("%s UUIDs at %s", op == REQ_OP_WRITE ? "wrote" : "read", buf); for (u = c->uuids; u < c->uuids + c->nr_uuids; u++) if (!bch_is_zero(u->uuid, 16)) @@ -381,7 +383,7 @@ static char *uuid_read(struct cache_set *c, struct jset *j, struct closure *cl) return "bad uuid pointer"; bkey_copy(&c->uuid_bucket, k); - uuid_io(c, READ_SYNC, k, cl); + uuid_io(c, REQ_OP_READ, READ_SYNC, k, cl); if (j->version < BCACHE_JSET_VERSION_UUIDv1) { struct uuid_entry_v0 *u0 = (void *) c->uuids; @@ -426,7 +428,7 @@ static int __uuid_write(struct cache_set *c) return 1; SET_KEY_SIZE(&k.key, c->sb.bucket_size); - uuid_io(c, REQ_WRITE, &k.key, &cl); + uuid_io(c, REQ_OP_WRITE, 0, &k.key, &cl); closure_sync(&cl); bkey_copy(&c->uuid_bucket, &k.key); @@ -498,7 +500,8 @@ static void prio_endio(struct bio *bio) closure_put(&ca->prio); } -static void prio_io(struct cache *ca, uint64_t bucket, unsigned long rw) +static void prio_io(struct cache *ca, uint64_t bucket, int op, + unsigned long op_flags) { struct closure *cl = &ca->prio; struct bio *bio = bch_bbio_alloc(ca->set); @@ -507,7 +510,8 @@ static void prio_io(struct cache *ca, uint64_t bucket, unsigned long rw) bio->bi_iter.bi_sector = bucket * ca->sb.bucket_size; bio->bi_bdev = ca->bdev; - bio->bi_rw = REQ_SYNC|REQ_META|rw; + bio->bi_op = op; + bio->bi_rw = REQ_SYNC|REQ_META|op_flags; bio->bi_iter.bi_size = bucket_bytes(ca); bio->bi_end_io = prio_endio; @@ -557,7 +561,7 @@ void bch_prio_write(struct cache *ca) BUG_ON(bucket == -1); mutex_unlock(&ca->set->bucket_lock); - prio_io(ca, bucket, REQ_WRITE); + prio_io(ca, bucket, REQ_OP_WRITE, 0); mutex_lock(&ca->set->bucket_lock); ca->prio_buckets[i] = bucket; @@ -599,7 +603,7 @@ static void prio_read(struct cache *ca, uint64_t bucket) ca->prio_last_buckets[bucket_nr] = bucket; bucket_nr++; - prio_io(ca, bucket, READ_SYNC); + prio_io(ca, bucket, REQ_OP_READ, READ_SYNC); if (p->csum != bch_crc64(&p->magic, bucket_bytes(ca) - 8)) pr_warn("bad csum reading priorities"); diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c index b9346cd..96ddf28 100644 --- a/drivers/md/bcache/writeback.c +++ b/drivers/md/bcache/writeback.c @@ -183,7 +183,7 @@ static void write_dirty(struct closure *cl) struct keybuf_key *w = io->bio.bi_private; dirty_init(w); - io->bio.bi_rw = WRITE; + io->bio.bi_op = REQ_OP_WRITE; io->bio.bi_iter.bi_sector = KEY_START(&w->key); io->bio.bi_bdev = io->dc->bdev; io->bio.bi_end_io = dirty_endio; @@ -256,7 +256,7 @@ static void read_dirty(struct cached_dev *dc) io->bio.bi_iter.bi_sector = PTR_OFFSET(&w->key, 0); io->bio.bi_bdev = PTR_CACHE(dc->disk.c, &w->key, 0)->bdev; - io->bio.bi_rw = READ; + io->bio.bi_op = REQ_OP_READ; io->bio.bi_end_io = read_dirty_endio; if (bio_alloc_pages(&io->bio, GFP_KERNEL)) -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5D3247D19 for ; Wed, 13 Apr 2016 14:37:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1DD0730405F for ; Wed, 13 Apr 2016 12:37:28 -0700 (PDT) X-ASG-Debug-ID: 1460576245-04cb6c24644b50e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id pEeexjy9IqUufDtB (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:26 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id BB141C05E16A; Wed, 13 Apr 2016 19:37:25 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9I018278; Wed, 13 Apr 2016 15:37:23 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 22/42] drbd: set bi_op to REQ_OP Date: Wed, 13 Apr 2016 14:36:08 -0500 X-ASG-Orig-Subj: [PATCH 22/42] drbd: set bi_op to REQ_OP Message-Id: <1460576188-5751-23-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576246 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has drbd use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Lars and Philip, I might have split this patch up a little weird. The block layer has compat so you can set either bi_rw or bi_op. This patch handles setting up the bio in drbd. I then converted all the block device drivers and in 0037-block-fs-drivers-do-not-test-bi_rw-for-REQ_OPs.patch I modified the bi_rw checks so they use bi_op. This patch is compile tested only. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- drivers/block/drbd/drbd_actlog.c | 29 ++++++++++++++++------------- drivers/block/drbd/drbd_bitmap.c | 6 +++--- drivers/block/drbd/drbd_int.h | 4 ++-- drivers/block/drbd/drbd_main.c | 5 +++-- drivers/block/drbd/drbd_receiver.c | 37 +++++++++++++++++++++++++------------ drivers/block/drbd/drbd_worker.c | 3 ++- 6 files changed, 51 insertions(+), 33 deletions(-) diff --git a/drivers/block/drbd/drbd_actlog.c b/drivers/block/drbd/drbd_actlog.c index 6069e15..2fa8534 100644 --- a/drivers/block/drbd/drbd_actlog.c +++ b/drivers/block/drbd/drbd_actlog.c @@ -137,19 +137,19 @@ void wait_until_done_or_force_detached(struct drbd_device *device, struct drbd_b static int _drbd_md_sync_page_io(struct drbd_device *device, struct drbd_backing_dev *bdev, - sector_t sector, int rw) + sector_t sector, int op) { struct bio *bio; /* we do all our meta data IO in aligned 4k blocks. */ const int size = 4096; - int err; + int err, op_flags = 0; device->md_io.done = 0; device->md_io.error = -ENODEV; - if ((rw & WRITE) && !test_bit(MD_NO_FUA, &device->flags)) - rw |= REQ_FUA | REQ_FLUSH; - rw |= REQ_SYNC | REQ_NOIDLE; + if ((op == REQ_OP_WRITE) && !test_bit(MD_NO_FUA, &device->flags)) + op_flags |= REQ_FUA | REQ_FLUSH; + op_flags |= REQ_SYNC | REQ_NOIDLE; bio = bio_alloc_drbd(GFP_NOIO); bio->bi_bdev = bdev->md_bdev; @@ -159,9 +159,10 @@ static int _drbd_md_sync_page_io(struct drbd_device *device, goto out; bio->bi_private = device; bio->bi_end_io = drbd_md_endio; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; - if (!(rw & WRITE) && device->state.disk == D_DISKLESS && device->ldev == NULL) + if (op != REQ_OP_WRITE && device->state.disk == D_DISKLESS && device->ldev == NULL) /* special case, drbd_md_read() during drbd_adm_attach(): no get_ldev */ ; else if (!get_ldev_if_state(device, D_ATTACHING)) { @@ -174,7 +175,7 @@ static int _drbd_md_sync_page_io(struct drbd_device *device, bio_get(bio); /* one bio_put() is in the completion handler */ atomic_inc(&device->md_io.in_use); /* drbd_md_put_buffer() is in the completion handler */ device->md_io.submit_jif = jiffies; - if (drbd_insert_fault(device, (rw & WRITE) ? DRBD_FAULT_MD_WR : DRBD_FAULT_MD_RD)) + if (drbd_insert_fault(device, (op == REQ_OP_WRITE) ? DRBD_FAULT_MD_WR : DRBD_FAULT_MD_RD)) bio_io_error(bio); else submit_bio(bio); @@ -188,7 +189,7 @@ static int _drbd_md_sync_page_io(struct drbd_device *device, } int drbd_md_sync_page_io(struct drbd_device *device, struct drbd_backing_dev *bdev, - sector_t sector, int rw) + sector_t sector, int op) { int err; D_ASSERT(device, atomic_read(&device->md_io.in_use) == 1); @@ -197,19 +198,21 @@ int drbd_md_sync_page_io(struct drbd_device *device, struct drbd_backing_dev *bd dynamic_drbd_dbg(device, "meta_data io: %s [%d]:%s(,%llus,%s) %pS\n", current->comm, current->pid, __func__, - (unsigned long long)sector, (rw & WRITE) ? "WRITE" : "READ", + (unsigned long long)sector, (op == REQ_OP_WRITE) ? "WRITE" : "READ", (void*)_RET_IP_ ); if (sector < drbd_md_first_sector(bdev) || sector + 7 > drbd_md_last_sector(bdev)) drbd_alert(device, "%s [%d]:%s(,%llus,%s) out of range md access!\n", current->comm, current->pid, __func__, - (unsigned long long)sector, (rw & WRITE) ? "WRITE" : "READ"); + (unsigned long long)sector, + (op == REQ_OP_WRITE) ? "WRITE" : "READ"); - err = _drbd_md_sync_page_io(device, bdev, sector, rw); + err = _drbd_md_sync_page_io(device, bdev, sector, op); if (err) { drbd_err(device, "drbd_md_sync_page_io(,%llus,%s) failed with error %d\n", - (unsigned long long)sector, (rw & WRITE) ? "WRITE" : "READ", err); + (unsigned long long)sector, + (op == REQ_OP_WRITE) ? "WRITE" : "READ", err); } return err; } diff --git a/drivers/block/drbd/drbd_bitmap.c b/drivers/block/drbd/drbd_bitmap.c index e8959fe..126bf4a 100644 --- a/drivers/block/drbd/drbd_bitmap.c +++ b/drivers/block/drbd/drbd_bitmap.c @@ -980,7 +980,7 @@ static void bm_page_io_async(struct drbd_bm_aio_ctx *ctx, int page_nr) __must_ho struct drbd_bitmap *b = device->bitmap; struct page *page; unsigned int len; - unsigned int rw = (ctx->flags & BM_AIO_READ) ? READ : WRITE; + unsigned int op = (ctx->flags & BM_AIO_READ) ? REQ_OP_READ : REQ_OP_WRITE; sector_t on_disk_sector = device->ldev->md.md_offset + device->ldev->md.bm_offset; @@ -1011,9 +1011,9 @@ static void bm_page_io_async(struct drbd_bm_aio_ctx *ctx, int page_nr) __must_ho bio_add_page(bio, page, len, 0); bio->bi_private = ctx; bio->bi_end_io = drbd_bm_endio; - bio->bi_rw = rw; + bio->bi_op = op; - if (drbd_insert_fault(device, (rw & WRITE) ? DRBD_FAULT_MD_WR : DRBD_FAULT_MD_RD)) { + if (drbd_insert_fault(device, (op == REQ_OP_WRITE) ? DRBD_FAULT_MD_WR : DRBD_FAULT_MD_RD)) { bio_io_error(bio); } else { submit_bio(bio); diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index 7a1cf7e..33f0b82 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h @@ -1507,7 +1507,7 @@ extern int drbd_resync_finished(struct drbd_device *device); extern void *drbd_md_get_buffer(struct drbd_device *device, const char *intent); extern void drbd_md_put_buffer(struct drbd_device *device); extern int drbd_md_sync_page_io(struct drbd_device *device, - struct drbd_backing_dev *bdev, sector_t sector, int rw); + struct drbd_backing_dev *bdev, sector_t sector, int op); extern void drbd_ov_out_of_sync_found(struct drbd_device *, sector_t, int); extern void wait_until_done_or_force_detached(struct drbd_device *device, struct drbd_backing_dev *bdev, unsigned int *done); @@ -1557,7 +1557,7 @@ extern bool drbd_rs_should_slow_down(struct drbd_device *device, sector_t sector bool throttle_if_app_is_waiting); extern int drbd_submit_peer_request(struct drbd_device *, struct drbd_peer_request *, const unsigned, - const int); + const unsigned, const int); extern int drbd_free_peer_reqs(struct drbd_device *, struct list_head *); extern struct drbd_peer_request *drbd_alloc_peer_req(struct drbd_peer_device *, u64, sector_t, unsigned int, diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 2ba1494..30c93d6 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c @@ -3061,7 +3061,7 @@ void drbd_md_write(struct drbd_device *device, void *b) D_ASSERT(device, drbd_md_ss(device->ldev) == device->ldev->md.md_offset); sector = device->ldev->md.md_offset; - if (drbd_md_sync_page_io(device, device->ldev, sector, WRITE)) { + if (drbd_md_sync_page_io(device, device->ldev, sector, REQ_OP_WRITE)) { /* this was a try anyways ... */ drbd_err(device, "meta data update failed!\n"); drbd_chk_io_error(device, 1, DRBD_META_IO_ERROR); @@ -3263,7 +3263,8 @@ int drbd_md_read(struct drbd_device *device, struct drbd_backing_dev *bdev) * Affects the paranoia out-of-range access check in drbd_md_sync_page_io(). */ bdev->md.md_size_sect = 8; - if (drbd_md_sync_page_io(device, bdev, bdev->md.md_offset, READ)) { + if (drbd_md_sync_page_io(device, bdev, bdev->md.md_offset, + REQ_OP_READ)) { /* NOTE: can't do normal error processing here as this is called BEFORE disk is attached */ drbd_err(device, "Error while reading metadata.\n"); diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index 050aaa1..a0b95da 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c @@ -1398,7 +1398,8 @@ void drbd_bump_write_ordering(struct drbd_resource *resource, struct drbd_backin /* TODO allocate from our own bio_set. */ int drbd_submit_peer_request(struct drbd_device *device, struct drbd_peer_request *peer_req, - const unsigned rw, const int fault_type) + const unsigned op, const unsigned op_flags, + const int fault_type) { struct bio *bios = NULL; struct bio *bio; @@ -1450,7 +1451,8 @@ next_bio: /* > peer_req->i.sector, unless this is the first bio */ bio->bi_iter.bi_sector = sector; bio->bi_bdev = device->ldev->backing_bdev; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; bio->bi_private = peer_req; bio->bi_end_io = drbd_peer_request_endio; @@ -1458,7 +1460,7 @@ next_bio: bios = bio; ++n_bios; - if (rw & REQ_DISCARD) { + if (op == REQ_OP_DISCARD) { bio->bi_iter.bi_size = data_size; goto submit; } @@ -1830,7 +1832,8 @@ static int recv_resync_read(struct drbd_peer_device *peer_device, sector_t secto spin_unlock_irq(&device->resource->req_lock); atomic_add(pi->size >> 9, &device->rs_sect_ev); - if (drbd_submit_peer_request(device, peer_req, WRITE, DRBD_FAULT_RS_WR) == 0) + if (drbd_submit_peer_request(device, peer_req, REQ_OP_WRITE, 0, + DRBD_FAULT_RS_WR) == 0) return 0; /* don't care for the reason here */ @@ -2152,12 +2155,19 @@ static int wait_for_and_update_peer_seq(struct drbd_peer_device *peer_device, co /* see also bio_flags_to_wire() * DRBD_REQ_*, because we need to semantically map the flags to data packet * flags and back. We may replicate to other kernel versions. */ -static unsigned long wire_flags_to_bio(u32 dpf) +static unsigned long wire_flags_to_bio_flags(u32 dpf) { return (dpf & DP_RW_SYNC ? REQ_SYNC : 0) | (dpf & DP_FUA ? REQ_FUA : 0) | - (dpf & DP_FLUSH ? REQ_FLUSH : 0) | - (dpf & DP_DISCARD ? REQ_DISCARD : 0); + (dpf & DP_FLUSH ? REQ_FLUSH : 0); +} + +static unsigned long wire_flags_to_bio_op(u32 dpf) +{ + if (dpf & DP_DISCARD) + return REQ_OP_DISCARD; + else + return REQ_OP_WRITE; } static void fail_postponed_requests(struct drbd_device *device, sector_t sector, @@ -2303,7 +2313,7 @@ static int receive_Data(struct drbd_connection *connection, struct packet_info * struct drbd_peer_request *peer_req; struct p_data *p = pi->data; u32 peer_seq = be32_to_cpu(p->seq_num); - int rw = WRITE; + int op, op_flags; u32 dp_flags; int err, tp; @@ -2342,14 +2352,15 @@ static int receive_Data(struct drbd_connection *connection, struct packet_info * peer_req->flags |= EE_APPLICATION; dp_flags = be32_to_cpu(p->dp_flags); - rw |= wire_flags_to_bio(dp_flags); + op = wire_flags_to_bio_op(dp_flags); + op_flags = wire_flags_to_bio_flags(dp_flags); if (pi->cmd == P_TRIM) { struct request_queue *q = bdev_get_queue(device->ldev->backing_bdev); peer_req->flags |= EE_IS_TRIM; if (!blk_queue_discard(q)) peer_req->flags |= EE_IS_TRIM_USE_ZEROOUT; D_ASSERT(peer_device, peer_req->i.size > 0); - D_ASSERT(peer_device, rw & REQ_DISCARD); + D_ASSERT(peer_device, op == REQ_OP_DISCARD); D_ASSERT(peer_device, peer_req->pages == NULL); } else if (peer_req->pages == NULL) { D_ASSERT(device, peer_req->i.size == 0); @@ -2433,7 +2444,8 @@ static int receive_Data(struct drbd_connection *connection, struct packet_info * peer_req->flags |= EE_CALL_AL_COMPLETE_IO; } - err = drbd_submit_peer_request(device, peer_req, rw, DRBD_FAULT_DT_WR); + err = drbd_submit_peer_request(device, peer_req, op, op_flags, + DRBD_FAULT_DT_WR); if (!err) return 0; @@ -2723,7 +2735,8 @@ submit_for_resync: submit: update_receiver_timing_details(connection, drbd_submit_peer_request); inc_unacked(device); - if (drbd_submit_peer_request(device, peer_req, READ, fault_type) == 0) + if (drbd_submit_peer_request(device, peer_req, REQ_OP_READ, 0, + fault_type) == 0) return 0; /* don't care for the reason here */ diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_worker.c index 4d87499..2a04b43 100644 --- a/drivers/block/drbd/drbd_worker.c +++ b/drivers/block/drbd/drbd_worker.c @@ -397,7 +397,8 @@ static int read_for_csum(struct drbd_peer_device *peer_device, sector_t sector, spin_unlock_irq(&device->resource->req_lock); atomic_add(size >> 9, &device->rs_sect_ev); - if (drbd_submit_peer_request(device, peer_req, READ, DRBD_FAULT_RS_RD) == 0) + if (drbd_submit_peer_request(device, peer_req, REQ_OP_READ, 0, + DRBD_FAULT_RS_RD) == 0) return 0; /* If it failed because of ENOMEM, retry should help. If it failed -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 25F137D29 for ; Wed, 13 Apr 2016 14:37:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9DFA930405F for ; Wed, 13 Apr 2016 12:37:31 -0700 (PDT) X-ASG-Debug-ID: 1460576248-04bdf011034b3310001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Na6dTdITXJpvfzB0 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:28 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 12F4785A00; Wed, 13 Apr 2016 19:37:28 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9J018278; Wed, 13 Apr 2016 15:37:25 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 23/42] md/raid: set bi_op to REQ_OP Date: Wed, 13 Apr 2016 14:36:09 -0500 X-ASG-Orig-Subj: [PATCH 23/42] md/raid: set bi_op to REQ_OP Message-Id: <1460576188-5751-24-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576248 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com From: Mike Christie This patch has md use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- drivers/md/bitmap.c | 2 +- drivers/md/dm-raid.c | 5 +++-- drivers/md/md.c | 11 +++++++---- drivers/md/md.h | 3 ++- drivers/md/raid1.c | 34 ++++++++++++++++---------------- drivers/md/raid10.c | 50 ++++++++++++++++++++++++++---------------------- drivers/md/raid5-cache.c | 25 +++++++++++++++--------- drivers/md/raid5.c | 48 ++++++++++++++++++++++++++-------------------- 8 files changed, 101 insertions(+), 77 deletions(-) diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index 8b2e16f..9e8019e 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c @@ -159,7 +159,7 @@ static int read_sb_page(struct mddev *mddev, loff_t offset, if (sync_page_io(rdev, target, roundup(size, bdev_logical_block_size(rdev->bdev)), - page, READ, true)) { + page, REQ_OP_READ, 0, true)) { page->index = index; return 0; } diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index a090121..43a749c 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c @@ -792,7 +792,7 @@ static int read_disk_sb(struct md_rdev *rdev, int size) if (rdev->sb_loaded) return 0; - if (!sync_page_io(rdev, 0, size, rdev->sb_page, READ, 1)) { + if (!sync_page_io(rdev, 0, size, rdev->sb_page, REQ_OP_READ, 0, 1)) { DMERR("Failed to read superblock of device at position %d", rdev->raid_disk); md_error(rdev->mddev, rdev); @@ -1646,7 +1646,8 @@ static void attempt_restore_of_faulty_devices(struct raid_set *rs) for (i = 0; i < rs->md.raid_disks; i++) { r = &rs->dev[i].rdev; if (test_bit(Faulty, &r->flags) && r->sb_page && - sync_page_io(r, 0, r->sb_size, r->sb_page, READ, 1)) { + sync_page_io(r, 0, r->sb_size, r->sb_page, REQ_OP_READ, 0, + 1)) { DMINFO("Faulty %s device #%d has readable super block." " Attempting to revive it.", rs->raid_type->name, i); diff --git a/drivers/md/md.c b/drivers/md/md.c index ec3c98d..9c40368 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -392,6 +392,7 @@ static void submit_flushes(struct work_struct *ws) bi->bi_end_io = md_end_flush; bi->bi_private = rdev; bi->bi_bdev = rdev->bdev; + bi->bi_op = REQ_OP_WRITE; bi->bi_rw = WRITE_FLUSH; atomic_inc(&mddev->flush_pending); submit_bio(bi); @@ -741,6 +742,7 @@ void md_super_write(struct mddev *mddev, struct md_rdev *rdev, bio_add_page(bio, page, size, 0); bio->bi_private = rdev; bio->bi_end_io = super_written; + bio->bi_op = REQ_OP_WRITE; bio->bi_rw = WRITE_FLUSH_FUA; atomic_inc(&mddev->pending_writes); @@ -754,14 +756,15 @@ void md_super_wait(struct mddev *mddev) } int sync_page_io(struct md_rdev *rdev, sector_t sector, int size, - struct page *page, int rw, bool metadata_op) + struct page *page, int op, int op_flags, bool metadata_op) { struct bio *bio = bio_alloc_mddev(GFP_NOIO, 1, rdev->mddev); int ret; bio->bi_bdev = (metadata_op && rdev->meta_bdev) ? rdev->meta_bdev : rdev->bdev; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; if (metadata_op) bio->bi_iter.bi_sector = sector + rdev->sb_start; else if (rdev->mddev->reshape_position != MaxSector && @@ -787,7 +790,7 @@ static int read_disk_sb(struct md_rdev *rdev, int size) if (rdev->sb_loaded) return 0; - if (!sync_page_io(rdev, 0, size, rdev->sb_page, READ, true)) + if (!sync_page_io(rdev, 0, size, rdev->sb_page, REQ_OP_READ, 0, true)) goto fail; rdev->sb_loaded = 1; return 0; @@ -1473,7 +1476,7 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_ return -EINVAL; bb_sector = (long long)offset; if (!sync_page_io(rdev, bb_sector, sectors << 9, - rdev->bb_page, READ, true)) + rdev->bb_page, REQ_OP_READ, 0, true)) return -EIO; bbp = (u64 *)page_address(rdev->bb_page); rdev->badblocks.shift = sb->bblog_shift; diff --git a/drivers/md/md.h b/drivers/md/md.h index b5c4be7..2e0918f 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -618,7 +618,8 @@ extern void md_super_write(struct mddev *mddev, struct md_rdev *rdev, sector_t sector, int size, struct page *page); extern void md_super_wait(struct mddev *mddev); extern int sync_page_io(struct md_rdev *rdev, sector_t sector, int size, - struct page *page, int rw, bool metadata_op); + struct page *page, int op, int op_flags, + bool metadata_op); extern void md_do_sync(struct md_thread *thread); extern void md_new_event(struct mddev *mddev); extern int md_allow_write(struct mddev *mddev); diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 424df7e..c7abd2d 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -759,7 +759,7 @@ static void flush_pending_writes(struct r1conf *conf) while (bio) { /* submit pending writes */ struct bio *next = bio->bi_next; bio->bi_next = NULL; - if (unlikely((bio->bi_rw & REQ_DISCARD) && + if (unlikely((bio->bi_op == REQ_OP_DISCARD) && !blk_queue_discard(bdev_get_queue(bio->bi_bdev)))) /* Just ignore it */ bio_endio(bio); @@ -1033,7 +1033,7 @@ static void raid1_unplug(struct blk_plug_cb *cb, bool from_schedule) while (bio) { /* submit pending writes */ struct bio *next = bio->bi_next; bio->bi_next = NULL; - if (unlikely((bio->bi_rw & REQ_DISCARD) && + if (unlikely((bio->bi_op == REQ_OP_DISCARD) && !blk_queue_discard(bdev_get_queue(bio->bi_bdev)))) /* Just ignore it */ bio_endio(bio); @@ -1053,12 +1053,11 @@ static void raid1_make_request(struct mddev *mddev, struct bio * bio) int i, disks; struct bitmap *bitmap; unsigned long flags; + const int op = bio->bi_op; const int rw = bio_data_dir(bio); const unsigned long do_sync = (bio->bi_rw & REQ_SYNC); const unsigned long do_flush_fua = (bio->bi_rw & (REQ_FLUSH | REQ_FUA)); - const unsigned long do_discard = (bio->bi_rw - & (REQ_DISCARD | REQ_SECURE)); - const unsigned long do_same = (bio->bi_rw & REQ_WRITE_SAME); + const unsigned long do_sec = (bio->bi_rw & REQ_SECURE); struct md_rdev *blocked_rdev; struct blk_plug_cb *cb; struct raid1_plug_cb *plug = NULL; @@ -1166,7 +1165,8 @@ read_again: mirror->rdev->data_offset; read_bio->bi_bdev = mirror->rdev->bdev; read_bio->bi_end_io = raid1_end_read_request; - read_bio->bi_rw = READ | do_sync; + read_bio->bi_op = op; + read_bio->bi_rw = do_sync; read_bio->bi_private = r1_bio; if (max_sectors < r1_bio->sectors) { @@ -1376,8 +1376,9 @@ read_again: conf->mirrors[i].rdev->data_offset); mbio->bi_bdev = conf->mirrors[i].rdev->bdev; mbio->bi_end_io = raid1_end_write_request; + mbio->bi_op = op; mbio->bi_rw = - WRITE | do_flush_fua | do_sync | do_discard | do_same; + do_flush_fua | do_sync | do_sec; mbio->bi_private = r1_bio; atomic_inc(&r1_bio->remaining); @@ -1771,7 +1772,7 @@ static void end_sync_write(struct bio *bio) static int r1_sync_page_io(struct md_rdev *rdev, sector_t sector, int sectors, struct page *page, int rw) { - if (sync_page_io(rdev, sector, sectors << 9, page, rw, false)) + if (sync_page_io(rdev, sector, sectors << 9, page, rw, 0, false)) /* success */ return 1; if (rw == WRITE) { @@ -1825,7 +1826,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio) rdev = conf->mirrors[d].rdev; if (sync_page_io(rdev, sect, s<<9, bio->bi_io_vec[idx].bv_page, - READ, false)) { + REQ_OP_READ, 0, false)) { success = 1; break; } @@ -2030,7 +2031,7 @@ static void sync_request_write(struct mddev *mddev, struct r1bio *r1_bio) !test_bit(MD_RECOVERY_SYNC, &mddev->recovery)))) continue; - wbio->bi_rw = WRITE; + wbio->bi_op = REQ_OP_WRITE; wbio->bi_end_io = end_sync_write; atomic_inc(&r1_bio->remaining); md_sync_acct(conf->mirrors[i].rdev->bdev, bio_sectors(wbio)); @@ -2090,7 +2091,7 @@ static void fix_read_error(struct r1conf *conf, int read_disk, is_badblock(rdev, sect, s, &first_bad, &bad_sectors) == 0 && sync_page_io(rdev, sect, s<<9, - conf->tmppage, READ, false)) + conf->tmppage, REQ_OP_READ, 0, false)) success = 1; else { d++; @@ -2201,7 +2202,7 @@ static int narrow_write_error(struct r1bio *r1_bio, int i) wbio = bio_clone_mddev(r1_bio->master_bio, GFP_NOIO, mddev); } - wbio->bi_rw = WRITE; + wbio->bi_op = REQ_OP_WRITE; wbio->bi_iter.bi_sector = r1_bio->sector; wbio->bi_iter.bi_size = r1_bio->sectors << 9; @@ -2344,7 +2345,8 @@ read_more: bio->bi_iter.bi_sector = r1_bio->sector + rdev->data_offset; bio->bi_bdev = rdev->bdev; bio->bi_end_io = raid1_end_read_request; - bio->bi_rw = READ | do_sync; + bio->bi_op = REQ_OP_READ; + bio->bi_rw = do_sync; bio->bi_private = r1_bio; if (max_sectors < r1_bio->sectors) { /* Drat - have to split this up more */ @@ -2572,7 +2574,7 @@ static sector_t raid1_sync_request(struct mddev *mddev, sector_t sector_nr, if (i < conf->raid_disks) still_degraded = 1; } else if (!test_bit(In_sync, &rdev->flags)) { - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; bio->bi_end_io = end_sync_write; write_targets ++; } else { @@ -2599,7 +2601,7 @@ static sector_t raid1_sync_request(struct mddev *mddev, sector_t sector_nr, if (disk < 0) disk = i; } - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; bio->bi_end_io = end_sync_read; read_targets++; } else if (!test_bit(WriteErrorSeen, &rdev->flags) && @@ -2611,7 +2613,7 @@ static sector_t raid1_sync_request(struct mddev *mddev, sector_t sector_nr, * if we are doing resync or repair. Otherwise, leave * this device alone for this sync request. */ - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; bio->bi_end_io = end_sync_write; write_targets++; } diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 4736be8..63cd985 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -865,7 +865,7 @@ static void flush_pending_writes(struct r10conf *conf) while (bio) { /* submit pending writes */ struct bio *next = bio->bi_next; bio->bi_next = NULL; - if (unlikely((bio->bi_rw & REQ_DISCARD) && + if (unlikely((bio->bi_op == REQ_OP_DISCARD) && !blk_queue_discard(bdev_get_queue(bio->bi_bdev)))) /* Just ignore it */ bio_endio(bio); @@ -1041,7 +1041,7 @@ static void raid10_unplug(struct blk_plug_cb *cb, bool from_schedule) while (bio) { /* submit pending writes */ struct bio *next = bio->bi_next; bio->bi_next = NULL; - if (unlikely((bio->bi_rw & REQ_DISCARD) && + if (unlikely((bio->bi_op == REQ_OP_DISCARD) && !blk_queue_discard(bdev_get_queue(bio->bi_bdev)))) /* Just ignore it */ bio_endio(bio); @@ -1058,12 +1058,11 @@ static void __make_request(struct mddev *mddev, struct bio *bio) struct r10bio *r10_bio; struct bio *read_bio; int i; + const int op = bio->bi_op; const int rw = bio_data_dir(bio); const unsigned long do_sync = (bio->bi_rw & REQ_SYNC); const unsigned long do_fua = (bio->bi_rw & REQ_FUA); - const unsigned long do_discard = (bio->bi_rw - & (REQ_DISCARD | REQ_SECURE)); - const unsigned long do_same = (bio->bi_rw & REQ_WRITE_SAME); + const unsigned long do_sec = (bio->bi_rw & REQ_SECURE); unsigned long flags; struct md_rdev *blocked_rdev; struct blk_plug_cb *cb; @@ -1156,7 +1155,8 @@ read_again: choose_data_offset(r10_bio, rdev); read_bio->bi_bdev = rdev->bdev; read_bio->bi_end_io = raid10_end_read_request; - read_bio->bi_rw = READ | do_sync; + read_bio->bi_op = op; + read_bio->bi_rw = do_sync; read_bio->bi_private = r10_bio; if (max_sectors < r10_bio->sectors) { @@ -1363,8 +1363,9 @@ retry_write: rdev)); mbio->bi_bdev = rdev->bdev; mbio->bi_end_io = raid10_end_write_request; + mbio->bi_op = op; mbio->bi_rw = - WRITE | do_sync | do_fua | do_discard | do_same; + do_sync | do_fua | do_sec; mbio->bi_private = r10_bio; atomic_inc(&r10_bio->remaining); @@ -1406,8 +1407,9 @@ retry_write: r10_bio, rdev)); mbio->bi_bdev = rdev->bdev; mbio->bi_end_io = raid10_end_write_request; + mbio->bi_op = op; mbio->bi_rw = - WRITE | do_sync | do_fua | do_discard | do_same; + do_sync | do_fua | do_sec; mbio->bi_private = r10_bio; atomic_inc(&r10_bio->remaining); @@ -1992,7 +1994,7 @@ static void sync_request_write(struct mddev *mddev, struct r10bio *r10_bio) tbio->bi_vcnt = vcnt; tbio->bi_iter.bi_size = fbio->bi_iter.bi_size; - tbio->bi_rw = WRITE; + tbio->bi_op = REQ_OP_WRITE; tbio->bi_private = r10_bio; tbio->bi_iter.bi_sector = r10_bio->devs[i].addr; tbio->bi_end_io = end_sync_write; @@ -2078,7 +2080,7 @@ static void fix_recovery_read_error(struct r10bio *r10_bio) addr, s << 9, bio->bi_io_vec[idx].bv_page, - READ, false); + REQ_OP_READ, 0, false); if (ok) { rdev = conf->mirrors[dw].rdev; addr = r10_bio->devs[1].addr + sect; @@ -2086,7 +2088,7 @@ static void fix_recovery_read_error(struct r10bio *r10_bio) addr, s << 9, bio->bi_io_vec[idx].bv_page, - WRITE, false); + REQ_OP_WRITE, 0, false); if (!ok) { set_bit(WriteErrorSeen, &rdev->flags); if (!test_and_set_bit(WantReplacement, @@ -2213,7 +2215,7 @@ static int r10_sync_page_io(struct md_rdev *rdev, sector_t sector, if (is_badblock(rdev, sector, sectors, &first_bad, &bad_sectors) && (rw == READ || test_bit(WriteErrorSeen, &rdev->flags))) return -1; - if (sync_page_io(rdev, sector, sectors << 9, page, rw, false)) + if (sync_page_io(rdev, sector, sectors << 9, page, rw, 0, false)) /* success */ return 1; if (rw == WRITE) { @@ -2299,7 +2301,8 @@ static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10 r10_bio->devs[sl].addr + sect, s<<9, - conf->tmppage, READ, false); + conf->tmppage, + REQ_OP_READ, 0, false); rdev_dec_pending(rdev, mddev); rcu_read_lock(); if (success) @@ -2474,7 +2477,7 @@ static int narrow_write_error(struct r10bio *r10_bio, int i) choose_data_offset(r10_bio, rdev) + (sector - r10_bio->sector)); wbio->bi_bdev = rdev->bdev; - wbio->bi_rw = WRITE; + wbio->bi_op = REQ_OP_WRITE; if (submit_bio_wait(wbio) < 0) /* Failure! */ @@ -2550,7 +2553,8 @@ read_more: bio->bi_iter.bi_sector = r10_bio->devs[slot].addr + choose_data_offset(r10_bio, rdev); bio->bi_bdev = rdev->bdev; - bio->bi_rw = READ | do_sync; + bio->bi_op = REQ_OP_READ; + bio->bi_rw = do_sync; bio->bi_private = r10_bio; bio->bi_end_io = raid10_end_read_request; if (max_sectors < r10_bio->sectors) { @@ -3040,7 +3044,7 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr, biolist = bio; bio->bi_private = r10_bio; bio->bi_end_io = end_sync_read; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; from_addr = r10_bio->devs[j].addr; bio->bi_iter.bi_sector = from_addr + rdev->data_offset; @@ -3066,7 +3070,7 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr, biolist = bio; bio->bi_private = r10_bio; bio->bi_end_io = end_sync_write; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; bio->bi_iter.bi_sector = to_addr + rdev->data_offset; bio->bi_bdev = rdev->bdev; @@ -3095,7 +3099,7 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr, biolist = bio; bio->bi_private = r10_bio; bio->bi_end_io = end_sync_write; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; bio->bi_iter.bi_sector = to_addr + rdev->data_offset; bio->bi_bdev = rdev->bdev; @@ -3215,7 +3219,7 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr, biolist = bio; bio->bi_private = r10_bio; bio->bi_end_io = end_sync_read; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; bio->bi_iter.bi_sector = sector + conf->mirrors[d].rdev->data_offset; bio->bi_bdev = conf->mirrors[d].rdev->bdev; @@ -3237,7 +3241,7 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr, biolist = bio; bio->bi_private = r10_bio; bio->bi_end_io = end_sync_write; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; bio->bi_iter.bi_sector = sector + conf->mirrors[d].replacement->data_offset; bio->bi_bdev = conf->mirrors[d].replacement->bdev; @@ -4320,7 +4324,7 @@ read_more: + rdev->data_offset); read_bio->bi_private = r10_bio; read_bio->bi_end_io = end_sync_read; - read_bio->bi_rw = READ; + read_bio->bi_op = REQ_OP_READ; read_bio->bi_flags &= (~0UL << BIO_RESET_BITS); read_bio->bi_error = 0; read_bio->bi_vcnt = 0; @@ -4354,7 +4358,7 @@ read_more: rdev2->new_data_offset; b->bi_private = r10_bio; b->bi_end_io = end_reshape_write; - b->bi_rw = WRITE; + b->bi_op = REQ_OP_WRITE; b->bi_next = blist; blist = b; } @@ -4522,7 +4526,7 @@ static int handle_reshape_read_error(struct mddev *mddev, addr, s << 9, bvec[idx].bv_page, - READ, false); + REQ_OP_READ, 0, false); if (success) break; failed: diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c index 2d56fdc..da07670 100644 --- a/drivers/md/raid5-cache.c +++ b/drivers/md/raid5-cache.c @@ -261,7 +261,7 @@ static struct bio *r5l_bio_alloc(struct r5l_log *log) { struct bio *bio = bio_alloc_bioset(GFP_NOIO, BIO_MAX_PAGES, log->bs); - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; bio->bi_bdev = log->rdev->bdev; bio->bi_iter.bi_sector = log->rdev->data_offset + log->log_start; @@ -686,6 +686,7 @@ void r5l_flush_stripe_to_raid(struct r5l_log *log) bio_reset(&log->flush_bio); log->flush_bio.bi_bdev = log->rdev->bdev; log->flush_bio.bi_end_io = r5l_log_flush_endio; + log->flush_bio.bi_op = REQ_OP_WRITE; log->flush_bio.bi_rw = WRITE_FLUSH; submit_bio(&log->flush_bio); } @@ -882,7 +883,8 @@ static int r5l_read_meta_block(struct r5l_log *log, struct r5l_meta_block *mb; u32 crc, stored_crc; - if (!sync_page_io(log->rdev, ctx->pos, PAGE_SIZE, page, READ, false)) + if (!sync_page_io(log->rdev, ctx->pos, PAGE_SIZE, page, REQ_OP_READ, 0, + false)) return -EIO; mb = page_address(page); @@ -927,7 +929,8 @@ static int r5l_recovery_flush_one_stripe(struct r5l_log *log, &disk_index, sh); sync_page_io(log->rdev, *log_offset, PAGE_SIZE, - sh->dev[disk_index].page, READ, false); + sh->dev[disk_index].page, REQ_OP_READ, 0, + false); sh->dev[disk_index].log_checksum = le32_to_cpu(payload->checksum[0]); set_bit(R5_Wantwrite, &sh->dev[disk_index].flags); @@ -935,7 +938,8 @@ static int r5l_recovery_flush_one_stripe(struct r5l_log *log, } else { disk_index = sh->pd_idx; sync_page_io(log->rdev, *log_offset, PAGE_SIZE, - sh->dev[disk_index].page, READ, false); + sh->dev[disk_index].page, REQ_OP_READ, 0, + false); sh->dev[disk_index].log_checksum = le32_to_cpu(payload->checksum[0]); set_bit(R5_Wantwrite, &sh->dev[disk_index].flags); @@ -945,7 +949,7 @@ static int r5l_recovery_flush_one_stripe(struct r5l_log *log, sync_page_io(log->rdev, r5l_ring_add(log, *log_offset, BLOCK_SECTORS), PAGE_SIZE, sh->dev[disk_index].page, - READ, false); + REQ_OP_READ, 0, false); sh->dev[disk_index].log_checksum = le32_to_cpu(payload->checksum[1]); set_bit(R5_Wantwrite, @@ -987,11 +991,13 @@ static int r5l_recovery_flush_one_stripe(struct r5l_log *log, rdev = rcu_dereference(conf->disks[disk_index].rdev); if (rdev) sync_page_io(rdev, stripe_sect, PAGE_SIZE, - sh->dev[disk_index].page, WRITE, false); + sh->dev[disk_index].page, REQ_OP_WRITE, 0, + false); rrdev = rcu_dereference(conf->disks[disk_index].replacement); if (rrdev) sync_page_io(rrdev, stripe_sect, PAGE_SIZE, - sh->dev[disk_index].page, WRITE, false); + sh->dev[disk_index].page, REQ_OP_WRITE, 0, + false); } raid5_release_stripe(sh); return 0; @@ -1063,7 +1069,8 @@ static int r5l_log_write_empty_meta_block(struct r5l_log *log, sector_t pos, crc = crc32c_le(log->uuid_checksum, mb, PAGE_SIZE); mb->checksum = cpu_to_le32(crc); - if (!sync_page_io(log->rdev, pos, PAGE_SIZE, page, WRITE_FUA, false)) { + if (!sync_page_io(log->rdev, pos, PAGE_SIZE, page, REQ_OP_WRITE, + WRITE_FUA, false)) { __free_page(page); return -EIO; } @@ -1138,7 +1145,7 @@ static int r5l_load_log(struct r5l_log *log) if (!page) return -ENOMEM; - if (!sync_page_io(rdev, cp, PAGE_SIZE, page, READ, false)) { + if (!sync_page_io(rdev, cp, PAGE_SIZE, page, REQ_OP_READ, 0, false)) { ret = -EIO; goto ioerr; } diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 8ab8b65..c36b817 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -806,7 +806,8 @@ static void stripe_add_to_batch_list(struct r5conf *conf, struct stripe_head *sh dd_idx = 0; while (dd_idx == sh->pd_idx || dd_idx == sh->qd_idx) dd_idx++; - if (head->dev[dd_idx].towrite->bi_rw != sh->dev[dd_idx].towrite->bi_rw) + if (head->dev[dd_idx].towrite->bi_rw != sh->dev[dd_idx].towrite->bi_rw || + head->dev[dd_idx].towrite->bi_op != sh->dev[dd_idx].towrite->bi_op) goto unlock_out; if (head->batch_head) { @@ -891,29 +892,32 @@ static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s) if (r5l_write_stripe(conf->log, sh) == 0) return; for (i = disks; i--; ) { - int rw; + int op; + int op_flags = 0; int replace_only = 0; struct bio *bi, *rbi; struct md_rdev *rdev, *rrdev = NULL; sh = head_sh; if (test_and_clear_bit(R5_Wantwrite, &sh->dev[i].flags)) { - if (test_and_clear_bit(R5_WantFUA, &sh->dev[i].flags)) - rw = WRITE_FUA; - else - rw = WRITE; + if (test_and_clear_bit(R5_WantFUA, &sh->dev[i].flags)) { + op = REQ_OP_WRITE; + op_flags = WRITE_FUA; + } else { + op = REQ_OP_WRITE; + } if (test_bit(R5_Discard, &sh->dev[i].flags)) - rw |= REQ_DISCARD; + op = REQ_OP_DISCARD; } else if (test_and_clear_bit(R5_Wantread, &sh->dev[i].flags)) - rw = READ; + op = REQ_OP_READ; else if (test_and_clear_bit(R5_WantReplace, &sh->dev[i].flags)) { - rw = WRITE; + op = REQ_OP_WRITE; replace_only = 1; } else continue; if (test_and_clear_bit(R5_SyncIO, &sh->dev[i].flags)) - rw |= REQ_SYNC; + op_flags |= REQ_SYNC; again: bi = &sh->dev[i].req; @@ -927,7 +931,7 @@ again: rdev = rrdev; rrdev = NULL; } - if (rw & WRITE) { + if (op_is_write(op)) { if (replace_only) rdev = NULL; if (rdev == rrdev) @@ -953,7 +957,7 @@ again: * need to check for writes. We never accept write errors * on the replacement, so we don't to check rrdev. */ - while ((rw & WRITE) && rdev && + while (op_is_write(op) && rdev && test_bit(WriteErrorSeen, &rdev->flags)) { sector_t first_bad; int bad_sectors; @@ -995,8 +999,9 @@ again: bio_reset(bi); bi->bi_bdev = rdev->bdev; - bi->bi_rw = rw; - bi->bi_end_io = (rw & WRITE) + bi->bi_op = op; + bi->bi_rw = op_flags; + bi->bi_end_io = op_is_write(op) ? raid5_end_write_request : raid5_end_read_request; bi->bi_private = sh; @@ -1027,7 +1032,7 @@ again: * If this is discard request, set bi_vcnt 0. We don't * want to confuse SCSI because SCSI will replace payload */ - if (rw & REQ_DISCARD) + if (op == REQ_OP_DISCARD) bi->bi_vcnt = 0; if (rrdev) set_bit(R5_DOUBLE_LOCKED, &sh->dev[i].flags); @@ -1047,8 +1052,9 @@ again: bio_reset(rbi); rbi->bi_bdev = rrdev->bdev; - rbi->bi_rw = rw; - BUG_ON(!(rw & WRITE)); + rbi->bi_op = op; + rbi->bi_rw = op_flags; + BUG_ON(!op_is_write(op)); rbi->bi_end_io = raid5_end_write_request; rbi->bi_private = sh; @@ -1076,7 +1082,7 @@ again: * If this is discard request, set bi_vcnt 0. We don't * want to confuse SCSI because SCSI will replace payload */ - if (rw & REQ_DISCARD) + if (op == REQ_OP_DISCARD) rbi->bi_vcnt = 0; if (conf->mddev->gendisk) trace_block_bio_remap(bdev_get_queue(rbi->bi_bdev), @@ -1085,7 +1091,7 @@ again: generic_make_request(rbi); } if (!rdev && !rrdev) { - if (rw & WRITE) + if (op_is_write(op)) set_bit(STRIPE_DEGRADED, &sh->state); pr_debug("skip op %ld on disc %d for sector %llu\n", bi->bi_rw, i, (unsigned long long)sh->sector); @@ -1623,7 +1629,7 @@ again: set_bit(R5_WantFUA, &dev->flags); if (wbi->bi_rw & REQ_SYNC) set_bit(R5_SyncIO, &dev->flags); - if (wbi->bi_rw & REQ_DISCARD) + if (wbi->bi_op == REQ_OP_DISCARD) set_bit(R5_Discard, &dev->flags); else { tx = async_copy_data(1, wbi, &dev->page, @@ -5178,7 +5184,7 @@ static void raid5_make_request(struct mddev *mddev, struct bio * bi) return; } - if (unlikely(bi->bi_rw & REQ_DISCARD)) { + if (unlikely(bi->bi_op == REQ_OP_DISCARD)) { make_discard_request(mddev, bi); return; } -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 17D837CFD for ; Wed, 13 Apr 2016 14:37:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7013CAC003 for ; Wed, 13 Apr 2016 12:37:32 -0700 (PDT) X-ASG-Debug-ID: 1460576250-04cb6c245f4b5100001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id m1638eJAuJbd5LNB (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:31 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 893387F09A; Wed, 13 Apr 2016 19:37:30 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9K018278; Wed, 13 Apr 2016 15:37:28 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 24/42] xen: set bi_op to REQ_OP Date: Wed, 13 Apr 2016 14:36:10 -0500 X-ASG-Orig-Subj: [PATCH 24/42] xen: set bi_op to REQ_OP Message-Id: <1460576188-5751-25-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576251 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has the xen block driver use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- drivers/block/xen-blkback/blkback.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c index 79fe493..854ecca 100644 --- a/drivers/block/xen-blkback/blkback.c +++ b/drivers/block/xen-blkback/blkback.c @@ -501,7 +501,7 @@ static int xen_vbd_translate(struct phys_req *req, struct xen_blkif *blkif, struct xen_vbd *vbd = &blkif->vbd; int rc = -EACCES; - if ((operation != READ) && vbd->readonly) + if ((operation != REQ_OP_READ) && vbd->readonly) goto out; if (likely(req->nr_sects)) { @@ -1014,7 +1014,7 @@ static int dispatch_discard_io(struct xen_blkif_ring *ring, preq.sector_number = req->u.discard.sector_number; preq.nr_sects = req->u.discard.nr_sectors; - err = xen_vbd_translate(&preq, blkif, WRITE); + err = xen_vbd_translate(&preq, blkif, REQ_OP_WRITE); if (err) { pr_warn("access denied: DISCARD [%llu->%llu] on dev=%04x\n", preq.sector_number, @@ -1229,6 +1229,7 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, struct bio **biolist = pending_req->biolist; int i, nbio = 0; int operation; + int operation_flags = 0; struct blk_plug plug; bool drain = false; struct grant_page **pages = pending_req->segments; @@ -1247,17 +1248,19 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, switch (req_operation) { case BLKIF_OP_READ: ring->st_rd_req++; - operation = READ; + operation = REQ_OP_READ; break; case BLKIF_OP_WRITE: ring->st_wr_req++; - operation = WRITE_ODIRECT; + operation = REQ_OP_WRITE; + operation_flags = WRITE_ODIRECT; break; case BLKIF_OP_WRITE_BARRIER: drain = true; case BLKIF_OP_FLUSH_DISKCACHE: ring->st_f_req++; - operation = WRITE_FLUSH; + operation = REQ_OP_WRITE; + operation_flags = WRITE_FLUSH; break; default: operation = 0; /* make gcc happy */ @@ -1269,7 +1272,7 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, nseg = req->operation == BLKIF_OP_INDIRECT ? req->u.indirect.nr_segments : req->u.rw.nr_segments; - if (unlikely(nseg == 0 && operation != WRITE_FLUSH) || + if (unlikely(nseg == 0 && operation_flags != WRITE_FLUSH) || unlikely((req->operation != BLKIF_OP_INDIRECT) && (nseg > BLKIF_MAX_SEGMENTS_PER_REQUEST)) || unlikely((req->operation == BLKIF_OP_INDIRECT) && @@ -1310,7 +1313,7 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, if (xen_vbd_translate(&preq, ring->blkif, operation) != 0) { pr_debug("access denied: %s of [%llu,%llu] on dev=%04x\n", - operation == READ ? "read" : "write", + operation == REQ_OP_READ ? "read" : "write", preq.sector_number, preq.sector_number + preq.nr_sects, ring->blkif->vbd.pdevice); @@ -1369,7 +1372,8 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, bio->bi_private = pending_req; bio->bi_end_io = end_block_io_op; bio->bi_iter.bi_sector = preq.sector_number; - bio->bi_rw = operation; + bio->bi_op = operation; + bio->bi_rw = operation_flags; } preq.sector_number += seg[i].nsec; @@ -1377,7 +1381,7 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, /* This will be hit if the operation was a flush or discard. */ if (!bio) { - BUG_ON(operation != WRITE_FLUSH); + BUG_ON(operation_flags != WRITE_FLUSH); bio = bio_alloc(GFP_KERNEL, 0); if (unlikely(bio == NULL)) @@ -1387,7 +1391,8 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, bio->bi_bdev = preq.bdev; bio->bi_private = pending_req; bio->bi_end_io = end_block_io_op; - bio->bi_rw = operation; + bio->bi_op = operation; + bio->bi_rw = operation_flags; } atomic_set(&pending_req->pendcnt, nbio); @@ -1399,9 +1404,9 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, /* Let the I/Os go.. */ blk_finish_plug(&plug); - if (operation == READ) + if (operation == REQ_OP_READ) ring->st_rd_sect += preq.nr_sects; - else if (operation & WRITE) + else if (operation == REQ_OP_WRITE) ring->st_wr_sect += preq.nr_sects; return 0; -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 52DC47D41 for ; Wed, 13 Apr 2016 14:37:35 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B53E0AC004 for ; Wed, 13 Apr 2016 12:37:34 -0700 (PDT) X-ASG-Debug-ID: 1460576253-04cbb02e1a1a0ae0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 0fFskz678jy3Myy0 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:33 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B7BE781F07; Wed, 13 Apr 2016 19:37:32 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9L018278; Wed, 13 Apr 2016 15:37:30 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 25/42] target: set bi_op to REQ_OP Date: Wed, 13 Apr 2016 14:36:11 -0500 X-ASG-Orig-Subj: [PATCH 25/42] target: set bi_op to REQ_OP Message-Id: <1460576188-5751-26-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576253 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has the target modules use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Acked-by: Nicholas Bellinger Reviewed-by: Christoph Hellwig --- drivers/target/target_core_iblock.c | 38 +++++++++++++++++++++---------------- drivers/target/target_core_pscsi.c | 2 +- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c index c887f7d..fb1543b 100644 --- a/drivers/target/target_core_iblock.c +++ b/drivers/target/target_core_iblock.c @@ -312,7 +312,8 @@ static void iblock_bio_done(struct bio *bio) } static struct bio * -iblock_get_bio(struct se_cmd *cmd, sector_t lba, u32 sg_num, int rw) +iblock_get_bio(struct se_cmd *cmd, sector_t lba, u32 sg_num, int op, + int op_flags) { struct iblock_dev *ib_dev = IBLOCK_DEV(cmd->se_dev); struct bio *bio; @@ -334,7 +335,8 @@ iblock_get_bio(struct se_cmd *cmd, sector_t lba, u32 sg_num, int rw) bio->bi_private = cmd; bio->bi_end_io = &iblock_bio_done; bio->bi_iter.bi_sector = lba; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; return bio; } @@ -480,7 +482,7 @@ iblock_execute_write_same(struct se_cmd *cmd) goto fail; cmd->priv = ibr; - bio = iblock_get_bio(cmd, block_lba, 1, WRITE); + bio = iblock_get_bio(cmd, block_lba, 1, REQ_OP_WRITE, 0); if (!bio) goto fail_free_ibr; @@ -493,7 +495,8 @@ iblock_execute_write_same(struct se_cmd *cmd) while (bio_add_page(bio, sg_page(sg), sg->length, sg->offset) != sg->length) { - bio = iblock_get_bio(cmd, block_lba, 1, WRITE); + bio = iblock_get_bio(cmd, block_lba, 1, REQ_OP_WRITE, + 0); if (!bio) goto fail_put_bios; @@ -679,8 +682,7 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, struct scatterlist *sg; u32 sg_num = sgl_nents; unsigned bio_cnt; - int rw = 0; - int i; + int i, op, op_flags = 0; if (data_direction == DMA_TO_DEVICE) { struct iblock_dev *ib_dev = IBLOCK_DEV(dev); @@ -690,17 +692,20 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, * is not enabled, or if initiator set the Force Unit Access bit. */ if (q->flush_flags & REQ_FUA) { - if (cmd->se_cmd_flags & SCF_FUA) - rw = WRITE_FUA; - else if (!(q->flush_flags & REQ_FLUSH)) - rw = WRITE_FUA; - else - rw = WRITE; + if (cmd->se_cmd_flags & SCF_FUA) { + op = REQ_OP_WRITE; + op_flags = WRITE_FUA; + } else if (!(q->flush_flags & REQ_FLUSH)) { + op = REQ_OP_WRITE; + op_flags = WRITE_FUA; + } else { + op = REQ_OP_WRITE; + } } else { - rw = WRITE; + op = REQ_OP_WRITE; } } else { - rw = READ; + op = REQ_OP_READ; } ibr = kzalloc(sizeof(struct iblock_req), GFP_KERNEL); @@ -714,7 +719,7 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, return 0; } - bio = iblock_get_bio(cmd, block_lba, sgl_nents, rw); + bio = iblock_get_bio(cmd, block_lba, sgl_nents, op, op_flags); if (!bio) goto fail_free_ibr; @@ -738,7 +743,8 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, bio_cnt = 0; } - bio = iblock_get_bio(cmd, block_lba, sg_num, rw); + bio = iblock_get_bio(cmd, block_lba, sg_num, op, + op_flags); if (!bio) goto fail_put_bios; diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c index de18790..2cf915c 100644 --- a/drivers/target/target_core_pscsi.c +++ b/drivers/target/target_core_pscsi.c @@ -922,7 +922,7 @@ pscsi_map_sg(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, goto fail; if (rw) - bio->bi_rw |= REQ_WRITE; + bio->bi_op = REQ_OP_WRITE; pr_debug("PSCSI: Allocated bio: %p," " dir: %s nr_vecs: %d\n", bio, -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2F40D7D4B for ; Wed, 13 Apr 2016 14:37:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9CF93AC004 for ; Wed, 13 Apr 2016 12:37:36 -0700 (PDT) X-ASG-Debug-ID: 1460576255-04cbb02e1b1a0af0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BFLiDwILtSF5Ne9N (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:35 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0243062659; Wed, 13 Apr 2016 19:37:35 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9M018278; Wed, 13 Apr 2016 15:37:32 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 26/42] block: copy bio op to request op Date: Wed, 13 Apr 2016 14:36:12 -0500 X-ASG-Orig-Subj: [PATCH 26/42] block: copy bio op to request op Message-Id: <1460576188-5751-27-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Wed, 13 Apr 2016 19:37:35 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460576255 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie The bio users should now always be setting up the bio->bi_op. This patch has us copy that to the struct request op field. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- block/blk-core.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/block/blk-core.c b/block/blk-core.c index 6bcc22e..4224775 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -2990,6 +2990,7 @@ void blk_rq_bio_prep(struct request_queue *q, struct request *rq, { /* tmp compat. Allow users to set bi_op or bi_rw */ rq->cmd_flags |= bio_data_dir(bio); + rq->op = bio->bi_op; if (bio_has_data(bio)) rq->nr_phys_segments = bio_phys_segments(q, bio); @@ -3074,6 +3075,7 @@ EXPORT_SYMBOL_GPL(blk_rq_unprep_clone); static void __blk_rq_prep_clone(struct request *dst, struct request *src) { dst->cpu = src->cpu; + dst->op = src->op; dst->cmd_flags |= (src->cmd_flags & REQ_CLONE_MASK) | REQ_NOMERGE; dst->cmd_type = src->cmd_type; dst->__sector = blk_rq_pos(src); -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 526067CE7 for ; Wed, 13 Apr 2016 14:37:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2641E8F8049 for ; Wed, 13 Apr 2016 12:37:39 -0700 (PDT) X-ASG-Debug-ID: 1460576257-04cbb02e1c1a0b10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id L1nT0gcMCA1gSuGj (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:37 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4AB297F097; Wed, 13 Apr 2016 19:37:37 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9N018278; Wed, 13 Apr 2016 15:37:35 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 27/42] block: prepare request creation/destruction code to use REQ_OPs Date: Wed, 13 Apr 2016 14:36:13 -0500 X-ASG-Orig-Subj: [PATCH 27/42] block: prepare request creation/destruction code to use REQ_OPs Message-Id: <1460576188-5751-28-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576257 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch prepares *_get_request/*_put_request and freed_request, to use separate variables for the operation and flags. In the next patches the struct request users will be converted like was done for bios. request->op will be used for the REQ_OP and request->cmd_flags for the rq_flag_bits. There is some temporary compat code in __get_request to allow users to read the operation from the cmd_flags. This will be deleted in one of the last patches when all drivers have been converted. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- block/blk-core.c | 56 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index 4224775..f1545d1 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -959,10 +959,10 @@ static void __freed_request(struct request_list *rl, int sync) * A request has just been released. Account for it, update the full and * congestion status, wake up any waiters. Called under q->queue_lock. */ -static void freed_request(struct request_list *rl, unsigned int flags) +static void freed_request(struct request_list *rl, int op, unsigned int flags) { struct request_queue *q = rl->q; - int sync = rw_is_sync(flags); + int sync = rw_is_sync(op | flags); q->nr_rqs[sync]--; rl->count[sync]--; @@ -1054,7 +1054,8 @@ static struct io_context *rq_ioc(struct bio *bio) /** * __get_request - get a free request * @rl: request list to allocate from - * @rw_flags: RW and SYNC flags + * @op: REQ_OP_READ/REQ_OP_WRITE + * @op_flags: rq_flag_bits * @bio: bio to allocate request for (can be %NULL) * @gfp_mask: allocation mask * @@ -1065,21 +1066,22 @@ static struct io_context *rq_ioc(struct bio *bio) * Returns ERR_PTR on failure, with @q->queue_lock held. * Returns request pointer on success, with @q->queue_lock *not held*. */ -static struct request *__get_request(struct request_list *rl, int rw_flags, - struct bio *bio, gfp_t gfp_mask) +static struct request *__get_request(struct request_list *rl, int op, + int op_flags, struct bio *bio, + gfp_t gfp_mask) { struct request_queue *q = rl->q; struct request *rq; struct elevator_type *et = q->elevator->type; struct io_context *ioc = rq_ioc(bio); struct io_cq *icq = NULL; - const bool is_sync = rw_is_sync(rw_flags) != 0; + const bool is_sync = rw_is_sync(op | op_flags) != 0; int may_queue; if (unlikely(blk_queue_dying(q))) return ERR_PTR(-ENODEV); - may_queue = elv_may_queue(q, rw_flags); + may_queue = elv_may_queue(q, op | op_flags); if (may_queue == ELV_MQUEUE_NO) goto rq_starved; @@ -1123,7 +1125,7 @@ static struct request *__get_request(struct request_list *rl, int rw_flags, /* * Decide whether the new request will be managed by elevator. If - * so, mark @rw_flags and increment elvpriv. Non-zero elvpriv will + * so, mark @op_flags and increment elvpriv. Non-zero elvpriv will * prevent the current elevator from being destroyed until the new * request is freed. This guarantees icq's won't be destroyed and * makes creating new ones safe. @@ -1132,14 +1134,14 @@ static struct request *__get_request(struct request_list *rl, int rw_flags, * it will be created after releasing queue_lock. */ if (blk_rq_should_init_elevator(bio) && !blk_queue_bypass(q)) { - rw_flags |= REQ_ELVPRIV; + op_flags |= REQ_ELVPRIV; q->nr_rqs_elvpriv++; if (et->icq_cache && ioc) icq = ioc_lookup_icq(ioc, q); } if (blk_queue_io_stat(q)) - rw_flags |= REQ_IO_STAT; + op_flags |= REQ_IO_STAT; spin_unlock_irq(q->queue_lock); /* allocate and init request */ @@ -1149,10 +1151,12 @@ static struct request *__get_request(struct request_list *rl, int rw_flags, blk_rq_init(q, rq); blk_rq_set_rl(rq, rl); - rq->cmd_flags = rw_flags | REQ_ALLOCED; + /* tmp compat - allow users to check either one for the op */ + rq->cmd_flags = op | op_flags | REQ_ALLOCED; + rq->op = op; /* init elvpriv */ - if (rw_flags & REQ_ELVPRIV) { + if (op_flags & REQ_ELVPRIV) { if (unlikely(et->icq_cache && !icq)) { if (ioc) icq = ioc_create_icq(ioc, q, gfp_mask); @@ -1178,7 +1182,7 @@ out: if (ioc_batching(q, ioc)) ioc->nr_batch_requests--; - trace_block_getrq(q, bio, rw_flags & 1); + trace_block_getrq(q, bio, op); return rq; fail_elvpriv: @@ -1208,7 +1212,7 @@ fail_alloc: * queue, but this is pretty rare. */ spin_lock_irq(q->queue_lock); - freed_request(rl, rw_flags); + freed_request(rl, op, op_flags); /* * in the very unlikely event that allocation failed and no @@ -1226,7 +1230,8 @@ rq_starved: /** * get_request - get a free request * @q: request_queue to allocate request from - * @rw_flags: RW and SYNC flags + * @op: REQ_OP_READ/REQ_OP_WRITE + * @op_flags: rq_flag_bits * @bio: bio to allocate request for (can be %NULL) * @gfp_mask: allocation mask * @@ -1237,17 +1242,18 @@ rq_starved: * Returns ERR_PTR on failure, with @q->queue_lock held. * Returns request pointer on success, with @q->queue_lock *not held*. */ -static struct request *get_request(struct request_queue *q, int rw_flags, - struct bio *bio, gfp_t gfp_mask) +static struct request *get_request(struct request_queue *q, int op, + int op_flags, struct bio *bio, + gfp_t gfp_mask) { - const bool is_sync = rw_is_sync(rw_flags) != 0; + const bool is_sync = rw_is_sync(op | op_flags) != 0; DEFINE_WAIT(wait); struct request_list *rl; struct request *rq; rl = blk_get_rl(q, bio); /* transferred to @rq on success */ retry: - rq = __get_request(rl, rw_flags, bio, gfp_mask); + rq = __get_request(rl, op, op_flags, bio, gfp_mask); if (!IS_ERR(rq)) return rq; @@ -1260,7 +1266,7 @@ retry: prepare_to_wait_exclusive(&rl->wait[is_sync], &wait, TASK_UNINTERRUPTIBLE); - trace_block_sleeprq(q, bio, rw_flags & 1); + trace_block_sleeprq(q, bio, op); spin_unlock_irq(q->queue_lock); io_schedule(); @@ -1289,7 +1295,7 @@ static struct request *blk_old_get_request(struct request_queue *q, int rw, create_io_context(gfp_mask, q->node); spin_lock_irq(q->queue_lock); - rq = get_request(q, rw, NULL, gfp_mask); + rq = get_request(q, rw, 0, NULL, gfp_mask); if (IS_ERR(rq)) spin_unlock_irq(q->queue_lock); /* q->queue_lock is unlocked at this point */ @@ -1491,13 +1497,14 @@ void __blk_put_request(struct request_queue *q, struct request *req) */ if (req->cmd_flags & REQ_ALLOCED) { unsigned int flags = req->cmd_flags; + int op = req->op; struct request_list *rl = blk_rq_rl(req); BUG_ON(!list_empty(&req->queuelist)); BUG_ON(ELV_ON_HASH(req)); blk_free_request(rl, req); - freed_request(rl, flags); + freed_request(rl, op, flags); blk_put_rl(rl); } } @@ -1713,7 +1720,7 @@ static blk_qc_t blk_queue_bio(struct request_queue *q, struct bio *bio) { const bool sync = !!(bio->bi_rw & REQ_SYNC); struct blk_plug *plug; - int el_ret, rw_flags, where = ELEVATOR_INSERT_SORT; + int el_ret, rw_flags = 0, where = ELEVATOR_INSERT_SORT; struct request *req; unsigned int request_count = 0; @@ -1773,7 +1780,6 @@ get_rq: * but we need to set it earlier to expose the sync flag to the * rq allocator and io schedulers. */ - rw_flags = bio_data_dir(bio); if (sync) rw_flags |= REQ_SYNC; @@ -1781,7 +1787,7 @@ get_rq: * Grab a free request. This is might sleep but can not fail. * Returns with the queue unlocked. */ - req = get_request(q, rw_flags, bio, GFP_NOIO); + req = get_request(q, bio_data_dir(bio), rw_flags, bio, GFP_NOIO); if (IS_ERR(req)) { bio->bi_error = PTR_ERR(req); bio_endio(bio); -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6CA5F7D53 for ; Wed, 13 Apr 2016 14:37:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2210E8F8039 for ; Wed, 13 Apr 2016 12:37:41 -0700 (PDT) X-ASG-Debug-ID: 1460576259-04bdf011054b3370001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id rwww1UoyLXfeiKBp (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:39 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8D1DAC04B303; Wed, 13 Apr 2016 19:37:39 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9O018278; Wed, 13 Apr 2016 15:37:37 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 28/42] block: prepare mq request creation to use REQ_OPs Date: Wed, 13 Apr 2016 14:36:14 -0500 X-ASG-Orig-Subj: [PATCH 28/42] block: prepare mq request creation to use REQ_OPs Message-Id: <1460576188-5751-29-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576259 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch modifies the blk mq request creation code to use separate variables for the operation and flags, because in the the next patches the struct request users will be converted like was done for bios. request->op will be used for the REQ_OP and request->cmd_flags for the rq_flag_bits. Like the non mq patch there is some temporary compat code in blk_mq_rq_ctx_init to allow users to read the operation from the cmd_flags. This will be deleted in one of the last patches when all drivers have been converted. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- block/blk-mq.c | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/block/blk-mq.c b/block/blk-mq.c index 1699baf..4843c0b 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -159,16 +159,19 @@ bool blk_mq_can_queue(struct blk_mq_hw_ctx *hctx) EXPORT_SYMBOL(blk_mq_can_queue); static void blk_mq_rq_ctx_init(struct request_queue *q, struct blk_mq_ctx *ctx, - struct request *rq, unsigned int rw_flags) + struct request *rq, int op, + unsigned int op_flags) { if (blk_queue_io_stat(q)) - rw_flags |= REQ_IO_STAT; + op_flags |= REQ_IO_STAT; INIT_LIST_HEAD(&rq->queuelist); /* csd/requeue_work/fifo_time is initialized before use */ rq->q = q; rq->mq_ctx = ctx; - rq->cmd_flags |= rw_flags; + rq->op = op; + /* tmp compat - allow users to check either one for the op */ + rq->cmd_flags |= op | op_flags; /* do not touch atomic flags, it needs atomic ops against the timer */ rq->cpu = -1; INIT_HLIST_NODE(&rq->hash); @@ -203,11 +206,11 @@ static void blk_mq_rq_ctx_init(struct request_queue *q, struct blk_mq_ctx *ctx, rq->end_io_data = NULL; rq->next_rq = NULL; - ctx->rq_dispatched[rw_is_sync(rw_flags)]++; + ctx->rq_dispatched[rw_is_sync(op | op_flags)]++; } static struct request * -__blk_mq_alloc_request(struct blk_mq_alloc_data *data, int rw) +__blk_mq_alloc_request(struct blk_mq_alloc_data *data, int op, int op_flags) { struct request *rq; unsigned int tag; @@ -222,7 +225,7 @@ __blk_mq_alloc_request(struct blk_mq_alloc_data *data, int rw) } rq->tag = tag; - blk_mq_rq_ctx_init(data->q, data->ctx, rq, rw); + blk_mq_rq_ctx_init(data->q, data->ctx, rq, op, op_flags); return rq; } @@ -246,7 +249,7 @@ struct request *blk_mq_alloc_request(struct request_queue *q, int rw, hctx = q->mq_ops->map_queue(q, ctx->cpu); blk_mq_set_alloc_data(&alloc_data, q, flags, ctx, hctx); - rq = __blk_mq_alloc_request(&alloc_data, rw); + rq = __blk_mq_alloc_request(&alloc_data, rw, 0); if (!rq && !(flags & BLK_MQ_REQ_NOWAIT)) { __blk_mq_run_hw_queue(hctx); blk_mq_put_ctx(ctx); @@ -254,7 +257,7 @@ struct request *blk_mq_alloc_request(struct request_queue *q, int rw, ctx = blk_mq_get_ctx(q); hctx = q->mq_ops->map_queue(q, ctx->cpu); blk_mq_set_alloc_data(&alloc_data, q, flags, ctx, hctx); - rq = __blk_mq_alloc_request(&alloc_data, rw); + rq = __blk_mq_alloc_request(&alloc_data, rw, 0); ctx = alloc_data.ctx; } blk_mq_put_ctx(ctx); @@ -1170,28 +1173,29 @@ static struct request *blk_mq_map_request(struct request_queue *q, struct blk_mq_hw_ctx *hctx; struct blk_mq_ctx *ctx; struct request *rq; - int rw = bio_data_dir(bio); + int op = bio_data_dir(bio); + int op_flags = 0; struct blk_mq_alloc_data alloc_data; blk_queue_enter_live(q); ctx = blk_mq_get_ctx(q); hctx = q->mq_ops->map_queue(q, ctx->cpu); - if (rw_is_sync(bio->bi_rw)) - rw |= REQ_SYNC; + if (rw_is_sync(bio->bi_op | bio->bi_rw)) + op_flags |= REQ_SYNC; - trace_block_getrq(q, bio, rw); + trace_block_getrq(q, bio, op); blk_mq_set_alloc_data(&alloc_data, q, BLK_MQ_REQ_NOWAIT, ctx, hctx); - rq = __blk_mq_alloc_request(&alloc_data, rw); + rq = __blk_mq_alloc_request(&alloc_data, op, op_flags); if (unlikely(!rq)) { __blk_mq_run_hw_queue(hctx); blk_mq_put_ctx(ctx); - trace_block_sleeprq(q, bio, rw); + trace_block_sleeprq(q, bio, op); ctx = blk_mq_get_ctx(q); hctx = q->mq_ops->map_queue(q, ctx->cpu); blk_mq_set_alloc_data(&alloc_data, q, 0, ctx, hctx); - rq = __blk_mq_alloc_request(&alloc_data, rw); + rq = __blk_mq_alloc_request(&alloc_data, op, op_flags); ctx = alloc_data.ctx; hctx = alloc_data.hctx; } @@ -1245,7 +1249,7 @@ static int blk_mq_direct_issue_request(struct request *rq, blk_qc_t *cookie) */ static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio) { - const int is_sync = rw_is_sync(bio->bi_rw); + const int is_sync = rw_is_sync(bio->bi_op | bio->bi_rw); const int is_flush_fua = bio->bi_rw & (REQ_FLUSH | REQ_FUA); struct blk_map_ctx data; struct request *rq; @@ -1342,7 +1346,7 @@ done: */ static blk_qc_t blk_sq_make_request(struct request_queue *q, struct bio *bio) { - const int is_sync = rw_is_sync(bio->bi_rw); + const int is_sync = rw_is_sync(bio->bi_op | bio->bi_rw); const int is_flush_fua = bio->bi_rw & (REQ_FLUSH | REQ_FUA); struct blk_plug *plug; unsigned int request_count = 0; -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 56DDE7D53 for ; Wed, 13 Apr 2016 14:37:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id AA851AC004 for ; Wed, 13 Apr 2016 12:37:43 -0700 (PDT) X-ASG-Debug-ID: 1460576262-04cbb02e1b1a0b40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ARLV9oWckKtwJ5CE (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:42 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D52D5C05E17F; Wed, 13 Apr 2016 19:37:41 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9P018278; Wed, 13 Apr 2016 15:37:39 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 29/42] block: prepare elevator to use REQ_OPs. Date: Wed, 13 Apr 2016 14:36:15 -0500 X-ASG-Orig-Subj: [PATCH 29/42] block: prepare elevator to use REQ_OPs. Message-Id: <1460576188-5751-30-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576262 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch converts the elevator code to use separate variables for the operation and flags, and to check request->op for the REQ_OP. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- block/blk-core.c | 2 +- block/cfq-iosched.c | 4 ++-- block/elevator.c | 7 +++---- include/linux/elevator.h | 4 ++-- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index f1545d1..3ec1310 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1081,7 +1081,7 @@ static struct request *__get_request(struct request_list *rl, int op, if (unlikely(blk_queue_dying(q))) return ERR_PTR(-ENODEV); - may_queue = elv_may_queue(q, op | op_flags); + may_queue = elv_may_queue(q, op, op_flags); if (may_queue == ELV_MQUEUE_NO) goto rq_starved; diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 4a34978..3fcc598 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c @@ -4285,7 +4285,7 @@ static inline int __cfq_may_queue(struct cfq_queue *cfqq) return ELV_MQUEUE_MAY; } -static int cfq_may_queue(struct request_queue *q, int rw) +static int cfq_may_queue(struct request_queue *q, int op, int op_flags) { struct cfq_data *cfqd = q->elevator->elevator_data; struct task_struct *tsk = current; @@ -4302,7 +4302,7 @@ static int cfq_may_queue(struct request_queue *q, int rw) if (!cic) return ELV_MQUEUE_MAY; - cfqq = cic_to_cfqq(cic, rw_is_sync(rw)); + cfqq = cic_to_cfqq(cic, rw_is_sync(op | op_flags)); if (cfqq) { cfq_init_prio_data(cfqq, cic); diff --git a/block/elevator.c b/block/elevator.c index c3555c9..6a282bf 100644 --- a/block/elevator.c +++ b/block/elevator.c @@ -366,8 +366,7 @@ void elv_dispatch_sort(struct request_queue *q, struct request *rq) list_for_each_prev(entry, &q->queue_head) { struct request *pos = list_entry_rq(entry); - if ((rq->cmd_flags & REQ_DISCARD) != - (pos->cmd_flags & REQ_DISCARD)) + if ((rq->op == REQ_OP_DISCARD) != (pos->op == REQ_OP_DISCARD)) break; if (rq_data_dir(rq) != rq_data_dir(pos)) break; @@ -717,12 +716,12 @@ void elv_put_request(struct request_queue *q, struct request *rq) e->type->ops.elevator_put_req_fn(rq); } -int elv_may_queue(struct request_queue *q, int rw) +int elv_may_queue(struct request_queue *q, int op, int op_flags) { struct elevator_queue *e = q->elevator; if (e->type->ops.elevator_may_queue_fn) - return e->type->ops.elevator_may_queue_fn(q, rw); + return e->type->ops.elevator_may_queue_fn(q, op, op_flags); return ELV_MQUEUE_MAY; } diff --git a/include/linux/elevator.h b/include/linux/elevator.h index 638b324..953d286 100644 --- a/include/linux/elevator.h +++ b/include/linux/elevator.h @@ -26,7 +26,7 @@ typedef int (elevator_dispatch_fn) (struct request_queue *, int); typedef void (elevator_add_req_fn) (struct request_queue *, struct request *); typedef struct request *(elevator_request_list_fn) (struct request_queue *, struct request *); typedef void (elevator_completed_req_fn) (struct request_queue *, struct request *); -typedef int (elevator_may_queue_fn) (struct request_queue *, int); +typedef int (elevator_may_queue_fn) (struct request_queue *, int, int); typedef void (elevator_init_icq_fn) (struct io_cq *); typedef void (elevator_exit_icq_fn) (struct io_cq *); @@ -134,7 +134,7 @@ extern struct request *elv_former_request(struct request_queue *, struct request extern struct request *elv_latter_request(struct request_queue *, struct request *); extern int elv_register_queue(struct request_queue *q); extern void elv_unregister_queue(struct request_queue *q); -extern int elv_may_queue(struct request_queue *, int); +extern int elv_may_queue(struct request_queue *, int, int); extern void elv_completed_request(struct request_queue *, struct request *); extern int elv_set_request(struct request_queue *q, struct request *rq, struct bio *bio, gfp_t gfp_mask); -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 35E677D5A for ; Wed, 13 Apr 2016 14:37:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0ACE0304053 for ; Wed, 13 Apr 2016 12:37:45 -0700 (PDT) X-ASG-Debug-ID: 1460576264-04cbb02e1c1a0b50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id mEagTKbFZL5F52yW (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:44 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2CAC415DA; Wed, 13 Apr 2016 19:37:44 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9Q018278; Wed, 13 Apr 2016 15:37:41 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 30/42] blkg_rwstat: separate op from flags Date: Wed, 13 Apr 2016 14:36:16 -0500 X-ASG-Orig-Subj: [PATCH 30/42] blkg_rwstat: separate op from flags Message-Id: <1460576188-5751-31-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576264 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie The bio and request operation and flags are going to be separate definitions, so we cannot pass them in as a bitmap. This patch converts the blkg_rwstat code and its caller, cfq, to pass in the values separately. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- block/cfq-iosched.c | 49 +++++++++++++++++++++++++++------------------- include/linux/blk-cgroup.h | 13 ++++++------ 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 3fcc598..0dfa2dd 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c @@ -667,9 +667,10 @@ static inline void cfqg_put(struct cfq_group *cfqg) } while (0) static inline void cfqg_stats_update_io_add(struct cfq_group *cfqg, - struct cfq_group *curr_cfqg, int rw) + struct cfq_group *curr_cfqg, int op, + int op_flags) { - blkg_rwstat_add(&cfqg->stats.queued, rw, 1); + blkg_rwstat_add(&cfqg->stats.queued, op, op_flags, 1); cfqg_stats_end_empty_time(&cfqg->stats); cfqg_stats_set_start_group_wait_time(cfqg, curr_cfqg); } @@ -683,26 +684,30 @@ static inline void cfqg_stats_update_timeslice_used(struct cfq_group *cfqg, #endif } -static inline void cfqg_stats_update_io_remove(struct cfq_group *cfqg, int rw) +static inline void cfqg_stats_update_io_remove(struct cfq_group *cfqg, int op, + int op_flags) { - blkg_rwstat_add(&cfqg->stats.queued, rw, -1); + blkg_rwstat_add(&cfqg->stats.queued, op, op_flags, -1); } -static inline void cfqg_stats_update_io_merged(struct cfq_group *cfqg, int rw) +static inline void cfqg_stats_update_io_merged(struct cfq_group *cfqg, int op, + int op_flags) { - blkg_rwstat_add(&cfqg->stats.merged, rw, 1); + blkg_rwstat_add(&cfqg->stats.merged, op, op_flags, 1); } static inline void cfqg_stats_update_completion(struct cfq_group *cfqg, - uint64_t start_time, uint64_t io_start_time, int rw) + uint64_t start_time, uint64_t io_start_time, int op, + int op_flags) { struct cfqg_stats *stats = &cfqg->stats; unsigned long long now = sched_clock(); if (time_after64(now, io_start_time)) - blkg_rwstat_add(&stats->service_time, rw, now - io_start_time); + blkg_rwstat_add(&stats->service_time, op, op_flags, + now - io_start_time); if (time_after64(io_start_time, start_time)) - blkg_rwstat_add(&stats->wait_time, rw, + blkg_rwstat_add(&stats->wait_time, op, op_flags, io_start_time - start_time); } @@ -781,13 +786,16 @@ static inline void cfqg_put(struct cfq_group *cfqg) { } #define cfq_log_cfqg(cfqd, cfqg, fmt, args...) do {} while (0) static inline void cfqg_stats_update_io_add(struct cfq_group *cfqg, - struct cfq_group *curr_cfqg, int rw) { } + struct cfq_group *curr_cfqg, int op, int op_flags) { } static inline void cfqg_stats_update_timeslice_used(struct cfq_group *cfqg, unsigned long time, unsigned long unaccounted_time) { } -static inline void cfqg_stats_update_io_remove(struct cfq_group *cfqg, int rw) { } -static inline void cfqg_stats_update_io_merged(struct cfq_group *cfqg, int rw) { } +static inline void cfqg_stats_update_io_remove(struct cfq_group *cfqg, int op, + int op_flags) { } +static inline void cfqg_stats_update_io_merged(struct cfq_group *cfqg, int op, + int op_flags) { } static inline void cfqg_stats_update_completion(struct cfq_group *cfqg, - uint64_t start_time, uint64_t io_start_time, int rw) { } + uint64_t start_time, uint64_t io_start_time, int op, + int op_flags) { } #endif /* CONFIG_CFQ_GROUP_IOSCHED */ @@ -2461,10 +2469,10 @@ static void cfq_reposition_rq_rb(struct cfq_queue *cfqq, struct request *rq) { elv_rb_del(&cfqq->sort_list, rq); cfqq->queued[rq_is_sync(rq)]--; - cfqg_stats_update_io_remove(RQ_CFQG(rq), rq->cmd_flags); + cfqg_stats_update_io_remove(RQ_CFQG(rq), rq->op, rq->cmd_flags); cfq_add_rq_rb(rq); cfqg_stats_update_io_add(RQ_CFQG(rq), cfqq->cfqd->serving_group, - rq->cmd_flags); + rq->op, rq->cmd_flags); } static struct request * @@ -2517,7 +2525,7 @@ static void cfq_remove_request(struct request *rq) cfq_del_rq_rb(rq); cfqq->cfqd->rq_queued--; - cfqg_stats_update_io_remove(RQ_CFQG(rq), rq->cmd_flags); + cfqg_stats_update_io_remove(RQ_CFQG(rq), rq->op, rq->cmd_flags); if (rq->cmd_flags & REQ_PRIO) { WARN_ON(!cfqq->prio_pending); cfqq->prio_pending--; @@ -2552,7 +2560,7 @@ static void cfq_merged_request(struct request_queue *q, struct request *req, static void cfq_bio_merged(struct request_queue *q, struct request *req, struct bio *bio) { - cfqg_stats_update_io_merged(RQ_CFQG(req), bio->bi_rw); + cfqg_stats_update_io_merged(RQ_CFQG(req), bio->bi_op, bio->bi_rw); } static void @@ -2575,7 +2583,7 @@ cfq_merged_requests(struct request_queue *q, struct request *rq, if (cfqq->next_rq == next) cfqq->next_rq = rq; cfq_remove_request(next); - cfqg_stats_update_io_merged(RQ_CFQG(rq), next->cmd_flags); + cfqg_stats_update_io_merged(RQ_CFQG(rq), next->op, next->cmd_flags); cfqq = RQ_CFQQ(next); /* @@ -4108,7 +4116,7 @@ static void cfq_insert_request(struct request_queue *q, struct request *rq) rq->fifo_time = jiffies + cfqd->cfq_fifo_expire[rq_is_sync(rq)]; list_add_tail(&rq->queuelist, &cfqq->fifo); cfq_add_rq_rb(rq); - cfqg_stats_update_io_add(RQ_CFQG(rq), cfqd->serving_group, + cfqg_stats_update_io_add(RQ_CFQG(rq), cfqd->serving_group, rq->op, rq->cmd_flags); cfq_rq_enqueued(cfqd, cfqq, rq); } @@ -4206,7 +4214,8 @@ static void cfq_completed_request(struct request_queue *q, struct request *rq) cfqq->dispatched--; (RQ_CFQG(rq))->dispatched--; cfqg_stats_update_completion(cfqq->cfqg, rq_start_time_ns(rq), - rq_io_start_time_ns(rq), rq->cmd_flags); + rq_io_start_time_ns(rq), rq->op, + rq->cmd_flags); cfqd->rq_in_flight[cfq_cfqq_sync(cfqq)]--; diff --git a/include/linux/blk-cgroup.h b/include/linux/blk-cgroup.h index c02e669..9071feb 100644 --- a/include/linux/blk-cgroup.h +++ b/include/linux/blk-cgroup.h @@ -590,25 +590,26 @@ static inline void blkg_rwstat_exit(struct blkg_rwstat *rwstat) /** * blkg_rwstat_add - add a value to a blkg_rwstat * @rwstat: target blkg_rwstat - * @rw: mask of REQ_{WRITE|SYNC} + * @op: REQ_OP + * @op_flags: rq_flag_bits * @val: value to add * * Add @val to @rwstat. The counters are chosen according to @rw. The * caller is responsible for synchronizing calls to this function. */ static inline void blkg_rwstat_add(struct blkg_rwstat *rwstat, - int rw, uint64_t val) + int op, int op_flags, uint64_t val) { struct percpu_counter *cnt; - if (rw & REQ_WRITE) + if (op_is_write(op)) cnt = &rwstat->cpu_cnt[BLKG_RWSTAT_WRITE]; else cnt = &rwstat->cpu_cnt[BLKG_RWSTAT_READ]; __percpu_counter_add(cnt, val, BLKG_STAT_CPU_BATCH); - if (rw & REQ_SYNC) + if (op_flags & REQ_SYNC) cnt = &rwstat->cpu_cnt[BLKG_RWSTAT_SYNC]; else cnt = &rwstat->cpu_cnt[BLKG_RWSTAT_ASYNC]; @@ -713,9 +714,9 @@ static inline bool blkcg_bio_issue_check(struct request_queue *q, if (!throtl) { blkg = blkg ?: q->root_blkg; - blkg_rwstat_add(&blkg->stat_bytes, bio->bi_rw, + blkg_rwstat_add(&blkg->stat_bytes, bio->bi_op, bio->bi_rw, bio->bi_iter.bi_size); - blkg_rwstat_add(&blkg->stat_ios, bio->bi_rw, 1); + blkg_rwstat_add(&blkg->stat_ios, bio->bi_op, bio->bi_rw, 1); } rcu_read_unlock(); -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7352E7D54 for ; Wed, 13 Apr 2016 14:37:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3110C8F8035 for ; Wed, 13 Apr 2016 12:37:48 -0700 (PDT) X-ASG-Debug-ID: 1460576266-04cb6c24604b51b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id LKxtnn3GRBmwGpMK (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:47 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6179CC04B311; Wed, 13 Apr 2016 19:37:46 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9R018278; Wed, 13 Apr 2016 15:37:44 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 31/42] block: convert merge/insert code to check for REQ_OPs. Date: Wed, 13 Apr 2016 14:36:17 -0500 X-ASG-Orig-Subj: [PATCH 31/42] block: convert merge/insert code to check for REQ_OPs. Message-Id: <1460576188-5751-32-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576266 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch converts the block layer merging code to use separate variables for the operation and flags, and to check request->op for the REQ_OP. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- block/blk-core.c | 2 +- block/blk-merge.c | 10 ++++++---- include/linux/blkdev.h | 20 ++++++++++---------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index 3ec1310..5632cd1 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -2175,7 +2175,7 @@ EXPORT_SYMBOL(submit_bio); static int blk_cloned_rq_check_limits(struct request_queue *q, struct request *rq) { - if (blk_rq_sectors(rq) > blk_queue_get_max_sectors(q, rq->cmd_flags)) { + if (blk_rq_sectors(rq) > blk_queue_get_max_sectors(q, rq->op)) { printk(KERN_ERR "%s: over max size limit.\n", __func__); return -EIO; } diff --git a/block/blk-merge.c b/block/blk-merge.c index 2613531..c02371f 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -649,7 +649,8 @@ static int attempt_merge(struct request_queue *q, struct request *req, if (!rq_mergeable(req) || !rq_mergeable(next)) return 0; - if (!blk_check_merge_flags(req->cmd_flags, next->cmd_flags)) + if (!blk_check_merge_flags(req->cmd_flags, req->op, next->cmd_flags, + next->op)) return 0; /* @@ -663,7 +664,7 @@ static int attempt_merge(struct request_queue *q, struct request *req, || req_no_special_merge(next)) return 0; - if (req->cmd_flags & REQ_WRITE_SAME && + if (req->op == REQ_OP_WRITE_SAME && !blk_write_same_mergeable(req->bio, next->bio)) return 0; @@ -751,7 +752,8 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio) if (!rq_mergeable(rq) || !bio_mergeable(bio)) return false; - if (!blk_check_merge_flags(rq->cmd_flags, bio->bi_rw)) + if (!blk_check_merge_flags(rq->cmd_flags, rq->op, bio->bi_rw, + bio->bi_op)) return false; /* different data direction or already started, don't merge */ @@ -767,7 +769,7 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio) return false; /* must be using the same buffer */ - if (rq->cmd_flags & REQ_WRITE_SAME && + if (rq->op == REQ_OP_WRITE_SAME && !blk_write_same_mergeable(rq->bio, bio)) return false; diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index e2b2881..39df8ef 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -660,16 +660,16 @@ static inline bool rq_mergeable(struct request *rq) return true; } -static inline bool blk_check_merge_flags(unsigned int flags1, - unsigned int flags2) +static inline bool blk_check_merge_flags(unsigned int flags1, unsigned int op1, + unsigned int flags2, unsigned int op2) { - if ((flags1 & REQ_DISCARD) != (flags2 & REQ_DISCARD)) + if ((op1 == REQ_OP_DISCARD) != (op2 == REQ_OP_DISCARD)) return false; if ((flags1 & REQ_SECURE) != (flags2 & REQ_SECURE)) return false; - if ((flags1 & REQ_WRITE_SAME) != (flags2 & REQ_WRITE_SAME)) + if ((op1 == REQ_OP_WRITE_SAME) != (op2 == REQ_OP_WRITE_SAME)) return false; return true; @@ -870,12 +870,12 @@ static inline unsigned int blk_rq_cur_sectors(const struct request *rq) } static inline unsigned int blk_queue_get_max_sectors(struct request_queue *q, - unsigned int cmd_flags) + int op) { - if (unlikely(cmd_flags & REQ_DISCARD)) + if (unlikely(op == REQ_OP_DISCARD)) return min(q->limits.max_discard_sectors, UINT_MAX >> 9); - if (unlikely(cmd_flags & REQ_WRITE_SAME)) + if (unlikely(op == REQ_OP_WRITE_SAME)) return q->limits.max_write_same_sectors; return q->limits.max_sectors; @@ -902,11 +902,11 @@ static inline unsigned int blk_rq_get_max_sectors(struct request *rq) if (unlikely(rq->cmd_type != REQ_TYPE_FS)) return q->limits.max_hw_sectors; - if (!q->limits.chunk_sectors || (rq->cmd_flags & REQ_DISCARD)) - return blk_queue_get_max_sectors(q, rq->cmd_flags); + if (!q->limits.chunk_sectors || (rq->op == REQ_OP_DISCARD)) + return blk_queue_get_max_sectors(q, rq->op); return min(blk_max_size_offset(q, blk_rq_pos(rq)), - blk_queue_get_max_sectors(q, rq->cmd_flags)); + blk_queue_get_max_sectors(q, rq->op)); } static inline unsigned int blk_rq_count_bios(struct request *rq) -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 08A8A7CBD for ; Wed, 13 Apr 2016 14:37:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D11DB8F8049 for ; Wed, 13 Apr 2016 12:37:50 -0700 (PDT) X-ASG-Debug-ID: 1460576269-04cbb02e1d1a0b70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 3lH3Hk8yZCMqAMpE (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:49 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B37F58111B; Wed, 13 Apr 2016 19:37:48 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9S018278; Wed, 13 Apr 2016 15:37:46 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 32/42] block: convert is_sync helpers to use REQ_OPs. Date: Wed, 13 Apr 2016 14:36:18 -0500 X-ASG-Orig-Subj: [PATCH 32/42] block: convert is_sync helpers to use REQ_OPs. Message-Id: <1460576188-5751-33-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576269 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch converts the is_sync helpers to use separate variables for the operation and flags. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- block/blk-core.c | 6 +++--- block/blk-mq.c | 8 ++++---- block/cfq-iosched.c | 2 +- include/linux/blkdev.h | 6 +++--- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index 5632cd1..a240657 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -962,7 +962,7 @@ static void __freed_request(struct request_list *rl, int sync) static void freed_request(struct request_list *rl, int op, unsigned int flags) { struct request_queue *q = rl->q; - int sync = rw_is_sync(op | flags); + int sync = rw_is_sync(op, flags); q->nr_rqs[sync]--; rl->count[sync]--; @@ -1075,7 +1075,7 @@ static struct request *__get_request(struct request_list *rl, int op, struct elevator_type *et = q->elevator->type; struct io_context *ioc = rq_ioc(bio); struct io_cq *icq = NULL; - const bool is_sync = rw_is_sync(op | op_flags) != 0; + const bool is_sync = rw_is_sync(op, op_flags) != 0; int may_queue; if (unlikely(blk_queue_dying(q))) @@ -1246,7 +1246,7 @@ static struct request *get_request(struct request_queue *q, int op, int op_flags, struct bio *bio, gfp_t gfp_mask) { - const bool is_sync = rw_is_sync(op | op_flags) != 0; + const bool is_sync = rw_is_sync(op, op_flags) != 0; DEFINE_WAIT(wait); struct request_list *rl; struct request *rq; diff --git a/block/blk-mq.c b/block/blk-mq.c index 4843c0b..64d61be 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -206,7 +206,7 @@ static void blk_mq_rq_ctx_init(struct request_queue *q, struct blk_mq_ctx *ctx, rq->end_io_data = NULL; rq->next_rq = NULL; - ctx->rq_dispatched[rw_is_sync(op | op_flags)]++; + ctx->rq_dispatched[rw_is_sync(op, op_flags)]++; } static struct request * @@ -1181,7 +1181,7 @@ static struct request *blk_mq_map_request(struct request_queue *q, ctx = blk_mq_get_ctx(q); hctx = q->mq_ops->map_queue(q, ctx->cpu); - if (rw_is_sync(bio->bi_op | bio->bi_rw)) + if (rw_is_sync(bio->bi_op, bio->bi_rw)) op_flags |= REQ_SYNC; trace_block_getrq(q, bio, op); @@ -1249,7 +1249,7 @@ static int blk_mq_direct_issue_request(struct request *rq, blk_qc_t *cookie) */ static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio) { - const int is_sync = rw_is_sync(bio->bi_op | bio->bi_rw); + const int is_sync = rw_is_sync(bio->bi_op, bio->bi_rw); const int is_flush_fua = bio->bi_rw & (REQ_FLUSH | REQ_FUA); struct blk_map_ctx data; struct request *rq; @@ -1346,7 +1346,7 @@ done: */ static blk_qc_t blk_sq_make_request(struct request_queue *q, struct bio *bio) { - const int is_sync = rw_is_sync(bio->bi_op | bio->bi_rw); + const int is_sync = rw_is_sync(bio->bi_op, bio->bi_rw); const int is_flush_fua = bio->bi_rw & (REQ_FLUSH | REQ_FUA); struct blk_plug *plug; unsigned int request_count = 0; diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 0dfa2dd..2fd5bcf 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c @@ -4311,7 +4311,7 @@ static int cfq_may_queue(struct request_queue *q, int op, int op_flags) if (!cic) return ELV_MQUEUE_MAY; - cfqq = cic_to_cfqq(cic, rw_is_sync(op | op_flags)); + cfqq = cic_to_cfqq(cic, rw_is_sync(op, op_flags)); if (cfqq) { cfq_init_prio_data(cfqq, cic); diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 39df8ef..550b371 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -618,14 +618,14 @@ static inline unsigned int blk_queue_cluster(struct request_queue *q) /* * We regard a request as sync, if either a read or a sync write */ -static inline bool rw_is_sync(unsigned int rw_flags) +static inline bool rw_is_sync(int op, unsigned int rw_flags) { - return !(rw_flags & REQ_WRITE) || (rw_flags & REQ_SYNC); + return op == REQ_OP_READ || (rw_flags & REQ_SYNC); } static inline bool rq_is_sync(struct request *rq) { - return rw_is_sync(rq->cmd_flags); + return rw_is_sync(rq->op, rq->cmd_flags); } static inline bool blk_rl_full(struct request_list *rl, bool sync) -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 302467D85 for ; Wed, 13 Apr 2016 14:37:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 90078AC003 for ; Wed, 13 Apr 2016 12:37:52 -0700 (PDT) X-ASG-Debug-ID: 1460576271-04cb6c24644b51f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id iSOlcJfEbYD9TyJK (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:51 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id F1F8F6406F; Wed, 13 Apr 2016 19:37:50 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9T018278; Wed, 13 Apr 2016 15:37:48 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 33/42] block: convert rq_data_dir helper to use REQ_OPs Date: Wed, 13 Apr 2016 14:36:19 -0500 X-ASG-Orig-Subj: [PATCH 33/42] block: convert rq_data_dir helper to use REQ_OPs Message-Id: <1460576188-5751-34-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 13 Apr 2016 19:37:51 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460576271 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie The request->op field is now always setup up with a REQ_OP. This patch has the rq_data_dir helper convert the operation to a WRITE or READ direction based on that. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- include/linux/blkdev.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 550b371..25ec7ce 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -599,7 +599,7 @@ static inline void queue_flag_clear(unsigned int flag, struct request_queue *q) #define list_entry_rq(ptr) list_entry((ptr), struct request, queuelist) -#define rq_data_dir(rq) ((int)((rq)->cmd_flags & 1)) +#define rq_data_dir(rq) (op_is_write(rq->op) ? WRITE : READ) /* * Driver can handle struct request, if it either has an old style -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 514B07CCB for ; Wed, 13 Apr 2016 14:37:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 165258F8049 for ; Wed, 13 Apr 2016 12:37:56 -0700 (PDT) X-ASG-Debug-ID: 1460576273-04cbb02e1c1a0b90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id aa5f9HOZlLc4MVGq (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:54 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 50E593683C; Wed, 13 Apr 2016 19:37:53 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9U018278; Wed, 13 Apr 2016 15:37:51 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 34/42] drivers: set request op to REQ_OP Date: Wed, 13 Apr 2016 14:36:20 -0500 X-ASG-Orig-Subj: [PATCH 34/42] drivers: set request op to REQ_OP Message-Id: <1460576188-5751-35-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576274 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has the block drivers use the request->op for REQ_OP operations and cmd_flags for rq_flag_bits. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- drivers/block/loop.c | 6 +++--- drivers/block/mtip32xx/mtip32xx.c | 2 +- drivers/block/nbd.c | 2 +- drivers/block/rbd.c | 2 +- drivers/block/skd_main.c | 11 ++++------- drivers/block/xen-blkfront.c | 8 +++++--- drivers/md/dm.c | 2 +- drivers/mmc/card/block.c | 7 +++---- drivers/mmc/card/queue.c | 6 ++---- drivers/mmc/card/queue.h | 5 ++++- drivers/mtd/mtd_blkdevs.c | 2 +- drivers/nvme/host/core.c | 2 +- drivers/nvme/host/nvme.h | 2 +- drivers/nvme/host/pci.c | 2 +- drivers/scsi/sd.c | 25 ++++++++++++++++--------- 15 files changed, 45 insertions(+), 39 deletions(-) diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 7e5e27a..0e80c9b 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -538,7 +538,7 @@ static int do_req_filebacked(struct loop_device *lo, struct request *rq) if (rq->cmd_flags & REQ_WRITE) { if (rq->cmd_flags & REQ_FLUSH) ret = lo_req_flush(lo, rq); - else if (rq->cmd_flags & REQ_DISCARD) + else if (rq->op == REQ_OP_DISCARD) ret = lo_discard(lo, rq, pos); else if (lo->transfer) ret = lo_write_transfer(lo, rq, pos); @@ -1653,8 +1653,8 @@ static int loop_queue_rq(struct blk_mq_hw_ctx *hctx, if (lo->lo_state != Lo_bound) return -EIO; - if (lo->use_dio && !(cmd->rq->cmd_flags & (REQ_FLUSH | - REQ_DISCARD))) + if (lo->use_dio && (!(cmd->rq->cmd_flags & REQ_FLUSH) || + cmd->rq->op == REQ_OP_DISCARD)) cmd->use_aio = true; else cmd->use_aio = false; diff --git a/drivers/block/mtip32xx/mtip32xx.c b/drivers/block/mtip32xx/mtip32xx.c index 6053e46..7638273 100644 --- a/drivers/block/mtip32xx/mtip32xx.c +++ b/drivers/block/mtip32xx/mtip32xx.c @@ -3765,7 +3765,7 @@ static int mtip_submit_request(struct blk_mq_hw_ctx *hctx, struct request *rq) return -ENODATA; } - if (rq->cmd_flags & REQ_DISCARD) { + if (rq->op == REQ_OP_DISCARD) { int err; err = mtip_send_trim(dd, blk_rq_pos(rq), blk_rq_sectors(rq)); diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 31e73a7..68a1476 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -282,7 +282,7 @@ static int nbd_send_req(struct nbd_device *nbd, struct request *req) if (req->cmd_type == REQ_TYPE_DRV_PRIV) type = NBD_CMD_DISC; - else if (req->cmd_flags & REQ_DISCARD) + else if (req->op == REQ_OP_DISCARD) type = NBD_CMD_TRIM; else if (req->cmd_flags & REQ_FLUSH) type = NBD_CMD_FLUSH; diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 94a1843..e8935af 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -3371,7 +3371,7 @@ static void rbd_queue_workfn(struct work_struct *work) goto err; } - if (rq->cmd_flags & REQ_DISCARD) + if (rq->op == REQ_OP_DISCARD) op_type = OBJ_OP_DISCARD; else if (rq->cmd_flags & REQ_WRITE) op_type = OBJ_OP_WRITE; diff --git a/drivers/block/skd_main.c b/drivers/block/skd_main.c index 41aaae3..5739223 100644 --- a/drivers/block/skd_main.c +++ b/drivers/block/skd_main.c @@ -576,7 +576,6 @@ static void skd_request_fn(struct request_queue *q) struct request *req = NULL; struct skd_scsi_request *scsi_req; struct page *page; - unsigned long io_flags; int error; u32 lba; u32 count; @@ -624,12 +623,11 @@ static void skd_request_fn(struct request_queue *q) lba = (u32)blk_rq_pos(req); count = blk_rq_sectors(req); data_dir = rq_data_dir(req); - io_flags = req->cmd_flags; - if (io_flags & REQ_FLUSH) + if (req->cmd_flags & REQ_FLUSH) flush++; - if (io_flags & REQ_FUA) + if (req->cmd_flags & REQ_FUA) fua++; pr_debug("%s:%s:%d new req=%p lba=%u(0x%x) " @@ -735,7 +733,7 @@ static void skd_request_fn(struct request_queue *q) else skreq->sg_data_dir = SKD_DATA_DIR_HOST_TO_CARD; - if (io_flags & REQ_DISCARD) { + if (req->op == REQ_OP_DISCARD) { page = alloc_page(GFP_ATOMIC | __GFP_ZERO); if (!page) { pr_err("request_fn:Page allocation failed.\n"); @@ -852,9 +850,8 @@ static void skd_end_request(struct skd_device *skdev, struct skd_request_context *skreq, int error) { struct request *req = skreq->req; - unsigned int io_flags = req->cmd_flags; - if ((io_flags & REQ_DISCARD) && + if ((req->op == REQ_OP_DISCARD) && (skreq->discard_page == 1)) { pr_debug("%s:%s:%d, free the page!", skdev->name, __func__, __LINE__); diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index 52963a2..dc08d4d 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c @@ -844,7 +844,8 @@ static int blkif_queue_request(struct request *req, struct blkfront_ring_info *r if (unlikely(rinfo->dev_info->connected != BLKIF_STATE_CONNECTED)) return 1; - if (unlikely(req->cmd_flags & (REQ_DISCARD | REQ_SECURE))) + if (unlikely(req->op == REQ_OP_DISCARD || + req->cmd_flags & REQ_SECURE)) return blkif_queue_discard_req(req, rinfo); else return blkif_queue_rw_req(req, rinfo); @@ -2054,8 +2055,9 @@ static int blkif_recover(struct blkfront_info *info) /* * Get the bios in the request so we can re-queue them. */ - if (copy[i].request->cmd_flags & - (REQ_FLUSH | REQ_FUA | REQ_DISCARD | REQ_SECURE)) { + if (copy[i].request->cmd_flags & REQ_FLUSH || + copy[i].request->op == REQ_OP_DISCARD || + copy[i].request->cmd_flags & (REQ_FUA | REQ_SECURE)) { /* * Flush operations don't contain bios, so * we need to requeue the whole request diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 98fea0e..13c869c 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -1322,7 +1322,7 @@ static void dm_done(struct request *clone, int error, bool mapped) r = rq_end_io(tio->ti, clone, error, &tio->info); } - if (unlikely(r == -EREMOTEIO && (clone->cmd_flags & REQ_WRITE_SAME) && + if (unlikely(r == -EREMOTEIO && (clone->op == REQ_OP_WRITE_SAME) && !clone->q->limits.max_write_same_sectors)) disable_write_same(tio->md); diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 8db2bf0..8fa3982 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -1696,8 +1696,7 @@ static u8 mmc_blk_prep_packed_list(struct mmc_queue *mq, struct request *req) !IS_ALIGNED(blk_rq_sectors(next), 8)) break; - if (next->cmd_flags & REQ_DISCARD || - next->cmd_flags & REQ_FLUSH) + if (next->op == REQ_OP_DISCARD || next->cmd_flags & REQ_FLUSH) break; if (rq_data_dir(cur) != rq_data_dir(next)) @@ -2138,7 +2137,7 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) } mq->flags &= ~MMC_QUEUE_NEW_REQUEST; - if (cmd_flags & REQ_DISCARD) { + if (req && req->op == REQ_OP_DISCARD) { /* complete ongoing async transfer before issuing discard */ if (card->host->areq) mmc_blk_issue_rw_rq(mq, NULL); @@ -2162,7 +2161,7 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) out: if ((!req && !(mq->flags & MMC_QUEUE_NEW_REQUEST)) || - (cmd_flags & MMC_REQ_SPECIAL_MASK)) + mmc_req_is_special(req)) /* * Release host when there are no more requests * and after special request(discard, flush) is done. diff --git a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c index 6f4323c..9fb8d21 100644 --- a/drivers/mmc/card/queue.c +++ b/drivers/mmc/card/queue.c @@ -33,7 +33,7 @@ static int mmc_prep_request(struct request_queue *q, struct request *req) /* * We only like normal block requests and discards. */ - if (req->cmd_type != REQ_TYPE_FS && !(req->cmd_flags & REQ_DISCARD)) { + if (req->cmd_type != REQ_TYPE_FS && req->op != REQ_OP_DISCARD) { blk_dump_rq_flags(req, "MMC bad request"); return BLKPREP_KILL; } @@ -56,7 +56,6 @@ static int mmc_queue_thread(void *d) down(&mq->thread_sem); do { struct request *req = NULL; - unsigned int cmd_flags = 0; spin_lock_irq(q->queue_lock); set_current_state(TASK_INTERRUPTIBLE); @@ -66,7 +65,6 @@ static int mmc_queue_thread(void *d) if (req || mq->mqrq_prev->req) { set_current_state(TASK_RUNNING); - cmd_flags = req ? req->cmd_flags : 0; mq->issue_fn(mq, req); cond_resched(); if (mq->flags & MMC_QUEUE_NEW_REQUEST) { @@ -81,7 +79,7 @@ static int mmc_queue_thread(void *d) * has been finished. Do not assign it to previous * request. */ - if (cmd_flags & MMC_REQ_SPECIAL_MASK) + if (mmc_req_is_special(req)) mq->mqrq_cur->req = NULL; mq->mqrq_prev->brq.mrq.data = NULL; diff --git a/drivers/mmc/card/queue.h b/drivers/mmc/card/queue.h index 36cddab..f166e5b 100644 --- a/drivers/mmc/card/queue.h +++ b/drivers/mmc/card/queue.h @@ -1,7 +1,10 @@ #ifndef MMC_QUEUE_H #define MMC_QUEUE_H -#define MMC_REQ_SPECIAL_MASK (REQ_DISCARD | REQ_FLUSH) +static inline bool mmc_req_is_special(struct request *req) +{ + return req && (req->cmd_flags & REQ_FLUSH || req->op == REQ_OP_DISCARD); +} struct request; struct task_struct; diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c index 74ae243..e8b0263 100644 --- a/drivers/mtd/mtd_blkdevs.c +++ b/drivers/mtd/mtd_blkdevs.c @@ -94,7 +94,7 @@ static int do_blktrans_request(struct mtd_blktrans_ops *tr, get_capacity(req->rq_disk)) return -EIO; - if (req->cmd_flags & REQ_DISCARD) + if (req->op == REQ_OP_DISCARD) return tr->discard(dev, block, nsect); if (rq_data_dir(req) == READ) { diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 4eb5759..b741aed 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -234,7 +234,7 @@ int nvme_setup_cmd(struct nvme_ns *ns, struct request *req, memcpy(cmd, req->cmd, sizeof(*cmd)); else if (req->cmd_flags & REQ_FLUSH) nvme_setup_flush(ns, cmd); - else if (req->cmd_flags & REQ_DISCARD) + else if (req->op == REQ_OP_DISCARD) ret = nvme_setup_discard(ns, req, cmd); else nvme_setup_rw(ns, req, cmd); diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index 8e8fae8..0f04523 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -175,7 +175,7 @@ static inline u64 nvme_block_nr(struct nvme_ns *ns, sector_t sector) static inline unsigned nvme_map_len(struct request *rq) { - if (rq->cmd_flags & REQ_DISCARD) + if (rq->op == REQ_OP_DISCARD) return sizeof(struct nvme_dsm_range); else return blk_rq_bytes(rq); diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index 36b6cdf..907d127 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -363,7 +363,7 @@ static void nvme_free_iod(struct nvme_dev *dev, struct request *req) __le64 **list = iod_list(req); dma_addr_t prp_dma = iod->first_dma; - if (req->cmd_flags & REQ_DISCARD) + if (req->op == REQ_OP_DISCARD) kfree(req->completion_data); if (iod->npages == 0) diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 428c03e..2fc7191 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1012,7 +1012,8 @@ static int sd_setup_read_write_cmnd(struct scsi_cmnd *SCpnt) } else if (rq_data_dir(rq) == READ) { SCpnt->cmnd[0] = READ_6; } else { - scmd_printk(KERN_ERR, SCpnt, "Unknown command %llx\n", (unsigned long long) rq->cmd_flags); + scmd_printk(KERN_ERR, SCpnt, "Unknown command %d,%llx\n", + rq->op, (unsigned long long) rq->cmd_flags); goto out; } @@ -1137,21 +1138,27 @@ static int sd_init_command(struct scsi_cmnd *cmd) { struct request *rq = cmd->request; - if (rq->cmd_flags & REQ_DISCARD) + switch (rq->op) { + case REQ_OP_DISCARD: return sd_setup_discard_cmnd(cmd); - else if (rq->cmd_flags & REQ_WRITE_SAME) + case REQ_OP_WRITE_SAME: return sd_setup_write_same_cmnd(cmd); - else if (rq->cmd_flags & REQ_FLUSH) - return sd_setup_flush_cmnd(cmd); - else - return sd_setup_read_write_cmnd(cmd); + case REQ_OP_READ: + case REQ_OP_WRITE: + if (rq->cmd_flags & REQ_FLUSH) + return sd_setup_flush_cmnd(cmd); + else + return sd_setup_read_write_cmnd(cmd); + default: + BUG(); + } } static void sd_uninit_command(struct scsi_cmnd *SCpnt) { struct request *rq = SCpnt->request; - if (rq->cmd_flags & REQ_DISCARD) + if (rq->op == REQ_OP_DISCARD) __free_page(rq->completion_data); if (SCpnt->cmnd != rq->cmd) { @@ -1769,7 +1776,7 @@ static int sd_done(struct scsi_cmnd *SCpnt) unsigned char op = SCpnt->cmnd[0]; unsigned char unmap = SCpnt->cmnd[1] & 8; - if (req->cmd_flags & REQ_DISCARD || req->cmd_flags & REQ_WRITE_SAME) { + if (req->op == REQ_OP_DISCARD || req->op == REQ_OP_WRITE_SAME) { if (!result) { good_bytes = blk_rq_bytes(req); scsi_set_resid(SCpnt, 0); -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3EF437CCB for ; Wed, 13 Apr 2016 14:37:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id F09888F8039 for ; Wed, 13 Apr 2016 12:37:57 -0700 (PDT) X-ASG-Debug-ID: 1460576275-04cbb02e1d1a0ba0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id r5j0VcIkxOChJTIC (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:56 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 88DBDC05E168; Wed, 13 Apr 2016 19:37:55 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9V018278; Wed, 13 Apr 2016 15:37:53 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 35/42] blktrace: get op from req->op/bio->bi_op Date: Wed, 13 Apr 2016 14:36:21 -0500 X-ASG-Orig-Subj: [PATCH 35/42] blktrace: get op from req->op/bio->bi_op Message-Id: <1460576188-5751-36-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576276 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie The bio and request structs now store the operation in bio->bi_op/request->op. This patch has blktrace use that field instead of bi_rw/cmd_flags. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- include/linux/blktrace_api.h | 2 +- include/trace/events/bcache.h | 12 ++++++---- include/trace/events/block.h | 31 +++++++++++++++++--------- kernel/trace/blktrace.c | 52 +++++++++++++++++++++++-------------------- 4 files changed, 57 insertions(+), 40 deletions(-) diff --git a/include/linux/blktrace_api.h b/include/linux/blktrace_api.h index afc1343..ee25ba4 100644 --- a/include/linux/blktrace_api.h +++ b/include/linux/blktrace_api.h @@ -109,7 +109,7 @@ static inline int blk_cmd_buf_len(struct request *rq) } extern void blk_dump_cmd(char *buf, struct request *rq); -extern void blk_fill_rwbs(char *rwbs, u32 rw, int bytes); +extern void blk_fill_rwbs(char *rwbs, int op, u32 rw, int bytes); #endif /* CONFIG_EVENT_TRACING && CONFIG_BLOCK */ diff --git a/include/trace/events/bcache.h b/include/trace/events/bcache.h index 981acf7..8abe564 100644 --- a/include/trace/events/bcache.h +++ b/include/trace/events/bcache.h @@ -27,7 +27,8 @@ DECLARE_EVENT_CLASS(bcache_request, __entry->sector = bio->bi_iter.bi_sector; __entry->orig_sector = bio->bi_iter.bi_sector - 16; __entry->nr_sector = bio->bi_iter.bi_size >> 9; - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); ), TP_printk("%d,%d %s %llu + %u (from %d,%d @ %llu)", @@ -101,7 +102,8 @@ DECLARE_EVENT_CLASS(bcache_bio, __entry->dev = bio->bi_bdev->bd_dev; __entry->sector = bio->bi_iter.bi_sector; __entry->nr_sector = bio->bi_iter.bi_size >> 9; - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); ), TP_printk("%d,%d %s %llu + %u", @@ -136,7 +138,8 @@ TRACE_EVENT(bcache_read, __entry->dev = bio->bi_bdev->bd_dev; __entry->sector = bio->bi_iter.bi_sector; __entry->nr_sector = bio->bi_iter.bi_size >> 9; - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); __entry->cache_hit = hit; __entry->bypass = bypass; ), @@ -167,7 +170,8 @@ TRACE_EVENT(bcache_write, __entry->inode = inode; __entry->sector = bio->bi_iter.bi_sector; __entry->nr_sector = bio->bi_iter.bi_size >> 9; - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); __entry->writeback = writeback; __entry->bypass = bypass; ), diff --git a/include/trace/events/block.h b/include/trace/events/block.h index e8a5eca..4416dcd 100644 --- a/include/trace/events/block.h +++ b/include/trace/events/block.h @@ -84,7 +84,8 @@ DECLARE_EVENT_CLASS(block_rq_with_error, 0 : blk_rq_sectors(rq); __entry->errors = rq->errors; - blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq)); + blk_fill_rwbs(__entry->rwbs, rq->op, rq->cmd_flags, + blk_rq_bytes(rq)); blk_dump_cmd(__get_str(cmd), rq); ), @@ -162,7 +163,7 @@ TRACE_EVENT(block_rq_complete, __entry->nr_sector = nr_bytes >> 9; __entry->errors = rq->errors; - blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, nr_bytes); + blk_fill_rwbs(__entry->rwbs, rq->op, rq->cmd_flags, nr_bytes); blk_dump_cmd(__get_str(cmd), rq); ), @@ -198,7 +199,8 @@ DECLARE_EVENT_CLASS(block_rq, __entry->bytes = (rq->cmd_type == REQ_TYPE_BLOCK_PC) ? blk_rq_bytes(rq) : 0; - blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq)); + blk_fill_rwbs(__entry->rwbs, rq->op, rq->cmd_flags, + blk_rq_bytes(rq)); blk_dump_cmd(__get_str(cmd), rq); memcpy(__entry->comm, current->comm, TASK_COMM_LEN); ), @@ -272,7 +274,8 @@ TRACE_EVENT(block_bio_bounce, bio->bi_bdev->bd_dev : 0; __entry->sector = bio->bi_iter.bi_sector; __entry->nr_sector = bio_sectors(bio); - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); memcpy(__entry->comm, current->comm, TASK_COMM_LEN); ), @@ -310,7 +313,8 @@ TRACE_EVENT(block_bio_complete, __entry->sector = bio->bi_iter.bi_sector; __entry->nr_sector = bio_sectors(bio); __entry->error = error; - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); ), TP_printk("%d,%d %s %llu + %u [%d]", @@ -337,7 +341,8 @@ DECLARE_EVENT_CLASS(block_bio_merge, __entry->dev = bio->bi_bdev->bd_dev; __entry->sector = bio->bi_iter.bi_sector; __entry->nr_sector = bio_sectors(bio); - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); memcpy(__entry->comm, current->comm, TASK_COMM_LEN); ), @@ -404,7 +409,8 @@ TRACE_EVENT(block_bio_queue, __entry->dev = bio->bi_bdev->bd_dev; __entry->sector = bio->bi_iter.bi_sector; __entry->nr_sector = bio_sectors(bio); - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); memcpy(__entry->comm, current->comm, TASK_COMM_LEN); ), @@ -432,7 +438,7 @@ DECLARE_EVENT_CLASS(block_get_rq, __entry->dev = bio ? bio->bi_bdev->bd_dev : 0; __entry->sector = bio ? bio->bi_iter.bi_sector : 0; __entry->nr_sector = bio ? bio_sectors(bio) : 0; - blk_fill_rwbs(__entry->rwbs, + blk_fill_rwbs(__entry->rwbs, bio ? bio->bi_op : 0, bio ? bio->bi_rw : 0, __entry->nr_sector); memcpy(__entry->comm, current->comm, TASK_COMM_LEN); ), @@ -567,7 +573,8 @@ TRACE_EVENT(block_split, __entry->dev = bio->bi_bdev->bd_dev; __entry->sector = bio->bi_iter.bi_sector; __entry->new_sector = new_sector; - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); memcpy(__entry->comm, current->comm, TASK_COMM_LEN); ), @@ -610,7 +617,8 @@ TRACE_EVENT(block_bio_remap, __entry->nr_sector = bio_sectors(bio); __entry->old_dev = dev; __entry->old_sector = from; - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); ), TP_printk("%d,%d %s %llu + %u <- (%d,%d) %llu", @@ -656,7 +664,8 @@ TRACE_EVENT(block_rq_remap, __entry->old_dev = dev; __entry->old_sector = from; __entry->nr_bios = blk_rq_count_bios(rq); - blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq)); + blk_fill_rwbs(__entry->rwbs, rq->op, rq->cmd_flags, + blk_rq_bytes(rq)); ), TP_printk("%d,%d %s %llu + %u <- (%d,%d) %llu %u", diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index f94e7a2..6a381ea 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c @@ -199,7 +199,8 @@ static const u32 ddir_act[2] = { BLK_TC_ACT(BLK_TC_READ), * blk_io_trace structure and places it in a per-cpu subbuffer. */ static void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes, - int rw, u32 what, int error, int pdu_len, void *pdu_data) + int op, int op_flags, u32 what, int error, int pdu_len, + void *pdu_data) { struct task_struct *tsk = current; struct ring_buffer_event *event = NULL; @@ -214,13 +215,14 @@ static void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes, if (unlikely(bt->trace_state != Blktrace_running && !blk_tracer)) return; - what |= ddir_act[rw & WRITE]; - what |= MASK_TC_BIT(rw, SYNC); - what |= MASK_TC_BIT(rw, RAHEAD); - what |= MASK_TC_BIT(rw, META); - what |= MASK_TC_BIT(rw, DISCARD); - what |= MASK_TC_BIT(rw, FLUSH); - what |= MASK_TC_BIT(rw, FUA); + what |= ddir_act[op_is_write(op) ? WRITE : READ]; + what |= MASK_TC_BIT(op_flags, SYNC); + what |= MASK_TC_BIT(op_flags, RAHEAD); + what |= MASK_TC_BIT(op_flags, META); + what |= MASK_TC_BIT(op_flags, FLUSH); + what |= MASK_TC_BIT(op_flags, FUA); + if (op == REQ_OP_DISCARD) + what |= BLK_TC_ACT(BLK_TC_DISCARD); pid = tsk->pid; if (act_log_check(bt, what, sector, pid)) @@ -708,11 +710,11 @@ static void blk_add_trace_rq(struct request_queue *q, struct request *rq, if (rq->cmd_type == REQ_TYPE_BLOCK_PC) { what |= BLK_TC_ACT(BLK_TC_PC); - __blk_add_trace(bt, 0, nr_bytes, rq->cmd_flags, + __blk_add_trace(bt, 0, nr_bytes, rq->op, rq->cmd_flags, what, rq->errors, rq->cmd_len, rq->cmd); } else { what |= BLK_TC_ACT(BLK_TC_FS); - __blk_add_trace(bt, blk_rq_pos(rq), nr_bytes, + __blk_add_trace(bt, blk_rq_pos(rq), nr_bytes, rq->op, rq->cmd_flags, what, rq->errors, 0, NULL); } } @@ -770,7 +772,7 @@ static void blk_add_trace_bio(struct request_queue *q, struct bio *bio, return; __blk_add_trace(bt, bio->bi_iter.bi_sector, bio->bi_iter.bi_size, - bio->bi_rw, what, error, 0, NULL); + bio->bi_op, bio->bi_rw, what, error, 0, NULL); } static void blk_add_trace_bio_bounce(void *ignore, @@ -818,7 +820,8 @@ static void blk_add_trace_getrq(void *ignore, struct blk_trace *bt = q->blk_trace; if (bt) - __blk_add_trace(bt, 0, 0, rw, BLK_TA_GETRQ, 0, 0, NULL); + __blk_add_trace(bt, 0, 0, rw, 0, BLK_TA_GETRQ, 0, 0, + NULL); } } @@ -833,7 +836,7 @@ static void blk_add_trace_sleeprq(void *ignore, struct blk_trace *bt = q->blk_trace; if (bt) - __blk_add_trace(bt, 0, 0, rw, BLK_TA_SLEEPRQ, + __blk_add_trace(bt, 0, 0, rw, 0, BLK_TA_SLEEPRQ, 0, 0, NULL); } } @@ -843,7 +846,7 @@ static void blk_add_trace_plug(void *ignore, struct request_queue *q) struct blk_trace *bt = q->blk_trace; if (bt) - __blk_add_trace(bt, 0, 0, 0, BLK_TA_PLUG, 0, 0, NULL); + __blk_add_trace(bt, 0, 0, 0, 0, BLK_TA_PLUG, 0, 0, NULL); } static void blk_add_trace_unplug(void *ignore, struct request_queue *q, @@ -860,7 +863,7 @@ static void blk_add_trace_unplug(void *ignore, struct request_queue *q, else what = BLK_TA_UNPLUG_TIMER; - __blk_add_trace(bt, 0, 0, 0, what, 0, sizeof(rpdu), &rpdu); + __blk_add_trace(bt, 0, 0, 0, 0, what, 0, sizeof(rpdu), &rpdu); } } @@ -874,8 +877,9 @@ static void blk_add_trace_split(void *ignore, __be64 rpdu = cpu_to_be64(pdu); __blk_add_trace(bt, bio->bi_iter.bi_sector, - bio->bi_iter.bi_size, bio->bi_rw, BLK_TA_SPLIT, - bio->bi_error, sizeof(rpdu), &rpdu); + bio->bi_iter.bi_size, bio->bi_op, bio->bi_rw, + BLK_TA_SPLIT, bio->bi_error, sizeof(rpdu), + &rpdu); } } @@ -907,7 +911,7 @@ static void blk_add_trace_bio_remap(void *ignore, r.sector_from = cpu_to_be64(from); __blk_add_trace(bt, bio->bi_iter.bi_sector, bio->bi_iter.bi_size, - bio->bi_rw, BLK_TA_REMAP, bio->bi_error, + bio->bi_op, bio->bi_rw, BLK_TA_REMAP, bio->bi_error, sizeof(r), &r); } @@ -940,7 +944,7 @@ static void blk_add_trace_rq_remap(void *ignore, r.sector_from = cpu_to_be64(from); __blk_add_trace(bt, blk_rq_pos(rq), blk_rq_bytes(rq), - rq_data_dir(rq), BLK_TA_REMAP, !!rq->errors, + rq_data_dir(rq), 0, BLK_TA_REMAP, !!rq->errors, sizeof(r), &r); } @@ -965,10 +969,10 @@ void blk_add_driver_data(struct request_queue *q, return; if (rq->cmd_type == REQ_TYPE_BLOCK_PC) - __blk_add_trace(bt, 0, blk_rq_bytes(rq), 0, + __blk_add_trace(bt, 0, blk_rq_bytes(rq), 0, 0, BLK_TA_DRV_DATA, rq->errors, len, data); else - __blk_add_trace(bt, blk_rq_pos(rq), blk_rq_bytes(rq), 0, + __blk_add_trace(bt, blk_rq_pos(rq), blk_rq_bytes(rq), 0, 0, BLK_TA_DRV_DATA, rq->errors, len, data); } EXPORT_SYMBOL_GPL(blk_add_driver_data); @@ -1767,16 +1771,16 @@ void blk_dump_cmd(char *buf, struct request *rq) } } -void blk_fill_rwbs(char *rwbs, u32 rw, int bytes) +void blk_fill_rwbs(char *rwbs, int op, u32 rw, int bytes) { int i = 0; if (rw & REQ_FLUSH) rwbs[i++] = 'F'; - if (rw & WRITE) + if (op == REQ_OP_WRITE) rwbs[i++] = 'W'; - else if (rw & REQ_DISCARD) + else if (op == REQ_OP_DISCARD) rwbs[i++] = 'D'; else if (bytes) rwbs[i++] = 'R'; -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:37:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 60BFF7CCB for ; Wed, 13 Apr 2016 14:37:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 17EA28F8035 for ; Wed, 13 Apr 2016 12:37:59 -0700 (PDT) X-ASG-Debug-ID: 1460576277-04bdf011024b3400001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id nkcErdLgjH7PWUlT (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:37:58 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CFA08C0467E6; Wed, 13 Apr 2016 19:37:57 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9W018278; Wed, 13 Apr 2016 15:37:55 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 36/42] ide cd: do not set REQ_WRITE on requests. Date: Wed, 13 Apr 2016 14:36:22 -0500 X-ASG-Orig-Subj: [PATCH 36/42] ide cd: do not set REQ_WRITE on requests. Message-Id: <1460576188-5751-37-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576278 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie The block layer will set the correct READ/WRITE operation flags/fields when creating a request, so there is not need for drivers to set the REQ_WRITE flag. This patch is compile tested only. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- drivers/ide/ide-cd_ioctl.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/drivers/ide/ide-cd_ioctl.c b/drivers/ide/ide-cd_ioctl.c index 474173e..5887a7a 100644 --- a/drivers/ide/ide-cd_ioctl.c +++ b/drivers/ide/ide-cd_ioctl.c @@ -459,9 +459,6 @@ int ide_cdrom_packet(struct cdrom_device_info *cdi, layer. the packet must be complete, as we do not touch it at all. */ - if (cgc->data_direction == CGC_DATA_WRITE) - flags |= REQ_WRITE; - if (cgc->sense) memset(cgc->sense, 0, sizeof(struct request_sense)); -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:38:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E6ECB7D0D for ; Wed, 13 Apr 2016 14:38:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 66280AC007 for ; Wed, 13 Apr 2016 12:38:06 -0700 (PDT) X-ASG-Debug-ID: 1460576285-04bdf011044b3440001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Bsnq3QFcTonx2AtC (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:38:05 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 90823552D2; Wed, 13 Apr 2016 19:38:02 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9Y018278; Wed, 13 Apr 2016 15:38:00 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 38/42] block, fs: remove old REQ definitions. Date: Wed, 13 Apr 2016 14:36:24 -0500 X-ASG-Orig-Subj: [PATCH 38/42] block, fs: remove old REQ definitions. Message-Id: <1460576188-5751-39-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576285 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie We no longer use REQ_WRITE. REQ_WRITE_SAME and REQ_DISCARD, so this patch removes them. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- include/linux/blk_types.h | 21 ++++++--------------- include/linux/fs.h | 21 +++++++++++---------- include/trace/events/f2fs.h | 1 - 3 files changed, 17 insertions(+), 26 deletions(-) diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index 6e49c91..b4251ed 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -151,7 +151,6 @@ struct bio { */ enum rq_flag_bits { /* common flags */ - __REQ_WRITE, /* not set, read. set, write */ __REQ_FAILFAST_DEV, /* no driver retries of device errors */ __REQ_FAILFAST_TRANSPORT, /* no driver retries of transport errors */ __REQ_FAILFAST_DRIVER, /* no driver retries of driver errors */ @@ -159,9 +158,7 @@ enum rq_flag_bits { __REQ_SYNC, /* request is sync (sync write or read) */ __REQ_META, /* metadata io request */ __REQ_PRIO, /* boost priority in cfq */ - __REQ_DISCARD, /* request to discard sectors */ - __REQ_SECURE, /* secure discard (used with __REQ_DISCARD) */ - __REQ_WRITE_SAME, /* write same block many times */ + __REQ_SECURE, /* secure discard (used with REQ_OP_DISCARD) */ __REQ_NOIDLE, /* don't anticipate more IO after this one */ __REQ_INTEGRITY, /* I/O includes block integrity payload */ @@ -197,28 +194,22 @@ enum rq_flag_bits { __REQ_NR_BITS, /* stops here */ }; -#define REQ_WRITE (1ULL << __REQ_WRITE) #define REQ_FAILFAST_DEV (1ULL << __REQ_FAILFAST_DEV) #define REQ_FAILFAST_TRANSPORT (1ULL << __REQ_FAILFAST_TRANSPORT) #define REQ_FAILFAST_DRIVER (1ULL << __REQ_FAILFAST_DRIVER) #define REQ_SYNC (1ULL << __REQ_SYNC) #define REQ_META (1ULL << __REQ_META) #define REQ_PRIO (1ULL << __REQ_PRIO) -#define REQ_DISCARD (1ULL << __REQ_DISCARD) -#define REQ_WRITE_SAME (1ULL << __REQ_WRITE_SAME) #define REQ_NOIDLE (1ULL << __REQ_NOIDLE) #define REQ_INTEGRITY (1ULL << __REQ_INTEGRITY) #define REQ_FAILFAST_MASK \ (REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT | REQ_FAILFAST_DRIVER) #define REQ_COMMON_MASK \ - (REQ_WRITE | REQ_FAILFAST_MASK | REQ_SYNC | REQ_META | REQ_PRIO | \ - REQ_DISCARD | REQ_WRITE_SAME | REQ_NOIDLE | REQ_FLUSH | REQ_FUA | \ - REQ_SECURE | REQ_INTEGRITY) + (REQ_FAILFAST_MASK | REQ_SYNC | REQ_META | REQ_PRIO | REQ_NOIDLE | \ + REQ_FLUSH | REQ_FUA | REQ_SECURE | REQ_INTEGRITY) #define REQ_CLONE_MASK REQ_COMMON_MASK -#define BIO_NO_ADVANCE_ITER_MASK (REQ_DISCARD|REQ_WRITE_SAME) - /* This mask is used for both bio and request merge checking */ #define REQ_NOMERGE_FLAGS \ (REQ_NOMERGE | REQ_STARTED | REQ_SOFTBARRIER | REQ_FLUSH | REQ_FUA | REQ_FLUSH_SEQ) @@ -250,9 +241,9 @@ enum rq_flag_bits { enum req_op { REQ_OP_READ, - REQ_OP_WRITE = REQ_WRITE, - REQ_OP_DISCARD = REQ_DISCARD, - REQ_OP_WRITE_SAME = REQ_WRITE_SAME, + REQ_OP_WRITE, + REQ_OP_DISCARD, /* request to discard sectors */ + REQ_OP_WRITE_SAME, /* write same block many times */ }; typedef unsigned int blk_qc_t; diff --git a/include/linux/fs.h b/include/linux/fs.h index 9becf20..509e21f 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -153,9 +153,10 @@ typedef void (dax_iodone_t)(struct buffer_head *bh_map, int uptodate); #define CHECK_IOVEC_ONLY -1 /* - * The below are the various read and write types that we support. Some of + * The below are the various read and write flags that we support. Some of * them include behavioral modifiers that send information down to the - * block layer and IO scheduler. Terminology: + * block layer and IO scheduler. They should be used along with a req_op. + * Terminology: * * The block layer uses device plugging to defer IO a little bit, in * the hope that we will see more IO very shortly. This increases @@ -194,19 +195,19 @@ typedef void (dax_iodone_t)(struct buffer_head *bh_map, int uptodate); * non-volatile media on completion. * */ -#define RW_MASK REQ_WRITE +#define RW_MASK REQ_OP_WRITE #define RWA_MASK REQ_RAHEAD -#define READ 0 +#define READ REQ_OP_READ #define WRITE RW_MASK #define READA RWA_MASK -#define READ_SYNC (READ | REQ_SYNC) -#define WRITE_SYNC (WRITE | REQ_SYNC | REQ_NOIDLE) -#define WRITE_ODIRECT (WRITE | REQ_SYNC) -#define WRITE_FLUSH (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_FLUSH) -#define WRITE_FUA (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_FUA) -#define WRITE_FLUSH_FUA (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_FLUSH | REQ_FUA) +#define READ_SYNC REQ_SYNC +#define WRITE_SYNC (REQ_SYNC | REQ_NOIDLE) +#define WRITE_ODIRECT REQ_SYNC +#define WRITE_FLUSH (REQ_SYNC | REQ_NOIDLE | REQ_FLUSH) +#define WRITE_FUA (REQ_SYNC | REQ_NOIDLE | REQ_FUA) +#define WRITE_FLUSH_FUA (REQ_SYNC | REQ_NOIDLE | REQ_FLUSH | REQ_FUA) /* * Attribute flags. These should be or-ed together to figure out what diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h index db75d69..20f708e 100644 --- a/include/trace/events/f2fs.h +++ b/include/trace/events/f2fs.h @@ -31,7 +31,6 @@ TRACE_DEFINE_ENUM(BG_GC); TRACE_DEFINE_ENUM(LFS); TRACE_DEFINE_ENUM(SSR); TRACE_DEFINE_ENUM(__REQ_RAHEAD); -TRACE_DEFINE_ENUM(__REQ_WRITE); TRACE_DEFINE_ENUM(__REQ_SYNC); TRACE_DEFINE_ENUM(__REQ_NOIDLE); TRACE_DEFINE_ENUM(__REQ_FLUSH); -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:38:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2B12F7CD6 for ; Wed, 13 Apr 2016 14:38:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 965DBAC003 for ; Wed, 13 Apr 2016 12:38:05 -0700 (PDT) X-ASG-Debug-ID: 1460576280-04bdf011024b3420001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id lLwOTcTDwf3fPdO4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:38:00 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 239667F096; Wed, 13 Apr 2016 19:38:00 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9X018278; Wed, 13 Apr 2016 15:37:57 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 37/42] block, fs, drivers: do use bi_rw/cmd_flags for REQ_OPs. Date: Wed, 13 Apr 2016 14:36:23 -0500 X-ASG-Orig-Subj: [PATCH 37/42] block, fs, drivers: do use bi_rw/cmd_flags for REQ_OPs. Message-Id: <1460576188-5751-38-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576280 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie We no longer use the bio->bi_rw and request->cmd_flags field for REQ_OPs: REQ_WRITE, REQ_DISCARD, REQ_WRITE_SAME, so this patch stops checking for them in bi_rw/cmd_flags and also removes the related compat code. v2: 1. Remove compat code in __get_request. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- block/bio.c | 6 ++--- block/blk-core.c | 34 ++++++++--------------------- block/blk-merge.c | 14 ++++++------ block/blk-mq.c | 3 +-- drivers/ata/libata-scsi.c | 2 +- drivers/block/brd.c | 2 +- drivers/block/drbd/drbd_main.c | 15 +++++++------ drivers/block/drbd/drbd_worker.c | 4 ++-- drivers/block/loop.c | 6 ++--- drivers/block/rbd.c | 2 +- drivers/block/rsxx/dma.c | 2 +- drivers/block/umem.c | 2 +- drivers/block/zram/zram_drv.c | 2 +- drivers/ide/ide-floppy.c | 2 +- drivers/lightnvm/rrpc.c | 2 +- drivers/md/bcache/request.c | 10 ++++----- drivers/md/dm-cache-target.c | 10 +++++---- drivers/md/dm-crypt.c | 2 +- drivers/md/dm-log-writes.c | 2 +- drivers/md/dm-raid1.c | 8 +++---- drivers/md/dm-region-hash.c | 4 ++-- drivers/md/dm-stripe.c | 4 ++-- drivers/md/dm-thin.c | 15 ++++++++----- drivers/md/dm.c | 6 ++--- drivers/md/linear.c | 2 +- drivers/md/raid0.c | 2 +- drivers/scsi/osd/osd_initiator.c | 4 ++-- drivers/staging/lustre/lustre/llite/lloop.c | 6 ++--- include/linux/bio.h | 15 ++++++++----- include/linux/fs.h | 25 +++++++-------------- 30 files changed, 99 insertions(+), 114 deletions(-) diff --git a/block/bio.c b/block/bio.c index 921de2e..bec5b54 100644 --- a/block/bio.c +++ b/block/bio.c @@ -675,10 +675,10 @@ struct bio *bio_clone_bioset(struct bio *bio_src, gfp_t gfp_mask, bio->bi_iter.bi_sector = bio_src->bi_iter.bi_sector; bio->bi_iter.bi_size = bio_src->bi_iter.bi_size; - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) goto integrity_clone; - if (bio->bi_rw & REQ_WRITE_SAME) { + if (bio->bi_op == REQ_OP_WRITE_SAME) { bio->bi_io_vec[bio->bi_vcnt++] = bio_src->bi_io_vec[0]; goto integrity_clone; } @@ -1797,7 +1797,7 @@ struct bio *bio_split(struct bio *bio, int sectors, * Discards need a mutable bio_vec to accommodate the payload * required by the DSM TRIM and UNMAP commands. */ - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) split = bio_clone_bioset(bio, gfp, bs); else split = bio_clone_fast(bio, gfp, bs); diff --git a/block/blk-core.c b/block/blk-core.c index a240657..cee131b 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1151,8 +1151,7 @@ static struct request *__get_request(struct request_list *rl, int op, blk_rq_init(q, rq); blk_rq_set_rl(rq, rl); - /* tmp compat - allow users to check either one for the op */ - rq->cmd_flags = op | op_flags | REQ_ALLOCED; + rq->cmd_flags = op_flags | REQ_ALLOCED; rq->op = op; /* init elvpriv */ @@ -1705,8 +1704,7 @@ void init_request_from_bio(struct request *req, struct bio *bio) { req->cmd_type = REQ_TYPE_FS; - /* tmp compat. Allow users to set bi_op or bi_rw */ - req->cmd_flags |= (bio->bi_rw | bio->bi_op) & REQ_COMMON_MASK; + req->cmd_flags |= bio->bi_rw & REQ_COMMON_MASK; if (bio->bi_rw & REQ_RAHEAD) req->cmd_flags |= REQ_FAILFAST_MASK; @@ -1856,9 +1854,9 @@ static void handle_bad_sector(struct bio *bio) char b[BDEVNAME_SIZE]; printk(KERN_INFO "attempt to access beyond end of device\n"); - printk(KERN_INFO "%s: rw=%ld, want=%Lu, limit=%Lu\n", + printk(KERN_INFO "%s: rw=%d,%ld, want=%Lu, limit=%Lu\n", bdevname(bio->bi_bdev, b), - bio->bi_rw, + bio->bi_op, bio->bi_rw, (unsigned long long)bio_end_sector(bio), (long long)(i_size_read(bio->bi_bdev->bd_inode) >> 9)); } @@ -1979,14 +1977,14 @@ generic_make_request_checks(struct bio *bio) } } - if ((bio->bi_rw & REQ_DISCARD) && + if ((bio->bi_op == REQ_OP_DISCARD) && (!blk_queue_discard(q) || ((bio->bi_rw & REQ_SECURE) && !blk_queue_secdiscard(q)))) { err = -EOPNOTSUPP; goto end_io; } - if (bio->bi_rw & REQ_WRITE_SAME && !bdev_write_same(bio->bi_bdev)) { + if (bio->bi_op == REQ_OP_WRITE_SAME && !bdev_write_same(bio->bi_bdev)) { err = -EOPNOTSUPP; goto end_io; } @@ -2040,12 +2038,6 @@ blk_qc_t generic_make_request(struct bio *bio) struct bio_list bio_list_on_stack; blk_qc_t ret = BLK_QC_T_NONE; - /* tmp compat. Allow users to set either one or both. - * This will be removed when we have converted - * everyone in the next patches. - */ - bio->bi_rw |= bio->bi_op; - if (!generic_make_request_checks(bio)) goto out; @@ -2115,12 +2107,6 @@ EXPORT_SYMBOL(generic_make_request); */ blk_qc_t submit_bio(struct bio *bio) { - /* tmp compat. Allow users to set either one or both. - * This will be removed when we have converted - * everyone in the next patches. - */ - bio->bi_rw |= bio->bi_op; - /* * If it's a regular read/write or a barrier with data attached, * go through the normal accounting stuff before submission. @@ -2128,12 +2114,12 @@ blk_qc_t submit_bio(struct bio *bio) if (bio_has_data(bio)) { unsigned int count; - if (unlikely(bio->bi_rw & REQ_WRITE_SAME)) + if (unlikely(bio->bi_op == REQ_OP_WRITE_SAME)) count = bdev_logical_block_size(bio->bi_bdev) >> 9; else count = bio_sectors(bio); - if (bio->bi_rw & WRITE) { + if (op_is_write(bio->bi_op)) { count_vm_events(PGPGOUT, count); } else { task_io_account_read(bio->bi_iter.bi_size); @@ -2144,7 +2130,7 @@ blk_qc_t submit_bio(struct bio *bio) char b[BDEVNAME_SIZE]; printk(KERN_DEBUG "%s(%d): %s block %Lu on %s (%u sectors)\n", current->comm, task_pid_nr(current), - (bio->bi_rw & WRITE) ? "WRITE" : "READ", + op_is_write(bio->bi_op) ? "WRITE" : "READ", (unsigned long long)bio->bi_iter.bi_sector, bdevname(bio->bi_bdev, b), count); @@ -2994,8 +2980,6 @@ EXPORT_SYMBOL_GPL(__blk_end_request_err); void blk_rq_bio_prep(struct request_queue *q, struct request *rq, struct bio *bio) { - /* tmp compat. Allow users to set bi_op or bi_rw */ - rq->cmd_flags |= bio_data_dir(bio); rq->op = bio->bi_op; if (bio_has_data(bio)) diff --git a/block/blk-merge.c b/block/blk-merge.c index c02371f..31dc0c0 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -172,9 +172,9 @@ void blk_queue_split(struct request_queue *q, struct bio **bio, struct bio *split, *res; unsigned nsegs; - if ((*bio)->bi_rw & REQ_DISCARD) + if ((*bio)->bi_op == REQ_OP_DISCARD) split = blk_bio_discard_split(q, *bio, bs, &nsegs); - else if ((*bio)->bi_rw & REQ_WRITE_SAME) + else if ((*bio)->bi_op == REQ_OP_WRITE_SAME) split = blk_bio_write_same_split(q, *bio, bs, &nsegs); else split = blk_bio_segment_split(q, *bio, q->bio_split, &nsegs); @@ -213,10 +213,10 @@ static unsigned int __blk_recalc_rq_segments(struct request_queue *q, * This should probably be returning 0, but blk_add_request_payload() * (Christoph!!!!) */ - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) return 1; - if (bio->bi_rw & REQ_WRITE_SAME) + if (bio->bi_op == REQ_OP_WRITE_SAME) return 1; fbio = bio; @@ -385,7 +385,7 @@ static int __blk_bios_map_sg(struct request_queue *q, struct bio *bio, nsegs = 0; cluster = blk_queue_cluster(q); - if (bio->bi_rw & REQ_DISCARD) { + if (bio->bi_op == REQ_OP_DISCARD) { /* * This is a hack - drivers should be neither modifying the * biovec, nor relying on bi_vcnt - but because of @@ -400,7 +400,7 @@ static int __blk_bios_map_sg(struct request_queue *q, struct bio *bio, return 0; } - if (bio->bi_rw & REQ_WRITE_SAME) { + if (bio->bi_op == REQ_OP_WRITE_SAME) { single_segment: *sg = sglist; bvec = bio_iovec(bio); @@ -439,7 +439,7 @@ int blk_rq_map_sg(struct request_queue *q, struct request *rq, } if (q->dma_drain_size && q->dma_drain_needed(rq)) { - if (rq->cmd_flags & REQ_WRITE) + if (op_is_write(rq->op)) memset(q->dma_drain_buffer, 0, q->dma_drain_size); sg_unmark_end(sg); diff --git a/block/blk-mq.c b/block/blk-mq.c index 64d61be..840f57a 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -170,8 +170,7 @@ static void blk_mq_rq_ctx_init(struct request_queue *q, struct blk_mq_ctx *ctx, rq->q = q; rq->mq_ctx = ctx; rq->op = op; - /* tmp compat - allow users to check either one for the op */ - rq->cmd_flags |= op | op_flags; + rq->cmd_flags |= op_flags; /* do not touch atomic flags, it needs atomic ops against the timer */ rq->cpu = -1; INIT_HLIST_NODE(&rq->hash); diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 8b61d63..af61ba7 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c @@ -1184,7 +1184,7 @@ static int atapi_drain_needed(struct request *rq) if (likely(rq->cmd_type != REQ_TYPE_BLOCK_PC)) return 0; - if (!blk_rq_bytes(rq) || (rq->cmd_flags & REQ_WRITE)) + if (!blk_rq_bytes(rq) || op_is_write(rq->op)) return 0; return atapi_cmd_type(rq->cmd[0]) == ATAPI_MISC; diff --git a/drivers/block/brd.c b/drivers/block/brd.c index 51a071e..eaefb8c 100644 --- a/drivers/block/brd.c +++ b/drivers/block/brd.c @@ -339,7 +339,7 @@ static blk_qc_t brd_make_request(struct request_queue *q, struct bio *bio) if (bio_end_sector(bio) > get_capacity(bdev->bd_disk)) goto io_error; - if (unlikely(bio->bi_rw & REQ_DISCARD)) { + if (unlikely(bio->bi_op == REQ_OP_DISCARD)) { if (sector & ((PAGE_SIZE >> SECTOR_SHIFT) - 1) || bio->bi_iter.bi_size & ~PAGE_MASK) goto io_error; diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 30c93d6..ace906f 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c @@ -1603,15 +1603,16 @@ static int _drbd_send_zc_ee(struct drbd_peer_device *peer_device, return 0; } -static u32 bio_flags_to_wire(struct drbd_connection *connection, unsigned long bi_rw) +static u32 bio_flags_to_wire(struct drbd_connection *connection, + struct bio *bio) { if (connection->agreed_pro_version >= 95) - return (bi_rw & REQ_SYNC ? DP_RW_SYNC : 0) | - (bi_rw & REQ_FUA ? DP_FUA : 0) | - (bi_rw & REQ_FLUSH ? DP_FLUSH : 0) | - (bi_rw & REQ_DISCARD ? DP_DISCARD : 0); + return (bio->bi_rw & REQ_SYNC ? DP_RW_SYNC : 0) | + (bio->bi_rw & REQ_FUA ? DP_FUA : 0) | + (bio->bi_rw & REQ_FLUSH ? DP_FLUSH : 0) | + (bio->bi_op == REQ_OP_DISCARD ? DP_DISCARD : 0); else - return bi_rw & REQ_SYNC ? DP_RW_SYNC : 0; + return bio->bi_rw & REQ_SYNC ? DP_RW_SYNC : 0; } /* Used to send write or TRIM aka REQ_DISCARD requests @@ -1636,7 +1637,7 @@ int drbd_send_dblock(struct drbd_peer_device *peer_device, struct drbd_request * p->sector = cpu_to_be64(req->i.sector); p->block_id = (unsigned long)req; p->seq_num = cpu_to_be32(atomic_inc_return(&device->packet_seq)); - dp_flags = bio_flags_to_wire(peer_device->connection, req->master_bio->bi_rw); + dp_flags = bio_flags_to_wire(peer_device->connection, req->master_bio); if (device->state.conn >= C_SYNC_SOURCE && device->state.conn <= C_PAUSED_SYNC_T) dp_flags |= DP_MAY_SET_IN_SYNC; diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_worker.c index 2a04b43..0949961 100644 --- a/drivers/block/drbd/drbd_worker.c +++ b/drivers/block/drbd/drbd_worker.c @@ -174,7 +174,7 @@ void drbd_peer_request_endio(struct bio *bio) struct drbd_peer_request *peer_req = bio->bi_private; struct drbd_device *device = peer_req->peer_device->device; int is_write = bio_data_dir(bio) == WRITE; - int is_discard = !!(bio->bi_rw & REQ_DISCARD); + int is_discard = !!(bio->bi_op == REQ_OP_DISCARD); if (bio->bi_error && __ratelimit(&drbd_ratelimit_state)) drbd_warn(device, "%s: error=%d s=%llus\n", @@ -248,7 +248,7 @@ void drbd_request_endio(struct bio *bio) /* to avoid recursion in __req_mod */ if (unlikely(bio->bi_error)) { - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) what = (bio->bi_error == -EOPNOTSUPP) ? DISCARD_COMPLETED_NOTSUPP : DISCARD_COMPLETED_WITH_ERROR; diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 0e80c9b..f1f7a25 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -447,7 +447,7 @@ static int lo_req_flush(struct loop_device *lo, struct request *rq) static inline void handle_partial_read(struct loop_cmd *cmd, long bytes) { - if (bytes < 0 || (cmd->rq->cmd_flags & REQ_WRITE)) + if (bytes < 0 || op_is_write(cmd->rq->op)) return; if (unlikely(bytes < blk_rq_bytes(cmd->rq))) { @@ -535,7 +535,7 @@ static int do_req_filebacked(struct loop_device *lo, struct request *rq) pos = ((loff_t) blk_rq_pos(rq) << 9) + lo->lo_offset; - if (rq->cmd_flags & REQ_WRITE) { + if (op_is_write(rq->op)) { if (rq->cmd_flags & REQ_FLUSH) ret = lo_req_flush(lo, rq); else if (rq->op == REQ_OP_DISCARD) @@ -1666,7 +1666,7 @@ static int loop_queue_rq(struct blk_mq_hw_ctx *hctx, static void loop_handle_cmd(struct loop_cmd *cmd) { - const bool write = cmd->rq->cmd_flags & REQ_WRITE; + const bool write = op_is_write(cmd->rq->op); struct loop_device *lo = cmd->rq->q->queuedata; int ret = 0; diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index e8935af..4c0c057 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -3373,7 +3373,7 @@ static void rbd_queue_workfn(struct work_struct *work) if (rq->op == REQ_OP_DISCARD) op_type = OBJ_OP_DISCARD; - else if (rq->cmd_flags & REQ_WRITE) + else if (rq->op == REQ_OP_WRITE) op_type = OBJ_OP_WRITE; else op_type = OBJ_OP_READ; diff --git a/drivers/block/rsxx/dma.c b/drivers/block/rsxx/dma.c index cf8cd29..dfc189e 100644 --- a/drivers/block/rsxx/dma.c +++ b/drivers/block/rsxx/dma.c @@ -705,7 +705,7 @@ int rsxx_dma_queue_bio(struct rsxx_cardinfo *card, dma_cnt[i] = 0; } - if (bio->bi_rw & REQ_DISCARD) { + if (bio->bi_op == REQ_OP_DISCARD) { bv_len = bio->bi_iter.bi_size; while (bv_len > 0) { diff --git a/drivers/block/umem.c b/drivers/block/umem.c index 7939b9f..a24ccbc 100644 --- a/drivers/block/umem.c +++ b/drivers/block/umem.c @@ -462,7 +462,7 @@ static void process_page(unsigned long data) le32_to_cpu(desc->local_addr)>>9, le32_to_cpu(desc->transfer_size)); dump_dmastat(card, control); - } else if ((bio->bi_rw & REQ_WRITE) && + } else if (op_is_write(bio->bi_op) && le32_to_cpu(desc->local_addr) >> 9 == card->init_size) { card->init_size += le32_to_cpu(desc->transfer_size) >> 9; diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 370c2f7..3c7ef31 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -849,7 +849,7 @@ static void __zram_make_request(struct zram *zram, struct bio *bio) offset = (bio->bi_iter.bi_sector & (SECTORS_PER_PAGE - 1)) << SECTOR_SHIFT; - if (unlikely(bio->bi_rw & REQ_DISCARD)) { + if (unlikely(bio->bi_op == REQ_OP_DISCARD)) { zram_bio_discard(zram, index, offset, bio); bio_endio(bio); return; diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index 2fb5350..f079d8d 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c @@ -206,7 +206,7 @@ static void idefloppy_create_rw_cmd(ide_drive_t *drive, memcpy(rq->cmd, pc->c, 12); pc->rq = rq; - if (rq->cmd_flags & REQ_WRITE) + if (cmd == WRITE) pc->flags |= PC_FLAG_WRITING; pc->flags |= PC_FLAG_DMA_OK; diff --git a/drivers/lightnvm/rrpc.c b/drivers/lightnvm/rrpc.c index fd9b629..9b1a74e 100644 --- a/drivers/lightnvm/rrpc.c +++ b/drivers/lightnvm/rrpc.c @@ -911,7 +911,7 @@ static blk_qc_t rrpc_make_rq(struct request_queue *q, struct bio *bio) struct nvm_rq *rqd; int err; - if (bio->bi_rw & REQ_DISCARD) { + if (bio->bi_op == REQ_OP_DISCARD) { rrpc_discard(rrpc, bio); return BLK_QC_T_NONE; } diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c index cd6837c..be8cd63f 100644 --- a/drivers/md/bcache/request.c +++ b/drivers/md/bcache/request.c @@ -378,7 +378,7 @@ static bool check_should_bypass(struct cached_dev *dc, struct bio *bio) if (test_bit(BCACHE_DEV_DETACHING, &dc->disk.flags) || c->gc_stats.in_use > CUTOFF_CACHE_ADD || - (bio->bi_rw & REQ_DISCARD)) + (bio->bi_op == REQ_OP_DISCARD)) goto skip; if (mode == CACHE_MODE_NONE || @@ -899,7 +899,7 @@ static void cached_dev_write(struct cached_dev *dc, struct search *s) * But check_overlapping drops dirty keys for which io hasn't started, * so we still want to call it. */ - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) s->iop.bypass = true; if (should_writeback(dc, s->orig_bio, @@ -913,7 +913,7 @@ static void cached_dev_write(struct cached_dev *dc, struct search *s) s->iop.bio = s->orig_bio; bio_get(s->iop.bio); - if (!(bio->bi_rw & REQ_DISCARD) || + if (!(bio->bi_op == REQ_OP_DISCARD) || blk_queue_discard(bdev_get_queue(dc->bdev))) closure_bio_submit(bio, cl); } else if (s->iop.writeback) { @@ -993,7 +993,7 @@ static blk_qc_t cached_dev_make_request(struct request_queue *q, cached_dev_read(dc, s); } } else { - if ((bio->bi_rw & REQ_DISCARD) && + if ((bio->bi_op == REQ_OP_DISCARD) && !blk_queue_discard(bdev_get_queue(dc->bdev))) bio_endio(bio); else @@ -1104,7 +1104,7 @@ static blk_qc_t flash_dev_make_request(struct request_queue *q, &KEY(d->id, bio->bi_iter.bi_sector, 0), &KEY(d->id, bio_end_sector(bio), 0)); - s->iop.bypass = (bio->bi_rw & REQ_DISCARD) != 0; + s->iop.bypass = (bio->bi_op == REQ_OP_DISCARD) != 0; s->iop.writeback = true; s->iop.bio = bio; diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c index ee0510f..838f784 100644 --- a/drivers/md/dm-cache-target.c +++ b/drivers/md/dm-cache-target.c @@ -788,7 +788,8 @@ static void check_if_tick_bio_needed(struct cache *cache, struct bio *bio) spin_lock_irqsave(&cache->lock, flags); if (cache->need_tick_bio && - !(bio->bi_rw & (REQ_FUA | REQ_FLUSH | REQ_DISCARD))) { + !(bio->bi_rw & (REQ_FUA | REQ_FLUSH)) && + bio->bi_op != REQ_OP_DISCARD) { pb->tick = true; cache->need_tick_bio = false; } @@ -851,7 +852,7 @@ static void inc_ds(struct cache *cache, struct bio *bio, static bool accountable_bio(struct cache *cache, struct bio *bio) { return ((bio->bi_bdev == cache->origin_dev->bdev) && - !(bio->bi_rw & REQ_DISCARD)); + bio->bi_op != REQ_OP_DISCARD); } static void accounted_begin(struct cache *cache, struct bio *bio) @@ -1067,7 +1068,8 @@ static void dec_io_migrations(struct cache *cache) static bool discard_or_flush(struct bio *bio) { - return bio->bi_rw & (REQ_FLUSH | REQ_FUA | REQ_DISCARD); + return bio->bi_op == REQ_OP_DISCARD || + bio->bi_rw & (REQ_FLUSH | REQ_FUA); } static void __cell_defer(struct cache *cache, struct dm_bio_prison_cell *cell) @@ -1980,7 +1982,7 @@ static void process_deferred_bios(struct cache *cache) if (bio->bi_rw & REQ_FLUSH) process_flush_bio(cache, bio); - else if (bio->bi_rw & REQ_DISCARD) + else if (bio->bi_op == REQ_OP_DISCARD) process_discard_bio(cache, &structs, bio); else process_bio(cache, &structs, bio); diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index 70fbf11..3a4ddad 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c @@ -1916,7 +1916,7 @@ static int crypt_map(struct dm_target *ti, struct bio *bio) * - for REQ_FLUSH device-mapper core ensures that no IO is in-flight * - for REQ_DISCARD caller must use flush if IO ordering matters */ - if (unlikely(bio->bi_rw & (REQ_FLUSH | REQ_DISCARD))) { + if (unlikely(bio->bi_rw & REQ_FLUSH || bio->bi_op == REQ_OP_DISCARD)) { bio->bi_bdev = cc->dev->bdev; if (bio_sectors(bio)) bio->bi_iter.bi_sector = cc->start + diff --git a/drivers/md/dm-log-writes.c b/drivers/md/dm-log-writes.c index 27630c5..e991405 100644 --- a/drivers/md/dm-log-writes.c +++ b/drivers/md/dm-log-writes.c @@ -557,7 +557,7 @@ static int log_writes_map(struct dm_target *ti, struct bio *bio) int i = 0; bool flush_bio = (bio->bi_rw & REQ_FLUSH); bool fua_bio = (bio->bi_rw & REQ_FUA); - bool discard_bio = (bio->bi_rw & REQ_DISCARD); + bool discard_bio = (bio->bi_op == REQ_OP_DISCARD); pb->block = NULL; diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c index 8a86bc3..c4d23da 100644 --- a/drivers/md/dm-raid1.c +++ b/drivers/md/dm-raid1.c @@ -626,7 +626,7 @@ static void write_callback(unsigned long error, void *context) * If the bio is discard, return an error, but do not * degrade the array. */ - if (bio->bi_rw & REQ_DISCARD) { + if (bio->bi_op == REQ_OP_DISCARD) { bio->bi_error = -EOPNOTSUPP; bio_endio(bio); return; @@ -665,7 +665,7 @@ static void do_write(struct mirror_set *ms, struct bio *bio) .client = ms->io_client, }; - if (bio->bi_rw & REQ_DISCARD) { + if (bio->bi_op == REQ_OP_DISCARD) { io_req.bi_op = REQ_OP_DISCARD; io_req.mem.type = DM_IO_KMEM; io_req.mem.ptr.addr = NULL; @@ -705,7 +705,7 @@ static void do_writes(struct mirror_set *ms, struct bio_list *writes) while ((bio = bio_list_pop(writes))) { if ((bio->bi_rw & REQ_FLUSH) || - (bio->bi_rw & REQ_DISCARD)) { + (bio->bi_op == REQ_OP_DISCARD)) { bio_list_add(&sync, bio); continue; } @@ -1253,7 +1253,7 @@ static int mirror_end_io(struct dm_target *ti, struct bio *bio, int error) * We need to dec pending if this was a write. */ if (rw == WRITE) { - if (!(bio->bi_rw & (REQ_FLUSH | REQ_DISCARD))) + if (!(bio->bi_rw & REQ_FLUSH) && bio->bi_op != REQ_OP_DISCARD) dm_rh_dec(ms->rh, bio_record->write_region); return error; } diff --git a/drivers/md/dm-region-hash.c b/drivers/md/dm-region-hash.c index 74cb7b9..ce4af57 100644 --- a/drivers/md/dm-region-hash.c +++ b/drivers/md/dm-region-hash.c @@ -403,7 +403,7 @@ void dm_rh_mark_nosync(struct dm_region_hash *rh, struct bio *bio) return; } - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) return; /* We must inform the log that the sync count has changed. */ @@ -526,7 +526,7 @@ void dm_rh_inc_pending(struct dm_region_hash *rh, struct bio_list *bios) struct bio *bio; for (bio = bios->head; bio; bio = bio->bi_next) { - if (bio->bi_rw & (REQ_FLUSH | REQ_DISCARD)) + if (bio->bi_rw & REQ_FLUSH || bio->bi_op == REQ_OP_DISCARD) continue; rh_inc(rh, dm_rh_bio_to_region(rh, bio)); } diff --git a/drivers/md/dm-stripe.c b/drivers/md/dm-stripe.c index 797ddb9..12b1630 100644 --- a/drivers/md/dm-stripe.c +++ b/drivers/md/dm-stripe.c @@ -292,8 +292,8 @@ static int stripe_map(struct dm_target *ti, struct bio *bio) bio->bi_bdev = sc->stripe[target_bio_nr].dev->bdev; return DM_MAPIO_REMAPPED; } - if (unlikely(bio->bi_rw & REQ_DISCARD) || - unlikely(bio->bi_rw & REQ_WRITE_SAME)) { + if (unlikely(bio->bi_op == REQ_OP_DISCARD) || + unlikely(bio->bi_op == REQ_OP_WRITE_SAME)) { target_bio_nr = dm_bio_get_target_bio_nr(bio); BUG_ON(target_bio_nr >= sc->stripes); return stripe_map_range(sc, bio, target_bio_nr); diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index 6049078..85688b7 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c @@ -715,7 +715,7 @@ static void inc_all_io_entry(struct pool *pool, struct bio *bio) { struct dm_thin_endio_hook *h; - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) return; h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook)); @@ -878,7 +878,8 @@ static void __inc_remap_and_issue_cell(void *context, struct bio *bio; while ((bio = bio_list_pop(&cell->bios))) { - if (bio->bi_rw & (REQ_DISCARD | REQ_FLUSH | REQ_FUA)) + if (bio->bi_rw & (REQ_FLUSH | REQ_FUA) || + bio->bi_op == REQ_OP_DISCARD) bio_list_add(&info->defer_bios, bio); else { inc_all_io_entry(info->tc->pool, bio); @@ -1656,7 +1657,8 @@ static void __remap_and_issue_shared_cell(void *context, while ((bio = bio_list_pop(&cell->bios))) { if ((bio_data_dir(bio) == WRITE) || - (bio->bi_rw & (REQ_DISCARD | REQ_FLUSH | REQ_FUA))) + (bio->bi_rw & (REQ_FLUSH | REQ_FUA) || + bio->bi_op == REQ_OP_DISCARD)) bio_list_add(&info->defer_bios, bio); else { struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook));; @@ -2045,7 +2047,7 @@ static void process_thin_deferred_bios(struct thin_c *tc) break; } - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) pool->process_discard(tc, bio); else pool->process_bio(tc, bio); @@ -2132,7 +2134,7 @@ static void process_thin_deferred_cells(struct thin_c *tc) return; } - if (cell->holder->bi_rw & REQ_DISCARD) + if (cell->holder->bi_op == REQ_OP_DISCARD) pool->process_discard_cell(tc, cell); else pool->process_cell(tc, cell); @@ -2570,7 +2572,8 @@ static int thin_bio_map(struct dm_target *ti, struct bio *bio) return DM_MAPIO_SUBMITTED; } - if (bio->bi_rw & (REQ_DISCARD | REQ_FLUSH | REQ_FUA)) { + if (bio->bi_rw & (REQ_FLUSH | REQ_FUA) || + bio->bi_op == REQ_OP_DISCARD) { thin_defer_bio_with_throttle(tc, bio); return DM_MAPIO_SUBMITTED; } diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 13c869c..4ee7d5c 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -1053,7 +1053,7 @@ static void clone_endio(struct bio *bio) } } - if (unlikely(r == -EREMOTEIO && (bio->bi_rw & REQ_WRITE_SAME) && + if (unlikely(r == -EREMOTEIO && (bio->bi_op == REQ_OP_WRITE_SAME) && !bdev_get_queue(bio->bi_bdev)->limits.max_write_same_sectors)) disable_write_same(md); @@ -1748,9 +1748,9 @@ static int __split_and_process_non_flush(struct clone_info *ci) unsigned len; int r; - if (unlikely(bio->bi_rw & REQ_DISCARD)) + if (unlikely(bio->bi_op == REQ_OP_DISCARD)) return __send_discard(ci); - else if (unlikely(bio->bi_rw & REQ_WRITE_SAME)) + else if (unlikely(bio->bi_op == REQ_OP_WRITE_SAME)) return __send_write_same(ci); ti = dm_table_find_target(ci->map, ci->sector); diff --git a/drivers/md/linear.c b/drivers/md/linear.c index b7fe7e9..aad82c7 100644 --- a/drivers/md/linear.c +++ b/drivers/md/linear.c @@ -252,7 +252,7 @@ static void linear_make_request(struct mddev *mddev, struct bio *bio) split->bi_iter.bi_sector = split->bi_iter.bi_sector - start_sector + data_offset; - if (unlikely((split->bi_rw & REQ_DISCARD) && + if (unlikely((split->bi_op == REQ_OP_DISCARD) && !blk_queue_discard(bdev_get_queue(split->bi_bdev)))) { /* Just ignore it */ bio_endio(split); diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index 2ea12c6..e0d1b8c 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c @@ -488,7 +488,7 @@ static void raid0_make_request(struct mddev *mddev, struct bio *bio) split->bi_iter.bi_sector = sector + zone->dev_start + tmp_dev->data_offset; - if (unlikely((split->bi_rw & REQ_DISCARD) && + if (unlikely((split->bi_op == REQ_OP_DISCARD) && !blk_queue_discard(bdev_get_queue(split->bi_bdev)))) { /* Just ignore it */ bio_endio(split); diff --git a/drivers/scsi/osd/osd_initiator.c b/drivers/scsi/osd/osd_initiator.c index edcba56..f6572e6 100644 --- a/drivers/scsi/osd/osd_initiator.c +++ b/drivers/scsi/osd/osd_initiator.c @@ -824,7 +824,7 @@ void osd_req_write(struct osd_request *or, { _osd_req_encode_common(or, OSD_ACT_WRITE, obj, offset, len); WARN_ON(or->out.bio || or->out.total_bytes); - WARN_ON(0 == (bio->bi_rw & REQ_WRITE)); + WARN_ON(!op_is_write(bio->bi_op)); or->out.bio = bio; or->out.total_bytes = len; } @@ -875,7 +875,7 @@ void osd_req_read(struct osd_request *or, { _osd_req_encode_common(or, OSD_ACT_READ, obj, offset, len); WARN_ON(or->in.bio || or->in.total_bytes); - WARN_ON(bio->bi_rw & REQ_WRITE); + WARN_ON(op_is_write(bio->bi_op)); or->in.bio = bio; or->in.total_bytes = len; } diff --git a/drivers/staging/lustre/lustre/llite/lloop.c b/drivers/staging/lustre/lustre/llite/lloop.c index f169c0d..e602389 100644 --- a/drivers/staging/lustre/lustre/llite/lloop.c +++ b/drivers/staging/lustre/lustre/llite/lloop.c @@ -211,9 +211,9 @@ static int do_bio_lustrebacked(struct lloop_device *lo, struct bio *head) return io->ci_result; io->ci_lockreq = CILR_NEVER; - rw = head->bi_rw; + rw = bio_data_dir(head); for (bio = head; bio ; bio = bio->bi_next) { - LASSERT(rw == bio->bi_rw); + LASSERT(rw == bio_data_dir(bio)); offset = (pgoff_t)(bio->bi_iter.bi_sector << 9) + lo->lo_offset; bio_for_each_segment(bvec, bio, iter) { @@ -304,7 +304,7 @@ static unsigned int loop_get_bio(struct lloop_device *lo, struct bio **req) /* TODO: need to split the bio, too bad. */ LASSERT(first->bi_vcnt <= LLOOP_MAX_SEGMENTS); - rw = first->bi_rw; + rw = bio_data_dir(first); bio = &lo->lo_bio; while (*bio && (*bio)->bi_rw == rw) { CDEBUG(D_INFO, "bio sector %llu size %u count %u vcnt%u\n", diff --git a/include/linux/bio.h b/include/linux/bio.h index 4724810..9e7b18b 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -106,18 +106,23 @@ static inline bool bio_has_data(struct bio *bio) { if (bio && bio->bi_iter.bi_size && - !(bio->bi_rw & REQ_DISCARD)) + !(bio->bi_op == REQ_OP_DISCARD)) return true; return false; } +static inline bool bio_no_advance_iter(struct bio *bio) +{ + return bio->bi_op == REQ_OP_DISCARD || bio->bi_op == REQ_OP_WRITE_SAME; +} + static inline bool bio_is_rw(struct bio *bio) { if (!bio_has_data(bio)) return false; - if (bio->bi_rw & BIO_NO_ADVANCE_ITER_MASK) + if (bio_no_advance_iter(bio)) return false; return true; @@ -225,7 +230,7 @@ static inline void bio_advance_iter(struct bio *bio, struct bvec_iter *iter, { iter->bi_sector += bytes >> 9; - if (bio->bi_rw & BIO_NO_ADVANCE_ITER_MASK) + if (bio_no_advance_iter(bio)) iter->bi_size -= bytes; else bvec_iter_advance(bio->bi_io_vec, iter, bytes); @@ -253,10 +258,10 @@ static inline unsigned bio_segments(struct bio *bio) * differently: */ - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) return 1; - if (bio->bi_rw & REQ_WRITE_SAME) + if (bio->bi_op == REQ_OP_WRITE_SAME) return 1; bio_for_each_segment(bv, bio, iter) diff --git a/include/linux/fs.h b/include/linux/fs.h index f3f2f66..9becf20 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2466,33 +2466,24 @@ static inline bool op_is_write(int op) } /* - * return READ, READA, or WRITE + * return data direction, READ or WRITE */ -static inline int bio_rw(struct bio *bio) +static inline int bio_data_dir(struct bio *bio) { - /* - * tmp cpmpat. Allow users to set either op or rw, until - * all code is converted in the next patches. - */ if (op_is_write(bio->bi_op)) return WRITE; - - return bio->bi_rw & (RW_MASK | RWA_MASK); + return READ; } /* - * return data direction, READ or WRITE + * return READ, READA, or WRITE */ -static inline int bio_data_dir(struct bio *bio) +static inline int bio_rw(struct bio *bio) { - /* - * tmp cpmpat. Allow users to set either op or rw, until - * all code is converted in the next patches. - */ - if (op_is_write(bio->bi_op)) - return WRITE; + if (bio->bi_rw & RWA_MASK) + return READA; - return bio->bi_rw & 1; + return bio_data_dir(bio); } extern void check_disk_size_change(struct gendisk *disk, -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:38:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8909F7D96 for ; Wed, 13 Apr 2016 14:38:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id DB54EAC003 for ; Wed, 13 Apr 2016 12:38:06 -0700 (PDT) X-ASG-Debug-ID: 1460576285-04cb6c24624b5260001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id rGm01KINPixc6h5Z (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:38:05 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D67667822B; Wed, 13 Apr 2016 19:38:04 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9Z018278; Wed, 13 Apr 2016 15:38:02 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 39/42] block: shrink bio/request fields Date: Wed, 13 Apr 2016 14:36:25 -0500 X-ASG-Orig-Subj: [PATCH 39/42] block: shrink bio/request fields Message-Id: <1460576188-5751-40-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576285 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie bi_op only needed to be a int for temp compat reasons, so this patch shrinks it to u8. There is no need for bi_rw to be so large now, so that is reduced to a unsigned int and bi_ioprio is just put in its own field. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- block/blk-core.c | 2 +- drivers/md/dm-flakey.c | 2 +- drivers/md/raid5.c | 13 +++++++------ fs/btrfs/check-integrity.c | 4 ++-- fs/btrfs/inode.c | 2 +- include/linux/bio.h | 13 ++----------- include/linux/blk_types.h | 11 +++-------- include/linux/blkdev.h | 2 +- 8 files changed, 18 insertions(+), 31 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index cee131b..71ba3a9 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1854,7 +1854,7 @@ static void handle_bad_sector(struct bio *bio) char b[BDEVNAME_SIZE]; printk(KERN_INFO "attempt to access beyond end of device\n"); - printk(KERN_INFO "%s: rw=%d,%ld, want=%Lu, limit=%Lu\n", + printk(KERN_INFO "%s: rw=%d,%u, want=%Lu, limit=%Lu\n", bdevname(bio->bi_bdev, b), bio->bi_op, bio->bi_rw, (unsigned long long)bio_end_sector(bio), diff --git a/drivers/md/dm-flakey.c b/drivers/md/dm-flakey.c index b7341de..29b99fb 100644 --- a/drivers/md/dm-flakey.c +++ b/drivers/md/dm-flakey.c @@ -266,7 +266,7 @@ static void corrupt_bio_data(struct bio *bio, struct flakey_c *fc) data[fc->corrupt_bio_byte - 1] = fc->corrupt_bio_value; DMDEBUG("Corrupting data bio=%p by writing %u to byte %u " - "(rw=%c bi_rw=%lu bi_sector=%llu cur_bytes=%u)\n", + "(rw=%c bi_rw=%u bi_sector=%llu cur_bytes=%u)\n", bio, fc->corrupt_bio_value, fc->corrupt_bio_byte, (bio_data_dir(bio) == WRITE) ? 'w' : 'r', bio->bi_rw, (unsigned long long)bio->bi_iter.bi_sector, bio_bytes); diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index c36b817..7fb693f 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -1006,9 +1006,9 @@ again: : raid5_end_read_request; bi->bi_private = sh; - pr_debug("%s: for %llu schedule op %ld on disc %d\n", + pr_debug("%s: for %llu schedule op %d,%u on disc %d\n", __func__, (unsigned long long)sh->sector, - bi->bi_rw, i); + bi->bi_op, bi->bi_rw, i); atomic_inc(&sh->count); if (sh != head_sh) atomic_inc(&head_sh->count); @@ -1058,10 +1058,10 @@ again: rbi->bi_end_io = raid5_end_write_request; rbi->bi_private = sh; - pr_debug("%s: for %llu schedule op %ld on " + pr_debug("%s: for %llu schedule op %d,%u on " "replacement disc %d\n", __func__, (unsigned long long)sh->sector, - rbi->bi_rw, i); + rbi->bi_op, rbi->bi_rw, i); atomic_inc(&sh->count); if (sh != head_sh) atomic_inc(&head_sh->count); @@ -1093,8 +1093,9 @@ again: if (!rdev && !rrdev) { if (op_is_write(op)) set_bit(STRIPE_DEGRADED, &sh->state); - pr_debug("skip op %ld on disc %d for sector %llu\n", - bi->bi_rw, i, (unsigned long long)sh->sector); + pr_debug("skip op %d,%u on disc %d for sector %llu\n", + bi->bi_op, bi->bi_rw, i, + (unsigned long long)sh->sector); clear_bit(R5_LOCKED, &sh->dev[i].flags); set_bit(STRIPE_HANDLE, &sh->state); } diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index c4a48e8..921a858 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c @@ -2943,7 +2943,7 @@ static void __btrfsic_submit_bio(struct bio *bio) if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) printk(KERN_INFO - "submit_bio(rw=%d,0x%lx, bi_vcnt=%u," + "submit_bio(rw=%d,0x%x, bi_vcnt=%u," " bi_sector=%llu (bytenr %llu), bi_bdev=%p)\n", bio->bi_op, bio->bi_rw, bio->bi_vcnt, (unsigned long long)bio->bi_iter.bi_sector, @@ -2986,7 +2986,7 @@ static void __btrfsic_submit_bio(struct bio *bio) if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) printk(KERN_INFO - "submit_bio(rw=%d,0x%lx FLUSH, bdev=%p)\n", + "submit_bio(rw=%d,0x%x FLUSH, bdev=%p)\n", bio->bi_op, bio->bi_rw, bio->bi_bdev); if (!dev_state->dummy_block_for_bio_bh_flush.is_iodone) { if ((dev_state->state->print_mask & diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index bd214ab..e2617ba 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -8153,7 +8153,7 @@ static void btrfs_end_dio_bio(struct bio *bio) if (err) btrfs_warn(BTRFS_I(dip->inode)->root->fs_info, - "direct IO failed ino %llu rw %d,%lu sector %#Lx len %u err no %d", + "direct IO failed ino %llu rw %d,0x%x sector %#Lx len %u err no %d", btrfs_ino(dip->inode), bio->bi_op, bio->bi_rw, (unsigned long long)bio->bi_iter.bi_sector, bio->bi_iter.bi_size, err); diff --git a/include/linux/bio.h b/include/linux/bio.h index 9e7b18b..5ece950 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -44,18 +44,9 @@ #define BIO_MAX_SIZE (BIO_MAX_PAGES << PAGE_SHIFT) #define BIO_MAX_SECTORS (BIO_MAX_SIZE >> 9) -/* - * upper 16 bits of bi_rw define the io priority of this bio - */ -#define BIO_PRIO_SHIFT (8 * sizeof(unsigned long) - IOPRIO_BITS) -#define bio_prio(bio) ((bio)->bi_rw >> BIO_PRIO_SHIFT) +#define bio_prio(bio) (bio)->bi_ioprio #define bio_prio_valid(bio) ioprio_valid(bio_prio(bio)) - -#define bio_set_prio(bio, prio) do { \ - WARN_ON(prio >= (1 << IOPRIO_BITS)); \ - (bio)->bi_rw &= ((1UL << BIO_PRIO_SHIFT) - 1); \ - (bio)->bi_rw |= ((unsigned long) (prio) << BIO_PRIO_SHIFT); \ -} while (0) +#define bio_set_prio(bio, prio) ((bio)->bi_ioprio = prio) /* * various member access, note that bio_data should of course not be used diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index b4251ed..498f395 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -48,14 +48,9 @@ struct bio { struct block_device *bi_bdev; unsigned int bi_flags; /* status, command, etc */ int bi_error; - unsigned long bi_rw; /* bottom bits rq_flags_bits - * top bits priority - */ - /* - * this will be a u8 in the next patches and bi_rw can be shrunk to - * a u32. For compat in these transistional patches op is a int here. - */ - int bi_op; /* REQ_OP */ + unsigned int bi_rw; /* rq_flag_bits */ + unsigned short bi_ioprio; + u8 bi_op; /* REQ_OP */ struct bvec_iter bi_iter; diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 25ec7ce..6c300cf 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -96,7 +96,7 @@ struct request { struct request_queue *q; struct blk_mq_ctx *mq_ctx; - int op; + u8 op; u64 cmd_flags; unsigned cmd_type; unsigned long atomic_flags; -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:38:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D18EE7D9B for ; Wed, 13 Apr 2016 14:38:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A22018F8049 for ; Wed, 13 Apr 2016 12:38:09 -0700 (PDT) X-ASG-Debug-ID: 1460576287-04cb6c245f4b5280001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id y3ojz7DBmXUjocLd (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:38:07 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 09CF0C084AC6; Wed, 13 Apr 2016 19:38:07 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9a018278; Wed, 13 Apr 2016 15:38:04 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 40/42] block, drivers: add REQ_OP_FLUSH operation Date: Wed, 13 Apr 2016 14:36:26 -0500 X-ASG-Orig-Subj: [PATCH 40/42] block, drivers: add REQ_OP_FLUSH operation Message-Id: <1460576188-5751-41-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576287 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This adds a REQ_OP_FLUSH operation that is sent to request_fn based drivers by the block layer's flush code, instead of sending requests with the request->cmd_flags REQ_FLUSH bit set. For the following 3 flush related patches, I have not tested every driver. I have only tested scsi with xfs and btrfs. v2. 1. Fix kbuild failures. Forgot to update ubd driver. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- Documentation/block/writeback_cache_control.txt | 6 +++--- arch/um/drivers/ubd_kern.c | 2 +- block/blk-flush.c | 3 ++- drivers/block/loop.c | 4 ++-- drivers/block/nbd.c | 2 +- drivers/block/osdblk.c | 2 +- drivers/block/ps3disk.c | 4 ++-- drivers/block/skd_main.c | 2 +- drivers/block/virtio_blk.c | 2 +- drivers/block/xen-blkfront.c | 8 ++++---- drivers/ide/ide-disk.c | 2 +- drivers/md/dm.c | 2 +- drivers/mmc/card/block.c | 5 ++--- drivers/mmc/card/queue.h | 2 +- drivers/mtd/mtd_blkdevs.c | 2 +- drivers/nvme/host/core.c | 2 +- drivers/scsi/sd.c | 7 +++---- include/linux/blk_types.h | 1 + include/linux/blkdev.h | 3 +++ kernel/trace/blktrace.c | 5 ++++- 20 files changed, 36 insertions(+), 30 deletions(-) diff --git a/Documentation/block/writeback_cache_control.txt b/Documentation/block/writeback_cache_control.txt index 59e0516..da70bda 100644 --- a/Documentation/block/writeback_cache_control.txt +++ b/Documentation/block/writeback_cache_control.txt @@ -73,9 +73,9 @@ doing: blk_queue_write_cache(sdkp->disk->queue, true, false); -and handle empty REQ_FLUSH requests in its prep_fn/request_fn. Note that +and handle empty REQ_OP_FLUSH requests in its prep_fn/request_fn. Note that REQ_FLUSH requests with a payload are automatically turned into a sequence -of an empty REQ_FLUSH request followed by the actual write by the block +of an empty REQ_OP_FLUSH request followed by the actual write by the block layer. For devices that also support the FUA bit the block layer needs to be told to pass through the REQ_FUA bit using: @@ -83,4 +83,4 @@ to be told to pass through the REQ_FUA bit using: and the driver must handle write requests that have the REQ_FUA bit set in prep_fn/request_fn. If the FUA bit is not natively supported the block -layer turns it into an empty REQ_FLUSH request after the actual write. +layer turns it into an empty REQ_OP_FLUSH request after the actual write. diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c index 17e96dc..0cb2dab 100644 --- a/arch/um/drivers/ubd_kern.c +++ b/arch/um/drivers/ubd_kern.c @@ -1286,7 +1286,7 @@ static void do_ubd_request(struct request_queue *q) req = dev->request; - if (req->cmd_flags & REQ_FLUSH) { + if (req->op == REQ_OP_FLUSH) { io_req = kmalloc(sizeof(struct io_thread_req), GFP_ATOMIC); if (io_req == NULL) { diff --git a/block/blk-flush.c b/block/blk-flush.c index b05acca..af0c805 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c @@ -29,7 +29,7 @@ * The actual execution of flush is double buffered. Whenever a request * needs to execute PRE or POSTFLUSH, it queues at * fq->flush_queue[fq->flush_pending_idx]. Once certain criteria are met, a - * flush is issued and the pending_idx is toggled. When the flush + * REQ_OP_FLUSH is issued and the pending_idx is toggled. When the flush * completes, all the requests which were pending are proceeded to the next * step. This allows arbitrary merging of different types of FLUSH/FUA * requests. @@ -330,6 +330,7 @@ static bool blk_kick_flush(struct request_queue *q, struct blk_flush_queue *fq) flush_rq->cmd_type = REQ_TYPE_FS; flush_rq->cmd_flags = WRITE_FLUSH | REQ_FLUSH_SEQ; + flush_rq->op = REQ_OP_FLUSH; flush_rq->rq_disk = first_rq->rq_disk; flush_rq->end_io = flush_end_io; diff --git a/drivers/block/loop.c b/drivers/block/loop.c index f1f7a25..7d7d7a4f 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -536,7 +536,7 @@ static int do_req_filebacked(struct loop_device *lo, struct request *rq) pos = ((loff_t) blk_rq_pos(rq) << 9) + lo->lo_offset; if (op_is_write(rq->op)) { - if (rq->cmd_flags & REQ_FLUSH) + if (rq->op == REQ_OP_FLUSH) ret = lo_req_flush(lo, rq); else if (rq->op == REQ_OP_DISCARD) ret = lo_discard(lo, rq, pos); @@ -1653,7 +1653,7 @@ static int loop_queue_rq(struct blk_mq_hw_ctx *hctx, if (lo->lo_state != Lo_bound) return -EIO; - if (lo->use_dio && (!(cmd->rq->cmd_flags & REQ_FLUSH) || + if (lo->use_dio && (cmd->rq->op != REQ_OP_FLUSH || cmd->rq->op == REQ_OP_DISCARD)) cmd->use_aio = true; else diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 68a1476..4e9fd5b 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -284,7 +284,7 @@ static int nbd_send_req(struct nbd_device *nbd, struct request *req) type = NBD_CMD_DISC; else if (req->op == REQ_OP_DISCARD) type = NBD_CMD_TRIM; - else if (req->cmd_flags & REQ_FLUSH) + else if (req->op == REQ_OP_FLUSH) type = NBD_CMD_FLUSH; else if (rq_data_dir(req) == WRITE) type = NBD_CMD_WRITE; diff --git a/drivers/block/osdblk.c b/drivers/block/osdblk.c index c2854a2..806e3a3 100644 --- a/drivers/block/osdblk.c +++ b/drivers/block/osdblk.c @@ -321,7 +321,7 @@ static void osdblk_rq_fn(struct request_queue *q) * driver-specific, etc. */ - do_flush = rq->cmd_flags & REQ_FLUSH; + do_flush = (rq->op == REQ_OP_FLUSH); do_write = (rq_data_dir(rq) == WRITE); if (!do_flush) { /* osd_flush does not use a bio */ diff --git a/drivers/block/ps3disk.c b/drivers/block/ps3disk.c index 4b7e405..2e652db 100644 --- a/drivers/block/ps3disk.c +++ b/drivers/block/ps3disk.c @@ -196,7 +196,7 @@ static void ps3disk_do_request(struct ps3_storage_device *dev, dev_dbg(&dev->sbd.core, "%s:%u\n", __func__, __LINE__); while ((req = blk_fetch_request(q))) { - if (req->cmd_flags & REQ_FLUSH) { + if (req->op == REQ_OP_FLUSH) { if (ps3disk_submit_flush_request(dev, req)) break; } else if (req->cmd_type == REQ_TYPE_FS) { @@ -256,7 +256,7 @@ static irqreturn_t ps3disk_interrupt(int irq, void *data) return IRQ_HANDLED; } - if (req->cmd_flags & REQ_FLUSH) { + if (req->op == REQ_OP_FLUSH) { read = 0; op = "flush"; } else { diff --git a/drivers/block/skd_main.c b/drivers/block/skd_main.c index 5739223..01c3cd3 100644 --- a/drivers/block/skd_main.c +++ b/drivers/block/skd_main.c @@ -624,7 +624,7 @@ static void skd_request_fn(struct request_queue *q) count = blk_rq_sectors(req); data_dir = rq_data_dir(req); - if (req->cmd_flags & REQ_FLUSH) + if (req->op == REQ_OP_FLUSH) flush++; if (req->cmd_flags & REQ_FUA) diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index 42758b5..7e1d041 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c @@ -172,7 +172,7 @@ static int virtio_queue_rq(struct blk_mq_hw_ctx *hctx, BUG_ON(req->nr_phys_segments + 2 > vblk->sg_elems); vbr->req = req; - if (req->cmd_flags & REQ_FLUSH) { + if (req->op == REQ_OP_FLUSH) { vbr->out_hdr.type = cpu_to_virtio32(vblk->vdev, VIRTIO_BLK_T_FLUSH); vbr->out_hdr.sector = 0; vbr->out_hdr.ioprio = cpu_to_virtio32(vblk->vdev, req_get_ioprio(vbr->req)); diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index dc08d4d..f01691a 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c @@ -743,7 +743,7 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri * The indirect operation can only be a BLKIF_OP_READ or * BLKIF_OP_WRITE */ - BUG_ON(req->cmd_flags & (REQ_FLUSH | REQ_FUA)); + BUG_ON(req->op == REQ_OP_FLUSH || req->cmd_flags & REQ_FUA); ring_req->operation = BLKIF_OP_INDIRECT; ring_req->u.indirect.indirect_op = rq_data_dir(req) ? BLKIF_OP_WRITE : BLKIF_OP_READ; @@ -755,7 +755,7 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri ring_req->u.rw.handle = info->handle; ring_req->operation = rq_data_dir(req) ? BLKIF_OP_WRITE : BLKIF_OP_READ; - if (req->cmd_flags & (REQ_FLUSH | REQ_FUA)) { + if (req->op == REQ_OP_FLUSH || req->cmd_flags & REQ_FUA) { /* * Ideally we can do an unordered flush-to-disk. * In case the backend onlysupports barriers, use that. @@ -865,7 +865,7 @@ static inline bool blkif_request_flush_invalid(struct request *req, struct blkfront_info *info) { return ((req->cmd_type != REQ_TYPE_FS) || - ((req->cmd_flags & REQ_FLUSH) && + ((req->op == REQ_OP_FLUSH) && !(info->feature_flush & REQ_FLUSH)) || ((req->cmd_flags & REQ_FUA) && !(info->feature_flush & REQ_FUA))); @@ -2055,7 +2055,7 @@ static int blkif_recover(struct blkfront_info *info) /* * Get the bios in the request so we can re-queue them. */ - if (copy[i].request->cmd_flags & REQ_FLUSH || + if (copy[i].request->op == REQ_OP_FLUSH || copy[i].request->op == REQ_OP_DISCARD || copy[i].request->cmd_flags & (REQ_FUA | REQ_SECURE)) { /* diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 05dbcce..538c343 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c @@ -431,7 +431,7 @@ static int idedisk_prep_fn(struct request_queue *q, struct request *rq) ide_drive_t *drive = q->queuedata; struct ide_cmd *cmd; - if (!(rq->cmd_flags & REQ_FLUSH)) + if (rq->op != REQ_OP_FLUSH) return BLKPREP_OK; if (rq->special) { diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 4ee7d5c..bd852bc 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -2171,7 +2171,7 @@ static void dm_request_fn(struct request_queue *q) /* always use block 0 to find the target for flushes for now */ pos = 0; - if (!(rq->cmd_flags & REQ_FLUSH)) + if (rq->op != REQ_OP_FLUSH) pos = blk_rq_pos(rq); if ((dm_request_peeked_before_merge_deadline(md) && diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 8fa3982..25dd331 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -1696,7 +1696,7 @@ static u8 mmc_blk_prep_packed_list(struct mmc_queue *mq, struct request *req) !IS_ALIGNED(blk_rq_sectors(next), 8)) break; - if (next->op == REQ_OP_DISCARD || next->cmd_flags & REQ_FLUSH) + if (next->op == REQ_OP_DISCARD || next->op == REQ_OP_FLUSH) break; if (rq_data_dir(cur) != rq_data_dir(next)) @@ -2121,7 +2121,6 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) struct mmc_card *card = md->queue.card; struct mmc_host *host = card->host; unsigned long flags; - unsigned int cmd_flags = req ? req->cmd_flags : 0; if (req && !mq->mqrq_prev->req) /* claim host only for the first request */ @@ -2145,7 +2144,7 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) ret = mmc_blk_issue_secdiscard_rq(mq, req); else ret = mmc_blk_issue_discard_rq(mq, req); - } else if (cmd_flags & REQ_FLUSH) { + } else if (req && req->op == REQ_OP_FLUSH) { /* complete ongoing async transfer before issuing flush */ if (card->host->areq) mmc_blk_issue_rw_rq(mq, NULL); diff --git a/drivers/mmc/card/queue.h b/drivers/mmc/card/queue.h index f166e5b..6c67e4e 100644 --- a/drivers/mmc/card/queue.h +++ b/drivers/mmc/card/queue.h @@ -3,7 +3,7 @@ static inline bool mmc_req_is_special(struct request *req) { - return req && (req->cmd_flags & REQ_FLUSH || req->op == REQ_OP_DISCARD); + return req && (req->op == REQ_OP_FLUSH || req->op == REQ_OP_DISCARD); } struct request; diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c index e8b0263..688e689 100644 --- a/drivers/mtd/mtd_blkdevs.c +++ b/drivers/mtd/mtd_blkdevs.c @@ -87,7 +87,7 @@ static int do_blktrans_request(struct mtd_blktrans_ops *tr, if (req->cmd_type != REQ_TYPE_FS) return -EIO; - if (req->cmd_flags & REQ_FLUSH) + if (req->op == REQ_OP_FLUSH) return tr->flush(dev); if (blk_rq_pos(req) + blk_rq_cur_sectors(req) > diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index b741aed..7055675 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -232,7 +232,7 @@ int nvme_setup_cmd(struct nvme_ns *ns, struct request *req, if (req->cmd_type == REQ_TYPE_DRV_PRIV) memcpy(cmd, req->cmd, sizeof(*cmd)); - else if (req->cmd_flags & REQ_FLUSH) + else if (req->op == REQ_OP_FLUSH) nvme_setup_flush(ns, cmd); else if (req->op == REQ_OP_DISCARD) ret = nvme_setup_discard(ns, req, cmd); diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 2fc7191..5fe24e6 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1143,12 +1143,11 @@ static int sd_init_command(struct scsi_cmnd *cmd) return sd_setup_discard_cmnd(cmd); case REQ_OP_WRITE_SAME: return sd_setup_write_same_cmnd(cmd); + case REQ_OP_FLUSH: + return sd_setup_flush_cmnd(cmd); case REQ_OP_READ: case REQ_OP_WRITE: - if (rq->cmd_flags & REQ_FLUSH) - return sd_setup_flush_cmnd(cmd); - else - return sd_setup_read_write_cmnd(cmd); + return sd_setup_read_write_cmnd(cmd); default: BUG(); } diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index 498f395..f9e53ca 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -239,6 +239,7 @@ enum req_op { REQ_OP_WRITE, REQ_OP_DISCARD, /* request to discard sectors */ REQ_OP_WRITE_SAME, /* write same block many times */ + REQ_OP_FLUSH, /* request for cache flush */ }; typedef unsigned int blk_qc_t; diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 6c300cf..4fdea8e 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -654,6 +654,9 @@ static inline bool rq_mergeable(struct request *rq) if (rq->cmd_type != REQ_TYPE_FS) return false; + if (rq->op == REQ_OP_FLUSH) + return false; + if (rq->cmd_flags & REQ_NOMERGE_FLAGS) return false; diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index 6a381ea..192d714 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c @@ -223,6 +223,8 @@ static void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes, what |= MASK_TC_BIT(op_flags, FUA); if (op == REQ_OP_DISCARD) what |= BLK_TC_ACT(BLK_TC_DISCARD); + if (op == REQ_OP_FLUSH) + what |= BLK_TC_ACT(BLK_TC_FLUSH); pid = tsk->pid; if (act_log_check(bt, what, sector, pid)) @@ -1775,7 +1777,8 @@ void blk_fill_rwbs(char *rwbs, int op, u32 rw, int bytes) { int i = 0; - if (rw & REQ_FLUSH) + if (rw & REQ_FLUSH || + op == REQ_OP_FLUSH) rwbs[i++] = 'F'; if (op == REQ_OP_WRITE) -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:38:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 386D17DAC for ; Wed, 13 Apr 2016 14:38:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0B4BF304062 for ; Wed, 13 Apr 2016 12:38:11 -0700 (PDT) X-ASG-Debug-ID: 1460576289-04cbb02e1b1a0c30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 4ScdzGGhcLfmrW4u (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:38:10 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5DF173B754; Wed, 13 Apr 2016 19:38:09 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9b018278; Wed, 13 Apr 2016 15:38:07 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 41/42] block: use QUEUE flags instead of flush_flags to test for flush support Date: Wed, 13 Apr 2016 14:36:27 -0500 X-ASG-Orig-Subj: [PATCH 41/42] block: use QUEUE flags instead of flush_flags to test for flush support Message-Id: <1460576188-5751-42-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576289 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie The last patch added a REQ_OP_FLUSH for request_fn drivers and the next patch renames REQ_FLUSH to REQ_PREFLUSH which will be used by file systems and make_request_fn drivers so they can send a write/flush combo. Jens's cleanup in: block: add ability to flag write back caching on a device 93e9d8e836cb1a9a58b33eb6643bf061c6119ef2 also added QUEUE flags that can be used to get the same info as flush_flags. This patch has drivers check the QUEUE_FLAG bits, so we do not have to have the extra REQ_FLUSH definition. Signed-off-by: Mike Christie --- block/blk-core.c | 3 ++- block/blk-flush.c | 12 +++++----- block/blk-settings.c | 11 ++++----- drivers/block/xen-blkback/xenbus.c | 2 +- drivers/block/xen-blkfront.c | 48 +++++++++++++++++++------------------ drivers/md/dm-table.c | 20 +++++++++++----- drivers/md/raid5-cache.c | 3 ++- drivers/target/target_core_iblock.c | 6 ++--- include/linux/blkdev.h | 3 ++- 9 files changed, 59 insertions(+), 49 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index 71ba3a9..ef69d04 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1969,7 +1969,8 @@ generic_make_request_checks(struct bio *bio) * drivers without flush support don't have to worry * about them. */ - if ((bio->bi_rw & (REQ_FLUSH | REQ_FUA)) && !q->flush_flags) { + if ((bio->bi_rw & (REQ_FLUSH | REQ_FUA)) && + !(blk_queue_flush(q) || blk_queue_fua(q))) { bio->bi_rw &= ~(REQ_FLUSH | REQ_FUA); if (!nr_sectors) { err = 0; diff --git a/block/blk-flush.c b/block/blk-flush.c index af0c805..7682680 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c @@ -95,17 +95,18 @@ enum { static bool blk_kick_flush(struct request_queue *q, struct blk_flush_queue *fq); -static unsigned int blk_flush_policy(unsigned int fflags, struct request *rq) +static unsigned int blk_flush_policy(struct request *rq) { + struct request_queue *q = rq->q; unsigned int policy = 0; if (blk_rq_sectors(rq)) policy |= REQ_FSEQ_DATA; - if (fflags & REQ_FLUSH) { + if (blk_queue_flush(q)) { if (rq->cmd_flags & REQ_FLUSH) policy |= REQ_FSEQ_PREFLUSH; - if (!(fflags & REQ_FUA) && (rq->cmd_flags & REQ_FUA)) + if (!blk_queue_fua(q) && (rq->cmd_flags & REQ_FUA)) policy |= REQ_FSEQ_POSTFLUSH; } return policy; @@ -385,8 +386,7 @@ static void mq_flush_data_end_io(struct request *rq, int error) void blk_insert_flush(struct request *rq) { struct request_queue *q = rq->q; - unsigned int fflags = q->flush_flags; /* may change, cache */ - unsigned int policy = blk_flush_policy(fflags, rq); + unsigned int policy = blk_flush_policy(rq); struct blk_flush_queue *fq = blk_get_flush_queue(q, rq->mq_ctx); /* @@ -394,7 +394,7 @@ void blk_insert_flush(struct request *rq) * REQ_FLUSH and FUA for the driver. */ rq->cmd_flags &= ~REQ_FLUSH; - if (!(fflags & REQ_FUA)) + if (!blk_queue_fua(q)) rq->cmd_flags &= ~REQ_FUA; /* diff --git a/block/blk-settings.c b/block/blk-settings.c index 80d9327..51bc002 100644 --- a/block/blk-settings.c +++ b/block/blk-settings.c @@ -837,16 +837,13 @@ EXPORT_SYMBOL_GPL(blk_queue_flush_queueable); void blk_queue_write_cache(struct request_queue *q, bool wc, bool fua) { spin_lock_irq(q->queue_lock); - if (wc) { + if (wc) queue_flag_set(QUEUE_FLAG_WC, q); - q->flush_flags = REQ_FLUSH; - } else + else queue_flag_clear(QUEUE_FLAG_WC, q); - if (fua) { - if (wc) - q->flush_flags |= REQ_FUA; + if (fua) queue_flag_set(QUEUE_FLAG_FUA, q); - } else + else queue_flag_clear(QUEUE_FLAG_FUA, q); spin_unlock_irq(q->queue_lock); } diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c index 26aa080..1291c35 100644 --- a/drivers/block/xen-blkback/xenbus.c +++ b/drivers/block/xen-blkback/xenbus.c @@ -477,7 +477,7 @@ static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle, vbd->type |= VDISK_REMOVABLE; q = bdev_get_queue(bdev); - if (q && q->flush_flags) + if (q && (blk_queue_flush(q) || blk_queue_fua(q))) vbd->flush_support = true; if (q && blk_queue_secdiscard(q)) diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index f01691a..a0651f3 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c @@ -196,6 +196,7 @@ struct blkfront_info unsigned int nr_ring_pages; struct request_queue *rq; unsigned int feature_flush; + unsigned int feature_fua; unsigned int feature_discard:1; unsigned int feature_secdiscard:1; unsigned int discard_granularity; @@ -763,19 +764,15 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri * implement it the same way. (It's also a FLUSH+FUA, * since it is guaranteed ordered WRT previous writes.) */ - switch (info->feature_flush & - ((REQ_FLUSH|REQ_FUA))) { - case REQ_FLUSH|REQ_FUA: + if (blk_queue_flush(info->rq) && + blk_queue_fua(info->rq)) ring_req->operation = BLKIF_OP_WRITE_BARRIER; - break; - case REQ_FLUSH: + else if (blk_queue_flush(info->rq)) ring_req->operation = BLKIF_OP_FLUSH_DISKCACHE; - break; - default: + else ring_req->operation = 0; - } } ring_req->u.rw.nr_segments = num_grant; if (unlikely(require_extra_req)) { @@ -866,9 +863,9 @@ static inline bool blkif_request_flush_invalid(struct request *req, { return ((req->cmd_type != REQ_TYPE_FS) || ((req->op == REQ_OP_FLUSH) && - !(info->feature_flush & REQ_FLUSH)) || + !(blk_queue_flush(info->rq))) || ((req->cmd_flags & REQ_FUA) && - !(info->feature_flush & REQ_FUA))); + !(blk_queue_fua(info->rq)))); } static int blkif_queue_rq(struct blk_mq_hw_ctx *hctx, @@ -985,24 +982,22 @@ static int xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size, return 0; } -static const char *flush_info(unsigned int feature_flush) +static const char *flush_info(struct blkfront_info *info) { - switch (feature_flush & ((REQ_FLUSH | REQ_FUA))) { - case REQ_FLUSH|REQ_FUA: + if (blk_queue_flush(info->rq) && blk_queue_fua(info->rq)) return "barrier: enabled;"; - case REQ_FLUSH: + else if (blk_queue_flush(info->rq)) return "flush diskcache: enabled;"; - default: + else return "barrier or flush: disabled;"; - } } static void xlvbd_flush(struct blkfront_info *info) { - blk_queue_write_cache(info->rq, info->feature_flush & REQ_FLUSH, - info->feature_flush & REQ_FUA); + blk_queue_write_cache(info->rq, info->feature_flush ? true : false, + info->feature_flush ? true : false); pr_info("blkfront: %s: %s %s %s %s %s\n", - info->gd->disk_name, flush_info(info->feature_flush), + info->gd->disk_name, flush_info(info), "persistent grants:", info->feature_persistent ? "enabled;" : "disabled;", "indirect descriptors:", info->max_indirect_segments ? "enabled;" : "disabled;"); @@ -1621,6 +1616,7 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id) if (unlikely(error)) { if (error == -EOPNOTSUPP) error = 0; + info->feature_fua = 0; info->feature_flush = 0; xlvbd_flush(info); } @@ -2315,6 +2311,7 @@ static void blkfront_gather_backend_features(struct blkfront_info *info) unsigned int indirect_segments; info->feature_flush = 0; + info->feature_fua = 0; err = xenbus_gather(XBT_NIL, info->xbdev->otherend, "feature-barrier", "%d", &barrier, @@ -2327,8 +2324,11 @@ static void blkfront_gather_backend_features(struct blkfront_info *info) * * If there are barriers, then we use flush. */ - if (!err && barrier) - info->feature_flush = REQ_FLUSH | REQ_FUA; + if (!err && barrier) { + info->feature_flush = 1; + info->feature_fua = 1; + } + /* * And if there is "feature-flush-cache" use that above * barriers. @@ -2337,8 +2337,10 @@ static void blkfront_gather_backend_features(struct blkfront_info *info) "feature-flush-cache", "%d", &flush, NULL); - if (!err && flush) - info->feature_flush = REQ_FLUSH; + if (!err && flush) { + info->feature_flush = 1; + info->feature_fua = 0; + } err = xenbus_gather(XBT_NIL, info->xbdev->otherend, "feature-discard", "%d", &discard, diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index 4b1ffc0..a47884b 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c @@ -1348,13 +1348,21 @@ static void dm_table_verify_integrity(struct dm_table *t) static int device_flush_capable(struct dm_target *ti, struct dm_dev *dev, sector_t start, sector_t len, void *data) { - unsigned flush = (*(unsigned *)data); struct request_queue *q = bdev_get_queue(dev->bdev); - return q && (q->flush_flags & flush); + return q && blk_queue_flush(q); } -static bool dm_table_supports_flush(struct dm_table *t, unsigned flush) +static int device_fua_capable(struct dm_target *ti, struct dm_dev *dev, + sector_t start, sector_t len, void *data) +{ + struct request_queue *q = bdev_get_queue(dev->bdev); + + return q && blk_queue_fua(q); +} + +static bool dm_table_supports_flush(struct dm_table *t, + iterate_devices_callout_fn callout_fn) { struct dm_target *ti; unsigned i = 0; @@ -1375,7 +1383,7 @@ static bool dm_table_supports_flush(struct dm_table *t, unsigned flush) return true; if (ti->type->iterate_devices && - ti->type->iterate_devices(ti, device_flush_capable, &flush)) + ti->type->iterate_devices(ti, callout_fn, NULL)) return true; } @@ -1518,9 +1526,9 @@ void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q, else queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, q); - if (dm_table_supports_flush(t, REQ_FLUSH)) { + if (dm_table_supports_flush(t, device_flush_capable)) { wc = true; - if (dm_table_supports_flush(t, REQ_FUA)) + if (dm_table_supports_flush(t, device_fua_capable)) fua = true; } blk_queue_write_cache(q, wc, fua); diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c index da07670..3d88b55 100644 --- a/drivers/md/raid5-cache.c +++ b/drivers/md/raid5-cache.c @@ -1196,6 +1196,7 @@ ioerr: int r5l_init_log(struct r5conf *conf, struct md_rdev *rdev) { + struct request_queue *q = rdev->bdev->bd_disk->queue; struct r5l_log *log; if (PAGE_SIZE != 4096) @@ -1205,7 +1206,7 @@ int r5l_init_log(struct r5conf *conf, struct md_rdev *rdev) return -ENOMEM; log->rdev = rdev; - log->need_cache_flush = (rdev->bdev->bd_disk->queue->flush_flags != 0); + log->need_cache_flush = (blk_queue_flush(q) || blk_queue_fua(q)); log->uuid_checksum = crc32c_le(~0, rdev->mddev->uuid, sizeof(rdev->mddev->uuid)); diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c index fb1543b..733a61a 100644 --- a/drivers/target/target_core_iblock.c +++ b/drivers/target/target_core_iblock.c @@ -691,11 +691,11 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, * Force writethrough using WRITE_FUA if a volatile write cache * is not enabled, or if initiator set the Force Unit Access bit. */ - if (q->flush_flags & REQ_FUA) { + if (blk_queue_fua(q)) { if (cmd->se_cmd_flags & SCF_FUA) { op = REQ_OP_WRITE; op_flags = WRITE_FUA; - } else if (!(q->flush_flags & REQ_FLUSH)) { + } else if (!blk_queue_flush(q)) { op = REQ_OP_WRITE; op_flags = WRITE_FUA; } else { @@ -844,7 +844,7 @@ static bool iblock_get_write_cache(struct se_device *dev) struct block_device *bd = ib_dev->ibd_bd; struct request_queue *q = bdev_get_queue(bd); - return q->flush_flags & REQ_FLUSH; + return blk_queue_flush(q); } static const struct target_backend_ops iblock_ops = { diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 4fdea8e..ed33156 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -434,7 +434,6 @@ struct request_queue { /* * for flush operations */ - unsigned int flush_flags; unsigned int flush_not_queueable:1; struct blk_flush_queue *fq; @@ -583,6 +582,8 @@ static inline void queue_flag_clear(unsigned int flag, struct request_queue *q) #define blk_queue_discard(q) test_bit(QUEUE_FLAG_DISCARD, &(q)->queue_flags) #define blk_queue_secdiscard(q) (blk_queue_discard(q) && \ test_bit(QUEUE_FLAG_SECDISCARD, &(q)->queue_flags)) +#define blk_queue_flush(q) test_bit(QUEUE_FLAG_WC, &(q)->queue_flags) +#define blk_queue_fua(q) test_bit(QUEUE_FLAG_FUA, &(q)->queue_flags) #define blk_noretry_request(rq) \ ((rq)->cmd_flags & (REQ_FAILFAST_DEV|REQ_FAILFAST_TRANSPORT| \ -- 2.7.2 From mchristi@redhat.com Wed Apr 13 14:38:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D22727CCD for ; Wed, 13 Apr 2016 14:38:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A285C304053 for ; Wed, 13 Apr 2016 12:38:15 -0700 (PDT) X-ASG-Debug-ID: 1460576291-04cb6c24604b52c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QQnjRDEBHGAVvW4v (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 12:38:12 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9A90CA89D; Wed, 13 Apr 2016 19:38:11 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-74.rdu2.redhat.com [10.10.61.74]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DJaU9c018278; Wed, 13 Apr 2016 15:38:09 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 42/42] block, drivers, fs: rename REQ_FLUSH to REQ_PREFLUSH Date: Wed, 13 Apr 2016 14:36:28 -0500 X-ASG-Orig-Subj: [PATCH 42/42] block, drivers, fs: rename REQ_FLUSH to REQ_PREFLUSH Message-Id: <1460576188-5751-43-git-send-email-mchristi@redhat.com> In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> References: <1460576188-5751-1-git-send-email-mchristi@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: 1460576292 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie To avoid confusion between REQ_OP_FLUSH, which is handled by request_fn drivers, and upper layers requesting the block layer perform a flush sequence along with possibly a WRITE, this patch renames REQ_FLUSH to REQ_PREFLUSH. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig --- Documentation/block/writeback_cache_control.txt | 22 +++++++++++----------- Documentation/device-mapper/log-writes.txt | 10 +++++----- block/blk-core.c | 12 ++++++------ block/blk-flush.c | 16 ++++++++-------- block/blk-mq.c | 4 ++-- drivers/block/drbd/drbd_actlog.c | 4 ++-- drivers/block/drbd/drbd_main.c | 2 +- drivers/block/drbd/drbd_protocol.h | 2 +- drivers/block/drbd/drbd_receiver.c | 2 +- drivers/block/drbd/drbd_req.c | 2 +- drivers/md/bcache/journal.c | 2 +- drivers/md/bcache/request.c | 8 ++++---- drivers/md/dm-cache-target.c | 12 ++++++------ drivers/md/dm-crypt.c | 7 ++++--- drivers/md/dm-era-target.c | 4 ++-- drivers/md/dm-io.c | 2 +- drivers/md/dm-log-writes.c | 2 +- drivers/md/dm-raid1.c | 5 +++-- drivers/md/dm-region-hash.c | 4 ++-- drivers/md/dm-snap.c | 6 +++--- drivers/md/dm-stripe.c | 2 +- drivers/md/dm-thin.c | 8 ++++---- drivers/md/dm.c | 12 ++++++------ drivers/md/linear.c | 2 +- drivers/md/md.c | 2 +- drivers/md/md.h | 2 +- drivers/md/multipath.c | 2 +- drivers/md/raid0.c | 2 +- drivers/md/raid1.c | 3 ++- drivers/md/raid10.c | 2 +- drivers/md/raid5-cache.c | 2 +- drivers/md/raid5.c | 2 +- fs/btrfs/check-integrity.c | 8 ++++---- fs/jbd2/journal.c | 2 +- fs/xfs/xfs_buf.c | 2 +- include/linux/blk_types.h | 8 ++++---- include/linux/fs.h | 4 ++-- include/trace/events/f2fs.h | 2 +- kernel/trace/blktrace.c | 5 +++-- 39 files changed, 102 insertions(+), 98 deletions(-) diff --git a/Documentation/block/writeback_cache_control.txt b/Documentation/block/writeback_cache_control.txt index da70bda..8a6bdad 100644 --- a/Documentation/block/writeback_cache_control.txt +++ b/Documentation/block/writeback_cache_control.txt @@ -20,11 +20,11 @@ a forced cache flush, and the Force Unit Access (FUA) flag for requests. Explicit cache flushes ---------------------- -The REQ_FLUSH flag can be OR ed into the r/w flags of a bio submitted from +The REQ_PREFLUSH flag can be OR ed into the r/w flags of a bio submitted from the filesystem and will make sure the volatile cache of the storage device has been flushed before the actual I/O operation is started. This explicitly guarantees that previously completed write requests are on non-volatile -storage before the flagged bio starts. In addition the REQ_FLUSH flag can be +storage before the flagged bio starts. In addition the REQ_PREFLUSH flag can be set on an otherwise empty bio structure, which causes only an explicit cache flush without any dependent I/O. It is recommend to use the blkdev_issue_flush() helper for a pure cache flush. @@ -41,21 +41,21 @@ signaled after the data has been committed to non-volatile storage. Implementation details for filesystems -------------------------------------- -Filesystems can simply set the REQ_FLUSH and REQ_FUA bits and do not have to +Filesystems can simply set the REQ_PREFLUSH and REQ_FUA bits and do not have to worry if the underlying devices need any explicit cache flushing and how -the Forced Unit Access is implemented. The REQ_FLUSH and REQ_FUA flags +the Forced Unit Access is implemented. The REQ_PREFLUSH and REQ_FUA flags may both be set on a single bio. Implementation details for make_request_fn based block drivers -------------------------------------------------------------- -These drivers will always see the REQ_FLUSH and REQ_FUA bits as they sit +These drivers will always see the REQ_PREFLUSH and REQ_FUA bits as they sit directly below the submit_bio interface. For remapping drivers the REQ_FUA bits need to be propagated to underlying devices, and a global flush needs -to be implemented for bios with the REQ_FLUSH bit set. For real device -drivers that do not have a volatile cache the REQ_FLUSH and REQ_FUA bits -on non-empty bios can simply be ignored, and REQ_FLUSH requests without +to be implemented for bios with the REQ_PREFLUSH bit set. For real device +drivers that do not have a volatile cache the REQ_PREFLUSH and REQ_FUA bits +on non-empty bios can simply be ignored, and REQ_PREFLUSH requests without data can be completed successfully without doing any work. Drivers for devices with volatile caches need to implement the support for these flags themselves without any help from the block layer. @@ -65,8 +65,8 @@ Implementation details for request_fn based block drivers -------------------------------------------------------------- For devices that do not support volatile write caches there is no driver -support required, the block layer completes empty REQ_FLUSH requests before -entering the driver and strips off the REQ_FLUSH and REQ_FUA bits from +support required, the block layer completes empty REQ_PREFLUSH requests before +entering the driver and strips off the REQ_PREFLUSH and REQ_FUA bits from requests that have a payload. For devices with volatile write caches the driver needs to tell the block layer that it supports flushing caches by doing: @@ -74,7 +74,7 @@ doing: blk_queue_write_cache(sdkp->disk->queue, true, false); and handle empty REQ_OP_FLUSH requests in its prep_fn/request_fn. Note that -REQ_FLUSH requests with a payload are automatically turned into a sequence +REQ_PREFLUSH requests with a payload are automatically turned into a sequence of an empty REQ_OP_FLUSH request followed by the actual write by the block layer. For devices that also support the FUA bit the block layer needs to be told to pass through the REQ_FUA bit using: diff --git a/Documentation/device-mapper/log-writes.txt b/Documentation/device-mapper/log-writes.txt index c10f30c..f4ebcba 100644 --- a/Documentation/device-mapper/log-writes.txt +++ b/Documentation/device-mapper/log-writes.txt @@ -14,14 +14,14 @@ Log Ordering We log things in order of completion once we are sure the write is no longer in cache. This means that normal WRITE requests are not actually logged until the -next REQ_FLUSH request. This is to make it easier for userspace to replay the -log in a way that correlates to what is on disk and not what is in cache, to -make it easier to detect improper waiting/flushing. +next REQ_PREFLUSH request. This is to make it easier for userspace to replay +the log in a way that correlates to what is on disk and not what is in cache, +to make it easier to detect improper waiting/flushing. This works by attaching all WRITE requests to a list once the write completes. -Once we see a REQ_FLUSH request we splice this list onto the request and once +Once we see a REQ_PREFLUSH request we splice this list onto the request and once the FLUSH request completes we log all of the WRITEs and then the FLUSH. Only -completed WRITEs, at the time the REQ_FLUSH is issued, are added in order to +completed WRITEs, at the time the REQ_PREFLUSH is issued, are added in order to simulate the worst case scenario with regard to power failures. Consider the following example (W means write, C means complete): diff --git a/block/blk-core.c b/block/blk-core.c index ef69d04..6ef8a35 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1029,7 +1029,7 @@ static bool blk_rq_should_init_elevator(struct bio *bio) * Flush requests do not use the elevator so skip initialization. * This allows a request to share the flush and elevator data. */ - if (bio->bi_rw & (REQ_FLUSH | REQ_FUA)) + if (bio->bi_rw & (REQ_PREFLUSH | REQ_FUA)) return false; return true; @@ -1737,7 +1737,7 @@ static blk_qc_t blk_queue_bio(struct request_queue *q, struct bio *bio) return BLK_QC_T_NONE; } - if (bio->bi_rw & (REQ_FLUSH | REQ_FUA)) { + if (bio->bi_rw & (REQ_PREFLUSH | REQ_FUA)) { spin_lock_irq(q->queue_lock); where = ELEVATOR_INSERT_FLUSH; goto get_rq; @@ -1969,9 +1969,9 @@ generic_make_request_checks(struct bio *bio) * drivers without flush support don't have to worry * about them. */ - if ((bio->bi_rw & (REQ_FLUSH | REQ_FUA)) && + if ((bio->bi_rw & (REQ_PREFLUSH | REQ_FUA)) && !(blk_queue_flush(q) || blk_queue_fua(q))) { - bio->bi_rw &= ~(REQ_FLUSH | REQ_FUA); + bio->bi_rw &= ~(REQ_PREFLUSH | REQ_FUA); if (!nr_sectors) { err = 0; goto end_io; @@ -2218,7 +2218,7 @@ int blk_insert_cloned_request(struct request_queue *q, struct request *rq) */ BUG_ON(blk_queued_rq(rq)); - if (rq->cmd_flags & (REQ_FLUSH|REQ_FUA)) + if (rq->cmd_flags & (REQ_PREFLUSH | REQ_FUA)) where = ELEVATOR_INSERT_FLUSH; add_acct_request(q, rq, where); @@ -3312,7 +3312,7 @@ void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule) /* * rq is already accounted, so use raw insert */ - if (rq->cmd_flags & (REQ_FLUSH | REQ_FUA)) + if (rq->cmd_flags & (REQ_PREFLUSH | REQ_FUA)) __elv_add_request(q, rq, ELEVATOR_INSERT_FLUSH); else __elv_add_request(q, rq, ELEVATOR_INSERT_SORT_MERGE); diff --git a/block/blk-flush.c b/block/blk-flush.c index 7682680..773a7ee 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c @@ -10,8 +10,8 @@ * optional steps - PREFLUSH, DATA and POSTFLUSH - according to the request * properties and hardware capability. * - * If a request doesn't have data, only REQ_FLUSH makes sense, which - * indicates a simple flush request. If there is data, REQ_FLUSH indicates + * If a request doesn't have data, only REQ_PREFLUSH makes sense, which + * indicates a simple flush request. If there is data, REQ_PREFLUSH indicates * that the device cache should be flushed before the data is executed, and * REQ_FUA means that the data must be on non-volatile media on request * completion. @@ -20,11 +20,11 @@ * difference. The requests are either completed immediately if there's no * data or executed as normal requests otherwise. * - * If the device has writeback cache and supports FUA, REQ_FLUSH is + * If the device has writeback cache and supports FUA, REQ_PREFLUSH is * translated to PREFLUSH but REQ_FUA is passed down directly with DATA. * - * If the device has writeback cache and doesn't support FUA, REQ_FLUSH is - * translated to PREFLUSH and REQ_FUA to POSTFLUSH. + * If the device has writeback cache and doesn't support FUA, REQ_PREFLUSH + * is translated to PREFLUSH and REQ_FUA to POSTFLUSH. * * The actual execution of flush is double buffered. Whenever a request * needs to execute PRE or POSTFLUSH, it queues at @@ -104,7 +104,7 @@ static unsigned int blk_flush_policy(struct request *rq) policy |= REQ_FSEQ_DATA; if (blk_queue_flush(q)) { - if (rq->cmd_flags & REQ_FLUSH) + if (rq->cmd_flags & REQ_PREFLUSH) policy |= REQ_FSEQ_PREFLUSH; if (!blk_queue_fua(q) && (rq->cmd_flags & REQ_FUA)) policy |= REQ_FSEQ_POSTFLUSH; @@ -391,9 +391,9 @@ void blk_insert_flush(struct request *rq) /* * @policy now records what operations need to be done. Adjust - * REQ_FLUSH and FUA for the driver. + * REQ_PREFLUSH and FUA for the driver. */ - rq->cmd_flags &= ~REQ_FLUSH; + rq->cmd_flags &= ~REQ_PREFLUSH; if (!blk_queue_fua(q)) rq->cmd_flags &= ~REQ_FUA; diff --git a/block/blk-mq.c b/block/blk-mq.c index 840f57a..6b0c98d 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -1249,7 +1249,7 @@ static int blk_mq_direct_issue_request(struct request *rq, blk_qc_t *cookie) static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio) { const int is_sync = rw_is_sync(bio->bi_op, bio->bi_rw); - const int is_flush_fua = bio->bi_rw & (REQ_FLUSH | REQ_FUA); + const int is_flush_fua = bio->bi_rw & (REQ_PREFLUSH | REQ_FUA); struct blk_map_ctx data; struct request *rq; unsigned int request_count = 0; @@ -1346,7 +1346,7 @@ done: static blk_qc_t blk_sq_make_request(struct request_queue *q, struct bio *bio) { const int is_sync = rw_is_sync(bio->bi_op, bio->bi_rw); - const int is_flush_fua = bio->bi_rw & (REQ_FLUSH | REQ_FUA); + const int is_flush_fua = bio->bi_rw & (REQ_PREFLUSH | REQ_FUA); struct blk_plug *plug; unsigned int request_count = 0; struct blk_map_ctx data; diff --git a/drivers/block/drbd/drbd_actlog.c b/drivers/block/drbd/drbd_actlog.c index 2fa8534..b12ff76 100644 --- a/drivers/block/drbd/drbd_actlog.c +++ b/drivers/block/drbd/drbd_actlog.c @@ -148,7 +148,7 @@ static int _drbd_md_sync_page_io(struct drbd_device *device, device->md_io.error = -ENODEV; if ((op == REQ_OP_WRITE) && !test_bit(MD_NO_FUA, &device->flags)) - op_flags |= REQ_FUA | REQ_FLUSH; + op_flags |= REQ_FUA | REQ_PREFLUSH; op_flags |= REQ_SYNC | REQ_NOIDLE; bio = bio_alloc_drbd(GFP_NOIO); @@ -848,7 +848,7 @@ int __drbd_change_sync(struct drbd_device *device, sector_t sector, int size, unsigned long count = 0; sector_t esector, nr_sectors; - /* This would be an empty REQ_FLUSH, be silent. */ + /* This would be an empty REQ_PREFLUSH, be silent. */ if ((mode == SET_OUT_OF_SYNC) && size == 0) return 0; diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index ace906f..7936e0e 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c @@ -1609,7 +1609,7 @@ static u32 bio_flags_to_wire(struct drbd_connection *connection, if (connection->agreed_pro_version >= 95) return (bio->bi_rw & REQ_SYNC ? DP_RW_SYNC : 0) | (bio->bi_rw & REQ_FUA ? DP_FUA : 0) | - (bio->bi_rw & REQ_FLUSH ? DP_FLUSH : 0) | + (bio->bi_rw & REQ_PREFLUSH ? DP_FLUSH : 0) | (bio->bi_op == REQ_OP_DISCARD ? DP_DISCARD : 0); else return bio->bi_rw & REQ_SYNC ? DP_RW_SYNC : 0; diff --git a/drivers/block/drbd/drbd_protocol.h b/drivers/block/drbd/drbd_protocol.h index ef92453..129f8c7 100644 --- a/drivers/block/drbd/drbd_protocol.h +++ b/drivers/block/drbd/drbd_protocol.h @@ -112,7 +112,7 @@ struct p_header100 { #define DP_MAY_SET_IN_SYNC 4 #define DP_UNPLUG 8 /* not used anymore */ #define DP_FUA 16 /* equals REQ_FUA */ -#define DP_FLUSH 32 /* equals REQ_FLUSH */ +#define DP_FLUSH 32 /* equals REQ_PREFLUSH */ #define DP_DISCARD 64 /* equals REQ_DISCARD */ #define DP_SEND_RECEIVE_ACK 128 /* This is a proto B write request */ #define DP_SEND_WRITE_ACK 256 /* This is a proto C write request */ diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index a0b95da..4303731 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c @@ -2159,7 +2159,7 @@ static unsigned long wire_flags_to_bio_flags(u32 dpf) { return (dpf & DP_RW_SYNC ? REQ_SYNC : 0) | (dpf & DP_FUA ? REQ_FUA : 0) | - (dpf & DP_FLUSH ? REQ_FLUSH : 0); + (dpf & DP_FLUSH ? REQ_PREFLUSH : 0); } static unsigned long wire_flags_to_bio_op(u32 dpf) diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c index 2255dcf..eef6e95 100644 --- a/drivers/block/drbd/drbd_req.c +++ b/drivers/block/drbd/drbd_req.c @@ -1132,7 +1132,7 @@ static int drbd_process_write_request(struct drbd_request *req) * replicating, in which case there is no point. */ if (unlikely(req->i.size == 0)) { /* The only size==0 bios we expect are empty flushes. */ - D_ASSERT(device, req->master_bio->bi_rw & REQ_FLUSH); + D_ASSERT(device, req->master_bio->bi_rw & REQ_PREFLUSH); if (remote) _req_mod(req, QUEUE_AS_DRBD_BARRIER); return remote; diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c index 68fa0f0..6e0a330 100644 --- a/drivers/md/bcache/journal.c +++ b/drivers/md/bcache/journal.c @@ -627,7 +627,7 @@ static void journal_write_unlocked(struct closure *cl) bio->bi_iter.bi_sector = PTR_OFFSET(k, i); bio->bi_bdev = ca->bdev; bio->bi_op = REQ_OP_WRITE; - bio->bi_rw = REQ_SYNC|REQ_META|REQ_FLUSH|REQ_FUA; + bio->bi_rw = REQ_SYNC|REQ_META|REQ_PREFLUSH|REQ_FUA; bio->bi_iter.bi_size = sectors << 9; bio->bi_end_io = journal_write_endio; diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c index be8cd63f..3947114 100644 --- a/drivers/md/bcache/request.c +++ b/drivers/md/bcache/request.c @@ -205,10 +205,10 @@ static void bch_data_insert_start(struct closure *cl) return bch_data_invalidate(cl); /* - * Journal writes are marked REQ_FLUSH; if the original write was a + * Journal writes are marked REQ_PREFLUSH; if the original write was a * flush, it'll wait on the journal write. */ - bio->bi_rw &= ~(REQ_FLUSH|REQ_FUA); + bio->bi_rw &= ~(REQ_PREFLUSH|REQ_FUA); do { unsigned i; @@ -668,7 +668,7 @@ static inline struct search *search_alloc(struct bio *bio, s->iop.write_prio = 0; s->iop.error = 0; s->iop.flags = 0; - s->iop.flush_journal = (bio->bi_rw & (REQ_FLUSH|REQ_FUA)) != 0; + s->iop.flush_journal = (bio->bi_rw & (REQ_PREFLUSH|REQ_FUA)) != 0; s->iop.wq = bcache_wq; return s; @@ -920,7 +920,7 @@ static void cached_dev_write(struct cached_dev *dc, struct search *s) bch_writeback_add(dc); s->iop.bio = bio; - if (bio->bi_rw & REQ_FLUSH) { + if (bio->bi_rw & REQ_PREFLUSH) { /* Also need to send a flush to the backing device */ struct bio *flush = bio_alloc_bioset(GFP_NOIO, 0, dc->disk.bio_split); diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c index 838f784..af753a6 100644 --- a/drivers/md/dm-cache-target.c +++ b/drivers/md/dm-cache-target.c @@ -788,7 +788,7 @@ static void check_if_tick_bio_needed(struct cache *cache, struct bio *bio) spin_lock_irqsave(&cache->lock, flags); if (cache->need_tick_bio && - !(bio->bi_rw & (REQ_FUA | REQ_FLUSH)) && + !(bio->bi_rw & (REQ_FUA | REQ_PREFLUSH)) && bio->bi_op != REQ_OP_DISCARD) { pb->tick = true; cache->need_tick_bio = false; @@ -830,7 +830,7 @@ static dm_oblock_t get_bio_block(struct cache *cache, struct bio *bio) static int bio_triggers_commit(struct cache *cache, struct bio *bio) { - return bio->bi_rw & (REQ_FLUSH | REQ_FUA); + return bio->bi_rw & (REQ_PREFLUSH | REQ_FUA); } /* @@ -1069,7 +1069,7 @@ static void dec_io_migrations(struct cache *cache) static bool discard_or_flush(struct bio *bio) { return bio->bi_op == REQ_OP_DISCARD || - bio->bi_rw & (REQ_FLUSH | REQ_FUA); + bio->bi_rw & (REQ_PREFLUSH | REQ_FUA); } static void __cell_defer(struct cache *cache, struct dm_bio_prison_cell *cell) @@ -1614,8 +1614,8 @@ static void process_flush_bio(struct cache *cache, struct bio *bio) remap_to_cache(cache, bio, 0); /* - * REQ_FLUSH is not directed at any particular block so we don't - * need to inc_ds(). REQ_FUA's are split into a write + REQ_FLUSH + * REQ_PREFLUSH is not directed at any particular block so we don't + * need to inc_ds(). REQ_FUA's are split into a write + REQ_PREFLUSH * by dm-core. */ issue(cache, bio); @@ -1980,7 +1980,7 @@ static void process_deferred_bios(struct cache *cache) bio = bio_list_pop(&bios); - if (bio->bi_rw & REQ_FLUSH) + if (bio->bi_rw & REQ_PREFLUSH) process_flush_bio(cache, bio); else if (bio->bi_op == REQ_OP_DISCARD) process_discard_bio(cache, &structs, bio); diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index 3a4ddad..9481dbc 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c @@ -1912,11 +1912,12 @@ static int crypt_map(struct dm_target *ti, struct bio *bio) struct crypt_config *cc = ti->private; /* - * If bio is REQ_FLUSH or REQ_DISCARD, just bypass crypt queues. - * - for REQ_FLUSH device-mapper core ensures that no IO is in-flight + * If bio is REQ_PREFLUSH or REQ_DISCARD, just bypass crypt queues. + * - for REQ_PREFLUSH device-mapper core ensures that no IO is in-flight * - for REQ_DISCARD caller must use flush if IO ordering matters */ - if (unlikely(bio->bi_rw & REQ_FLUSH || bio->bi_op == REQ_OP_DISCARD)) { + if (unlikely(bio->bi_rw & REQ_PREFLUSH || + bio->bi_op == REQ_OP_DISCARD)) { bio->bi_bdev = cc->dev->bdev; if (bio_sectors(bio)) bio->bi_iter.bi_sector = cc->start + diff --git a/drivers/md/dm-era-target.c b/drivers/md/dm-era-target.c index 665bf32..2faf49d8 100644 --- a/drivers/md/dm-era-target.c +++ b/drivers/md/dm-era-target.c @@ -1540,9 +1540,9 @@ static int era_map(struct dm_target *ti, struct bio *bio) remap_to_origin(era, bio); /* - * REQ_FLUSH bios carry no data, so we're not interested in them. + * REQ_PREFLUSH bios carry no data, so we're not interested in them. */ - if (!(bio->bi_rw & REQ_FLUSH) && + if (!(bio->bi_rw & REQ_PREFLUSH) && (bio_data_dir(bio) == WRITE) && !metadata_current_marked(era->md, block)) { defer_bio(era, bio); diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c index 0f723ca..f96ba41 100644 --- a/drivers/md/dm-io.c +++ b/drivers/md/dm-io.c @@ -381,7 +381,7 @@ static void dispatch_io(int op, int op_flags, unsigned int num_regions, */ for (i = 0; i < num_regions; i++) { *dp = old_pages; - if (where[i].count || (op_flags & REQ_FLUSH)) + if (where[i].count || (op_flags & REQ_PREFLUSH)) do_region(op, op_flags, i, where + i, dp, io); } diff --git a/drivers/md/dm-log-writes.c b/drivers/md/dm-log-writes.c index e991405..73793bd 100644 --- a/drivers/md/dm-log-writes.c +++ b/drivers/md/dm-log-writes.c @@ -555,7 +555,7 @@ static int log_writes_map(struct dm_target *ti, struct bio *bio) struct bio_vec bv; size_t alloc_size; int i = 0; - bool flush_bio = (bio->bi_rw & REQ_FLUSH); + bool flush_bio = (bio->bi_rw & REQ_PREFLUSH); bool fua_bio = (bio->bi_rw & REQ_FUA); bool discard_bio = (bio->bi_op == REQ_OP_DISCARD); diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c index c4d23da..bd1ba80 100644 --- a/drivers/md/dm-raid1.c +++ b/drivers/md/dm-raid1.c @@ -704,7 +704,7 @@ static void do_writes(struct mirror_set *ms, struct bio_list *writes) bio_list_init(&requeue); while ((bio = bio_list_pop(writes))) { - if ((bio->bi_rw & REQ_FLUSH) || + if ((bio->bi_rw & REQ_PREFLUSH) || (bio->bi_op == REQ_OP_DISCARD)) { bio_list_add(&sync, bio); continue; @@ -1253,7 +1253,8 @@ static int mirror_end_io(struct dm_target *ti, struct bio *bio, int error) * We need to dec pending if this was a write. */ if (rw == WRITE) { - if (!(bio->bi_rw & REQ_FLUSH) && bio->bi_op != REQ_OP_DISCARD) + if (!(bio->bi_rw & REQ_PREFLUSH) && + bio->bi_op != REQ_OP_DISCARD) dm_rh_dec(ms->rh, bio_record->write_region); return error; } diff --git a/drivers/md/dm-region-hash.c b/drivers/md/dm-region-hash.c index ce4af57..d257428 100644 --- a/drivers/md/dm-region-hash.c +++ b/drivers/md/dm-region-hash.c @@ -398,7 +398,7 @@ void dm_rh_mark_nosync(struct dm_region_hash *rh, struct bio *bio) region_t region = dm_rh_bio_to_region(rh, bio); int recovering = 0; - if (bio->bi_rw & REQ_FLUSH) { + if (bio->bi_rw & REQ_PREFLUSH) { rh->flush_failure = 1; return; } @@ -526,7 +526,7 @@ void dm_rh_inc_pending(struct dm_region_hash *rh, struct bio_list *bios) struct bio *bio; for (bio = bios->head; bio; bio = bio->bi_next) { - if (bio->bi_rw & REQ_FLUSH || bio->bi_op == REQ_OP_DISCARD) + if (bio->bi_rw & REQ_PREFLUSH || bio->bi_op == REQ_OP_DISCARD) continue; rh_inc(rh, dm_rh_bio_to_region(rh, bio)); } diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c index 70bb0e8..69ab1ff 100644 --- a/drivers/md/dm-snap.c +++ b/drivers/md/dm-snap.c @@ -1680,7 +1680,7 @@ static int snapshot_map(struct dm_target *ti, struct bio *bio) init_tracked_chunk(bio); - if (bio->bi_rw & REQ_FLUSH) { + if (bio->bi_rw & REQ_PREFLUSH) { bio->bi_bdev = s->cow->bdev; return DM_MAPIO_REMAPPED; } @@ -1799,7 +1799,7 @@ static int snapshot_merge_map(struct dm_target *ti, struct bio *bio) init_tracked_chunk(bio); - if (bio->bi_rw & REQ_FLUSH) { + if (bio->bi_rw & REQ_PREFLUSH) { if (!dm_bio_get_target_bio_nr(bio)) bio->bi_bdev = s->origin->bdev; else @@ -2285,7 +2285,7 @@ static int origin_map(struct dm_target *ti, struct bio *bio) bio->bi_bdev = o->dev->bdev; - if (unlikely(bio->bi_rw & REQ_FLUSH)) + if (unlikely(bio->bi_rw & REQ_PREFLUSH)) return DM_MAPIO_REMAPPED; if (bio_rw(bio) != WRITE) diff --git a/drivers/md/dm-stripe.c b/drivers/md/dm-stripe.c index 12b1630..e6f330c 100644 --- a/drivers/md/dm-stripe.c +++ b/drivers/md/dm-stripe.c @@ -286,7 +286,7 @@ static int stripe_map(struct dm_target *ti, struct bio *bio) uint32_t stripe; unsigned target_bio_nr; - if (bio->bi_rw & REQ_FLUSH) { + if (bio->bi_rw & REQ_PREFLUSH) { target_bio_nr = dm_bio_get_target_bio_nr(bio); BUG_ON(target_bio_nr >= sc->stripes); bio->bi_bdev = sc->stripe[target_bio_nr].dev->bdev; diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index 85688b7..a75815d 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c @@ -707,7 +707,7 @@ static void remap_to_origin(struct thin_c *tc, struct bio *bio) static int bio_triggers_commit(struct thin_c *tc, struct bio *bio) { - return (bio->bi_rw & (REQ_FLUSH | REQ_FUA)) && + return (bio->bi_rw & (REQ_PREFLUSH | REQ_FUA)) && dm_thin_changed_this_transaction(tc->td); } @@ -878,7 +878,7 @@ static void __inc_remap_and_issue_cell(void *context, struct bio *bio; while ((bio = bio_list_pop(&cell->bios))) { - if (bio->bi_rw & (REQ_FLUSH | REQ_FUA) || + if (bio->bi_rw & (REQ_PREFLUSH | REQ_FUA) || bio->bi_op == REQ_OP_DISCARD) bio_list_add(&info->defer_bios, bio); else { @@ -1657,7 +1657,7 @@ static void __remap_and_issue_shared_cell(void *context, while ((bio = bio_list_pop(&cell->bios))) { if ((bio_data_dir(bio) == WRITE) || - (bio->bi_rw & (REQ_FLUSH | REQ_FUA) || + (bio->bi_rw & (REQ_PREFLUSH | REQ_FUA) || bio->bi_op == REQ_OP_DISCARD)) bio_list_add(&info->defer_bios, bio); else { @@ -2572,7 +2572,7 @@ static int thin_bio_map(struct dm_target *ti, struct bio *bio) return DM_MAPIO_SUBMITTED; } - if (bio->bi_rw & (REQ_FLUSH | REQ_FUA) || + if (bio->bi_rw & (REQ_PREFLUSH | REQ_FUA) || bio->bi_op == REQ_OP_DISCARD) { thin_defer_bio_with_throttle(tc, bio); return DM_MAPIO_SUBMITTED; diff --git a/drivers/md/dm.c b/drivers/md/dm.c index bd852bc..f8ec80f 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -1003,12 +1003,12 @@ static void dec_pending(struct dm_io *io, int error) if (io_error == DM_ENDIO_REQUEUE) return; - if ((bio->bi_rw & REQ_FLUSH) && bio->bi_iter.bi_size) { + if ((bio->bi_rw & REQ_PREFLUSH) && bio->bi_iter.bi_size) { /* * Preflush done for flush with data, reissue - * without REQ_FLUSH. + * without REQ_PREFLUSH. */ - bio->bi_rw &= ~REQ_FLUSH; + bio->bi_rw &= ~REQ_PREFLUSH; queue_io(md, bio); } else { /* done with normal IO or empty flush */ @@ -1477,7 +1477,7 @@ EXPORT_SYMBOL_GPL(dm_set_target_max_io_len); /* * A target may call dm_accept_partial_bio only from the map routine. It is - * allowed for all bio types except REQ_FLUSH. + * allowed for all bio types except REQ_PREFLUSH. * * dm_accept_partial_bio informs the dm that the target only wants to process * additional n_sectors sectors of the bio and the rest of the data should be @@ -1507,7 +1507,7 @@ void dm_accept_partial_bio(struct bio *bio, unsigned n_sectors) { struct dm_target_io *tio = container_of(bio, struct dm_target_io, clone); unsigned bi_size = bio->bi_iter.bi_size >> SECTOR_SHIFT; - BUG_ON(bio->bi_rw & REQ_FLUSH); + BUG_ON(bio->bi_rw & REQ_PREFLUSH); BUG_ON(bi_size > *tio->len_ptr); BUG_ON(n_sectors > bi_size); *tio->len_ptr -= bi_size - n_sectors; @@ -1795,7 +1795,7 @@ static void __split_and_process_bio(struct mapped_device *md, start_io_acct(ci.io); - if (bio->bi_rw & REQ_FLUSH) { + if (bio->bi_rw & REQ_PREFLUSH) { ci.bio = &ci.md->flush_bio; ci.sector_count = 0; error = __send_empty_flush(&ci); diff --git a/drivers/md/linear.c b/drivers/md/linear.c index aad82c7..657053e 100644 --- a/drivers/md/linear.c +++ b/drivers/md/linear.c @@ -221,7 +221,7 @@ static void linear_make_request(struct mddev *mddev, struct bio *bio) struct bio *split; sector_t start_sector, end_sector, data_offset; - if (unlikely(bio->bi_rw & REQ_FLUSH)) { + if (unlikely(bio->bi_rw & REQ_PREFLUSH)) { md_flush_request(mddev, bio); return; } diff --git a/drivers/md/md.c b/drivers/md/md.c index 9c40368..3bfdc79 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -413,7 +413,7 @@ static void md_submit_flush_data(struct work_struct *ws) /* an empty barrier - all done */ bio_endio(bio); else { - bio->bi_rw &= ~REQ_FLUSH; + bio->bi_rw &= ~REQ_PREFLUSH; mddev->pers->make_request(mddev, bio); } diff --git a/drivers/md/md.h b/drivers/md/md.h index 2e0918f..b4f3352 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -424,7 +424,7 @@ struct mddev { /* Generic flush handling. * The last to finish preflush schedules a worker to submit - * the rest of the request (without the REQ_FLUSH flag). + * the rest of the request (without the REQ_PREFLUSH flag). */ struct bio *flush_bio; atomic_t flush_pending; diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c index dd483bb..72ea98e 100644 --- a/drivers/md/multipath.c +++ b/drivers/md/multipath.c @@ -111,7 +111,7 @@ static void multipath_make_request(struct mddev *mddev, struct bio * bio) struct multipath_bh * mp_bh; struct multipath_info *multipath; - if (unlikely(bio->bi_rw & REQ_FLUSH)) { + if (unlikely(bio->bi_rw & REQ_PREFLUSH)) { md_flush_request(mddev, bio); return; } diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index e0d1b8c..f95463d 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c @@ -458,7 +458,7 @@ static void raid0_make_request(struct mddev *mddev, struct bio *bio) struct md_rdev *tmp_dev; struct bio *split; - if (unlikely(bio->bi_rw & REQ_FLUSH)) { + if (unlikely(bio->bi_rw & REQ_PREFLUSH)) { md_flush_request(mddev, bio); return; } diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index c7abd2d..2a2c177 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -1056,7 +1056,8 @@ static void raid1_make_request(struct mddev *mddev, struct bio * bio) const int op = bio->bi_op; const int rw = bio_data_dir(bio); const unsigned long do_sync = (bio->bi_rw & REQ_SYNC); - const unsigned long do_flush_fua = (bio->bi_rw & (REQ_FLUSH | REQ_FUA)); + const unsigned long do_flush_fua = (bio->bi_rw & + (REQ_PREFLUSH | REQ_FUA)); const unsigned long do_sec = (bio->bi_rw & REQ_SECURE); struct md_rdev *blocked_rdev; struct blk_plug_cb *cb; diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 63cd985..c5dc4e4 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -1452,7 +1452,7 @@ static void raid10_make_request(struct mddev *mddev, struct bio *bio) struct bio *split; - if (unlikely(bio->bi_rw & REQ_FLUSH)) { + if (unlikely(bio->bi_rw & REQ_PREFLUSH)) { md_flush_request(mddev, bio); return; } diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c index 3d88b55..72f787a 100644 --- a/drivers/md/raid5-cache.c +++ b/drivers/md/raid5-cache.c @@ -536,7 +536,7 @@ int r5l_handle_flush_request(struct r5l_log *log, struct bio *bio) bio_endio(bio); return 0; } - bio->bi_rw &= ~REQ_FLUSH; + bio->bi_rw &= ~REQ_PREFLUSH; return -EAGAIN; } diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 7fb693f..ff7cb4e 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -5159,7 +5159,7 @@ static void raid5_make_request(struct mddev *mddev, struct bio * bi) DEFINE_WAIT(w); bool do_prepare; - if (unlikely(bi->bi_rw & REQ_FLUSH)) { + if (unlikely(bi->bi_rw & REQ_PREFLUSH)) { int ret = r5l_handle_flush_request(conf->log, bi); if (ret == 0) diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index 921a858..c1915f8 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c @@ -2207,7 +2207,7 @@ static void btrfsic_bio_end_io(struct bio *bp) block->dev_bytenr, block->mirror_num); next_block = block->next_in_same_bio; block->iodone_w_error = iodone_w_error; - if (block->submit_bio_bh_rw & REQ_FLUSH) { + if (block->submit_bio_bh_rw & REQ_PREFLUSH) { dev_state->last_flush_gen++; if ((dev_state->state->print_mask & BTRFSIC_PRINT_MASK_END_IO_BIO_BH)) @@ -2243,7 +2243,7 @@ static void btrfsic_bh_end_io(struct buffer_head *bh, int uptodate) block->dev_bytenr, block->mirror_num); block->iodone_w_error = iodone_w_error; - if (block->submit_bio_bh_rw & REQ_FLUSH) { + if (block->submit_bio_bh_rw & REQ_PREFLUSH) { dev_state->last_flush_gen++; if ((dev_state->state->print_mask & BTRFSIC_PRINT_MASK_END_IO_BIO_BH)) @@ -2884,7 +2884,7 @@ int btrfsic_submit_bh(int op, int op_flags, struct buffer_head *bh) btrfsic_process_written_block(dev_state, dev_bytenr, &bh->b_data, 1, NULL, NULL, bh, op_flags); - } else if (NULL != dev_state && (op_flags & REQ_FLUSH)) { + } else if (NULL != dev_state && (op_flags & REQ_PREFLUSH)) { if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) printk(KERN_INFO @@ -2982,7 +2982,7 @@ static void __btrfsic_submit_bio(struct bio *bio) kunmap(bio->bi_io_vec[i].bv_page); } kfree(mapped_datav); - } else if (NULL != dev_state && (bio->bi_rw & REQ_FLUSH)) { + } else if (NULL != dev_state && (bio->bi_rw & REQ_PREFLUSH)) { if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) printk(KERN_INFO diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index 3675b8e..b5d568d 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c @@ -1353,7 +1353,7 @@ static int jbd2_write_superblock(journal_t *journal, int write_flags) trace_jbd2_write_superblock(journal, write_flags); if (!(journal->j_flags & JBD2_BARRIER)) - write_flags &= ~(REQ_FUA | REQ_FLUSH); + write_flags &= ~(REQ_FUA | REQ_PREFLUSH); lock_buffer(bh); if (buffer_write_io_error(bh)) { /* diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 917774e..0caffba 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1242,7 +1242,7 @@ _xfs_buf_ioapply( if (bp->b_flags & XBF_FUA) op_flags |= REQ_FUA; if (bp->b_flags & XBF_FLUSH) - op_flags |= REQ_FLUSH; + op_flags |= REQ_PREFLUSH; /* * Run the write verifier callback function if it exists. If diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index f9e53ca..2b6583a 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -158,7 +158,7 @@ enum rq_flag_bits { __REQ_NOIDLE, /* don't anticipate more IO after this one */ __REQ_INTEGRITY, /* I/O includes block integrity payload */ __REQ_FUA, /* forced unit access */ - __REQ_FLUSH, /* request for cache flush */ + __REQ_PREFLUSH, /* request for cache flush */ /* bio only flags */ __REQ_RAHEAD, /* read ahead, can fail anytime */ @@ -202,12 +202,12 @@ enum rq_flag_bits { (REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT | REQ_FAILFAST_DRIVER) #define REQ_COMMON_MASK \ (REQ_FAILFAST_MASK | REQ_SYNC | REQ_META | REQ_PRIO | REQ_NOIDLE | \ - REQ_FLUSH | REQ_FUA | REQ_SECURE | REQ_INTEGRITY) + REQ_PREFLUSH | REQ_FUA | REQ_SECURE | REQ_INTEGRITY) #define REQ_CLONE_MASK REQ_COMMON_MASK /* This mask is used for both bio and request merge checking */ #define REQ_NOMERGE_FLAGS \ - (REQ_NOMERGE | REQ_STARTED | REQ_SOFTBARRIER | REQ_FLUSH | REQ_FUA | REQ_FLUSH_SEQ) + (REQ_NOMERGE | REQ_STARTED | REQ_SOFTBARRIER | REQ_PREFLUSH | REQ_FUA | REQ_FLUSH_SEQ) #define REQ_RAHEAD (1ULL << __REQ_RAHEAD) #define REQ_THROTTLED (1ULL << __REQ_THROTTLED) @@ -225,7 +225,7 @@ enum rq_flag_bits { #define REQ_PREEMPT (1ULL << __REQ_PREEMPT) #define REQ_ALLOCED (1ULL << __REQ_ALLOCED) #define REQ_COPY_USER (1ULL << __REQ_COPY_USER) -#define REQ_FLUSH (1ULL << __REQ_FLUSH) +#define REQ_PREFLUSH (1ULL << __REQ_PREFLUSH) #define REQ_FLUSH_SEQ (1ULL << __REQ_FLUSH_SEQ) #define REQ_IO_STAT (1ULL << __REQ_IO_STAT) #define REQ_MIXED_MERGE (1ULL << __REQ_MIXED_MERGE) diff --git a/include/linux/fs.h b/include/linux/fs.h index 509e21f..e9ed622 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -205,9 +205,9 @@ typedef void (dax_iodone_t)(struct buffer_head *bh_map, int uptodate); #define READ_SYNC REQ_SYNC #define WRITE_SYNC (REQ_SYNC | REQ_NOIDLE) #define WRITE_ODIRECT REQ_SYNC -#define WRITE_FLUSH (REQ_SYNC | REQ_NOIDLE | REQ_FLUSH) +#define WRITE_FLUSH (REQ_SYNC | REQ_NOIDLE | REQ_PREFLUSH) #define WRITE_FUA (REQ_SYNC | REQ_NOIDLE | REQ_FUA) -#define WRITE_FLUSH_FUA (REQ_SYNC | REQ_NOIDLE | REQ_FLUSH | REQ_FUA) +#define WRITE_FLUSH_FUA (REQ_SYNC | REQ_NOIDLE | REQ_PREFLUSH | REQ_FUA) /* * Attribute flags. These should be or-ed together to figure out what diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h index 20f708e..1e5ab0c 100644 --- a/include/trace/events/f2fs.h +++ b/include/trace/events/f2fs.h @@ -33,7 +33,7 @@ TRACE_DEFINE_ENUM(SSR); TRACE_DEFINE_ENUM(__REQ_RAHEAD); TRACE_DEFINE_ENUM(__REQ_SYNC); TRACE_DEFINE_ENUM(__REQ_NOIDLE); -TRACE_DEFINE_ENUM(__REQ_FLUSH); +TRACE_DEFINE_ENUM(__REQ_PREFLUSH); TRACE_DEFINE_ENUM(__REQ_FUA); TRACE_DEFINE_ENUM(__REQ_PRIO); TRACE_DEFINE_ENUM(__REQ_META); diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index 192d714..bcdd3d3 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c @@ -189,6 +189,7 @@ static const u32 ddir_act[2] = { BLK_TC_ACT(BLK_TC_READ), BLK_TC_ACT(BLK_TC_WRITE) }; #define BLK_TC_RAHEAD BLK_TC_AHEAD +#define BLK_TC_PREFLUSH BLK_TC_FLUSH /* The ilog2() calls fall out because they're constant */ #define MASK_TC_BIT(rw, __name) ((rw & REQ_ ## __name) << \ @@ -219,7 +220,7 @@ static void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes, what |= MASK_TC_BIT(op_flags, SYNC); what |= MASK_TC_BIT(op_flags, RAHEAD); what |= MASK_TC_BIT(op_flags, META); - what |= MASK_TC_BIT(op_flags, FLUSH); + what |= MASK_TC_BIT(op_flags, PREFLUSH); what |= MASK_TC_BIT(op_flags, FUA); if (op == REQ_OP_DISCARD) what |= BLK_TC_ACT(BLK_TC_DISCARD); @@ -1777,7 +1778,7 @@ void blk_fill_rwbs(char *rwbs, int op, u32 rw, int bytes) { int i = 0; - if (rw & REQ_FLUSH || + if (rw & REQ_PREFLUSH || op == REQ_OP_FLUSH) rwbs[i++] = 'F'; -- 2.7.2 From bfoster@redhat.com Wed Apr 13 15:41:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 93AFD7CC5 for ; Wed, 13 Apr 2016 15:41:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id EB31BAC005 for ; Wed, 13 Apr 2016 13:41:22 -0700 (PDT) X-ASG-Debug-ID: 1460580080-04cb6c24644bd280001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id KJBWAuIJKpeDv19w (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 13:41:21 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 29C628110B; Wed, 13 Apr 2016 20:41:20 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-153.bos.redhat.com [10.18.41.153]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3DKfJxY029350; Wed, 13 Apr 2016 16:41:19 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 19285125438; Wed, 13 Apr 2016 16:41:18 -0400 (EDT) Date: Wed, 13 Apr 2016 16:41:18 -0400 From: Brian Foster To: "Darrick J. Wong" Cc: xfs@oss.sgi.com, linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, dm-devel@redhat.com, Joe Thornber , snitzer@redhat.com Subject: Re: [RFC v2 PATCH 05/10] dm thin: add methods to set and get reserved space Message-ID: <20160413204117.GA6870@bfoster.bfoster> X-ASG-Orig-Subj: Re: [RFC v2 PATCH 05/10] dm thin: add methods to set and get reserved space References: <1460479373-63317-1-git-send-email-bfoster@redhat.com> <1460479373-63317-6-git-send-email-bfoster@redhat.com> <20160413174442.GD18517@birch.djwong.org> <20160413183352.GB2775@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160413183352.GB2775@bfoster.bfoster> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460580081 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Apr 13, 2016 at 02:33:52PM -0400, Brian Foster wrote: > On Wed, Apr 13, 2016 at 10:44:42AM -0700, Darrick J. Wong wrote: > > On Tue, Apr 12, 2016 at 12:42:48PM -0400, Brian Foster wrote: > > > From: Joe Thornber > > > > > > Experimental reserve interface for XFS guys to play with. > > > > > > I have big reservations (no pun intended) about this patch. > > > > > > [BF: > > > - Support for reservation reduction. > > > - Support for space provisioning. > > > - Condensed to a single function.] > > > > > > Not-Signed-off-by: Joe Thornber > > > Not-Signed-off-by: Mike Snitzer > > > --- > > > drivers/md/dm-thin.c | 181 ++++++++++++++++++++++++++++++++++++++++++++++++--- > > > 1 file changed, 171 insertions(+), 10 deletions(-) > > > > > > diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c > > > index 92237b6..32bc5bd 100644 > > > --- a/drivers/md/dm-thin.c > > > +++ b/drivers/md/dm-thin.c > ... > > > @@ -4271,6 +4343,94 @@ static void thin_io_hints(struct dm_target *ti, struct queue_limits *limits) > > > limits->max_discard_sectors = 2048 * 1024 * 16; /* 16G */ > > > } > > > > > > +static int thin_provision_space(struct dm_target *ti, sector_t offset, > > > + sector_t len, sector_t *res) > > > +{ > > > + struct thin_c *tc = ti->private; > > > + struct pool *pool = tc->pool; > > > + sector_t end; > > > + dm_block_t pblock; > > > + dm_block_t vblock; > > > + int error; > > > + struct dm_thin_lookup_result lookup; > > > + > > > + if (!is_factor(offset, pool->sectors_per_block)) > > > + return -EINVAL; > > > + > > > + if (!len || !is_factor(len, pool->sectors_per_block)) > > > + return -EINVAL; > > > + > > > + if (res && !is_factor(*res, pool->sectors_per_block)) > > > + return -EINVAL; > > > + > > > + end = offset + len; > > > + > > > + while (offset < end) { > > > + vblock = offset; > > > + do_div(vblock, pool->sectors_per_block); > > > + > > > + error = dm_thin_find_block(tc->td, vblock, true, &lookup); > > > + if (error == 0) > > > + goto next; > > > + if (error != -ENODATA) > > > + return error; > > > + > > > + error = alloc_data_block(tc, &pblock); > > > > So this means that if fallocate wants to BDEV_RES_PROVISION N blocks, it must > > first increase the reservation (BDEV_RES_MOD) by N blocks to avoid using up > > space that was previously reserved by some other caller. I think? > > > > Yes, assuming this is being called from a filesystem using the > reservation mechanism. > > > > + if (error) > > > + return error; > > > + > > > + error = dm_thin_insert_block(tc->td, vblock, pblock); > > > > Having reserved and mapped blocks, what happens when we try to read them? > > Do we actually get zeroes, or does the read go straight through to whatever > > happens to be in the disk blocks? I don't think it's correct that we could > > BDEV_RES_PROVISION and end up with stale credit card numbers from some other > > thin device. > > > > Agree, but I'm not really sure how this works in thinp tbh. fallocate > wasn't really on my mind when doing this. I was simply trying to cobble > together what I could to facilitate making progress on the fs parts > (e.g., I just needed a call that allocated blocks and consumed > reservation in the process). > > Skimming through the dm-thin code, it looks like a (configurable) block > zeroing mechanism can be triggered from somewhere around > provision_block()->schedule_zero(), depending on whether the incoming > write overwrites the newly allocated block. If that's the case, then I > suspect that means reads would just fall through to the block and return > whatever was on disk. This code would probably need to tie into that > zeroing mechanism one way or another to deal with that issue. (Though > somebody who actually knows something about dm-thin should verify that. > :) > BTW, if that mechanism is in fact doing I/O, that might not be the appropriate solution for fallocate. Perhaps we'd have to consider an unwritten flag or some such in dm-thin, if possible. Brian > Brian > > > (PS: I don't know enough about thinp to know if this has already been taken > > care of. I didn't see anything, but who knows what I missed. :)) > > > > --D > > > > > + if (error) > > > + return error; > > > + > > > + if (res && *res) > > > + *res -= pool->sectors_per_block; > > > +next: > > > + offset += pool->sectors_per_block; > > > + } > > > + > > > + return 0; > > > +} > > > + > > > +static int thin_reserve_space(struct dm_target *ti, int mode, sector_t offset, > > > + sector_t len, sector_t *res) > > > +{ > > > + struct thin_c *tc = ti->private; > > > + struct pool *pool = tc->pool; > > > + sector_t blocks; > > > + unsigned long flags; > > > + int error; > > > + > > > + if (mode == BDEV_RES_PROVISION) > > > + return thin_provision_space(ti, offset, len, res); > > > + > > > + /* res required for get/set */ > > > + error = -EINVAL; > > > + if (!res) > > > + return error; > > > + > > > + if (mode == BDEV_RES_GET) { > > > + spin_lock_irqsave(&tc->pool->lock, flags); > > > + *res = tc->reserve_count * pool->sectors_per_block; > > > + spin_unlock_irqrestore(&tc->pool->lock, flags); > > > + error = 0; > > > + } else if (mode == BDEV_RES_MOD) { > > > + /* > > > + * @res must always be a factor of the pool's blocksize; upper > > > + * layers can rely on the bdev's minimum_io_size for this. > > > + */ > > > + if (!is_factor(*res, pool->sectors_per_block)) > > > + return error; > > > + > > > + blocks = *res; > > > + (void) sector_div(blocks, pool->sectors_per_block); > > > + > > > + error = set_reserve_count(tc, blocks); > > > + } > > > + > > > + return error; > > > +} > > > + > > > static struct target_type thin_target = { > > > .name = "thin", > > > .version = {1, 18, 0}, > > > @@ -4285,6 +4445,7 @@ static struct target_type thin_target = { > > > .status = thin_status, > > > .iterate_devices = thin_iterate_devices, > > > .io_hints = thin_io_hints, > > > + .reserve_space = thin_reserve_space, > > > }; > > > > > > /*----------------------------------------------------------------*/ > > > -- > > > 2.4.11 > > > > > > _______________________________________________ > > > xfs mailing list > > > xfs@oss.sgi.com > > > http://oss.sgi.com/mailman/listinfo/xfs > > -- > > To unsubscribe from this list: send the line "unsubscribe linux-block" in > > the body of a message to majordomo@vger.kernel.org > > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- > To unsubscribe from this list: send the line "unsubscribe linux-block" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From darrick.wong@oracle.com Wed Apr 13 16:01:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2B8257CA0 for ; Wed, 13 Apr 2016 16:01:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 85F28AC003 for ; Wed, 13 Apr 2016 14:01:52 -0700 (PDT) X-ASG-Debug-ID: 1460581309-04cbb02e1b1aaed0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id n3za7nCdZWOhM1Ba (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 14:01:49 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u3DL1m78026388 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 13 Apr 2016 21:01:48 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u3DL1luo001473 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 13 Apr 2016 21:01:47 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u3DL1iVX019741; Wed, 13 Apr 2016 21:01:46 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 13 Apr 2016 14:01:44 -0700 Date: Wed, 13 Apr 2016 14:01:43 -0700 From: "Darrick J. Wong" To: Brian Foster Cc: xfs@oss.sgi.com, linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, dm-devel@redhat.com, Joe Thornber , snitzer@redhat.com Subject: Re: [RFC v2 PATCH 05/10] dm thin: add methods to set and get reserved space Message-ID: <20160413210143.GA17592@birch.djwong.org> X-ASG-Orig-Subj: Re: [RFC v2 PATCH 05/10] dm thin: add methods to set and get reserved space References: <1460479373-63317-1-git-send-email-bfoster@redhat.com> <1460479373-63317-6-git-send-email-bfoster@redhat.com> <20160413174442.GD18517@birch.djwong.org> <20160413183352.GB2775@bfoster.bfoster> <20160413204117.GA6870@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160413204117.GA6870@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1460581309 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28710 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Wed, Apr 13, 2016 at 04:41:18PM -0400, Brian Foster wrote: > On Wed, Apr 13, 2016 at 02:33:52PM -0400, Brian Foster wrote: > > On Wed, Apr 13, 2016 at 10:44:42AM -0700, Darrick J. Wong wrote: > > > On Tue, Apr 12, 2016 at 12:42:48PM -0400, Brian Foster wrote: > > > > From: Joe Thornber > > > > > > > > Experimental reserve interface for XFS guys to play with. > > > > > > > > I have big reservations (no pun intended) about this patch. > > > > > > > > [BF: > > > > - Support for reservation reduction. > > > > - Support for space provisioning. > > > > - Condensed to a single function.] > > > > > > > > Not-Signed-off-by: Joe Thornber > > > > Not-Signed-off-by: Mike Snitzer > > > > --- > > > > drivers/md/dm-thin.c | 181 ++++++++++++++++++++++++++++++++++++++++++++++++--- > > > > 1 file changed, 171 insertions(+), 10 deletions(-) > > > > > > > > diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c > > > > index 92237b6..32bc5bd 100644 > > > > --- a/drivers/md/dm-thin.c > > > > +++ b/drivers/md/dm-thin.c > > ... > > > > @@ -4271,6 +4343,94 @@ static void thin_io_hints(struct dm_target *ti, struct queue_limits *limits) > > > > limits->max_discard_sectors = 2048 * 1024 * 16; /* 16G */ > > > > } > > > > > > > > +static int thin_provision_space(struct dm_target *ti, sector_t offset, > > > > + sector_t len, sector_t *res) > > > > +{ > > > > + struct thin_c *tc = ti->private; > > > > + struct pool *pool = tc->pool; > > > > + sector_t end; > > > > + dm_block_t pblock; > > > > + dm_block_t vblock; > > > > + int error; > > > > + struct dm_thin_lookup_result lookup; > > > > + > > > > + if (!is_factor(offset, pool->sectors_per_block)) > > > > + return -EINVAL; > > > > + > > > > + if (!len || !is_factor(len, pool->sectors_per_block)) > > > > + return -EINVAL; > > > > + > > > > + if (res && !is_factor(*res, pool->sectors_per_block)) > > > > + return -EINVAL; > > > > + > > > > + end = offset + len; > > > > + > > > > + while (offset < end) { > > > > + vblock = offset; > > > > + do_div(vblock, pool->sectors_per_block); > > > > + > > > > + error = dm_thin_find_block(tc->td, vblock, true, &lookup); > > > > + if (error == 0) > > > > + goto next; > > > > + if (error != -ENODATA) > > > > + return error; > > > > + > > > > + error = alloc_data_block(tc, &pblock); > > > > > > So this means that if fallocate wants to BDEV_RES_PROVISION N blocks, it must > > > first increase the reservation (BDEV_RES_MOD) by N blocks to avoid using up > > > space that was previously reserved by some other caller. I think? > > > > > > > Yes, assuming this is being called from a filesystem using the > > reservation mechanism. > > > > > > + if (error) > > > > + return error; > > > > + > > > > + error = dm_thin_insert_block(tc->td, vblock, pblock); > > > > > > Having reserved and mapped blocks, what happens when we try to read them? > > > Do we actually get zeroes, or does the read go straight through to whatever > > > happens to be in the disk blocks? I don't think it's correct that we could > > > BDEV_RES_PROVISION and end up with stale credit card numbers from some other > > > thin device. > > > > > > > Agree, but I'm not really sure how this works in thinp tbh. fallocate > > wasn't really on my mind when doing this. I was simply trying to cobble > > together what I could to facilitate making progress on the fs parts > > (e.g., I just needed a call that allocated blocks and consumed > > reservation in the process). > > > > Skimming through the dm-thin code, it looks like a (configurable) block > > zeroing mechanism can be triggered from somewhere around > > provision_block()->schedule_zero(), depending on whether the incoming > > write overwrites the newly allocated block. If that's the case, then I > > suspect that means reads would just fall through to the block and return > > whatever was on disk. This code would probably need to tie into that > > zeroing mechanism one way or another to deal with that issue. (Though > > somebody who actually knows something about dm-thin should verify that. > > :) > > > > BTW, if that mechanism is in fact doing I/O, that might not be the > appropriate solution for fallocate. Perhaps we'd have to consider an > unwritten flag or some such in dm-thin, if possible. The hard part is that we don't know if the caller actually has a way to prevent userspace from seeing the stale contents (filesystems) or if we'd be leaking data straight to userspace (user program calling fallocate). (And yeah, here we go with NO_HIDE_STALE again...) --D > > Brian > > > Brian > > > > > (PS: I don't know enough about thinp to know if this has already been taken > > > care of. I didn't see anything, but who knows what I missed. :)) > > > > > > --D > > > > > > > + if (error) > > > > + return error; > > > > + > > > > + if (res && *res) > > > > + *res -= pool->sectors_per_block; > > > > +next: > > > > + offset += pool->sectors_per_block; > > > > + } > > > > + > > > > + return 0; > > > > +} > > > > + > > > > +static int thin_reserve_space(struct dm_target *ti, int mode, sector_t offset, > > > > + sector_t len, sector_t *res) > > > > +{ > > > > + struct thin_c *tc = ti->private; > > > > + struct pool *pool = tc->pool; > > > > + sector_t blocks; > > > > + unsigned long flags; > > > > + int error; > > > > + > > > > + if (mode == BDEV_RES_PROVISION) > > > > + return thin_provision_space(ti, offset, len, res); > > > > + > > > > + /* res required for get/set */ > > > > + error = -EINVAL; > > > > + if (!res) > > > > + return error; > > > > + > > > > + if (mode == BDEV_RES_GET) { > > > > + spin_lock_irqsave(&tc->pool->lock, flags); > > > > + *res = tc->reserve_count * pool->sectors_per_block; > > > > + spin_unlock_irqrestore(&tc->pool->lock, flags); > > > > + error = 0; > > > > + } else if (mode == BDEV_RES_MOD) { > > > > + /* > > > > + * @res must always be a factor of the pool's blocksize; upper > > > > + * layers can rely on the bdev's minimum_io_size for this. > > > > + */ > > > > + if (!is_factor(*res, pool->sectors_per_block)) > > > > + return error; > > > > + > > > > + blocks = *res; > > > > + (void) sector_div(blocks, pool->sectors_per_block); > > > > + > > > > + error = set_reserve_count(tc, blocks); > > > > + } > > > > + > > > > + return error; > > > > +} > > > > + > > > > static struct target_type thin_target = { > > > > .name = "thin", > > > > .version = {1, 18, 0}, > > > > @@ -4285,6 +4445,7 @@ static struct target_type thin_target = { > > > > .status = thin_status, > > > > .iterate_devices = thin_iterate_devices, > > > > .io_hints = thin_io_hints, > > > > + .reserve_space = thin_reserve_space, > > > > }; > > > > > > > > /*----------------------------------------------------------------*/ > > > > -- > > > > 2.4.11 > > > > > > > > _______________________________________________ > > > > xfs mailing list > > > > xfs@oss.sgi.com > > > > http://oss.sgi.com/mailman/listinfo/xfs > > > -- > > > To unsubscribe from this list: send the line "unsubscribe linux-block" in > > > the body of a message to majordomo@vger.kernel.org > > > More majordomo info at http://vger.kernel.org/majordomo-info.html > > -- > > To unsubscribe from this list: send the line "unsubscribe linux-block" in > > the body of a message to majordomo@vger.kernel.org > > More majordomo info at http://vger.kernel.org/majordomo-info.html From david@fromorbit.com Wed Apr 13 16:20:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D15597CA0 for ; Wed, 13 Apr 2016 16:20:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3FDE1AC003 for ; Wed, 13 Apr 2016 14:20:48 -0700 (PDT) X-ASG-Debug-ID: 1460582444-04cb6c24644bee00001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id vB9uMwfuxGrHxasd for ; Wed, 13 Apr 2016 14:20:45 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DaDQCstg5XNaAZLHlegzeBUIJyg3mfTwEBAQEBAQaMEIVohA6GCAQCAoE9TQEBAQEBAQcBAQEBQQFAhEEBAQEDAScTHCMFCwgDDgoJJQ8FJQMHGhMZiAgHwx8BAQgCHhmFQIUTihUBBJgIjgOPGkWOYoRbKjCJegEBAQ Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail06.adl2.internode.on.net with ESMTP; 14 Apr 2016 06:50:43 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aqSDJ-0005oT-RG; Thu, 14 Apr 2016 07:20:41 +1000 Date: Thu, 14 Apr 2016 07:20:41 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com, viro@zeniv.linux.org.uk Subject: Re: [PATCH 01/11] xfs: we don't need no steekin ->evict_inode Message-ID: <20160413212041.GQ567@dastard> X-ASG-Orig-Subj: Re: [PATCH 01/11] xfs: we don't need no steekin ->evict_inode References: <1460525492-1170-1-git-send-email-david@fromorbit.com> <1460525492-1170-2-git-send-email-david@fromorbit.com> <20160413164110.GA8475@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160413164110.GA8475@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1460582444 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28711 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Apr 13, 2016 at 09:41:10AM -0700, Christoph Hellwig wrote: > Al has been very unhappy about our destroy_inode abuse, and I'd > reluctant to make it worse. I don't have any problems with it at all. The VFS doesn't care how we manage inode allocation or destruction, so I don't see any problem with what we do outside the visibility of the VFS inode life cycle. > Why do we need to play games with i_mode when freeing? Because the inode cache lookup XFS code uses i_mode == 0 to detect a freed inode. i.e. in xfs_iget_cache_miss/xfs_iget_cache_hit this is used to allow XFS_IGET_CREATE to return a freed inodes still in the cache during inode allocation. This is the only case where we are allowed to find a freed inode in the cache lookup, so we have to be able to detect it somehow. Similarly, I'm pretty sure there are assumptions all through the XFS code (both kernel and userspace) that i_mode = 0 means the inode is free/unallocated. xfs_repair, for example, makes this assumption, and so we have to zero the mode when freeing the inode... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 13 16:38:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B58517CA4 for ; Wed, 13 Apr 2016 16:38:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 87BFD8F8033 for ; Wed, 13 Apr 2016 14:38:06 -0700 (PDT) X-ASG-Debug-ID: 1460583479-04cbb02e1d1af5b0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 0HnMLAvR6j6r8VLJ for ; Wed, 13 Apr 2016 14:38:00 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DbDQBduw5XNaAZLHlegzeBUIJyg3mfTwEBAQEBAQaMEIVohA6GCAQCAoE9TQEBAQEBAQcBAQEBQQFAhEEBAQEDASMPASMjBQsIAxgCAgUhAgIPBSUDBxoTiCEHsFiSQwEBCAIeGWOEXYUThz+CVgWYCI4DjxqPJ4RbKjCJegEBAQ Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail06.adl2.internode.on.net with ESMTP; 14 Apr 2016 07:07:59 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aqSU2-0005t7-5N; Thu, 14 Apr 2016 07:37:58 +1000 Date: Thu, 14 Apr 2016 07:37:58 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH 17/19] xfsprogs: disable truncating of files Message-ID: <20160413213758.GR567@dastard> X-ASG-Orig-Subj: Re: [PATCH 17/19] xfsprogs: disable truncating of files References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-18-git-send-email-jtulak@redhat.com> <20160408000910.GB21804@dastard> <20160408230843.GE567@dastard> <570E7129.3080900@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <570E7129.3080900@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1460583479 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28711 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Apr 13, 2016 at 11:17:45AM -0500, Eric Sandeen wrote: > On 4/13/16 10:08 AM, Jan Tulak wrote: > > ... > > > All right​, I will keep the O_TRUNC there. However, should it > > truncate the file every time, or should we offer a way how to avoid > > the file truncating? Until now, mkfs behaved differently based on > > whether -d file was given, or not. Your explanation suggests that we > > should truncate every time, right? > > There are probably valid reasons to keep size as well as to truncate; > it's not immediately clear to me how we should handle it. That's easy: don't specify -dfile or -dsize, and instead let mkfs detect that it is file automatically. Because it's not given a size, or that it's supposed to be a file, it should not attempt to change the "device" in any way. When block devices grow fallocate support, we can unify the discard behaviour to be a hole punch, and then it will work identically on devices and files treated this way. > Honestly, at this point, in the interest of getting the other fixes in, > I think I might rather see the truncating behavior unchanged from what > we have today; we can tackle that as a separate problem at a later date. Yup, don't change it in this patch series. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 13 16:54:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 78B497CA4 for ; Wed, 13 Apr 2016 16:54:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D0A03AC004 for ; Wed, 13 Apr 2016 14:54:47 -0700 (PDT) X-ASG-Debug-ID: 1460584484-04cb6c24644c2e40001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id qT00MRysuyyfZRDE for ; Wed, 13 Apr 2016 14:54:44 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DWDQAfvw5XNaAZLHlegzeBUIJyg3mfTwEBAQEBAQaMEIl2hggEAgKBPU0BAQEBAQEHAQEBAUEBQIRCAQEEOhwjEAgDDgoJJQ8FJQMHGhOIKMMeAQseGYVAhROKFQWYCI4DjxqPJ4JmGYFcKjCJegEBAQ Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail06.adl2.internode.on.net with ESMTP; 14 Apr 2016 07:24:43 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aqSkE-0005uL-TI; Thu, 14 Apr 2016 07:54:42 +1000 Date: Thu, 14 Apr 2016 07:54:42 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com, rpeterso@redhat.com, linux-fsdevel@vger.kernel.org Subject: Re: iomap infrastructure and multipage writes V2 Message-ID: <20160413215442.GS567@dastard> X-ASG-Orig-Subj: Re: iomap infrastructure and multipage writes V2 References: <1460494382-14547-1-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460494382-14547-1-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1460584484 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28713 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Apr 12, 2016 at 01:52:54PM -0700, Christoph Hellwig wrote: > This series add a new file system I/O path that uses the iomap structure > introduced for the pNFS support and support multi-page buffered writes. > > This was first started by Dave Chinner a long time ago, then I did beat > it into shape for production runs in a very constrained ARM NAS > enviroment for Tuxera almost as long ago, and now half a dozen rewrites > later it's back. > > The basic idea is to avoid the crazy per-block get_blocks overhead > and make use of extents in the buffered write path by iterating over > them instead. > > Chances since V1: > - add support for fiemap > - fix a test fail on 1k block sizes > - prepare for 64-bit length, this will be used in a follow on patchset This appears to pass xfstests on all my test setups without any regressions. I haven't tested RT devices yet, but we can ignore that for now. I guess now it's time to look harder at the code. Christoph, have you done any perf testing of this patchset yet to check that it does indeed reduce the CPU overhead of large write operations? I'd also be interested to know if there is any change in overhead for single page (4k) IOs as well, even though I suspect there won't be. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 13 16:56:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C51AF7CA4 for ; Wed, 13 Apr 2016 16:56:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3590CAC003 for ; Wed, 13 Apr 2016 14:56:00 -0700 (PDT) X-ASG-Debug-ID: 1460584557-04cbb02e1c1b1250001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id Dl2V0mt6gAGZEahV for ; Wed, 13 Apr 2016 14:55:57 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DWDQAfvw5XNaAZLHlegzeBUIJyg3mfTwEBAQEBAQaMEIl2hggEAgKBPU0BAQEBAQEHAQEBAUEBQIRCAQEEOhwjEAgDDgoJJQ8FJQMHGhOIKMMeAQEIAh4ZhUCFE4oVAQSYCI4DgVuNP48nhFsqMIl6AQEB Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail06.adl2.internode.on.net with ESMTP; 14 Apr 2016 07:25:56 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aqSlQ-0005uZ-6i; Thu, 14 Apr 2016 07:55:56 +1000 Date: Thu, 14 Apr 2016 07:55:56 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: RFC: use iomap infrastructure for all our zeroing needs Message-ID: <20160413215556.GT567@dastard> X-ASG-Orig-Subj: Re: RFC: use iomap infrastructure for all our zeroing needs References: <1460500013-28334-1-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460500013-28334-1-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1460584557 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28713 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Apr 12, 2016 at 03:26:47PM -0700, Christoph Hellwig wrote: > This series uses the new iomap infrastructure to simplify all kinds > of zeroing operations. The RFC tag is mostly because the DAX path > modified in this series hasn't been tested yet, the normal buffered > path has been tested and works fine. Yep, passes all my testing for normal FS paths, though I haven't run DAX on it yet, either. I'll look to include this at teh same time as the map iomap write/fiemap series. Cheers, Dave. -- Dave Chinner david@fromorbit.com From tireman@shaw.ca Wed Apr 13 17:33:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B98FF7CA4 for ; Wed, 13 Apr 2016 17:33:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id BBA78AC007 for ; Wed, 13 Apr 2016 15:33:41 -0700 (PDT) X-ASG-Debug-ID: 1460586814-04cbb02e1c1b4270001-NocioJ Received: from smtp-out-so.shaw.ca (smtp-out-so.shaw.ca [64.59.136.139]) by cuda.sgi.com with ESMTP id w2Ufl06NqlOdwWpn (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 15:33:35 -0700 (PDT) X-Barracuda-Envelope-From: tireman@shaw.ca X-Barracuda-Apparent-Source-IP: 64.59.136.139 Received: from [192.168.0.2] ([174.5.126.242]) by shaw.ca with SMTP id qTLoaMc98BLFmqTLqawvh5; Wed, 13 Apr 2016 16:33:34 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=shaw.ca; s=s20150330; t=1460586814; bh=yATsJD3GK55hfAVwlzpUUDQ8eCmBblaJKDtFEdNXZpA=; h=Subject:To:References:Cc:From:Date:In-Reply-To; b=MYu1MIW0bYhj6TKn95Q0o9GN7nv5hEaKwfz+6I73K2CLwY62DEdi5tepcWqQtES82 Oz5v0v8W3GuHoJZM2VY0fQptXe0L5Mvld0F6h8LKKPlt+QvCS9g8+dJFYARBi2obpK MLDRPpZOf6ozjeqGEhhLHRUEnkrcEtWwh2jH1+uO1S14xNDrsGfePnEAfbeNbrndSc mDihiEkgZMmFDIQflgOKP1Rlt5tbJZqqhrTtyIQSSmKaNQod/vRJy0N8LTxf/zzLEG mGBauLHcvteG0VDfH/c/3oMGl9Hu2nGey4OLeE9XT0zuIz3/KmS3wgvCSWSvGBYw2C RXCTtDoWewoWA== X-Authority-Analysis: v=2.2 cv=W5d6blek c=1 sm=1 tr=0 a=YUpam8ogUlPMk4SS6ACeKg==:117 a=YUpam8ogUlPMk4SS6ACeKg==:17 a=N659UExz7-8A:10 a=eJfxgxciAAAA:8 a=V9Y4vJ347le0OGYwcXgA:9 a=tDZL8ezKpeQ8Yn8m:21 a=7vzxOUGKZoSsh9ml:21 Subject: Re: xfs_repair fails after trying to format log cycle? To: Brian Foster X-ASG-Orig-Subj: Re: xfs_repair fails after trying to format log cycle? References: <56F6DE67.60403@shaw.ca> <20160328085541.GA27040@bfoster.bfoster> <570C8D4D.3060304@shaw.ca> <20160412140512.GA59690@bfoster.bfoster> <570D578D.5010706@shaw.ca> <20160413121214.GA2775@bfoster.bfoster> Cc: xfs@oss.sgi.com From: Andrew Ryder Message-ID: <570EC95F.2010401@shaw.ca> Date: Wed, 13 Apr 2016 18:34:07 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <20160413121214.GA2775@bfoster.bfoster> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-CMAE-Envelope: MS4wfEFxfZFRxaVgG5mRvyrINVEuiHSv4cbOnRKcNyO6B182cTVjVliLvwffxz1Udq8QzpXMZXu5YEytAT6G2kdHap2snR0JaXe7Rg2+Nm8szp1QtArdXv2k OV3YmPui9UgNZdu48IZfImD/HB6cuRfRlncL18fDWIq81UvYanSYN8ApgnkT6qIb/yW8ls4JovjJwQ== X-Barracuda-Connect: smtp-out-so.shaw.ca[64.59.136.139] X-Barracuda-Start-Time: 1460586815 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28714 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 That seems to make sense. I've started a check of the array and see what happens. I don't believe its a hardware error as neither sata pmp controller I have it on logs any hardware/cabling related errors at all. Thanks for the help so far. I'll let you know how I make out if I ever figure out where the gremlins are hiding.. On 04/13/2016 08:12 AM, Brian Foster wrote: > On Tue, Apr 12, 2016 at 04:16:13PM -0400, Andrew Ryder wrote: >> On 04/12/2016 10:05 AM, Brian Foster wrote: >>> On Tue, Apr 12, 2016 at 01:53:17AM -0400, Andrew Ryder wrote: >>>> >>>> >>>> On 03/28/2016 04:55 AM, Brian Foster wrote: > ... >>> What happens if you manually issue the read call that failed? E.g., >>> umount the filesystem and run the following command directly against the >>> array: >>> >>> xfs_io -dc "pread 3001552175104 2097152" /dev/md2 >>> >>> Brian >> >> It failed with the same error. I've attached the strace output for the >> command. >> > > Thanks, well that is interesting. The larger 2MB read eventually results > in this smaller (4k) read that fails: > > 16:02:14.221784 pread64(3, 0x1ce7000, 4096, 3001553125376) = -1 EIO (Input/output error) > > So you could repeat that command with offset 3001553125376 and size 4k > and just confirm that still fails. As Dave points out, something is > wrong with the storage here and that is what needs to be resolved. > > With regard to the xfs_repair behavior... you're initially hitting a > read error when the filesystem scans through the log looking for the > head and tail to determine whether the log is dirty. If the log is > zeroed, this sequence can be bypassed and the log assumed clean. I > suspect by zeroing enough of the log before it fails, your repair > sequence is just bypassing the log head/tail discovery that previously > scanned areas of the disk that are having issues. In other words, it's > just temporarily stepping around the problem until the log progresses > back to this address range. > > What you probably have to do at this point is use the simple I/O error > reproducer you have to try and determine why the storage returns an > error. It could be anywhere from something broken in the md subsystem, > to the controller driver, to a physical problem with the associated > disk. I'd suggest to start by reporting to the md mailing list and work > down from there... > > Brian > >> The array is fairly full so I'm wondering if something is out of alignment >> somewhere thats causing this? >> >> /dev/md2 5858060288 5245630392 612429896 90% /mnt/md2 >> >> When I had the array plugged into another controller which isn't a >> rocketraid card, it did complain about all the drives not being aligned >> properly? Somehow it looks like sdk wasn't partitioned the same as the rest, >> I'm wondering if thats screwing things up? >> >> GNU Parted 3.2 >> Using /dev/sdi >> Welcome to GNU Parted! Type 'help' to view a list of commands. >> (parted) p >> Model: ATA ST2000NC000-1CX1 (scsi) >> Disk /dev/sdi: 2000GB >> Sector size (logical/physical): 512B/512B >> Partition Table: gpt >> Disk Flags: >> >> Number Start End Size File system Name Flags >> 1 1049kB 2000GB 2000GB >> Number Start End Size File system Name Flags >> 1 2048s 3907028991s 3907026944s >> >> >> GNU Parted 3.2 >> Using /dev/sdk >> Welcome to GNU Parted! Type 'help' to view a list of commands. >> (parted) p >> Model: ATA ST2000DL001-9VT1 (scsi) >> Disk /dev/sdk: 2000GB >> Sector size (logical/physical): 512B/512B >> Partition Table: msdos >> Disk Flags: >> >> Number Start End Size Type File system Flags >> 1 512B 2000GB 2000GB primary raid >> Number Start End Size Type File system Flags >> 1 1s 3907029167s 3907029167s primary raid >> >> >> GNU Parted 3.2 >> Using /dev/sdh >> Welcome to GNU Parted! Type 'help' to view a list of commands. >> (parted) p >> Model: ATA ST2000DL001-9VT1 (scsi) >> Disk /dev/sdh: 2000GB >> Sector size (logical/physical): 512B/512B >> Partition Table: gpt >> Disk Flags: >> >> Number Start End Size File system Name Flags >> 1 1049kB 2000GB 2000GB >> Number Start End Size File system Name Flags >> 1 2048s 3907028991s 3907026944s >> >> >> GNU Parted 3.2 >> Using /dev/sdm >> Welcome to GNU Parted! Type 'help' to view a list of commands. >> (parted) p >> Model: ATA ST2000NC000-1CX1 (scsi) >> Disk /dev/sdm: 2000GB >> Sector size (logical/physical): 512B/512B >> Partition Table: gpt >> Disk Flags: >> >> Number Start End Size File system Name Flags >> 1 1049kB 2000GB 2000GB >> Number Start End Size File system Name Flags >> 1 2048s 3907028991s 3907026944s >> >> >> >>> >>>> >>>> This all began when the RR2722 driver running under 3.18.15 complained and >>>> .. >>>> >>>> Mar 14 07:23:07 Bigmouth kernel: [7177248.090541] /dev/vmnet: port on hub 0 >>>> successfully opened >>>> Mar 14 07:26:03 Bigmouth kernel: [7177424.552323] device eth1 left >>>> promiscuous mode >>>> Mar 14 07:26:03 Bigmouth kernel: [7177424.552786] bridge-eth1: disabled >>>> promiscuous mode >>>> Mar 14 20:10:20 Bigmouth kernel: [7223317.069464] rr272x_1x:Task file error, >>>> StatusReg=0x51, ErrReg=0x84, LBA[0-3]=0x747dc92f,LBA[4-7]=0x0. >>>> Mar 14 20:10:20 Bigmouth kernel: [7223317.179811] sd 5:0:1:0: [sdg] >>>> Mar 14 20:10:21 Bigmouth kernel: [7223317.690439] Result: >>>> hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK >>>> Mar 14 20:10:21 Bigmouth kernel: [7223317.700480] sd 5:0:1:0: [sdg] CDB: >>>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211147] Write(10): 2a 00 74 7d c9 >>>> 00 00 00 40 00 >>>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211167] blk_update_request: I/O >>>> error, dev sdg, sector 1954400512 >>>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211203] sd 5:0:3:0: [sdi] >>>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211206] Result: >>>> hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK >>>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211209] sd 5:0:3:0: [sdi] CDB: >>>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211211] Write(10): 2a 00 74 7d c9 >>>> 00 00 00 40 00 >>>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211223] blk_update_request: I/O >>>> error, dev sdi, sector 1954400512 >>>> Mar 14 20:10:23 Bigmouth kernel: [7223319.957052] XFS (md2): metadata I/O >>>> error: block 0x15d6d4900 ("xlog_iodone") error 5 numblks 64 >>>> Mar 14 20:10:23 Bigmouth kernel: [7223319.957064] XFS (md2): >>>> xfs_do_force_shutdown(0x2) called from line 1181 of file fs/xfs/xfs_log.c. >>>> Return address = 0xffffffff812fdf96 >>>> Mar 14 20:10:23 Bigmouth kernel: [7223319.957080] XFS (md2): Log I/O Error >>>> Detected. Shutting down filesystem >>>> Mar 14 20:10:23 Bigmouth kernel: [7223319.957083] XFS (md2): Please umount >>>> the filesystem and rectify the problem(s) >>>> Mar 14 20:10:23 Bigmouth kernel: [7223319.957093] XFS (md2): xfs_log_force: >>>> error -5 returned. >>>> Mar 14 20:10:50 Bigmouth kernel: [7223347.087272] XFS (md2): xfs_log_force: >>>> error -5 returned. >>>> Mar 14 20:11:20 Bigmouth kernel: [7223377.190469] XFS (md2): xfs_log_force: >>>> error -5 returned. >>>> Mar 14 20:11:50 Bigmouth kernel: [7223407.293952] XFS (md2): xfs_log_force: >>>> error -5 returned. >>>> Mar 14 20:12:20 Bigmouth kernel: [7223437.397444] XFS (md2): xfs_log_force: >>>> error -5 returned. >>>> Mar 14 20:12:23 Bigmouth kernel: [7223439.791407] nfsd: last server has >>>> exited, flushing export cache >>>> Mar 14 20:12:50 Bigmouth kernel: [7223467.500928] XFS (md2): xfs_log_force: >>>> error -5 returned. >>>> Mar 14 20:13:20 Bigmouth kernel: [7223497.604420] XFS (md2): xfs_log_force: >>>> error -5 returned. >>>> Mar 14 20:13:50 Bigmouth kernel: [7223527.707899] XFS (md2): xfs_log_force: >>>> error -5 returned. >>>> Mar 14 20:14:21 Bigmouth kernel: [7223557.811399] XFS (md2): xfs_log_force: >>>> error -5 returned. >>>> Mar 14 20:14:51 Bigmouth kernel: [7223587.914932] XFS (md2): xfs_log_force: >>>> error -5 returned. >>>> Mar 14 20:15:21 Bigmouth kernel: [7223618.018362] XFS (md2): xfs_log_force: >>>> error -5 returned. >>>> Mar 14 20:15:51 Bigmouth kernel: [7223648.121779] XFS (md2): xfs_log_force: >>>> error -5 returned. >>>> Mar 14 20:16:19 Bigmouth kernel: [7223676.401069] XFS (md2): xfs_log_force: >>>> error -5 returned. >>>> Mar 14 20:16:21 Bigmouth kernel: [7223678.225334] XFS (md2): xfs_log_force: >>>> error -5 returned. >>>> Mar 14 20:16:27 Bigmouth kernel: [7223684.541305] XFS (md2): xfs_log_force: >>>> error -5 returned. >>>> Mar 14 20:16:27 Bigmouth kernel: [7223684.572176] XFS (md2): xfs_log_force: >>>> error -5 returned. >>>> Mar 14 20:16:38 Bigmouth kernel: [7223694.918565] md2: unknown partition >>>> table >>>> Mar 14 20:16:43 Bigmouth kernel: [7223700.425290] XFS (md2): Mounting V5 >>>> Filesystem >>>> Mar 14 20:16:43 Bigmouth kernel: [7223700.545669] XFS (md2): Starting >>>> recovery (logdev: internal) >>>> Mar 14 20:16:44 Bigmouth kernel: [7223701.874245] XFS (md2): Ending recovery >>>> (logdev: internal) >>>> Mar 14 20:30:31 Bigmouth kernel: [7224529.528678] md2: unknown partition >>>> table >>>> >>>> >>>> >>>> /dev/md2: >>>> Version : 1.2 >>>> Creation Time : Tue Oct 13 22:21:27 2015 >>>> Raid Level : raid5 >>>> Array Size : 5860147200 (5588.67 GiB 6000.79 GB) >>>> Used Dev Size : 1953382400 (1862.89 GiB 2000.26 GB) >>>> Raid Devices : 4 >>>> Total Devices : 4 >>>> Persistence : Superblock is persistent >>>> >>>> Intent Bitmap : Internal >>>> >>>> Update Time : Tue Apr 12 01:19:43 2016 >>>> State : clean >>>> Active Devices : 4 >>>> Working Devices : 4 >>>> Failed Devices : 0 >>>> Spare Devices : 0 >>>> >>>> Layout : left-symmetric >>>> Chunk Size : 512K >>>> >>>> Name : Bigmouth:2 (local to host Bigmouth) >>>> UUID : ed979276:3459155c:a32f63da:0c684042 >>>> Events : 62846 >>>> >>>> Number Major Minor RaidDevice State >>>> 5 8 193 0 active sync /dev/sdm1 >>>> 6 8 129 1 active sync /dev/sdi1 >>>> 2 8 177 2 active sync /dev/sdl1 >>>> 4 8 113 3 active sync /dev/sdh1 >>>> >>>> >>>> meta-data=/dev/md2 isize=512 agcount=33, agsize=45782272 >>>> blks >>>> = sectsz=512 attr=2, projid32bit=1 >>>> = crc=1 finobt=1 spinodes=0 >>>> data = bsize=4096 blocks=1465036800, imaxpct=5 >>>> = sunit=128 swidth=384 blks >>>> naming =version 2 bsize=4096 ascii-ci=0 ftype=1 >>>> log =internal bsize=4096 blocks=521728, version=2 >>>> = sectsz=512 sunit=8 blks, lazy-count=1 >>>> realtime =none extsz=4096 blocks=0, rtextents=0 >>>> >>>> >>>>> >>>>>> >>>>>> Checking the drives with smartctl shows no errors nor does 'dmesg' show any >>>>>> hardware i/o or controller related errors... >>>>>> >>>>>> I've tried scrubbing the array and no bad sectors are found either.. >>>>>> >>>>>> I'm running kernel 3.19.8 with xfsprogs 4.5. >>>>>> >>>>>> Thanks, >>>>>> Andrew >>>>>> >>>>>> _______________________________________________ >>>>>> xfs mailing list >>>>>> xfs@oss.sgi.com >>>>>> http://oss.sgi.com/mailman/listinfo/xfs >>>>> >>> > >> 16:02:14.159324 execve("/usr/sbin/xfs_io", ["xfs_io", "-dc", "pread 3001552175104 2097152", "/dev/md2"], [/* 51 vars */]) = 0 >> 16:02:14.160220 brk(NULL) = 0x1ce4000 >> 16:02:14.160345 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e4a2000 >> 16:02:14.160508 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) >> 16:02:14.160626 open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 >> 16:02:14.160707 fstat(3, {st_mode=S_IFREG|0644, st_size=246250, ...}) = 0 >> 16:02:14.160791 mmap(NULL, 246250, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f1c5e458000 >> 16:02:14.160862 close(3) = 0 >> 16:02:14.160959 open("/usr/lib64/libxcmd.so.0", O_RDONLY|O_CLOEXEC) = 3 >> 16:02:14.161037 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@\37\0\0\0\0\0\0"..., 832) = 832 >> 16:02:14.161111 fstat(3, {st_mode=S_IFREG|0755, st_size=26832, ...}) = 0 >> 16:02:14.161184 mmap(NULL, 2128384, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c5e070000 >> 16:02:14.161254 mprotect(0x7f1c5e076000, 2093056, PROT_NONE) = 0 >> 16:02:14.161325 mmap(0x7f1c5e275000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5000) = 0x7f1c5e275000 >> 16:02:14.161438 mmap(0x7f1c5e277000, 2560, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e277000 >> 16:02:14.161525 close(3) = 0 >> 16:02:14.161605 open("/lib64/libhandle.so.1", O_RDONLY|O_CLOEXEC) = 3 >> 16:02:14.161683 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\17\0\0\0\0\0\0"..., 832) = 832 >> 16:02:14.161755 fstat(3, {st_mode=S_IFREG|0755, st_size=14224, ...}) = 0 >> 16:02:14.161826 mmap(NULL, 2113800, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c5de68000 >> 16:02:14.161896 mprotect(0x7f1c5de6b000, 2093056, PROT_NONE) = 0 >> 16:02:14.161965 mmap(0x7f1c5e06a000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f1c5e06a000 >> 16:02:14.162049 mmap(0x7f1c5e06c000, 264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e06c000 >> 16:02:14.162131 close(3) = 0 >> 16:02:14.162210 open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 >> 16:02:14.162287 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\7\2\0\0\0\0\0"..., 832) = 832 >> 16:02:14.162359 fstat(3, {st_mode=S_IFREG|0755, st_size=1664768, ...}) = 0 >> 16:02:14.162457 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e4a1000 >> 16:02:14.162535 mmap(NULL, 3771992, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c5dac8000 >> 16:02:14.162607 mprotect(0x7f1c5dc57000, 2097152, PROT_NONE) = 0 >> 16:02:14.162679 mmap(0x7f1c5de57000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x18f000) = 0x7f1c5de57000 >> 16:02:14.162764 mmap(0x7f1c5de5d000, 15960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c5de5d000 >> 16:02:14.162849 close(3) = 0 >> 16:02:14.162933 open("/lib64/libreadline.so.6", O_RDONLY|O_CLOEXEC) = 3 >> 16:02:14.163013 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260d\1\0\0\0\0\0"..., 832) = 832 >> 16:02:14.163084 fstat(3, {st_mode=S_IFREG|0555, st_size=415928, ...}) = 0 >> 16:02:14.163155 mmap(NULL, 2518968, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c5d860000 >> 16:02:14.163225 mprotect(0x7f1c5d8bd000, 2097152, PROT_NONE) = 0 >> 16:02:14.163296 mmap(0x7f1c5dabd000, 36864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5d000) = 0x7f1c5dabd000 >> 16:02:14.163389 mmap(0x7f1c5dac6000, 4024, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c5dac6000 >> 16:02:14.163482 close(3) = 0 >> 16:02:14.163568 open("/lib64/libncurses.so.6", O_RDONLY|O_CLOEXEC) = 3 >> 16:02:14.163645 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320W\1\0\0\0\0\0"..., 832) = 832 >> 16:02:14.163716 fstat(3, {st_mode=S_IFREG|0755, st_size=526008, ...}) = 0 >> 16:02:14.163787 mmap(NULL, 2624120, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c5d5d8000 >> 16:02:14.163857 mprotect(0x7f1c5d654000, 2093056, PROT_NONE) = 0 >> 16:02:14.163927 mmap(0x7f1c5d853000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7b000) = 0x7f1c5d853000 >> 16:02:14.164028 mmap(0x7f1c5d858000, 2680, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c5d858000 >> 16:02:14.164113 close(3) = 0 >> 16:02:14.164197 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e4a0000 >> 16:02:14.164281 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e49f000 >> 16:02:14.164355 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e49e000 >> 16:02:14.164455 arch_prctl(ARCH_SET_FS, 0x7f1c5e49f700) = 0 >> 16:02:14.164661 mprotect(0x7f1c5de57000, 16384, PROT_READ) = 0 >> 16:02:14.164806 mprotect(0x7f1c5d853000, 16384, PROT_READ) = 0 >> 16:02:14.165153 mprotect(0x7f1c5dabd000, 8192, PROT_READ) = 0 >> 16:02:14.165231 mprotect(0x7f1c5e06a000, 4096, PROT_READ) = 0 >> 16:02:14.165313 mprotect(0x7f1c5e275000, 4096, PROT_READ) = 0 >> 16:02:14.165402 mprotect(0x618000, 4096, PROT_READ) = 0 >> 16:02:14.165482 mprotect(0x7f1c5e499000, 4096, PROT_READ) = 0 >> 16:02:14.165552 munmap(0x7f1c5e458000, 246250) = 0 >> 16:02:14.165817 brk(NULL) = 0x1ce4000 >> 16:02:14.165876 brk(0x1d05000) = 0x1d05000 >> 16:02:14.165953 open("/usr/lib64/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3 >> 16:02:14.166031 fstat(3, {st_mode=S_IFREG|0644, st_size=3832592, ...}) = 0 >> 16:02:14.166103 mmap(NULL, 3832592, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f1c5d230000 >> 16:02:14.166187 close(3) = 0 >> 16:02:14.166394 open("/dev/md2", O_RDWR|O_DIRECT) = 3 >> 16:02:14.166498 fstatfs(3, {f_type="TMPFS_MAGIC", f_bsize=4096, f_blocks=2560, f_bfree=2560, f_bavail=2560, f_files=8244585, f_ffree=8243843, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=4130}) = 0 >> 16:02:14.166583 fstat(3, {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 >> 16:02:14.166655 fstatfs(3, {f_type="TMPFS_MAGIC", f_bsize=4096, f_blocks=2560, f_bfree=2560, f_bavail=2560, f_files=8244585, f_ffree=8243843, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=4130}) = 0 >> 16:02:14.166730 fstat(3, {st_mode=S_IFBLK|0660, st_rdev=makedev(9, 2), ...}) = 0 >> 16:02:14.166822 open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 4 >> 16:02:14.166899 fstat(4, {st_mode=S_IFREG|0644, st_size=2997, ...}) = 0 >> 16:02:14.166969 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e49d000 >> 16:02:14.167040 read(4, "# Locale name alias data base.\n#"..., 4096) = 2997 >> 16:02:14.167154 read(4, "", 4096) = 0 >> 16:02:14.167223 close(4) = 0 >> 16:02:14.167289 munmap(0x7f1c5e49d000, 4096) = 0 >> 16:02:14.167405 open("/usr/share/locale/en_US.utf8/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = -1 ENOENT (No such file or directory) >> 16:02:14.167488 open("/usr/share/locale/en_US/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = -1 ENOENT (No such file or directory) >> 16:02:14.167564 open("/usr/share/locale/en.utf8/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = -1 ENOENT (No such file or directory) >> 16:02:14.167637 open("/usr/share/locale/en/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = -1 ENOENT (No such file or directory) >> 16:02:14.168062 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552175104) = 4096 >> 16:02:14.168480 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552179200) = 4096 >> 16:02:14.168744 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552183296) = 4096 >> 16:02:14.168995 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552187392) = 4096 >> 16:02:14.169235 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552191488) = 4096 >> 16:02:14.169479 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552195584) = 4096 >> 16:02:14.169717 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552199680) = 4096 >> 16:02:14.169970 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552203776) = 4096 >> 16:02:14.170215 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552207872) = 4096 >> 16:02:14.170461 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552211968) = 4096 >> 16:02:14.170700 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552216064) = 4096 >> 16:02:14.170940 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552220160) = 4096 >> 16:02:14.171177 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552224256) = 4096 >> 16:02:14.171440 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552228352) = 4096 >> 16:02:14.171680 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552232448) = 4096 >> 16:02:14.171913 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552236544) = 4096 >> 16:02:14.172148 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552240640) = 4096 >> 16:02:14.172402 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552244736) = 4096 >> 16:02:14.172652 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552248832) = 4096 >> 16:02:14.172901 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552252928) = 4096 >> 16:02:14.173135 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552257024) = 4096 >> 16:02:14.173381 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552261120) = 4096 >> 16:02:14.173626 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552265216) = 4096 >> 16:02:14.173859 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552269312) = 4096 >> 16:02:14.174095 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552273408) = 4096 >> 16:02:14.174335 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552277504) = 4096 >> 16:02:14.174591 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552281600) = 4096 >> 16:02:14.174822 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552285696) = 4096 >> 16:02:14.175053 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552289792) = 4096 >> 16:02:14.175285 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552293888) = 4096 >> 16:02:14.175528 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552297984) = 4096 >> 16:02:14.175765 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552302080) = 4096 >> 16:02:14.175988 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552306176) = 4096 >> 16:02:14.176212 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552310272) = 4096 >> 16:02:14.176596 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552314368) = 4096 >> 16:02:14.176860 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552318464) = 4096 >> 16:02:14.177083 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552322560) = 4096 >> 16:02:14.177306 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552326656) = 4096 >> 16:02:14.177535 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552330752) = 4096 >> 16:02:14.177759 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552334848) = 4096 >> 16:02:14.177981 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552338944) = 4096 >> 16:02:14.178231 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552343040) = 4096 >> 16:02:14.178469 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552347136) = 4096 >> 16:02:14.178687 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552351232) = 4096 >> 16:02:14.178915 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552355328) = 4096 >> 16:02:14.179131 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552359424) = 4096 >> 16:02:14.179404 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552363520) = 4096 >> 16:02:14.179635 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552367616) = 4096 >> 16:02:14.179856 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552371712) = 4096 >> 16:02:14.180076 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552375808) = 4096 >> 16:02:14.180299 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552379904) = 4096 >> 16:02:14.180518 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552384000) = 4096 >> 16:02:14.180738 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552388096) = 4096 >> 16:02:14.180983 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552392192) = 4096 >> 16:02:14.181204 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552396288) = 4096 >> 16:02:14.181455 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552400384) = 4096 >> 16:02:14.181677 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552404480) = 4096 >> 16:02:14.181900 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552408576) = 4096 >> 16:02:14.182122 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552412672) = 4096 >> 16:02:14.182345 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552416768) = 4096 >> 16:02:14.182585 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552420864) = 4096 >> 16:02:14.182808 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552424960) = 4096 >> 16:02:14.183041 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552429056) = 4096 >> 16:02:14.183261 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552433152) = 4096 >> 16:02:14.183486 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552437248) = 4096 >> 16:02:14.183707 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552441344) = 4096 >> 16:02:14.183943 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552445440) = 4096 >> 16:02:14.184159 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552449536) = 4096 >> 16:02:14.184398 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552453632) = 4096 >> 16:02:14.184621 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552457728) = 4096 >> 16:02:14.184836 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552461824) = 4096 >> 16:02:14.185075 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552465920) = 4096 >> 16:02:14.185292 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552470016) = 4096 >> 16:02:14.189482 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552474112) = 4096 >> 16:02:14.189973 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552478208) = 4096 >> 16:02:14.190171 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552482304) = 4096 >> 16:02:14.190360 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552486400) = 4096 >> 16:02:14.190573 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552490496) = 4096 >> 16:02:14.190745 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552494592) = 4096 >> 16:02:14.190913 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552498688) = 4096 >> 16:02:14.191098 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552502784) = 4096 >> 16:02:14.191269 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552506880) = 4096 >> 16:02:14.191478 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552510976) = 4096 >> 16:02:14.191692 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552515072) = 4096 >> 16:02:14.191879 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552519168) = 4096 >> 16:02:14.192062 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552523264) = 4096 >> 16:02:14.192246 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552527360) = 4096 >> 16:02:14.192444 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552531456) = 4096 >> 16:02:14.192625 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552535552) = 4096 >> 16:02:14.192806 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552539648) = 4096 >> 16:02:14.192990 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552543744) = 4096 >> 16:02:14.193172 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552547840) = 4096 >> 16:02:14.193351 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552551936) = 4096 >> 16:02:14.193555 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552556032) = 4096 >> 16:02:14.193736 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552560128) = 4096 >> 16:02:14.193913 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552564224) = 4096 >> 16:02:14.194094 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552568320) = 4096 >> 16:02:14.194278 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552572416) = 4096 >> 16:02:14.194468 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552576512) = 4096 >> 16:02:14.194650 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552580608) = 4096 >> 16:02:14.194829 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552584704) = 4096 >> 16:02:14.195009 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552588800) = 4096 >> 16:02:14.195193 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552592896) = 4096 >> 16:02:14.195386 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552596992) = 4096 >> 16:02:14.195579 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552601088) = 4096 >> 16:02:14.195763 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552605184) = 4096 >> 16:02:14.195957 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552609280) = 4096 >> 16:02:14.196141 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552613376) = 4096 >> 16:02:14.196321 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552617472) = 4096 >> 16:02:14.196511 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552621568) = 4096 >> 16:02:14.196697 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552625664) = 4096 >> 16:02:14.197041 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552629760) = 4096 >> 16:02:14.197239 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552633856) = 4096 >> 16:02:14.197486 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552637952) = 4096 >> 16:02:14.197689 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552642048) = 4096 >> 16:02:14.197874 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552646144) = 4096 >> 16:02:14.198057 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552650240) = 4096 >> 16:02:14.198259 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552654336) = 4096 >> 16:02:14.198446 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552658432) = 4096 >> 16:02:14.198639 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552662528) = 4096 >> 16:02:14.198823 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552666624) = 4096 >> 16:02:14.199006 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552670720) = 4096 >> 16:02:14.199188 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552674816) = 4096 >> 16:02:14.199373 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552678912) = 4096 >> 16:02:14.199569 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552683008) = 4096 >> 16:02:14.199749 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552687104) = 4096 >> 16:02:14.199929 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552691200) = 4096 >> 16:02:14.200108 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552695296) = 4096 >> 16:02:14.200304 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552699392) = 4096 >> 16:02:14.200494 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552703488) = 4096 >> 16:02:14.200684 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552707584) = 4096 >> 16:02:14.200867 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552711680) = 4096 >> 16:02:14.201047 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552715776) = 4096 >> 16:02:14.201227 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552719872) = 4096 >> 16:02:14.201417 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552723968) = 4096 >> 16:02:14.201602 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552728064) = 4096 >> 16:02:14.201782 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552732160) = 4096 >> 16:02:14.201962 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552736256) = 4096 >> 16:02:14.202153 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552740352) = 4096 >> 16:02:14.202352 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552744448) = 4096 >> 16:02:14.202564 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552748544) = 4096 >> 16:02:14.202740 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552752640) = 4096 >> 16:02:14.202920 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552756736) = 4096 >> 16:02:14.203101 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552760832) = 4096 >> 16:02:14.203284 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552764928) = 4096 >> 16:02:14.203473 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552769024) = 4096 >> 16:02:14.203654 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552773120) = 4096 >> 16:02:14.203833 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552777216) = 4096 >> 16:02:14.204014 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552781312) = 4096 >> 16:02:14.204198 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552785408) = 4096 >> 16:02:14.204409 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552789504) = 4096 >> 16:02:14.204591 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552793600) = 4096 >> 16:02:14.204770 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552797696) = 4096 >> 16:02:14.204952 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552801792) = 4096 >> 16:02:14.205135 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552805888) = 4096 >> 16:02:14.205316 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552809984) = 4096 >> 16:02:14.205502 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552814080) = 4096 >> 16:02:14.205684 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552818176) = 4096 >> 16:02:14.205865 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552822272) = 4096 >> 16:02:14.206050 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552826368) = 4096 >> 16:02:14.206240 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552830464) = 4096 >> 16:02:14.206446 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552834560) = 4096 >> 16:02:14.206626 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552838656) = 4096 >> 16:02:14.206806 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552842752) = 4096 >> 16:02:14.206988 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552846848) = 4096 >> 16:02:14.207166 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552850944) = 4096 >> 16:02:14.207344 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552855040) = 4096 >> 16:02:14.207539 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552859136) = 4096 >> 16:02:14.207724 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552863232) = 4096 >> 16:02:14.207907 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552867328) = 4096 >> 16:02:14.208084 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552871424) = 4096 >> 16:02:14.208274 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552875520) = 4096 >> 16:02:14.208494 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552879616) = 4096 >> 16:02:14.208675 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552883712) = 4096 >> 16:02:14.208858 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552887808) = 4096 >> 16:02:14.209037 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552891904) = 4096 >> 16:02:14.209217 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552896000) = 4096 >> 16:02:14.209412 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552900096) = 4096 >> 16:02:14.209595 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552904192) = 4096 >> 16:02:14.209774 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552908288) = 4096 >> 16:02:14.209953 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552912384) = 4096 >> 16:02:14.210130 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552916480) = 4096 >> 16:02:14.210320 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552920576) = 4096 >> 16:02:14.210538 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552924672) = 4096 >> 16:02:14.210723 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552928768) = 4096 >> 16:02:14.210903 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552932864) = 4096 >> 16:02:14.211084 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552936960) = 4096 >> 16:02:14.211264 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552941056) = 4096 >> 16:02:14.211452 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552945152) = 4096 >> 16:02:14.211639 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552949248) = 4096 >> 16:02:14.211831 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552953344) = 4096 >> 16:02:14.212012 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552957440) = 4096 >> 16:02:14.212194 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552961536) = 4096 >> 16:02:14.212377 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552965632) = 4096 >> 16:02:14.212579 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552969728) = 4096 >> 16:02:14.212760 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552973824) = 4096 >> 16:02:14.212939 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552977920) = 4096 >> 16:02:14.213118 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552982016) = 4096 >> 16:02:14.213298 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552986112) = 4096 >> 16:02:14.213490 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552990208) = 4096 >> 16:02:14.213672 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552994304) = 4096 >> 16:02:14.213987 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001552998400) = 4096 >> 16:02:14.214237 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553002496) = 4096 >> 16:02:14.214493 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553006592) = 4096 >> 16:02:14.214760 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553010688) = 4096 >> 16:02:14.215009 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553014784) = 4096 >> 16:02:14.215258 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553018880) = 4096 >> 16:02:14.215515 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553022976) = 4096 >> 16:02:14.215774 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553027072) = 4096 >> 16:02:14.216026 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553031168) = 4096 >> 16:02:14.216273 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553035264) = 4096 >> 16:02:14.216529 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553039360) = 4096 >> 16:02:14.216801 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553043456) = 4096 >> 16:02:14.217042 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553047552) = 4096 >> 16:02:14.217302 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553051648) = 4096 >> 16:02:14.217557 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553055744) = 4096 >> 16:02:14.217821 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553059840) = 4096 >> 16:02:14.218067 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553063936) = 4096 >> 16:02:14.218312 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553068032) = 4096 >> 16:02:14.218559 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553072128) = 4096 >> 16:02:14.218801 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553076224) = 4096 >> 16:02:14.219045 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553080320) = 4096 >> 16:02:14.219287 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553084416) = 4096 >> 16:02:14.219543 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553088512) = 4096 >> 16:02:14.219794 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553092608) = 4096 >> 16:02:14.220040 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553096704) = 4096 >> 16:02:14.220286 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553100800) = 4096 >> 16:02:14.220541 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553104896) = 4096 >> 16:02:14.220787 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553108992) = 4096 >> 16:02:14.221033 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553113088) = 4096 >> 16:02:14.221280 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553117184) = 4096 >> 16:02:14.221532 pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 3001553121280) = 4096 >> 16:02:14.221784 pread64(3, 0x1ce7000, 4096, 3001553125376) = -1 EIO (Input/output error) >> 16:02:14.222083 dup(2) = 4 >> 16:02:14.222183 fcntl(4, F_GETFL) = 0x8402 (flags O_RDWR|O_APPEND|O_LARGEFILE) >> 16:02:14.222290 open("/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) >> 16:02:14.222448 open("/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) >> 16:02:14.222616 open("/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) >> 16:02:14.222693 open("/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) >> 16:02:14.222786 fstat(4, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 9), ...}) = 0 >> 16:02:14.222866 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e49d000 >> 16:02:14.222954 write(4, "pread64: Input/output error\n", 28) = 28 >> 16:02:14.223038 close(4) = 0 >> 16:02:14.223103 munmap(0x7f1c5e49d000, 4096) = 0 >> 16:02:14.223249 exit_group(0) = ? >> 16:02:14.223594 +++ exited with 0 +++ > >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs > > From david@fromorbit.com Wed Apr 13 19:35:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 676097CA7 for ; Wed, 13 Apr 2016 19:35:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D52ABAC003 for ; Wed, 13 Apr 2016 17:35:19 -0700 (PDT) X-ASG-Debug-ID: 1460594116-04bdf011034ca930001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id xvc9cDFyhvAGTtkT for ; Wed, 13 Apr 2016 17:35:17 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2A9EgDZ5A5XNaAZLHlegziBUIJyg3mfVQEBAQEBAQaMEINPghmEDoYIAgIBAQKBPU0BAQEBAQEHAQEBAUEBQIRBAQEBBDocIxAIAw4HAwklDwUlAwcaE4gowx0BAQEHAgEdGYVAhROKFQWYCI4DjxpFjmKCZhkVgUcqMIl6AQEB Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail06.adl2.internode.on.net with ESMTP; 14 Apr 2016 10:02:43 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aqVD8-0006A3-Oa; Thu, 14 Apr 2016 10:32:42 +1000 Date: Thu, 14 Apr 2016 10:32:42 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com, linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, dm-devel@redhat.com, Mike Snitzer Subject: Re: [RFC v2 PATCH 03/10] block: add block_device_operations methods to set and get reserved space Message-ID: <20160414003242.GU567@dastard> X-ASG-Orig-Subj: Re: [RFC v2 PATCH 03/10] block: add block_device_operations methods to set and get reserved space References: <1460479373-63317-1-git-send-email-bfoster@redhat.com> <1460479373-63317-4-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460479373-63317-4-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1460594116 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28717 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Apr 12, 2016 at 12:42:46PM -0400, Brian Foster wrote: > From: Mike Snitzer > > [BF: > - Killed wrapper functions. > - Condensed to single bdev op.] > > Signed-off-by: Mike Snitzer > --- > include/linux/blkdev.h | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h > index 669e419..6c6ea96 100644 > --- a/include/linux/blkdev.h > +++ b/include/linux/blkdev.h > @@ -1650,6 +1650,10 @@ struct blk_dax_ctl { > pfn_t pfn; > }; > > +#define BDEV_RES_GET 0 > +#define BDEV_RES_MOD (1 << 0) > +#define BDEV_RES_PROVISION (1 << 1) > + > struct block_device_operations { > int (*open) (struct block_device *, fmode_t); > void (*release) (struct gendisk *, fmode_t); > @@ -1667,6 +1671,8 @@ struct block_device_operations { > int (*getgeo)(struct block_device *, struct hd_geometry *); > /* this callback is with swap_lock and sometimes page table lock held */ > void (*swap_slot_free_notify) (struct block_device *, unsigned long); > + int (*reserve_space) (struct block_device *, int, sector_t, sector_t, > + sector_t *); > struct module *owner; > const struct pr_ops *pr_ops; You know, I'm now wondering how much of this has overlap with the iomap interface we are adding for the VFS IO paths to map and allocate extents.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From EricShang@zhaoxin.com Wed Apr 13 21:03:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CD09B7CA2 for ; Wed, 13 Apr 2016 21:03:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 418F6AC005 for ; Wed, 13 Apr 2016 19:03:13 -0700 (PDT) X-ASG-Debug-ID: 1460599376-04bdf011024d09e0001-NocioJ Received: from ZXSHCAS01.zhaoxin.com ([180.169.121.82]) by cuda.sgi.com with ESMTP id 5H5agdSEmPv2aWqj (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 19:02:59 -0700 (PDT) X-Barracuda-Envelope-From: EricShang@zhaoxin.com X-Barracuda-Apparent-Source-IP: 180.169.121.82 Received: from ZXSHMBX02.zhaoxin.com ([fe80::79f8:fe39:431e:beb8]) by ZXSHCAS01.zhaoxin.com ([::1]) with mapi id 14.03.0266.001; Thu, 14 Apr 2016 10:02:19 +0800 From: Eric Shang To: Toshi Kani , Matthew Wilcox CC: "akpm@linux-foundation.org" , "dan.j.williams@intel.com" , "viro@zeniv.linux.org.uk" , "ross.zwisler@linux.intel.com" , "kirill.shutemov@linux.intel.com" , "david@fromorbit.com" , "jack@suse.cz" , "tytso@mit.edu" , "adilger.kernel@dilger.ca" , "linux-nvdimm@lists.01.org" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-kernel@vger.kernel.org" Subject: =?utf-8?B?562U5aSNOiBleHQ0IGVycm9y?= Thread-Topic: ext4 error X-ASG-Orig-Subj: =?utf-8?B?562U5aSNOiBleHQ0IGVycm9y?= Thread-Index: AQHRlY9dNaCFWilxVEKHk4Jt5qZ+V5+ItrDg Date: Thu, 14 Apr 2016 02:02:18 +0000 Message-ID: <0255994B402DE243B1DFC1057A00655201AE84@ZXSHMBX02.zhaoxin.com> References: <0255994B402DE243B1DFC1057A00655201AC6F@ZXSHMBX02.zhaoxin.com> <1460556627.24985.28.camel@hpe.com> In-Reply-To: <1460556627.24985.28.camel@hpe.com> Accept-Language: zh-CN, en-US Content-Language: zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.30.24.50] Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-Barracuda-Connect: UNKNOWN[180.169.121.82] X-Barracuda-Start-Time: 1460599379 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.12 X-Barracuda-Spam-Status: No, SCORE=0.12 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_MV0113c, RDNS_NONE, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28719 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MV0113c BSF_SC0_MV0113c 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS SGkgVG9zaGk6DQoJVGhhbmtzISBJIHRoaW5rIHRoaXMgbm90IHJlbGF0ZSB0byBEQVggYW5kIGRh eF9nZXRfdW5tYXBwZWRfYXJlYSwgSSBhbSBhIGp1bmlvciBrZXJuZWwgbWFpbnRhaW5lciBmb3Ig b3VyIGNvbXBhbnkuIFRoaXMgaXNzdWUgYm90aGVyIG1lIGxvbmcgdGltZSwgbG9va3MgbGlrZSBr ZXJuZWwgZXh0NCBpc3N1ZSBvciBvdXIgZW1tYyBkcml2ZXIgaXNzdWUsIEkgd2lsbCBkaWcgaXQg b3V0LCBUaGFua3MhDQoNCkJlc3QgUmVnYXJkcw0KRXJpY1NoYW5nDQoNCg0KLS0tLS3pgq7ku7bl jp/ku7YtLS0tLQ0K5Y+R5Lu25Lq6OiBUb3NoaSBLYW5pIFttYWlsdG86dG9zaGkua2FuaUBocGUu Y29tXSANCuWPkemAgeaXtumXtDogMjAxNuW5tDTmnIgxM+aXpSAyMjoxMA0K5pS25Lu25Lq6OiBF cmljIFNoYW5nOyBNYXR0aGV3IFdpbGNveA0K5oqE6YCBOiBha3BtQGxpbnV4LWZvdW5kYXRpb24u b3JnOyBkYW4uai53aWxsaWFtc0BpbnRlbC5jb207IHZpcm9AemVuaXYubGludXgub3JnLnVrOyBy b3NzLnp3aXNsZXJAbGludXguaW50ZWwuY29tOyBraXJpbGwuc2h1dGVtb3ZAbGludXguaW50ZWwu Y29tOyBkYXZpZEBmcm9tb3JiaXQuY29tOyBqYWNrQHN1c2UuY3o7IHR5dHNvQG1pdC5lZHU7IGFk aWxnZXIua2VybmVsQGRpbGdlci5jYTsgbGludXgtbnZkaW1tQGxpc3RzLjAxLm9yZzsgbGludXgt ZnNkZXZlbEB2Z2VyLmtlcm5lbC5vcmc7IGxpbnV4LWV4dDRAdmdlci5rZXJuZWwub3JnOyB4ZnNA b3NzLnNnaS5jb207IGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcNCuS4u+mimDogUmU6IGV4 dDQgZXJyb3INCg0KT24gV2VkLCAyMDE2LTA0LTEzIGF0IDEzOjQ0ICswMDAwLCBFcmljIFNoYW5n IHdyb3RlOg0KPiBISSBBbGw6DQo+IMKgIEkgbWVldCBhbiBleHQ0IGVycm9yLCBmb2xsb3dpbmcg aXMgdGhlIGVycm9yIGxvZy4gQWZ0ZXIgcGFuaWMsIEkgDQo+IGNoZWNrIHRoZSBlbW1jIGJ5IHRo ZSB0b29sIGRlYnVmcywgdGhlIGlub2RlIDY5ODc4IGlfbmxpbmsgaXMgbm90IA0KPiB6ZXJvLiBB bmQgdGhpcyBpbm9kZSBkb24ndCBiZWxvbmcgdG8gcGFyZW50IGRpciA2OTg3LCBpdCBiZWxvbmcg dG8gDQo+IG90aGVyIGZpbGUodGhpcyBpbm9kZSBiZWxvbmcgdG8gdHdvIGZpbGVzIHdoZW4gY2hl Y2sgYnkgZGVidWdmcyANCj4gbmNoZWNrKSwgSSBndWVzcyB0aGFuIHRoaXMgaW5vZGUgaGFzIGJl ZWQgZGVsZXRlZCBpbiBtZW1vcnkgYW5kIA0KPiBhbHJlYWR5IHVzZWQgYnkgb3RoZXIgZmlsZS4g QnV0IHRoZSBwYXJlbnQgZGVudHJ5IGJ1ZmZfaGVhZCBub3QgZmx1c2ggDQo+IHRvIGVtbWMuIEJ1 dCB3aGVuIGxvb2t1cCB0aGlzIGRlbnRyeSBjYW4ndCBmaW5kIGl0JyBpbiBkZW50cnkgY2FjaGUs IA0KPiBhbmQgdGhlbiBsb29rdXBfcmVhbCwgcmVhZCB0aGUgZGVudHJ5IGZyb20gZW1tYywgZ2V0 IHRoZSBmaWxlIGlub2RlIHdoaWNoIGFscmVhZHkgYmUgZGVsZXRlZC4NCj4gwqAgQ2FuIGFueSBn aXZlIG1lIHNvbWUgaGVscCBob3cgdG8gY2hlY2sgdGhpcyBpc3N1ZS4gTXkga2VybmVsIHZlcnNp b24gDQo+IGlzIDMuMTggZm9ybSBBbmRyb2lkIC4gSSB0aGlua3Mgc29tZXRoaW5nIHdyb25nIHdp dGggZGVudHJ5IGNhY2hlIA0KPiBmbHVzaCBhbmQgZGlydHkgYnVmZl9oZWFkIGZsdXNoIHRvIGVt bWMuIFRoYW5rcyBhbGwhDQoNCkFyZSB5b3Ugc29tZWhvdyB1c2luZyBEQVggYW5kIG15IGRheF9n ZXRfdW5tYXBwZWRfYXJlYSBwYXRjaGVzIGluIHlvdXIgQW5kcm9pZA0KMy4xOCBrZXJuZWw/IEkg ZG91YnQgdGhpcyBpcyB0aGUgY2FzZSwgYnV0IEkgdGhvdWdodCBJIHNob3VsZCBjaGVjayBzaW5j ZSB5b3UgcmVwb3J0ZWQgaXQgdG8gbWUgYW5kIE1hdHRoZXcgd2l0aCB0aGUgc2FtZSBjYyBsaXN0 Lg0KDQpJZiB5b3UgYXJlIHNpbXBseSB1c2luZyBhIGRpc3RyaWJ1dGVkIEFuZHJvaWQga2VybmVs LCB5b3Ugc2hvdWxkIHJlcG9ydCBpdCB0byBBbmRyb2lkIGVtYWlsIGxpc3Qgb3IgYnVnIHRyYWNr ZXIuDQoNCi1Ub3NoaQ0K From tytso@thunk.org Wed Apr 13 22:22:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E49997CA0 for ; Wed, 13 Apr 2016 22:22:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B51B2304032 for ; Wed, 13 Apr 2016 20:22:19 -0700 (PDT) X-ASG-Debug-ID: 1460604136-04cb6c24624d3770001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id L6i6GtMXSHWxhrGu (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 13 Apr 2016 20:22:17 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=CKMEtcyWJqBOLNRhjsL6RxQYAAqN1zm+M5MwoqRJ/YY=; b=eOcbZV1Z5HbJ1iGsVI5W3OxMsN/XYvqVxo4AvrTl2+KtRR5OG5q//hPmhz+5jZKZvppBgF/i4UUw2XeXH1kb/nfXevrX+3bqu6qKiiXraMfl9+MoKE0f/qArIeflAVyRezneF3dxttOtKGK7pBzE1X2BrQK4m7oNB9jSZxnmwsc=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.84) (envelope-from ) id 1aqXr5-0003v8-W6; Thu, 14 Apr 2016 03:22:08 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 1258D8281BB; Wed, 13 Apr 2016 23:22:07 -0400 (EDT) Date: Wed, 13 Apr 2016 23:22:07 -0400 From: Theodore Ts'o To: Eric Shang Cc: Matthew Wilcox , Toshi Kani , "akpm@linux-foundation.org" , "dan.j.williams@intel.com" , "viro@zeniv.linux.org.uk" , "ross.zwisler@linux.intel.com" , "kirill.shutemov@linux.intel.com" , "david@fromorbit.com" , "jack@suse.cz" , "adilger.kernel@dilger.ca" , "linux-nvdimm@lists.01.org" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-kernel@vger.kernel.org" Subject: Re: ext4 error Message-ID: <20160414032207.GC16656@thunk.org> X-ASG-Orig-Subj: Re: ext4 error Mail-Followup-To: Theodore Ts'o , Eric Shang , Matthew Wilcox , Toshi Kani , "akpm@linux-foundation.org" , "dan.j.williams@intel.com" , "viro@zeniv.linux.org.uk" , "ross.zwisler@linux.intel.com" , "kirill.shutemov@linux.intel.com" , "david@fromorbit.com" , "jack@suse.cz" , "adilger.kernel@dilger.ca" , "linux-nvdimm@lists.01.org" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-kernel@vger.kernel.org" References: <0255994B402DE243B1DFC1057A00655201AC6F@ZXSHMBX02.zhaoxin.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <0255994B402DE243B1DFC1057A00655201AC6F@ZXSHMBX02.zhaoxin.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1460604137 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28720 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Wed, Apr 13, 2016 at 01:44:55PM +0000, Eric Shang wrote: > HI All: > I meet an ext4 error, following is the error log. After panic, I check the emmc by the tool debufs, the inode 69878 i_nlink is not zero. And this inode don't belong to parent dir 6987, it belong to other file(this inode belong to two files when check by debugfs ncheck), I guess than this inode has beed deleted in memory and already used by other file. But the parent dentry buff_head not flush to emmc. But when lookup this dentry can't find it' in dentry cache, and then lookup_real, read the dentry from emmc, get the file inode which already be deleted. > Can any give me some help how to check this issue. My kernel version is 3.18 form Android . I thinks something wrong with dentry cache flush and dirty buff_head flush to emmc. Thanks all! If I had to guess, this was caused starting with a corrupted file system, where the inode allocation bitmap showed that an inode which was in use by the file system, was erroneously showing it as free. This allowed it to be allocated for use in a second file (which would have wiped out the contents for the original file stored at that inode). Later on, the file was deleted via either the older or newer pathname, which dropped the ref count to zero, and then an access via the other pathname would have resulted in this error. After the panic, the on-disk data structures wouldn't have been updated from whatever the in-memory data structures might have been ("Kernel panic - not syncing"). So what you see from using debugfs after the crash might not be represenatative of what you saw before the crash. I'm not sure there's much debugging that can be done, because there are any number of sources for the original corruption. It could be caused by a hardware issue in the flash or the memory, or it could be caused by a wild pointer corrupting a disk buffer, etc. etc. The panic won't result in a useful stack trace because that's when the problem was *noticed*. But that's very different from where the file system corruption was *introduced*. If you can reliably reproduce this sort of failure, then it becomes possible to try to track it down. But if it's a one-off event, there's not much anyone can do. Best regards, - Ted From tireman@shaw.ca Wed Apr 13 23:31:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 938067CA0 for ; Wed, 13 Apr 2016 23:31:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5564A304039 for ; Wed, 13 Apr 2016 21:31:43 -0700 (PDT) X-ASG-Debug-ID: 1460608292-04cbb02e1d1d6240001-NocioJ Received: from smtp-out-no.shaw.ca (smtp-out-no.shaw.ca [64.59.134.12]) by cuda.sgi.com with ESMTP id RE5XQOF3TkQ2uXaZ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 21:31:34 -0700 (PDT) X-Barracuda-Envelope-From: tireman@shaw.ca X-Barracuda-Apparent-Source-IP: 64.59.134.12 Received: from [192.168.0.2] ([174.5.126.242]) by shaw.ca with SMTP id qYwEaQkFFUnqMqYwFajxFs; Wed, 13 Apr 2016 22:31:32 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=shaw.ca; s=s20150330; t=1460608292; bh=ClisB43mlbZ7IJk2vENXmuAYqUgXc7Si2ZB3nm2VFvU=; h=Subject:To:References:Cc:From:Date:In-Reply-To; b=c638j7tJqKJDcHQrCR+2JwQK8ohmPXT2kUD+FMt4Rf1YRRtRg9jTmQv3MbnnbSz6d SnWRmdvAui+qE5rbZPLWRXlUnL1KiOXKVg9Xjh+6vbpb2huHWTSTAaCILn5p0SARE7 SOrxIsol6YBjtrCsOyj8oGUEWqVVQ6bHsa/ckIUTPrmQBs9m12WRN+gTpoYyc1OnWL gpUc01UrrPFx61RGUCm3n8R1mKqBQ681eORIQay010qz6cau/jPR3Ml1tUjNAOXd0G 1AqmFbOgJgUwzLx6kiRKAWaDdfZulfaYNGr6j9jP/depQEHsGwaR9yuIm/3gX7fjVE YvTmWsHGEEgzQ== X-Authority-Analysis: v=2.2 cv=bJxUG72Z c=1 sm=1 tr=0 a=YUpam8ogUlPMk4SS6ACeKg==:117 a=YUpam8ogUlPMk4SS6ACeKg==:17 a=N659UExz7-8A:10 a=NMgbMNkgAAAA:8 a=eJfxgxciAAAA:8 a=uS4Csbc7wgCQGbGzCqoA:9 a=jkGYERCmKTau7NbJ:21 a=R2U1X0S3DmuC9fQ-:21 a=c-n1mORCtGMA:10 Subject: Re: xfs_repair fails after trying to format log cycle? To: Brian Foster X-ASG-Orig-Subj: Re: xfs_repair fails after trying to format log cycle? References: <56F6DE67.60403@shaw.ca> <20160328085541.GA27040@bfoster.bfoster> <570C8D4D.3060304@shaw.ca> <20160412140512.GA59690@bfoster.bfoster> <570D578D.5010706@shaw.ca> <20160413121214.GA2775@bfoster.bfoster> <570EC95F.2010401@shaw.ca> Cc: xfs@oss.sgi.com From: Andrew Ryder Message-ID: <570F1D44.6090509@shaw.ca> Date: Thu, 14 Apr 2016 00:32:04 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <570EC95F.2010401@shaw.ca> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-CMAE-Envelope: MS4wfAn9sp0adL8d/fT5S1QOkxwKc7Wx10locoC6mJ4HT9LsiuThfopODfr7Olc21lV6JJAQKp0EwW5g6KJyfNi9+X6qp0P+sIXeRTKg9wnVqHS/4XMqWnFP BJHdYQ5E6xBADr5yud77GCRwWp9cohLPlZdQLsWySds+KGMAQmpXjF/X4xxsXtSNhjmMBEj2UeWz4A== X-Barracuda-Connect: smtp-out-no.shaw.ca[64.59.134.12] X-Barracuda-Start-Time: 1460608294 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28721 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 Quick update. I re-partitioned the one different disk in the array then re-added it, and lo-and-behold the taskfile error comes up again from the highpoint card/driver. So I'll see if this cures anything. For anyone else who ever purchases a Highpoint RR2722 card.. I'll share this bit of "fun" I had last year with their support and the Hitatchi sata drives I was trying to use on it.. Highpoints driver for linux as I've come to learn hard codes a queue_depth of 64 into its driver, after much frustration I ended up re-compiling the driver to use a queue depth of 15 which solved my problems in the end or setting it to 1 (with a big performance hit). Otherwise at random times something fumbles and the annoying and frustrating errors spew out, which I've learnt aren't hardware or cabling/enclosure power supply related at all and probably cost me 2 new backplanes I didn't need. [515565.179581] rr272x_1x:Task file error, StatusReg=0x51, ErrReg=0x84, LBA[0-3]=0xab812f,LBA[4-7]=0x0. [515566.321940] scsi_io_completion: 9 callbacks suppressed [515566.321951] sd 6:0:2:0: [sdh] FAILED Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK [515566.321956] sd 6:0:2:0: [sdh] CDB: [515566.321959] Read(10): 28 00 00 ab 86 a0 00 00 80 00 [515566.321972] blk_update_request: 9 callbacks suppressed [515566.321976] blk_update_request: I/O error, dev sdh, sector 11241120 [515566.321981] raid5_end_read_request: 250 callbacks suppressed [515566.321985] md/raid:md2: read error not correctable (sector 11239072 on sdh1). [515566.321989] md/raid:md2: read error not correctable (sector 11239080 on sdh1). [515566.321992] md/raid:md2: read error not correctable (sector 11239088 on sdh1). [515566.321996] md/raid:md2: read error not correctable (sector 11239096 on sdh1). [515566.321999] md/raid:md2: read error not correctable (sector 11239104 on sdh1). [515566.322002] md/raid:md2: read error not correctable (sector 11239112 on sdh1). [515566.322006] md/raid:md2: read error not correctable (sector 11239120 on sdh1). [515566.322009] md/raid:md2: read error not correctable (sector 11239128 on sdh1). [515566.322013] md/raid:md2: read error not correctable (sector 11239136 on sdh1). [515566.322016] md/raid:md2: read error not correctable (sector 11239144 on sdh1). [515566.322050] sd 6:0:3:0: [sdi] FAILED Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK [515566.322054] sd 6:0:3:0: [sdi] CDB: [515566.322056] Write(10): 2a 00 00 ab 81 20 00 00 80 00 [515566.322067] blk_update_request: I/O error, dev sdi, sector 11239712 [515566.322111] sd 6:0:4:0: [sdj] FAILED Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK [515566.322115] sd 6:0:4:0: [sdj] CDB: [515566.322118] Read(10): 28 00 00 ab 82 a0 00 00 80 00 [515566.322134] blk_update_request: I/O error, dev sdj, sector 11240096 [515566.322174] sd 6:0:4:0: [sdj] FAILED Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK [515566.322179] sd 6:0:4:0: [sdj] CDB: [515566.322182] Read(10): 28 00 00 ab 82 20 00 00 80 00 [515566.322197] blk_update_request: I/O error, dev sdj, sector 11239968 [515566.322225] sd 6:0:5:0: [sdk] FAILED Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK [515566.322229] sd 6:0:5:0: [sdk] CDB: [515566.322231] Read(10): 28 00 00 ab 87 a0 00 00 80 00 [515566.322242] blk_update_request: I/O error, dev sdk, sector 11241376 [515566.322275] sd 6:0:5:0: [sdk] FAILED Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK [515566.322278] sd 6:0:5:0: [sdk] CDB: [515566.322280] Read(10): 28 00 00 ab 88 20 00 00 80 00 [515566.322290] blk_update_request: I/O error, dev sdk, sector 11241504 [515566.322321] sd 6:0:5:0: [sdk] FAILED Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK [515566.322325] sd 6:0:5:0: [sdk] CDB: [515566.322327] Read(10): 28 00 00 ab 87 20 00 00 80 00 [515566.322337] blk_update_request: I/O error, dev sdk, sector 11241248 [515810.459601] rr272x_1x:Task file error, StatusReg=0x51, ErrReg=0x84, LBA[0-3]=0x222b9cf,LBA[4-7]=0x0. [515810.459716] sd 6:0:3:0: [sdi] FAILED Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK [515810.459725] sd 6:0:3:0: [sdi] CDB: [515810.459729] Write(10): 2a 00 02 22 b9 80 00 00 80 00 [515810.459760] blk_update_request: I/O error, dev sdi, sector 35830144 [515810.459792] sd 6:0:3:0: [sdi] FAILED Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK [515810.459796] sd 6:0:3:0: [sdi] CDB: [515810.459798] Write(10): 2a 00 02 22 ba 00 00 00 80 00 [515810.459809] blk_update_request: I/O error, dev sdi, sector 35830272 So I've ended up now forcing the queue_depth to a max of 15 or lower which seems to minimize or eliminate the issue, which is most present under heavy i/o.. The line to edit is found in the extracted driver package "makeself-22854-20150421040904/inc/linux_64mpa/osm.h" file and modifying the "#define os_max_queue_comm" line from a value of 64 to 15 or 1. and to top it off, after checking Highpoints website for card BIOS updates.. I learn that if your using this card, there are 3 different bios packages and according to their docs the default RAID bios should not be used when using sata port-multiplier functions. So maybe thats part of the above issue and my issue.. I guess I have my entertainment for the next week here troubleshooting. http://www.highpoint-tech.com/PDF/rr2700/RocketRAID_2700_Series_How_to_Choose_Bios_Package_Guide.pdf Hopefully this might be of use to someone else down the road... Andrew On 04/13/2016 06:34 PM, Andrew Ryder wrote: > That seems to make sense. I've started a check of the array and see what > happens. I don't believe its a hardware error as neither sata pmp > controller I have it on logs any hardware/cabling related errors at all. > > Thanks for the help so far. I'll let you know how I make out if I ever > figure out where the gremlins are hiding.. > > On 04/13/2016 08:12 AM, Brian Foster wrote: >> On Tue, Apr 12, 2016 at 04:16:13PM -0400, Andrew Ryder wrote: >>> On 04/12/2016 10:05 AM, Brian Foster wrote: >>>> On Tue, Apr 12, 2016 at 01:53:17AM -0400, Andrew Ryder wrote: >>>>> >>>>> >>>>> On 03/28/2016 04:55 AM, Brian Foster wrote: >> ... >>>> What happens if you manually issue the read call that failed? E.g., >>>> umount the filesystem and run the following command directly against >>>> the >>>> array: >>>> >>>> xfs_io -dc "pread 3001552175104 2097152" /dev/md2 >>>> >>>> Brian >>> >>> It failed with the same error. I've attached the strace output for the >>> command. >>> >> >> Thanks, well that is interesting. The larger 2MB read eventually results >> in this smaller (4k) read that fails: >> >> 16:02:14.221784 pread64(3, 0x1ce7000, 4096, 3001553125376) = -1 EIO >> (Input/output error) >> >> So you could repeat that command with offset 3001553125376 and size 4k >> and just confirm that still fails. As Dave points out, something is >> wrong with the storage here and that is what needs to be resolved. >> >> With regard to the xfs_repair behavior... you're initially hitting a >> read error when the filesystem scans through the log looking for the >> head and tail to determine whether the log is dirty. If the log is >> zeroed, this sequence can be bypassed and the log assumed clean. I >> suspect by zeroing enough of the log before it fails, your repair >> sequence is just bypassing the log head/tail discovery that previously >> scanned areas of the disk that are having issues. In other words, it's >> just temporarily stepping around the problem until the log progresses >> back to this address range. >> >> What you probably have to do at this point is use the simple I/O error >> reproducer you have to try and determine why the storage returns an >> error. It could be anywhere from something broken in the md subsystem, >> to the controller driver, to a physical problem with the associated >> disk. I'd suggest to start by reporting to the md mailing list and work >> down from there... >> >> Brian >> >>> The array is fairly full so I'm wondering if something is out of >>> alignment >>> somewhere thats causing this? >>> >>> /dev/md2 5858060288 5245630392 612429896 90% /mnt/md2 >>> >>> When I had the array plugged into another controller which isn't a >>> rocketraid card, it did complain about all the drives not being aligned >>> properly? Somehow it looks like sdk wasn't partitioned the same as >>> the rest, >>> I'm wondering if thats screwing things up? >>> >>> GNU Parted 3.2 >>> Using /dev/sdi >>> Welcome to GNU Parted! Type 'help' to view a list of commands. >>> (parted) p >>> Model: ATA ST2000NC000-1CX1 (scsi) >>> Disk /dev/sdi: 2000GB >>> Sector size (logical/physical): 512B/512B >>> Partition Table: gpt >>> Disk Flags: >>> >>> Number Start End Size File system Name Flags >>> 1 1049kB 2000GB 2000GB >>> Number Start End Size File system Name Flags >>> 1 2048s 3907028991s 3907026944s >>> >>> >>> GNU Parted 3.2 >>> Using /dev/sdk >>> Welcome to GNU Parted! Type 'help' to view a list of commands. >>> (parted) p >>> Model: ATA ST2000DL001-9VT1 (scsi) >>> Disk /dev/sdk: 2000GB >>> Sector size (logical/physical): 512B/512B >>> Partition Table: msdos >>> Disk Flags: >>> >>> Number Start End Size Type File system Flags >>> 1 512B 2000GB 2000GB primary raid >>> Number Start End Size Type File system Flags >>> 1 1s 3907029167s 3907029167s primary raid >>> >>> >>> GNU Parted 3.2 >>> Using /dev/sdh >>> Welcome to GNU Parted! Type 'help' to view a list of commands. >>> (parted) p >>> Model: ATA ST2000DL001-9VT1 (scsi) >>> Disk /dev/sdh: 2000GB >>> Sector size (logical/physical): 512B/512B >>> Partition Table: gpt >>> Disk Flags: >>> >>> Number Start End Size File system Name Flags >>> 1 1049kB 2000GB 2000GB >>> Number Start End Size File system Name Flags >>> 1 2048s 3907028991s 3907026944s >>> >>> >>> GNU Parted 3.2 >>> Using /dev/sdm >>> Welcome to GNU Parted! Type 'help' to view a list of commands. >>> (parted) p >>> Model: ATA ST2000NC000-1CX1 (scsi) >>> Disk /dev/sdm: 2000GB >>> Sector size (logical/physical): 512B/512B >>> Partition Table: gpt >>> Disk Flags: >>> >>> Number Start End Size File system Name Flags >>> 1 1049kB 2000GB 2000GB >>> Number Start End Size File system Name Flags >>> 1 2048s 3907028991s 3907026944s >>> >>> >>> >>>> >>>>> >>>>> This all began when the RR2722 driver running under 3.18.15 >>>>> complained and >>>>> .. >>>>> >>>>> Mar 14 07:23:07 Bigmouth kernel: [7177248.090541] /dev/vmnet: port >>>>> on hub 0 >>>>> successfully opened >>>>> Mar 14 07:26:03 Bigmouth kernel: [7177424.552323] device eth1 left >>>>> promiscuous mode >>>>> Mar 14 07:26:03 Bigmouth kernel: [7177424.552786] bridge-eth1: >>>>> disabled >>>>> promiscuous mode >>>>> Mar 14 20:10:20 Bigmouth kernel: [7223317.069464] rr272x_1x:Task >>>>> file error, >>>>> StatusReg=0x51, ErrReg=0x84, LBA[0-3]=0x747dc92f,LBA[4-7]=0x0. >>>>> Mar 14 20:10:20 Bigmouth kernel: [7223317.179811] sd 5:0:1:0: [sdg] >>>>> Mar 14 20:10:21 Bigmouth kernel: [7223317.690439] Result: >>>>> hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK >>>>> Mar 14 20:10:21 Bigmouth kernel: [7223317.700480] sd 5:0:1:0: [sdg] >>>>> CDB: >>>>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211147] Write(10): 2a 00 >>>>> 74 7d c9 >>>>> 00 00 00 40 00 >>>>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211167] >>>>> blk_update_request: I/O >>>>> error, dev sdg, sector 1954400512 >>>>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211203] sd 5:0:3:0: [sdi] >>>>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211206] Result: >>>>> hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK >>>>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211209] sd 5:0:3:0: [sdi] >>>>> CDB: >>>>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211211] Write(10): 2a 00 >>>>> 74 7d c9 >>>>> 00 00 00 40 00 >>>>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211223] >>>>> blk_update_request: I/O >>>>> error, dev sdi, sector 1954400512 >>>>> Mar 14 20:10:23 Bigmouth kernel: [7223319.957052] XFS (md2): >>>>> metadata I/O >>>>> error: block 0x15d6d4900 ("xlog_iodone") error 5 numblks 64 >>>>> Mar 14 20:10:23 Bigmouth kernel: [7223319.957064] XFS (md2): >>>>> xfs_do_force_shutdown(0x2) called from line 1181 of file >>>>> fs/xfs/xfs_log.c. >>>>> Return address = 0xffffffff812fdf96 >>>>> Mar 14 20:10:23 Bigmouth kernel: [7223319.957080] XFS (md2): Log >>>>> I/O Error >>>>> Detected. Shutting down filesystem >>>>> Mar 14 20:10:23 Bigmouth kernel: [7223319.957083] XFS (md2): Please >>>>> umount >>>>> the filesystem and rectify the problem(s) >>>>> Mar 14 20:10:23 Bigmouth kernel: [7223319.957093] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:10:50 Bigmouth kernel: [7223347.087272] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:11:20 Bigmouth kernel: [7223377.190469] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:11:50 Bigmouth kernel: [7223407.293952] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:12:20 Bigmouth kernel: [7223437.397444] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:12:23 Bigmouth kernel: [7223439.791407] nfsd: last server >>>>> has >>>>> exited, flushing export cache >>>>> Mar 14 20:12:50 Bigmouth kernel: [7223467.500928] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:13:20 Bigmouth kernel: [7223497.604420] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:13:50 Bigmouth kernel: [7223527.707899] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:14:21 Bigmouth kernel: [7223557.811399] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:14:51 Bigmouth kernel: [7223587.914932] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:15:21 Bigmouth kernel: [7223618.018362] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:15:51 Bigmouth kernel: [7223648.121779] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:16:19 Bigmouth kernel: [7223676.401069] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:16:21 Bigmouth kernel: [7223678.225334] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:16:27 Bigmouth kernel: [7223684.541305] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:16:27 Bigmouth kernel: [7223684.572176] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:16:38 Bigmouth kernel: [7223694.918565] md2: unknown >>>>> partition >>>>> table >>>>> Mar 14 20:16:43 Bigmouth kernel: [7223700.425290] XFS (md2): >>>>> Mounting V5 >>>>> Filesystem >>>>> Mar 14 20:16:43 Bigmouth kernel: [7223700.545669] XFS (md2): Starting >>>>> recovery (logdev: internal) >>>>> Mar 14 20:16:44 Bigmouth kernel: [7223701.874245] XFS (md2): Ending >>>>> recovery >>>>> (logdev: internal) >>>>> Mar 14 20:30:31 Bigmouth kernel: [7224529.528678] md2: unknown >>>>> partition >>>>> table >>>>> >>>>> >>>>> >>>>> /dev/md2: >>>>> Version : 1.2 >>>>> Creation Time : Tue Oct 13 22:21:27 2015 >>>>> Raid Level : raid5 >>>>> Array Size : 5860147200 (5588.67 GiB 6000.79 GB) >>>>> Used Dev Size : 1953382400 (1862.89 GiB 2000.26 GB) >>>>> Raid Devices : 4 >>>>> Total Devices : 4 >>>>> Persistence : Superblock is persistent >>>>> >>>>> Intent Bitmap : Internal >>>>> >>>>> Update Time : Tue Apr 12 01:19:43 2016 >>>>> State : clean >>>>> Active Devices : 4 >>>>> Working Devices : 4 >>>>> Failed Devices : 0 >>>>> Spare Devices : 0 >>>>> >>>>> Layout : left-symmetric >>>>> Chunk Size : 512K >>>>> >>>>> Name : Bigmouth:2 (local to host Bigmouth) >>>>> UUID : ed979276:3459155c:a32f63da:0c684042 >>>>> Events : 62846 >>>>> >>>>> Number Major Minor RaidDevice State >>>>> 5 8 193 0 active sync /dev/sdm1 >>>>> 6 8 129 1 active sync /dev/sdi1 >>>>> 2 8 177 2 active sync /dev/sdl1 >>>>> 4 8 113 3 active sync /dev/sdh1 >>>>> >>>>> >>>>> meta-data=/dev/md2 isize=512 agcount=33, >>>>> agsize=45782272 >>>>> blks >>>>> = sectsz=512 attr=2, projid32bit=1 >>>>> = crc=1 finobt=1 spinodes=0 >>>>> data = bsize=4096 blocks=1465036800, >>>>> imaxpct=5 >>>>> = sunit=128 swidth=384 blks >>>>> naming =version 2 bsize=4096 ascii-ci=0 ftype=1 >>>>> log =internal bsize=4096 blocks=521728, version=2 >>>>> = sectsz=512 sunit=8 blks, >>>>> lazy-count=1 >>>>> realtime =none extsz=4096 blocks=0, rtextents=0 >>>>> >>>>> >>>>>> >>>>>>> >>>>>>> Checking the drives with smartctl shows no errors nor does >>>>>>> 'dmesg' show any >>>>>>> hardware i/o or controller related errors... >>>>>>> >>>>>>> I've tried scrubbing the array and no bad sectors are found either.. >>>>>>> >>>>>>> I'm running kernel 3.19.8 with xfsprogs 4.5. >>>>>>> >>>>>>> Thanks, >>>>>>> Andrew >>>>>>> >>>>>>> _______________________________________________ >>>>>>> xfs mailing list >>>>>>> xfs@oss.sgi.com >>>>>>> http://oss.sgi.com/mailman/listinfo/xfs >>>>>> >>>> >> >>> 16:02:14.159324 execve("/usr/sbin/xfs_io", ["xfs_io", "-dc", "pread >>> 3001552175104 2097152", "/dev/md2"], [/* 51 vars */]) = 0 >>> 16:02:14.160220 brk(NULL) = 0x1ce4000 >>> 16:02:14.160345 mmap(NULL, 4096, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e4a2000 >>> 16:02:14.160508 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No >>> such file or directory) >>> 16:02:14.160626 open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 >>> 16:02:14.160707 fstat(3, {st_mode=S_IFREG|0644, st_size=246250, ...}) >>> = 0 >>> 16:02:14.160791 mmap(NULL, 246250, PROT_READ, MAP_PRIVATE, 3, 0) = >>> 0x7f1c5e458000 >>> 16:02:14.160862 close(3) = 0 >>> 16:02:14.160959 open("/usr/lib64/libxcmd.so.0", O_RDONLY|O_CLOEXEC) = 3 >>> 16:02:14.161037 read(3, >>> "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@\37\0\0\0\0\0\0"..., >>> 832) = 832 >>> 16:02:14.161111 fstat(3, {st_mode=S_IFREG|0755, st_size=26832, ...}) = 0 >>> 16:02:14.161184 mmap(NULL, 2128384, PROT_READ|PROT_EXEC, >>> MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c5e070000 >>> 16:02:14.161254 mprotect(0x7f1c5e076000, 2093056, PROT_NONE) = 0 >>> 16:02:14.161325 mmap(0x7f1c5e275000, 8192, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5000) = 0x7f1c5e275000 >>> 16:02:14.161438 mmap(0x7f1c5e277000, 2560, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e277000 >>> 16:02:14.161525 close(3) = 0 >>> 16:02:14.161605 open("/lib64/libhandle.so.1", O_RDONLY|O_CLOEXEC) = 3 >>> 16:02:14.161683 read(3, >>> "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\17\0\0\0\0\0\0"..., >>> 832) = 832 >>> 16:02:14.161755 fstat(3, {st_mode=S_IFREG|0755, st_size=14224, ...}) = 0 >>> 16:02:14.161826 mmap(NULL, 2113800, PROT_READ|PROT_EXEC, >>> MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c5de68000 >>> 16:02:14.161896 mprotect(0x7f1c5de6b000, 2093056, PROT_NONE) = 0 >>> 16:02:14.161965 mmap(0x7f1c5e06a000, 8192, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f1c5e06a000 >>> 16:02:14.162049 mmap(0x7f1c5e06c000, 264, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e06c000 >>> 16:02:14.162131 close(3) = 0 >>> 16:02:14.162210 open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 >>> 16:02:14.162287 read(3, >>> "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\7\2\0\0\0\0\0"..., >>> 832) = 832 >>> 16:02:14.162359 fstat(3, {st_mode=S_IFREG|0755, st_size=1664768, >>> ...}) = 0 >>> 16:02:14.162457 mmap(NULL, 4096, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e4a1000 >>> 16:02:14.162535 mmap(NULL, 3771992, PROT_READ|PROT_EXEC, >>> MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c5dac8000 >>> 16:02:14.162607 mprotect(0x7f1c5dc57000, 2097152, PROT_NONE) = 0 >>> 16:02:14.162679 mmap(0x7f1c5de57000, 24576, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x18f000) = 0x7f1c5de57000 >>> 16:02:14.162764 mmap(0x7f1c5de5d000, 15960, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c5de5d000 >>> 16:02:14.162849 close(3) = 0 >>> 16:02:14.162933 open("/lib64/libreadline.so.6", O_RDONLY|O_CLOEXEC) = 3 >>> 16:02:14.163013 read(3, >>> "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260d\1\0\0\0\0\0"..., >>> 832) = 832 >>> 16:02:14.163084 fstat(3, {st_mode=S_IFREG|0555, st_size=415928, ...}) >>> = 0 >>> 16:02:14.163155 mmap(NULL, 2518968, PROT_READ|PROT_EXEC, >>> MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c5d860000 >>> 16:02:14.163225 mprotect(0x7f1c5d8bd000, 2097152, PROT_NONE) = 0 >>> 16:02:14.163296 mmap(0x7f1c5dabd000, 36864, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5d000) = 0x7f1c5dabd000 >>> 16:02:14.163389 mmap(0x7f1c5dac6000, 4024, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c5dac6000 >>> 16:02:14.163482 close(3) = 0 >>> 16:02:14.163568 open("/lib64/libncurses.so.6", O_RDONLY|O_CLOEXEC) = 3 >>> 16:02:14.163645 read(3, >>> "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320W\1\0\0\0\0\0"..., >>> 832) = 832 >>> 16:02:14.163716 fstat(3, {st_mode=S_IFREG|0755, st_size=526008, ...}) >>> = 0 >>> 16:02:14.163787 mmap(NULL, 2624120, PROT_READ|PROT_EXEC, >>> MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c5d5d8000 >>> 16:02:14.163857 mprotect(0x7f1c5d654000, 2093056, PROT_NONE) = 0 >>> 16:02:14.163927 mmap(0x7f1c5d853000, 20480, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7b000) = 0x7f1c5d853000 >>> 16:02:14.164028 mmap(0x7f1c5d858000, 2680, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c5d858000 >>> 16:02:14.164113 close(3) = 0 >>> 16:02:14.164197 mmap(NULL, 4096, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e4a0000 >>> 16:02:14.164281 mmap(NULL, 4096, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e49f000 >>> 16:02:14.164355 mmap(NULL, 4096, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e49e000 >>> 16:02:14.164455 arch_prctl(ARCH_SET_FS, 0x7f1c5e49f700) = 0 >>> 16:02:14.164661 mprotect(0x7f1c5de57000, 16384, PROT_READ) = 0 >>> 16:02:14.164806 mprotect(0x7f1c5d853000, 16384, PROT_READ) = 0 >>> 16:02:14.165153 mprotect(0x7f1c5dabd000, 8192, PROT_READ) = 0 >>> 16:02:14.165231 mprotect(0x7f1c5e06a000, 4096, PROT_READ) = 0 >>> 16:02:14.165313 mprotect(0x7f1c5e275000, 4096, PROT_READ) = 0 >>> 16:02:14.165402 mprotect(0x618000, 4096, PROT_READ) = 0 >>> 16:02:14.165482 mprotect(0x7f1c5e499000, 4096, PROT_READ) = 0 >>> 16:02:14.165552 munmap(0x7f1c5e458000, 246250) = 0 >>> 16:02:14.165817 brk(NULL) = 0x1ce4000 >>> 16:02:14.165876 brk(0x1d05000) = 0x1d05000 >>> 16:02:14.165953 open("/usr/lib64/locale/locale-archive", >>> O_RDONLY|O_CLOEXEC) = 3 >>> 16:02:14.166031 fstat(3, {st_mode=S_IFREG|0644, st_size=3832592, >>> ...}) = 0 >>> 16:02:14.166103 mmap(NULL, 3832592, PROT_READ, MAP_PRIVATE, 3, 0) = >>> 0x7f1c5d230000 >>> 16:02:14.166187 close(3) = 0 >>> 16:02:14.166394 open("/dev/md2", O_RDWR|O_DIRECT) = 3 >>> 16:02:14.166498 fstatfs(3, {f_type="TMPFS_MAGIC", f_bsize=4096, >>> f_blocks=2560, f_bfree=2560, f_bavail=2560, f_files=8244585, >>> f_ffree=8243843, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, >>> f_flags=4130}) = 0 >>> 16:02:14.166583 fstat(3, {st_mode=S_IFBLK|0660, st_rdev=makedev(9, >>> 2), ...}) = 0 >>> 16:02:14.166655 fstatfs(3, {f_type="TMPFS_MAGIC", f_bsize=4096, >>> f_blocks=2560, f_bfree=2560, f_bavail=2560, f_files=8244585, >>> f_ffree=8243843, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, >>> f_flags=4130}) = 0 >>> 16:02:14.166730 fstat(3, {st_mode=S_IFBLK|0660, st_rdev=makedev(9, >>> 2), ...}) = 0 >>> 16:02:14.166822 open("/usr/share/locale/locale.alias", >>> O_RDONLY|O_CLOEXEC) = 4 >>> 16:02:14.166899 fstat(4, {st_mode=S_IFREG|0644, st_size=2997, ...}) = 0 >>> 16:02:14.166969 mmap(NULL, 4096, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e49d000 >>> 16:02:14.167040 read(4, "# Locale name alias data base.\n#"..., 4096) >>> = 2997 >>> 16:02:14.167154 read(4, "", 4096) = 0 >>> 16:02:14.167223 close(4) = 0 >>> 16:02:14.167289 munmap(0x7f1c5e49d000, 4096) = 0 >>> 16:02:14.167405 >>> open("/usr/share/locale/en_US.utf8/LC_MESSAGES/xfsprogs.mo", >>> O_RDONLY) = -1 ENOENT (No such file or directory) >>> 16:02:14.167488 >>> open("/usr/share/locale/en_US/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = >>> -1 ENOENT (No such file or directory) >>> 16:02:14.167564 >>> open("/usr/share/locale/en.utf8/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = >>> -1 ENOENT (No such file or directory) >>> 16:02:14.167637 open("/usr/share/locale/en/LC_MESSAGES/xfsprogs.mo", >>> O_RDONLY) = -1 ENOENT (No such file or directory) >>> 16:02:14.168062 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552175104) = 4096 >>> 16:02:14.168480 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552179200) = 4096 >>> 16:02:14.168744 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552183296) = 4096 >>> 16:02:14.168995 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552187392) = 4096 >>> 16:02:14.169235 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552191488) = 4096 >>> 16:02:14.169479 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552195584) = 4096 >>> 16:02:14.169717 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552199680) = 4096 >>> 16:02:14.169970 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552203776) = 4096 >>> 16:02:14.170215 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552207872) = 4096 >>> 16:02:14.170461 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552211968) = 4096 >>> 16:02:14.170700 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552216064) = 4096 >>> 16:02:14.170940 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552220160) = 4096 >>> 16:02:14.171177 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552224256) = 4096 >>> 16:02:14.171440 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552228352) = 4096 >>> 16:02:14.171680 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552232448) = 4096 >>> 16:02:14.171913 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552236544) = 4096 >>> 16:02:14.172148 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552240640) = 4096 >>> 16:02:14.172402 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552244736) = 4096 >>> 16:02:14.172652 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552248832) = 4096 >>> 16:02:14.172901 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552252928) = 4096 >>> 16:02:14.173135 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552257024) = 4096 >>> 16:02:14.173381 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552261120) = 4096 >>> 16:02:14.173626 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552265216) = 4096 >>> 16:02:14.173859 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552269312) = 4096 >>> 16:02:14.174095 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552273408) = 4096 >>> 16:02:14.174335 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552277504) = 4096 >>> 16:02:14.174591 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552281600) = 4096 >>> 16:02:14.174822 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552285696) = 4096 >>> 16:02:14.175053 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552289792) = 4096 >>> 16:02:14.175285 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552293888) = 4096 >>> 16:02:14.175528 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552297984) = 4096 >>> 16:02:14.175765 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552302080) = 4096 >>> 16:02:14.175988 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552306176) = 4096 >>> 16:02:14.176212 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552310272) = 4096 >>> 16:02:14.176596 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552314368) = 4096 >>> 16:02:14.176860 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552318464) = 4096 >>> 16:02:14.177083 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552322560) = 4096 >>> 16:02:14.177306 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552326656) = 4096 >>> 16:02:14.177535 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552330752) = 4096 >>> 16:02:14.177759 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552334848) = 4096 >>> 16:02:14.177981 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552338944) = 4096 >>> 16:02:14.178231 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552343040) = 4096 >>> 16:02:14.178469 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552347136) = 4096 >>> 16:02:14.178687 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552351232) = 4096 >>> 16:02:14.178915 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552355328) = 4096 >>> 16:02:14.179131 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552359424) = 4096 >>> 16:02:14.179404 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552363520) = 4096 >>> 16:02:14.179635 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552367616) = 4096 >>> 16:02:14.179856 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552371712) = 4096 >>> 16:02:14.180076 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552375808) = 4096 >>> 16:02:14.180299 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552379904) = 4096 >>> 16:02:14.180518 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552384000) = 4096 >>> 16:02:14.180738 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552388096) = 4096 >>> 16:02:14.180983 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552392192) = 4096 >>> 16:02:14.181204 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552396288) = 4096 >>> 16:02:14.181455 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552400384) = 4096 >>> 16:02:14.181677 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552404480) = 4096 >>> 16:02:14.181900 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552408576) = 4096 >>> 16:02:14.182122 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552412672) = 4096 >>> 16:02:14.182345 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552416768) = 4096 >>> 16:02:14.182585 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552420864) = 4096 >>> 16:02:14.182808 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552424960) = 4096 >>> 16:02:14.183041 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552429056) = 4096 >>> 16:02:14.183261 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552433152) = 4096 >>> 16:02:14.183486 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552437248) = 4096 >>> 16:02:14.183707 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552441344) = 4096 >>> 16:02:14.183943 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552445440) = 4096 >>> 16:02:14.184159 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552449536) = 4096 >>> 16:02:14.184398 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552453632) = 4096 >>> 16:02:14.184621 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552457728) = 4096 >>> 16:02:14.184836 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552461824) = 4096 >>> 16:02:14.185075 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552465920) = 4096 >>> 16:02:14.185292 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552470016) = 4096 >>> 16:02:14.189482 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552474112) = 4096 >>> 16:02:14.189973 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552478208) = 4096 >>> 16:02:14.190171 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552482304) = 4096 >>> 16:02:14.190360 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552486400) = 4096 >>> 16:02:14.190573 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552490496) = 4096 >>> 16:02:14.190745 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552494592) = 4096 >>> 16:02:14.190913 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552498688) = 4096 >>> 16:02:14.191098 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552502784) = 4096 >>> 16:02:14.191269 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552506880) = 4096 >>> 16:02:14.191478 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552510976) = 4096 >>> 16:02:14.191692 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552515072) = 4096 >>> 16:02:14.191879 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552519168) = 4096 >>> 16:02:14.192062 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552523264) = 4096 >>> 16:02:14.192246 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552527360) = 4096 >>> 16:02:14.192444 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552531456) = 4096 >>> 16:02:14.192625 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552535552) = 4096 >>> 16:02:14.192806 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552539648) = 4096 >>> 16:02:14.192990 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552543744) = 4096 >>> 16:02:14.193172 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552547840) = 4096 >>> 16:02:14.193351 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552551936) = 4096 >>> 16:02:14.193555 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552556032) = 4096 >>> 16:02:14.193736 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552560128) = 4096 >>> 16:02:14.193913 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552564224) = 4096 >>> 16:02:14.194094 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552568320) = 4096 >>> 16:02:14.194278 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552572416) = 4096 >>> 16:02:14.194468 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552576512) = 4096 >>> 16:02:14.194650 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552580608) = 4096 >>> 16:02:14.194829 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552584704) = 4096 >>> 16:02:14.195009 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552588800) = 4096 >>> 16:02:14.195193 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552592896) = 4096 >>> 16:02:14.195386 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552596992) = 4096 >>> 16:02:14.195579 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552601088) = 4096 >>> 16:02:14.195763 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552605184) = 4096 >>> 16:02:14.195957 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552609280) = 4096 >>> 16:02:14.196141 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552613376) = 4096 >>> 16:02:14.196321 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552617472) = 4096 >>> 16:02:14.196511 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552621568) = 4096 >>> 16:02:14.196697 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552625664) = 4096 >>> 16:02:14.197041 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552629760) = 4096 >>> 16:02:14.197239 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552633856) = 4096 >>> 16:02:14.197486 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552637952) = 4096 >>> 16:02:14.197689 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552642048) = 4096 >>> 16:02:14.197874 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552646144) = 4096 >>> 16:02:14.198057 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552650240) = 4096 >>> 16:02:14.198259 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552654336) = 4096 >>> 16:02:14.198446 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552658432) = 4096 >>> 16:02:14.198639 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552662528) = 4096 >>> 16:02:14.198823 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552666624) = 4096 >>> 16:02:14.199006 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552670720) = 4096 >>> 16:02:14.199188 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552674816) = 4096 >>> 16:02:14.199373 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552678912) = 4096 >>> 16:02:14.199569 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552683008) = 4096 >>> 16:02:14.199749 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552687104) = 4096 >>> 16:02:14.199929 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552691200) = 4096 >>> 16:02:14.200108 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552695296) = 4096 >>> 16:02:14.200304 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552699392) = 4096 >>> 16:02:14.200494 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552703488) = 4096 >>> 16:02:14.200684 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552707584) = 4096 >>> 16:02:14.200867 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552711680) = 4096 >>> 16:02:14.201047 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552715776) = 4096 >>> 16:02:14.201227 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552719872) = 4096 >>> 16:02:14.201417 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552723968) = 4096 >>> 16:02:14.201602 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552728064) = 4096 >>> 16:02:14.201782 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552732160) = 4096 >>> 16:02:14.201962 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552736256) = 4096 >>> 16:02:14.202153 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552740352) = 4096 >>> 16:02:14.202352 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552744448) = 4096 >>> 16:02:14.202564 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552748544) = 4096 >>> 16:02:14.202740 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552752640) = 4096 >>> 16:02:14.202920 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552756736) = 4096 >>> 16:02:14.203101 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552760832) = 4096 >>> 16:02:14.203284 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552764928) = 4096 >>> 16:02:14.203473 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552769024) = 4096 >>> 16:02:14.203654 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552773120) = 4096 >>> 16:02:14.203833 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552777216) = 4096 >>> 16:02:14.204014 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552781312) = 4096 >>> 16:02:14.204198 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552785408) = 4096 >>> 16:02:14.204409 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552789504) = 4096 >>> 16:02:14.204591 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552793600) = 4096 >>> 16:02:14.204770 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552797696) = 4096 >>> 16:02:14.204952 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552801792) = 4096 >>> 16:02:14.205135 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552805888) = 4096 >>> 16:02:14.205316 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552809984) = 4096 >>> 16:02:14.205502 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552814080) = 4096 >>> 16:02:14.205684 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552818176) = 4096 >>> 16:02:14.205865 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552822272) = 4096 >>> 16:02:14.206050 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552826368) = 4096 >>> 16:02:14.206240 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552830464) = 4096 >>> 16:02:14.206446 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552834560) = 4096 >>> 16:02:14.206626 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552838656) = 4096 >>> 16:02:14.206806 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552842752) = 4096 >>> 16:02:14.206988 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552846848) = 4096 >>> 16:02:14.207166 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552850944) = 4096 >>> 16:02:14.207344 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552855040) = 4096 >>> 16:02:14.207539 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552859136) = 4096 >>> 16:02:14.207724 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552863232) = 4096 >>> 16:02:14.207907 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552867328) = 4096 >>> 16:02:14.208084 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552871424) = 4096 >>> 16:02:14.208274 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552875520) = 4096 >>> 16:02:14.208494 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552879616) = 4096 >>> 16:02:14.208675 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552883712) = 4096 >>> 16:02:14.208858 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552887808) = 4096 >>> 16:02:14.209037 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552891904) = 4096 >>> 16:02:14.209217 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552896000) = 4096 >>> 16:02:14.209412 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552900096) = 4096 >>> 16:02:14.209595 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552904192) = 4096 >>> 16:02:14.209774 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552908288) = 4096 >>> 16:02:14.209953 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552912384) = 4096 >>> 16:02:14.210130 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552916480) = 4096 >>> 16:02:14.210320 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552920576) = 4096 >>> 16:02:14.210538 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552924672) = 4096 >>> 16:02:14.210723 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552928768) = 4096 >>> 16:02:14.210903 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552932864) = 4096 >>> 16:02:14.211084 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552936960) = 4096 >>> 16:02:14.211264 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552941056) = 4096 >>> 16:02:14.211452 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552945152) = 4096 >>> 16:02:14.211639 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552949248) = 4096 >>> 16:02:14.211831 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552953344) = 4096 >>> 16:02:14.212012 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552957440) = 4096 >>> 16:02:14.212194 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552961536) = 4096 >>> 16:02:14.212377 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552965632) = 4096 >>> 16:02:14.212579 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552969728) = 4096 >>> 16:02:14.212760 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552973824) = 4096 >>> 16:02:14.212939 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552977920) = 4096 >>> 16:02:14.213118 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552982016) = 4096 >>> 16:02:14.213298 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552986112) = 4096 >>> 16:02:14.213490 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552990208) = 4096 >>> 16:02:14.213672 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552994304) = 4096 >>> 16:02:14.213987 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552998400) = 4096 >>> 16:02:14.214237 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553002496) = 4096 >>> 16:02:14.214493 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553006592) = 4096 >>> 16:02:14.214760 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553010688) = 4096 >>> 16:02:14.215009 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553014784) = 4096 >>> 16:02:14.215258 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553018880) = 4096 >>> 16:02:14.215515 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553022976) = 4096 >>> 16:02:14.215774 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553027072) = 4096 >>> 16:02:14.216026 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553031168) = 4096 >>> 16:02:14.216273 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553035264) = 4096 >>> 16:02:14.216529 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553039360) = 4096 >>> 16:02:14.216801 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553043456) = 4096 >>> 16:02:14.217042 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553047552) = 4096 >>> 16:02:14.217302 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553051648) = 4096 >>> 16:02:14.217557 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553055744) = 4096 >>> 16:02:14.217821 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553059840) = 4096 >>> 16:02:14.218067 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553063936) = 4096 >>> 16:02:14.218312 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553068032) = 4096 >>> 16:02:14.218559 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553072128) = 4096 >>> 16:02:14.218801 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553076224) = 4096 >>> 16:02:14.219045 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553080320) = 4096 >>> 16:02:14.219287 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553084416) = 4096 >>> 16:02:14.219543 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553088512) = 4096 >>> 16:02:14.219794 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553092608) = 4096 >>> 16:02:14.220040 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553096704) = 4096 >>> 16:02:14.220286 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553100800) = 4096 >>> 16:02:14.220541 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553104896) = 4096 >>> 16:02:14.220787 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553108992) = 4096 >>> 16:02:14.221033 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553113088) = 4096 >>> 16:02:14.221280 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553117184) = 4096 >>> 16:02:14.221532 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553121280) = 4096 >>> 16:02:14.221784 pread64(3, 0x1ce7000, 4096, 3001553125376) = -1 EIO >>> (Input/output error) >>> 16:02:14.222083 dup(2) = 4 >>> 16:02:14.222183 fcntl(4, F_GETFL) = 0x8402 (flags >>> O_RDWR|O_APPEND|O_LARGEFILE) >>> 16:02:14.222290 >>> open("/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = >>> -1 ENOENT (No such file or directory) >>> 16:02:14.222448 open("/usr/share/locale/en_US/LC_MESSAGES/libc.mo", >>> O_RDONLY) = -1 ENOENT (No such file or directory) >>> 16:02:14.222616 open("/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", >>> O_RDONLY) = -1 ENOENT (No such file or directory) >>> 16:02:14.222693 open("/usr/share/locale/en/LC_MESSAGES/libc.mo", >>> O_RDONLY) = -1 ENOENT (No such file or directory) >>> 16:02:14.222786 fstat(4, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, >>> 9), ...}) = 0 >>> 16:02:14.222866 mmap(NULL, 4096, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e49d000 >>> 16:02:14.222954 write(4, "pread64: Input/output error\n", 28) = 28 >>> 16:02:14.223038 close(4) = 0 >>> 16:02:14.223103 munmap(0x7f1c5e49d000, 4096) = 0 >>> 16:02:14.223249 exit_group(0) = ? >>> 16:02:14.223594 +++ exited with 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 hare@suse.de Thu Apr 14 01:09:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.0 required=5.0 tests=FRT_OFFER2 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 5EC637CA0 for ; Thu, 14 Apr 2016 01:09:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 25A07304062 for ; Wed, 13 Apr 2016 23:09:40 -0700 (PDT) X-ASG-Debug-ID: 1460614174-04cb6c24624ed630001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id CJFC5LyhBVAROErt (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 13 Apr 2016 23:09:35 -0700 (PDT) X-Barracuda-Envelope-From: hare@suse.de 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 3B861AB5D; Thu, 14 Apr 2016 06:09:31 +0000 (UTC) Subject: Re: [PATCH 00/42] v5: separate operations from flags in the bio/request structs To: mchristi@redhat.com, linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com X-ASG-Orig-Subj: Re: [PATCH 00/42] v5: separate operations from flags in the bio/request structs References: <1460576188-5751-1-git-send-email-mchristi@redhat.com> From: Hannes Reinecke Message-ID: <570F341A.2040108@suse.de> Date: Thu, 14 Apr 2016 08:09:30 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.7.0 MIME-Version: 1.0 In-Reply-To: <1460576188-5751-1-git-send-email-mchristi@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1460614175 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.59 X-Barracuda-Spam-Status: No, SCORE=1.59 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, FRT_OFFER2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28723 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 1.59 FRT_OFFER2 BODY: ReplaceTags: Offer (2) On 04/13/2016 09:35 PM, mchristi@redhat.com wrote: > The following patches begin to cleanup the request->cmd_flags and > bio->bi_rw mess. We currently use cmd_flags to specify the operation, > attributes and state of the request. For bi_rw we use it for similar > info and also the priority but then also have another bi_flags field > for state. At some point, we abused them so much we just made cmd_flags > 64 bits, so we could add more. > > The following patches seperate the operation (read, write discard, > flush, etc) from cmd_flags/bi_rw. > > This patchset was made against linux-next from today April 13 > (git tag next-20160413). > > I put a git tree here: > https://github.com/mikechristie/linux-kernel.git > The patches are in the op branch. > A round of applause for you. For the entire series: Reviewed-by: Hannes Reinecke Cheers, Hannes -- Dr. Hannes Reinecke Teamlead Storage & Networking hare@suse.de +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton HRB 21284 (AG Nürnberg) From EricShang@zhaoxin.com Thu Apr 14 01:34:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 15EC37CA0 for ; Thu, 14 Apr 2016 01:34:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DBFC0304032 for ; Wed, 13 Apr 2016 23:34:30 -0700 (PDT) X-ASG-Debug-ID: 1460615665-04cb6c24624f86f0001-NocioJ Received: from ZXSHCAS02.zhaoxin.com ([180.169.121.82]) by cuda.sgi.com with ESMTP id i8oPf93mso50rvN7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NO) for ; Wed, 13 Apr 2016 23:34:27 -0700 (PDT) X-Barracuda-Envelope-From: EricShang@zhaoxin.com X-Barracuda-Apparent-Source-IP: 180.169.121.82 Received: from ZXSHMBX02.zhaoxin.com ([fe80::79f8:fe39:431e:beb8]) by ZXSHCAS02.zhaoxin.com ([::1]) with mapi id 14.03.0266.001; Thu, 14 Apr 2016 14:33:42 +0800 From: Eric Shang To: Theodore Ts'o CC: Matthew Wilcox , Toshi Kani , "akpm@linux-foundation.org" , "dan.j.williams@intel.com" , "viro@zeniv.linux.org.uk" , "ross.zwisler@linux.intel.com" , "kirill.shutemov@linux.intel.com" , "david@fromorbit.com" , "jack@suse.cz" , "adilger.kernel@dilger.ca" , "linux-nvdimm@lists.01.org" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-kernel@vger.kernel.org" Subject: =?gb2312?B?tPC4tDogZXh0NCBlcnJvcg==?= Thread-Topic: ext4 error X-ASG-Orig-Subj: =?gb2312?B?tPC4tDogZXh0NCBlcnJvcg==?= Thread-Index: AQHRlfzMpqYnb+GHm0aSFaBrEMYRhZ+I+nHA Date: Thu, 14 Apr 2016 06:33:42 +0000 Message-ID: <0255994B402DE243B1DFC1057A00655201AEFE@ZXSHMBX02.zhaoxin.com> References: <0255994B402DE243B1DFC1057A00655201AC6F@ZXSHMBX02.zhaoxin.com> <20160414032207.GC16656@thunk.org> In-Reply-To: <20160414032207.GC16656@thunk.org> Accept-Language: zh-CN, en-US Content-Language: zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.30.24.50] Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-Barracuda-Connect: UNKNOWN[180.169.121.82] X-Barracuda-Start-Time: 1460615667 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.12 X-Barracuda-Spam-Status: No, SCORE=0.12 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28723 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS SGkgVGhlb2RvcmWjug0KCVRoYW5rcyBzbyBtdWNoISBUaGUgaXNzdWUgaXMgdmVyeSByYW5kb20s IGJ1dCBjYW4gcmVwcm9kdWNlIG1heSBpbiBzdHJlc3MgZm9yIDEyIGhvdXIsIEkgd2FudCB0byBk byBzb21lIGZpbGUgc3lzdGVtIHN0cmVzcywgYnV0IG5lZWQgdG8gZmluZCBvdXQgdGhlIG1haW5s eSBjYXVzZSBvciBzdGVwcyBvZiB0aGlzIGlzc3VlIGZpcnN0LiBJIHJlcHJvZHVjZSB0aGlzIHBh bmljIGJ5IHRoZSBwcm9jZXNzIHlvdSBtZW50aW9uZWQgd2l0aCB0aGUgZm9sbG93aW5nIHN0ZXBz LiBCdXQgc3RpbGwgdW5rbm93biBpcyB0aGlzIHRoZSByb290IGNhdXNlLg0KCTEpIGZvcmNlIGZy ZWUgYSBpbm9kZSB3aXRoIHVzZWQgYnkgb25lIGZpbGUgYnkgZGVidWdmcyBmcmVlaSBjb21tb25k IChib290IGZyb20gYW5vdGhlciBmaWxlc3lzdGVtIGZyb20gc2RjYXJkKS4NCgkyKSBib290IHRo ZSBzeXN0ZW0sIGNyZWF0ZSBvbmUgbmV3IGZpbGUuIFRoZSBmaWxlIHdpbGwgdXNlIHRoZSBzYW1l IGlub2RlIHdoaWNoIEkgZnJlZWQuDQoJMykgZGVsZXRlZCB0aGUgbmV3IGNyZWF0ZWQgZmlsZS4g VGhlbiBkcm9wIHRoZSBjYWNoZSBieSAjZWNobyAzID4gL3Byb2Mvc3lzL3ZtL2Ryb3BfY2FjaGVz DQoJNCkgcnVuICNscyBhbmQgaXQgd2lsbCBjYXVzZSBleHQ0IGVycm9yIGFuZCBrZXJuZWwgcGFu aWMuDQoNCiAgICBCdXQgSSBzdGlsbCBoYXZlIHNvbWUgcXVlc3Rpb25zLCBiZWNhdXNlIGVhY2gg Ym9vdCB1cCBvZiB0aGUgc3lzdGVtLCB3aWxsIHJ1biBmc2NrLCBpZiB0aGUgZmlsZXN5c3RlbSBp cyBjb3JydXB0ZWQsIEkgdGhpbmsgaXQgd2lsbCBmaXggaXQuIEJ1dCBsb29rcyBsaWtlIGFmdGVy IGRvIHRoZSBzdGVwIDEpIHdoZW4gYm9vdCB1cCBmc2NrIGNhbiBmaW5kIHRoaXMgZnJlZSBidXQg dXNlZCBpbm9kZSBlcnJvci4gVW5sZXNzIEkgcnVuIGZzY2suZXh0NCB3aXRoIC1mLiB3ZSBvZnRl biBzaG93ZG93biB0aGUgcG93ZXIgZGlyZWN0bHksIHRoaXMgY2FuIGNhdXNlIGRpcnR5IGlub2Rl IGJpdCBtYXA/DQogICAgSSBjaGVjayB0aGUga2VybmVsIGZzIGNvZGUsIGl0J3MgdmVyeSBjb21w bGV4LCB3aGVuIGRlbGV0ZSBhIGZpbGUgZnJvbSBwYXJlbnQgZGVudHJ5LCB3aWxsIHVzZSBhIGJo IHRvIHJlYWQgdGhlIGRlbnRyeSBhbmQgdGhlbiBkZWxldGUgdGhlIGVudHJ5IG9mIHRoZSBmaWxl IGluIGJoLCBhbmQgdGhlbiBtYXJrIHRoZSBiaCBkaXJ0eS4gV2FpdCBmb3Igdm0gZmx1c2ggdGhp cyBkaXJ0eSBwYWdlIHRvIGJsb2NrIGRldmljZSg/KS4gYnV0IG9uIHRoZSBvdGhlciBzaWRlIHBh cmVudCBkZW50cnkgY2FjaGUgbWF5IHB1dCBpbiB1bnVzZWQgbHJ1IGxpc3QsIHdoaWNoIG1heSBi ZSBmcmVlZCB3aGVuIG1lbW9yeSBwcmVzc3VyZS4gSXMgdGhlcmUgYW55IHN5bmNocm9ub3VzIHdp dGggZGlydHkgcGFnZSBmbHVzaCBhbmQgZGNhY2hlIGZsdXNoPyBUaGFua3MhDQoNCkJlc3QgUmVn YXJkcw0KRXJpY1NoYW5nDQoNCg0KLS0tLS3Tyrz+1K28/i0tLS0tDQq3orz+yMs6IFRoZW9kb3Jl IFRzJ28gW21haWx0bzp0eXRzb0BtaXQuZWR1XSANCreiy83KsbzkOiAyMDE2xOo01MIxNMjVIDEx OjIyDQrK1bz+yMs6IEVyaWMgU2hhbmcNCrOty806IE1hdHRoZXcgV2lsY294OyBUb3NoaSBLYW5p OyBha3BtQGxpbnV4LWZvdW5kYXRpb24ub3JnOyBkYW4uai53aWxsaWFtc0BpbnRlbC5jb207IHZp cm9AemVuaXYubGludXgub3JnLnVrOyByb3NzLnp3aXNsZXJAbGludXguaW50ZWwuY29tOyBraXJp bGwuc2h1dGVtb3ZAbGludXguaW50ZWwuY29tOyBkYXZpZEBmcm9tb3JiaXQuY29tOyBqYWNrQHN1 c2UuY3o7IGFkaWxnZXIua2VybmVsQGRpbGdlci5jYTsgbGludXgtbnZkaW1tQGxpc3RzLjAxLm9y ZzsgbGludXgtZnNkZXZlbEB2Z2VyLmtlcm5lbC5vcmc7IGxpbnV4LWV4dDRAdmdlci5rZXJuZWwu b3JnOyB4ZnNAb3NzLnNnaS5jb207IGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcNCtb3zOI6 IFJlOiBleHQ0IGVycm9yDQoNCk9uIFdlZCwgQXByIDEzLCAyMDE2IGF0IDAxOjQ0OjU1UE0gKzAw MDAsIEVyaWMgU2hhbmcgd3JvdGU6DQo+IEhJIEFsbDoNCj4gICBJIG1lZXQgYW4gZXh0NCBlcnJv ciwgZm9sbG93aW5nIGlzIHRoZSBlcnJvciBsb2cuIEFmdGVyIHBhbmljLCBJIGNoZWNrIHRoZSBl bW1jIGJ5IHRoZSB0b29sIGRlYnVmcywgdGhlIGlub2RlIDY5ODc4IGlfbmxpbmsgaXMgbm90IHpl cm8uIEFuZCB0aGlzIGlub2RlIGRvbid0IGJlbG9uZyB0byBwYXJlbnQgZGlyIDY5ODcsIGl0IGJl bG9uZyB0byBvdGhlciBmaWxlKHRoaXMgaW5vZGUgYmVsb25nIHRvIHR3byBmaWxlcyB3aGVuIGNo ZWNrIGJ5IGRlYnVnZnMgbmNoZWNrKSwgSSBndWVzcyB0aGFuIHRoaXMgaW5vZGUgaGFzIGJlZWQg ZGVsZXRlZCBpbiBtZW1vcnkgYW5kIGFscmVhZHkgdXNlZCBieSBvdGhlciBmaWxlLiBCdXQgdGhl IHBhcmVudCBkZW50cnkgYnVmZl9oZWFkIG5vdCBmbHVzaCB0byBlbW1jLiBCdXQgd2hlbiBsb29r dXAgdGhpcyBkZW50cnkgY2FuJ3QgZmluZCBpdCcgaW4gZGVudHJ5IGNhY2hlLCBhbmQgdGhlbiBs b29rdXBfcmVhbCwgcmVhZCB0aGUgZGVudHJ5IGZyb20gZW1tYywgZ2V0IHRoZSBmaWxlIGlub2Rl IHdoaWNoIGFscmVhZHkgYmUgZGVsZXRlZC4gDQo+ICAgQ2FuIGFueSBnaXZlIG1lIHNvbWUgaGVs cCBob3cgdG8gY2hlY2sgdGhpcyBpc3N1ZS4gTXkga2VybmVsIHZlcnNpb24gaXMgMy4xOCBmb3Jt IEFuZHJvaWQgLiBJIHRoaW5rcyBzb21ldGhpbmcgd3Jvbmcgd2l0aCBkZW50cnkgY2FjaGUgZmx1 c2ggYW5kIGRpcnR5IGJ1ZmZfaGVhZCBmbHVzaCB0byBlbW1jLiBUaGFua3MgYWxsIQ0KDQpJZiBJ IGhhZCB0byBndWVzcywgdGhpcyB3YXMgY2F1c2VkIHN0YXJ0aW5nIHdpdGggYSBjb3JydXB0ZWQg ZmlsZSBzeXN0ZW0sIHdoZXJlIHRoZSBpbm9kZSBhbGxvY2F0aW9uIGJpdG1hcCBzaG93ZWQgdGhh dCBhbiBpbm9kZSB3aGljaCB3YXMgaW4gdXNlIGJ5IHRoZSBmaWxlIHN5c3RlbSwgd2FzIGVycm9u ZW91c2x5IHNob3dpbmcgaXQgYXMgZnJlZS4NClRoaXMgYWxsb3dlZCBpdCB0byBiZSBhbGxvY2F0 ZWQgZm9yIHVzZSBpbiBhIHNlY29uZCBmaWxlICh3aGljaCB3b3VsZCBoYXZlIHdpcGVkIG91dCB0 aGUgY29udGVudHMgZm9yIHRoZSBvcmlnaW5hbCBmaWxlIHN0b3JlZCBhdCB0aGF0IGlub2RlKS4g IExhdGVyIG9uLCB0aGUgZmlsZSB3YXMgZGVsZXRlZCB2aWEgZWl0aGVyIHRoZSBvbGRlciBvciBu ZXdlciBwYXRobmFtZSwgd2hpY2ggZHJvcHBlZCB0aGUgcmVmIGNvdW50IHRvIHplcm8sIGFuZCB0 aGVuIGFuIGFjY2VzcyB2aWEgdGhlIG90aGVyIHBhdGhuYW1lIHdvdWxkIGhhdmUgcmVzdWx0ZWQg aW4gdGhpcyBlcnJvci4NCg0KQWZ0ZXIgdGhlIHBhbmljLCB0aGUgb24tZGlzayBkYXRhIHN0cnVj dHVyZXMgd291bGRuJ3QgaGF2ZSBiZWVuIHVwZGF0ZWQgZnJvbSB3aGF0ZXZlciB0aGUgaW4tbWVt b3J5IGRhdGEgc3RydWN0dXJlcyBtaWdodCBoYXZlIGJlZW4gKCJLZXJuZWwgcGFuaWMgLSBub3Qg c3luY2luZyIpLiAgU28gd2hhdCB5b3Ugc2VlIGZyb20gdXNpbmcgZGVidWdmcyBhZnRlciB0aGUg Y3Jhc2ggbWlnaHQgbm90IGJlIHJlcHJlc2VuYXRhdGl2ZSBvZiB3aGF0IHlvdSBzYXcgYmVmb3Jl IHRoZSBjcmFzaC4NCg0KSSdtIG5vdCBzdXJlIHRoZXJlJ3MgbXVjaCBkZWJ1Z2dpbmcgdGhhdCBj YW4gYmUgZG9uZSwgYmVjYXVzZSB0aGVyZSBhcmUgYW55IG51bWJlciBvZiBzb3VyY2VzIGZvciB0 aGUgb3JpZ2luYWwgY29ycnVwdGlvbi4gIEl0IGNvdWxkIGJlIGNhdXNlZCBieSBhIGhhcmR3YXJl IGlzc3VlIGluIHRoZSBmbGFzaCBvciB0aGUgbWVtb3J5LCBvciBpdCBjb3VsZCBiZSBjYXVzZWQg YnkgYSB3aWxkIHBvaW50ZXIgY29ycnVwdGluZyBhIGRpc2sgYnVmZmVyLCBldGMuIGV0Yy4gIFRo ZSBwYW5pYyB3b24ndCByZXN1bHQgaW4gYSB1c2VmdWwgc3RhY2sgdHJhY2UgYmVjYXVzZSB0aGF0 J3Mgd2hlbiB0aGUgcHJvYmxlbSB3YXMgKm5vdGljZWQqLiAgQnV0IHRoYXQncyB2ZXJ5IGRpZmZl cmVudCBmcm9tIHdoZXJlIHRoZSBmaWxlIHN5c3RlbSBjb3JydXB0aW9uIHdhcyAqaW50cm9kdWNl ZCouDQoNCklmIHlvdSBjYW4gcmVsaWFibHkgcmVwcm9kdWNlIHRoaXMgc29ydCBvZiBmYWlsdXJl LCB0aGVuIGl0IGJlY29tZXMgcG9zc2libGUgdG8gdHJ5IHRvIHRyYWNrIGl0IGRvd24uICBCdXQg aWYgaXQncyBhIG9uZS1vZmYgZXZlbnQsIHRoZXJlJ3Mgbm90IG11Y2ggYW55b25lIGNhbiBkby4N Cg0KQmVzdCByZWdhcmRzLA0KDQoJCQkJCQktIFRlZA0K From jtulak@redhat.com Thu Apr 14 04:49:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 55F2E7CA0 for ; Thu, 14 Apr 2016 04:49:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 241A08F8035 for ; Thu, 14 Apr 2016 02:49:36 -0700 (PDT) X-ASG-Debug-ID: 1460627374-04cbb02e1b22c6d0001-NocioJ Received: from mail-ig0-f178.google.com (mail-ig0-f178.google.com [209.85.213.178]) by cuda.sgi.com with ESMTP id SYvkWOe3DttvxrGX (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 14 Apr 2016 02:49:34 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.178 Received: by mail-ig0-f178.google.com with SMTP id kb1so1862932igb.0 for ; Thu, 14 Apr 2016 02:49:34 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=C4V+czbwq5mvtI6TIprbrPsnwplaM1NLdY8cmYDzvYU=; b=T8fHkymyqkWJE19zJnv7Aw0fxxiS/CJIskqTxp1iG378XgFai5yEvFojNeHpe6rLZT uVRF0c1+UG1Ps8respoN+VqKzaQds0NHGlHErZAKPo+R5ALQcS+5cnlOhr3uD6agNDBE eXKZrylfwA+ljWGWaK73PvIvdVZIYVBpO6CDYnfs+aFG09/sSLiZrfqIpFkf294CIm1C m7zeDTT2h7iSYX4DaDHGbqxtyQ9Ldc5+OYjPCEB/daPuFxgeWIUNh+Jgmm9R98xF/x7+ zcN7EliyxHP4eiirLh9NjlWThSqqQLfNd4wngwAVOMvqo/9rI4aC2l+8DwxID5Sl0AUn RwEA== X-Gm-Message-State: AOPr4FWXn6DH1vOBa5E/Bs04hWD3qJ/vqAGVY4406td8CIkb+fRfaLPpSo+xlNBifkXKgh9lPew0udeQTtOOVjE4 X-Received: by 10.50.28.19 with SMTP id x19mr15095908igg.19.1460627373982; Thu, 14 Apr 2016 02:49:33 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.79 with HTTP; Thu, 14 Apr 2016 02:49:14 -0700 (PDT) In-Reply-To: References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-16-git-send-email-jtulak@redhat.com> <5706FA7C.7020103@sandeen.net> From: Jan Tulak Date: Thu, 14 Apr 2016 11:49:14 +0200 Message-ID: Subject: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices Cc: xfs-oss Content-Type: multipart/alternative; boundary=089e01538da0c6a8a905306ecf8d X-Barracuda-Connect: mail-ig0-f178.google.com[209.85.213.178] X-Barracuda-Start-Time: 1460627374 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28727 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 --089e01538da0c6a8a905306ecf8d Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Fri, Apr 8, 2016 at 4:58 PM, Jan Tulak wrote: > On Fri, Apr 8, 2016 at 2:25 AM, Eric Sandeen wrote: > > [ >> =E2=80=8Bsnip]=E2=80=8B >> >> I still think this patch might need a reset though :) >> >> Thanks, >> -Eric >> >> > =E2=80=8BOn few places, the original patch looked as if files had direct = IO still > enabled=E2=80=8B (using platform_findsize...), and I think it was causing= some > failures - fixing issues is why I did most of the changes. > > I will revert to the original version and see what exactly fails. But wit= h > being Friday late afternoon, the results will be available the next week > (Wednesday and further, all my courses at university are stuffed in > Mon/Tue). > > =E2=80=8BAll right. So I run the tests on the set with both this and the or= iginal version of this patch and there is no change in results. Here and there some tests failed on one run, but on other runs they are ok and I can't get them to fail again (namely, xfs/033, 073 and 085 did this). It looks like whatever the issues were to start the changes, they are already resolved. Thus, I will send the original patch in the next batch. Cheers, =E2=80=8BJan=E2=80=8B --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --089e01538da0c6a8a905306ecf8d Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
    On Fri, Ap= r 8, 2016 at 4:58 PM, Jan Tulak <jtulak@redhat.com> wrote:
    On Fri, Apr 8, 2016 at 2:25 AM, Eric Sandeen <sandeen@sandeen.net> wrote:=C2=A0=C2=A0
    [
    =E2=80=8Bsnip]=E2=80=8B

    I still think this patch might need a = reset though :)

    Thanks,
    -Eric
    =

    =E2=80=8BOn few places, the ori= ginal patch looked as if files had direct IO still enabled=E2=80=8B (using = platform_findsize...), and I think it was causing some failures - fixing is= sues is why I did most of the changes.

    I will revert to the original version and see what exactly fail= s. But with being Friday late afternoon, the results will be available the = next week (Wednesday and further, all my courses at university are stuffed = in Mon/Tue).

    =E2=80=8BAll right. So I run the tests on the set with both this and the o= riginal version of this patch and there is no change in results. Here and t= here some tests failed on one run, but on other runs they are ok and I can&= #39;t get them to fail again (namely, xfs/033, 073 and 085 did this).
    =

    It look= s like whatever the issues were to start the changes, they are already reso= lved. Thus, I will send the original patch in the next batch.


    Cheers,
    =E2=80=8BJan=E2=80=8B



    --
    --089e01538da0c6a8a905306ecf8d-- From tom.leiming@gmail.com Thu Apr 14 06:48:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 A70807CA0 for ; Thu, 14 Apr 2016 06:48:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5DAAC304039 for ; Thu, 14 Apr 2016 04:48:02 -0700 (PDT) X-ASG-Debug-ID: 1460634479-04bdf0110254dae0001-NocioJ Received: from mail-oi0-f66.google.com (mail-oi0-f66.google.com [209.85.218.66]) by cuda.sgi.com with ESMTP id g5v7wtveX5HJ5j3P (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 14 Apr 2016 04:47:59 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.218.66 Received: by mail-oi0-f66.google.com with SMTP id w18so9505954oie.2 for ; Thu, 14 Apr 2016 04:47:59 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=nQKqWm75yF90vOKb2LFn9i23TeQkLdfha9yHwe2adAI=; b=XB2ZIrlKWLnxm7UfRpIgw7uCriA0nz2YYHhyJCPhYc3qQB1iPSa1pzUbW6iMUD7e8g A0eFcJbo2B/iu1bPdmGnBIb+9MkofCJX6+CRz++uhLqjBB6HUWhjA5WKHcM95BSKfYtc jdmGPr8UsCCe80Nugv5phRR5y9905GXJBxwy7vR5vav5nD0DWWgoWMle5EdbrcUzOpuq EVttcV0umUlXOTEeKFHzs+egUi9aWz4KPEDHnhR8C+xT6+Mh7AGdF0Vu6X8IMsJFq66Q 4jgsMipG6+tcjRmn2qh2ersyb2CPdiUSaHC6YnUqLgqhRxw4+rpPAtLRfh48I5sf8RhT epeg== X-Gm-Message-State: AOPr4FVeJUMXlzdKQ+ajLrvm+NrLiv/20RC4sZ86+QAKTQbe6okYAk+2hMoWLTcZY9AIAQ== X-Received: by 10.157.0.73 with SMTP id 67mr7778505ota.137.1460634479269; Thu, 14 Apr 2016 04:47:59 -0700 (PDT) Received: from localhost ([12.228.154.70]) by smtp.gmail.com with ESMTPSA id cf3sm13339464obc.1.2016.04.14.04.47.57 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Thu, 14 Apr 2016 04:47:57 -0700 (PDT) From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Ming Lei , drbd-dev@lists.linbit.com (open list:DRBD DRIVER), Jan Kara , Keith Busch , Kent Overstreet , "Kirill A. Shutemov" , Mike Snitzer , Shaohua Li , Tejun Heo , xfs@oss.sgi.com (open list:XFS FILESYSTEM) Subject: [PATCH v4 0/8] block: prepare for multipage bvecs Date: Thu, 14 Apr 2016 19:46:53 +0800 X-ASG-Orig-Subj: [PATCH v4 0/8] block: prepare for multipage bvecs Message-Id: <1460634438-26530-1-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 X-Barracuda-Connect: mail-oi0-f66.google.com[209.85.218.66] X-Barracuda-Start-Time: 1460634479 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28728 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi, Interests[1] have been shown in multipage bvecs, so this patchset try to prepare for the support and do two things: 1) the 1st 4 patches use bvec iterator to implement iterate_bvec(), then we can drop the non-standard way for iterating bvec, which can be thought as a good cleanup for lib/iov_iter.c 2) remove BIO_MAX_SECTORS & BIO_MAX_SIZE, and now there is only one user for each. Once multipage bvecs is introduced, one bio may hold lots of sectors, and we should always use sort of BIO_MAX_VECS which should be introduced in future and is similiar with current BIO_MAX_PAGES. xfstests(-a auto) have been run over ext4/xfs and no regression found by this patchset. V4: - make xfstests cover xfs - rebase on for-next of block tree V3: - include kenrel.h & bug.h in bvec.h for fix comiling failure on arm as reported by 0day ktest - build test on arm & arm64 V2: - rename bvec_iter.h as bvec.h - always include bvec.h into blk_types.h as suggested by Christoph V1: - don't move BIO_MAX_* to bvec_iter.h as pointed out by Christoph - run xfstests against v4.6-rc1-next-20160329 - add Reviewed-by - for 1,4 and 5, Reviewd-by not added, Christoph still expressed 'this looks fine to me.' Ming Lei (10): block: move bvec iterator into include/linux/bvec.h block: move two bvec structure into bvec.h block: mark 1st parameter of bvec_iter_advance as const iov_iter: use bvec iterator to implement iterate_bvec() fs: xfs: replace BIO_MAX_SECTORS with BIO_MAX_PAGES block: bio: remove BIO_MAX_SECTORS block: drbd: avoid to use BIO_MAX_SIZE block: bio: remove BIO_MAX_SIZE block: make sure big bio is splitted into at most 256 bvecs block: allow to merge bios if splitting because of big bvecs num block/blk-merge.c | 35 ++++++++++++++-- drivers/block/drbd/drbd_int.h | 4 +- fs/xfs/xfs_buf.c | 4 +- include/linux/bio.h | 52 ----------------------- include/linux/blk_types.h | 22 +--------- include/linux/bvec.h | 96 +++++++++++++++++++++++++++++++++++++++++++ lib/iov_iter.c | 30 +++++--------- 7 files changed, 142 insertions(+), 101 deletions(-) create mode 100644 include/linux/bvec.h -- 1.9.1 From tom.leiming@gmail.com Thu Apr 14 06:48:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 41D467CA0 for ; Thu, 14 Apr 2016 06:48:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 092158F8049 for ; Thu, 14 Apr 2016 04:48:21 -0700 (PDT) X-ASG-Debug-ID: 1460634499-04bdf0110554db30001-NocioJ Received: from mail-oi0-f65.google.com (mail-oi0-f65.google.com [209.85.218.65]) by cuda.sgi.com with ESMTP id xYG7w0JTcqeyvJGG (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 14 Apr 2016 04:48:19 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.218.65 Received: by mail-oi0-f65.google.com with SMTP id q133so9507075oib.1 for ; Thu, 14 Apr 2016 04:48:19 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=xXUdvjLtowonlrbju5ek6j4VIGdC6GChTRig76zBevk=; b=faHmtyEtzFXbit88tdHqOe0gZw2+i8MreYIwvPksmHvN8carg9dbMM3r3oLQ1CSYfv 6agGkbY+Qfbo2CFRJSPGx4MbZN7tjVg5a7UqHQF+ESJk1hxwnZ8TayLWX9pcuW7M3PvI fjM3TEf3riWpVam7j+5ZZiXmQo7vIrGfFM7e3jv3T1LVUim33urm6PCMFRKcaSEsKrQV KURYGjHfbINirZmv0nrcEhKEoQDM7H9h/i5IvpmTHPrNWqvbCASMZBg97FnmPX2AdxAi XxeNa0XpM0K2nN6YT6aZ7o2eOlmFvFiosc/7nWhs4uUL7D7RfQsfBfFCNe1iSdf53rp5 qXIg== X-Gm-Message-State: AOPr4FXkuiWxDnDnw3rU0Z4ZHChOwAyCfunMrjj4nje7KDAQywHnKVNZl1n78cQq9ZgfdA== X-Received: by 10.157.11.210 with SMTP id 76mr2657163oth.103.1460634499295; Thu, 14 Apr 2016 04:48:19 -0700 (PDT) Received: from localhost ([12.228.154.70]) by smtp.gmail.com with ESMTPSA id 5sm4747858otw.19.2016.04.14.04.48.18 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Thu, 14 Apr 2016 04:48:18 -0700 (PDT) From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Ming Lei , Dave Chinner , xfs@oss.sgi.com (supporter:XFS FILESYSTEM) Subject: [PATCH v4 5/8] fs: xfs: replace BIO_MAX_SECTORS with BIO_MAX_PAGES Date: Thu, 14 Apr 2016 19:46:58 +0800 X-ASG-Orig-Subj: [PATCH v4 5/8] fs: xfs: replace BIO_MAX_SECTORS with BIO_MAX_PAGES Message-Id: <1460634438-26530-6-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1460634438-26530-1-git-send-email-ming.lei@canonical.com> References: <1460634438-26530-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-oi0-f65.google.com[209.85.218.65] X-Barracuda-Start-Time: 1460634499 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28728 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header BIO_MAX_PAGES is used as maximum count of bvecs, so replace BIO_MAX_SECTORS with BIO_MAX_PAGES since BIO_MAX_SECTORS is to be removed. Signed-off-by: Ming Lei --- fs/xfs/xfs_buf.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 9a2191b..b9ecb2d 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1161,9 +1161,7 @@ xfs_buf_ioapply_map( next_chunk: atomic_inc(&bp->b_io_remaining); - nr_pages = BIO_MAX_SECTORS >> (PAGE_SHIFT - BBSHIFT); - if (nr_pages > total_nr_pages) - nr_pages = total_nr_pages; + nr_pages = min(total_nr_pages, BIO_MAX_PAGES); bio = bio_alloc(GFP_NOIO, nr_pages); bio->bi_bdev = bp->b_target->bt_bdev; -- 1.9.1 From bfoster@redhat.com Thu Apr 14 07:10:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 418CD7CA0 for ; Thu, 14 Apr 2016 07:10:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 79940AC003 for ; Thu, 14 Apr 2016 05:10:46 -0700 (PDT) X-ASG-Debug-ID: 1460635843-04cbb02e1a249ac0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id m0V8x2dJhYwkT6IV (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 14 Apr 2016 05:10:44 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 774176265C; Thu, 14 Apr 2016 12:10:43 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-148.bos.redhat.com [10.18.41.148]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3ECAh8J017283; Thu, 14 Apr 2016 08:10:43 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id A60E1120078; Thu, 14 Apr 2016 08:10:42 -0400 (EDT) Date: Thu, 14 Apr 2016 08:10:42 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 01/11] xfs: we don't need no steekin ->evict_inode Message-ID: <20160414121041.GA20696@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 01/11] xfs: we don't need no steekin ->evict_inode References: <1460525492-1170-1-git-send-email-david@fromorbit.com> <1460525492-1170-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460525492-1170-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 14 Apr 2016 12:10:43 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460635844 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Apr 13, 2016 at 03:31:22PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Joe Lawrence reported a list_add corruption with 4.6-rc1 when > testing some custom md administration code that made it's own > block device nodes for the md array. The simple test loop of: > > for i in {0..100}; do > mknod --mode=0600 $tmp/tmp_node b $MAJOR $MINOR > mdadm --detail --export $tmp/tmp_node > /dev/null > rm -f $tmp/tmp_node > done > > > Would produce this warning in bd_acquire() when mdadm opened the > device node: > > list_add double add: new=ffff88043831c7b8, prev=ffff8804380287d8, next=ffff88043831c7b8. > > And then produce this from bd_forget from kdevtmpfs evicting a block > dev inode: > > list_del corruption. prev->next should be ffff8800bb83eb10, but was ffff88043831c7b8 > > This is a regression caused by commit c19b3b05 ("xfs: mode di_mode > to vfs inode"). The issue is that xfs_inactive() frees the > unlinked inode, and the above commit meant that this freeing zeroed > the mode in the struct inode. The problem is that after evict() has > called ->evict_inode, it expects the i_mode to be intact so that it > can call bd_forget() or cd_forget() to drop the reference to the > block device inode attached to the XFS inode. > > In reality, the only thing we do in xfs_fs_evict_inode() that is not > generic is call xfs_inactive(). We can move the xfs_inactive() call > to xfs_fs_destroy_inode() without any problems at all, and this > will leave the VFS inode intact until it is completely done with it. > > So, remove xfs_fs_evict_inode(), and do the work it used to do in > ->destroy_inode instead. > > Reported-by: Joe Lawrence > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/xfs_super.c | 28 +++++++--------------------- > 1 file changed, 7 insertions(+), 21 deletions(-) > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index e2f0f52..416421d 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -928,7 +928,7 @@ xfs_fs_alloc_inode( > > /* > * Now that the generic code is guaranteed not to be accessing > - * the linux inode, we can reclaim the inode. > + * the linux inode, we can inactivate and reclaim the inode. > */ > STATIC void > xfs_fs_destroy_inode( > @@ -938,9 +938,14 @@ xfs_fs_destroy_inode( > > trace_xfs_destroy_inode(ip); > > - XFS_STATS_INC(ip->i_mount, vn_reclaim); > + ASSERT(!rwsem_is_locked(&ip->i_iolock.mr_lock)); > + XFS_STATS_INC(ip->i_mount, vn_rele); > + XFS_STATS_INC(ip->i_mount, vn_remove); > + > + xfs_inactive(ip); > > ASSERT(XFS_FORCED_SHUTDOWN(ip->i_mount) || ip->i_delayed_blks == 0); > + XFS_STATS_INC(ip->i_mount, vn_reclaim); > > /* > * We should never get here with one of the reclaim flags already set. > @@ -987,24 +992,6 @@ xfs_fs_inode_init_once( > "xfsino", ip->i_ino); > } > > -STATIC void > -xfs_fs_evict_inode( > - struct inode *inode) > -{ > - xfs_inode_t *ip = XFS_I(inode); > - > - ASSERT(!rwsem_is_locked(&ip->i_iolock.mr_lock)); > - > - trace_xfs_evict_inode(ip); > - > - truncate_inode_pages_final(&inode->i_data); > - clear_inode(inode); > - XFS_STATS_INC(ip->i_mount, vn_rele); > - XFS_STATS_INC(ip->i_mount, vn_remove); > - > - xfs_inactive(ip); > -} > - > /* > * We do an unlocked check for XFS_IDONTCACHE here because we are already > * serialised against cache hits here via the inode->i_lock and igrab() in > @@ -1673,7 +1660,6 @@ xfs_fs_free_cached_objects( > static const struct super_operations xfs_super_operations = { > .alloc_inode = xfs_fs_alloc_inode, > .destroy_inode = xfs_fs_destroy_inode, > - .evict_inode = xfs_fs_evict_inode, > .drop_inode = xfs_fs_drop_inode, > .put_super = xfs_fs_put_super, > .sync_fs = xfs_fs_sync_fs, > -- > 2.7.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Apr 14 07:10:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 469AB7CA0 for ; Thu, 14 Apr 2016 07:10:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0AFB8304053 for ; Thu, 14 Apr 2016 05:10:51 -0700 (PDT) X-ASG-Debug-ID: 1460635850-04cbb02e1b249b50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id b48MeyP2nkaBjker (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 14 Apr 2016 05:10:50 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 15E8734559E; Thu, 14 Apr 2016 12:10:50 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-148.bos.redhat.com [10.18.41.148]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3ECAnxD028766; Thu, 14 Apr 2016 08:10:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 74488120078; Thu, 14 Apr 2016 08:10:49 -0400 (EDT) Date: Thu, 14 Apr 2016 08:10:49 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 07/11] xfs: mark reclaimed inodes invalid earlier Message-ID: <20160414121048.GB20696@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 07/11] xfs: mark reclaimed inodes invalid earlier References: <1460525492-1170-1-git-send-email-david@fromorbit.com> <1460525492-1170-8-git-send-email-david@fromorbit.com> <20160413064900.GP567@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160413064900.GP567@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460635850 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Apr 13, 2016 at 04:49:00PM +1000, Dave Chinner wrote: > On Wed, Apr 13, 2016 at 03:31:28PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > The last thing we do before using call_rcu() on an xfs_inode to be > > freed is mark it as invalid. This means there is a window between > > when we know for certain that the inode is going to be freed and > > when we do actually mark it as "freed". > > > > This is important in the context of RCU lookups - we can look up the > > inode, find that it is valid, and then use it as such not realising > > that it is in the final stages of being freed. > > > > As such, mark the inode as being invalid the moment we know it is > > going to be reclaimed. This can be done while we still hold the > > XFS_ILOCK_EXCL and the flush lock in xfs_inode_reclaim, meaning that > > it occurs well before we remove it from the radix tree, and that > > the i_flags_lock, the XFS_ILOCK and the inode flush lock all act as > > synchronisation points for detecting that an inode is about to go > > away. > > > > For defensive purposes, this allows us to add a further check to > > xfs_iflush_cluster to ensure we skip inodes that are being freed > > after we grab the XFS_ILOCK_SHARED and the flush lock - we know that > > if the inode number if valid while we have these locks held we know > > that it has not progressed through reclaim to the point where it is > > clean and is about to be freed. > > > > [bfoster: fixed __xfs_inode_clear_reclaim() using ip->i_ino after it > > had already been zeroed.] > > And, of course, in reordering this I dropped this fix because it was > handled by the reworking of tagging code to use pag->pag_agno. > > So I've brought that small change forward to this patch (using > pag->pag_agno instead of deriving it from the ip->i_ino in > __xfs_inode_clear_reclaim()). > I don't see any such change in this patch..? __xfs_inode_clear_reclaim() still uses ip->i_ino. Brian > That means I have to rebase the later cleanup patch too, but the end > result of the patch set is identical... > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Apr 14 07:11:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5F41D7CA0 for ; Thu, 14 Apr 2016 07:11:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2CE588F8033 for ; Thu, 14 Apr 2016 05:10:58 -0700 (PDT) X-ASG-Debug-ID: 1460635856-04cbb02e1c249c10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id f37IwkQSWZGt7HvX (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 14 Apr 2016 05:10:57 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7CE6685360; Thu, 14 Apr 2016 12:10:56 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-148.bos.redhat.com [10.18.41.148]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3ECAu5d022630; Thu, 14 Apr 2016 08:10:56 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id C5F32120078; Thu, 14 Apr 2016 08:10:55 -0400 (EDT) Date: Thu, 14 Apr 2016 08:10:55 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 10/11] xfs: simplify inode reclaim tagging interfaces Message-ID: <20160414121055.GC20696@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 10/11] xfs: simplify inode reclaim tagging interfaces References: <1460525492-1170-1-git-send-email-david@fromorbit.com> <1460525492-1170-11-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460525492-1170-11-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460635856 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Apr 13, 2016 at 03:31:31PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Inode radix tree tagging for reclaim passes a lot of unnecessary > variables around. Over time the xfs-perag has grown a xfs_mount > backpointer, and an internal agno so we don't need to pass other > variables into the tagging functions to supply this information. > > Rework the functions to pass the minimal variable set required > and simplify the internal logic and flow. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_icache.c | 97 +++++++++++++++++++++++++++-------------------------- > 1 file changed, 49 insertions(+), 48 deletions(-) > > diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c > index a60db43..927e7b0 100644 > --- a/fs/xfs/xfs_icache.c > +++ b/fs/xfs/xfs_icache.c > @@ -37,8 +37,7 @@ > #include > #include > > -STATIC void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, > - struct xfs_perag *pag, struct xfs_inode *ip); > +STATIC void xfs_inode_clear_reclaim_tag(struct xfs_perag *pag, xfs_ino_t ino); > > /* > * Allocate and initialise an xfs_inode. > @@ -271,7 +270,7 @@ xfs_iget_cache_hit( > */ > ip->i_flags &= ~XFS_IRECLAIM_RESET_FLAGS; > ip->i_flags |= XFS_INEW; > - __xfs_inode_clear_reclaim_tag(mp, pag, ip); > + xfs_inode_clear_reclaim_tag(pag, ip->i_ino); > inode->i_state = I_NEW; > > ASSERT(!rwsem_is_locked(&ip->i_iolock.mr_lock)); > @@ -768,29 +767,44 @@ xfs_reclaim_worker( > } > > static void > -__xfs_inode_set_reclaim_tag( > +xfs_perag_set_reclaim_tag( > struct xfs_perag *pag, > - struct xfs_inode *ip) > + xfs_ino_t ino) No need to pass the inode number here. Otherwise looks good: Reviewed-by: Brian Foster > { > - radix_tree_tag_set(&pag->pag_ici_root, > - XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), > + struct xfs_mount *mp = pag->pag_mount; > + > + ASSERT(spin_is_locked(&pag->pag_ici_lock)); > + if (pag->pag_ici_reclaimable++) > + return; > + > + /* propagate the reclaim tag up into the perag radix tree */ > + spin_lock(&mp->m_perag_lock); > + radix_tree_tag_set(&mp->m_perag_tree, pag->pag_agno, > XFS_ICI_RECLAIM_TAG); > + spin_unlock(&mp->m_perag_lock); > > - if (!pag->pag_ici_reclaimable) { > - /* propagate the reclaim tag up into the perag radix tree */ > - spin_lock(&ip->i_mount->m_perag_lock); > - radix_tree_tag_set(&ip->i_mount->m_perag_tree, > - XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), > - XFS_ICI_RECLAIM_TAG); > - spin_unlock(&ip->i_mount->m_perag_lock); > + /* schedule periodic background inode reclaim */ > + xfs_reclaim_work_queue(mp); > > - /* schedule periodic background inode reclaim */ > - xfs_reclaim_work_queue(ip->i_mount); > + trace_xfs_perag_set_reclaim(mp, pag->pag_agno, -1, _RET_IP_); > +} > > - trace_xfs_perag_set_reclaim(ip->i_mount, pag->pag_agno, > - -1, _RET_IP_); > - } > - pag->pag_ici_reclaimable++; > +static void > +xfs_perag_clear_reclaim_tag( > + struct xfs_perag *pag) > +{ > + struct xfs_mount *mp = pag->pag_mount; > + > + ASSERT(spin_is_locked(&pag->pag_ici_lock)); > + if (--pag->pag_ici_reclaimable) > + return; > + > + /* clear the reclaim tag from the perag radix tree */ > + spin_lock(&mp->m_perag_lock); > + radix_tree_tag_clear(&mp->m_perag_tree, pag->pag_agno, > + XFS_ICI_RECLAIM_TAG); > + spin_unlock(&mp->m_perag_lock); > + trace_xfs_perag_clear_reclaim(mp, pag->pag_agno, -1, _RET_IP_); > } > > /* > @@ -800,48 +814,35 @@ __xfs_inode_set_reclaim_tag( > */ > void > xfs_inode_set_reclaim_tag( > - xfs_inode_t *ip) > + struct xfs_inode *ip) > { > - struct xfs_mount *mp = ip->i_mount; > - struct xfs_perag *pag; > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_perag *pag; > > pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); > spin_lock(&pag->pag_ici_lock); > spin_lock(&ip->i_flags_lock); > - __xfs_inode_set_reclaim_tag(pag, ip); > + > + radix_tree_tag_set(&pag->pag_ici_root, XFS_INO_TO_AGINO(mp, ip->i_ino), > + XFS_ICI_RECLAIM_TAG); > + xfs_perag_set_reclaim_tag(pag, ip->i_ino); > __xfs_iflags_set(ip, XFS_IRECLAIMABLE); > + > spin_unlock(&ip->i_flags_lock); > spin_unlock(&pag->pag_ici_lock); > xfs_perag_put(pag); > } > > -STATIC void > -__xfs_inode_clear_reclaim( > - xfs_perag_t *pag, > - xfs_inode_t *ip) > -{ > - pag->pag_ici_reclaimable--; > - if (!pag->pag_ici_reclaimable) { > - /* clear the reclaim tag from the perag radix tree */ > - spin_lock(&ip->i_mount->m_perag_lock); > - radix_tree_tag_clear(&ip->i_mount->m_perag_tree, > - XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), > - XFS_ICI_RECLAIM_TAG); > - spin_unlock(&ip->i_mount->m_perag_lock); > - trace_xfs_perag_clear_reclaim(ip->i_mount, pag->pag_agno, > - -1, _RET_IP_); > - } > -} > > STATIC void > -__xfs_inode_clear_reclaim_tag( > - xfs_mount_t *mp, > - xfs_perag_t *pag, > - xfs_inode_t *ip) > +xfs_inode_clear_reclaim_tag( > + struct xfs_perag *pag, > + xfs_ino_t ino) > { > radix_tree_tag_clear(&pag->pag_ici_root, > - XFS_INO_TO_AGINO(mp, ip->i_ino), XFS_ICI_RECLAIM_TAG); > - __xfs_inode_clear_reclaim(pag, ip); > + XFS_INO_TO_AGINO(pag->pag_mount, ino), > + XFS_ICI_RECLAIM_TAG); > + xfs_perag_clear_reclaim_tag(pag); > } > > /* > @@ -1032,7 +1033,7 @@ reclaim: > if (!radix_tree_delete(&pag->pag_ici_root, > XFS_INO_TO_AGINO(ip->i_mount, ino))) > ASSERT(0); > - __xfs_inode_clear_reclaim(pag, ip); > + xfs_perag_clear_reclaim_tag(pag); > spin_unlock(&pag->pag_ici_lock); > > /* > -- > 2.7.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Apr 14 07:11:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5D5AE7CB1 for ; Thu, 14 Apr 2016 07:11:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 265F28F8033 for ; Thu, 14 Apr 2016 05:11:03 -0700 (PDT) X-ASG-Debug-ID: 1460635861-04cbb02e1b249c70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id zlE2f1JsKmrYpbFx (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 14 Apr 2016 05:11:01 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 252BBC04B318; Thu, 14 Apr 2016 12:11:01 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-148.bos.redhat.com [10.18.41.148]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3ECB0vt017409; Thu, 14 Apr 2016 08:11:00 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 74D69120078; Thu, 14 Apr 2016 08:11:00 -0400 (EDT) Date: Thu, 14 Apr 2016 08:11:00 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 11/11] xfs: move reclaim tagging functions Message-ID: <20160414121059.GD20696@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 11/11] xfs: move reclaim tagging functions References: <1460525492-1170-1-git-send-email-david@fromorbit.com> <1460525492-1170-12-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460525492-1170-12-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460635861 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Apr 13, 2016 at 03:31:32PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Rearrange the inode tagging functions so that they are higher up in > xfs_cache.c and so there is no need for forward prototypes to be > defined. This is purely code movement, no other change. > > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/xfs_icache.c | 235 ++++++++++++++++++++++++++-------------------------- > 1 file changed, 116 insertions(+), 119 deletions(-) > > diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c > index 927e7b0..dab58e1 100644 > --- a/fs/xfs/xfs_icache.c > +++ b/fs/xfs/xfs_icache.c > @@ -37,8 +37,6 @@ > #include > #include > > -STATIC void xfs_inode_clear_reclaim_tag(struct xfs_perag *pag, xfs_ino_t ino); > - > /* > * Allocate and initialise an xfs_inode. > */ > @@ -172,6 +170,122 @@ xfs_reinit_inode( > } > > /* > + * Queue a new inode reclaim pass if there are reclaimable inodes and there > + * isn't a reclaim pass already in progress. By default it runs every 5s based > + * on the xfs periodic sync default of 30s. Perhaps this should have it's own > + * tunable, but that can be done if this method proves to be ineffective or too > + * aggressive. > + */ > +static void > +xfs_reclaim_work_queue( > + struct xfs_mount *mp) > +{ > + > + rcu_read_lock(); > + if (radix_tree_tagged(&mp->m_perag_tree, XFS_ICI_RECLAIM_TAG)) { > + queue_delayed_work(mp->m_reclaim_workqueue, &mp->m_reclaim_work, > + msecs_to_jiffies(xfs_syncd_centisecs / 6 * 10)); > + } > + rcu_read_unlock(); > +} > + > +/* > + * This is a fast pass over the inode cache to try to get reclaim moving on as > + * many inodes as possible in a short period of time. It kicks itself every few > + * seconds, as well as being kicked by the inode cache shrinker when memory > + * goes low. It scans as quickly as possible avoiding locked inodes or those > + * already being flushed, and once done schedules a future pass. > + */ > +void > +xfs_reclaim_worker( > + struct work_struct *work) > +{ > + struct xfs_mount *mp = container_of(to_delayed_work(work), > + struct xfs_mount, m_reclaim_work); > + > + xfs_reclaim_inodes(mp, SYNC_TRYLOCK); > + xfs_reclaim_work_queue(mp); > +} > + > +static void > +xfs_perag_set_reclaim_tag( > + struct xfs_perag *pag, > + xfs_ino_t ino) > +{ > + struct xfs_mount *mp = pag->pag_mount; > + > + ASSERT(spin_is_locked(&pag->pag_ici_lock)); > + if (pag->pag_ici_reclaimable++) > + return; > + > + /* propagate the reclaim tag up into the perag radix tree */ > + spin_lock(&mp->m_perag_lock); > + radix_tree_tag_set(&mp->m_perag_tree, pag->pag_agno, > + XFS_ICI_RECLAIM_TAG); > + spin_unlock(&mp->m_perag_lock); > + > + /* schedule periodic background inode reclaim */ > + xfs_reclaim_work_queue(mp); > + > + trace_xfs_perag_set_reclaim(mp, pag->pag_agno, -1, _RET_IP_); > +} > + > +static void > +xfs_perag_clear_reclaim_tag( > + struct xfs_perag *pag) > +{ > + struct xfs_mount *mp = pag->pag_mount; > + > + ASSERT(spin_is_locked(&pag->pag_ici_lock)); > + if (--pag->pag_ici_reclaimable) > + return; > + > + /* clear the reclaim tag from the perag radix tree */ > + spin_lock(&mp->m_perag_lock); > + radix_tree_tag_clear(&mp->m_perag_tree, pag->pag_agno, > + XFS_ICI_RECLAIM_TAG); > + spin_unlock(&mp->m_perag_lock); > + trace_xfs_perag_clear_reclaim(mp, pag->pag_agno, -1, _RET_IP_); > +} > + > +/* > + * We set the inode flag atomically with the radix tree tag. > + * Once we get tag lookups on the radix tree, this inode flag > + * can go away. > + */ > +void > +xfs_inode_set_reclaim_tag( > + struct xfs_inode *ip) > +{ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_perag *pag; > + > + pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); > + spin_lock(&pag->pag_ici_lock); > + spin_lock(&ip->i_flags_lock); > + > + radix_tree_tag_set(&pag->pag_ici_root, XFS_INO_TO_AGINO(mp, ip->i_ino), > + XFS_ICI_RECLAIM_TAG); > + xfs_perag_set_reclaim_tag(pag, ip->i_ino); > + __xfs_iflags_set(ip, XFS_IRECLAIMABLE); > + > + spin_unlock(&ip->i_flags_lock); > + spin_unlock(&pag->pag_ici_lock); > + xfs_perag_put(pag); > +} > + > +static void > +xfs_inode_clear_reclaim_tag( > + struct xfs_perag *pag, > + xfs_ino_t ino) > +{ > + radix_tree_tag_clear(&pag->pag_ici_root, > + XFS_INO_TO_AGINO(pag->pag_mount, ino), > + XFS_ICI_RECLAIM_TAG); > + xfs_perag_clear_reclaim_tag(pag); > +} > + > +/* > * Check the validity of the inode we just found it the cache > */ > static int > @@ -729,123 +843,6 @@ xfs_inode_ag_iterator_tag( > } > > /* > - * Queue a new inode reclaim pass if there are reclaimable inodes and there > - * isn't a reclaim pass already in progress. By default it runs every 5s based > - * on the xfs periodic sync default of 30s. Perhaps this should have it's own > - * tunable, but that can be done if this method proves to be ineffective or too > - * aggressive. > - */ > -static void > -xfs_reclaim_work_queue( > - struct xfs_mount *mp) > -{ > - > - rcu_read_lock(); > - if (radix_tree_tagged(&mp->m_perag_tree, XFS_ICI_RECLAIM_TAG)) { > - queue_delayed_work(mp->m_reclaim_workqueue, &mp->m_reclaim_work, > - msecs_to_jiffies(xfs_syncd_centisecs / 6 * 10)); > - } > - rcu_read_unlock(); > -} > - > -/* > - * This is a fast pass over the inode cache to try to get reclaim moving on as > - * many inodes as possible in a short period of time. It kicks itself every few > - * seconds, as well as being kicked by the inode cache shrinker when memory > - * goes low. It scans as quickly as possible avoiding locked inodes or those > - * already being flushed, and once done schedules a future pass. > - */ > -void > -xfs_reclaim_worker( > - struct work_struct *work) > -{ > - struct xfs_mount *mp = container_of(to_delayed_work(work), > - struct xfs_mount, m_reclaim_work); > - > - xfs_reclaim_inodes(mp, SYNC_TRYLOCK); > - xfs_reclaim_work_queue(mp); > -} > - > -static void > -xfs_perag_set_reclaim_tag( > - struct xfs_perag *pag, > - xfs_ino_t ino) > -{ > - struct xfs_mount *mp = pag->pag_mount; > - > - ASSERT(spin_is_locked(&pag->pag_ici_lock)); > - if (pag->pag_ici_reclaimable++) > - return; > - > - /* propagate the reclaim tag up into the perag radix tree */ > - spin_lock(&mp->m_perag_lock); > - radix_tree_tag_set(&mp->m_perag_tree, pag->pag_agno, > - XFS_ICI_RECLAIM_TAG); > - spin_unlock(&mp->m_perag_lock); > - > - /* schedule periodic background inode reclaim */ > - xfs_reclaim_work_queue(mp); > - > - trace_xfs_perag_set_reclaim(mp, pag->pag_agno, -1, _RET_IP_); > -} > - > -static void > -xfs_perag_clear_reclaim_tag( > - struct xfs_perag *pag) > -{ > - struct xfs_mount *mp = pag->pag_mount; > - > - ASSERT(spin_is_locked(&pag->pag_ici_lock)); > - if (--pag->pag_ici_reclaimable) > - return; > - > - /* clear the reclaim tag from the perag radix tree */ > - spin_lock(&mp->m_perag_lock); > - radix_tree_tag_clear(&mp->m_perag_tree, pag->pag_agno, > - XFS_ICI_RECLAIM_TAG); > - spin_unlock(&mp->m_perag_lock); > - trace_xfs_perag_clear_reclaim(mp, pag->pag_agno, -1, _RET_IP_); > -} > - > -/* > - * We set the inode flag atomically with the radix tree tag. > - * Once we get tag lookups on the radix tree, this inode flag > - * can go away. > - */ > -void > -xfs_inode_set_reclaim_tag( > - struct xfs_inode *ip) > -{ > - struct xfs_mount *mp = ip->i_mount; > - struct xfs_perag *pag; > - > - pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); > - spin_lock(&pag->pag_ici_lock); > - spin_lock(&ip->i_flags_lock); > - > - radix_tree_tag_set(&pag->pag_ici_root, XFS_INO_TO_AGINO(mp, ip->i_ino), > - XFS_ICI_RECLAIM_TAG); > - xfs_perag_set_reclaim_tag(pag, ip->i_ino); > - __xfs_iflags_set(ip, XFS_IRECLAIMABLE); > - > - spin_unlock(&ip->i_flags_lock); > - spin_unlock(&pag->pag_ici_lock); > - xfs_perag_put(pag); > -} > - > - > -STATIC void > -xfs_inode_clear_reclaim_tag( > - struct xfs_perag *pag, > - xfs_ino_t ino) > -{ > - radix_tree_tag_clear(&pag->pag_ici_root, > - XFS_INO_TO_AGINO(pag->pag_mount, ino), > - XFS_ICI_RECLAIM_TAG); > - xfs_perag_clear_reclaim_tag(pag); > -} > - > -/* > * Grab the inode for reclaim exclusively. > * Return 0 if we grabbed it, non-zero otherwise. > */ > -- > 2.7.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From jtulak@redhat.com Thu Apr 14 07:32:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 A49007CA0 for ; Thu, 14 Apr 2016 07:32:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6C1548F8037 for ; Thu, 14 Apr 2016 05:32:14 -0700 (PDT) X-ASG-Debug-ID: 1460637132-04cbb02e1b24d120001-NocioJ Received: from mail-io0-f181.google.com (mail-io0-f181.google.com [209.85.223.181]) by cuda.sgi.com with ESMTP id VSDMizPDLLRzTtIC (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 14 Apr 2016 05:32:13 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.181 Received: by mail-io0-f181.google.com with SMTP id 2so101756547ioy.1 for ; Thu, 14 Apr 2016 05:32:13 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=l0R8q/eGmiRiZxVCRCgfUQGFdFTDnFMhQ5m2cgKFjcM=; b=C5/wUUQ28CCfW+vHuZmSrsg/P415iGHEh0O7Y4wgPQx4/BcjJkekc0H4EdqgzcmoHF tRC9nvkRb9UUsmK9nlEIuulE0errEkyHQw39WVbj3cPVLQzjLu1jrBwublttdfuFvr0B vOLQeUtdbHi6TW4r2ixpZOAAE+//Zt8GdScI/ku6PQoOEndNokXPtq/V/CMdCgWExlcM 2VBycIoHfabqjXPHeZKIewNyLwLCtjDJWFHl42H799dR7mKNQ5Hh8OWjxIQxLYSyZdsD EjM5WJgHEkYeXO0JNFaVOOrHwRRdoJy4Bt+wTBxjy2xcITs9mK69x0qGK1U1aXEmWHiY nTPw== X-Gm-Message-State: AOPr4FVUDruBGzBDApbvJv7RwJSF/JRVHRt7fJvaV8vokpb3nv2WpDXqU3oysbK0sb5RWU4QyNlBW6WpviUMgt+z X-Received: by 10.107.3.149 with SMTP id e21mr14919855ioi.46.1460637132560; Thu, 14 Apr 2016 05:32:12 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.79 with HTTP; Thu, 14 Apr 2016 05:31:53 -0700 (PDT) In-Reply-To: <20160413213758.GR567@dastard> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-18-git-send-email-jtulak@redhat.com> <20160408000910.GB21804@dastard> <20160408230843.GE567@dastard> <570E7129.3080900@sandeen.net> <20160413213758.GR567@dastard> From: Jan Tulak Date: Thu, 14 Apr 2016 14:31:53 +0200 Message-ID: Subject: Re: [PATCH 17/19] xfsprogs: disable truncating of files To: Dave Chinner X-ASG-Orig-Subj: Re: [PATCH 17/19] xfsprogs: disable truncating of files Cc: Eric Sandeen , xfs-oss Content-Type: multipart/alternative; boundary=001a113eb35e6eb75705307115b3 X-Barracuda-Connect: mail-io0-f181.google.com[209.85.223.181] X-Barracuda-Start-Time: 1460637133 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28729 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 --001a113eb35e6eb75705307115b3 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Wed, Apr 13, 2016 at 11:37 PM, Dave Chinner wrote: > On Wed, Apr 13, 2016 at 11:17:45AM -0500, Eric Sandeen wrote: > > On 4/13/16 10:08 AM, Jan Tulak wrote: > > > > ... > > > > > All right=E2=80=8B, I will keep the O_TRUNC there. However, should it > > > truncate the file every time, or should we offer a way how to avoid > > > the file truncating? Until now, mkfs behaved differently based on > > > whether -d file was given, or not. Your explanation suggests that we > > > should truncate every time, right? > > > > There are probably valid reasons to keep size as well as to truncate; > > it's not immediately clear to me how we should handle it. > > That's easy: don't specify -dfile or -dsize, and instead let mkfs > detect that it is file automatically. Because it's not given a size, > or that it's supposed to be a file, it should not attempt to change > the "device" in any way. > > When block devices grow fallocate support, we can unify the discard > behaviour to be a hole punch, and then it will work identically on > devices and files treated this way. > > > Honestly, at this point, in the interest of getting the other fixes in, > > I think I might rather see the truncating behavior unchanged from what > > we have today; we can tackle that as a separate problem at a later date= . > > Yup, don't change it in this patch series. > > Looking on this patch again, I think that it can be removed entirely. After reverting the O_CREATE part, the only thing it does is differentiating error messages between files and block devices, which is not worth of a patch. Cheers, Jan --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --001a113eb35e6eb75705307115b3 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
    On Wed, Ap= r 13, 2016 at 11:37 PM, Dave Chinner <david@fromorbit.com> wrote:
    On Wed, = Apr 13, 2016 at 11:17:45AM -0500, Eric Sandeen wrote:
    > On 4/13/16 10:08 AM, Jan Tulak wrote:
    >
    > ...
    >
    > > All right=E2=80=8B, I will keep the O_TRUNC there. However, shoul= d it
    > > truncate the file every time, or should we offer a way how to avo= id
    > > the file truncating? Until now, mkfs behaved differently based on=
    > > whether -d file was given, or not. Your explanation suggests that= we
    > > should truncate every time, right?
    >
    > There are probably valid reasons to keep size as well as to truncate;<= br> > it's not immediately clear to me how we should handle it.

    That's easy: don't specify -dfile or -dsize, and instead let= mkfs
    detect that it is file automatically. Because it's not given a size, or that it's supposed to be a file, it should not attempt to change
    the "device" in any way.

    When block devices grow fallocate support, we can unify the discard
    behaviour to be a hole punch, and then it will work identically on
    devices and files treated this way.

    > Honestly, at this point, in the interest of getting the other fixes in= ,
    > I think I might rather see the truncating behavior unchanged from what=
    > we have today; we can tackle that as a separate problem at a later dat= e.

    Yup, don't change it in this patch series.


    Looking on this patch again, I think that it can be removed en= tirely. After reverting the O_CREATE part, the only thing it does is differ= entiating error messages between files and block devices, which is not wort= h of a patch.

    Cheers,
    Jan
    =

    --
    --001a113eb35e6eb75705307115b3-- From bfoster@redhat.com Thu Apr 14 07:58:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 911D67CA0 for ; Thu, 14 Apr 2016 07:58:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 04F75AC003 for ; Thu, 14 Apr 2016 05:58:18 -0700 (PDT) X-ASG-Debug-ID: 1460638695-04cbb02e1d24efa0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id AoOhO0L5xes9PdTy (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 14 Apr 2016 05:58:16 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B87E581111; Thu, 14 Apr 2016 12:58:15 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-148.bos.redhat.com [10.18.41.148]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3ECwFNJ002674; Thu, 14 Apr 2016 08:58:15 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E65F3120078; Thu, 14 Apr 2016 08:58:14 -0400 (EDT) Date: Thu, 14 Apr 2016 08:58:14 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com, rpeterso@redhat.com, linux-fsdevel@vger.kernel.org Subject: Re: [PATCH 5/8] xfs: implement iomap based buffered write path Message-ID: <20160414125814.GE20696@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 5/8] xfs: implement iomap based buffered write path References: <1460494382-14547-1-git-send-email-hch@lst.de> <1460494382-14547-6-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460494382-14547-6-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460638696 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Apr 12, 2016 at 01:52:59PM -0700, Christoph Hellwig wrote: > Convert XFS to use the new iomap based multipage write path. This involves > implementing the ->iomap_begin and ->iomap_end methods, and switching the > buffered file write, page_mkwrite and xfs_iozero paths to the new iomap > helpers. > > With this change __xfs_get_blocks will never be used for buffered writes, > and the code handling them can be removed. > > Based on earlier code from Dave Chinner. > > Signed-off-by: Christoph Hellwig > --- > fs/xfs/Kconfig | 1 + > fs/xfs/xfs_aops.c | 212 ----------------------------------------------------- > fs/xfs/xfs_file.c | 71 ++++++++---------- > fs/xfs/xfs_iomap.c | 144 ++++++++++++++++++++++++++++++++++++ > fs/xfs/xfs_iomap.h | 5 +- > fs/xfs/xfs_iops.c | 9 ++- > fs/xfs/xfs_trace.h | 3 + > 7 files changed, 187 insertions(+), 258 deletions(-) > ... > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index 2f37194..73de1ec 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -967,3 +967,147 @@ xfs_bmbt_to_iomap( ... > +static int > +xfs_file_iomap_end_delalloc( > + struct xfs_inode *ip, > + loff_t offset, > + loff_t length, > + ssize_t written) > +{ > + struct xfs_mount *mp = ip->i_mount; > + xfs_fileoff_t start_fsb; > + xfs_fileoff_t end_fsb; > + int error = 0; > + > + start_fsb = XFS_B_TO_FSB(mp, offset + written); > + end_fsb = XFS_B_TO_FSB(mp, offset + length - written); > + Just skimming over this series... but shouldn't this be offset + length? Why walk back from the end of the allocated range? Brian > + /* > + * Trim back delalloc blocks if we didn't manage to write the whole > + * range reserved. > + * > + * We don't need to care about racing delalloc as we hold i_mutex > + * across the reserve/allocate/unreserve calls. If there are delalloc > + * blocks in the range, they are ours. > + */ > + if (start_fsb < end_fsb) { > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + error = xfs_bmap_punch_delalloc_range(ip, start_fsb, > + end_fsb - start_fsb); > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + > + if (error && !XFS_FORCED_SHUTDOWN(mp)) { > + xfs_alert(mp, "%s: unable to clean up ino %lld", > + __func__, ip->i_ino); > + return error; > + } > + } > + > + return 0; > +} > + > +static int > +xfs_file_iomap_end( > + struct inode *inode, > + loff_t offset, > + loff_t length, > + ssize_t written, > + unsigned flags, > + struct iomap *iomap) > +{ > + if ((flags & IOMAP_WRITE) && iomap->type == IOMAP_DELALLOC) > + return xfs_file_iomap_end_delalloc(XFS_I(inode), offset, > + length, written); > + return 0; > +} > + > +struct iomap_ops xfs_iomap_ops = { > + .iomap_begin = xfs_file_iomap_begin, > + .iomap_end = xfs_file_iomap_end, > +}; > diff --git a/fs/xfs/xfs_iomap.h b/fs/xfs/xfs_iomap.h > index 718f07c..e066d04 100644 > --- a/fs/xfs/xfs_iomap.h > +++ b/fs/xfs/xfs_iomap.h > @@ -18,7 +18,8 @@ > #ifndef __XFS_IOMAP_H__ > #define __XFS_IOMAP_H__ > > -struct iomap; > +#include > + > struct xfs_inode; > struct xfs_bmbt_irec; > > @@ -33,4 +34,6 @@ int xfs_iomap_write_unwritten(struct xfs_inode *, xfs_off_t, xfs_off_t); > void xfs_bmbt_to_iomap(struct xfs_inode *, struct iomap *, > struct xfs_bmbt_irec *); > > +extern struct iomap_ops xfs_iomap_ops; > + > #endif /* __XFS_IOMAP_H__*/ > diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c > index 1e2086d..6dfa10c 100644 > --- a/fs/xfs/xfs_iops.c > +++ b/fs/xfs/xfs_iops.c > @@ -38,6 +38,7 @@ > #include "xfs_dir2.h" > #include "xfs_trans_space.h" > #include "xfs_pnfs.h" > +#include "xfs_iomap.h" > > #include > #include > @@ -822,8 +823,8 @@ xfs_setattr_size( > error = dax_truncate_page(inode, newsize, > xfs_get_blocks_direct); > } else { > - error = block_truncate_page(inode->i_mapping, newsize, > - xfs_get_blocks); > + error = iomap_truncate_page(inode, newsize, > + &did_zeroing, &xfs_iomap_ops); > } > } > > @@ -838,8 +839,8 @@ xfs_setattr_size( > * problem. Note that this includes any block zeroing we did above; > * otherwise those blocks may not be zeroed after a crash. > */ > - if (newsize > ip->i_d.di_size && > - (oldsize != ip->i_d.di_size || did_zeroing)) { > + if (did_zeroing || > + (newsize > ip->i_d.di_size && oldsize != ip->i_d.di_size)) { > error = filemap_write_and_wait_range(VFS_I(ip)->i_mapping, > ip->i_d.di_size, newsize); > if (error) > diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h > index 840d52e..86fb345 100644 > --- a/fs/xfs/xfs_trace.h > +++ b/fs/xfs/xfs_trace.h > @@ -1296,6 +1296,9 @@ DEFINE_IOMAP_EVENT(xfs_map_blocks_alloc); > DEFINE_IOMAP_EVENT(xfs_get_blocks_found); > DEFINE_IOMAP_EVENT(xfs_get_blocks_alloc); > DEFINE_IOMAP_EVENT(xfs_get_blocks_map_direct); > +DEFINE_IOMAP_EVENT(xfs_iomap_alloc); > +DEFINE_IOMAP_EVENT(xfs_iomap_found); > +DEFINE_IOMAP_EVENT(xfs_iomap_not_found); > > DECLARE_EVENT_CLASS(xfs_simple_io_class, > TP_PROTO(struct xfs_inode *ip, xfs_off_t offset, ssize_t count), > -- > 2.1.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From axboe@kernel.dk Thu Apr 14 09:11:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4804B7CA1 for ; Thu, 14 Apr 2016 09:11:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0AAEE8F8318 for ; Thu, 14 Apr 2016 07:11:07 -0700 (PDT) X-ASG-Debug-ID: 1460643066-04cbb02e1c256c60001-NocioJ Received: from mail-ig0-f179.google.com (mail-ig0-f179.google.com [209.85.213.179]) by cuda.sgi.com with ESMTP id dDicQUY1ryJj7fpo (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 14 Apr 2016 07:11:06 -0700 (PDT) X-Barracuda-Envelope-From: axboe@kernel.dk X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.179 Received: by mail-ig0-f179.google.com with SMTP id ui10so91854846igc.1 for ; Thu, 14 Apr 2016 07:11:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel-dk.20150623.gappssmtp.com; s=20150623; h=subject:to:references:cc:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=2mldgws3DhKOKU9WBunxIKque0fEKqJtlNT1aI+hH7Q=; b=cMM6+u7SNIu+OaopsSq6ysKpM5ipu45ofeFjxHEIVo5KkKdj/8tGBpaaEUz4flJ34j bPwFUd94tzNPtS1UYpZHyqbd3DR71WpCbFlBCrUOkQYFCZXmd2hmc+7vWtjKvBdveU4N h0g9O1Un+urvRKe9sxQdVfNxtwLr0KSHDGQwctn5zdfUXMPEihilc8SMP2xoShU9J5KK W6OiJAEzPV4lGU6Ddge1BSXaYB/IuDzHbQuE8tpOvKgNtZrqWg7tiT35ahgR87CPwJpZ 6xsb0nnQptUrT1ynFF8ef4qSHfmAj4B6yd4ybxMFBp7Gl+n8EHr61IzS4pLPvnC4RkRu piEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:to:references:cc:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=2mldgws3DhKOKU9WBunxIKque0fEKqJtlNT1aI+hH7Q=; b=bScdgONz5jui10SLCbSSkDkVnhVmoyWYwf2wVgEJA0giFcWD3tkO5YiA1zpn2OxvA7 ftJ5TbE92IQPrBZIVZuGlS3Q6ZuCQuoh3iMJwAJhxfvE3hOpCsYKYAWmZc+TByvGIPkY uN3XmDTAYRm7d9M+L9+svEejHe8PFBO6iqZAmgIJ5FlpD8Ars4u757e89xrQDBpxGMAl Zt9zOvMkMd5EGMSK1zGsAC1fcVEBc8oQvR8l8n+Zdbh63GW5orlvan36S/0UQSJJilK9 qyxzQufZIHWtKCE7uz3lBW5cvISG+lNFzQdUQkXKkRE0nMEdo67Ql7evEduKyiFYNXet xJ6A== X-Gm-Message-State: AOPr4FUD4EySuLx09cUSd6+hqwz+Zaf3L7rkYc8+L21wVgeVMT4ADF3XOauAqBFweDiP0g== X-Received: by 10.50.36.38 with SMTP id n6mr3236151igj.31.1460643066015; Thu, 14 Apr 2016 07:11:06 -0700 (PDT) Received: from [192.168.1.120] ([216.160.245.98]) by smtp.gmail.com with ESMTPSA id 74sm26105597ios.28.2016.04.14.07.11.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 14 Apr 2016 07:11:05 -0700 (PDT) Subject: Re: [PATCH v4 0/8] block: prepare for multipage bvecs X-Barracuda-BBL-IP: 192.168.1.120 To: Ming Lei , Jens Axboe , linux-kernel@vger.kernel.org X-ASG-Orig-Subj: Re: [PATCH v4 0/8] block: prepare for multipage bvecs References: <1460634438-26530-1-git-send-email-ming.lei@canonical.com> Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , "open list:DRBD DRIVER" , Jan Kara , Keith Busch , Kent Overstreet , "Kirill A. Shutemov" , Mike Snitzer , Shaohua Li , Tejun Heo , "open list:XFS FILESYSTEM" From: Jens Axboe Message-ID: <570FA4F7.6020301@kernel.dk> Date: Thu, 14 Apr 2016 08:11:03 -0600 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <1460634438-26530-1-git-send-email-ming.lei@canonical.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-ig0-f179.google.com[209.85.213.179] X-Barracuda-Start-Time: 1460643066 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28731 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 04/14/2016 05:46 AM, Ming Lei wrote: > Hi, > > Interests[1] have been shown in multipage bvecs, so this patchset > try to prepare for the support and do two things: > > 1) the 1st 4 patches use bvec iterator to implement iterate_bvec(), > then we can drop the non-standard way for iterating bvec, which > can be thought as a good cleanup for lib/iov_iter.c > > 2) remove BIO_MAX_SECTORS & BIO_MAX_SIZE, and now there is only > one user for each. Once multipage bvecs is introduced, one bio > may hold lots of sectors, and we should always use sort of BIO_MAX_VECS > which should be introduced in future and is similiar with current > BIO_MAX_PAGES. > > xfstests(-a auto) have been run over ext4/xfs and no regression found > by this patchset. We've had too many disasters in the block layer the last few series, I'm making the 4.7 round a nice and small one. I don't mind taking prep patches for the multipage bvecs, if they are simple and clean, but that's about the extent of it. Just a heads up. -- Jens Axboe From msnitzer@redhat.com Thu Apr 14 10:10:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 861EB7CA0 for ; Thu, 14 Apr 2016 10:10:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 52960304032 for ; Thu, 14 Apr 2016 08:10:21 -0700 (PDT) X-ASG-Debug-ID: 1460646616-04cbb02e1c25d120001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id POmxiMQ7PcLlwBYV (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 14 Apr 2016 08:10:17 -0700 (PDT) X-Barracuda-Envelope-From: msnitzer@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 28571C03DD; Thu, 14 Apr 2016 15:10:16 +0000 (UTC) Received: from localhost (dhcp-25-149.bos.redhat.com [10.18.25.149]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3EFAFI7003791 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA256 bits=256 verify=NO); Thu, 14 Apr 2016 11:10:15 -0400 Date: Thu, 14 Apr 2016 11:10:14 -0400 From: Mike Snitzer To: Brian Foster Cc: "Darrick J. Wong" , Joe Thornber , xfs@oss.sgi.com, linux-block@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org Subject: Re: [RFC v2 PATCH 05/10] dm thin: add methods to set and get reserved space Message-ID: <20160414151014.GA13074@redhat.com> X-ASG-Orig-Subj: Re: [RFC v2 PATCH 05/10] dm thin: add methods to set and get reserved space References: <1460479373-63317-1-git-send-email-bfoster@redhat.com> <1460479373-63317-6-git-send-email-bfoster@redhat.com> <20160413174442.GD18517@birch.djwong.org> <20160413183352.GB2775@bfoster.bfoster> <20160413204117.GA6870@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160413204117.GA6870@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460646616 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Apr 13 2016 at 4:41pm -0400, Brian Foster wrote: > On Wed, Apr 13, 2016 at 02:33:52PM -0400, Brian Foster wrote: > > On Wed, Apr 13, 2016 at 10:44:42AM -0700, Darrick J. Wong wrote: > > > On Tue, Apr 12, 2016 at 12:42:48PM -0400, Brian Foster wrote: > > > > From: Joe Thornber > > > > > > > > Experimental reserve interface for XFS guys to play with. > > > > > > > > I have big reservations (no pun intended) about this patch. > > > > > > > > [BF: > > > > - Support for reservation reduction. > > > > - Support for space provisioning. > > > > - Condensed to a single function.] > > > > > > > > Not-Signed-off-by: Joe Thornber > > > > Not-Signed-off-by: Mike Snitzer > > > > --- > > > > drivers/md/dm-thin.c | 181 ++++++++++++++++++++++++++++++++++++++++++++++++--- > > > > 1 file changed, 171 insertions(+), 10 deletions(-) > > > > > > > > diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c > > > > index 92237b6..32bc5bd 100644 > > > > --- a/drivers/md/dm-thin.c > > > > +++ b/drivers/md/dm-thin.c > > ... > > > > @@ -4271,6 +4343,94 @@ static void thin_io_hints(struct dm_target *ti, struct queue_limits *limits) > > > > limits->max_discard_sectors = 2048 * 1024 * 16; /* 16G */ > > > > } > > > > > > > > +static int thin_provision_space(struct dm_target *ti, sector_t offset, > > > > + sector_t len, sector_t *res) > > > > +{ > > > > + struct thin_c *tc = ti->private; > > > > + struct pool *pool = tc->pool; > > > > + sector_t end; > > > > + dm_block_t pblock; > > > > + dm_block_t vblock; > > > > + int error; > > > > + struct dm_thin_lookup_result lookup; > > > > + > > > > + if (!is_factor(offset, pool->sectors_per_block)) > > > > + return -EINVAL; > > > > + > > > > + if (!len || !is_factor(len, pool->sectors_per_block)) > > > > + return -EINVAL; > > > > + > > > > + if (res && !is_factor(*res, pool->sectors_per_block)) > > > > + return -EINVAL; > > > > + > > > > + end = offset + len; > > > > + > > > > + while (offset < end) { > > > > + vblock = offset; > > > > + do_div(vblock, pool->sectors_per_block); > > > > + > > > > + error = dm_thin_find_block(tc->td, vblock, true, &lookup); > > > > + if (error == 0) > > > > + goto next; > > > > + if (error != -ENODATA) > > > > + return error; > > > > + > > > > + error = alloc_data_block(tc, &pblock); > > > > > > So this means that if fallocate wants to BDEV_RES_PROVISION N blocks, it must > > > first increase the reservation (BDEV_RES_MOD) by N blocks to avoid using up > > > space that was previously reserved by some other caller. I think? > > > > > > > Yes, assuming this is being called from a filesystem using the > > reservation mechanism. Brian, I need to circle back with you to understand why XFS even needs reservation as opposed to just using something like fallocate (which would provision the space before you actually initiate the IO that would use it). But we can discuss that in person and then report back to the list if it makes it easier... > > > > + if (error) > > > > + return error; > > > > + > > > > + error = dm_thin_insert_block(tc->td, vblock, pblock); > > > > > > Having reserved and mapped blocks, what happens when we try to read them? > > > Do we actually get zeroes, or does the read go straight through to whatever > > > happens to be in the disk blocks? I don't think it's correct that we could > > > BDEV_RES_PROVISION and end up with stale credit card numbers from some other > > > thin device. > > > > > > > Agree, but I'm not really sure how this works in thinp tbh. fallocate > > wasn't really on my mind when doing this. I was simply trying to cobble > > together what I could to facilitate making progress on the fs parts > > (e.g., I just needed a call that allocated blocks and consumed > > reservation in the process). > > > > Skimming through the dm-thin code, it looks like a (configurable) block > > zeroing mechanism can be triggered from somewhere around > > provision_block()->schedule_zero(), depending on whether the incoming > > write overwrites the newly allocated block. If that's the case, then I > > suspect that means reads would just fall through to the block and return > > whatever was on disk. This code would probably need to tie into that > > zeroing mechanism one way or another to deal with that issue. (Though > > somebody who actually knows something about dm-thin should verify that. > > :) > > > > BTW, if that mechanism is in fact doing I/O, that might not be the > appropriate solution for fallocate. Perhaps we'd have to consider an > unwritten flag or some such in dm-thin, if possible. DM thinp defaults to enabling 'zero_new_blocks' (can be disabled using the 'skip_block_zeroing' feature when loading the DM table for the thin-pool). With block-zeroing any blocks that are provisioned _will_ be overwritten with zeroes (using dm-kcopyd which is trained to use WRITE_SAME if supported). But yeah, for fallocate.. certainly not something we want as it defeats the point of fallocate being cheap. So we probably would need a flag comparable to the ext4-stale-flag-that-shall-not-be-named ;) Mike From msnitzer@redhat.com Thu Apr 14 10:18:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 40E487CA1 for ; Thu, 14 Apr 2016 10:18:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A88428F8049 for ; Thu, 14 Apr 2016 08:18:31 -0700 (PDT) X-ASG-Debug-ID: 1460647109-04bdf011035641f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id fSnBzYlIyjktRFWj (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 14 Apr 2016 08:18:30 -0700 (PDT) X-Barracuda-Envelope-From: msnitzer@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C22CADB000; Thu, 14 Apr 2016 15:18:29 +0000 (UTC) Received: from localhost (dhcp-25-149.bos.redhat.com [10.18.25.149]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3EFISgQ010450 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA256 bits=256 verify=NO); Thu, 14 Apr 2016 11:18:29 -0400 Date: Thu, 14 Apr 2016 11:18:28 -0400 From: Mike Snitzer To: "Darrick J. Wong" Cc: linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, Brian Foster , dm-devel@redhat.com, xfs@oss.sgi.com Subject: Re: [RFC PATCH] block: wire blkdev_fallocate() to block_device_operations' reserve_space Message-ID: <20160414151828.GB13074@redhat.com> X-ASG-Orig-Subj: Re: [RFC PATCH] block: wire blkdev_fallocate() to block_device_operations' reserve_space References: <1460479373-63317-1-git-send-email-bfoster@redhat.com> <20160412200459.GA10730@redhat.com> <20160412203904.GD5812@birch.djwong.org> <20160412210426.GA1845@redhat.com> <20160413001243.GA25280@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160413001243.GA25280@birch.djwong.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 14 Apr 2016 15:18:29 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460647110 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Apr 12 2016 at 8:12pm -0400, Darrick J. Wong wrote: > On Tue, Apr 12, 2016 at 05:04:27PM -0400, Mike Snitzer wrote: > > On Tue, Apr 12 2016 at 4:39pm -0400, > > Darrick J. Wong wrote: > > > > > On Tue, Apr 12, 2016 at 04:04:59PM -0400, Mike Snitzer wrote: > > > > diff --git a/fs/block_dev.c b/fs/block_dev.c > > > > index 5a2c3ab..b34c07b 100644 > > > > --- a/fs/block_dev.c > > > > +++ b/fs/block_dev.c > > > > @@ -1801,17 +1801,13 @@ long blkdev_fallocate(struct file *file, int mode, loff_t start, loff_t len) > > > > struct request_queue *q = bdev_get_queue(bdev); > > > > struct address_space *mapping; > > > > loff_t end = start + len - 1; > > > > - loff_t bs_mask, isize; > > > > + loff_t isize; > > > > int error; > > > > > > > > /* We only support zero range and punch hole. */ > > > > if (mode & ~BLKDEV_FALLOC_FL_SUPPORTED) > > > > return -EOPNOTSUPP; > > > > > > > > - /* We haven't a primitive for "ensure space exists" right now. */ > > > > - if (!(mode & ~FALLOC_FL_KEEP_SIZE)) > > > > - return -EOPNOTSUPP; > > > > - > > > > /* Only punch if the device can do zeroing discard. */ > > > > if ((mode & FALLOC_FL_PUNCH_HOLE) && > > > > (!blk_queue_discard(q) || !q->limits.discard_zeroes_data)) > > > > @@ -1829,9 +1825,12 @@ long blkdev_fallocate(struct file *file, int mode, loff_t start, loff_t len) > > > > return -EINVAL; > > > > } > > > > > > > > - /* Don't allow IO that isn't aligned to logical block size */ > > > > - bs_mask = bdev_logical_block_size(bdev) - 1; > > > > - if ((start | len) & bs_mask) > > > > + /* > > > > + * Don't allow IO that isn't aligned to minimum IO size (io_min) > > > > + * - for normal device's io_min is usually logical block size > > > > + * - but for more exotic devices (e.g. DM thinp) it may be larger > > > > + */ > > > > + if ((start | len) % bdev_io_min(bdev)) > > I started by noticing the 64-bit division. Oops, yeah good point. I did said my patch was untested (didn't mention that it wasn't even compile tested.. RFC and all) ;) > However, in researching alignment > requirements for fallocate, I noticed that nothing says that we can return > -EINVAL for unaligned offset/len for allocate or punch. For file allocations > ext4 and xfs simply enlarge the range so that the ends are aligned to the > logical block size; for punch they both shrink the range to deallocate until > the ends are aligned, and write zeroes to the partial blocks. > > At least for user-visible fallocate we should do likewise, but for the internal > blkdev_ helpers I think it makes more sense to check lbs alignment and let the > lower level driver reject the IO if min_io alignment is a hard requirement. > Documentation/block/queue-sysfs.txt says that the min_io is the smallest > /preferred/ size. Thinking about this all further. Alignment on allocation isn't a big deal for thinp. If the extent requested isn't properly aligned we'll still do the right thing (which is to round-up and allocate a block at the beginning and/or end to fulfill the request). As for discard, DM-thinp silently drops the discard of the beginning and/or end that isn't aligned on a thinp blocksize boundary -- that is DM thinp doesn't unmap the corresponding thinp block because the partial block is still considered used. But thinp still passes down the appropriate discard for that subset of the still-mapped thinp block to the underlying storage (if discard passdown in enabled on the DM thin-pool). > But, before that, I'll push out some new fallocate patches for -rc3. > > > > > return -EINVAL; > > > > > > Noted. Will update the original patch. > > > > BTW, I just noticed your "block: require write_same and discard requests > > align to logical block size" -- doesn't look right. > > What happens if we pass a request to thinp that isn't aligned to > minimum_io_size? Does it reject the command? I hope I answered that above just now. SO.. it seems we can avoid the mess of worrying about minimum_io_size alignment (both for this fallocate interface and discard). From bfoster@redhat.com Thu Apr 14 11:23:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A654D7CA0 for ; Thu, 14 Apr 2016 11:23:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 760BD304032 for ; Thu, 14 Apr 2016 09:23:48 -0700 (PDT) X-ASG-Debug-ID: 1460651026-04cbb02e1c261dd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 1lFEN0Ja46si9fSZ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 14 Apr 2016 09:23:47 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 086E8C062C94; Thu, 14 Apr 2016 16:23:46 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-148.bos.redhat.com [10.18.41.148]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3EGNj7p022496; Thu, 14 Apr 2016 12:23:45 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id DED9C120078; Thu, 14 Apr 2016 12:23:44 -0400 (EDT) Date: Thu, 14 Apr 2016 12:23:44 -0400 From: Brian Foster To: Mike Snitzer Cc: "Darrick J. Wong" , dm-devel@redhat.com, xfs@oss.sgi.com, linux-block@vger.kernel.org, Joe Thornber , linux-fsdevel@vger.kernel.org Subject: Re: [RFC v2 PATCH 05/10] dm thin: add methods to set and get reserved space Message-ID: <20160414162344.GG20696@bfoster.bfoster> X-ASG-Orig-Subj: Re: [RFC v2 PATCH 05/10] dm thin: add methods to set and get reserved space References: <1460479373-63317-1-git-send-email-bfoster@redhat.com> <1460479373-63317-6-git-send-email-bfoster@redhat.com> <20160413174442.GD18517@birch.djwong.org> <20160413183352.GB2775@bfoster.bfoster> <20160413204117.GA6870@bfoster.bfoster> <20160414151014.GA13074@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160414151014.GA13074@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460651027 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Apr 14, 2016 at 11:10:14AM -0400, Mike Snitzer wrote: > On Wed, Apr 13 2016 at 4:41pm -0400, > Brian Foster wrote: > > > On Wed, Apr 13, 2016 at 02:33:52PM -0400, Brian Foster wrote: > > > On Wed, Apr 13, 2016 at 10:44:42AM -0700, Darrick J. Wong wrote: > > > > On Tue, Apr 12, 2016 at 12:42:48PM -0400, Brian Foster wrote: > > > > > From: Joe Thornber > > > > > > > > > > Experimental reserve interface for XFS guys to play with. > > > > > > > > > > I have big reservations (no pun intended) about this patch. > > > > > > > > > > [BF: > > > > > - Support for reservation reduction. > > > > > - Support for space provisioning. > > > > > - Condensed to a single function.] > > > > > > > > > > Not-Signed-off-by: Joe Thornber > > > > > Not-Signed-off-by: Mike Snitzer > > > > > --- > > > > > drivers/md/dm-thin.c | 181 ++++++++++++++++++++++++++++++++++++++++++++++++--- > > > > > 1 file changed, 171 insertions(+), 10 deletions(-) > > > > > > > > > > diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c > > > > > index 92237b6..32bc5bd 100644 > > > > > --- a/drivers/md/dm-thin.c > > > > > +++ b/drivers/md/dm-thin.c > > > ... > > > > > @@ -4271,6 +4343,94 @@ static void thin_io_hints(struct dm_target *ti, struct queue_limits *limits) > > > > > limits->max_discard_sectors = 2048 * 1024 * 16; /* 16G */ > > > > > } > > > > > > > > > > +static int thin_provision_space(struct dm_target *ti, sector_t offset, > > > > > + sector_t len, sector_t *res) > > > > > +{ > > > > > + struct thin_c *tc = ti->private; > > > > > + struct pool *pool = tc->pool; > > > > > + sector_t end; > > > > > + dm_block_t pblock; > > > > > + dm_block_t vblock; > > > > > + int error; > > > > > + struct dm_thin_lookup_result lookup; > > > > > + > > > > > + if (!is_factor(offset, pool->sectors_per_block)) > > > > > + return -EINVAL; > > > > > + > > > > > + if (!len || !is_factor(len, pool->sectors_per_block)) > > > > > + return -EINVAL; > > > > > + > > > > > + if (res && !is_factor(*res, pool->sectors_per_block)) > > > > > + return -EINVAL; > > > > > + > > > > > + end = offset + len; > > > > > + > > > > > + while (offset < end) { > > > > > + vblock = offset; > > > > > + do_div(vblock, pool->sectors_per_block); > > > > > + > > > > > + error = dm_thin_find_block(tc->td, vblock, true, &lookup); > > > > > + if (error == 0) > > > > > + goto next; > > > > > + if (error != -ENODATA) > > > > > + return error; > > > > > + > > > > > + error = alloc_data_block(tc, &pblock); > > > > > > > > So this means that if fallocate wants to BDEV_RES_PROVISION N blocks, it must > > > > first increase the reservation (BDEV_RES_MOD) by N blocks to avoid using up > > > > space that was previously reserved by some other caller. I think? > > > > > > > > > > Yes, assuming this is being called from a filesystem using the > > > reservation mechanism. > > Brian, I need to circle back with you to understand why XFS even needs > reservation as opposed to just using something like fallocate (which > would provision the space before you actually initiate the IO that would > use it). But we can discuss that in person and then report back to the > list if it makes it easier... > The primary reason is delayed allocation. Buffered writes to the fs copy data into the pagecache before the physical space has been allocated. E.g., we only modify the free blocks counters at write() time in order to guarantee that we have space somewhere in the fs. The physical extents aren't allocated until later at writeback time. So reservation from dm-thin basically extends the mechanism to also guarantee that the underlying thin volume has space for writes that we've received but haven't written back yet. > > > > > + if (error) > > > > > + return error; > > > > > + > > > > > + error = dm_thin_insert_block(tc->td, vblock, pblock); > > > > > > > > Having reserved and mapped blocks, what happens when we try to read them? > > > > Do we actually get zeroes, or does the read go straight through to whatever > > > > happens to be in the disk blocks? I don't think it's correct that we could > > > > BDEV_RES_PROVISION and end up with stale credit card numbers from some other > > > > thin device. > > > > > > > > > > Agree, but I'm not really sure how this works in thinp tbh. fallocate > > > wasn't really on my mind when doing this. I was simply trying to cobble > > > together what I could to facilitate making progress on the fs parts > > > (e.g., I just needed a call that allocated blocks and consumed > > > reservation in the process). > > > > > > Skimming through the dm-thin code, it looks like a (configurable) block > > > zeroing mechanism can be triggered from somewhere around > > > provision_block()->schedule_zero(), depending on whether the incoming > > > write overwrites the newly allocated block. If that's the case, then I > > > suspect that means reads would just fall through to the block and return > > > whatever was on disk. This code would probably need to tie into that > > > zeroing mechanism one way or another to deal with that issue. (Though > > > somebody who actually knows something about dm-thin should verify that. > > > :) > > > > > > > BTW, if that mechanism is in fact doing I/O, that might not be the > > appropriate solution for fallocate. Perhaps we'd have to consider an > > unwritten flag or some such in dm-thin, if possible. > > DM thinp defaults to enabling 'zero_new_blocks' (can be disabled using > the 'skip_block_zeroing' feature when loading the DM table for the > thin-pool). With block-zeroing any blocks that are provisioned _will_ > be overwritten with zeroes (using dm-kcopyd which is trained to use > WRITE_SAME if supported). > Ok, thanks. > But yeah, for fallocate.. certainly not something we want as it defeats > the point of fallocate being cheap. > Indeed. > So we probably would need a flag comparable to the > ext4-stale-flag-that-shall-not-be-named ;) > Any chance to support an unwritten flag for all blocks that are allocated via fallocate? E.g., subsequent reads detect the flag and return zeroes as if the block wasn't there and a subsequent write clears the flag (doing any partial block zeroing that might be necessary as well). Brian > Mike > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From jtulak@redhat.com Thu Apr 14 12:15:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 369AB7CA0 for ; Thu, 14 Apr 2016 12:15:10 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id BA713AC007 for ; Thu, 14 Apr 2016 10:15:06 -0700 (PDT) X-ASG-Debug-ID: 1460654105-04bdf0110356f3f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id NGEa3Tf3qxDdOIA1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 14 Apr 2016 10:15:06 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9385C2202D for ; Thu, 14 Apr 2016 17:15:05 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3EHF4Xp005891; Thu, 14 Apr 2016 13:15:04 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: Jan Tulak Subject: [PATCH] build: make librt optional for some platforms Date: Thu, 14 Apr 2016 19:14:59 +0200 X-ASG-Orig-Subj: [PATCH] build: make librt optional for some platforms Message-Id: <1460654099-6397-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460654106 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The functions that we use from librt on Linux are in other libraries on OS X. So make it possible to disable librt. The hardcoded librt dependency was added in 0caa2bae. Signed-off-by: Jan Tulak --- configure.ac | 7 +++++-- doc/INSTALL | 6 +++++- m4/package_rt.m4 | 12 ++++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 m4/package_rt.m4 diff --git a/configure.ac b/configure.ac index 6d012ce..ed67e74 100644 --- a/configure.ac +++ b/configure.ac @@ -56,8 +56,10 @@ AC_ARG_ENABLE(lib64, enable_lib64=yes) AC_SUBST(enable_lib64) -librt="-lrt" -AC_SUBST(librt) +AC_ARG_ENABLE(librt, +[ --enable-librt=[yes/no] Enable librt support [default=yes]],, + enable_librt=yes) +AC_SUBST(enable_librt) # # If the user specified a libdir ending in lib64 do not append another @@ -103,6 +105,7 @@ AC_SUBST(LOCALIZED_FILES) AC_PACKAGE_GLOBALS(xfsprogs) AC_PACKAGE_UTILITIES(xfsprogs) AC_MULTILIB($enable_lib64) +AC_RT($enable_librt) AC_PACKAGE_NEED_UUID_H AC_PACKAGE_NEED_UUIDCOMPARE diff --git a/doc/INSTALL b/doc/INSTALL index b0443a3..0879612 100644 --- a/doc/INSTALL +++ b/doc/INSTALL @@ -89,7 +89,11 @@ Mac OS X Instructions TAR=/usr/bin/gnutar LIBTOOL=/usr/bin/glibtool INSTALL_GROUP=wheel - LOCAL_CONFIGURE_OPTIONS="--enable-gettext=no --enable-blkid=no" + LOCAL_CONFIGURE_OPTIONS="\ + --enable-gettext=no\ + --enable-blkid=no\ + --enable-librt=no\ + " $ make $ su root diff --git a/m4/package_rt.m4 b/m4/package_rt.m4 new file mode 100644 index 0000000..9ad1009 --- /dev/null +++ b/m4/package_rt.m4 @@ -0,0 +1,12 @@ +# Check if the platform has librt +# + +AC_DEFUN([AC_RT], +[ + if test "$enable_librt" = "yes"; then + librt="-lrt" + else + librt="" + fi + AC_SUBST(librt) +]) -- 2.6.0 From msnitzer@redhat.com Thu Apr 14 15:18:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 84A7A7CA0 for ; Thu, 14 Apr 2016 15:18:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4934B8F8037 for ; Thu, 14 Apr 2016 13:18:16 -0700 (PDT) X-ASG-Debug-ID: 1460665094-04cb6c246059fbc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wS59uCJWzhzCbBrO (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 14 Apr 2016 13:18:14 -0700 (PDT) X-Barracuda-Envelope-From: msnitzer@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 462127D0D5; Thu, 14 Apr 2016 20:18:14 +0000 (UTC) Received: from localhost (dhcp-25-149.bos.redhat.com [10.18.25.149]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3EKIDfp026984 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA256 bits=256 verify=NO); Thu, 14 Apr 2016 16:18:13 -0400 Date: Thu, 14 Apr 2016 16:18:12 -0400 From: Mike Snitzer To: Brian Foster Cc: "Darrick J. Wong" , Joe Thornber , xfs@oss.sgi.com, linux-block@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org Subject: Re: [RFC v2 PATCH 05/10] dm thin: add methods to set and get reserved space Message-ID: <20160414201812.GA14466@redhat.com> X-ASG-Orig-Subj: Re: [RFC v2 PATCH 05/10] dm thin: add methods to set and get reserved space References: <1460479373-63317-1-git-send-email-bfoster@redhat.com> <1460479373-63317-6-git-send-email-bfoster@redhat.com> <20160413174442.GD18517@birch.djwong.org> <20160413183352.GB2775@bfoster.bfoster> <20160413204117.GA6870@bfoster.bfoster> <20160414151014.GA13074@redhat.com> <20160414162344.GG20696@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160414162344.GG20696@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460665094 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Apr 14 2016 at 12:23pm -0400, Brian Foster wrote: > On Thu, Apr 14, 2016 at 11:10:14AM -0400, Mike Snitzer wrote: > > > > Brian, I need to circle back with you to understand why XFS even needs > > reservation as opposed to just using something like fallocate (which > > would provision the space before you actually initiate the IO that would > > use it). But we can discuss that in person and then report back to the > > list if it makes it easier... > > > > The primary reason is delayed allocation. Buffered writes to the fs copy > data into the pagecache before the physical space has been allocated. > E.g., we only modify the free blocks counters at write() time in order > to guarantee that we have space somewhere in the fs. The physical > extents aren't allocated until later at writeback time. > > So reservation from dm-thin basically extends the mechanism to also > guarantee that the underlying thin volume has space for writes that > we've received but haven't written back yet. OK, so even if/when we have bdev_fallocate support that would be more rigid than XFS would like. As you've said, the XFS established reservation is larger than is really needed. Whereas regularly provisioning more than is actually needed is a recipe for disaster. > > > > > > + if (error) > > > > > > + return error; > > > > > > + > > > > > > + error = dm_thin_insert_block(tc->td, vblock, pblock); > > > > > > > > > > Having reserved and mapped blocks, what happens when we try to read them? > > > > > Do we actually get zeroes, or does the read go straight through to whatever > > > > > happens to be in the disk blocks? I don't think it's correct that we could > > > > > BDEV_RES_PROVISION and end up with stale credit card numbers from some other > > > > > thin device. > > > > > > > > > > > > > Agree, but I'm not really sure how this works in thinp tbh. fallocate > > > > wasn't really on my mind when doing this. I was simply trying to cobble > > > > together what I could to facilitate making progress on the fs parts > > > > (e.g., I just needed a call that allocated blocks and consumed > > > > reservation in the process). > > > > > > > > Skimming through the dm-thin code, it looks like a (configurable) block > > > > zeroing mechanism can be triggered from somewhere around > > > > provision_block()->schedule_zero(), depending on whether the incoming > > > > write overwrites the newly allocated block. If that's the case, then I > > > > suspect that means reads would just fall through to the block and return > > > > whatever was on disk. This code would probably need to tie into that > > > > zeroing mechanism one way or another to deal with that issue. (Though > > > > somebody who actually knows something about dm-thin should verify that. > > > > :) > > > > > > > > > > BTW, if that mechanism is in fact doing I/O, that might not be the > > > appropriate solution for fallocate. Perhaps we'd have to consider an > > > unwritten flag or some such in dm-thin, if possible. > > > > DM thinp defaults to enabling 'zero_new_blocks' (can be disabled using > > the 'skip_block_zeroing' feature when loading the DM table for the > > thin-pool). With block-zeroing any blocks that are provisioned _will_ > > be overwritten with zeroes (using dm-kcopyd which is trained to use > > WRITE_SAME if supported). > > > > Ok, thanks. > > > But yeah, for fallocate.. certainly not something we want as it defeats > > the point of fallocate being cheap. > > > > Indeed. > > > So we probably would need a flag comparable to the > > ext4-stale-flag-that-shall-not-be-named ;) > > > > Any chance to support an unwritten flag for all blocks that are > allocated via fallocate? E.g., subsequent reads detect the flag and > return zeroes as if the block wasn't there and a subsequent write clears > the flag (doing any partial block zeroing that might be necessary as > well). Yeah, I've already started talking to Joe about doing exactly that. Without it we cannot securely provide fallocate support in DM thinp. I'll keep discussing with Joe... he doesn't like this requirement but we'll work through it. From ming.lei@canonical.com Thu Apr 14 17:22:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3848A7CA0 for ; Thu, 14 Apr 2016 17:22:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F13268F8033 for ; Thu, 14 Apr 2016 15:22:37 -0700 (PDT) X-ASG-Debug-ID: 1460672554-04cb6c245f5b0ec0001-NocioJ Received: from youngberry.canonical.com (youngberry.canonical.com [91.189.89.112]) by cuda.sgi.com with ESMTP id vjZA4fxEYEAnHiga (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 14 Apr 2016 15:22:35 -0700 (PDT) X-Barracuda-Envelope-From: ming.lei@canonical.com X-Barracuda-Apparent-Source-IP: 91.189.89.112 Received: from mail-yw0-f176.google.com ([209.85.161.176]) by youngberry.canonical.com with esmtpsa (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.76) (envelope-from ) id 1aqpek-0005Ia-1V for xfs@oss.sgi.com; Thu, 14 Apr 2016 22:22:34 +0000 Received: by mail-yw0-f176.google.com with SMTP id i84so119137511ywc.2 for ; Thu, 14 Apr 2016 15:22:33 -0700 (PDT) X-Gm-Message-State: AOPr4FV9U4IHAX847LEFwLGEW4Ro+/lz1jqVZPT4QSCoIv4kxVS+D7H4O6sHw+fr5og41gQf5DUJg7QWKXez/w== MIME-Version: 1.0 X-Received: by 10.129.145.150 with SMTP id i144mr9958823ywg.163.1460672553075; Thu, 14 Apr 2016 15:22:33 -0700 (PDT) Received: by 10.37.36.197 with HTTP; Thu, 14 Apr 2016 15:22:33 -0700 (PDT) In-Reply-To: <570FA4F7.6020301@kernel.dk> References: <1460634438-26530-1-git-send-email-ming.lei@canonical.com> <570FA4F7.6020301@kernel.dk> Date: Fri, 15 Apr 2016 06:22:33 +0800 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH v4 0/8] block: prepare for multipage bvecs From: Ming Lei X-ASG-Orig-Subj: Re: [PATCH v4 0/8] block: prepare for multipage bvecs To: Jens Axboe Cc: Jens Axboe , Linux Kernel Mailing List , linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , "open list:DRBD DRIVER" , Jan Kara , Keith Busch , Kent Overstreet , "Kirill A. Shutemov" , Mike Snitzer , Shaohua Li , Tejun Heo , "open list:XFS FILESYSTEM" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: youngberry.canonical.com[91.189.89.112] X-Barracuda-Start-Time: 1460672555 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28743 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Apr 14, 2016 at 10:11 PM, Jens Axboe wrote: > On 04/14/2016 05:46 AM, Ming Lei wrote: >> >> Hi, >> >> Interests[1] have been shown in multipage bvecs, so this patchset >> try to prepare for the support and do two things: >> >> 1) the 1st 4 patches use bvec iterator to implement iterate_bvec(), >> then we can drop the non-standard way for iterating bvec, which >> can be thought as a good cleanup for lib/iov_iter.c >> >> 2) remove BIO_MAX_SECTORS & BIO_MAX_SIZE, and now there is only >> one user for each. Once multipage bvecs is introduced, one bio >> may hold lots of sectors, and we should always use sort of BIO_MAX_VECS >> which should be introduced in future and is similiar with current >> BIO_MAX_PAGES. >> >> xfstests(-a auto) have been run over ext4/xfs and no regression found >> by this patchset. > > > We've had too many disasters in the block layer the last few series, I'm > making the 4.7 round a nice and small one. I don't mind taking prep patches > for the multipage bvecs, if they are simple and clean, but that's about the > extent of it. > > Just a heads up. Jens, thanks for your response, and understood your concerns. Please hold on this patchset, and I will check it further and make it better. Thanks, From david@fromorbit.com Thu Apr 14 18:31:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2787A7CA0 for ; Thu, 14 Apr 2016 18:31:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 724E3AC001 for ; Thu, 14 Apr 2016 16:31:08 -0700 (PDT) X-ASG-Debug-ID: 1460676664-04cb6c24645b9740001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id oQUFYJbo7Vru3xQK for ; Thu, 14 Apr 2016 16:31:04 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AhDwARJxBXNaAZLHlegziBUIJyg3mfNAEBBowQhWiEDoYIAgIBAQKBP00BAQEBAQEHAQEBAUEBQIRBAQEBBCcTHB4FEAgDDgcDCSUPBSUDBxoTiCjCSgEBCAIBHRmFQIUTihUFmAuOA48ajymEWyowiUYBAQE Received: from ppp121-44-25-160.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.160]) by ipmail05.adl6.internode.on.net with ESMTP; 15 Apr 2016 09:01:02 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aqqiz-0000Os-Vo; Fri, 15 Apr 2016 09:31:02 +1000 Date: Fri, 15 Apr 2016 09:31:01 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 07/11] xfs: mark reclaimed inodes invalid earlier Message-ID: <20160414233101.GY567@dastard> X-ASG-Orig-Subj: Re: [PATCH 07/11] xfs: mark reclaimed inodes invalid earlier References: <1460525492-1170-1-git-send-email-david@fromorbit.com> <1460525492-1170-8-git-send-email-david@fromorbit.com> <20160413064900.GP567@dastard> <20160414121048.GB20696@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160414121048.GB20696@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: 1460676664 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28744 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Apr 14, 2016 at 08:10:49AM -0400, Brian Foster wrote: > On Wed, Apr 13, 2016 at 04:49:00PM +1000, Dave Chinner wrote: > > On Wed, Apr 13, 2016 at 03:31:28PM +1000, Dave Chinner wrote: > > > From: Dave Chinner > > > > > > The last thing we do before using call_rcu() on an xfs_inode to be > > > freed is mark it as invalid. This means there is a window between > > > when we know for certain that the inode is going to be freed and > > > when we do actually mark it as "freed". > > > > > > This is important in the context of RCU lookups - we can look up the > > > inode, find that it is valid, and then use it as such not realising > > > that it is in the final stages of being freed. > > > > > > As such, mark the inode as being invalid the moment we know it is > > > going to be reclaimed. This can be done while we still hold the > > > XFS_ILOCK_EXCL and the flush lock in xfs_inode_reclaim, meaning that > > > it occurs well before we remove it from the radix tree, and that > > > the i_flags_lock, the XFS_ILOCK and the inode flush lock all act as > > > synchronisation points for detecting that an inode is about to go > > > away. > > > > > > For defensive purposes, this allows us to add a further check to > > > xfs_iflush_cluster to ensure we skip inodes that are being freed > > > after we grab the XFS_ILOCK_SHARED and the flush lock - we know that > > > if the inode number if valid while we have these locks held we know > > > that it has not progressed through reclaim to the point where it is > > > clean and is about to be freed. > > > > > > [bfoster: fixed __xfs_inode_clear_reclaim() using ip->i_ino after it > > > had already been zeroed.] > > > > And, of course, in reordering this I dropped this fix because it was > > handled by the reworking of tagging code to use pag->pag_agno. > > > > So I've brought that small change forward to this patch (using > > pag->pag_agno instead of deriving it from the ip->i_ino in > > __xfs_inode_clear_reclaim()). > > > > I don't see any such change in this patch..? > __xfs_inode_clear_reclaim() still uses ip->i_ino. I meant that I realised that I'd screwed it up and so I'd changed my local copy after I sent this. Cheers, Dave. -- Dave Chinner david@fromorbit.com From tireman@shaw.ca Thu Apr 14 23:23:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AE7077CA0 for ; Thu, 14 Apr 2016 23:23:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 40BDA304048 for ; Thu, 14 Apr 2016 21:23:52 -0700 (PDT) X-ASG-Debug-ID: 1460694222-04bdf011055b2ef0001-NocioJ Received: from smtp-out-no.shaw.ca (smtp-out-no.shaw.ca [64.59.134.13]) by cuda.sgi.com with ESMTP id MUgemEDFXdYKFTBD (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 14 Apr 2016 21:23:43 -0700 (PDT) X-Barracuda-Envelope-From: tireman@shaw.ca X-Barracuda-Apparent-Source-IP: 64.59.134.13 Received: from [192.168.0.2] ([174.5.126.242]) by shaw.ca with SMTP id qvIBaWsFCUnqMqvICaoNCv; Thu, 14 Apr 2016 22:23:41 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=shaw.ca; s=s20150330; t=1460694221; bh=yIZJ7yp3FqAnztx3XO5iBd1xvqTnIMEVqiQPCwLFEJM=; h=Subject:To:References:Cc:From:Date:In-Reply-To; b=sdHkF4VQWb7AXoyPnbDNBmPAyxGwKR2uKOMYp12nFjwajQUzU9osWSQpOAIlqDhfH 3v0rpAlxOCX2pJsdTHm8ChVON0ip9L5eIkL8DhuYqZ6dFcodD4OAYmvq4Cq/TGGLoi Kg1w1xNK+CL+Q1PBIOHVoEmA2jXy35dXBTrKv+lea9Wl6Fm9jLslgNwhukTHkeTYI3 GAt9MB34A8Gy//y1khBOVCHMpjKhUKKAeCfWWSkVK5I0U5U6SHnNgX1512qeB4HkHm micKKGKKt5Ht4a1zuA2JGtYhunft2GHwv4WFpbOR+kopEuMyAuiRO+f478MLsmmoy2 buPvUFmFA0KEw== X-Authority-Analysis: v=2.2 cv=bJxUG72Z c=1 sm=1 tr=0 a=YUpam8ogUlPMk4SS6ACeKg==:117 a=YUpam8ogUlPMk4SS6ACeKg==:17 a=N659UExz7-8A:10 a=eJfxgxciAAAA:8 a=bQhAohzIkdVv45aCDEQA:9 a=u6y7XGXDjVcuj0up:21 a=1nrcb6UjPH8S783X:21 Subject: Re: xfs_repair fails after trying to format log cycle? To: Brian Foster X-ASG-Orig-Subj: Re: xfs_repair fails after trying to format log cycle? References: <56F6DE67.60403@shaw.ca> <20160328085541.GA27040@bfoster.bfoster> <570C8D4D.3060304@shaw.ca> <20160412140512.GA59690@bfoster.bfoster> <570D578D.5010706@shaw.ca> <20160413121214.GA2775@bfoster.bfoster> <570EC95F.2010401@shaw.ca> Cc: xfs@oss.sgi.com, linux-raid@vger.kernel.org From: Andrew Ryder Message-ID: <57106CF5.3050501@shaw.ca> Date: Fri, 15 Apr 2016 00:24:21 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <570EC95F.2010401@shaw.ca> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-CMAE-Envelope: MS4wfEbk0faXxl3Hx5zhvQfhxcvHYLgHoRX9x2vJGitSZ6C+s6aDPj/by3PVb8sIfTRZmuHzRGLcHDCDyoTaGzRNINNxoRc5Sia4mct7lCHsr8SPMJg0PuLl XL0Yk4kuYx9oWDA1gaNXqRdcKMvTPb+B4XtE5uGJ7ba7M3ed925qOOFEohNdHIPOV3gN7/rMrydU8rWPukKPRDmX1j02Vvd8Vniu2CNro33F4/IDJOSx1Pzn X-Barracuda-Connect: smtp-out-no.shaw.ca[64.59.134.13] X-Barracuda-Start-Time: 1460694222 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28750 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 Success!! The problem was the superblock at the mdadm layer was messed up somehow. Re-creating the array to re-write the md superblock/metadata and running the first two xfs_repairs, without then with the -L option and it followed through then and completed the log formatting.. AND I can mount/unmount the array without having to run xfs_repair. For some reason running a check of the array did not throw any errors or correct the messed up array parameters? I'm going to assume when using md software arrays there is an md superblock as well as a superblock for the filesystem? If you want a copy of the output of 'dmesg' to peruse, I can forward it. Thanks again. Bigmouth ~ # mount /dev/md2 mount: /dev/md2: can't read superblock Bigmouth ~ # xfs_repair /dev/md2 Phase 1 - find and verify superblock... - reporting progress in intervals of 15 minutes Phase 2 - using internal log - zero log... Log inconsistent (didn't find previous header) failed to find log head zero_log: cannot find log head/tail (xlog_find_tail=5) fatal error -- ERROR: The log head and/or tail cannot be discovered. Attempt to mount the filesystem to replay the log or use the -L option to destroy the log and attempt a repair. Bigmouth ~ # xfs_repair -L /dev/md2 Phase 1 - find and verify superblock... - reporting progress in intervals of 15 minutes Phase 2 - using internal log - zero log... Log inconsistent (didn't find previous header) failed to find log head zero_log: cannot find log head/tail (xlog_find_tail=5) - scan filesystem freespace and inode maps... - 23:43:28: scanning filesystem freespace - 33 of 33 allocation groups done - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... - 23:43:28: scanning agi unlinked lists - 33 of 33 allocation groups done - process known inodes and perform inode discovery... - agno = 0 - agno = 15 - agno = 30 - agno = 16 - agno = 31 - agno = 1 - agno = 17 - agno = 32 - agno = 2 - agno = 18 - agno = 3 - agno = 19 - agno = 4 - agno = 20 - agno = 5 - agno = 21 - agno = 6 - agno = 22 - agno = 7 - agno = 23 - agno = 24 - agno = 8 - agno = 25 - agno = 9 - agno = 26 - agno = 10 - agno = 27 - agno = 11 - agno = 28 - agno = 12 - agno = 29 - agno = 13 - agno = 14 - 00:01:59: process known inodes and inode discovery - 5789504 of 5789504 inodes done - process newly discovered inodes... - 00:01:59: process newly discovered inodes - 33 of 33 allocation groups done Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - 00:01:59: setting up duplicate extent list - 33 of 33 allocation groups done - check for inodes claiming duplicate blocks... - agno = 2 - agno = 0 - agno = 4 - agno = 10 - agno = 17 - agno = 1 - agno = 25 - agno = 7 - agno = 9 - agno = 11 - agno = 3 - agno = 12 - agno = 14 - agno = 13 - agno = 15 - agno = 16 - agno = 5 - agno = 18 - agno = 8 - agno = 19 - agno = 20 - agno = 21 - agno = 24 - agno = 23 - agno = 26 - agno = 22 - agno = 27 - agno = 28 - agno = 30 - agno = 29 - agno = 31 - agno = 6 - agno = 32 - 00:02:00: check for inodes claiming duplicate blocks - 5789504 of 5789504 inodes done Phase 5 - rebuild AG headers and trees... - 00:02:01: rebuild AG headers and trees - 33 of 33 allocation groups done - reset superblock... Phase 6 - check inode connectivity... - resetting contents of realtime bitmap and summary inodes - traversing filesystem ... - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify and correct link counts... - 00:11:30: verify and correct link counts - 33 of 33 allocation groups done Maximum metadata LSN (64:2230592) is ahead of log (1:64). Format log to cycle 67. done On 04/13/2016 06:34 PM, Andrew Ryder wrote: > That seems to make sense. I've started a check of the array and see what > happens. I don't believe its a hardware error as neither sata pmp > controller I have it on logs any hardware/cabling related errors at all. > > Thanks for the help so far. I'll let you know how I make out if I ever > figure out where the gremlins are hiding.. > > On 04/13/2016 08:12 AM, Brian Foster wrote: >> On Tue, Apr 12, 2016 at 04:16:13PM -0400, Andrew Ryder wrote: >>> On 04/12/2016 10:05 AM, Brian Foster wrote: >>>> On Tue, Apr 12, 2016 at 01:53:17AM -0400, Andrew Ryder wrote: >>>>> >>>>> >>>>> On 03/28/2016 04:55 AM, Brian Foster wrote: >> ... >>>> What happens if you manually issue the read call that failed? E.g., >>>> umount the filesystem and run the following command directly against >>>> the >>>> array: >>>> >>>> xfs_io -dc "pread 3001552175104 2097152" /dev/md2 >>>> >>>> Brian >>> >>> It failed with the same error. I've attached the strace output for the >>> command. >>> >> >> Thanks, well that is interesting. The larger 2MB read eventually results >> in this smaller (4k) read that fails: >> >> 16:02:14.221784 pread64(3, 0x1ce7000, 4096, 3001553125376) = -1 EIO >> (Input/output error) >> >> So you could repeat that command with offset 3001553125376 and size 4k >> and just confirm that still fails. As Dave points out, something is >> wrong with the storage here and that is what needs to be resolved. >> >> With regard to the xfs_repair behavior... you're initially hitting a >> read error when the filesystem scans through the log looking for the >> head and tail to determine whether the log is dirty. If the log is >> zeroed, this sequence can be bypassed and the log assumed clean. I >> suspect by zeroing enough of the log before it fails, your repair >> sequence is just bypassing the log head/tail discovery that previously >> scanned areas of the disk that are having issues. In other words, it's >> just temporarily stepping around the problem until the log progresses >> back to this address range. >> >> What you probably have to do at this point is use the simple I/O error >> reproducer you have to try and determine why the storage returns an >> error. It could be anywhere from something broken in the md subsystem, >> to the controller driver, to a physical problem with the associated >> disk. I'd suggest to start by reporting to the md mailing list and work >> down from there... >> >> Brian >> >>> The array is fairly full so I'm wondering if something is out of >>> alignment >>> somewhere thats causing this? >>> >>> /dev/md2 5858060288 5245630392 612429896 90% /mnt/md2 >>> >>> When I had the array plugged into another controller which isn't a >>> rocketraid card, it did complain about all the drives not being aligned >>> properly? Somehow it looks like sdk wasn't partitioned the same as >>> the rest, >>> I'm wondering if thats screwing things up? >>> >>> GNU Parted 3.2 >>> Using /dev/sdi >>> Welcome to GNU Parted! Type 'help' to view a list of commands. >>> (parted) p >>> Model: ATA ST2000NC000-1CX1 (scsi) >>> Disk /dev/sdi: 2000GB >>> Sector size (logical/physical): 512B/512B >>> Partition Table: gpt >>> Disk Flags: >>> >>> Number Start End Size File system Name Flags >>> 1 1049kB 2000GB 2000GB >>> Number Start End Size File system Name Flags >>> 1 2048s 3907028991s 3907026944s >>> >>> >>> GNU Parted 3.2 >>> Using /dev/sdk >>> Welcome to GNU Parted! Type 'help' to view a list of commands. >>> (parted) p >>> Model: ATA ST2000DL001-9VT1 (scsi) >>> Disk /dev/sdk: 2000GB >>> Sector size (logical/physical): 512B/512B >>> Partition Table: msdos >>> Disk Flags: >>> >>> Number Start End Size Type File system Flags >>> 1 512B 2000GB 2000GB primary raid >>> Number Start End Size Type File system Flags >>> 1 1s 3907029167s 3907029167s primary raid >>> >>> >>> GNU Parted 3.2 >>> Using /dev/sdh >>> Welcome to GNU Parted! Type 'help' to view a list of commands. >>> (parted) p >>> Model: ATA ST2000DL001-9VT1 (scsi) >>> Disk /dev/sdh: 2000GB >>> Sector size (logical/physical): 512B/512B >>> Partition Table: gpt >>> Disk Flags: >>> >>> Number Start End Size File system Name Flags >>> 1 1049kB 2000GB 2000GB >>> Number Start End Size File system Name Flags >>> 1 2048s 3907028991s 3907026944s >>> >>> >>> GNU Parted 3.2 >>> Using /dev/sdm >>> Welcome to GNU Parted! Type 'help' to view a list of commands. >>> (parted) p >>> Model: ATA ST2000NC000-1CX1 (scsi) >>> Disk /dev/sdm: 2000GB >>> Sector size (logical/physical): 512B/512B >>> Partition Table: gpt >>> Disk Flags: >>> >>> Number Start End Size File system Name Flags >>> 1 1049kB 2000GB 2000GB >>> Number Start End Size File system Name Flags >>> 1 2048s 3907028991s 3907026944s >>> >>> >>> >>>> >>>>> >>>>> This all began when the RR2722 driver running under 3.18.15 >>>>> complained and >>>>> .. >>>>> >>>>> Mar 14 07:23:07 Bigmouth kernel: [7177248.090541] /dev/vmnet: port >>>>> on hub 0 >>>>> successfully opened >>>>> Mar 14 07:26:03 Bigmouth kernel: [7177424.552323] device eth1 left >>>>> promiscuous mode >>>>> Mar 14 07:26:03 Bigmouth kernel: [7177424.552786] bridge-eth1: >>>>> disabled >>>>> promiscuous mode >>>>> Mar 14 20:10:20 Bigmouth kernel: [7223317.069464] rr272x_1x:Task >>>>> file error, >>>>> StatusReg=0x51, ErrReg=0x84, LBA[0-3]=0x747dc92f,LBA[4-7]=0x0. >>>>> Mar 14 20:10:20 Bigmouth kernel: [7223317.179811] sd 5:0:1:0: [sdg] >>>>> Mar 14 20:10:21 Bigmouth kernel: [7223317.690439] Result: >>>>> hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK >>>>> Mar 14 20:10:21 Bigmouth kernel: [7223317.700480] sd 5:0:1:0: [sdg] >>>>> CDB: >>>>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211147] Write(10): 2a 00 >>>>> 74 7d c9 >>>>> 00 00 00 40 00 >>>>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211167] >>>>> blk_update_request: I/O >>>>> error, dev sdg, sector 1954400512 >>>>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211203] sd 5:0:3:0: [sdi] >>>>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211206] Result: >>>>> hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK >>>>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211209] sd 5:0:3:0: [sdi] >>>>> CDB: >>>>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211211] Write(10): 2a 00 >>>>> 74 7d c9 >>>>> 00 00 00 40 00 >>>>> Mar 14 20:10:21 Bigmouth kernel: [7223318.211223] >>>>> blk_update_request: I/O >>>>> error, dev sdi, sector 1954400512 >>>>> Mar 14 20:10:23 Bigmouth kernel: [7223319.957052] XFS (md2): >>>>> metadata I/O >>>>> error: block 0x15d6d4900 ("xlog_iodone") error 5 numblks 64 >>>>> Mar 14 20:10:23 Bigmouth kernel: [7223319.957064] XFS (md2): >>>>> xfs_do_force_shutdown(0x2) called from line 1181 of file >>>>> fs/xfs/xfs_log.c. >>>>> Return address = 0xffffffff812fdf96 >>>>> Mar 14 20:10:23 Bigmouth kernel: [7223319.957080] XFS (md2): Log >>>>> I/O Error >>>>> Detected. Shutting down filesystem >>>>> Mar 14 20:10:23 Bigmouth kernel: [7223319.957083] XFS (md2): Please >>>>> umount >>>>> the filesystem and rectify the problem(s) >>>>> Mar 14 20:10:23 Bigmouth kernel: [7223319.957093] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:10:50 Bigmouth kernel: [7223347.087272] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:11:20 Bigmouth kernel: [7223377.190469] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:11:50 Bigmouth kernel: [7223407.293952] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:12:20 Bigmouth kernel: [7223437.397444] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:12:23 Bigmouth kernel: [7223439.791407] nfsd: last server >>>>> has >>>>> exited, flushing export cache >>>>> Mar 14 20:12:50 Bigmouth kernel: [7223467.500928] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:13:20 Bigmouth kernel: [7223497.604420] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:13:50 Bigmouth kernel: [7223527.707899] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:14:21 Bigmouth kernel: [7223557.811399] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:14:51 Bigmouth kernel: [7223587.914932] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:15:21 Bigmouth kernel: [7223618.018362] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:15:51 Bigmouth kernel: [7223648.121779] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:16:19 Bigmouth kernel: [7223676.401069] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:16:21 Bigmouth kernel: [7223678.225334] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:16:27 Bigmouth kernel: [7223684.541305] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:16:27 Bigmouth kernel: [7223684.572176] XFS (md2): >>>>> xfs_log_force: >>>>> error -5 returned. >>>>> Mar 14 20:16:38 Bigmouth kernel: [7223694.918565] md2: unknown >>>>> partition >>>>> table >>>>> Mar 14 20:16:43 Bigmouth kernel: [7223700.425290] XFS (md2): >>>>> Mounting V5 >>>>> Filesystem >>>>> Mar 14 20:16:43 Bigmouth kernel: [7223700.545669] XFS (md2): Starting >>>>> recovery (logdev: internal) >>>>> Mar 14 20:16:44 Bigmouth kernel: [7223701.874245] XFS (md2): Ending >>>>> recovery >>>>> (logdev: internal) >>>>> Mar 14 20:30:31 Bigmouth kernel: [7224529.528678] md2: unknown >>>>> partition >>>>> table >>>>> >>>>> >>>>> >>>>> /dev/md2: >>>>> Version : 1.2 >>>>> Creation Time : Tue Oct 13 22:21:27 2015 >>>>> Raid Level : raid5 >>>>> Array Size : 5860147200 (5588.67 GiB 6000.79 GB) >>>>> Used Dev Size : 1953382400 (1862.89 GiB 2000.26 GB) >>>>> Raid Devices : 4 >>>>> Total Devices : 4 >>>>> Persistence : Superblock is persistent >>>>> >>>>> Intent Bitmap : Internal >>>>> >>>>> Update Time : Tue Apr 12 01:19:43 2016 >>>>> State : clean >>>>> Active Devices : 4 >>>>> Working Devices : 4 >>>>> Failed Devices : 0 >>>>> Spare Devices : 0 >>>>> >>>>> Layout : left-symmetric >>>>> Chunk Size : 512K >>>>> >>>>> Name : Bigmouth:2 (local to host Bigmouth) >>>>> UUID : ed979276:3459155c:a32f63da:0c684042 >>>>> Events : 62846 >>>>> >>>>> Number Major Minor RaidDevice State >>>>> 5 8 193 0 active sync /dev/sdm1 >>>>> 6 8 129 1 active sync /dev/sdi1 >>>>> 2 8 177 2 active sync /dev/sdl1 >>>>> 4 8 113 3 active sync /dev/sdh1 >>>>> >>>>> >>>>> meta-data=/dev/md2 isize=512 agcount=33, >>>>> agsize=45782272 >>>>> blks >>>>> = sectsz=512 attr=2, projid32bit=1 >>>>> = crc=1 finobt=1 spinodes=0 >>>>> data = bsize=4096 blocks=1465036800, >>>>> imaxpct=5 >>>>> = sunit=128 swidth=384 blks >>>>> naming =version 2 bsize=4096 ascii-ci=0 ftype=1 >>>>> log =internal bsize=4096 blocks=521728, version=2 >>>>> = sectsz=512 sunit=8 blks, >>>>> lazy-count=1 >>>>> realtime =none extsz=4096 blocks=0, rtextents=0 >>>>> >>>>> >>>>>> >>>>>>> >>>>>>> Checking the drives with smartctl shows no errors nor does >>>>>>> 'dmesg' show any >>>>>>> hardware i/o or controller related errors... >>>>>>> >>>>>>> I've tried scrubbing the array and no bad sectors are found either.. >>>>>>> >>>>>>> I'm running kernel 3.19.8 with xfsprogs 4.5. >>>>>>> >>>>>>> Thanks, >>>>>>> Andrew >>>>>>> >>>>>>> _______________________________________________ >>>>>>> xfs mailing list >>>>>>> xfs@oss.sgi.com >>>>>>> http://oss.sgi.com/mailman/listinfo/xfs >>>>>> >>>> >> >>> 16:02:14.159324 execve("/usr/sbin/xfs_io", ["xfs_io", "-dc", "pread >>> 3001552175104 2097152", "/dev/md2"], [/* 51 vars */]) = 0 >>> 16:02:14.160220 brk(NULL) = 0x1ce4000 >>> 16:02:14.160345 mmap(NULL, 4096, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e4a2000 >>> 16:02:14.160508 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No >>> such file or directory) >>> 16:02:14.160626 open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 >>> 16:02:14.160707 fstat(3, {st_mode=S_IFREG|0644, st_size=246250, ...}) >>> = 0 >>> 16:02:14.160791 mmap(NULL, 246250, PROT_READ, MAP_PRIVATE, 3, 0) = >>> 0x7f1c5e458000 >>> 16:02:14.160862 close(3) = 0 >>> 16:02:14.160959 open("/usr/lib64/libxcmd.so.0", O_RDONLY|O_CLOEXEC) = 3 >>> 16:02:14.161037 read(3, >>> "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@\37\0\0\0\0\0\0"..., >>> 832) = 832 >>> 16:02:14.161111 fstat(3, {st_mode=S_IFREG|0755, st_size=26832, ...}) = 0 >>> 16:02:14.161184 mmap(NULL, 2128384, PROT_READ|PROT_EXEC, >>> MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c5e070000 >>> 16:02:14.161254 mprotect(0x7f1c5e076000, 2093056, PROT_NONE) = 0 >>> 16:02:14.161325 mmap(0x7f1c5e275000, 8192, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5000) = 0x7f1c5e275000 >>> 16:02:14.161438 mmap(0x7f1c5e277000, 2560, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e277000 >>> 16:02:14.161525 close(3) = 0 >>> 16:02:14.161605 open("/lib64/libhandle.so.1", O_RDONLY|O_CLOEXEC) = 3 >>> 16:02:14.161683 read(3, >>> "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\17\0\0\0\0\0\0"..., >>> 832) = 832 >>> 16:02:14.161755 fstat(3, {st_mode=S_IFREG|0755, st_size=14224, ...}) = 0 >>> 16:02:14.161826 mmap(NULL, 2113800, PROT_READ|PROT_EXEC, >>> MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c5de68000 >>> 16:02:14.161896 mprotect(0x7f1c5de6b000, 2093056, PROT_NONE) = 0 >>> 16:02:14.161965 mmap(0x7f1c5e06a000, 8192, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f1c5e06a000 >>> 16:02:14.162049 mmap(0x7f1c5e06c000, 264, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e06c000 >>> 16:02:14.162131 close(3) = 0 >>> 16:02:14.162210 open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 >>> 16:02:14.162287 read(3, >>> "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\7\2\0\0\0\0\0"..., >>> 832) = 832 >>> 16:02:14.162359 fstat(3, {st_mode=S_IFREG|0755, st_size=1664768, >>> ...}) = 0 >>> 16:02:14.162457 mmap(NULL, 4096, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e4a1000 >>> 16:02:14.162535 mmap(NULL, 3771992, PROT_READ|PROT_EXEC, >>> MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c5dac8000 >>> 16:02:14.162607 mprotect(0x7f1c5dc57000, 2097152, PROT_NONE) = 0 >>> 16:02:14.162679 mmap(0x7f1c5de57000, 24576, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x18f000) = 0x7f1c5de57000 >>> 16:02:14.162764 mmap(0x7f1c5de5d000, 15960, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c5de5d000 >>> 16:02:14.162849 close(3) = 0 >>> 16:02:14.162933 open("/lib64/libreadline.so.6", O_RDONLY|O_CLOEXEC) = 3 >>> 16:02:14.163013 read(3, >>> "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260d\1\0\0\0\0\0"..., >>> 832) = 832 >>> 16:02:14.163084 fstat(3, {st_mode=S_IFREG|0555, st_size=415928, ...}) >>> = 0 >>> 16:02:14.163155 mmap(NULL, 2518968, PROT_READ|PROT_EXEC, >>> MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c5d860000 >>> 16:02:14.163225 mprotect(0x7f1c5d8bd000, 2097152, PROT_NONE) = 0 >>> 16:02:14.163296 mmap(0x7f1c5dabd000, 36864, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5d000) = 0x7f1c5dabd000 >>> 16:02:14.163389 mmap(0x7f1c5dac6000, 4024, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c5dac6000 >>> 16:02:14.163482 close(3) = 0 >>> 16:02:14.163568 open("/lib64/libncurses.so.6", O_RDONLY|O_CLOEXEC) = 3 >>> 16:02:14.163645 read(3, >>> "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320W\1\0\0\0\0\0"..., >>> 832) = 832 >>> 16:02:14.163716 fstat(3, {st_mode=S_IFREG|0755, st_size=526008, ...}) >>> = 0 >>> 16:02:14.163787 mmap(NULL, 2624120, PROT_READ|PROT_EXEC, >>> MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c5d5d8000 >>> 16:02:14.163857 mprotect(0x7f1c5d654000, 2093056, PROT_NONE) = 0 >>> 16:02:14.163927 mmap(0x7f1c5d853000, 20480, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7b000) = 0x7f1c5d853000 >>> 16:02:14.164028 mmap(0x7f1c5d858000, 2680, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c5d858000 >>> 16:02:14.164113 close(3) = 0 >>> 16:02:14.164197 mmap(NULL, 4096, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e4a0000 >>> 16:02:14.164281 mmap(NULL, 4096, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e49f000 >>> 16:02:14.164355 mmap(NULL, 4096, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e49e000 >>> 16:02:14.164455 arch_prctl(ARCH_SET_FS, 0x7f1c5e49f700) = 0 >>> 16:02:14.164661 mprotect(0x7f1c5de57000, 16384, PROT_READ) = 0 >>> 16:02:14.164806 mprotect(0x7f1c5d853000, 16384, PROT_READ) = 0 >>> 16:02:14.165153 mprotect(0x7f1c5dabd000, 8192, PROT_READ) = 0 >>> 16:02:14.165231 mprotect(0x7f1c5e06a000, 4096, PROT_READ) = 0 >>> 16:02:14.165313 mprotect(0x7f1c5e275000, 4096, PROT_READ) = 0 >>> 16:02:14.165402 mprotect(0x618000, 4096, PROT_READ) = 0 >>> 16:02:14.165482 mprotect(0x7f1c5e499000, 4096, PROT_READ) = 0 >>> 16:02:14.165552 munmap(0x7f1c5e458000, 246250) = 0 >>> 16:02:14.165817 brk(NULL) = 0x1ce4000 >>> 16:02:14.165876 brk(0x1d05000) = 0x1d05000 >>> 16:02:14.165953 open("/usr/lib64/locale/locale-archive", >>> O_RDONLY|O_CLOEXEC) = 3 >>> 16:02:14.166031 fstat(3, {st_mode=S_IFREG|0644, st_size=3832592, >>> ...}) = 0 >>> 16:02:14.166103 mmap(NULL, 3832592, PROT_READ, MAP_PRIVATE, 3, 0) = >>> 0x7f1c5d230000 >>> 16:02:14.166187 close(3) = 0 >>> 16:02:14.166394 open("/dev/md2", O_RDWR|O_DIRECT) = 3 >>> 16:02:14.166498 fstatfs(3, {f_type="TMPFS_MAGIC", f_bsize=4096, >>> f_blocks=2560, f_bfree=2560, f_bavail=2560, f_files=8244585, >>> f_ffree=8243843, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, >>> f_flags=4130}) = 0 >>> 16:02:14.166583 fstat(3, {st_mode=S_IFBLK|0660, st_rdev=makedev(9, >>> 2), ...}) = 0 >>> 16:02:14.166655 fstatfs(3, {f_type="TMPFS_MAGIC", f_bsize=4096, >>> f_blocks=2560, f_bfree=2560, f_bavail=2560, f_files=8244585, >>> f_ffree=8243843, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, >>> f_flags=4130}) = 0 >>> 16:02:14.166730 fstat(3, {st_mode=S_IFBLK|0660, st_rdev=makedev(9, >>> 2), ...}) = 0 >>> 16:02:14.166822 open("/usr/share/locale/locale.alias", >>> O_RDONLY|O_CLOEXEC) = 4 >>> 16:02:14.166899 fstat(4, {st_mode=S_IFREG|0644, st_size=2997, ...}) = 0 >>> 16:02:14.166969 mmap(NULL, 4096, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e49d000 >>> 16:02:14.167040 read(4, "# Locale name alias data base.\n#"..., 4096) >>> = 2997 >>> 16:02:14.167154 read(4, "", 4096) = 0 >>> 16:02:14.167223 close(4) = 0 >>> 16:02:14.167289 munmap(0x7f1c5e49d000, 4096) = 0 >>> 16:02:14.167405 >>> open("/usr/share/locale/en_US.utf8/LC_MESSAGES/xfsprogs.mo", >>> O_RDONLY) = -1 ENOENT (No such file or directory) >>> 16:02:14.167488 >>> open("/usr/share/locale/en_US/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = >>> -1 ENOENT (No such file or directory) >>> 16:02:14.167564 >>> open("/usr/share/locale/en.utf8/LC_MESSAGES/xfsprogs.mo", O_RDONLY) = >>> -1 ENOENT (No such file or directory) >>> 16:02:14.167637 open("/usr/share/locale/en/LC_MESSAGES/xfsprogs.mo", >>> O_RDONLY) = -1 ENOENT (No such file or directory) >>> 16:02:14.168062 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552175104) = 4096 >>> 16:02:14.168480 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552179200) = 4096 >>> 16:02:14.168744 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552183296) = 4096 >>> 16:02:14.168995 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552187392) = 4096 >>> 16:02:14.169235 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552191488) = 4096 >>> 16:02:14.169479 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552195584) = 4096 >>> 16:02:14.169717 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552199680) = 4096 >>> 16:02:14.169970 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552203776) = 4096 >>> 16:02:14.170215 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552207872) = 4096 >>> 16:02:14.170461 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552211968) = 4096 >>> 16:02:14.170700 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552216064) = 4096 >>> 16:02:14.170940 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552220160) = 4096 >>> 16:02:14.171177 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552224256) = 4096 >>> 16:02:14.171440 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552228352) = 4096 >>> 16:02:14.171680 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552232448) = 4096 >>> 16:02:14.171913 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552236544) = 4096 >>> 16:02:14.172148 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552240640) = 4096 >>> 16:02:14.172402 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552244736) = 4096 >>> 16:02:14.172652 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552248832) = 4096 >>> 16:02:14.172901 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552252928) = 4096 >>> 16:02:14.173135 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552257024) = 4096 >>> 16:02:14.173381 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552261120) = 4096 >>> 16:02:14.173626 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552265216) = 4096 >>> 16:02:14.173859 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552269312) = 4096 >>> 16:02:14.174095 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552273408) = 4096 >>> 16:02:14.174335 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552277504) = 4096 >>> 16:02:14.174591 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552281600) = 4096 >>> 16:02:14.174822 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552285696) = 4096 >>> 16:02:14.175053 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552289792) = 4096 >>> 16:02:14.175285 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552293888) = 4096 >>> 16:02:14.175528 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552297984) = 4096 >>> 16:02:14.175765 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552302080) = 4096 >>> 16:02:14.175988 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552306176) = 4096 >>> 16:02:14.176212 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552310272) = 4096 >>> 16:02:14.176596 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552314368) = 4096 >>> 16:02:14.176860 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552318464) = 4096 >>> 16:02:14.177083 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552322560) = 4096 >>> 16:02:14.177306 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552326656) = 4096 >>> 16:02:14.177535 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552330752) = 4096 >>> 16:02:14.177759 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552334848) = 4096 >>> 16:02:14.177981 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552338944) = 4096 >>> 16:02:14.178231 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552343040) = 4096 >>> 16:02:14.178469 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552347136) = 4096 >>> 16:02:14.178687 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552351232) = 4096 >>> 16:02:14.178915 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552355328) = 4096 >>> 16:02:14.179131 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552359424) = 4096 >>> 16:02:14.179404 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552363520) = 4096 >>> 16:02:14.179635 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552367616) = 4096 >>> 16:02:14.179856 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552371712) = 4096 >>> 16:02:14.180076 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552375808) = 4096 >>> 16:02:14.180299 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552379904) = 4096 >>> 16:02:14.180518 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552384000) = 4096 >>> 16:02:14.180738 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552388096) = 4096 >>> 16:02:14.180983 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552392192) = 4096 >>> 16:02:14.181204 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552396288) = 4096 >>> 16:02:14.181455 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552400384) = 4096 >>> 16:02:14.181677 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552404480) = 4096 >>> 16:02:14.181900 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552408576) = 4096 >>> 16:02:14.182122 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552412672) = 4096 >>> 16:02:14.182345 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552416768) = 4096 >>> 16:02:14.182585 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552420864) = 4096 >>> 16:02:14.182808 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552424960) = 4096 >>> 16:02:14.183041 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552429056) = 4096 >>> 16:02:14.183261 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552433152) = 4096 >>> 16:02:14.183486 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552437248) = 4096 >>> 16:02:14.183707 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552441344) = 4096 >>> 16:02:14.183943 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552445440) = 4096 >>> 16:02:14.184159 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552449536) = 4096 >>> 16:02:14.184398 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552453632) = 4096 >>> 16:02:14.184621 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552457728) = 4096 >>> 16:02:14.184836 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552461824) = 4096 >>> 16:02:14.185075 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552465920) = 4096 >>> 16:02:14.185292 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552470016) = 4096 >>> 16:02:14.189482 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552474112) = 4096 >>> 16:02:14.189973 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552478208) = 4096 >>> 16:02:14.190171 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552482304) = 4096 >>> 16:02:14.190360 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552486400) = 4096 >>> 16:02:14.190573 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552490496) = 4096 >>> 16:02:14.190745 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552494592) = 4096 >>> 16:02:14.190913 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552498688) = 4096 >>> 16:02:14.191098 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552502784) = 4096 >>> 16:02:14.191269 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552506880) = 4096 >>> 16:02:14.191478 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552510976) = 4096 >>> 16:02:14.191692 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552515072) = 4096 >>> 16:02:14.191879 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552519168) = 4096 >>> 16:02:14.192062 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552523264) = 4096 >>> 16:02:14.192246 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552527360) = 4096 >>> 16:02:14.192444 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552531456) = 4096 >>> 16:02:14.192625 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552535552) = 4096 >>> 16:02:14.192806 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552539648) = 4096 >>> 16:02:14.192990 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552543744) = 4096 >>> 16:02:14.193172 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552547840) = 4096 >>> 16:02:14.193351 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552551936) = 4096 >>> 16:02:14.193555 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552556032) = 4096 >>> 16:02:14.193736 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552560128) = 4096 >>> 16:02:14.193913 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552564224) = 4096 >>> 16:02:14.194094 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552568320) = 4096 >>> 16:02:14.194278 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552572416) = 4096 >>> 16:02:14.194468 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552576512) = 4096 >>> 16:02:14.194650 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552580608) = 4096 >>> 16:02:14.194829 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552584704) = 4096 >>> 16:02:14.195009 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552588800) = 4096 >>> 16:02:14.195193 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552592896) = 4096 >>> 16:02:14.195386 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552596992) = 4096 >>> 16:02:14.195579 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552601088) = 4096 >>> 16:02:14.195763 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552605184) = 4096 >>> 16:02:14.195957 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552609280) = 4096 >>> 16:02:14.196141 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552613376) = 4096 >>> 16:02:14.196321 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552617472) = 4096 >>> 16:02:14.196511 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552621568) = 4096 >>> 16:02:14.196697 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552625664) = 4096 >>> 16:02:14.197041 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552629760) = 4096 >>> 16:02:14.197239 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552633856) = 4096 >>> 16:02:14.197486 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552637952) = 4096 >>> 16:02:14.197689 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552642048) = 4096 >>> 16:02:14.197874 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552646144) = 4096 >>> 16:02:14.198057 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552650240) = 4096 >>> 16:02:14.198259 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552654336) = 4096 >>> 16:02:14.198446 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552658432) = 4096 >>> 16:02:14.198639 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552662528) = 4096 >>> 16:02:14.198823 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552666624) = 4096 >>> 16:02:14.199006 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552670720) = 4096 >>> 16:02:14.199188 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552674816) = 4096 >>> 16:02:14.199373 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552678912) = 4096 >>> 16:02:14.199569 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552683008) = 4096 >>> 16:02:14.199749 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552687104) = 4096 >>> 16:02:14.199929 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552691200) = 4096 >>> 16:02:14.200108 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552695296) = 4096 >>> 16:02:14.200304 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552699392) = 4096 >>> 16:02:14.200494 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552703488) = 4096 >>> 16:02:14.200684 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552707584) = 4096 >>> 16:02:14.200867 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552711680) = 4096 >>> 16:02:14.201047 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552715776) = 4096 >>> 16:02:14.201227 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552719872) = 4096 >>> 16:02:14.201417 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552723968) = 4096 >>> 16:02:14.201602 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552728064) = 4096 >>> 16:02:14.201782 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552732160) = 4096 >>> 16:02:14.201962 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552736256) = 4096 >>> 16:02:14.202153 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552740352) = 4096 >>> 16:02:14.202352 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552744448) = 4096 >>> 16:02:14.202564 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552748544) = 4096 >>> 16:02:14.202740 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552752640) = 4096 >>> 16:02:14.202920 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552756736) = 4096 >>> 16:02:14.203101 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552760832) = 4096 >>> 16:02:14.203284 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552764928) = 4096 >>> 16:02:14.203473 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552769024) = 4096 >>> 16:02:14.203654 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552773120) = 4096 >>> 16:02:14.203833 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552777216) = 4096 >>> 16:02:14.204014 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552781312) = 4096 >>> 16:02:14.204198 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552785408) = 4096 >>> 16:02:14.204409 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552789504) = 4096 >>> 16:02:14.204591 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552793600) = 4096 >>> 16:02:14.204770 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552797696) = 4096 >>> 16:02:14.204952 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552801792) = 4096 >>> 16:02:14.205135 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552805888) = 4096 >>> 16:02:14.205316 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552809984) = 4096 >>> 16:02:14.205502 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552814080) = 4096 >>> 16:02:14.205684 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552818176) = 4096 >>> 16:02:14.205865 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552822272) = 4096 >>> 16:02:14.206050 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552826368) = 4096 >>> 16:02:14.206240 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552830464) = 4096 >>> 16:02:14.206446 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552834560) = 4096 >>> 16:02:14.206626 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552838656) = 4096 >>> 16:02:14.206806 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552842752) = 4096 >>> 16:02:14.206988 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552846848) = 4096 >>> 16:02:14.207166 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552850944) = 4096 >>> 16:02:14.207344 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552855040) = 4096 >>> 16:02:14.207539 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552859136) = 4096 >>> 16:02:14.207724 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552863232) = 4096 >>> 16:02:14.207907 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552867328) = 4096 >>> 16:02:14.208084 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552871424) = 4096 >>> 16:02:14.208274 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552875520) = 4096 >>> 16:02:14.208494 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552879616) = 4096 >>> 16:02:14.208675 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552883712) = 4096 >>> 16:02:14.208858 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552887808) = 4096 >>> 16:02:14.209037 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552891904) = 4096 >>> 16:02:14.209217 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552896000) = 4096 >>> 16:02:14.209412 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552900096) = 4096 >>> 16:02:14.209595 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552904192) = 4096 >>> 16:02:14.209774 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552908288) = 4096 >>> 16:02:14.209953 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552912384) = 4096 >>> 16:02:14.210130 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552916480) = 4096 >>> 16:02:14.210320 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552920576) = 4096 >>> 16:02:14.210538 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552924672) = 4096 >>> 16:02:14.210723 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552928768) = 4096 >>> 16:02:14.210903 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552932864) = 4096 >>> 16:02:14.211084 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552936960) = 4096 >>> 16:02:14.211264 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552941056) = 4096 >>> 16:02:14.211452 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552945152) = 4096 >>> 16:02:14.211639 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552949248) = 4096 >>> 16:02:14.211831 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552953344) = 4096 >>> 16:02:14.212012 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552957440) = 4096 >>> 16:02:14.212194 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552961536) = 4096 >>> 16:02:14.212377 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552965632) = 4096 >>> 16:02:14.212579 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552969728) = 4096 >>> 16:02:14.212760 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552973824) = 4096 >>> 16:02:14.212939 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552977920) = 4096 >>> 16:02:14.213118 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552982016) = 4096 >>> 16:02:14.213298 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552986112) = 4096 >>> 16:02:14.213490 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552990208) = 4096 >>> 16:02:14.213672 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552994304) = 4096 >>> 16:02:14.213987 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001552998400) = 4096 >>> 16:02:14.214237 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553002496) = 4096 >>> 16:02:14.214493 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553006592) = 4096 >>> 16:02:14.214760 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553010688) = 4096 >>> 16:02:14.215009 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553014784) = 4096 >>> 16:02:14.215258 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553018880) = 4096 >>> 16:02:14.215515 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553022976) = 4096 >>> 16:02:14.215774 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553027072) = 4096 >>> 16:02:14.216026 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553031168) = 4096 >>> 16:02:14.216273 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553035264) = 4096 >>> 16:02:14.216529 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553039360) = 4096 >>> 16:02:14.216801 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553043456) = 4096 >>> 16:02:14.217042 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553047552) = 4096 >>> 16:02:14.217302 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553051648) = 4096 >>> 16:02:14.217557 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553055744) = 4096 >>> 16:02:14.217821 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553059840) = 4096 >>> 16:02:14.218067 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553063936) = 4096 >>> 16:02:14.218312 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553068032) = 4096 >>> 16:02:14.218559 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553072128) = 4096 >>> 16:02:14.218801 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553076224) = 4096 >>> 16:02:14.219045 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553080320) = 4096 >>> 16:02:14.219287 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553084416) = 4096 >>> 16:02:14.219543 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553088512) = 4096 >>> 16:02:14.219794 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553092608) = 4096 >>> 16:02:14.220040 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553096704) = 4096 >>> 16:02:14.220286 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553100800) = 4096 >>> 16:02:14.220541 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553104896) = 4096 >>> 16:02:14.220787 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553108992) = 4096 >>> 16:02:14.221033 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553113088) = 4096 >>> 16:02:14.221280 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553117184) = 4096 >>> 16:02:14.221532 pread64(3, >>> "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, >>> 3001553121280) = 4096 >>> 16:02:14.221784 pread64(3, 0x1ce7000, 4096, 3001553125376) = -1 EIO >>> (Input/output error) >>> 16:02:14.222083 dup(2) = 4 >>> 16:02:14.222183 fcntl(4, F_GETFL) = 0x8402 (flags >>> O_RDWR|O_APPEND|O_LARGEFILE) >>> 16:02:14.222290 >>> open("/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = >>> -1 ENOENT (No such file or directory) >>> 16:02:14.222448 open("/usr/share/locale/en_US/LC_MESSAGES/libc.mo", >>> O_RDONLY) = -1 ENOENT (No such file or directory) >>> 16:02:14.222616 open("/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", >>> O_RDONLY) = -1 ENOENT (No such file or directory) >>> 16:02:14.222693 open("/usr/share/locale/en/LC_MESSAGES/libc.mo", >>> O_RDONLY) = -1 ENOENT (No such file or directory) >>> 16:02:14.222786 fstat(4, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, >>> 9), ...}) = 0 >>> 16:02:14.222866 mmap(NULL, 4096, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c5e49d000 >>> 16:02:14.222954 write(4, "pread64: Input/output error\n", 28) = 28 >>> 16:02:14.223038 close(4) = 0 >>> 16:02:14.223103 munmap(0x7f1c5e49d000, 4096) = 0 >>> 16:02:14.223249 exit_group(0) = ? >>> 16:02:14.223594 +++ exited with 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 bounces+2504343-36b9-xfs=oss.sgi.com@sg.stampready.net Thu Apr 14 23:41:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,SPOOFED_URL_HOST, T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D7F0E7CA0 for ; Thu, 14 Apr 2016 23:41:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1C0B4AC001 for ; Thu, 14 Apr 2016 21:41:47 -0700 (PDT) X-ASG-Debug-ID: 1460695294-04cbb02e1b2b2c00001-NocioJ Received: from o1.sg.stampready.net (o1.sg.stampready.net [167.89.86.23]) by cuda.sgi.com with ESMTP id knOUR0psfKtluzkd (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 14 Apr 2016 21:41:35 -0700 (PDT) X-Barracuda-Envelope-From: bounces+2504343-36b9-xfs=oss.sgi.com@sg.stampready.net X-Barracuda-Apparent-Source-IP: 167.89.86.23 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=stampready.net; h=content-type:from:mime-version:subject:to; s=s1; bh=tlSLmDNIloPIG0jKs1TpbRXfk8s=; b=hbgCB7YqxPVY+LWT2tWV2g68UkUpt mAUAK12gjIbW1ZXCGtWpzD7HCwPhHSCmGnnJh6LnEkskB2T9Q/BkaaOS8ZRIXF/f 0fao7JPxnWmnLYkSUsnCKGabXEt1ebENViBflKLopDPXcs2+GrufMwUKsdOx40Hn MSTvxDZynCPTtk= Received: by filter0835p1mdw1.sendgrid.net with SMTP id filter0835p1mdw1.1931.571070D55 2016-04-15 04:40:53.154057942 +0000 UTC Received: from MjUwNDM0Mw (srv1.n-i-c-e.nl [128.140.221.60]) by ismtpd0001p1lon1.sendgrid.net (SG) with HTTP id JbBV2Qe7TIq1j3OfmHbimA for ; Fri, 15 Apr 2016 04:40:52.948 +0000 (UTC) Content-Type: multipart/alternative; boundary=edf124a66eacce24264fee92ffdf48f55de6e34f049e78d39679c89d4546 Date: Fri, 15 Apr 2016 04:40:52 +0000 From: "KOA CCTV" Mime-Version: 1.0 Subject: Hikvision Counter Day. Sales Event. To: xfs@oss.sgi.com X-ASG-Orig-Subj: Hikvision Counter Day. Sales Event. Message-ID: X-SG-EID: GPcH5AR4FNxUx3/k94obBuFzds479X57W1U837jaM3dR7WuOAdT4iKbWFr0yXYtBcayyRm2vLQ7iZJ 3NPRxwk0TsCrYUOP/l4tvP/+049ckF7wdDuioIZdRbCT/PnioKQvHC0ny6mHXut0g43ZDvJnoKFee4 26mBsndtM5qUFO4uswDs+eEyTwNtjAUWteFlesHN4x2VqBV0Cv/anQfmqA== X-SG-ID: R3ufbdLo2r/cRGFtfGlyBm6viTuYogAP4/CU4N7C6SymgYoDxTW2ytG8XvTtb6rIEoIQQW3quQeYY5 RQfXD6d6qvEJaBTnTin8yyn3PfOPLyWRkiwED5V4imaWemMG+3hmRbmgJd2zufS4PIKYArXRRghD9o bvjCfaXf5CRFIPIFsyx5B2PRc7ncwU26qjuHuWo/pzwPsbxNX6TrZeIDUA== X-Barracuda-Connect: o1.sg.stampready.net[167.89.86.23] X-Barracuda-Start-Time: 1460695295 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28750 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 --edf124a66eacce24264fee92ffdf48f55de6e34f049e78d39679c89d4546 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=UTF-8 Mime-Version: 1.0 ABOUT US |CONTACT US |EVENTS Customer Service 818-255-6666 T= oll Free 866-606-5229=0DKOACCTV specializes in the wholesale distribution o= f CCTV Cameras, Audio, Video and Home Innovation. We support many top leadi= ng manufacturers and continue to bring you the latest in technology. We car= ry all respected lines including Hikvision, HEOS, Boston Acoustics, Denon, = Lutron, Louroe, Key Digital, Zigen Samsung, Monitor Audio, Ubiquiti Ne= tworks, Fibaro, Klein Tools... All installers are welcome.=0DVisit Our= Website=0D What's New=0D HIKVISION Counter Day Sale Event.  = ;             Big Sales Event at KOA CCT= V     -20% OFF ON ALL HD-SDI& HIKVISION HD-SDI SERIES CA= MERAS.Don't miss out on a chance to save some money!You helped us grow= our business, it is our turn to help you save time and money!   =  Customer Appreciation Day, 10 Years Anniversary  HIKVISION = COUNTER DAY-10% OFF ON ALL PRODUCTS!          &nbs= p;      =0D NEW ARRIVALS - UBIQUITI ACCESS POINTS=0D&nb= sp;                UAP-AC-LR = =0D                UAP-AC-PRO=0D&nb= sp;          UAP-AC-LITE 5 Pack=0D    &n= bsp;        UAP-AC-LR 5 Pack= --edf124a66eacce24264fee92ffdf48f55de6e34f049e78d39679c89d4546 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=UTF-8 Mime-Version: 1.0 ProductMai= l - Responsive E-mail TemplateHikvision Counter Day. Sa= les Event. =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=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"Logo"
    = ABOUT US | CONTACT US | EVENTS
    Customer Service 818-255-6666
    Toll Free 866-606-5229
    =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09
    KOACCTV specializes in the wholesale distribution of CCTV C= ameras, Audio, Video and Home Innovation. We support many top leading manuf= acturers and continue to bring you the latest in technology. We carry all r= espected lines including Hikvision, HEOS, Boston Acoustics, Denon, Lutron, = Louroe, Key Digital, Zigen Samsung, Monitor Audio, Ubiquiti Networks, = Fibaro, Klein Tools...
     All installers are welcome.
    Visit Our Website
     
    What's New
    =20=20
    =20= =20 3D"space"
    HIKVISION= Counter Day Sale Event.  
            =      
    Big Sales Event at KOA CCTV     
    =
    -20% OFF ON ALL HD-SDI
    & HIKVISION HD-SDI SERIES CAMERAS.
    Don= 't miss out on a chance to save some money!


    You helped us grow o= ur business, it is our turn to help you save time and money!
     = ;  
    Customer Appreciation Day, 10 Years Anniversary 
     =
    HIKVISION COUNTER DAY-10% OFF ON ALL PRODUCTS!
          =            
    =09=09=09 =09=09
    3D"space"
    NEW ARRIVALS - UBIQUITI ACCESS POINTS
    =09=09=09 =09=09 =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"space"
    3D"image10_280x224"
                  &nbs= p;  UAP-AC-LR 
     
    3D"image11_280x224"
                  &nbs= p; UAP-AC-PRO

     

    3D"image12_280x224"
               UAP-AC-LITE = 5 Pack
     
    3D"image13_280x224"
                 UAP-A= C-LR 5 Pack
    =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =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"space"
    3D"icon-facebook" 3D"icon-twitter" 3D"icon-twitter" 3D"icon-twitter" 3D"icon-twitter" 3D"icon-twitter" 3D"icon-googleplus" 3D"icon-rss" 3D"icon-vimeo"
    =09=09=09 =09=09 =09 =09=09=09 =09=09
    3D"space"
    =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20
    3D"icon-facebook" 3D"icon-twitter" 3D"icon-twitter" 3D"icon-twitter" 3D"icon-twitter" 3D"icon-twitter" 3D"icon-googleplus" 3D"icon-rss"
    =20=20
    =20= =20 3D"space"
    3D"ic= 3D"i= 3D"icon-googleplus"
    =09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09
    KOA= CCTV
    7306 COLDWATER CA= NYON AVE
    Unit 1
    North Hollywood, CA 91605
    http://www.koacctv.com
    Unsubscribe
    --edf124a66eacce24264fee92ffdf48f55de6e34f049e78d39679c89d4546-- From darrick.wong@oracle.com Thu Apr 14 23:46:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6A7217CA0 for ; Thu, 14 Apr 2016 23:46:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3CACA304032 for ; Thu, 14 Apr 2016 21:46:16 -0700 (PDT) X-ASG-Debug-ID: 1460695566-04cbb02e1d2b39e0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id vYeanLktXBqzGfkY (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 14 Apr 2016 21:46:07 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u3F4jxf0002542 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 15 Apr 2016 04:45:59 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u3F4jwUh012164 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 15 Apr 2016 04:45:59 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u3F4jtqC012004; Fri, 15 Apr 2016 04:45:57 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 14 Apr 2016 21:45:55 -0700 Date: Thu, 14 Apr 2016 21:45:53 -0700 From: "Darrick J. Wong" To: "Darrick J. Wong" , Dave Chinner , "Theodore Ts'o" Cc: xfs , linux-ext4 , linux-fsdevel Subject: [RFC] xfs_scrub: create online filesystem scrub program Message-ID: <20160415044553.GE18517@birch.djwong.org> X-ASG-Orig-Subj: [RFC] xfs_scrub: create online filesystem scrub program MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1460695567 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.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_MISMATCH_TO, BSF_SC0_MV0713, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28750 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.50 BSF_SC0_MV0713 Custom rule MV0713 Create a toy filesystem scrubbing tool that walks the directory tree, queries every file's extents, extended attributes, and stat data. For generic (non-XFS) filesystems this depends on the kernel to do nearly all the validation. Optionally, we can (try to) read all the file data. Future XFS extensions to this program will perform much stronger metadata checking and cross-referencing. In the future we might be able to do such things like lock a directory, check the entries and back pointers, and unlock it; or lock an inode to check the extent map and cross-reference the entries therein with a reverse-mapping index. However, this tool /should/ work for most non-XFS filesystems. I've done rough testing on XFS, ext4, fuse-NTFS, vfat, hfsplus, and iso, and it seems to run reasonably well. In any case, let's discuss at LSF. Signed-off-by: Darrick J. Wong --- Makefile | 2 man/man8/xfs_scrub.8 | 82 +++++ scrub/Makefile | 26 ++ scrub/generic.c | 370 +++++++++++++++++++++++ scrub/scrub.c | 816 ++++++++++++++++++++++++++++++++++++++++++++++++++ scrub/scrub.h | 98 ++++++ scrub/xfs.c | 239 +++++++++++++++ 7 files changed, 1632 insertions(+), 1 deletion(-) create mode 100644 man/man8/xfs_scrub.8 create mode 100644 scrub/Makefile create mode 100644 scrub/generic.c create mode 100644 scrub/scrub.c create mode 100644 scrub/scrub.h create mode 100644 scrub/xfs.c diff --git a/Makefile b/Makefile index b6cda36..cf5ccc2 100644 --- a/Makefile +++ b/Makefile @@ -46,7 +46,7 @@ HDR_SUBDIRS = include libxfs DLIB_SUBDIRS = libxlog libxcmd libhandle LIB_SUBDIRS = libxfs $(DLIB_SUBDIRS) TOOL_SUBDIRS = copy db estimate fsck fsr growfs io logprint mkfs quota \ - mdrestore repair rtcp m4 man doc debian + mdrestore repair rtcp m4 man doc debian scrub ifneq ("$(XGETTEXT)","") TOOL_SUBDIRS += po diff --git a/man/man8/xfs_scrub.8 b/man/man8/xfs_scrub.8 new file mode 100644 index 0000000..95d7169 --- /dev/null +++ b/man/man8/xfs_scrub.8 @@ -0,0 +1,82 @@ +.TH xfs_scrub 8 +.SH NAME +xfs_scrub \- scrub the contents of an XFS filesystem +.SH SYNOPSIS +.B xfs_scrub +[ +.B \-dvx +] [ +.B \-t +.I fstype +] +.I mountpoint +.br +.B xfs_scrub \-V +.SH DESCRIPTION +.B xfs_scrub +attempts to read and check all the metadata in a Linux filesystem. +.PP +If +.B xfs_scrub +does not detect an XFS filesystem, it will use a generic backend to +scrub the filesystem. This involves walking the directory tree, +querying the data and extended attribute extent maps, performing +limited checks of directory and inode data, reading all of an +inode's extended attributes, and optionally reading all data in +a file. +.PP +If an XFS filesystem is detected, then +.B xfs_scrub +will use private XFS ioctls and sysfs interfaces to perform more +rigorous scrubbing of the internal metadata. Currently this is +limited to asking the kernel to check the per-AG btrees, which +also performs limited cross-referencing. +.SH OPTIONS +.TP +.B \-d +Enable debugging mode, which augments error reports with the exact file +and line where the scrub failure occurred. This also enables verbose +mode. +.TP +.B \-v +Enable verbose mode, which prints periodic status updates. +.TP +.BI \-t " fstype" +Force the use of a particular type of filesystem scrubber. Currently +supported backends are +.I xfs +and +.I generic +scrubbers. +.TP +.B \-V +Prints the version number and exits. +.TP +.B \-x +Scrub file data. This reads every block of every file on disk. +.SH EXIT CODE +The exit code returned by +.B xfs_scrub +is the sum of the following conditions: +.br +\ 0\ \-\ No errors +.br +\ 4\ \-\ File system errors left uncorrected +.br +\ 8\ \-\ Operational error +.br +\ 16\ \-\ Usage or syntax error +.br +.SH CAVEATS +.B xfs_scrub +is a very immature utility! The generic scrub backend walks the directory +tree, reads file extents and data, and queries every extended attribute it +can find. The generic scrub does not grab exclusive locks on the objects +it is examining, nor does it have any way to cross-reference what it sees +against the internal filesystem metadata. +.PP +The XFS backend will some day learn how to do all those things, but for +now its only advantage over the generic backend is that it knows how to +ask the kernel to perform a basic scrub of the XFS AG metadata. +.SH SEE ALSO +.BR xfs_repair (8). diff --git a/scrub/Makefile b/scrub/Makefile new file mode 100644 index 0000000..52b2838 --- /dev/null +++ b/scrub/Makefile @@ -0,0 +1,26 @@ +# +# Copyright (c) 2016 Oracle. All Rights Reserved. +# + +TOPDIR = .. +include $(TOPDIR)/include/builddefs + +LTCOMMAND = xfs_scrub + +HFILES = scrub.h +CFILES = scrub.c generic.c xfs.c + +LLDLIBS += $(LIBBLKID) $(LIBXFS) $(LIBUUID) $(LIBRT) $(LIBPTHREAD) +LTDEPENDENCIES += $(LIBXFS) +LLDFLAGS = -static-libtool-libs + +default: depend $(LTCOMMAND) + +include $(BUILDRULES) + +install: default + $(INSTALL) -m 755 -d $(PKG_ROOT_SBIN_DIR) + $(LTINSTALL) -m 755 $(LTCOMMAND) $(PKG_ROOT_SBIN_DIR) +install-dev: + +-include .dep diff --git a/scrub/generic.c b/scrub/generic.c new file mode 100644 index 0000000..eeff85a --- /dev/null +++ b/scrub/generic.c @@ -0,0 +1,370 @@ +/* + * Copyright (c) 2016 Oracle. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include +#include +#include +#include +#include +#include +#include "libxfs.h" +#include "scrub.h" + +/* Routines to scrub a generic filesystem with nothing but the VFS. */ + +bool +generic_scan_fs( + struct scrub_ctx *ctx) +{ + /* Nothing to do here. */ + return true; +} + +bool +generic_scan_inodes( + struct scrub_ctx *ctx) +{ + /* Nothing to do here. */ + return true; +} + +bool +generic_cleanup( + struct scrub_ctx *ctx) +{ + /* Nothing to do here. */ + return true; +} + +bool +generic_scan_metadata( + struct scrub_ctx *ctx) +{ + /* Nothing to do here. */ + return true; +} + +/* Check all entries in a directory. */ +bool +generic_check_dir( + struct scrub_ctx *ctx, + int dir_fd) +{ + /* Nothing to do here. */ + return true; +} + +/* Check an inode's extents... the hard way. */ +static bool +generic_scan_extents_fibmap( + struct scrub_ctx *ctx, + int fd, + struct stat64 *sb) +{ + unsigned int blk; + unsigned int b; + off_t numblocks; + int error; + + if (!(ctx->quirks & SCRUB_QUIRK_FIBMAP_WORKS)) + return true; + + numblocks = (sb->st_size + sb->st_blksize - 1) / sb->st_blksize; + if (numblocks > UINT_MAX) + numblocks = UINT_MAX; + for (blk = 0; blk < numblocks; blk++) { + b = blk; + error = ioctl(fd, FIBMAP, &b); + if (error) { + if (errno == EOPNOTSUPP) { + path_warn(ctx, +_("data block FIEMAP/FIBMAP not supported, will not check extent map.")); + ctx->quirks &= ~SCRUB_QUIRK_FIBMAP_WORKS; + return true; + } + path_errno(ctx); + } + } + + return true; +} + +/* Check an inode's extents. */ +#define NR_EXTENTS 512 +bool +generic_scan_extents( + struct scrub_ctx *ctx, + int fd, + struct stat64 *sb, + bool attr_fork) +{ + struct fiemap *fiemap; + size_t sz; + struct fiemap_extent *extent; + __u64 next_logical; + bool last = false; + int error; + unsigned int i; + + /* FIEMAP only works for files. */ + if (!S_ISREG(sb->st_mode)) + return true; + + if (!attr_fork && !(ctx->quirks & SCRUB_QUIRK_FIEMAP_WORKS)) + return generic_scan_extents_fibmap(ctx, fd, sb); + else if (attr_fork && !(ctx->quirks & SCRUB_QUIRK_FIEMAP_ATTR_WORKS)) + return true; + + sz = sizeof(struct fiemap) + sizeof(struct fiemap_extent) * NR_EXTENTS; + fiemap = calloc(sz, 1); + if (!fiemap) { + path_errno(ctx); + return false; + } + + fiemap->fm_length = ~0ULL; + fiemap->fm_flags = FIEMAP_FLAG_SYNC; + if (attr_fork) + fiemap->fm_flags |= FIEMAP_FLAG_XATTR; + fiemap->fm_extent_count = NR_EXTENTS; + fiemap->fm_reserved = 0; + next_logical = 0; + + while (!last) { + fiemap->fm_start = next_logical; + error = ioctl(fd, FS_IOC_FIEMAP, (unsigned long)fiemap); + if (error < 0 && errno == EOPNOTSUPP) { + if (attr_fork) { + path_warn(ctx, +_("extended attribute FIEMAP not supported, will not check extent map.")); + ctx->quirks &= ~SCRUB_QUIRK_FIEMAP_WORKS; + } else + ctx->quirks &= ~SCRUB_QUIRK_FIEMAP_ATTR_WORKS; + break; + } + if (error < 0) { + path_errno(ctx); + break; + } + + /* No more extents to map, exit */ + if (!fiemap->fm_mapped_extents) + break; + + for (i = 0; i < fiemap->fm_mapped_extents; i++) { + extent = &fiemap->fm_extents[i]; + + if (extent->fe_length == 0) + path_error(ctx, +_("zero-length extent at offset %llu\n"), + extent->fe_logical); + + next_logical = extent->fe_logical + extent->fe_length; + if (extent->fe_flags & FIEMAP_EXTENT_LAST) + last = true; + } + } + + free(fiemap); + return true; +} + +/* Check the fields of an inode. */ +bool +generic_check_inode( + struct scrub_ctx *ctx, + int fd, + struct stat64 *sb) +{ + if (sb->st_nlink == 0) + path_error(ctx, +_("nlinks should not be 0.")); + + return true; +} + +/* Try to read all the extended attributes. */ +bool +generic_scan_xattrs( + struct scrub_ctx *ctx, + int fd) +{ + char *buf = NULL; + char *p; + ssize_t buf_sz; + ssize_t sz; + char *valbuf = NULL; + ssize_t valbuf_sz = 0; + ssize_t val_sz; + ssize_t sz2; + bool moveon = true; + char *x; + + buf_sz = flistxattr(fd, NULL, 0); + if (buf_sz == -EOPNOTSUPP) + return true; + else if (buf_sz == 0) + return true; + else if (buf_sz < 0) { + path_errno(ctx); + return true; + } + + buf = malloc(buf_sz); + if (!buf) { + path_errno(ctx); + return false; + } + + sz = flistxattr(fd, buf, buf_sz); + if (sz < 0) { + path_errno(ctx); + goto out; + } else if (sz != buf_sz) { + path_error(ctx, +_("read %zu bytes of xattr names, expected %zu bytes."), + sz, buf_sz); + } + + /* Read all the attrs and values. */ + for (p = buf; p < buf + sz; p += strlen(p) + 1) { + val_sz = fgetxattr(fd, p, NULL, 0); + if (val_sz < 0) { + if (errno != ENODATA) + path_errno(ctx); + continue; + } + if (val_sz > valbuf_sz) { + x = realloc(valbuf, val_sz); + if (!x) { + path_errno(ctx); + moveon = false; + break; + } + valbuf = x; + valbuf_sz = val_sz; + } + sz2 = fgetxattr(fd, p, valbuf, val_sz); + if (sz2 < 0) { + path_errno(ctx); + continue; + } else if (sz2 != val_sz) + path_error(ctx, +_("read %zu bytes from xattr %s value, expected %zu bytes."), + sz2, p, val_sz); + } +out: + free(valbuf); + free(buf); + return moveon; +} + +/* Try to read all the extended attributes of things that have no fd. */ +bool +generic_scan_special_xattrs( + struct scrub_ctx *ctx) +{ + char *buf = NULL; + char *p; + ssize_t buf_sz; + ssize_t sz; + char *valbuf = NULL; + ssize_t valbuf_sz = 0; + ssize_t val_sz; + ssize_t sz2; + bool moveon = true; + char *x; + char path[PATH_MAX]; + int error; + + /* Construct the full path to this file. */ + error = construct_path(ctx, path, PATH_MAX); + if (error) { + path_errno(ctx); + return false; + } + + buf_sz = llistxattr(path, NULL, 0); + if (buf_sz == -EOPNOTSUPP) + return true; + else if (buf_sz == 0) + return true; + else if (buf_sz < 0) { + path_errno(ctx); + return true; + } + + buf = malloc(buf_sz); + if (!buf) { + path_errno(ctx); + return false; + } + + sz = llistxattr(path, buf, buf_sz); + if (sz < 0) { + path_errno(ctx); + goto out; + } else if (sz != buf_sz) { + path_error(ctx, +_("read %zu bytes of xattr names, expected %zu bytes."), + sz, buf_sz); + } + + /* Read all the attrs and values. */ + for (p = buf; p < buf + sz; p += strlen(p) + 1) { + val_sz = lgetxattr(path, p, NULL, 0); + if (val_sz < 0) { + path_errno(ctx); + continue; + } + if (val_sz > valbuf_sz) { + x = realloc(valbuf, val_sz); + if (!x) { + path_errno(ctx); + moveon = false; + break; + } + valbuf = x; + valbuf_sz = val_sz; + } + sz2 = lgetxattr(path, p, valbuf, val_sz); + if (sz2 < 0) { + path_errno(ctx); + continue; + } else if (sz2 != val_sz) + path_error(ctx, +_("read %zu bytes from xattr %s value, expected %zu bytes."), + sz2, p, val_sz); + } +out: + free(valbuf); + free(buf); + return moveon; +} + +struct scrub_ops generic_scrub_ops = { + .name = "generic", + .cleanup = generic_cleanup, + .scan_fs = generic_scan_fs, + .scan_inodes = generic_scan_inodes, + .check_dir = generic_check_dir, + .check_inode = generic_check_inode, + .scan_extents = generic_scan_extents, + .scan_xattrs = generic_scan_xattrs, + .scan_special_xattrs = generic_scan_special_xattrs, + .scan_metadata = generic_scan_metadata, +}; diff --git a/scrub/scrub.c b/scrub/scrub.c new file mode 100644 index 0000000..035b474 --- /dev/null +++ b/scrub/scrub.c @@ -0,0 +1,816 @@ +/* + * Copyright (c) 2016 Oracle. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include "libxfs.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "scrub.h" + +#define _PATH_PROC_MOUNTS "/proc/mounts" + +bool verbose; +bool debug; +bool scrub_data; + +static void __attribute__((noreturn)) +usage( void ) +{ + fprintf(stderr, _("Usage: %s [OPTIONS] mountpoint\n"), progname); + fprintf(stderr, _("-d:\tRun program in debug mode.\n")); + fprintf(stderr, _("-t:\tUse this filesystem backend for scrubbing.\n")); + fprintf(stderr, _("-v:\tVerbose output.\n")); + fprintf(stderr, _("-x:\tScrub file data too.\n")); + + exit(16); +} + +/* + * Check if the argument is either the device name or mountpoint of a mounted + * filesystem. + */ +static bool +find_mountpoint_check(struct stat64 *sb, struct mntent *t) +{ + struct stat64 ms; + + if (S_ISDIR(sb->st_mode)) { /* mount point */ + if (stat64(t->mnt_dir, &ms) < 0) + return false; + if (sb->st_ino != ms.st_ino) + return false; + if (sb->st_dev != ms.st_dev) + return false; + /* + * Make sure the device given by mtab is accessible + * before using it. + */ + if (stat64(t->mnt_fsname, &ms) < 0) + return false; + } else { /* device */ + if (stat64(t->mnt_fsname, &ms) < 0) + return false; + if (sb->st_rdev != ms.st_rdev) + return false; + /* + * Make sure the mountpoint given by mtab is accessible + * before using it. + */ + if (stat64(t->mnt_dir, &ms) < 0) + return false; + } + + return true; +} + +/* Check that our alleged mountpoint is in mtab */ +static bool +find_mountpoint(char *mtab, struct stat64 *sb, struct mntent *mnt) +{ + struct mntent_cursor cursor; + struct mntent *t = NULL; + bool found = false; + + if (platform_mntent_open(&cursor, mtab) != 0){ + fprintf(stderr, "Error: can't get mntent entries.\n"); + exit(1); + } + + while ((t = platform_mntent_next(&cursor)) != NULL) { + if (find_mountpoint_check(sb, t)) { + *mnt = *t; + found = true; + break; + } + } + platform_mntent_close(&cursor); + return found; +} + +/* Print a string and whatever error is stored in errno. */ +void +__str_errno( + struct scrub_ctx *ctx, + const char *str, + const char *file, + int line) +{ + char buf[256]; + + fprintf(stderr, "%s: %s.", str, strerror_r(errno, buf, 256)); + if (debug) + fprintf(stderr, " (%s line %d)", file, line); + fprintf(stderr, "\n"); + ctx->errors_found++; +} + +/* Print a string and some error text. */ +void +__str_error( + struct scrub_ctx *ctx, + const char *str, + const char *file, + int line, + const char *format, + ...) +{ + va_list args; + + fprintf(stderr, "%s: ", str); + va_start(args, format); + vfprintf(stderr, format, args); + va_end(args); + if (debug) + fprintf(stderr, " (%s line %d)", file, line); + fprintf(stderr, "\n"); + ctx->errors_found++; +} + +/* Print a string and some warning text. */ +void +__str_warn( + struct scrub_ctx *ctx, + const char *str, + const char *file, + int line, + const char *format, + ...) +{ + va_list args; + + fprintf(stderr, "%s: ", str); + va_start(args, format); + vfprintf(stderr, format, args); + va_end(args); + if (debug) + fprintf(stderr, " (%s line %d)", file, line); + fprintf(stderr, "\n"); + ctx->warnings_found++; +} + +/* Print the current path and whatever error is stored in errno. */ +void +__path_errno( + struct scrub_ctx *ctx, + const char *file, + int line) +{ + char buf[256]; + struct list_head *l; + struct path_piece *pp; + int err; + + err = errno; + fprintf(stderr, "%s", ctx->mntpoint); + list_for_each(l, &ctx->path_stack) { + pp = container_of(l, struct path_piece, list); + fprintf(stderr, "/%s", pp->name); + } + fprintf(stderr, ": %s.", strerror_r(err, buf, 256)); + if (debug) + fprintf(stderr, " (%s line %d)", file, line); + fprintf(stderr, "\n"); + ctx->errors_found++; +} + +/* Print the current path and some error text. */ +void +__path_error( + struct scrub_ctx *ctx, + const char *file, + int line, + const char *format, + ...) +{ + va_list args; + struct list_head *l; + struct path_piece *pp; + + fprintf(stderr, "%s", ctx->mntpoint); + list_for_each(l, &ctx->path_stack) { + pp = container_of(l, struct path_piece, list); + fprintf(stderr, "/%s", pp->name); + } + fprintf(stderr, ": "); + va_start(args, format); + vfprintf(stderr, format, args); + va_end(args); + if (debug) + fprintf(stderr, " (%s line %d)", file, line); + fprintf(stderr, "\n"); + ctx->errors_found++; +} + +/* Print the current path and some warning text. */ +void +__path_warn( + struct scrub_ctx *ctx, + const char *file, + int line, + const char *format, + ...) +{ + va_list args; + struct list_head *l; + struct path_piece *pp; + + fprintf(stderr, "%s", ctx->mntpoint); + list_for_each(l, &ctx->path_stack) { + pp = container_of(l, struct path_piece, list); + fprintf(stderr, "/%s", pp->name); + } + fprintf(stderr, ": "); + va_start(args, format); + vfprintf(stderr, format, args); + va_end(args); + if (debug) + fprintf(stderr, " (%s line %d)", file, line); + fprintf(stderr, "\n"); + ctx->warnings_found++; +} + +/* Construct the current path. */ +int +construct_path( + struct scrub_ctx *ctx, + char *buf, + size_t buflen) +{ + size_t nr = 0; + struct list_head *l; + struct path_piece *pp; + int sz; + + /* Mountpoint */ + sz = snprintf(buf + nr, buflen - nr, "%s", ctx->mntpoint); + if (sz < 0) + return -1; + else if(sz > buflen - nr) { + errno = ENOMEM; + return -1; + } + nr += sz; + + /* Intermediate path components. */ + list_for_each(l, &ctx->path_stack) { + pp = container_of(l, struct path_piece, list); + + sz = snprintf(buf + nr, buflen - nr, "/%s", pp->name); + if (sz < 0) + return -1; + else if(sz > buflen - nr) { + errno = ENOMEM; + return -1; + } + nr += sz; + } + + return 0; +} + +#define CHECK_TYPE(type) \ + case DT_##type: \ + if (!S_IS##type(sb->st_mode)) { \ + path_error(ctx, \ +_("dtype of block does not match mode 0x%x\n"), \ + sb->st_mode & S_IFMT); \ + } \ + break; + +/* Ensure that the directory entry matches the stat info. */ +static bool +verify_dirent( + struct scrub_ctx *ctx, + struct dirent *dirent, + struct stat64 *sb) +{ + if (dirent->d_ino != sb->st_ino) + path_error(ctx, +_("inode numbers (%llu != %llu) do not match!"), + (unsigned long long)dirent->d_ino, + (unsigned long long)sb->st_ino); + + switch (dirent->d_type) { + case DT_UNKNOWN: + break; + CHECK_TYPE(BLK) + CHECK_TYPE(CHR) + CHECK_TYPE(DIR) + CHECK_TYPE(FIFO) + CHECK_TYPE(LNK) + CHECK_TYPE(REG) + CHECK_TYPE(SOCK) + } + + return true; +} +#undef CHECK_TYPE + +/* Read all the data in a file. */ +#define READ_BUF_SIZE 262144 +static bool +read_file( + struct scrub_ctx *ctx, + int fd, + struct stat64 *sb) +{ + off_t data_end = 0; + off_t data_start; + off_t start; + ssize_t sz; + size_t count; + static char *readbuf = NULL; + bool reports_holes = true; + bool direct_io = false; + int flags; + int error; + static long page_size = 0; + + /* Find the page size. */ + if (!page_size) { + page_size = sysconf(_SC_PAGESIZE); + if (page_size < 0) { + path_errno(ctx); + return false; + } + } + + /* Try to allocate a read buffer if we don't have one. */ + if (!readbuf) { + error = posix_memalign((void **)&readbuf, page_size, + READ_BUF_SIZE); + if (error || !readbuf) { + path_errno(ctx); + return false; + } + } + + /* Can we set O_DIRECT? */ + flags = fcntl(fd, F_GETFL); + error = fcntl(fd, F_SETFL, flags | O_DIRECT); + if (!error) + direct_io = true; + + /* See if SEEK_DATA/SEEK_HOLE work... */ + data_start = lseek(fd, data_end, SEEK_DATA); + if (data_start < 0) + reports_holes = false; + + if (reports_holes) { + data_end = lseek(fd, data_start, SEEK_HOLE); + if (data_end < 0) + reports_holes = false; + } + + /* ...or just read everything if they don't. */ + if (!reports_holes) { + data_start = 0; + data_end = sb->st_size; + } + + if (!direct_io) { + posix_fadvise(fd, 0, sb->st_size, POSIX_FADV_SEQUENTIAL); + posix_fadvise(fd, 0, sb->st_size, POSIX_FADV_WILLNEED); + } + /* Read the non-hole areas. */ + while (data_start < data_end) { + start = data_start; + + if (direct_io && (start & (page_size - 1))) + start &= ~(page_size - 1); + count = min(READ_BUF_SIZE, data_end - start); + if (direct_io && (count & (page_size - 1))) + count = (count + page_size) & ~(page_size - 1); + sz = pread(fd, readbuf, count, start); + if (sz < 0) + path_errno(ctx); + else if (sz == 0) { + path_error(ctx, +_("Read zero bytes, expected %zu."), + count); + break; + } else if (sz != count && start + sz != data_end) { + path_warn(ctx, +_("Short read of %zu bytes, expected %zu."), + sz, count); + } + data_start = start + sz; + + if (data_start >= data_end && reports_holes) { + data_start = lseek(fd, data_end, SEEK_DATA); + if (data_start < 0) { + if (errno != ENXIO) + path_errno(ctx); + break; + } + data_end = lseek(fd, data_start, SEEK_HOLE); + if (data_end < 0) { + if (errno != ENXIO) + path_errno(ctx); + break; + } + } + } + + /* Turn off O_DIRECT. */ + if (direct_io) { + flags = fcntl(fd, F_GETFL); + error = fcntl(fd, F_SETFL, flags & ~O_DIRECT); + if (error) + path_errno(ctx); + } + + return true; +} + +/* Scrub a directory. */ +static bool +check_dir( + struct scrub_ctx *ctx, + int dir_fd) +{ + DIR *dir; + struct dirent *dirent; + struct path_piece pp; + int fd = -1; + struct stat64 sb; + struct stat64 fd_sb; + bool moveon; + static char linkbuf[PATH_MAX]; + ssize_t len; + int error; + + /* FS-specific directory checks. */ + moveon = ctx->ops->check_dir(ctx, dir_fd); + if (!moveon) + return moveon; + + /* Iterate the directory entries. */ + dir = fdopendir(dir_fd); + if (!dir) { + path_errno(ctx); + return true; + } + + /* Iterate every directory entry. */ + INIT_LIST_HEAD(&pp.list); + list_add_tail(&pp.list, &ctx->path_stack); + dirent = readdir(dir); + while (dirent) { + if (!strcmp(".", dirent->d_name) || + !strcmp("..", dirent->d_name)) + goto next; + + pp.name = dirent->d_name; + error = fstatat64(dir_fd, dirent->d_name, &sb, + AT_NO_AUTOMOUNT | AT_SYMLINK_NOFOLLOW); + if (error) { + path_errno(ctx); + break; + } + + /* Ignore files on other filesystems. */ + if (sb.st_dev != ctx->mnt_sb.st_dev) + goto next; + + /* Check the directory entry itself. */ + moveon = verify_dirent(ctx, dirent, &sb); + if (!moveon) + break; + + /* If symlink, read the target value. */ + if (S_ISLNK(sb.st_mode)) { + len = readlinkat(dir_fd, dirent->d_name, linkbuf, + PATH_MAX); + if (len < 0) + path_errno(ctx); + else if (len != sb.st_size) + path_error(ctx, +_("read %zu bytes from a %zu byte symlink?"), + len, sb.st_size); + } + + /* Read the xattrs without a file descriptor. */ + if (S_ISSOCK(sb.st_mode) || S_ISFIFO(sb.st_mode) || + S_ISBLK(sb.st_mode) || S_ISCHR(sb.st_mode) || + S_ISLNK(sb.st_mode)) { + moveon = ctx->ops->scan_special_xattrs(ctx); + if (!moveon) + break; + } + + /* If not dir or file, move on to the next dirent. */ + if (!S_ISDIR(sb.st_mode) && !S_ISREG(sb.st_mode)) + goto next; + + /* Open the file */ + fd = openat(dir_fd, dirent->d_name, + O_RDONLY | O_NOATIME | O_NOFOLLOW | O_NOCTTY); + if (fd < 0) { + path_errno(ctx); + goto next; + } + + /* Did the fstatat and the open race? */ + if (fstat64(fd, &fd_sb) < 0) { + path_errno(ctx); + goto close; + } + if (fd_sb.st_ino != sb.st_ino || fd_sb.st_dev != sb.st_dev) + path_warn(ctx, +_("inode changed out from under us!")); + + /* Check the inode. */ + moveon = ctx->ops->check_inode(ctx, fd, &fd_sb); + if (!moveon) + break; + + /* Scan the extent maps. */ + moveon = ctx->ops->scan_extents(ctx, fd, &fd_sb, false); + if (!moveon) + break; + moveon = ctx->ops->scan_extents(ctx, fd, &fd_sb, true); + if (!moveon) + break; + + /* Read all the file data. */ + if (scrub_data && S_ISREG(fd_sb.st_mode)) { + moveon = read_file(ctx, fd, &fd_sb); + if (!moveon) + break; + } + + /* Read all the extended attributes. */ + moveon = ctx->ops->scan_xattrs(ctx, fd); + if (!moveon) + break; + + /* If directory, call ourselves recursively. */ + if (S_ISDIR(fd_sb.st_mode)) { + moveon = check_dir(ctx, fd); + if (!moveon) + break; + /* closedir already closed fd for us */ + fd = -1; + goto next; + } + + /* Close file. */ +close: + error = close(fd); + if (error) + path_errno(ctx); + fd = -1; + +next: + dirent = readdir(dir); + } + + if (fd >= 0) { + error = close(fd); + if (error) + path_errno(ctx); + } + list_del(&pp.list); + + /* Close dir, go away. */ + error = closedir(dir); + if (error) + path_errno(ctx); + + return moveon; +} + + + +/* Traverse the directory tree. */ +static bool +traverse_fs( + struct scrub_ctx *ctx) +{ + bool moveon; + + /* Check the inode. */ + moveon = ctx->ops->check_inode(ctx, ctx->mnt_fd, &ctx->mnt_sb); + if (!moveon) + return moveon; + + /* Scan the extent maps. */ + moveon = ctx->ops->scan_extents(ctx, ctx->mnt_fd, &ctx->mnt_sb, false); + if (!moveon) + return moveon; + moveon = ctx->ops->scan_extents(ctx, ctx->mnt_fd, &ctx->mnt_sb, true); + if (!moveon) + return moveon; + + /* Check the mountpoint directory. */ + moveon = check_dir(ctx, ctx->mnt_fd); + if (!moveon) + return moveon; + + return true; +} + +static struct scrub_ops *scrub_impl[] = { + &xfs_scrub_ops, + &generic_scrub_ops, + NULL +}; + +int +main( + int argc, + char **argv) +{ + int c; + char *mtab = NULL; + struct scrub_ctx ctx; + bool ismnt; + bool moveon; + int ret; + struct scrub_ops **ops; + + progname = basename(argv[0]); + setlocale(LC_ALL, ""); + bindtextdomain(PACKAGE, LOCALEDIR); + textdomain(PACKAGE); + + ctx.ops = NULL; + while ((c = getopt(argc, argv, "dt:vxV")) != EOF) { + switch (c) { + case 'd': + debug = true; + break; + case 't': + for (ops = scrub_impl; *ops; ops++) { + if (!strcmp(optarg, (*ops)->name)) { + ctx.ops = *ops; + break; + } + } + if (!ctx.ops) { + fprintf(stderr, +_("Unknown filesystem driver '%s'.\n"), + optarg); + return 1; + } + break; + case 'v': + verbose = true; + break; + case 'x': + scrub_data = true; + break; + case 'V': + printf(_("%s version %s\n"), progname, VERSION); + exit(0); + case '?': + default: + usage(); + } + } + + if (optind != argc - 1) + usage(); + + ctx.errors_found = 0; + ctx.warnings_found = 0; + ctx.mntpoint = argv[optind]; + ctx.quirks = SCRUB_QUIRK_FIEMAP_WORKS | SCRUB_QUIRK_FIEMAP_ATTR_WORKS | + SCRUB_QUIRK_FIBMAP_WORKS; + + /* Find the mount record for the passed-in argument. */ + + if (stat64(argv[optind], &ctx.mnt_sb) < 0) { + fprintf(stderr, + _("%s: could not stat: %s: %s\n"), + progname, argv[optind], strerror(errno)); + return 16; + } + + /* + * If the user did not specify an explicit mount table, try to use + * /proc/mounts if it is available, else /etc/mtab. We prefer + * /proc/mounts because it is kernel controlled, while /etc/mtab + * may contain garbage that userspace tools like pam_mounts wrote + * into it. + */ + if (!mtab) { + if (access(_PATH_PROC_MOUNTS, R_OK) == 0) + mtab = _PATH_PROC_MOUNTS; + else + mtab = _PATH_MOUNTED; + } + + ismnt = find_mountpoint(mtab, &ctx.mnt_sb, &ctx.mnt_ent); + if (!ismnt) { + fprintf(stderr, _("%s: Not a mount point or block device.\n"), + ctx.mntpoint); + return 16; + } + ctx.mntpoint = ctx.mnt_ent.mnt_dir; + + /* Find an appropriate scrub backend. */ + for (ops = scrub_impl; !ctx.ops && *ops; ops++) { + if (!strcmp(ctx.mnt_ent.mnt_type, (*ops)->name)) + ctx.ops = *ops; + } + if (!ctx.ops) + ctx.ops = &generic_scrub_ops; + INIT_LIST_HEAD(&ctx.path_stack); + if (verbose) + printf(_("%s: scrubbing %s filesystem with %s driver.\n"), + ctx.mntpoint, ctx.mnt_ent.mnt_type, ctx.ops->name); + + /* Phase 1: Find and verify filesystem */ + if (verbose) + printf(_("Phase 1: Find filesystem.\n")); + ctx.mnt_fd = open(ctx.mntpoint, O_RDONLY | O_NOATIME); + if (ctx.mnt_fd < 0) { + perror(ctx.mntpoint); + return 8; + } + ret = fstat64(ctx.mnt_fd, &ctx.mnt_sb); + if (ret) { + path_errno(&ctx); + moveon = false; + goto out; + } + moveon = ctx.ops->scan_fs(&ctx); + if (!moveon) + goto out; + + /* Phase 2: Check inodes, blocks, and sizes */ + if (verbose) + printf(_("Phase 2: Scanning inodes.\n")); + moveon = ctx.ops->scan_inodes(&ctx); + if (!moveon) + goto out; + + /* Phase 3: Check the directory structure. */ + if (verbose) + printf(_("Phase 3: Check the directory structure.\n")); + moveon = traverse_fs(&ctx); + if (!moveon) + goto out; + + /* Phase X: Check for duplicate blocks(??) */ + + /* Phase Y: Verify link counts(??) */ + + /* Phase 4: Check internal group metadata. */ + if (verbose) + printf(_("Phase 4: Check internal metadata.\n")); + moveon = ctx.ops->scan_metadata(&ctx); + if (!moveon) + goto out; + + /* Clean up scan data. */ + moveon = ctx.ops->cleanup(&ctx); + if (!moveon) + goto out; + +out: + ret = 0; + if (!moveon) + ret |= 8; + + if (ctx.errors_found && ctx.warnings_found) + fprintf(stderr, +_("%s: %lu errors and %lu warnings found. Unmount and run fsck.\n"), + ctx.mntpoint, ctx.errors_found, ctx.warnings_found); + else if (ctx.errors_found && ctx.warnings_found == 0) + fprintf(stderr, +_("%s: %lu errors found. Unmount and run fsck.\n"), + ctx.mntpoint, ctx.errors_found); + else if (ctx.errors_found == 0 && ctx.warnings_found) + fprintf(stderr, +_("%s: %lu warnings found.\n"), + ctx.mntpoint, ctx.warnings_found); + if (ctx.errors_found) + ret |= 4; + + return ret; +} diff --git a/scrub/scrub.h b/scrub/scrub.h new file mode 100644 index 0000000..69cd93c --- /dev/null +++ b/scrub/scrub.h @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2016 Oracle. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef SCRUB_H_ +#define SCRUB_H_ + +struct scrub_ctx; + +struct scrub_ops { + const char *name; + bool (*cleanup)(struct scrub_ctx *ctx); + bool (*scan_fs)(struct scrub_ctx *ctx); + bool (*scan_inodes)(struct scrub_ctx *ctx); + bool (*check_dir)(struct scrub_ctx *ctx, int dir_fd); + bool (*check_inode)(struct scrub_ctx *ctx, int fd, struct stat64 *sb); + bool (*scan_extents)(struct scrub_ctx *ctx, int fd, struct stat64 *sb, + bool attr_fork); + bool (*scan_xattrs)(struct scrub_ctx *ctx, int fd); + bool (*scan_special_xattrs)(struct scrub_ctx *ctx); + bool (*scan_metadata)(struct scrub_ctx *ctx); +}; + +#define SCRUB_QUIRK_FIEMAP_WORKS (1 << 0) +#define SCRUB_QUIRK_FIEMAP_ATTR_WORKS (1 << 1) +#define SCRUB_QUIRK_FIBMAP_WORKS (1 << 2) +struct scrub_ctx { + struct scrub_ops *ops; + char *mntpoint; + int mnt_fd; + struct mntent mnt_ent; + struct stat64 mnt_sb; + struct statvfs mnt_sv; + struct statfs mnt_sf; + unsigned long errors_found; + unsigned long warnings_found; + unsigned long quirks; + + struct list_head path_stack; + void *priv; +}; + +struct path_piece { + struct list_head list; + const char *name; +}; + +extern bool verbose; +extern bool debug; +extern bool scrub_data; + +void __path_errno(struct scrub_ctx *, const char *, int); +void __path_error(struct scrub_ctx *, const char *, int, const char *, ...); +void __path_warn(struct scrub_ctx *, const char *, int, const char *, ...); +void __str_errno(struct scrub_ctx *, const char *, const char *, int); +void __str_error(struct scrub_ctx *, const char *, const char *, int, const char *, ...); +void __str_warn(struct scrub_ctx *, const char *, const char *, int, const char *, ...); + +#define path_errno(ctx) __path_errno(ctx, __FILE__, __LINE__) +#define path_error(ctx, ...) __path_error(ctx, __FILE__, __LINE__, __VA_ARGS__) +#define path_warn(ctx, ...) __path_warn(ctx, __FILE__, __LINE__, __VA_ARGS__) +#define str_errno(ctx, str) __str_errno(ctx, str, __FILE__, __LINE__) +#define str_error(ctx, str, ...) __str_error(ctx, str, __FILE__, __LINE__, __VA_ARGS__) +#define str_warn(ctx, str, ...) __str_warn(ctx, str, __FILE__, __LINE__, __VA_ARGS__) + +int construct_path(struct scrub_ctx *ctx, char *buf, size_t buflen); + +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + +extern struct scrub_ops generic_scrub_ops; +extern struct scrub_ops xfs_scrub_ops; + +bool generic_cleanup(struct scrub_ctx *ctx); +bool generic_scan_fs(struct scrub_ctx *ctx); +bool generic_scan_inodes(struct scrub_ctx *ctx); +bool generic_check_dir(struct scrub_ctx *ctx, int dir_fd); +bool generic_check_inode(struct scrub_ctx *ctx, int fd, struct stat64 *sb); +bool generic_scan_extents(struct scrub_ctx *ctx, int fd, struct stat64 *sb, + bool attr_fork); +bool generic_scan_xattrs(struct scrub_ctx *ctx, int fd); +bool generic_scan_special_xattrs(struct scrub_ctx *ctx); + +#endif /* SCRUB_H_ */ diff --git a/scrub/xfs.c b/scrub/xfs.c new file mode 100644 index 0000000..7f078e5 --- /dev/null +++ b/scrub/xfs.c @@ -0,0 +1,239 @@ +/* + * Copyright (c) 2016 Oracle. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include "libxfs.h" +#include +#include +#include +#include "scrub.h" + +/* Routines to scrub an XFS filesystem. */ +#define XFS_SYSFS_DIR "/sys/fs/xfs" + +struct xfs_scrub_ctx { + xfs_fsop_geom_t geo; + int check_fd; +}; + +static bool +xfs_cleanup( + struct scrub_ctx *ctx) +{ + free(ctx->priv); + ctx->priv = NULL; + + return generic_cleanup(ctx); +} + +/* Find the /sys/fs/xfs/$dev/check path that corresponds to this fs. */ +static bool +xfs_find_sysfs_check( + struct scrub_ctx *ctx) +{ + struct xfs_scrub_ctx *xctx = ctx->priv; + char path[PATH_MAX]; + char buf[PATH_MAX]; + int sz; + ssize_t ssz; + char *p; + + /* /dev/block/$major:$minor usually points "../$kernel_name" */ + sz = snprintf(path, PATH_MAX, "/dev/block/%d:%d", + major(ctx->mnt_sb.st_dev), minor(ctx->mnt_sb.st_dev)); + if (sz < 0) { + path_errno(ctx); + return false; + } + + ssz = readlink(path, buf, PATH_MAX); + if (ssz < 0) { + perror(path); + return false; + } + buf[PATH_MAX - 1] = 0; + + p = strchr(buf, '/'); + p = NULL ? buf : p + 1; + + /* See if we can find a pointer to /sys/fs/xfs/$p/check */ + sz = snprintf(path, PATH_MAX, "/sys/fs/xfs/%s/check", p); + if (sz < 0) { + path_errno(ctx); + return false; + } + + xctx->check_fd = open(path, O_RDONLY | O_DIRECTORY); + if (xctx->check_fd < 0) { + if (errno != ENOENT) + perror(path); + return false; + } + + return true; +} + +/* Read the XFS geometry. */ +static bool +xfs_scan_fs( + struct scrub_ctx *ctx) +{ + struct xfs_scrub_ctx *xctx; + int error; + + if (!platform_test_xfs_fd(ctx->mnt_fd)) { + path_error(ctx, +_("Does not appear to be an XFS filesystem!")); + return false; + } + + xctx = malloc(sizeof(struct xfs_scrub_ctx)); + if (!ctx) { + path_errno(ctx); + return false; + } + xctx->check_fd = -1; + + /* Retrieve XFS geometry. */ + error = xfsctl(ctx->mntpoint, ctx->mnt_fd, XFS_IOC_FSGEOMETRY, + &xctx->geo); + if (error) { + path_errno(ctx); + xfs_cleanup(ctx); + return false; + } + ctx->priv = xctx; + + if (!xfs_find_sysfs_check(ctx)) + path_warn(ctx, +_("Couldn't find sysfs check path for filesystem. Metadata cannot be checked.")); + + return generic_scan_fs(ctx); +} + +/* Scrub a piece of metadata in a particular AG. */ +static bool +xfs_scan_ag_metadata( + struct scrub_ctx *ctx, + const char *name, + xfs_agnumber_t ag) +{ + struct xfs_scrub_ctx *xctx = ctx->priv; + char descr[256]; + char cmd[256]; + int fd; + int sz; + ssize_t ssz; + + sz = snprintf(descr, 256, "AG %d %s", ag, name); + if (sz < 0) { + str_errno(ctx, name); + return false; + } + + fd = openat(xctx->check_fd, name, O_WRONLY); + if (fd < 0) { + str_errno(ctx, descr); + return true; + } + + sz = snprintf(cmd, 256, "%d", ag); + if (sz < 0) { + str_errno(ctx, descr); + goto out; + } + + ssz = write(fd, cmd, strlen(cmd)); + if (ssz < 0) { + str_errno(ctx, descr); + goto out; + } else if (ssz != strlen(cmd)) { + str_error(ctx, descr, +_("Strange output length %zu (expected %zu)\n"), + ssz, strlen(cmd)); + ctx->errors_found++; + goto out; + } + +out: + sz = close(fd); + if (sz) + str_errno(ctx, descr); + + return true; +} + +/* Try to scan metadata via sysfs. */ +static bool +xfs_scan_metadata( + struct scrub_ctx *ctx) +{ + struct xfs_scrub_ctx *xctx = ctx->priv; + xfs_agnumber_t ag; + DIR *checkdir; + bool moveon = true; + struct dirent *dirent; + int error; + + if (xctx->check_fd < 0) + return true; + + /* Open the check controls. */ + checkdir = fdopendir(xctx->check_fd); + if (!checkdir) { + path_error(ctx, +_("Failed to open the check control.")); + return false; + } + + /* Scan everything we can in here. */ + while ((dirent = readdir(checkdir)) != NULL) { + if (!strcmp(".", dirent->d_name) || + !strcmp("..", dirent->d_name)) + continue; + + for (ag = 0; ag < xctx->geo.agcount; ag++) { + moveon = xfs_scan_ag_metadata(ctx, dirent->d_name, ag); + if (!moveon) + break; + } + } + + /* Done with metadata scrub. */ + error = closedir(checkdir); + if (error) + path_errno(ctx); + xctx->check_fd = -1; + + return moveon; +} + +/* + * XXX: eventually we'll want to do better checking here, but the generic + * tree walk + metadata scrub is good enough for now. + */ +struct scrub_ops xfs_scrub_ops = { + .name = "xfs", + .cleanup = xfs_cleanup, + .scan_fs = xfs_scan_fs, + .scan_inodes = generic_scan_inodes, + .check_dir = generic_check_dir, + .check_inode = generic_check_inode, + .scan_extents = generic_scan_extents, + .scan_xattrs = generic_scan_xattrs, + .scan_special_xattrs = generic_scan_special_xattrs, + .scan_metadata = xfs_scan_metadata, +}; From mchristi@redhat.com Fri Apr 15 05:40:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9EF697CA0 for ; Fri, 15 Apr 2016 05:40:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2398AAC005 for ; Fri, 15 Apr 2016 03:40:08 -0700 (PDT) X-ASG-Debug-ID: 1460716806-04bdf011045e4aa0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GP5TD65gly2YFcY8 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:40:07 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 470CE64075; Fri, 15 Apr 2016 10:40:06 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe31k010243; Fri, 15 Apr 2016 06:40:03 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Subject: [PATCH 00/42] v6: separate operations from flags in the bio/request structs Date: Fri, 15 Apr 2016 05:39:20 -0500 X-ASG-Orig-Subj: [PATCH 00/42] v6: separate operations from flags in the bio/request structs Message-Id: <1460716802-2294-1-git-send-email-mchristi@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Fri, 15 Apr 2016 10:40:06 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460716807 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The following patches begin to cleanup the request->cmd_flags and bio->bi_rw mess. We currently use cmd_flags to specify the operation, attributes and state of the request. For bi_rw we use it for similar info and also the priority but then also have another bi_flags field for state. At some point, we abused them so much we just made cmd_flags 64 bits, so we could add more. The following patches seperate the operation (read, write discard, flush, etc) from cmd_flags/bi_rw. This patchset was made against linux-next from today April 15 (git tag next-20160415). I put a git tree here: https://github.com/mikechristie/linux-kernel.git The patches are in the op branch. v6 and maybe hopfully the last version: 1. Adapt patch 41 to Jens's QUEUE_FLAG_WC/FUA patchset. v5: 1. Missed crypto fs submit_bio_wait call. 2. Change nfs bi_rw check to bi_op. 3. btrfs. Convert finish_parity_scrub. 4. Reworked against Jens's QUEUE_FLAG patches so I could drop my similar code. 5. Separated the core block layer change into multiple patches for merging, elevator, stats, mq and non mq request allocation to try and make it easier to read. v4: 1. Rebased to current linux-next tree. v3: 1. Used "=" instead of "|=" to setup bio bi_rw. 2. Removed __get_request cmd_flags compat code. 3. Merged initial dm related changes requested by Mike Snitzer. 4. Fixed ubd kbuild errors in flush related patches. 5. Fix 80 char col issues in several patches. 6. Fix issue with one of the btrfs patches where it looks like I reverted a patch when trying to fix a merge error. v2 1. Dropped arguments from submit_bio, and had callers setup bio. 2. Add REQ_OP_FLUSH for request_fn users and renamed REQ_FLUSH to REQ_PREFLUSH for make_request_fn users. 3. Dropped bio/rq_data_dir functions, and added a op_is_write function instead. Diffstat for the set: Documentation/block/writeback_cache_control.txt | 28 ++++---- Documentation/device-mapper/log-writes.txt | 10 +-- arch/um/drivers/ubd_kern.c | 2 +- block/bio.c | 21 +++--- block/blk-core.c | 92 +++++++++++++------------ block/blk-flush.c | 23 ++++--- block/blk-lib.c | 12 ++-- block/blk-map.c | 2 +- block/blk-merge.c | 24 ++++--- block/blk-mq.c | 41 ++++++----- block/cfq-iosched.c | 53 ++++++++------ block/elevator.c | 7 +- drivers/ata/libata-scsi.c | 2 +- drivers/block/brd.c | 2 +- drivers/block/drbd/drbd_actlog.c | 33 +++++---- drivers/block/drbd/drbd_bitmap.c | 8 +-- drivers/block/drbd/drbd_int.h | 4 +- drivers/block/drbd/drbd_main.c | 20 +++--- drivers/block/drbd/drbd_protocol.h | 2 +- drivers/block/drbd/drbd_receiver.c | 37 ++++++---- drivers/block/drbd/drbd_req.c | 2 +- drivers/block/drbd/drbd_worker.c | 7 +- drivers/block/floppy.c | 3 +- drivers/block/loop.c | 14 ++-- drivers/block/mtip32xx/mtip32xx.c | 2 +- drivers/block/nbd.c | 4 +- drivers/block/osdblk.c | 2 +- drivers/block/pktcdvd.c | 4 +- drivers/block/ps3disk.c | 4 +- drivers/block/rbd.c | 4 +- drivers/block/rsxx/dma.c | 2 +- drivers/block/skd_main.c | 11 ++- drivers/block/umem.c | 2 +- drivers/block/virtio_blk.c | 2 +- drivers/block/xen-blkback/blkback.c | 29 +++++--- drivers/block/xen-blkfront.c | 65 ++++++++--------- drivers/block/zram/zram_drv.c | 2 +- drivers/ide/ide-cd_ioctl.c | 3 - drivers/ide/ide-disk.c | 2 +- drivers/ide/ide-floppy.c | 2 +- drivers/lightnvm/rrpc.c | 6 +- drivers/md/bcache/btree.c | 2 + drivers/md/bcache/debug.c | 8 ++- drivers/md/bcache/io.c | 2 +- drivers/md/bcache/journal.c | 9 +-- drivers/md/bcache/movinggc.c | 2 +- drivers/md/bcache/request.c | 27 ++++---- drivers/md/bcache/super.c | 26 ++++--- drivers/md/bcache/writeback.c | 4 +- drivers/md/bitmap.c | 6 +- drivers/md/dm-bufio.c | 9 ++- drivers/md/dm-cache-target.c | 18 ++--- drivers/md/dm-crypt.c | 8 ++- drivers/md/dm-era-target.c | 4 +- drivers/md/dm-flakey.c | 2 +- drivers/md/dm-io.c | 58 +++++++++------- drivers/md/dm-kcopyd.c | 25 ++++--- drivers/md/dm-log-writes.c | 13 ++-- drivers/md/dm-log.c | 5 +- drivers/md/dm-raid.c | 5 +- drivers/md/dm-raid1.c | 22 +++--- drivers/md/dm-region-hash.c | 6 +- drivers/md/dm-snap-persistent.c | 24 ++++--- drivers/md/dm-snap.c | 6 +- drivers/md/dm-stats.c | 9 ++- drivers/md/dm-stripe.c | 6 +- drivers/md/dm-thin.c | 25 ++++--- drivers/md/dm.c | 44 ++++++------ drivers/md/linear.c | 4 +- drivers/md/md.c | 21 ++++-- drivers/md/md.h | 5 +- drivers/md/multipath.c | 2 +- drivers/md/raid0.c | 4 +- drivers/md/raid1.c | 40 ++++++----- drivers/md/raid10.c | 54 ++++++++------- drivers/md/raid5-cache.c | 34 +++++---- drivers/md/raid5.c | 63 +++++++++-------- drivers/mmc/card/block.c | 10 ++- drivers/mmc/card/queue.c | 6 +- drivers/mmc/card/queue.h | 5 +- drivers/mtd/mtd_blkdevs.c | 4 +- drivers/nvme/host/core.c | 4 +- drivers/nvme/host/nvme.h | 2 +- drivers/nvme/host/pci.c | 2 +- drivers/scsi/osd/osd_initiator.c | 12 ++-- drivers/scsi/sd.c | 20 ++++-- drivers/staging/lustre/lustre/llite/lloop.c | 6 +- drivers/target/target_core_iblock.c | 42 +++++------ drivers/target/target_core_pscsi.c | 2 +- fs/btrfs/check-integrity.c | 61 ++++++++-------- fs/btrfs/check-integrity.h | 6 +- fs/btrfs/compression.c | 17 +++-- fs/btrfs/ctree.h | 2 +- fs/btrfs/disk-io.c | 44 ++++++------ fs/btrfs/disk-io.h | 2 +- fs/btrfs/extent-tree.c | 2 +- fs/btrfs/extent_io.c | 91 ++++++++++++------------ fs/btrfs/extent_io.h | 8 +-- fs/btrfs/inode.c | 71 ++++++++++--------- fs/btrfs/raid56.c | 17 +++-- fs/btrfs/scrub.c | 16 +++-- fs/btrfs/volumes.c | 91 ++++++++++++------------ fs/btrfs/volumes.h | 6 +- fs/buffer.c | 70 ++++++++++--------- fs/crypto/crypto.c | 3 +- fs/direct-io.c | 36 ++++++---- fs/exofs/ore.c | 2 +- fs/ext4/balloc.c | 2 +- fs/ext4/crypto.c | 3 +- fs/ext4/ialloc.c | 2 +- fs/ext4/inode.c | 8 +-- fs/ext4/mmp.c | 4 +- fs/ext4/namei.c | 3 +- fs/ext4/page-io.c | 9 ++- fs/ext4/readpage.c | 9 +-- fs/ext4/super.c | 2 +- fs/f2fs/checkpoint.c | 10 +-- fs/f2fs/data.c | 40 +++++++---- fs/f2fs/f2fs.h | 5 +- fs/f2fs/gc.c | 9 ++- fs/f2fs/inline.c | 3 +- fs/f2fs/node.c | 8 ++- fs/f2fs/segment.c | 16 +++-- fs/f2fs/trace.c | 7 +- fs/fat/misc.c | 2 +- fs/gfs2/bmap.c | 4 +- fs/gfs2/dir.c | 2 +- fs/gfs2/log.c | 8 +-- fs/gfs2/lops.c | 13 ++-- fs/gfs2/lops.h | 2 +- fs/gfs2/meta_io.c | 19 ++--- fs/gfs2/ops_fstype.c | 4 +- fs/gfs2/quota.c | 2 +- fs/hfsplus/hfsplus_fs.h | 2 +- fs/hfsplus/part_tbl.c | 5 +- fs/hfsplus/super.c | 6 +- fs/hfsplus/wrapper.c | 16 +++-- fs/isofs/compress.c | 2 +- fs/jbd2/commit.c | 6 +- fs/jbd2/journal.c | 10 +-- fs/jbd2/recovery.c | 4 +- fs/jfs/jfs_logmgr.c | 8 ++- fs/jfs/jfs_metapage.c | 10 +-- fs/logfs/dev_bdev.c | 17 +++-- fs/mpage.c | 42 +++++------ fs/nfs/blocklayout/blocklayout.c | 22 +++--- fs/nilfs2/btnode.c | 6 +- fs/nilfs2/btnode.h | 2 +- fs/nilfs2/btree.c | 6 +- fs/nilfs2/gcinode.c | 5 +- fs/nilfs2/mdt.c | 11 +-- fs/nilfs2/segbuf.c | 19 ++--- fs/ntfs/aops.c | 6 +- fs/ntfs/compress.c | 2 +- fs/ntfs/file.c | 2 +- fs/ntfs/logfile.c | 2 +- fs/ntfs/mft.c | 4 +- fs/ocfs2/aops.c | 2 +- fs/ocfs2/buffer_head_io.c | 8 +-- fs/ocfs2/cluster/heartbeat.c | 15 ++-- fs/ocfs2/super.c | 2 +- fs/reiserfs/inode.c | 4 +- fs/reiserfs/journal.c | 14 ++-- fs/reiserfs/stree.c | 4 +- fs/reiserfs/super.c | 2 +- fs/squashfs/block.c | 4 +- fs/udf/dir.c | 2 +- fs/udf/directory.c | 2 +- fs/udf/inode.c | 2 +- fs/ufs/balloc.c | 2 +- fs/ufs/util.c | 2 +- fs/xfs/xfs_aops.c | 14 ++-- fs/xfs/xfs_buf.c | 29 ++++---- include/linux/bio.h | 30 ++++---- include/linux/blk-cgroup.h | 13 ++-- include/linux/blk_types.h | 36 +++++----- include/linux/blkdev.h | 32 +++++---- include/linux/blktrace_api.h | 2 +- include/linux/buffer_head.h | 11 +-- include/linux/dm-io.h | 3 +- include/linux/elevator.h | 4 +- include/linux/fs.h | 57 ++++++++++----- include/trace/events/bcache.h | 12 ++-- include/trace/events/block.h | 31 ++++++--- include/trace/events/f2fs.h | 37 ++++++---- kernel/power/swap.c | 34 +++++---- kernel/trace/blktrace.c | 58 +++++++++------- mm/page_io.c | 10 +-- 188 files changed, 1529 insertions(+), 1217 deletions(-) From mchristi@redhat.com Fri Apr 15 05:40:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0E01D7CA4 for ; Fri, 15 Apr 2016 05:40:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8516AAC005 for ; Fri, 15 Apr 2016 03:40:15 -0700 (PDT) X-ASG-Debug-ID: 1460716813-04bdf011035e4ac0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GqQNdH8WZQEvQPoG (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:40:13 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3795F3B721; Fri, 15 Apr 2016 10:40:13 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe31n010243; Fri, 15 Apr 2016 06:40:11 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 03/42] block, fs, mm, drivers: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 05:39:23 -0500 X-ASG-Orig-Subj: [PATCH 03/42] block, fs, mm, drivers: set bi_op to REQ_OP Message-Id: <1460716802-2294-4-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716813 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch converts the simple bi_rw use cases in the block, drivers, mm and fs code to set the bio->bi_op to a REQ_OP. These should be simple one liner cases, so I just did them in one patch. The next patches handle the more complicated cases in a module per patch. v5: 1. Add missed crypto call. 2. Change nfs bi_rw check to bi_op. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- block/bio.c | 8 +++++--- block/blk-flush.c | 1 + block/blk-lib.c | 7 ++++--- block/blk-map.c | 2 +- drivers/block/floppy.c | 2 +- drivers/block/pktcdvd.c | 4 ++-- drivers/lightnvm/rrpc.c | 4 ++-- drivers/scsi/osd/osd_initiator.c | 8 ++++---- fs/crypto/crypto.c | 2 +- fs/exofs/ore.c | 2 +- fs/ext4/crypto.c | 2 +- fs/ext4/page-io.c | 8 +++++--- fs/ext4/readpage.c | 2 +- fs/jfs/jfs_logmgr.c | 2 ++ fs/jfs/jfs_metapage.c | 4 ++-- fs/logfs/dev_bdev.c | 12 ++++++------ fs/nfs/blocklayout/blocklayout.c | 4 ++-- mm/page_io.c | 4 ++-- 18 files changed, 43 insertions(+), 35 deletions(-) diff --git a/block/bio.c b/block/bio.c index f319b78..921de2e 100644 --- a/block/bio.c +++ b/block/bio.c @@ -587,6 +587,7 @@ void __bio_clone_fast(struct bio *bio, struct bio *bio_src) */ bio->bi_bdev = bio_src->bi_bdev; bio_set_flag(bio, BIO_CLONED); + bio->bi_op = bio_src->bi_op; bio->bi_rw = bio_src->bi_rw; bio->bi_iter = bio_src->bi_iter; bio->bi_io_vec = bio_src->bi_io_vec; @@ -669,6 +670,7 @@ struct bio *bio_clone_bioset(struct bio *bio_src, gfp_t gfp_mask, return NULL; bio->bi_bdev = bio_src->bi_bdev; + bio->bi_op = bio_src->bi_op; bio->bi_rw = bio_src->bi_rw; bio->bi_iter.bi_sector = bio_src->bi_iter.bi_sector; bio->bi_iter.bi_size = bio_src->bi_iter.bi_size; @@ -1177,7 +1179,7 @@ struct bio *bio_copy_user_iov(struct request_queue *q, goto out_bmd; if (iter->type & WRITE) - bio->bi_rw |= REQ_WRITE; + bio->bi_op = REQ_OP_WRITE; ret = 0; @@ -1347,7 +1349,7 @@ struct bio *bio_map_user_iov(struct request_queue *q, * set data direction, and check if mapped pages need bouncing */ if (iter->type & WRITE) - bio->bi_rw |= REQ_WRITE; + bio->bi_op = REQ_OP_WRITE; bio_set_flag(bio, BIO_USER_MAPPED); @@ -1540,7 +1542,7 @@ struct bio *bio_copy_kern(struct request_queue *q, void *data, unsigned int len, bio->bi_private = data; } else { bio->bi_end_io = bio_copy_kern_endio; - bio->bi_rw |= REQ_WRITE; + bio->bi_op = REQ_OP_WRITE; } return bio; diff --git a/block/blk-flush.c b/block/blk-flush.c index 3af4a5a..6611bcb 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c @@ -485,6 +485,7 @@ int blkdev_issue_flush(struct block_device *bdev, gfp_t gfp_mask, bio = bio_alloc(gfp_mask, 0); bio->bi_bdev = bdev; + bio->bi_op = REQ_OP_WRITE; bio->bi_rw = WRITE_FLUSH; ret = submit_bio_wait(bio); diff --git a/block/blk-lib.c b/block/blk-lib.c index 87e3de4..d01b5f2 100644 --- a/block/blk-lib.c +++ b/block/blk-lib.c @@ -42,7 +42,7 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, { DECLARE_COMPLETION_ONSTACK(wait); struct request_queue *q = bdev_get_queue(bdev); - int type = REQ_WRITE | REQ_DISCARD; + int type = 0; unsigned int granularity; int alignment; struct bio_batch bb; @@ -102,6 +102,7 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, bio->bi_end_io = bio_batch_end_io; bio->bi_bdev = bdev; bio->bi_private = &bb; + bio->bi_op = REQ_OP_DISCARD; bio->bi_rw = type; bio->bi_iter.bi_size = req_sects << 9; @@ -178,7 +179,7 @@ int blkdev_issue_write_same(struct block_device *bdev, sector_t sector, bio->bi_io_vec->bv_page = page; bio->bi_io_vec->bv_offset = 0; bio->bi_io_vec->bv_len = bdev_logical_block_size(bdev); - bio->bi_rw = REQ_WRITE | REQ_WRITE_SAME; + bio->bi_op = REQ_OP_WRITE_SAME; if (nr_sects > max_write_same_sectors) { bio->bi_iter.bi_size = max_write_same_sectors << 9; @@ -240,7 +241,7 @@ static int __blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, bio->bi_bdev = bdev; bio->bi_end_io = bio_batch_end_io; bio->bi_private = &bb; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; while (nr_sects != 0) { sz = min((sector_t) PAGE_SIZE >> 9 , nr_sects); diff --git a/block/blk-map.c b/block/blk-map.c index a54f054..c489ecd 100644 --- a/block/blk-map.c +++ b/block/blk-map.c @@ -255,7 +255,7 @@ int blk_rq_map_kern(struct request_queue *q, struct request *rq, void *kbuf, return PTR_ERR(bio); if (!reading) - bio->bi_rw |= REQ_WRITE; + bio->bi_op = REQ_OP_WRITE; if (do_copy) rq->cmd_flags |= REQ_COPY_USER; diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 73ded25..84b1584 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c @@ -3822,7 +3822,7 @@ static int __floppy_read_block_0(struct block_device *bdev, int drive) bio.bi_flags |= (1 << BIO_QUIET); bio.bi_private = &cbdata; bio.bi_end_io = floppy_rb0_cb; - bio.bi_rw = READ; + bio.bi_op = REQ_OP_READ; submit_bio(&bio); process_fd_request(); diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c index d06c62e..a4ecbd3 100644 --- a/drivers/block/pktcdvd.c +++ b/drivers/block/pktcdvd.c @@ -1074,7 +1074,7 @@ static void pkt_gather_data(struct pktcdvd_device *pd, struct packet_data *pkt) BUG(); atomic_inc(&pkt->io_wait); - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; pkt_queue_bio(pd, bio); frames_read++; } @@ -1336,7 +1336,7 @@ static void pkt_start_write(struct pktcdvd_device *pd, struct packet_data *pkt) /* Start the write request */ atomic_set(&pkt->io_wait, 1); - pkt->w_bio->bi_rw = WRITE; + pkt->w_bio->bi_op = REQ_OP_WRITE; pkt_queue_bio(pd, pkt->w_bio); } diff --git a/drivers/lightnvm/rrpc.c b/drivers/lightnvm/rrpc.c index 3ab6495..fd9b629 100644 --- a/drivers/lightnvm/rrpc.c +++ b/drivers/lightnvm/rrpc.c @@ -342,7 +342,7 @@ try: /* Perform read to do GC */ bio->bi_iter.bi_sector = rrpc_get_sector(rev->addr); - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; bio->bi_private = &wait; bio->bi_end_io = rrpc_end_sync_bio; @@ -364,7 +364,7 @@ try: reinit_completion(&wait); bio->bi_iter.bi_sector = rrpc_get_sector(rev->addr); - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; bio->bi_private = &wait; bio->bi_end_io = rrpc_end_sync_bio; diff --git a/drivers/scsi/osd/osd_initiator.c b/drivers/scsi/osd/osd_initiator.c index 3b11aad..edcba56 100644 --- a/drivers/scsi/osd/osd_initiator.c +++ b/drivers/scsi/osd/osd_initiator.c @@ -726,7 +726,7 @@ static int _osd_req_list_objects(struct osd_request *or, return PTR_ERR(bio); } - bio->bi_rw &= ~REQ_WRITE; + bio->bi_op = REQ_OP_READ; or->in.bio = bio; or->in.total_bytes = bio->bi_iter.bi_size; return 0; @@ -839,7 +839,7 @@ int osd_req_write_kern(struct osd_request *or, if (IS_ERR(bio)) return PTR_ERR(bio); - bio->bi_rw |= REQ_WRITE; /* FIXME: bio_set_dir() */ + bio->bi_op = REQ_OP_WRITE; osd_req_write(or, obj, offset, bio, len); return 0; } @@ -956,7 +956,7 @@ static int _osd_req_finalize_cdb_cont(struct osd_request *or, const u8 *cap_key) if (IS_ERR(bio)) return PTR_ERR(bio); - bio->bi_rw |= REQ_WRITE; + bio->bi_op = REQ_OP_WRITE; /* integrity check the continuation before the bio is linked * with the other data segments since the continuation @@ -1077,7 +1077,7 @@ int osd_req_write_sg_kern(struct osd_request *or, if (IS_ERR(bio)) return PTR_ERR(bio); - bio->bi_rw |= REQ_WRITE; + bio->bi_op = REQ_OP_WRITE; osd_req_write_sg(or, obj, bio, sglist, numentries); return 0; diff --git a/fs/crypto/crypto.c b/fs/crypto/crypto.c index 5b75856..4bb62fe 100644 --- a/fs/crypto/crypto.c +++ b/fs/crypto/crypto.c @@ -318,7 +318,7 @@ int fscrypt_zeroout_range(struct inode *inode, pgoff_t lblk, bio->bi_bdev = inode->i_sb->s_bdev; bio->bi_iter.bi_sector = pblk << (inode->i_sb->s_blocksize_bits - 9); - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; ret = bio_add_page(bio, ciphertext_page, inode->i_sb->s_blocksize, 0); if (ret != inode->i_sb->s_blocksize) { diff --git a/fs/exofs/ore.c b/fs/exofs/ore.c index 7bd8ac8..c40ed74 100644 --- a/fs/exofs/ore.c +++ b/fs/exofs/ore.c @@ -878,7 +878,7 @@ static int _write_mirror(struct ore_io_state *ios, int cur_comp) } else { bio = master_dev->bio; /* FIXME: bio_set_dir() */ - bio->bi_rw |= REQ_WRITE; + bio->bi_op = REQ_OP_WRITE; } osd_req_write(or, _ios_obj(ios, cur_comp), diff --git a/fs/ext4/crypto.c b/fs/ext4/crypto.c index 811bd5d..f08d860 100644 --- a/fs/ext4/crypto.c +++ b/fs/ext4/crypto.c @@ -428,7 +428,7 @@ int ext4_encrypted_zeroout(struct inode *inode, ext4_lblk_t lblk, bio->bi_bdev = inode->i_sb->s_bdev; bio->bi_iter.bi_sector = pblk << (inode->i_sb->s_blocksize_bits - 9); - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; ret = bio_add_page(bio, ciphertext_page, inode->i_sb->s_blocksize, 0); if (ret != inode->i_sb->s_blocksize) { diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c index e945b31..43655e9 100644 --- a/fs/ext4/page-io.c +++ b/fs/ext4/page-io.c @@ -340,10 +340,12 @@ void ext4_io_submit(struct ext4_io_submit *io) struct bio *bio = io->io_bio; if (bio) { - int io_op = io->io_wbc->sync_mode == WB_SYNC_ALL ? - WRITE_SYNC : WRITE; + int io_op_flags = io->io_wbc->sync_mode == WB_SYNC_ALL ? + WRITE_SYNC : 0; + bio_get(io->io_bio); - io->io_bio->bi_rw = io_op; + io->io_bio->bi_op = REQ_OP_WRITE; + io->io_bio->bi_rw = io_op_flags; submit_bio(io->io_bio); bio_put(io->io_bio); } diff --git a/fs/ext4/readpage.c b/fs/ext4/readpage.c index 130bd45..7452ecf 100644 --- a/fs/ext4/readpage.c +++ b/fs/ext4/readpage.c @@ -294,7 +294,7 @@ int ext4_mpage_readpages(struct address_space *mapping, bio->bi_iter.bi_sector = blocks[0] << (blkbits - 9); bio->bi_end_io = mpage_end_io; bio->bi_private = ctx; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; } length = first_hole << blkbits; diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c index 3ee3f32..d315c1e 100644 --- a/fs/jfs/jfs_logmgr.c +++ b/fs/jfs/jfs_logmgr.c @@ -2002,6 +2002,7 @@ static int lbmRead(struct jfs_log * log, int pn, struct lbuf ** bpp) bio->bi_end_io = lbmIODone; bio->bi_private = bp; + bio->bi_op = REQ_OP_READ; bio->bi_rw = READ_SYNC; /*check if journaling to disk has been disabled*/ if (log->no_integrity) { @@ -2146,6 +2147,7 @@ static void lbmStartIO(struct lbuf * bp) bio->bi_end_io = lbmIODone; bio->bi_private = bp; + bio->bi_op = REQ_OP_WRITE; bio->bi_rw = WRITE_SYNC; /* check if journaling to disk has been disabled */ diff --git a/fs/jfs/jfs_metapage.c b/fs/jfs/jfs_metapage.c index 9725443..048342f 100644 --- a/fs/jfs/jfs_metapage.c +++ b/fs/jfs/jfs_metapage.c @@ -434,7 +434,7 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc) bio->bi_iter.bi_sector = pblock << (inode->i_blkbits - 9); bio->bi_end_io = metapage_write_end_io; bio->bi_private = page; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; /* Don't call bio_add_page yet, we may add to this vec */ bio_offset = offset; @@ -515,7 +515,7 @@ static int metapage_readpage(struct file *fp, struct page *page) pblock << (inode->i_blkbits - 9); bio->bi_end_io = metapage_read_end_io; bio->bi_private = page; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; len = xlen << inode->i_blkbits; offset = block_offset << inode->i_blkbits; if (bio_add_page(bio, page, len, offset) < len) diff --git a/fs/logfs/dev_bdev.c b/fs/logfs/dev_bdev.c index 29704bd..5c02271 100644 --- a/fs/logfs/dev_bdev.c +++ b/fs/logfs/dev_bdev.c @@ -14,7 +14,7 @@ #define PAGE_OFS(ofs) ((ofs) & (PAGE_SIZE-1)) -static int sync_request(struct page *page, struct block_device *bdev, int rw) +static int sync_request(struct page *page, struct block_device *bdev, int op) { struct bio bio; struct bio_vec bio_vec; @@ -29,7 +29,7 @@ static int sync_request(struct page *page, struct block_device *bdev, int rw) bio.bi_bdev = bdev; bio.bi_iter.bi_sector = page->index * (PAGE_SIZE >> 9); bio.bi_iter.bi_size = PAGE_SIZE; - bio.bi_rw = rw; + bio.bi_op = op; return submit_bio_wait(&bio); } @@ -96,7 +96,7 @@ static int __bdev_writeseg(struct super_block *sb, u64 ofs, pgoff_t index, bio->bi_iter.bi_sector = ofs >> 9; bio->bi_private = sb; bio->bi_end_io = writeseg_end_io; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; atomic_inc(&super->s_pending_writes); submit_bio(bio); @@ -124,7 +124,7 @@ static int __bdev_writeseg(struct super_block *sb, u64 ofs, pgoff_t index, bio->bi_iter.bi_sector = ofs >> 9; bio->bi_private = sb; bio->bi_end_io = writeseg_end_io; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; atomic_inc(&super->s_pending_writes); submit_bio(bio); return 0; @@ -188,7 +188,7 @@ static int do_erase(struct super_block *sb, u64 ofs, pgoff_t index, bio->bi_iter.bi_sector = ofs >> 9; bio->bi_private = sb; bio->bi_end_io = erase_end_io; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; atomic_inc(&super->s_pending_writes); submit_bio(bio); @@ -210,7 +210,7 @@ static int do_erase(struct super_block *sb, u64 ofs, pgoff_t index, bio->bi_iter.bi_sector = ofs >> 9; bio->bi_private = sb; bio->bi_end_io = erase_end_io; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; atomic_inc(&super->s_pending_writes); submit_bio(bio); return 0; diff --git a/fs/nfs/blocklayout/blocklayout.c b/fs/nfs/blocklayout/blocklayout.c index 4c79f4d..7b6af2e 100644 --- a/fs/nfs/blocklayout/blocklayout.c +++ b/fs/nfs/blocklayout/blocklayout.c @@ -107,7 +107,7 @@ bl_submit_bio(struct bio *bio) if (bio) { get_parallel(bio->bi_private); dprintk("%s submitting %s bio %u@%llu\n", __func__, - bio->bi_rw == READ ? "read" : "write", + bio->bi_op == READ ? "read" : "write", bio->bi_iter.bi_size, (unsigned long long)bio->bi_iter.bi_sector); submit_bio(bio); @@ -175,7 +175,7 @@ retry: disk_addr >> SECTOR_SHIFT, end_io, par); if (!bio) return ERR_PTR(-ENOMEM); - bio->bi_rw = rw; + bio->bi_op = rw; } if (bio_add_page(bio, page, *len, offset) < *len) { bio = bl_submit_bio(bio); diff --git a/mm/page_io.c b/mm/page_io.c index 85cc7e1..24da235 100644 --- a/mm/page_io.c +++ b/mm/page_io.c @@ -317,7 +317,7 @@ int __swap_writepage(struct page *page, struct writeback_control *wbc, ret = -ENOMEM; goto out; } - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; if (wbc->sync_mode == WB_SYNC_ALL) bio->bi_rw |= REQ_SYNC; count_vm_event(PSWPOUT); @@ -370,7 +370,7 @@ int swap_readpage(struct page *page) ret = -ENOMEM; goto out; } - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; count_vm_event(PSWPIN); submit_bio(bio); out: -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:40:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9EA627CA6 for ; Fri, 15 Apr 2016 05:40:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6441C8F8049 for ; Fri, 15 Apr 2016 03:40:13 -0700 (PDT) X-ASG-Debug-ID: 1460716811-04cbb02e1c2e9740001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 2VwEiPuDYU6YsvzV (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:40:11 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E7A656265A; Fri, 15 Apr 2016 10:40:10 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe31m010243; Fri, 15 Apr 2016 06:40:08 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 02/42] block: add REQ_OP definitions and bi_op/op fields Date: Fri, 15 Apr 2016 05:39:22 -0500 X-ASG-Orig-Subj: [PATCH 02/42] block: add REQ_OP definitions and bi_op/op fields Message-Id: <1460716802-2294-3-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Fri, 15 Apr 2016 10:40:11 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460716811 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie The following patches separate the operation (write, read, discard, etc) from the rq_flag_bits flags. This patch adds definitions for request/bio operations, adds fields to the request/bio to set them, and some temporary compat code so the kernel/modules can use either one. In the final patches this compat code will be removed when everything is converted. In this patch the REQ_OPs match the REQ rq_flag_bits ones for compat reasons while all the code is converted in this set. In the last patches that will abe removed and the bi_op field will be shrunk. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- block/blk-core.c | 19 ++++++++++++++++--- include/linux/blk_types.h | 15 ++++++++++++++- include/linux/blkdev.h | 1 + include/linux/fs.h | 37 +++++++++++++++++++++++++++++++++++-- 4 files changed, 66 insertions(+), 6 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index e953407..3b238ef 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1698,7 +1698,8 @@ void init_request_from_bio(struct request *req, struct bio *bio) { req->cmd_type = REQ_TYPE_FS; - req->cmd_flags |= bio->bi_rw & REQ_COMMON_MASK; + /* tmp compat. Allow users to set bi_op or bi_rw */ + req->cmd_flags |= (bio->bi_rw | bio->bi_op) & REQ_COMMON_MASK; if (bio->bi_rw & REQ_RAHEAD) req->cmd_flags |= REQ_FAILFAST_MASK; @@ -2034,6 +2035,12 @@ blk_qc_t generic_make_request(struct bio *bio) struct bio_list bio_list_on_stack; blk_qc_t ret = BLK_QC_T_NONE; + /* tmp compat. Allow users to set either one or both. + * This will be removed when we have converted + * everyone in the next patches. + */ + bio->bi_rw |= bio->bi_op; + if (!generic_make_request_checks(bio)) goto out; @@ -2103,6 +2110,12 @@ EXPORT_SYMBOL(generic_make_request); */ blk_qc_t submit_bio(struct bio *bio) { + /* tmp compat. Allow users to set either one or both. + * This will be removed when we have converted + * everyone in the next patches. + */ + bio->bi_rw |= bio->bi_op; + /* * If it's a regular read/write or a barrier with data attached, * go through the normal accounting stuff before submission. @@ -2976,8 +2989,8 @@ EXPORT_SYMBOL_GPL(__blk_end_request_err); void blk_rq_bio_prep(struct request_queue *q, struct request *rq, struct bio *bio) { - /* Bit 0 (R/W) is identical in rq->cmd_flags and bio->bi_rw */ - rq->cmd_flags |= bio->bi_rw & REQ_WRITE; + /* tmp compat. Allow users to set bi_op or bi_rw */ + rq->cmd_flags |= bio_data_dir(bio); if (bio_has_data(bio)) rq->nr_phys_segments = bio_phys_segments(q, bio); diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index 86a38ea..6e49c91 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -48,9 +48,15 @@ struct bio { struct block_device *bi_bdev; unsigned int bi_flags; /* status, command, etc */ int bi_error; - unsigned long bi_rw; /* bottom bits READ/WRITE, + unsigned long bi_rw; /* bottom bits rq_flags_bits * top bits priority */ + /* + * this will be a u8 in the next patches and bi_rw can be shrunk to + * a u32. For compat in these transistional patches op is a int here. + */ + int bi_op; /* REQ_OP */ + struct bvec_iter bi_iter; @@ -242,6 +248,13 @@ enum rq_flag_bits { #define REQ_HASHED (1ULL << __REQ_HASHED) #define REQ_MQ_INFLIGHT (1ULL << __REQ_MQ_INFLIGHT) +enum req_op { + REQ_OP_READ, + REQ_OP_WRITE = REQ_WRITE, + REQ_OP_DISCARD = REQ_DISCARD, + REQ_OP_WRITE_SAME = REQ_WRITE_SAME, +}; + typedef unsigned int blk_qc_t; #define BLK_QC_T_NONE -1U #define BLK_QC_T_SHIFT 16 diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 57c0859..bce32e2 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -96,6 +96,7 @@ struct request { struct request_queue *q; struct blk_mq_ctx *mq_ctx; + int op; u64 cmd_flags; unsigned cmd_type; unsigned long atomic_flags; diff --git a/include/linux/fs.h b/include/linux/fs.h index 69bdd03..96ace0f 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2452,15 +2452,48 @@ extern void make_bad_inode(struct inode *); extern bool is_bad_inode(struct inode *); #ifdef CONFIG_BLOCK + +static inline bool op_is_write(int op) +{ + switch (op) { + case REQ_OP_WRITE: + case REQ_OP_WRITE_SAME: + case REQ_OP_DISCARD: + return true; + default: + return false; + } +} + /* * return READ, READA, or WRITE */ -#define bio_rw(bio) ((bio)->bi_rw & (RW_MASK | RWA_MASK)) +static inline int bio_rw(struct bio *bio) +{ + /* + * tmp cpmpat. Allow users to set either op or rw, until + * all code is converted in the next patches. + */ + if (op_is_write(bio->bi_op)) + return WRITE; + + return bio->bi_rw & (RW_MASK | RWA_MASK); +} /* * return data direction, READ or WRITE */ -#define bio_data_dir(bio) ((bio)->bi_rw & 1) +static inline int bio_data_dir(struct bio *bio) +{ + /* + * tmp cpmpat. Allow users to set either op or rw, until + * all code is converted in the next patches. + */ + if (op_is_write(bio->bi_op)) + return WRITE; + + return bio->bi_rw & 1; +} extern void check_disk_size_change(struct gendisk *disk, struct block_device *bdev); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:40:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AB4A67CA6 for ; Fri, 15 Apr 2016 05:40:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7E583304048 for ; Fri, 15 Apr 2016 03:40:20 -0700 (PDT) X-ASG-Debug-ID: 1460716817-04cbb02e1b2e9750001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id XSx2HLcUVgFcI7Pt (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:40:18 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C1D98201E9; Fri, 15 Apr 2016 10:40:17 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe31p010243; Fri, 15 Apr 2016 06:40:15 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 05/42] fs: have ll_rw_block users pass in op and flags separately Date: Fri, 15 Apr 2016 05:39:25 -0500 X-ASG-Orig-Subj: [PATCH 05/42] fs: have ll_rw_block users pass in op and flags separately Message-Id: <1460716802-2294-6-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716818 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This has ll_rw_block users pass in the operation and flags separately, so ll_rw_block can setup bio->bi_op and bio-bi_rw on the bio that is submitted. v2: 1. Fix for kbuild error in ll_rw_block comments. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- fs/buffer.c | 19 ++++++++++--------- fs/ext4/inode.c | 6 +++--- fs/ext4/namei.c | 3 ++- fs/ext4/super.c | 2 +- fs/gfs2/bmap.c | 2 +- fs/gfs2/meta_io.c | 4 ++-- fs/gfs2/quota.c | 2 +- fs/isofs/compress.c | 2 +- fs/jbd2/journal.c | 2 +- fs/jbd2/recovery.c | 4 ++-- fs/ocfs2/aops.c | 2 +- fs/ocfs2/super.c | 2 +- fs/reiserfs/journal.c | 8 ++++---- fs/reiserfs/stree.c | 4 ++-- fs/reiserfs/super.c | 2 +- fs/squashfs/block.c | 4 ++-- fs/udf/dir.c | 2 +- fs/udf/directory.c | 2 +- fs/udf/inode.c | 2 +- fs/ufs/balloc.c | 2 +- include/linux/buffer_head.h | 2 +- 21 files changed, 40 insertions(+), 38 deletions(-) diff --git a/fs/buffer.c b/fs/buffer.c index 1e1a474..68c8f27 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -588,7 +588,7 @@ void write_boundary_block(struct block_device *bdev, struct buffer_head *bh = __find_get_block(bdev, bblock + 1, blocksize); if (bh) { if (buffer_dirty(bh)) - ll_rw_block(WRITE, 1, &bh); + ll_rw_block(REQ_OP_WRITE, 0, 1, &bh); put_bh(bh); } } @@ -1395,7 +1395,7 @@ void __breadahead(struct block_device *bdev, sector_t block, unsigned size) { struct buffer_head *bh = __getblk(bdev, block, size); if (likely(bh)) { - ll_rw_block(READA, 1, &bh); + ll_rw_block(REQ_OP_READ, READA, 1, &bh); brelse(bh); } } @@ -1955,7 +1955,7 @@ int __block_write_begin(struct page *page, loff_t pos, unsigned len, if (!buffer_uptodate(bh) && !buffer_delay(bh) && !buffer_unwritten(bh) && (block_start < from || block_end > to)) { - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); *wait_bh++=bh; } } @@ -2852,7 +2852,7 @@ int block_truncate_page(struct address_space *mapping, if (!buffer_uptodate(bh) && !buffer_delay(bh) && !buffer_unwritten(bh)) { err = -EIO; - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); wait_on_buffer(bh); /* Uhhuh. Read error. Complain and punt. */ if (!buffer_uptodate(bh)) @@ -3052,7 +3052,8 @@ EXPORT_SYMBOL(submit_bh); /** * ll_rw_block: low-level access to block devices (DEPRECATED) - * @rw: whether to %READ or %WRITE or maybe %READA (readahead) + * @op: whether to %READ or %WRITE + * @op_flags: rq_flag_bits or %READA (readahead) * @nr: number of &struct buffer_heads in the array * @bhs: array of pointers to &struct buffer_head * @@ -3075,7 +3076,7 @@ EXPORT_SYMBOL(submit_bh); * All of the buffers must be for the same device, and must also be a * multiple of the current approved size for the device. */ -void ll_rw_block(int rw, int nr, struct buffer_head *bhs[]) +void ll_rw_block(int op, int op_flags, int nr, struct buffer_head *bhs[]) { int i; @@ -3084,18 +3085,18 @@ void ll_rw_block(int rw, int nr, struct buffer_head *bhs[]) if (!trylock_buffer(bh)) continue; - if (rw == WRITE) { + if (op == WRITE) { if (test_clear_buffer_dirty(bh)) { bh->b_end_io = end_buffer_write_sync; get_bh(bh); - submit_bh(rw, 0, bh); + submit_bh(op, op_flags, bh); continue; } } else { if (!buffer_uptodate(bh)) { bh->b_end_io = end_buffer_read_sync; get_bh(bh); - submit_bh(rw, 0, bh); + submit_bh(op, op_flags, bh); continue; } } diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index f19220b..320b8f0b 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -963,7 +963,7 @@ struct buffer_head *ext4_bread(handle_t *handle, struct inode *inode, return bh; if (!bh || buffer_uptodate(bh)) return bh; - ll_rw_block(READ | REQ_META | REQ_PRIO, 1, &bh); + ll_rw_block(REQ_OP_READ, REQ_META | REQ_PRIO, 1, &bh); wait_on_buffer(bh); if (buffer_uptodate(bh)) return bh; @@ -1117,7 +1117,7 @@ static int ext4_block_write_begin(struct page *page, loff_t pos, unsigned len, if (!buffer_uptodate(bh) && !buffer_delay(bh) && !buffer_unwritten(bh) && (block_start < from || block_end > to)) { - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); *wait_bh++ = bh; decrypt = ext4_encrypted_inode(inode) && S_ISREG(inode->i_mode); @@ -3603,7 +3603,7 @@ static int __ext4_block_zero_page_range(handle_t *handle, if (!buffer_uptodate(bh)) { err = -EIO; - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); wait_on_buffer(bh); /* Uhhuh. Read error. Complain and punt. */ if (!buffer_uptodate(bh)) diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 48e4b89..a03d2e6 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c @@ -1438,7 +1438,8 @@ restart: } bh_use[ra_max] = bh; if (bh) - ll_rw_block(READ | REQ_META | REQ_PRIO, + ll_rw_block(REQ_OP_READ, + REQ_META | REQ_PRIO, 1, &bh); } } diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 304c712..389adea 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -4207,7 +4207,7 @@ static journal_t *ext4_get_dev_journal(struct super_block *sb, goto out_bdev; } journal->j_private = sb; - ll_rw_block(READ | REQ_META | REQ_PRIO, 1, &journal->j_sb_buffer); + ll_rw_block(REQ_OP_READ, REQ_META | REQ_PRIO, 1, &journal->j_sb_buffer); wait_on_buffer(journal->j_sb_buffer); if (!buffer_uptodate(journal->j_sb_buffer)) { ext4_msg(sb, KERN_ERR, "I/O error on journal device"); diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c index 06d79aa..fd6389c 100644 --- a/fs/gfs2/bmap.c +++ b/fs/gfs2/bmap.c @@ -974,7 +974,7 @@ static int gfs2_block_truncate_page(struct address_space *mapping, loff_t from) if (!buffer_uptodate(bh)) { err = -EIO; - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); wait_on_buffer(bh); /* Uhhuh. Read error. Complain and punt. */ if (!buffer_uptodate(bh)) diff --git a/fs/gfs2/meta_io.c b/fs/gfs2/meta_io.c index 3c63087..f56f3ca 100644 --- a/fs/gfs2/meta_io.c +++ b/fs/gfs2/meta_io.c @@ -448,7 +448,7 @@ struct buffer_head *gfs2_meta_ra(struct gfs2_glock *gl, u64 dblock, u32 extlen) if (buffer_uptodate(first_bh)) goto out; if (!buffer_locked(first_bh)) - ll_rw_block(READ_SYNC | REQ_META, 1, &first_bh); + ll_rw_block(REQ_OP_READ, READ_SYNC | REQ_META, 1, &first_bh); dblock++; extlen--; @@ -457,7 +457,7 @@ struct buffer_head *gfs2_meta_ra(struct gfs2_glock *gl, u64 dblock, u32 extlen) bh = gfs2_getbuf(gl, dblock, CREATE); if (!buffer_uptodate(bh) && !buffer_locked(bh)) - ll_rw_block(READA | REQ_META, 1, &bh); + ll_rw_block(REQ_OP_READ, READA | REQ_META, 1, &bh); brelse(bh); dblock++; extlen--; diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index ce7d69a..62a6823 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c @@ -730,7 +730,7 @@ static int gfs2_write_buf_to_page(struct gfs2_inode *ip, unsigned long index, if (PageUptodate(page)) set_buffer_uptodate(bh); if (!buffer_uptodate(bh)) { - ll_rw_block(READ | REQ_META, 1, &bh); + ll_rw_block(REQ_OP_READ, REQ_META, 1, &bh); wait_on_buffer(bh); if (!buffer_uptodate(bh)) goto unlock_out; diff --git a/fs/isofs/compress.c b/fs/isofs/compress.c index 2e4e834..2ce5b75 100644 --- a/fs/isofs/compress.c +++ b/fs/isofs/compress.c @@ -81,7 +81,7 @@ static loff_t zisofs_uncompress_block(struct inode *inode, loff_t block_start, blocknum = block_start >> bufshift; memset(bhs, 0, (needblocks + 1) * sizeof(struct buffer_head *)); haveblocks = isofs_get_blocks(inode, blocknum, bhs, needblocks); - ll_rw_block(READ, haveblocks, bhs); + ll_rw_block(REQ_OP_READ, 0, haveblocks, bhs); curbh = 0; curpage = 0; diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index 6d7e33a..3675b8e 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c @@ -1497,7 +1497,7 @@ static int journal_get_superblock(journal_t *journal) J_ASSERT(bh != NULL); if (!buffer_uptodate(bh)) { - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); wait_on_buffer(bh); if (!buffer_uptodate(bh)) { printk(KERN_ERR diff --git a/fs/jbd2/recovery.c b/fs/jbd2/recovery.c index 08a456b..6daf0c9 100644 --- a/fs/jbd2/recovery.c +++ b/fs/jbd2/recovery.c @@ -104,7 +104,7 @@ static int do_readahead(journal_t *journal, unsigned int start) if (!buffer_uptodate(bh) && !buffer_locked(bh)) { bufs[nbufs++] = bh; if (nbufs == MAXBUF) { - ll_rw_block(READ, nbufs, bufs); + ll_rw_block(REQ_OP_READ, 0, nbufs, bufs); journal_brelse_array(bufs, nbufs); nbufs = 0; } @@ -113,7 +113,7 @@ static int do_readahead(journal_t *journal, unsigned int start) } if (nbufs) - ll_rw_block(READ, nbufs, bufs); + ll_rw_block(REQ_OP_READ, 0, nbufs, bufs); err = 0; failed: diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index ad15773..8f0c138 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c @@ -640,7 +640,7 @@ int ocfs2_map_page_blocks(struct page *page, u64 *p_blkno, !buffer_new(bh) && ocfs2_should_read_blk(inode, page, block_start) && (block_start < from || block_end > to)) { - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); *wait_bh++=bh; } diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index d7cae33..3971146 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c @@ -1819,7 +1819,7 @@ static int ocfs2_get_sector(struct super_block *sb, if (!buffer_dirty(*bh)) clear_buffer_uptodate(*bh); unlock_buffer(*bh); - ll_rw_block(READ, 1, bh); + ll_rw_block(REQ_OP_READ, 0, 1, bh); wait_on_buffer(*bh); if (!buffer_uptodate(*bh)) { mlog_errno(-EIO); diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c index 6945e71..bc2dde2 100644 --- a/fs/reiserfs/journal.c +++ b/fs/reiserfs/journal.c @@ -870,7 +870,7 @@ loop_next: */ if (buffer_dirty(bh) && unlikely(bh->b_page->mapping == NULL)) { spin_unlock(lock); - ll_rw_block(WRITE, 1, &bh); + ll_rw_block(REQ_OP_WRITE, 0, 1, &bh); spin_lock(lock); } put_bh(bh); @@ -1057,7 +1057,7 @@ static int flush_commit_list(struct super_block *s, if (tbh) { if (buffer_dirty(tbh)) { depth = reiserfs_write_unlock_nested(s); - ll_rw_block(WRITE, 1, &tbh); + ll_rw_block(REQ_OP_WRITE, 0, 1, &tbh); reiserfs_write_lock_nested(s, depth); } put_bh(tbh) ; @@ -2244,7 +2244,7 @@ abort_replay: } } /* read in the log blocks, memcpy to the corresponding real block */ - ll_rw_block(READ, get_desc_trans_len(desc), log_blocks); + ll_rw_block(REQ_OP_READ, 0, get_desc_trans_len(desc), log_blocks); for (i = 0; i < get_desc_trans_len(desc); i++) { wait_on_buffer(log_blocks[i]); @@ -2346,7 +2346,7 @@ static struct buffer_head *reiserfs_breada(struct block_device *dev, } else bhlist[j++] = bh; } - ll_rw_block(READ, j, bhlist); + ll_rw_block(REQ_OP_READ, 0, j, bhlist); for (i = 1; i < j; i++) brelse(bhlist[i]); bh = bhlist[0]; diff --git a/fs/reiserfs/stree.c b/fs/reiserfs/stree.c index 5feacd6..64b29b5 100644 --- a/fs/reiserfs/stree.c +++ b/fs/reiserfs/stree.c @@ -551,7 +551,7 @@ static int search_by_key_reada(struct super_block *s, if (!buffer_uptodate(bh[j])) { if (depth == -1) depth = reiserfs_write_unlock_nested(s); - ll_rw_block(READA, 1, bh + j); + ll_rw_block(REQ_OP_READ, READA, 1, bh + j); } brelse(bh[j]); } @@ -660,7 +660,7 @@ int search_by_key(struct super_block *sb, const struct cpu_key *key, if (!buffer_uptodate(bh) && depth == -1) depth = reiserfs_write_unlock_nested(sb); - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); wait_on_buffer(bh); if (depth != -1) diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index b8f2d1e..9938a51 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c @@ -1661,7 +1661,7 @@ static int read_super_block(struct super_block *s, int offset) /* after journal replay, reread all bitmap and super blocks */ static int reread_meta_blocks(struct super_block *s) { - ll_rw_block(READ, 1, &SB_BUFFER_WITH_SB(s)); + ll_rw_block(REQ_OP_READ, 0, 1, &SB_BUFFER_WITH_SB(s)); wait_on_buffer(SB_BUFFER_WITH_SB(s)); if (!buffer_uptodate(SB_BUFFER_WITH_SB(s))) { reiserfs_warning(s, "reiserfs-2504", "error reading the super"); diff --git a/fs/squashfs/block.c b/fs/squashfs/block.c index 2c26184..ce62a38 100644 --- a/fs/squashfs/block.c +++ b/fs/squashfs/block.c @@ -124,7 +124,7 @@ int squashfs_read_data(struct super_block *sb, u64 index, int length, goto block_release; bytes += msblk->devblksize; } - ll_rw_block(READ, b, bh); + ll_rw_block(REQ_OP_READ, 0, b, bh); } else { /* * Metadata block. @@ -156,7 +156,7 @@ int squashfs_read_data(struct super_block *sb, u64 index, int length, goto block_release; bytes += msblk->devblksize; } - ll_rw_block(READ, b - 1, bh + 1); + ll_rw_block(REQ_OP_READ, 0, b - 1, bh + 1); } for (i = 0; i < b; i++) { diff --git a/fs/udf/dir.c b/fs/udf/dir.c index b51b371..cfadce0 100644 --- a/fs/udf/dir.c +++ b/fs/udf/dir.c @@ -113,7 +113,7 @@ static int udf_readdir(struct file *file, struct dir_context *ctx) brelse(tmp); } if (num) { - ll_rw_block(READA, num, bha); + ll_rw_block(REQ_OP_READ, READA, num, bha); for (i = 0; i < num; i++) brelse(bha[i]); } diff --git a/fs/udf/directory.c b/fs/udf/directory.c index c763fda..71f3e0b 100644 --- a/fs/udf/directory.c +++ b/fs/udf/directory.c @@ -87,7 +87,7 @@ struct fileIdentDesc *udf_fileident_read(struct inode *dir, loff_t *nf_pos, brelse(tmp); } if (num) { - ll_rw_block(READA, num, bha); + ll_rw_block(REQ_OP_READ, READA, num, bha); for (i = 0; i < num; i++) brelse(bha[i]); } diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 2dc461e..a401bdbe 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c @@ -1200,7 +1200,7 @@ struct buffer_head *udf_bread(struct inode *inode, int block, if (buffer_uptodate(bh)) return bh; - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); wait_on_buffer(bh); if (buffer_uptodate(bh)) diff --git a/fs/ufs/balloc.c b/fs/ufs/balloc.c index 0447b94..67e085d 100644 --- a/fs/ufs/balloc.c +++ b/fs/ufs/balloc.c @@ -292,7 +292,7 @@ static void ufs_change_blocknr(struct inode *inode, sector_t beg, if (!buffer_mapped(bh)) map_bh(bh, inode->i_sb, oldb + pos); if (!buffer_uptodate(bh)) { - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); wait_on_buffer(bh); if (!buffer_uptodate(bh)) { ufs_error(inode->i_sb, __func__, diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index bc9a45d..d1dd293 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h @@ -187,7 +187,7 @@ struct buffer_head *alloc_buffer_head(gfp_t gfp_flags); void free_buffer_head(struct buffer_head * bh); void unlock_buffer(struct buffer_head *bh); void __lock_buffer(struct buffer_head *bh); -void ll_rw_block(int, int, struct buffer_head * bh[]); +void ll_rw_block(int, int, int, struct buffer_head * bh[]); int sync_dirty_buffer(struct buffer_head *bh); int __sync_dirty_buffer(struct buffer_head *bh, int op_flags); void write_dirty_buffer(struct buffer_head *bh, int op_flags); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:40:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1A6097CA6 for ; Fri, 15 Apr 2016 05:40:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E2DEA8F8049 for ; Fri, 15 Apr 2016 03:40:21 -0700 (PDT) X-ASG-Debug-ID: 1460716820-04cb6c245f614e60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id WMaOP9t0Hu2USEPx (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:40:20 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0C7F42027F; Fri, 15 Apr 2016 10:40:20 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe31q010243; Fri, 15 Apr 2016 06:40:17 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 06/42] direct-io: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 05:39:26 -0500 X-ASG-Orig-Subj: [PATCH 06/42] direct-io: set bi_op to REQ_OP Message-Id: <1460716802-2294-7-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716820 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has the dio code set the bio bi_op to a REQ_OP and bio op_flags to rq_flag_bits. It also begins to convert btrfs's dio_submit_t because of the dio submit_io callout use. In the btrfs_submit_direct change, I OR'd the op and flag back together. It is only temporary. The next patched will completely convert all the btrfs code paths. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- fs/btrfs/inode.c | 9 +++++---- fs/direct-io.c | 35 +++++++++++++++++++++-------------- include/linux/fs.h | 2 +- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 9cc2256..d999fdf 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -8401,14 +8401,14 @@ out_err: return 0; } -static void btrfs_submit_direct(int rw, struct bio *dio_bio, - struct inode *inode, loff_t file_offset) +static void btrfs_submit_direct(struct bio *dio_bio, struct inode *inode, + loff_t file_offset) { struct btrfs_dio_private *dip = NULL; struct bio *io_bio = NULL; struct btrfs_io_bio *btrfs_bio; int skip_sum; - int write = rw & REQ_WRITE; + bool write = (dio_bio->bi_op == REQ_OP_WRITE); int ret = 0; skip_sum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM; @@ -8459,7 +8459,8 @@ static void btrfs_submit_direct(int rw, struct bio *dio_bio, dio_data->unsubmitted_oe_range_end; } - ret = btrfs_submit_direct_hook(rw, dip, skip_sum); + ret = btrfs_submit_direct_hook(dio_bio->bi_op | dio_bio->bi_rw, dip, + skip_sum); if (!ret) return; diff --git a/fs/direct-io.c b/fs/direct-io.c index 1890ad2..64bfab0 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -108,7 +108,8 @@ struct dio_submit { /* dio_state communicated between submission path and end_io */ struct dio { int flags; /* doesn't change */ - int rw; + int op; + int op_flags; blk_qc_t bio_cookie; struct block_device *bio_bdev; struct inode *inode; @@ -163,7 +164,7 @@ static inline int dio_refill_pages(struct dio *dio, struct dio_submit *sdio) ret = iov_iter_get_pages(sdio->iter, dio->pages, LONG_MAX, DIO_PAGES, &sdio->from); - if (ret < 0 && sdio->blocks_available && (dio->rw & WRITE)) { + if (ret < 0 && sdio->blocks_available && (dio->op == REQ_OP_WRITE)) { struct page *page = ZERO_PAGE(0); /* * A memory fault, but the filesystem has some outstanding @@ -242,7 +243,8 @@ static ssize_t dio_complete(struct dio *dio, loff_t offset, ssize_t ret, transferred = dio->result; /* Check for short read case */ - if ((dio->rw == READ) && ((offset + transferred) > dio->i_size)) + if ((dio->op == REQ_OP_READ) && + ((offset + transferred) > dio->i_size)) transferred = dio->i_size - offset; } @@ -265,7 +267,7 @@ static ssize_t dio_complete(struct dio *dio, loff_t offset, ssize_t ret, inode_dio_end(dio->inode); if (is_async) { - if (dio->rw & WRITE) { + if (dio->op == REQ_OP_WRITE) { int err; err = generic_write_sync(dio->iocb->ki_filp, offset, @@ -374,7 +376,8 @@ dio_bio_alloc(struct dio *dio, struct dio_submit *sdio, bio->bi_bdev = bdev; bio->bi_iter.bi_sector = first_sector; - bio->bi_rw = dio->rw; + bio->bi_op = dio->op; + bio->bi_rw = dio->op_flags; if (dio->is_async) bio->bi_end_io = dio_bio_end_aio; else @@ -402,14 +405,13 @@ static inline void dio_bio_submit(struct dio *dio, struct dio_submit *sdio) dio->refcount++; spin_unlock_irqrestore(&dio->bio_lock, flags); - if (dio->is_async && dio->rw == READ && dio->should_dirty) + if (dio->is_async && dio->op == REQ_OP_READ && dio->should_dirty) bio_set_pages_dirty(bio); dio->bio_bdev = bio->bi_bdev; if (sdio->submit_io) { - sdio->submit_io(dio->rw, bio, dio->inode, - sdio->logical_offset_in_bio); + sdio->submit_io(bio, dio->inode, sdio->logical_offset_in_bio); dio->bio_cookie = BLK_QC_T_NONE; } else dio->bio_cookie = submit_bio(bio); @@ -478,14 +480,14 @@ static int dio_bio_complete(struct dio *dio, struct bio *bio) if (bio->bi_error) dio->io_error = -EIO; - if (dio->is_async && dio->rw == READ && dio->should_dirty) { + if (dio->is_async && dio->op == REQ_OP_READ && dio->should_dirty) { err = bio->bi_error; bio_check_pages_dirty(bio); /* transfers ownership */ } else { bio_for_each_segment_all(bvec, bio, i) { struct page *page = bvec->bv_page; - if (dio->rw == READ && !PageCompound(page) && + if (dio->op == REQ_OP_READ && !PageCompound(page) && dio->should_dirty) set_page_dirty_lock(page); put_page(page); @@ -638,7 +640,7 @@ static int get_more_blocks(struct dio *dio, struct dio_submit *sdio, * which may decide to handle it or also return an unmapped * buffer head. */ - create = dio->rw & WRITE; + create = dio->op == REQ_OP_WRITE; if (dio->flags & DIO_SKIP_HOLES) { if (sdio->block_in_file < (i_size_read(dio->inode) >> sdio->blkbits)) @@ -788,7 +790,7 @@ submit_page_section(struct dio *dio, struct dio_submit *sdio, struct page *page, { int ret = 0; - if (dio->rw & WRITE) { + if (dio->op == REQ_OP_WRITE) { /* * Read accounting is performed in submit_bio() */ @@ -988,7 +990,7 @@ do_holes: loff_t i_size_aligned; /* AKPM: eargh, -ENOTBLK is a hack */ - if (dio->rw & WRITE) { + if (dio->op == REQ_OP_WRITE) { put_page(page); return -ENOTBLK; } @@ -1201,7 +1203,12 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, dio->is_async = true; dio->inode = inode; - dio->rw = iov_iter_rw(iter) == WRITE ? WRITE_ODIRECT : READ; + if (iov_iter_rw(iter) == WRITE) { + dio->op = REQ_OP_WRITE; + dio->op_flags = WRITE_ODIRECT; + } else { + dio->op = REQ_OP_READ; + } /* * For AIO O_(D)SYNC writes we need to defer completions to a workqueue diff --git a/include/linux/fs.h b/include/linux/fs.h index 96ace0f..f3f2f66 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2792,7 +2792,7 @@ extern int generic_file_open(struct inode * inode, struct file * filp); extern int nonseekable_open(struct inode * inode, struct file * filp); #ifdef CONFIG_BLOCK -typedef void (dio_submit_t)(int rw, struct bio *bio, struct inode *inode, +typedef void (dio_submit_t)(struct bio *bio, struct inode *inode, loff_t file_offset); enum { -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:40:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B84897CB3 for ; Fri, 15 Apr 2016 05:40:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 818E9AC004 for ; Fri, 15 Apr 2016 03:40:15 -0700 (PDT) X-ASG-Debug-ID: 1460716808-04cbb02e1b2e9730001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id LWv8SYAKWDtCTOuM (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:40:09 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AE7A0C01AA27; Fri, 15 Apr 2016 10:40:08 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe31l010243; Fri, 15 Apr 2016 06:40:06 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 01/42] block/fs/drivers: remove rw argument from submit_bio Date: Fri, 15 Apr 2016 05:39:21 -0500 X-ASG-Orig-Subj: [PATCH 01/42] block/fs/drivers: remove rw argument from submit_bio Message-Id: <1460716802-2294-2-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716809 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This has callers of submit_bio/submit_bio_wait set the bio->bi_rw instead of passing it in. This makes that use the same as generic_make_request and how we set the other bio fields. v5: 1. Missed crypto fs submit_bio_wait call. v2: 1. Set bi_rw instead of ORing it. For cloned bios, I still OR it to keep the old behavior incase there bits we wanted to keep. Signed-off-by: Mike Christie Reviewed-by: Bart Van Assche Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- block/bio.c | 7 +++---- block/blk-core.c | 11 ++++------- block/blk-flush.c | 3 ++- block/blk-lib.c | 9 ++++++--- drivers/block/drbd/drbd_actlog.c | 2 +- drivers/block/drbd/drbd_bitmap.c | 4 ++-- drivers/block/floppy.c | 3 ++- drivers/block/xen-blkback/blkback.c | 4 +++- drivers/block/xen-blkfront.c | 4 ++-- drivers/md/bcache/debug.c | 6 ++++-- drivers/md/bcache/journal.c | 2 +- drivers/md/bcache/super.c | 4 ++-- drivers/md/dm-bufio.c | 3 ++- drivers/md/dm-io.c | 3 ++- drivers/md/dm-log-writes.c | 9 ++++++--- drivers/md/dm-thin.c | 3 ++- drivers/md/md.c | 10 +++++++--- drivers/md/raid1.c | 3 ++- drivers/md/raid10.c | 4 +++- drivers/md/raid5-cache.c | 7 ++++--- drivers/target/target_core_iblock.c | 24 +++++++++++++----------- fs/btrfs/check-integrity.c | 18 ++++++++++-------- fs/btrfs/check-integrity.h | 4 ++-- fs/btrfs/disk-io.c | 3 ++- fs/btrfs/extent_io.c | 7 ++++--- fs/btrfs/raid56.c | 17 ++++++++++++----- fs/btrfs/scrub.c | 15 ++++++++++----- fs/btrfs/volumes.c | 14 +++++++------- fs/buffer.c | 3 ++- fs/crypto/crypto.c | 3 ++- fs/direct-io.c | 3 ++- fs/ext4/crypto.c | 3 ++- fs/ext4/page-io.c | 3 ++- fs/ext4/readpage.c | 9 +++++---- fs/f2fs/data.c | 13 ++++++++----- fs/f2fs/segment.c | 6 ++++-- fs/gfs2/lops.c | 3 ++- fs/gfs2/meta_io.c | 3 ++- fs/gfs2/ops_fstype.c | 3 ++- fs/hfsplus/wrapper.c | 3 ++- fs/jfs/jfs_logmgr.c | 6 ++++-- fs/jfs/jfs_metapage.c | 10 ++++++---- fs/logfs/dev_bdev.c | 15 ++++++++++----- fs/mpage.c | 3 ++- fs/nfs/blocklayout/blocklayout.c | 22 ++++++++++++---------- fs/nilfs2/segbuf.c | 3 ++- fs/ocfs2/cluster/heartbeat.c | 12 +++++++----- fs/xfs/xfs_aops.c | 15 ++++++++++----- fs/xfs/xfs_buf.c | 4 ++-- include/linux/bio.h | 2 +- include/linux/fs.h | 2 +- kernel/power/swap.c | 5 +++-- mm/page_io.c | 10 ++++++---- 53 files changed, 221 insertions(+), 146 deletions(-) diff --git a/block/bio.c b/block/bio.c index 807d25e..f319b78 100644 --- a/block/bio.c +++ b/block/bio.c @@ -865,21 +865,20 @@ static void submit_bio_wait_endio(struct bio *bio) /** * submit_bio_wait - submit a bio, and wait until it completes - * @rw: whether to %READ or %WRITE, or maybe to %READA (read ahead) * @bio: The &struct bio which describes the I/O * * Simple wrapper around submit_bio(). Returns 0 on success, or the error from * bio_endio() on failure. */ -int submit_bio_wait(int rw, struct bio *bio) +int submit_bio_wait(struct bio *bio) { struct submit_bio_ret ret; - rw |= REQ_SYNC; init_completion(&ret.event); bio->bi_private = &ret; bio->bi_end_io = submit_bio_wait_endio; - submit_bio(rw, bio); + bio->bi_rw |= REQ_SYNC; + submit_bio(bio); wait_for_completion_io(&ret.event); return ret.error; diff --git a/block/blk-core.c b/block/blk-core.c index 2475b1c7..e953407 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -2094,7 +2094,6 @@ EXPORT_SYMBOL(generic_make_request); /** * submit_bio - submit a bio to the block device layer for I/O - * @rw: whether to %READ or %WRITE, or maybe to %READA (read ahead) * @bio: The &struct bio which describes the I/O * * submit_bio() is very similar in purpose to generic_make_request(), and @@ -2102,10 +2101,8 @@ EXPORT_SYMBOL(generic_make_request); * interfaces; @bio must be presetup and ready for I/O. * */ -blk_qc_t submit_bio(int rw, struct bio *bio) +blk_qc_t submit_bio(struct bio *bio) { - bio->bi_rw |= rw; - /* * If it's a regular read/write or a barrier with data attached, * go through the normal accounting stuff before submission. @@ -2113,12 +2110,12 @@ blk_qc_t submit_bio(int rw, struct bio *bio) if (bio_has_data(bio)) { unsigned int count; - if (unlikely(rw & REQ_WRITE_SAME)) + if (unlikely(bio->bi_rw & REQ_WRITE_SAME)) count = bdev_logical_block_size(bio->bi_bdev) >> 9; else count = bio_sectors(bio); - if (rw & WRITE) { + if (bio->bi_rw & WRITE) { count_vm_events(PGPGOUT, count); } else { task_io_account_read(bio->bi_iter.bi_size); @@ -2129,7 +2126,7 @@ blk_qc_t submit_bio(int rw, struct bio *bio) char b[BDEVNAME_SIZE]; printk(KERN_DEBUG "%s(%d): %s block %Lu on %s (%u sectors)\n", current->comm, task_pid_nr(current), - (rw & WRITE) ? "WRITE" : "READ", + (bio->bi_rw & WRITE) ? "WRITE" : "READ", (unsigned long long)bio->bi_iter.bi_sector, bdevname(bio->bi_bdev, b), count); diff --git a/block/blk-flush.c b/block/blk-flush.c index b1c91d2..3af4a5a 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c @@ -485,8 +485,9 @@ int blkdev_issue_flush(struct block_device *bdev, gfp_t gfp_mask, bio = bio_alloc(gfp_mask, 0); bio->bi_bdev = bdev; + bio->bi_rw = WRITE_FLUSH; - ret = submit_bio_wait(WRITE_FLUSH, bio); + ret = submit_bio_wait(bio); /* * The driver must store the error location in ->bi_sector, if diff --git a/block/blk-lib.c b/block/blk-lib.c index 9ebf653..87e3de4 100644 --- a/block/blk-lib.c +++ b/block/blk-lib.c @@ -102,13 +102,14 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, bio->bi_end_io = bio_batch_end_io; bio->bi_bdev = bdev; bio->bi_private = &bb; + bio->bi_rw = type; bio->bi_iter.bi_size = req_sects << 9; nr_sects -= req_sects; sector = end_sect; atomic_inc(&bb.done); - submit_bio(type, bio); + submit_bio(bio); /* * We can loop for a long time in here, if someone does @@ -177,6 +178,7 @@ int blkdev_issue_write_same(struct block_device *bdev, sector_t sector, bio->bi_io_vec->bv_page = page; bio->bi_io_vec->bv_offset = 0; bio->bi_io_vec->bv_len = bdev_logical_block_size(bdev); + bio->bi_rw = REQ_WRITE | REQ_WRITE_SAME; if (nr_sects > max_write_same_sectors) { bio->bi_iter.bi_size = max_write_same_sectors << 9; @@ -188,7 +190,7 @@ int blkdev_issue_write_same(struct block_device *bdev, sector_t sector, } atomic_inc(&bb.done); - submit_bio(REQ_WRITE | REQ_WRITE_SAME, bio); + submit_bio(bio); } /* Wait for bios in-flight */ @@ -238,6 +240,7 @@ static int __blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, bio->bi_bdev = bdev; bio->bi_end_io = bio_batch_end_io; bio->bi_private = &bb; + bio->bi_rw = WRITE; while (nr_sects != 0) { sz = min((sector_t) PAGE_SIZE >> 9 , nr_sects); @@ -249,7 +252,7 @@ static int __blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, } ret = 0; atomic_inc(&bb.done); - submit_bio(WRITE, bio); + submit_bio(bio); } /* Wait for bios in-flight */ diff --git a/drivers/block/drbd/drbd_actlog.c b/drivers/block/drbd/drbd_actlog.c index 10459a1..6069e15 100644 --- a/drivers/block/drbd/drbd_actlog.c +++ b/drivers/block/drbd/drbd_actlog.c @@ -177,7 +177,7 @@ static int _drbd_md_sync_page_io(struct drbd_device *device, if (drbd_insert_fault(device, (rw & WRITE) ? DRBD_FAULT_MD_WR : DRBD_FAULT_MD_RD)) bio_io_error(bio); else - submit_bio(rw, bio); + submit_bio(bio); wait_until_done_or_force_detached(device, bdev, &device->md_io.done); if (!bio->bi_error) err = device->md_io.error; diff --git a/drivers/block/drbd/drbd_bitmap.c b/drivers/block/drbd/drbd_bitmap.c index 92d6fc0..e8959fe 100644 --- a/drivers/block/drbd/drbd_bitmap.c +++ b/drivers/block/drbd/drbd_bitmap.c @@ -1011,12 +1011,12 @@ static void bm_page_io_async(struct drbd_bm_aio_ctx *ctx, int page_nr) __must_ho bio_add_page(bio, page, len, 0); bio->bi_private = ctx; bio->bi_end_io = drbd_bm_endio; + bio->bi_rw = rw; if (drbd_insert_fault(device, (rw & WRITE) ? DRBD_FAULT_MD_WR : DRBD_FAULT_MD_RD)) { - bio->bi_rw |= rw; bio_io_error(bio); } else { - submit_bio(rw, bio); + submit_bio(bio); /* this should not count as user activity and cause the * resync to throttle -- see drbd_rs_should_slow_down(). */ atomic_add(len >> 9, &device->rs_sect_ev); diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 84708a5..73ded25 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c @@ -3822,8 +3822,9 @@ static int __floppy_read_block_0(struct block_device *bdev, int drive) bio.bi_flags |= (1 << BIO_QUIET); bio.bi_private = &cbdata; bio.bi_end_io = floppy_rb0_cb; + bio.bi_rw = READ; - submit_bio(READ, &bio); + submit_bio(&bio); process_fd_request(); init_completion(&cbdata.complete); diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c index 4809c150..79fe493 100644 --- a/drivers/block/xen-blkback/blkback.c +++ b/drivers/block/xen-blkback/blkback.c @@ -1369,6 +1369,7 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, bio->bi_private = pending_req; bio->bi_end_io = end_block_io_op; bio->bi_iter.bi_sector = preq.sector_number; + bio->bi_rw = operation; } preq.sector_number += seg[i].nsec; @@ -1386,13 +1387,14 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, bio->bi_bdev = preq.bdev; bio->bi_private = pending_req; bio->bi_end_io = end_block_io_op; + bio->bi_rw = operation; } atomic_set(&pending_req->pendcnt, nbio); blk_start_plug(&plug); for (i = 0; i < nbio; i++) - submit_bio(operation, biolist[i]); + submit_bio(biolist[i]); /* Let the I/Os go.. */ blk_finish_plug(&plug); diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index ca13df8..52963a2 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c @@ -2114,7 +2114,7 @@ static int blkif_recover(struct blkfront_info *info) bio_trim(cloned_bio, offset, size); cloned_bio->bi_private = split_bio; cloned_bio->bi_end_io = split_bio_end; - submit_bio(cloned_bio->bi_rw, cloned_bio); + submit_bio(cloned_bio); } /* * Now we have to wait for all those smaller bios to @@ -2123,7 +2123,7 @@ static int blkif_recover(struct blkfront_info *info) continue; } /* We don't need to split this bio */ - submit_bio(bio->bi_rw, bio); + submit_bio(bio); } return 0; diff --git a/drivers/md/bcache/debug.c b/drivers/md/bcache/debug.c index 8b1f1d5..52b6bcf 100644 --- a/drivers/md/bcache/debug.c +++ b/drivers/md/bcache/debug.c @@ -52,9 +52,10 @@ void bch_btree_verify(struct btree *b) bio->bi_bdev = PTR_CACHE(b->c, &b->key, 0)->bdev; bio->bi_iter.bi_sector = PTR_OFFSET(&b->key, 0); bio->bi_iter.bi_size = KEY_SIZE(&v->key) << 9; + bio->bi_rw = REQ_META|READ_SYNC; bch_bio_map(bio, sorted); - submit_bio_wait(REQ_META|READ_SYNC, bio); + submit_bio_wait(bio); bch_bbio_free(bio, b->c); memcpy(ondisk, sorted, KEY_SIZE(&v->key) << 9); @@ -113,11 +114,12 @@ void bch_data_verify(struct cached_dev *dc, struct bio *bio) check = bio_clone(bio, GFP_NOIO); if (!check) return; + check->bi_rw |= READ_SYNC; if (bio_alloc_pages(check, GFP_NOIO)) goto out_put; - submit_bio_wait(READ_SYNC, check); + submit_bio_wait(check); bio_for_each_segment(bv, bio, iter) { void *p1 = kmap_atomic(bv.bv_page); diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c index 29eba72..af3f9f7 100644 --- a/drivers/md/bcache/journal.c +++ b/drivers/md/bcache/journal.c @@ -418,7 +418,7 @@ static void journal_discard_work(struct work_struct *work) struct journal_device *ja = container_of(work, struct journal_device, discard_work); - submit_bio(0, &ja->discard_bio); + submit_bio(&ja->discard_bio); } static void do_journal_discard(struct cache *ca) diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index f5dbb4e..1eb526a7 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c @@ -212,7 +212,7 @@ static void __write_super(struct cache_sb *sb, struct bio *bio) unsigned i; bio->bi_iter.bi_sector = SB_SECTOR; - bio->bi_rw = REQ_SYNC|REQ_META; + bio->bi_rw = REQ_WRITE|REQ_SYNC|REQ_META; bio->bi_iter.bi_size = SB_SIZE; bch_bio_map(bio, NULL); @@ -238,7 +238,7 @@ static void __write_super(struct cache_sb *sb, struct bio *bio) pr_debug("ver %llu, flags %llu, seq %llu", sb->version, sb->flags, sb->seq); - submit_bio(REQ_WRITE, bio); + submit_bio(bio); } static void bch_write_bdev_super_unlock(struct closure *cl) diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c index cd77216..9d3ee7f 100644 --- a/drivers/md/dm-bufio.c +++ b/drivers/md/dm-bufio.c @@ -634,6 +634,7 @@ static void use_inline_bio(struct dm_buffer *b, int rw, sector_t block, * the dm_buffer's inline bio is local to bufio. */ b->bio.bi_private = end_io; + b->bio.bi_rw = rw; /* * We assume that if len >= PAGE_SIZE ptr is page-aligned. @@ -660,7 +661,7 @@ static void use_inline_bio(struct dm_buffer *b, int rw, sector_t block, ptr += PAGE_SIZE; } while (len > 0); - submit_bio(rw, &b->bio); + submit_bio(&b->bio); } static void submit_io(struct dm_buffer *b, int rw, sector_t block, diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c index 06d426e..50f17e3 100644 --- a/drivers/md/dm-io.c +++ b/drivers/md/dm-io.c @@ -322,6 +322,7 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, bio->bi_iter.bi_sector = where->sector + (where->count - remaining); bio->bi_bdev = where->bdev; bio->bi_end_io = endio; + bio->bi_rw = rw; store_io_and_region_in_bio(bio, io, region); if (rw & REQ_DISCARD) { @@ -355,7 +356,7 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, } atomic_inc(&io->count); - submit_bio(rw, bio); + submit_bio(bio); } while (remaining); } diff --git a/drivers/md/dm-log-writes.c b/drivers/md/dm-log-writes.c index 608302e..addcc4b 100644 --- a/drivers/md/dm-log-writes.c +++ b/drivers/md/dm-log-writes.c @@ -205,6 +205,7 @@ static int write_metadata(struct log_writes_c *lc, void *entry, bio->bi_bdev = lc->logdev->bdev; bio->bi_end_io = log_end_io; bio->bi_private = lc; + bio->bi_rw = WRITE; page = alloc_page(GFP_KERNEL); if (!page) { @@ -226,7 +227,7 @@ static int write_metadata(struct log_writes_c *lc, void *entry, DMERR("Couldn't add page to the log block"); goto error_bio; } - submit_bio(WRITE, bio); + submit_bio(bio); return 0; error_bio: bio_put(bio); @@ -269,6 +270,7 @@ static int log_one_block(struct log_writes_c *lc, bio->bi_bdev = lc->logdev->bdev; bio->bi_end_io = log_end_io; bio->bi_private = lc; + bio->bi_rw = WRITE; for (i = 0; i < block->vec_cnt; i++) { /* @@ -279,7 +281,7 @@ static int log_one_block(struct log_writes_c *lc, block->vecs[i].bv_len, 0); if (ret != block->vecs[i].bv_len) { atomic_inc(&lc->io_blocks); - submit_bio(WRITE, bio); + submit_bio(bio); bio = bio_alloc(GFP_KERNEL, block->vec_cnt - i); if (!bio) { DMERR("Couldn't alloc log bio"); @@ -290,6 +292,7 @@ static int log_one_block(struct log_writes_c *lc, bio->bi_bdev = lc->logdev->bdev; bio->bi_end_io = log_end_io; bio->bi_private = lc; + bio->bi_rw = WRITE; ret = bio_add_page(bio, block->vecs[i].bv_page, block->vecs[i].bv_len, 0); @@ -301,7 +304,7 @@ static int log_one_block(struct log_writes_c *lc, } sector += block->vecs[i].bv_len >> SECTOR_SHIFT; } - submit_bio(WRITE, bio); + submit_bio(bio); out: kfree(block->data); kfree(block); diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index 04e7f3b..69d86e1 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c @@ -366,8 +366,9 @@ static int __blkdev_issue_discard_async(struct block_device *bdev, sector_t sect bio->bi_iter.bi_sector = sector; bio->bi_bdev = bdev; bio->bi_iter.bi_size = nr_sects << 9; + bio->bi_rw = type; - submit_bio(type, bio); + submit_bio(bio); return 0; } diff --git a/drivers/md/md.c b/drivers/md/md.c index 5d61e76..ec3c98d 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -392,8 +392,9 @@ static void submit_flushes(struct work_struct *ws) bi->bi_end_io = md_end_flush; bi->bi_private = rdev; bi->bi_bdev = rdev->bdev; + bi->bi_rw = WRITE_FLUSH; atomic_inc(&mddev->flush_pending); - submit_bio(WRITE_FLUSH, bi); + submit_bio(bi); rcu_read_lock(); rdev_dec_pending(rdev, mddev); } @@ -740,9 +741,10 @@ void md_super_write(struct mddev *mddev, struct md_rdev *rdev, bio_add_page(bio, page, size, 0); bio->bi_private = rdev; bio->bi_end_io = super_written; + bio->bi_rw = WRITE_FLUSH_FUA; atomic_inc(&mddev->pending_writes); - submit_bio(WRITE_FLUSH_FUA, bio); + submit_bio(bio); } void md_super_wait(struct mddev *mddev) @@ -759,6 +761,7 @@ int sync_page_io(struct md_rdev *rdev, sector_t sector, int size, bio->bi_bdev = (metadata_op && rdev->meta_bdev) ? rdev->meta_bdev : rdev->bdev; + bio->bi_rw = rw; if (metadata_op) bio->bi_iter.bi_sector = sector + rdev->sb_start; else if (rdev->mddev->reshape_position != MaxSector && @@ -768,7 +771,8 @@ int sync_page_io(struct md_rdev *rdev, sector_t sector, int size, else bio->bi_iter.bi_sector = sector + rdev->data_offset; bio_add_page(bio, page, size, 0); - submit_bio_wait(rw, bio); + + submit_bio_wait(bio); ret = !bio->bi_error; bio_put(bio); diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index a7f2b9c..424df7e 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -2208,7 +2208,8 @@ static int narrow_write_error(struct r1bio *r1_bio, int i) bio_trim(wbio, sector - r1_bio->sector, sectors); wbio->bi_iter.bi_sector += rdev->data_offset; wbio->bi_bdev = rdev->bdev; - if (submit_bio_wait(WRITE, wbio) < 0) + + if (submit_bio_wait(wbio) < 0) /* failure! */ ok = rdev_set_badblocks(rdev, sector, sectors, 0) diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index e3fd725..4736be8 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -2474,7 +2474,9 @@ static int narrow_write_error(struct r10bio *r10_bio, int i) choose_data_offset(r10_bio, rdev) + (sector - r10_bio->sector)); wbio->bi_bdev = rdev->bdev; - if (submit_bio_wait(WRITE, wbio) < 0) + wbio->bi_rw = WRITE; + + if (submit_bio_wait(wbio) < 0) /* Failure! */ ok = rdev_set_badblocks(rdev, sector, sectors, 0) diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c index 26f1497..90c2618 100644 --- a/drivers/md/raid5-cache.c +++ b/drivers/md/raid5-cache.c @@ -254,7 +254,7 @@ static void r5l_submit_current_io(struct r5l_log *log) __r5l_set_io_unit_state(io, IO_UNIT_IO_START); spin_unlock_irqrestore(&log->io_list_lock, flags); - submit_bio(WRITE, io->current_bio); + submit_bio(io->current_bio); } static struct bio *r5l_bio_alloc(struct r5l_log *log) @@ -373,7 +373,7 @@ static void r5l_append_payload_page(struct r5l_log *log, struct page *page) io->current_bio = r5l_bio_alloc(log); bio_chain(io->current_bio, prev); - submit_bio(WRITE, prev); + submit_bio(prev); } if (!bio_add_page(io->current_bio, page, PAGE_SIZE, 0)) @@ -686,7 +686,8 @@ void r5l_flush_stripe_to_raid(struct r5l_log *log) bio_reset(&log->flush_bio); log->flush_bio.bi_bdev = log->rdev->bdev; log->flush_bio.bi_end_io = r5l_log_flush_endio; - submit_bio(WRITE_FLUSH, &log->flush_bio); + log->flush_bio.bi_rw = WRITE_FLUSH; + submit_bio(&log->flush_bio); } static void r5l_write_super(struct r5l_log *log, sector_t cp); diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c index 7c4efb4..c25109c 100644 --- a/drivers/target/target_core_iblock.c +++ b/drivers/target/target_core_iblock.c @@ -312,7 +312,7 @@ static void iblock_bio_done(struct bio *bio) } static struct bio * -iblock_get_bio(struct se_cmd *cmd, sector_t lba, u32 sg_num) +iblock_get_bio(struct se_cmd *cmd, sector_t lba, u32 sg_num, int rw) { struct iblock_dev *ib_dev = IBLOCK_DEV(cmd->se_dev); struct bio *bio; @@ -334,18 +334,19 @@ iblock_get_bio(struct se_cmd *cmd, sector_t lba, u32 sg_num) bio->bi_private = cmd; bio->bi_end_io = &iblock_bio_done; bio->bi_iter.bi_sector = lba; + bio->bi_rw = rw; return bio; } -static void iblock_submit_bios(struct bio_list *list, int rw) +static void iblock_submit_bios(struct bio_list *list) { struct blk_plug plug; struct bio *bio; blk_start_plug(&plug); while ((bio = bio_list_pop(list))) - submit_bio(rw, bio); + submit_bio(bio); blk_finish_plug(&plug); } @@ -387,9 +388,10 @@ iblock_execute_sync_cache(struct se_cmd *cmd) bio = bio_alloc(GFP_KERNEL, 0); bio->bi_end_io = iblock_end_io_flush; bio->bi_bdev = ib_dev->ibd_bd; + bio->bi_rw = WRITE_FLUSH; if (!immed) bio->bi_private = cmd; - submit_bio(WRITE_FLUSH, bio); + submit_bio(bio); return 0; } @@ -478,7 +480,7 @@ iblock_execute_write_same(struct se_cmd *cmd) goto fail; cmd->priv = ibr; - bio = iblock_get_bio(cmd, block_lba, 1); + bio = iblock_get_bio(cmd, block_lba, 1, WRITE); if (!bio) goto fail_free_ibr; @@ -491,7 +493,7 @@ iblock_execute_write_same(struct se_cmd *cmd) while (bio_add_page(bio, sg_page(sg), sg->length, sg->offset) != sg->length) { - bio = iblock_get_bio(cmd, block_lba, 1); + bio = iblock_get_bio(cmd, block_lba, 1, WRITE); if (!bio) goto fail_put_bios; @@ -504,7 +506,7 @@ iblock_execute_write_same(struct se_cmd *cmd) sectors -= 1; } - iblock_submit_bios(&list, WRITE); + iblock_submit_bios(&list); return 0; fail_put_bios: @@ -712,7 +714,7 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, return 0; } - bio = iblock_get_bio(cmd, block_lba, sgl_nents); + bio = iblock_get_bio(cmd, block_lba, sgl_nents, rw); if (!bio) goto fail_free_ibr; @@ -732,11 +734,11 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, while (bio_add_page(bio, sg_page(sg), sg->length, sg->offset) != sg->length) { if (bio_cnt >= IBLOCK_MAX_BIO_PER_TASK) { - iblock_submit_bios(&list, rw); + iblock_submit_bios(&list); bio_cnt = 0; } - bio = iblock_get_bio(cmd, block_lba, sg_num); + bio = iblock_get_bio(cmd, block_lba, sg_num, rw); if (!bio) goto fail_put_bios; @@ -756,7 +758,7 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, goto fail_put_bios; } - iblock_submit_bios(&list, rw); + iblock_submit_bios(&list); iblock_complete_cmd(cmd); return 0; diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index 516e19d..9400acd 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c @@ -1673,6 +1673,7 @@ static int btrfsic_read_block(struct btrfsic_state *state, } bio->bi_bdev = block_ctx->dev->bdev; bio->bi_iter.bi_sector = dev_bytenr >> 9; + bio->bi_rw = READ; for (j = i; j < num_pages; j++) { ret = bio_add_page(bio, block_ctx->pagev[j], @@ -1685,7 +1686,7 @@ static int btrfsic_read_block(struct btrfsic_state *state, "btrfsic: error, failed to add a single page!\n"); return -1; } - if (submit_bio_wait(READ, bio)) { + if (submit_bio_wait(bio)) { printk(KERN_INFO "btrfsic: read error at logical %llu dev %s!\n", block_ctx->start, block_ctx->dev->name); @@ -2918,9 +2919,10 @@ int btrfsic_submit_bh(int rw, struct buffer_head *bh) return submit_bh(rw, bh); } -static void __btrfsic_submit_bio(int rw, struct bio *bio) +static void __btrfsic_submit_bio(struct bio *bio) { struct btrfsic_dev_state *dev_state; + int rw = bio->bi_rw; if (!btrfsic_is_initialized) return; @@ -3016,16 +3018,16 @@ leave: mutex_unlock(&btrfsic_mutex); } -void btrfsic_submit_bio(int rw, struct bio *bio) +void btrfsic_submit_bio(struct bio *bio) { - __btrfsic_submit_bio(rw, bio); - submit_bio(rw, bio); + __btrfsic_submit_bio(bio); + submit_bio(bio); } -int btrfsic_submit_bio_wait(int rw, struct bio *bio) +int btrfsic_submit_bio_wait(struct bio *bio) { - __btrfsic_submit_bio(rw, bio); - return submit_bio_wait(rw, bio); + __btrfsic_submit_bio(bio); + return submit_bio_wait(bio); } int btrfsic_mount(struct btrfs_root *root, diff --git a/fs/btrfs/check-integrity.h b/fs/btrfs/check-integrity.h index 13b8566..c04e249 100644 --- a/fs/btrfs/check-integrity.h +++ b/fs/btrfs/check-integrity.h @@ -21,8 +21,8 @@ #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY int btrfsic_submit_bh(int rw, struct buffer_head *bh); -void btrfsic_submit_bio(int rw, struct bio *bio); -int btrfsic_submit_bio_wait(int rw, struct bio *bio); +void btrfsic_submit_bio(struct bio *bio); +int btrfsic_submit_bio_wait(struct bio *bio); #else #define btrfsic_submit_bh submit_bh #define btrfsic_submit_bio submit_bio diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index aeb0905..0bd25e4 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -3476,12 +3476,13 @@ static int write_dev_flush(struct btrfs_device *device, int wait) bio->bi_end_io = btrfs_end_empty_barrier; bio->bi_bdev = device->bdev; + bio->bi_rw = WRITE_FLUSH; init_completion(&device->flush_wait); bio->bi_private = &device->flush_wait; device->flush_bio = bio; bio_get(bio); - btrfsic_submit_bio(WRITE_FLUSH, bio); + btrfsic_submit_bio(bio); return 0; } diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index b67d6d2..fdeb8fa 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -2040,9 +2040,10 @@ int repair_io_failure(struct inode *inode, u64 start, u64 length, u64 logical, return -EIO; } bio->bi_bdev = dev->bdev; + bio->bi_rw = WRITE_SYNC; bio_add_page(bio, page, length, pg_offset); - if (btrfsic_submit_bio_wait(WRITE_SYNC, bio)) { + if (btrfsic_submit_bio_wait(bio)) { /* try to remap that extent elsewhere? */ bio_put(bio); btrfs_dev_stat_inc_and_print(dev, BTRFS_DEV_STAT_WRITE_ERRS); @@ -2725,14 +2726,14 @@ static int __must_check submit_one_bio(int rw, struct bio *bio, start = page_offset(page) + bvec->bv_offset; bio->bi_private = NULL; - + bio->bi_rw = rw; bio_get(bio); if (tree->ops && tree->ops->submit_bio_hook) ret = tree->ops->submit_bio_hook(page->mapping->host, rw, bio, mirror_num, bio_flags, start); else - btrfsic_submit_bio(rw, bio); + btrfsic_submit_bio(bio); bio_put(bio); return ret; diff --git a/fs/btrfs/raid56.c b/fs/btrfs/raid56.c index 0b7792e..439d7eb 100644 --- a/fs/btrfs/raid56.c +++ b/fs/btrfs/raid56.c @@ -1320,7 +1320,9 @@ write_data: bio->bi_private = rbio; bio->bi_end_io = raid_write_end_io; - submit_bio(WRITE, bio); + bio->bi_rw = WRITE; + + submit_bio(bio); } return; @@ -1573,11 +1575,12 @@ static int raid56_rmw_stripe(struct btrfs_raid_bio *rbio) bio->bi_private = rbio; bio->bi_end_io = raid_rmw_end_io; + bio->bi_rw = READ; btrfs_bio_wq_end_io(rbio->fs_info, bio, BTRFS_WQ_ENDIO_RAID56); - submit_bio(READ, bio); + submit_bio(bio); } /* the actual write will happen once the reads are done */ return 0; @@ -2097,11 +2100,12 @@ static int __raid56_parity_recover(struct btrfs_raid_bio *rbio) bio->bi_private = rbio; bio->bi_end_io = raid_recover_end_io; + bio->bi_rw = READ; btrfs_bio_wq_end_io(rbio->fs_info, bio, BTRFS_WQ_ENDIO_RAID56); - submit_bio(READ, bio); + submit_bio(bio); } out: return 0; @@ -2433,7 +2437,9 @@ submit_write: bio->bi_private = rbio; bio->bi_end_io = raid_write_end_io; - submit_bio(WRITE, bio); + bio->bi_rw = WRITE; + + submit_bio(bio); } return; @@ -2610,11 +2616,12 @@ static void raid56_parity_scrub_stripe(struct btrfs_raid_bio *rbio) bio->bi_private = rbio; bio->bi_end_io = raid56_parity_scrub_end_io; + bio->bi_rw = READ; btrfs_bio_wq_end_io(rbio->fs_info, bio, BTRFS_WQ_ENDIO_RAID56); - submit_bio(READ, bio); + submit_bio(bio); } /* the actual write will happen once the reads are done */ return; diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 2ff2876..184cb57 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -1504,8 +1504,9 @@ static void scrub_recheck_block(struct btrfs_fs_info *fs_info, sblock->no_io_error_seen = 0; } else { bio->bi_iter.bi_sector = page->physical >> 9; + bio->bi_rw = READ; - if (btrfsic_submit_bio_wait(READ, bio)) + if (btrfsic_submit_bio_wait(bio)) sblock->no_io_error_seen = 0; } @@ -1583,6 +1584,7 @@ static int scrub_repair_page_from_good_copy(struct scrub_block *sblock_bad, return -EIO; bio->bi_bdev = page_bad->dev->bdev; bio->bi_iter.bi_sector = page_bad->physical >> 9; + bio->bi_rw = WRITE; ret = bio_add_page(bio, page_good->page, PAGE_SIZE, 0); if (PAGE_SIZE != ret) { @@ -1590,7 +1592,7 @@ static int scrub_repair_page_from_good_copy(struct scrub_block *sblock_bad, return -EIO; } - if (btrfsic_submit_bio_wait(WRITE, bio)) { + if (btrfsic_submit_bio_wait(bio)) { btrfs_dev_stat_inc_and_print(page_bad->dev, BTRFS_DEV_STAT_WRITE_ERRS); btrfs_dev_replace_stats_inc( @@ -1684,6 +1686,7 @@ again: bio->bi_end_io = scrub_wr_bio_end_io; bio->bi_bdev = sbio->dev->bdev; bio->bi_iter.bi_sector = sbio->physical >> 9; + bio->bi_rw = WRITE; sbio->err = 0; } else if (sbio->physical + sbio->page_count * PAGE_SIZE != spage->physical_for_dev_replace || @@ -1731,7 +1734,7 @@ static void scrub_wr_submit(struct scrub_ctx *sctx) * orders the requests before sending them to the driver which * doubled the write performance on spinning disks when measured * with Linux 3.5 */ - btrfsic_submit_bio(WRITE, sbio->bio); + btrfsic_submit_bio(sbio->bio); } static void scrub_wr_bio_end_io(struct bio *bio) @@ -2041,7 +2044,7 @@ static void scrub_submit(struct scrub_ctx *sctx) sbio = sctx->bios[sctx->curr]; sctx->curr = -1; scrub_pending_bio_inc(sctx); - btrfsic_submit_bio(READ, sbio->bio); + btrfsic_submit_bio(sbio->bio); } static int scrub_add_page_to_rd_bio(struct scrub_ctx *sctx, @@ -2088,6 +2091,7 @@ again: bio->bi_end_io = scrub_bio_end_io; bio->bi_bdev = sbio->dev->bdev; bio->bi_iter.bi_sector = sbio->physical >> 9; + bio->bi_rw = READ; sbio->err = 0; } else if (sbio->physical + sbio->page_count * PAGE_SIZE != spage->physical || @@ -4389,6 +4393,7 @@ static int write_page_nocow(struct scrub_ctx *sctx, bio->bi_iter.bi_size = 0; bio->bi_iter.bi_sector = physical_for_dev_replace >> 9; bio->bi_bdev = dev->bdev; + bio->bi_rw = WRITE_SYNC; ret = bio_add_page(bio, page, PAGE_SIZE, 0); if (ret != PAGE_SIZE) { leave_with_eio: @@ -4397,7 +4402,7 @@ leave_with_eio: return -EIO; } - if (btrfsic_submit_bio_wait(WRITE_SYNC, bio)) + if (btrfsic_submit_bio_wait(bio)) goto leave_with_eio; bio_put(bio); diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 4dc66e6..318215d 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -462,7 +462,7 @@ loop_lock: sync_pending = 0; } - btrfsic_submit_bio(cur->bi_rw, cur); + btrfsic_submit_bio(cur); num_run++; batch_run++; @@ -5938,7 +5938,7 @@ static void btrfs_end_bio(struct bio *bio) */ static noinline void btrfs_schedule_bio(struct btrfs_root *root, struct btrfs_device *device, - int rw, struct bio *bio) + struct bio *bio) { int should_queue = 1; struct btrfs_pending_bios *pending_bios; @@ -5949,9 +5949,9 @@ static noinline void btrfs_schedule_bio(struct btrfs_root *root, } /* don't bother with additional async steps for reads, right now */ - if (!(rw & REQ_WRITE)) { + if (!(bio->bi_rw & REQ_WRITE)) { bio_get(bio); - btrfsic_submit_bio(rw, bio); + btrfsic_submit_bio(bio); bio_put(bio); return; } @@ -5965,7 +5965,6 @@ static noinline void btrfs_schedule_bio(struct btrfs_root *root, atomic_inc(&root->fs_info->nr_async_bios); WARN_ON(bio->bi_next); bio->bi_next = NULL; - bio->bi_rw |= rw; spin_lock(&device->io_lock); if (bio->bi_rw & REQ_SYNC) @@ -5999,6 +5998,7 @@ static void submit_stripe_bio(struct btrfs_root *root, struct btrfs_bio *bbio, btrfs_io_bio(bio)->stripe_index = dev_nr; bio->bi_end_io = btrfs_end_bio; bio->bi_iter.bi_sector = physical >> 9; + bio->bi_rw |= rw; #ifdef DEBUG { struct rcu_string *name; @@ -6017,9 +6017,9 @@ static void submit_stripe_bio(struct btrfs_root *root, struct btrfs_bio *bbio, btrfs_bio_counter_inc_noblocked(root->fs_info); if (async) - btrfs_schedule_bio(root, dev, rw, bio); + btrfs_schedule_bio(root, dev, bio); else - btrfsic_submit_bio(rw, bio); + btrfsic_submit_bio(bio); } static void bbio_error(struct btrfs_bio *bbio, struct bio *bio, u64 logical) diff --git a/fs/buffer.c b/fs/buffer.c index af0d9a8..7ed7869 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -3030,8 +3030,9 @@ static int submit_bh_wbc(int rw, struct buffer_head *bh, rw |= REQ_META; if (buffer_prio(bh)) rw |= REQ_PRIO; + bio->bi_rw = rw; - submit_bio(rw, bio); + submit_bio(bio); return 0; } diff --git a/fs/crypto/crypto.c b/fs/crypto/crypto.c index 2fc8c43..5b75856 100644 --- a/fs/crypto/crypto.c +++ b/fs/crypto/crypto.c @@ -318,6 +318,7 @@ int fscrypt_zeroout_range(struct inode *inode, pgoff_t lblk, bio->bi_bdev = inode->i_sb->s_bdev; bio->bi_iter.bi_sector = pblk << (inode->i_sb->s_blocksize_bits - 9); + bio->bi_rw = WRITE; ret = bio_add_page(bio, ciphertext_page, inode->i_sb->s_blocksize, 0); if (ret != inode->i_sb->s_blocksize) { @@ -327,7 +328,7 @@ int fscrypt_zeroout_range(struct inode *inode, pgoff_t lblk, err = -EIO; goto errout; } - err = submit_bio_wait(WRITE, bio); + err = submit_bio_wait(bio); if ((err == 0) && bio->bi_error) err = -EIO; bio_put(bio); diff --git a/fs/direct-io.c b/fs/direct-io.c index 4720377..1890ad2 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -374,6 +374,7 @@ dio_bio_alloc(struct dio *dio, struct dio_submit *sdio, bio->bi_bdev = bdev; bio->bi_iter.bi_sector = first_sector; + bio->bi_rw = dio->rw; if (dio->is_async) bio->bi_end_io = dio_bio_end_aio; else @@ -411,7 +412,7 @@ static inline void dio_bio_submit(struct dio *dio, struct dio_submit *sdio) sdio->logical_offset_in_bio); dio->bio_cookie = BLK_QC_T_NONE; } else - dio->bio_cookie = submit_bio(dio->rw, bio); + dio->bio_cookie = submit_bio(bio); sdio->bio = NULL; sdio->boundary = 0; diff --git a/fs/ext4/crypto.c b/fs/ext4/crypto.c index 6a6c273..811bd5d 100644 --- a/fs/ext4/crypto.c +++ b/fs/ext4/crypto.c @@ -428,6 +428,7 @@ int ext4_encrypted_zeroout(struct inode *inode, ext4_lblk_t lblk, bio->bi_bdev = inode->i_sb->s_bdev; bio->bi_iter.bi_sector = pblk << (inode->i_sb->s_blocksize_bits - 9); + bio->bi_rw = WRITE; ret = bio_add_page(bio, ciphertext_page, inode->i_sb->s_blocksize, 0); if (ret != inode->i_sb->s_blocksize) { @@ -439,7 +440,7 @@ int ext4_encrypted_zeroout(struct inode *inode, ext4_lblk_t lblk, err = -EIO; goto errout; } - err = submit_bio_wait(WRITE, bio); + err = submit_bio_wait(bio); if ((err == 0) && bio->bi_error) err = -EIO; bio_put(bio); diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c index e4fc8ea..e945b31 100644 --- a/fs/ext4/page-io.c +++ b/fs/ext4/page-io.c @@ -343,7 +343,8 @@ void ext4_io_submit(struct ext4_io_submit *io) int io_op = io->io_wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE; bio_get(io->io_bio); - submit_bio(io_op, io->io_bio); + io->io_bio->bi_rw = io_op; + submit_bio(io->io_bio); bio_put(io->io_bio); } io->io_bio = NULL; diff --git a/fs/ext4/readpage.c b/fs/ext4/readpage.c index dc54a4b..130bd45 100644 --- a/fs/ext4/readpage.c +++ b/fs/ext4/readpage.c @@ -271,7 +271,7 @@ int ext4_mpage_readpages(struct address_space *mapping, */ if (bio && (last_block_in_bio != blocks[0] - 1)) { submit_and_realloc: - submit_bio(READ, bio); + submit_bio(bio); bio = NULL; } if (bio == NULL) { @@ -294,6 +294,7 @@ int ext4_mpage_readpages(struct address_space *mapping, bio->bi_iter.bi_sector = blocks[0] << (blkbits - 9); bio->bi_end_io = mpage_end_io; bio->bi_private = ctx; + bio->bi_rw = READ; } length = first_hole << blkbits; @@ -303,14 +304,14 @@ int ext4_mpage_readpages(struct address_space *mapping, if (((map.m_flags & EXT4_MAP_BOUNDARY) && (relative_block == map.m_len)) || (first_hole != blocks_per_page)) { - submit_bio(READ, bio); + submit_bio(bio); bio = NULL; } else last_block_in_bio = blocks[blocks_per_page - 1]; goto next_page; confused: if (bio) { - submit_bio(READ, bio); + submit_bio(bio); bio = NULL; } if (!PageUptodate(page)) @@ -323,6 +324,6 @@ int ext4_mpage_readpages(struct address_space *mapping, } BUG_ON(pages && !list_empty(pages)); if (bio) - submit_bio(READ, bio); + submit_bio(bio); return 0; } diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index c29bcf4..74cf5cb 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -109,8 +109,9 @@ static void __submit_merged_bio(struct f2fs_bio_info *io) trace_f2fs_submit_read_bio(io->sbi->sb, fio, io->bio); else trace_f2fs_submit_write_bio(io->sbi->sb, fio, io->bio); + io->bio->bi_rw = fio->rw; - submit_bio(fio->rw, io->bio); + submit_bio(io->bio); io->bio = NULL; } @@ -227,8 +228,9 @@ int f2fs_submit_page_bio(struct f2fs_io_info *fio) bio_put(bio); return -EFAULT; } + bio->bi_rw = fio->rw; - submit_bio(fio->rw, bio); + submit_bio(bio); return 0; } @@ -983,7 +985,7 @@ got_it: */ if (bio && (last_block_in_bio != block_nr - 1)) { submit_and_realloc: - submit_bio(READ, bio); + submit_bio(bio); bio = NULL; } if (bio == NULL) { @@ -1012,6 +1014,7 @@ submit_and_realloc: bio->bi_iter.bi_sector = SECTOR_FROM_BLOCK(block_nr); bio->bi_end_io = f2fs_read_end_io; bio->bi_private = ctx; + bio->bi_rw = READ; } if (bio_add_page(bio, page, blocksize, 0) < blocksize) @@ -1026,7 +1029,7 @@ set_error_page: goto next_page; confused: if (bio) { - submit_bio(READ, bio); + submit_bio(bio); bio = NULL; } unlock_page(page); @@ -1036,7 +1039,7 @@ next_page: } BUG_ON(pages && !list_empty(pages)); if (bio) - submit_bio(READ, bio); + submit_bio(bio); return 0; } diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 299c784..0928d57 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -404,7 +404,8 @@ repeat: fcc->dispatch_list = llist_reverse_order(fcc->dispatch_list); bio->bi_bdev = sbi->sb->s_bdev; - ret = submit_bio_wait(WRITE_FLUSH, bio); + bio->bi_rw = WRITE_FLUSH; + ret = submit_bio_wait(bio); llist_for_each_entry_safe(cmd, next, fcc->dispatch_list, llnode) { @@ -436,7 +437,8 @@ int f2fs_issue_flush(struct f2fs_sb_info *sbi) int ret; bio->bi_bdev = sbi->sb->s_bdev; - ret = submit_bio_wait(WRITE_FLUSH, bio); + bio->bi_rw = WRITE_FLUSH; + ret = submit_bio_wait(bio); bio_put(bio); return ret; } diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c index d5369a1..ce28242 100644 --- a/fs/gfs2/lops.c +++ b/fs/gfs2/lops.c @@ -240,7 +240,8 @@ void gfs2_log_flush_bio(struct gfs2_sbd *sdp, int rw) { if (sdp->sd_log_bio) { atomic_inc(&sdp->sd_log_in_flight); - submit_bio(rw, sdp->sd_log_bio); + sdp->sd_log_bio->bi_rw = rw; + submit_bio(sdp->sd_log_bio); sdp->sd_log_bio = NULL; } } diff --git a/fs/gfs2/meta_io.c b/fs/gfs2/meta_io.c index 0448524..f8d33e8 100644 --- a/fs/gfs2/meta_io.c +++ b/fs/gfs2/meta_io.c @@ -230,7 +230,8 @@ static void gfs2_submit_bhs(int rw, struct buffer_head *bhs[], int num) bio_add_page(bio, bh->b_page, bh->b_size, bh_offset(bh)); } bio->bi_end_io = gfs2_meta_read_endio; - submit_bio(rw, bio); + bio->bi_rw = rw; + submit_bio(bio); } /** diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index 49b0bff..141b560 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c @@ -246,7 +246,8 @@ static int gfs2_read_super(struct gfs2_sbd *sdp, sector_t sector, int silent) bio->bi_end_io = end_bio_io_page; bio->bi_private = page; - submit_bio(READ_SYNC | REQ_META, bio); + bio->bi_rw = READ_SYNC | REQ_META; + submit_bio(bio); wait_on_page_locked(page); bio_put(bio); if (!PageUptodate(page)) { diff --git a/fs/hfsplus/wrapper.c b/fs/hfsplus/wrapper.c index cc62356..d026bb3 100644 --- a/fs/hfsplus/wrapper.c +++ b/fs/hfsplus/wrapper.c @@ -65,6 +65,7 @@ int hfsplus_submit_bio(struct super_block *sb, sector_t sector, bio = bio_alloc(GFP_NOIO, 1); bio->bi_iter.bi_sector = sector; bio->bi_bdev = sb->s_bdev; + bio->bi_rw = rw; if (!(rw & WRITE) && data) *data = (u8 *)buf + offset; @@ -83,7 +84,7 @@ int hfsplus_submit_bio(struct super_block *sb, sector_t sector, buf = (u8 *)buf + len; } - ret = submit_bio_wait(rw, bio); + ret = submit_bio_wait(bio); out: bio_put(bio); return ret < 0 ? ret : 0; diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c index 63759d7..3ee3f32 100644 --- a/fs/jfs/jfs_logmgr.c +++ b/fs/jfs/jfs_logmgr.c @@ -2002,12 +2002,13 @@ static int lbmRead(struct jfs_log * log, int pn, struct lbuf ** bpp) bio->bi_end_io = lbmIODone; bio->bi_private = bp; + bio->bi_rw = READ_SYNC; /*check if journaling to disk has been disabled*/ if (log->no_integrity) { bio->bi_iter.bi_size = 0; lbmIODone(bio); } else { - submit_bio(READ_SYNC, bio); + submit_bio(bio); } wait_event(bp->l_ioevent, (bp->l_flag != lbmREAD)); @@ -2145,13 +2146,14 @@ static void lbmStartIO(struct lbuf * bp) bio->bi_end_io = lbmIODone; bio->bi_private = bp; + bio->bi_rw = WRITE_SYNC; /* check if journaling to disk has been disabled */ if (log->no_integrity) { bio->bi_iter.bi_size = 0; lbmIODone(bio); } else { - submit_bio(WRITE_SYNC, bio); + submit_bio(bio); INCREMENT(lmStat.submitted); } } diff --git a/fs/jfs/jfs_metapage.c b/fs/jfs/jfs_metapage.c index b60e015..9725443 100644 --- a/fs/jfs/jfs_metapage.c +++ b/fs/jfs/jfs_metapage.c @@ -411,7 +411,7 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc) inc_io(page); if (!bio->bi_iter.bi_size) goto dump_bio; - submit_bio(WRITE, bio); + submit_bio(bio); nr_underway++; bio = NULL; } else @@ -434,6 +434,7 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc) bio->bi_iter.bi_sector = pblock << (inode->i_blkbits - 9); bio->bi_end_io = metapage_write_end_io; bio->bi_private = page; + bio->bi_rw = WRITE; /* Don't call bio_add_page yet, we may add to this vec */ bio_offset = offset; @@ -448,7 +449,7 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc) if (!bio->bi_iter.bi_size) goto dump_bio; - submit_bio(WRITE, bio); + submit_bio(bio); nr_underway++; } if (redirty) @@ -506,7 +507,7 @@ static int metapage_readpage(struct file *fp, struct page *page) insert_metapage(page, NULL); inc_io(page); if (bio) - submit_bio(READ, bio); + submit_bio(bio); bio = bio_alloc(GFP_NOFS, 1); bio->bi_bdev = inode->i_sb->s_bdev; @@ -514,6 +515,7 @@ static int metapage_readpage(struct file *fp, struct page *page) pblock << (inode->i_blkbits - 9); bio->bi_end_io = metapage_read_end_io; bio->bi_private = page; + bio->bi_rw = READ; len = xlen << inode->i_blkbits; offset = block_offset << inode->i_blkbits; if (bio_add_page(bio, page, len, offset) < len) @@ -523,7 +525,7 @@ static int metapage_readpage(struct file *fp, struct page *page) block_offset++; } if (bio) - submit_bio(READ, bio); + submit_bio(bio); else unlock_page(page); diff --git a/fs/logfs/dev_bdev.c b/fs/logfs/dev_bdev.c index cc26f8f..29704bd 100644 --- a/fs/logfs/dev_bdev.c +++ b/fs/logfs/dev_bdev.c @@ -29,8 +29,9 @@ static int sync_request(struct page *page, struct block_device *bdev, int rw) bio.bi_bdev = bdev; bio.bi_iter.bi_sector = page->index * (PAGE_SIZE >> 9); bio.bi_iter.bi_size = PAGE_SIZE; + bio.bi_rw = rw; - return submit_bio_wait(rw, &bio); + return submit_bio_wait(&bio); } static int bdev_readpage(void *_sb, struct page *page) @@ -95,8 +96,9 @@ static int __bdev_writeseg(struct super_block *sb, u64 ofs, pgoff_t index, bio->bi_iter.bi_sector = ofs >> 9; bio->bi_private = sb; bio->bi_end_io = writeseg_end_io; + bio->bi_rw = WRITE; atomic_inc(&super->s_pending_writes); - submit_bio(WRITE, bio); + submit_bio(bio); ofs += i * PAGE_SIZE; index += i; @@ -122,8 +124,9 @@ static int __bdev_writeseg(struct super_block *sb, u64 ofs, pgoff_t index, bio->bi_iter.bi_sector = ofs >> 9; bio->bi_private = sb; bio->bi_end_io = writeseg_end_io; + bio->bi_rw = WRITE; atomic_inc(&super->s_pending_writes); - submit_bio(WRITE, bio); + submit_bio(bio); return 0; } @@ -185,8 +188,9 @@ static int do_erase(struct super_block *sb, u64 ofs, pgoff_t index, bio->bi_iter.bi_sector = ofs >> 9; bio->bi_private = sb; bio->bi_end_io = erase_end_io; + bio->bi_rw = WRITE; atomic_inc(&super->s_pending_writes); - submit_bio(WRITE, bio); + submit_bio(bio); ofs += i * PAGE_SIZE; index += i; @@ -206,8 +210,9 @@ static int do_erase(struct super_block *sb, u64 ofs, pgoff_t index, bio->bi_iter.bi_sector = ofs >> 9; bio->bi_private = sb; bio->bi_end_io = erase_end_io; + bio->bi_rw = WRITE; atomic_inc(&super->s_pending_writes); - submit_bio(WRITE, bio); + submit_bio(bio); return 0; } diff --git a/fs/mpage.c b/fs/mpage.c index eedc644..2c251ec 100644 --- a/fs/mpage.c +++ b/fs/mpage.c @@ -59,8 +59,9 @@ static void mpage_end_io(struct bio *bio) static struct bio *mpage_bio_submit(int rw, struct bio *bio) { bio->bi_end_io = mpage_end_io; + bio->bi_rw = rw; guard_bio_eod(rw, bio); - submit_bio(rw, bio); + submit_bio(bio); return NULL; } diff --git a/fs/nfs/blocklayout/blocklayout.c b/fs/nfs/blocklayout/blocklayout.c index 17a42e4..4c79f4d 100644 --- a/fs/nfs/blocklayout/blocklayout.c +++ b/fs/nfs/blocklayout/blocklayout.c @@ -102,14 +102,15 @@ static inline void put_parallel(struct parallel_io *p) } static struct bio * -bl_submit_bio(int rw, struct bio *bio) +bl_submit_bio(struct bio *bio) { if (bio) { get_parallel(bio->bi_private); dprintk("%s submitting %s bio %u@%llu\n", __func__, - rw == READ ? "read" : "write", bio->bi_iter.bi_size, + bio->bi_rw == READ ? "read" : "write", + bio->bi_iter.bi_size, (unsigned long long)bio->bi_iter.bi_sector); - submit_bio(rw, bio); + submit_bio(bio); } return NULL; } @@ -158,7 +159,7 @@ do_add_page_to_bio(struct bio *bio, int npg, int rw, sector_t isect, if (disk_addr < map->start || disk_addr >= map->start + map->len) { if (!dev->map(dev, disk_addr, map)) return ERR_PTR(-EIO); - bio = bl_submit_bio(rw, bio); + bio = bl_submit_bio(bio); } disk_addr += map->disk_offset; disk_addr -= map->start; @@ -174,9 +175,10 @@ retry: disk_addr >> SECTOR_SHIFT, end_io, par); if (!bio) return ERR_PTR(-ENOMEM); + bio->bi_rw = rw; } if (bio_add_page(bio, page, *len, offset) < *len) { - bio = bl_submit_bio(rw, bio); + bio = bl_submit_bio(bio); goto retry; } return bio; @@ -252,7 +254,7 @@ bl_read_pagelist(struct nfs_pgio_header *header) for (i = pg_index; i < header->page_array.npages; i++) { if (extent_length <= 0) { /* We've used up the previous extent */ - bio = bl_submit_bio(READ, bio); + bio = bl_submit_bio(bio); /* Get the next one */ if (!ext_tree_lookup(bl, isect, &be, false)) { @@ -273,7 +275,7 @@ bl_read_pagelist(struct nfs_pgio_header *header) } if (is_hole(&be)) { - bio = bl_submit_bio(READ, bio); + bio = bl_submit_bio(bio); /* Fill hole w/ zeroes w/o accessing device */ dprintk("%s Zeroing page for hole\n", __func__); zero_user_segment(pages[i], pg_offset, pg_len); @@ -306,7 +308,7 @@ bl_read_pagelist(struct nfs_pgio_header *header) header->res.count = (isect << SECTOR_SHIFT) - header->args.offset; } out: - bl_submit_bio(READ, bio); + bl_submit_bio(bio); blk_finish_plug(&plug); put_parallel(par); return PNFS_ATTEMPTED; @@ -398,7 +400,7 @@ bl_write_pagelist(struct nfs_pgio_header *header, int sync) for (i = pg_index; i < header->page_array.npages; i++) { if (extent_length <= 0) { /* We've used up the previous extent */ - bio = bl_submit_bio(WRITE, bio); + bio = bl_submit_bio(bio); /* Get the next one */ if (!ext_tree_lookup(bl, isect, &be, true)) { header->pnfs_error = -EINVAL; @@ -427,7 +429,7 @@ bl_write_pagelist(struct nfs_pgio_header *header, int sync) header->res.count = header->args.count; out: - bl_submit_bio(WRITE, bio); + bl_submit_bio(bio); blk_finish_plug(&plug); put_parallel(par); return PNFS_ATTEMPTED; diff --git a/fs/nilfs2/segbuf.c b/fs/nilfs2/segbuf.c index f63620c..7666f1d 100644 --- a/fs/nilfs2/segbuf.c +++ b/fs/nilfs2/segbuf.c @@ -368,7 +368,8 @@ static int nilfs_segbuf_submit_bio(struct nilfs_segment_buffer *segbuf, bio->bi_end_io = nilfs_end_bio_write; bio->bi_private = segbuf; - submit_bio(mode, bio); + bio->bi_rw = mode; + submit_bio(bio); segbuf->sb_nbio++; wi->bio = NULL; diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c index 6e04b1a..e37373d 100644 --- a/fs/ocfs2/cluster/heartbeat.c +++ b/fs/ocfs2/cluster/heartbeat.c @@ -530,7 +530,7 @@ static void o2hb_bio_end_io(struct bio *bio) static struct bio *o2hb_setup_one_bio(struct o2hb_region *reg, struct o2hb_bio_wait_ctxt *wc, unsigned int *current_slot, - unsigned int max_slots) + unsigned int max_slots, int rw) { int len, current_page; unsigned int vec_len, vec_start; @@ -556,6 +556,7 @@ static struct bio *o2hb_setup_one_bio(struct o2hb_region *reg, bio->bi_bdev = reg->hr_bdev; bio->bi_private = wc; bio->bi_end_io = o2hb_bio_end_io; + bio->bi_rw = rw; vec_start = (cs << bits) % PAGE_SIZE; while(cs < max_slots) { @@ -591,7 +592,8 @@ static int o2hb_read_slots(struct o2hb_region *reg, o2hb_bio_wait_init(&wc); while(current_slot < max_slots) { - bio = o2hb_setup_one_bio(reg, &wc, ¤t_slot, max_slots); + bio = o2hb_setup_one_bio(reg, &wc, ¤t_slot, max_slots, + READ); if (IS_ERR(bio)) { status = PTR_ERR(bio); mlog_errno(status); @@ -599,7 +601,7 @@ static int o2hb_read_slots(struct o2hb_region *reg, } atomic_inc(&wc.wc_num_reqs); - submit_bio(READ, bio); + submit_bio(bio); } status = 0; @@ -623,7 +625,7 @@ static int o2hb_issue_node_write(struct o2hb_region *reg, slot = o2nm_this_node(); - bio = o2hb_setup_one_bio(reg, write_wc, &slot, slot+1); + bio = o2hb_setup_one_bio(reg, write_wc, &slot, slot+1, WRITE_SYNC); if (IS_ERR(bio)) { status = PTR_ERR(bio); mlog_errno(status); @@ -631,7 +633,7 @@ static int o2hb_issue_node_write(struct o2hb_region *reg, } atomic_inc(&write_wc->wc_num_reqs); - submit_bio(WRITE_SYNC, bio); + submit_bio(bio); status = 0; bail: diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index e5c3a45..5852c5a 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -439,7 +439,10 @@ xfs_submit_ioend( ioend->io_bio->bi_private = ioend; ioend->io_bio->bi_end_io = xfs_end_bio; - + if (wbc->sync_mode) + ioend->io_bio->bi_rw = WRITE_SYNC; + else + ioend->io_bio->bi_rw = WRITE; /* * If we are failing the IO now, just mark the ioend with an * error and finish it. This will run IO completion immediately @@ -452,8 +455,7 @@ xfs_submit_ioend( return status; } - submit_bio(wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE, - ioend->io_bio); + submit_bio(ioend->io_bio); return 0; } @@ -511,8 +513,11 @@ xfs_chain_bio( bio_chain(ioend->io_bio, new); bio_get(ioend->io_bio); /* for xfs_destroy_ioend */ - submit_bio(wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE, - ioend->io_bio); + if (wbc->sync_mode) + ioend->io_bio->bi_rw = WRITE_SYNC; + else + ioend->io_bio->bi_rw = WRITE; + submit_bio(ioend->io_bio); ioend->io_bio = new; } diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 9a2191b..079bb77 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1170,7 +1170,7 @@ next_chunk: bio->bi_iter.bi_sector = sector; bio->bi_end_io = xfs_buf_bio_end_io; bio->bi_private = bp; - + bio->bi_rw = rw; for (; size && nr_pages; nr_pages--, page_index++) { int rbytes, nbytes = PAGE_SIZE - offset; @@ -1194,7 +1194,7 @@ next_chunk: flush_kernel_vmap_range(bp->b_addr, xfs_buf_vmap_len(bp)); } - submit_bio(rw, bio); + submit_bio(bio); if (size) goto next_chunk; } else { diff --git a/include/linux/bio.h b/include/linux/bio.h index 6b7481f..4724810 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -473,7 +473,7 @@ static inline void bio_io_error(struct bio *bio) struct request_queue; extern int bio_phys_segments(struct request_queue *, struct bio *); -extern int submit_bio_wait(int rw, struct bio *bio); +extern int submit_bio_wait(struct bio *bio); extern void bio_advance(struct bio *, unsigned); extern void bio_init(struct bio *); diff --git a/include/linux/fs.h b/include/linux/fs.h index e3c0b7e..69bdd03 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2704,7 +2704,7 @@ static inline void remove_inode_hash(struct inode *inode) extern void inode_sb_list_add(struct inode *inode); #ifdef CONFIG_BLOCK -extern blk_qc_t submit_bio(int, struct bio *); +extern blk_qc_t submit_bio(struct bio *); extern int bdev_read_only(struct block_device *); #endif extern int set_blocksize(struct block_device *, int); diff --git a/kernel/power/swap.c b/kernel/power/swap.c index 12cd989..4d050eb 100644 --- a/kernel/power/swap.c +++ b/kernel/power/swap.c @@ -260,6 +260,7 @@ static int hib_submit_io(int rw, pgoff_t page_off, void *addr, bio = bio_alloc(__GFP_RECLAIM | __GFP_HIGH, 1); bio->bi_iter.bi_sector = page_off * (PAGE_SIZE >> 9); bio->bi_bdev = hib_resume_bdev; + bio->bi_rw = rw; if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) { printk(KERN_ERR "PM: Adding page to bio failed at %llu\n", @@ -272,9 +273,9 @@ static int hib_submit_io(int rw, pgoff_t page_off, void *addr, bio->bi_end_io = hib_end_io; bio->bi_private = hb; atomic_inc(&hb->count); - submit_bio(rw, bio); + submit_bio(bio); } else { - error = submit_bio_wait(rw, bio); + error = submit_bio_wait(bio); bio_put(bio); } diff --git a/mm/page_io.c b/mm/page_io.c index 985f23c..85cc7e1 100644 --- a/mm/page_io.c +++ b/mm/page_io.c @@ -259,7 +259,7 @@ int __swap_writepage(struct page *page, struct writeback_control *wbc, bio_end_io_t end_write_func) { struct bio *bio; - int ret, rw = WRITE; + int ret; struct swap_info_struct *sis = page_swap_info(page); if (sis->flags & SWP_FILE) { @@ -317,12 +317,13 @@ int __swap_writepage(struct page *page, struct writeback_control *wbc, ret = -ENOMEM; goto out; } + bio->bi_rw = WRITE; if (wbc->sync_mode == WB_SYNC_ALL) - rw |= REQ_SYNC; + bio->bi_rw |= REQ_SYNC; count_vm_event(PSWPOUT); set_page_writeback(page); unlock_page(page); - submit_bio(rw, bio); + submit_bio(bio); out: return ret; } @@ -369,8 +370,9 @@ int swap_readpage(struct page *page) ret = -ENOMEM; goto out; } + bio->bi_rw = READ; count_vm_event(PSWPIN); - submit_bio(READ, bio); + submit_bio(bio); out: return ret; } -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:40:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B52677CA0 for ; Fri, 15 Apr 2016 05:40:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4E708304048 for ; Fri, 15 Apr 2016 03:40:19 -0700 (PDT) X-ASG-Debug-ID: 1460716815-04bdf011045e4ad0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id FYEcHQ6WQUU01PIR (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:40:15 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 835677F096; Fri, 15 Apr 2016 10:40:15 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe31o010243; Fri, 15 Apr 2016 06:40:13 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 04/42] fs: have submit_bh users pass in op and flags separately Date: Fri, 15 Apr 2016 05:39:24 -0500 X-ASG-Orig-Subj: [PATCH 04/42] fs: have submit_bh users pass in op and flags separately Message-Id: <1460716802-2294-5-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716815 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This has submit_bh users pass in the operation and flags separately, so submit_bh_wbc can setup bio->bi_op and bio-bi_rw on the bio that is submitted. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/md/bitmap.c | 4 ++-- fs/btrfs/check-integrity.c | 24 ++++++++++---------- fs/btrfs/check-integrity.h | 2 +- fs/btrfs/disk-io.c | 4 ++-- fs/buffer.c | 54 +++++++++++++++++++++++---------------------- fs/ext4/balloc.c | 2 +- fs/ext4/ialloc.c | 2 +- fs/ext4/inode.c | 2 +- fs/ext4/mmp.c | 4 ++-- fs/fat/misc.c | 2 +- fs/gfs2/bmap.c | 2 +- fs/gfs2/dir.c | 2 +- fs/gfs2/meta_io.c | 6 ++--- fs/jbd2/commit.c | 6 ++--- fs/jbd2/journal.c | 8 +++---- fs/nilfs2/btnode.c | 6 ++--- fs/nilfs2/btnode.h | 2 +- fs/nilfs2/btree.c | 6 +++-- fs/nilfs2/gcinode.c | 5 +++-- fs/nilfs2/mdt.c | 11 ++++----- fs/ntfs/aops.c | 6 ++--- fs/ntfs/compress.c | 2 +- fs/ntfs/file.c | 2 +- fs/ntfs/logfile.c | 2 +- fs/ntfs/mft.c | 4 ++-- fs/ocfs2/buffer_head_io.c | 8 +++---- fs/reiserfs/inode.c | 4 ++-- fs/reiserfs/journal.c | 6 ++--- fs/ufs/util.c | 2 +- include/linux/buffer_head.h | 9 ++++---- 30 files changed, 103 insertions(+), 96 deletions(-) diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index 3fe86b5..8b2e16f 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c @@ -294,7 +294,7 @@ static void write_page(struct bitmap *bitmap, struct page *page, int wait) atomic_inc(&bitmap->pending_writes); set_buffer_locked(bh); set_buffer_mapped(bh); - submit_bh(WRITE | REQ_SYNC, bh); + submit_bh(REQ_OP_WRITE, REQ_SYNC, bh); bh = bh->b_this_page; } @@ -389,7 +389,7 @@ static int read_page(struct file *file, unsigned long index, atomic_inc(&bitmap->pending_writes); set_buffer_locked(bh); set_buffer_mapped(bh); - submit_bh(READ, bh); + submit_bh(REQ_OP_READ, 0, bh); } block++; bh = bh->b_this_page; diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index 9400acd..f82190f 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c @@ -2856,12 +2856,12 @@ static struct btrfsic_dev_state *btrfsic_dev_state_lookup( return ds; } -int btrfsic_submit_bh(int rw, struct buffer_head *bh) +int btrfsic_submit_bh(int op, int op_flags, struct buffer_head *bh) { struct btrfsic_dev_state *dev_state; if (!btrfsic_is_initialized) - return submit_bh(rw, bh); + return submit_bh(op, op_flags, bh); mutex_lock(&btrfsic_mutex); /* since btrfsic_submit_bh() might also be called before @@ -2870,26 +2870,26 @@ int btrfsic_submit_bh(int rw, struct buffer_head *bh) /* Only called to write the superblock (incl. FLUSH/FUA) */ if (NULL != dev_state && - (rw & WRITE) && bh->b_size > 0) { + (op == REQ_OP_WRITE) && bh->b_size > 0) { u64 dev_bytenr; dev_bytenr = 4096 * bh->b_blocknr; if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) printk(KERN_INFO - "submit_bh(rw=0x%x, blocknr=%llu (bytenr %llu)," - " size=%zu, data=%p, bdev=%p)\n", - rw, (unsigned long long)bh->b_blocknr, + "submit_bh(op=0x%x,0x%x, blocknr=%llu " + "(bytenr %llu), size=%zu, data=%p, bdev=%p)\n", + op, op_flags, (unsigned long long)bh->b_blocknr, dev_bytenr, bh->b_size, bh->b_data, bh->b_bdev); btrfsic_process_written_block(dev_state, dev_bytenr, &bh->b_data, 1, NULL, - NULL, bh, rw); - } else if (NULL != dev_state && (rw & REQ_FLUSH)) { + NULL, bh, op_flags); + } else if (NULL != dev_state && (op_flags & REQ_FLUSH)) { if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) printk(KERN_INFO - "submit_bh(rw=0x%x FLUSH, bdev=%p)\n", - rw, bh->b_bdev); + "submit_bh(op=0x%x,0x%x FLUSH, bdev=%p)\n", + op, op_flags, bh->b_bdev); if (!dev_state->dummy_block_for_bio_bh_flush.is_iodone) { if ((dev_state->state->print_mask & (BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH | @@ -2907,7 +2907,7 @@ int btrfsic_submit_bh(int rw, struct buffer_head *bh) block->never_written = 0; block->iodone_w_error = 0; block->flush_gen = dev_state->last_flush_gen + 1; - block->submit_bio_bh_rw = rw; + block->submit_bio_bh_rw = op_flags; block->orig_bio_bh_private = bh->b_private; block->orig_bio_bh_end_io.bh = bh->b_end_io; block->next_in_same_bio = NULL; @@ -2916,7 +2916,7 @@ int btrfsic_submit_bh(int rw, struct buffer_head *bh) } } mutex_unlock(&btrfsic_mutex); - return submit_bh(rw, bh); + return submit_bh(op, op_flags, bh); } static void __btrfsic_submit_bio(struct bio *bio) diff --git a/fs/btrfs/check-integrity.h b/fs/btrfs/check-integrity.h index c04e249..f78dff1 100644 --- a/fs/btrfs/check-integrity.h +++ b/fs/btrfs/check-integrity.h @@ -20,7 +20,7 @@ #define __BTRFS_CHECK_INTEGRITY__ #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY -int btrfsic_submit_bh(int rw, struct buffer_head *bh); +int btrfsic_submit_bh(int op, int op_flags, struct buffer_head *bh); void btrfsic_submit_bio(struct bio *bio); int btrfsic_submit_bio_wait(struct bio *bio); #else diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 0bd25e4..9a13c85 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -3410,9 +3410,9 @@ static int write_dev_supers(struct btrfs_device *device, * to go down lazy. */ if (i == 0) - ret = btrfsic_submit_bh(WRITE_FUA, bh); + ret = btrfsic_submit_bh(REQ_OP_WRITE, WRITE_FUA, bh); else - ret = btrfsic_submit_bh(WRITE_SYNC, bh); + ret = btrfsic_submit_bh(REQ_OP_WRITE, WRITE_SYNC, bh); if (ret) errors++; } diff --git a/fs/buffer.c b/fs/buffer.c index 7ed7869..1e1a474 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -45,7 +45,7 @@ #include static int fsync_buffers_list(spinlock_t *lock, struct list_head *list); -static int submit_bh_wbc(int rw, struct buffer_head *bh, +static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh, unsigned long bio_flags, struct writeback_control *wbc); @@ -1225,7 +1225,7 @@ static struct buffer_head *__bread_slow(struct buffer_head *bh) } else { get_bh(bh); bh->b_end_io = end_buffer_read_sync; - submit_bh(READ, bh); + submit_bh(REQ_OP_READ, 0, bh); wait_on_buffer(bh); if (buffer_uptodate(bh)) return bh; @@ -1697,7 +1697,7 @@ static int __block_write_full_page(struct inode *inode, struct page *page, struct buffer_head *bh, *head; unsigned int blocksize, bbits; int nr_underway = 0; - int write_op = (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE); + int write_flags = (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : 0); head = create_page_buffers(page, inode, (1 << BH_Dirty)|(1 << BH_Uptodate)); @@ -1786,7 +1786,7 @@ static int __block_write_full_page(struct inode *inode, struct page *page, do { struct buffer_head *next = bh->b_this_page; if (buffer_async_write(bh)) { - submit_bh_wbc(write_op, bh, 0, wbc); + submit_bh_wbc(REQ_OP_WRITE, write_flags, bh, 0, wbc); nr_underway++; } bh = next; @@ -1840,7 +1840,7 @@ recover: struct buffer_head *next = bh->b_this_page; if (buffer_async_write(bh)) { clear_buffer_dirty(bh); - submit_bh_wbc(write_op, bh, 0, wbc); + submit_bh_wbc(REQ_OP_WRITE, write_flags, bh, 0, wbc); nr_underway++; } bh = next; @@ -2248,7 +2248,7 @@ int block_read_full_page(struct page *page, get_block_t *get_block) if (buffer_uptodate(bh)) end_buffer_async_read(bh, 1); else - submit_bh(READ, bh); + submit_bh(REQ_OP_READ, 0, bh); } return 0; } @@ -2582,7 +2582,7 @@ int nobh_write_begin(struct address_space *mapping, if (block_start < from || block_end > to) { lock_buffer(bh); bh->b_end_io = end_buffer_read_nobh; - submit_bh(READ, bh); + submit_bh(REQ_OP_READ, 0, bh); nr_reads++; } } @@ -2949,7 +2949,7 @@ static void end_bio_bh_io_sync(struct bio *bio) * errors, this only handles the "we need to be able to * do IO at the final sector" case. */ -void guard_bio_eod(int rw, struct bio *bio) +void guard_bio_eod(int op, struct bio *bio) { sector_t maxsector; struct bio_vec *bvec = &bio->bi_io_vec[bio->bi_vcnt - 1]; @@ -2979,13 +2979,13 @@ void guard_bio_eod(int rw, struct bio *bio) bvec->bv_len -= truncated_bytes; /* ..and clear the end of the buffer for reads */ - if ((rw & RW_MASK) == READ) { + if (op == REQ_OP_READ) { zero_user(bvec->bv_page, bvec->bv_offset + bvec->bv_len, truncated_bytes); } } -static int submit_bh_wbc(int rw, struct buffer_head *bh, +static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh, unsigned long bio_flags, struct writeback_control *wbc) { struct bio *bio; @@ -2999,7 +2999,7 @@ static int submit_bh_wbc(int rw, struct buffer_head *bh, /* * Only clear out a write error when rewriting */ - if (test_set_buffer_req(bh) && (rw & WRITE)) + if (test_set_buffer_req(bh) && (op == REQ_OP_WRITE)) clear_buffer_write_io_error(bh); /* @@ -3022,29 +3022,31 @@ static int submit_bh_wbc(int rw, struct buffer_head *bh, bio->bi_end_io = end_bio_bh_io_sync; bio->bi_private = bh; bio->bi_flags |= bio_flags; + bio->bi_op = op; /* Take care of bh's that straddle the end of the device */ - guard_bio_eod(rw, bio); + guard_bio_eod(op, bio); if (buffer_meta(bh)) - rw |= REQ_META; + op_flags |= REQ_META; if (buffer_prio(bh)) - rw |= REQ_PRIO; - bio->bi_rw = rw; + op_flags |= REQ_PRIO; + bio->bi_rw = op_flags; submit_bio(bio); return 0; } -int _submit_bh(int rw, struct buffer_head *bh, unsigned long bio_flags) +int _submit_bh(int op, int op_flags, struct buffer_head *bh, + unsigned long bio_flags) { - return submit_bh_wbc(rw, bh, bio_flags, NULL); + return submit_bh_wbc(op, op_flags, bh, bio_flags, NULL); } EXPORT_SYMBOL_GPL(_submit_bh); -int submit_bh(int rw, struct buffer_head *bh) +int submit_bh(int op, int op_flags, struct buffer_head *bh) { - return submit_bh_wbc(rw, bh, 0, NULL); + return submit_bh_wbc(op, op_flags, bh, 0, NULL); } EXPORT_SYMBOL(submit_bh); @@ -3086,14 +3088,14 @@ void ll_rw_block(int rw, int nr, struct buffer_head *bhs[]) if (test_clear_buffer_dirty(bh)) { bh->b_end_io = end_buffer_write_sync; get_bh(bh); - submit_bh(WRITE, bh); + submit_bh(rw, 0, bh); continue; } } else { if (!buffer_uptodate(bh)) { bh->b_end_io = end_buffer_read_sync; get_bh(bh); - submit_bh(rw, bh); + submit_bh(rw, 0, bh); continue; } } @@ -3102,7 +3104,7 @@ void ll_rw_block(int rw, int nr, struct buffer_head *bhs[]) } EXPORT_SYMBOL(ll_rw_block); -void write_dirty_buffer(struct buffer_head *bh, int rw) +void write_dirty_buffer(struct buffer_head *bh, int op_flags) { lock_buffer(bh); if (!test_clear_buffer_dirty(bh)) { @@ -3111,7 +3113,7 @@ void write_dirty_buffer(struct buffer_head *bh, int rw) } bh->b_end_io = end_buffer_write_sync; get_bh(bh); - submit_bh(rw, bh); + submit_bh(REQ_OP_WRITE, op_flags, bh); } EXPORT_SYMBOL(write_dirty_buffer); @@ -3120,7 +3122,7 @@ EXPORT_SYMBOL(write_dirty_buffer); * and then start new I/O and then wait upon it. The caller must have a ref on * the buffer_head. */ -int __sync_dirty_buffer(struct buffer_head *bh, int rw) +int __sync_dirty_buffer(struct buffer_head *bh, int op_flags) { int ret = 0; @@ -3129,7 +3131,7 @@ int __sync_dirty_buffer(struct buffer_head *bh, int rw) if (test_clear_buffer_dirty(bh)) { get_bh(bh); bh->b_end_io = end_buffer_write_sync; - ret = submit_bh(rw, bh); + ret = submit_bh(REQ_OP_WRITE, op_flags, bh); wait_on_buffer(bh); if (!ret && !buffer_uptodate(bh)) ret = -EIO; @@ -3392,7 +3394,7 @@ int bh_submit_read(struct buffer_head *bh) get_bh(bh); bh->b_end_io = end_buffer_read_sync; - submit_bh(READ, bh); + submit_bh(REQ_OP_READ, 0, bh); wait_on_buffer(bh); if (buffer_uptodate(bh)) return 0; diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c index fe1f50f..d06823b 100644 --- a/fs/ext4/balloc.c +++ b/fs/ext4/balloc.c @@ -470,7 +470,7 @@ ext4_read_block_bitmap_nowait(struct super_block *sb, ext4_group_t block_group) trace_ext4_read_block_bitmap_load(sb, block_group); bh->b_end_io = ext4_end_bitmap_read; get_bh(bh); - submit_bh(READ | REQ_META | REQ_PRIO, bh); + submit_bh(REQ_OP_READ, REQ_META | REQ_PRIO, bh); return bh; verify: err = ext4_validate_block_bitmap(sb, desc, block_group, bh); diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index 237b877..0b08abc 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c @@ -214,7 +214,7 @@ ext4_read_inode_bitmap(struct super_block *sb, ext4_group_t block_group) trace_ext4_load_inode_bitmap(sb, block_group); bh->b_end_io = ext4_end_bitmap_read; get_bh(bh); - submit_bh(READ | REQ_META | REQ_PRIO, bh); + submit_bh(REQ_OP_READ, REQ_META | REQ_PRIO, bh); wait_on_buffer(bh); if (!buffer_uptodate(bh)) { put_bh(bh); diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 981a1fc..f19220b 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -4186,7 +4186,7 @@ make_io: trace_ext4_load_inode(inode); get_bh(bh); bh->b_end_io = end_buffer_read_sync; - submit_bh(READ | REQ_META | REQ_PRIO, bh); + submit_bh(REQ_OP_READ, REQ_META | REQ_PRIO, bh); wait_on_buffer(bh); if (!buffer_uptodate(bh)) { EXT4_ERROR_INODE_BLOCK(inode, block, diff --git a/fs/ext4/mmp.c b/fs/ext4/mmp.c index 2444527..cef1db4 100644 --- a/fs/ext4/mmp.c +++ b/fs/ext4/mmp.c @@ -52,7 +52,7 @@ static int write_mmp_block(struct super_block *sb, struct buffer_head *bh) lock_buffer(bh); bh->b_end_io = end_buffer_write_sync; get_bh(bh); - submit_bh(WRITE_SYNC | REQ_META | REQ_PRIO, bh); + submit_bh(REQ_OP_WRITE, WRITE_SYNC | REQ_META | REQ_PRIO, bh); wait_on_buffer(bh); sb_end_write(sb); if (unlikely(!buffer_uptodate(bh))) @@ -88,7 +88,7 @@ static int read_mmp_block(struct super_block *sb, struct buffer_head **bh, get_bh(*bh); lock_buffer(*bh); (*bh)->b_end_io = end_buffer_read_sync; - submit_bh(READ_SYNC | REQ_META | REQ_PRIO, *bh); + submit_bh(REQ_OP_READ, READ_SYNC | REQ_META | REQ_PRIO, *bh); wait_on_buffer(*bh); if (!buffer_uptodate(*bh)) { ret = -EIO; diff --git a/fs/fat/misc.c b/fs/fat/misc.c index c4589e9..8a86981 100644 --- a/fs/fat/misc.c +++ b/fs/fat/misc.c @@ -267,7 +267,7 @@ int fat_sync_bhs(struct buffer_head **bhs, int nr_bhs) int i, err = 0; for (i = 0; i < nr_bhs; i++) - write_dirty_buffer(bhs[i], WRITE); + write_dirty_buffer(bhs[i], 0); for (i = 0; i < nr_bhs; i++) { wait_on_buffer(bhs[i]); diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c index 24ce1cd..06d79aa 100644 --- a/fs/gfs2/bmap.c +++ b/fs/gfs2/bmap.c @@ -285,7 +285,7 @@ static void gfs2_metapath_ra(struct gfs2_glock *gl, if (trylock_buffer(rabh)) { if (!buffer_uptodate(rabh)) { rabh->b_end_io = end_buffer_read_sync; - submit_bh(READA | REQ_META, rabh); + submit_bh(REQ_OP_READ, READA | REQ_META, rabh); continue; } unlock_buffer(rabh); diff --git a/fs/gfs2/dir.c b/fs/gfs2/dir.c index 4a01f30..97a7d47 100644 --- a/fs/gfs2/dir.c +++ b/fs/gfs2/dir.c @@ -1510,7 +1510,7 @@ static void gfs2_dir_readahead(struct inode *inode, unsigned hsize, u32 index, continue; } bh->b_end_io = end_buffer_read_sync; - submit_bh(READA | REQ_META, bh); + submit_bh(REQ_OP_READ, READA | REQ_META, bh); continue; } brelse(bh); diff --git a/fs/gfs2/meta_io.c b/fs/gfs2/meta_io.c index f8d33e8..3c63087 100644 --- a/fs/gfs2/meta_io.c +++ b/fs/gfs2/meta_io.c @@ -37,8 +37,8 @@ static int gfs2_aspace_writepage(struct page *page, struct writeback_control *wb { struct buffer_head *bh, *head; int nr_underway = 0; - int write_op = REQ_META | REQ_PRIO | - (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE); + int write_flags = REQ_META | REQ_PRIO | + (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : 0); BUG_ON(!PageLocked(page)); BUG_ON(!page_has_buffers(page)); @@ -79,7 +79,7 @@ static int gfs2_aspace_writepage(struct page *page, struct writeback_control *wb do { struct buffer_head *next = bh->b_this_page; if (buffer_async_write(bh)) { - submit_bh(write_op, bh); + submit_bh(REQ_OP_WRITE, write_flags, bh); nr_underway++; } bh = next; diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c index 2ad98d6..956bcf0 100644 --- a/fs/jbd2/commit.c +++ b/fs/jbd2/commit.c @@ -155,9 +155,9 @@ static int journal_submit_commit_record(journal_t *journal, if (journal->j_flags & JBD2_BARRIER && !jbd2_has_feature_async_commit(journal)) - ret = submit_bh(WRITE_SYNC | WRITE_FLUSH_FUA, bh); + ret = submit_bh(REQ_OP_WRITE, WRITE_SYNC | WRITE_FLUSH_FUA, bh); else - ret = submit_bh(WRITE_SYNC, bh); + ret = submit_bh(REQ_OP_WRITE, WRITE_SYNC, bh); *cbh = bh; return ret; @@ -714,7 +714,7 @@ start_journal_io: clear_buffer_dirty(bh); set_buffer_uptodate(bh); bh->b_end_io = journal_end_buffer_io_sync; - submit_bh(WRITE_SYNC, bh); + submit_bh(REQ_OP_WRITE, WRITE_SYNC, bh); } cond_resched(); stats.run.rs_blocks_logged += bufs; diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index 435f0b2..6d7e33a 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c @@ -1345,15 +1345,15 @@ static int journal_reset(journal_t *journal) return jbd2_journal_start_thread(journal); } -static int jbd2_write_superblock(journal_t *journal, int write_op) +static int jbd2_write_superblock(journal_t *journal, int write_flags) { struct buffer_head *bh = journal->j_sb_buffer; journal_superblock_t *sb = journal->j_superblock; int ret; - trace_jbd2_write_superblock(journal, write_op); + trace_jbd2_write_superblock(journal, write_flags); if (!(journal->j_flags & JBD2_BARRIER)) - write_op &= ~(REQ_FUA | REQ_FLUSH); + write_flags &= ~(REQ_FUA | REQ_FLUSH); lock_buffer(bh); if (buffer_write_io_error(bh)) { /* @@ -1373,7 +1373,7 @@ static int jbd2_write_superblock(journal_t *journal, int write_op) jbd2_superblock_csum_set(journal, sb); get_bh(bh); bh->b_end_io = end_buffer_write_sync; - ret = submit_bh(write_op, bh); + ret = submit_bh(REQ_OP_WRITE, write_flags, bh); wait_on_buffer(bh); if (buffer_write_io_error(bh)) { clear_buffer_write_io_error(bh); diff --git a/fs/nilfs2/btnode.c b/fs/nilfs2/btnode.c index e0c9daf..87baf87 100644 --- a/fs/nilfs2/btnode.c +++ b/fs/nilfs2/btnode.c @@ -67,7 +67,7 @@ nilfs_btnode_create_block(struct address_space *btnc, __u64 blocknr) } int nilfs_btnode_submit_block(struct address_space *btnc, __u64 blocknr, - sector_t pblocknr, int mode, + sector_t pblocknr, int mode, int mode_flags, struct buffer_head **pbh, sector_t *submit_ptr) { struct buffer_head *bh; @@ -100,7 +100,7 @@ int nilfs_btnode_submit_block(struct address_space *btnc, __u64 blocknr, } } - if (mode == READA) { + if (mode_flags & REQ_RAHEAD) { if (pblocknr != *submit_ptr + 1 || !trylock_buffer(bh)) { err = -EBUSY; /* internal code */ brelse(bh); @@ -119,7 +119,7 @@ int nilfs_btnode_submit_block(struct address_space *btnc, __u64 blocknr, bh->b_blocknr = pblocknr; /* set block address for read */ bh->b_end_io = end_buffer_read_sync; get_bh(bh); - submit_bh(mode, bh); + submit_bh(mode, mode_flags, bh); bh->b_blocknr = blocknr; /* set back to the given block address */ *submit_ptr = pblocknr; err = 0; diff --git a/fs/nilfs2/btnode.h b/fs/nilfs2/btnode.h index d876b56..3f93197 100644 --- a/fs/nilfs2/btnode.h +++ b/fs/nilfs2/btnode.h @@ -47,7 +47,7 @@ void nilfs_btnode_cache_clear(struct address_space *); struct buffer_head *nilfs_btnode_create_block(struct address_space *btnc, __u64 blocknr); int nilfs_btnode_submit_block(struct address_space *, __u64, sector_t, int, - struct buffer_head **, sector_t *); + int, struct buffer_head **, sector_t *); void nilfs_btnode_delete(struct buffer_head *); int nilfs_btnode_prepare_change_key(struct address_space *, struct nilfs_btnode_chkey_ctxt *); diff --git a/fs/nilfs2/btree.c b/fs/nilfs2/btree.c index 3a3821b..5d6a2c6 100644 --- a/fs/nilfs2/btree.c +++ b/fs/nilfs2/btree.c @@ -480,7 +480,8 @@ static int __nilfs_btree_get_block(const struct nilfs_bmap *btree, __u64 ptr, sector_t submit_ptr = 0; int ret; - ret = nilfs_btnode_submit_block(btnc, ptr, 0, READ, &bh, &submit_ptr); + ret = nilfs_btnode_submit_block(btnc, ptr, 0, REQ_OP_READ, 0, &bh, + &submit_ptr); if (ret) { if (ret != -EEXIST) return ret; @@ -496,7 +497,8 @@ static int __nilfs_btree_get_block(const struct nilfs_bmap *btree, __u64 ptr, n > 0 && i < ra->ncmax; n--, i++) { ptr2 = nilfs_btree_node_get_ptr(ra->node, i, ra->ncmax); - ret = nilfs_btnode_submit_block(btnc, ptr2, 0, READA, + ret = nilfs_btnode_submit_block(btnc, ptr2, 0, + REQ_OP_READ, REQ_RAHEAD, &ra_bh, &submit_ptr); if (likely(!ret || ret == -EEXIST)) brelse(ra_bh); diff --git a/fs/nilfs2/gcinode.c b/fs/nilfs2/gcinode.c index 0224b78..90be270 100644 --- a/fs/nilfs2/gcinode.c +++ b/fs/nilfs2/gcinode.c @@ -106,7 +106,7 @@ int nilfs_gccache_submit_read_data(struct inode *inode, sector_t blkoff, bh->b_blocknr = pbn; bh->b_end_io = end_buffer_read_sync; get_bh(bh); - submit_bh(READ, bh); + submit_bh(REQ_OP_READ, 0, bh); if (vbn) bh->b_blocknr = vbn; out: @@ -143,7 +143,8 @@ int nilfs_gccache_submit_read_node(struct inode *inode, sector_t pbn, int ret; ret = nilfs_btnode_submit_block(&NILFS_I(inode)->i_btnode_cache, - vbn ? : pbn, pbn, READ, out_bh, &pbn); + vbn ? : pbn, pbn, REQ_OP_READ, 0, + out_bh, &pbn); if (ret == -EEXIST) /* internal code (cache hit) */ ret = 0; return ret; diff --git a/fs/nilfs2/mdt.c b/fs/nilfs2/mdt.c index f6982b9..27aee74 100644 --- a/fs/nilfs2/mdt.c +++ b/fs/nilfs2/mdt.c @@ -124,7 +124,7 @@ static int nilfs_mdt_create_block(struct inode *inode, unsigned long block, static int nilfs_mdt_submit_block(struct inode *inode, unsigned long blkoff, - int mode, struct buffer_head **out_bh) + int mode, int mode_flags, struct buffer_head **out_bh) { struct buffer_head *bh; __u64 blknum = 0; @@ -138,7 +138,7 @@ nilfs_mdt_submit_block(struct inode *inode, unsigned long blkoff, if (buffer_uptodate(bh)) goto out; - if (mode == READA) { + if (mode_flags & REQ_RAHEAD) { if (!trylock_buffer(bh)) { ret = -EBUSY; goto failed_bh; @@ -160,7 +160,7 @@ nilfs_mdt_submit_block(struct inode *inode, unsigned long blkoff, bh->b_end_io = end_buffer_read_sync; get_bh(bh); - submit_bh(mode, bh); + submit_bh(mode, mode_flags, bh); ret = 0; trace_nilfs2_mdt_submit_block(inode, inode->i_ino, blkoff, mode); @@ -184,7 +184,7 @@ static int nilfs_mdt_read_block(struct inode *inode, unsigned long block, int i, nr_ra_blocks = NILFS_MDT_MAX_RA_BLOCKS; int err; - err = nilfs_mdt_submit_block(inode, block, READ, &first_bh); + err = nilfs_mdt_submit_block(inode, block, REQ_OP_READ, 0, &first_bh); if (err == -EEXIST) /* internal code */ goto out; @@ -194,7 +194,8 @@ static int nilfs_mdt_read_block(struct inode *inode, unsigned long block, if (readahead) { blkoff = block + 1; for (i = 0; i < nr_ra_blocks; i++, blkoff++) { - err = nilfs_mdt_submit_block(inode, blkoff, READA, &bh); + err = nilfs_mdt_submit_block(inode, blkoff, REQ_OP_READ, + REQ_RAHEAD, &bh); if (likely(!err || err == -EEXIST)) brelse(bh); else if (err != -EBUSY) diff --git a/fs/ntfs/aops.c b/fs/ntfs/aops.c index 97768a1..fe251f1 100644 --- a/fs/ntfs/aops.c +++ b/fs/ntfs/aops.c @@ -362,7 +362,7 @@ handle_zblock: for (i = 0; i < nr; i++) { tbh = arr[i]; if (likely(!buffer_uptodate(tbh))) - submit_bh(READ, tbh); + submit_bh(REQ_OP_READ, 0, tbh); else ntfs_end_buffer_async_read(tbh, 1); } @@ -877,7 +877,7 @@ lock_retry_remap: do { struct buffer_head *next = bh->b_this_page; if (buffer_async_write(bh)) { - submit_bh(WRITE, bh); + submit_bh(REQ_OP_WRITE, 0, bh); need_end_writeback = false; } bh = next; @@ -1202,7 +1202,7 @@ lock_retry_remap: BUG_ON(!buffer_mapped(tbh)); get_bh(tbh); tbh->b_end_io = end_buffer_write_sync; - submit_bh(WRITE, tbh); + submit_bh(REQ_OP_WRITE, 0, tbh); } /* Synchronize the mft mirror now if not @sync. */ if (is_mft && !sync) diff --git a/fs/ntfs/compress.c b/fs/ntfs/compress.c index f2b5e74..f8eb043 100644 --- a/fs/ntfs/compress.c +++ b/fs/ntfs/compress.c @@ -670,7 +670,7 @@ lock_retry_remap: } get_bh(tbh); tbh->b_end_io = end_buffer_read_sync; - submit_bh(READ, tbh); + submit_bh(REQ_OP_READ, 0, tbh); } /* Wait for io completion on all buffer heads. */ diff --git a/fs/ntfs/file.c b/fs/ntfs/file.c index 91117ad..d96f0c1 100644 --- a/fs/ntfs/file.c +++ b/fs/ntfs/file.c @@ -553,7 +553,7 @@ static inline int ntfs_submit_bh_for_read(struct buffer_head *bh) lock_buffer(bh); get_bh(bh); bh->b_end_io = end_buffer_read_sync; - return submit_bh(READ, bh); + return submit_bh(REQ_OP_READ, 0, bh); } /** diff --git a/fs/ntfs/logfile.c b/fs/ntfs/logfile.c index 9d71213..761f12f 100644 --- a/fs/ntfs/logfile.c +++ b/fs/ntfs/logfile.c @@ -821,7 +821,7 @@ map_vcn: * completed ignore errors afterwards as we can assume * that if one buffer worked all of them will work. */ - submit_bh(WRITE, bh); + submit_bh(REQ_OP_WRITE, 0, bh); if (should_wait) { should_wait = false; wait_on_buffer(bh); diff --git a/fs/ntfs/mft.c b/fs/ntfs/mft.c index 37b2501..d15d492 100644 --- a/fs/ntfs/mft.c +++ b/fs/ntfs/mft.c @@ -592,7 +592,7 @@ int ntfs_sync_mft_mirror(ntfs_volume *vol, const unsigned long mft_no, clear_buffer_dirty(tbh); get_bh(tbh); tbh->b_end_io = end_buffer_write_sync; - submit_bh(WRITE, tbh); + submit_bh(REQ_OP_WRITE, 0, tbh); } /* Wait on i/o completion of buffers. */ for (i_bhs = 0; i_bhs < nr_bhs; i_bhs++) { @@ -785,7 +785,7 @@ int write_mft_record_nolock(ntfs_inode *ni, MFT_RECORD *m, int sync) clear_buffer_dirty(tbh); get_bh(tbh); tbh->b_end_io = end_buffer_write_sync; - submit_bh(WRITE, tbh); + submit_bh(REQ_OP_WRITE, 0, tbh); } /* Synchronize the mft mirror now if not @sync. */ if (!sync && ni->mft_no < vol->mftmirr_size) diff --git a/fs/ocfs2/buffer_head_io.c b/fs/ocfs2/buffer_head_io.c index fe50ded..fb775c9 100644 --- a/fs/ocfs2/buffer_head_io.c +++ b/fs/ocfs2/buffer_head_io.c @@ -79,7 +79,7 @@ int ocfs2_write_block(struct ocfs2_super *osb, struct buffer_head *bh, get_bh(bh); /* for end_buffer_write_sync() */ bh->b_end_io = end_buffer_write_sync; - submit_bh(WRITE, bh); + submit_bh(REQ_OP_WRITE, 0, bh); wait_on_buffer(bh); @@ -149,7 +149,7 @@ int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block, clear_buffer_uptodate(bh); get_bh(bh); /* for end_buffer_read_sync() */ bh->b_end_io = end_buffer_read_sync; - submit_bh(READ, bh); + submit_bh(REQ_OP_READ, 0, bh); } for (i = nr; i > 0; i--) { @@ -305,7 +305,7 @@ int ocfs2_read_blocks(struct ocfs2_caching_info *ci, u64 block, int nr, if (validate) set_buffer_needs_validate(bh); bh->b_end_io = end_buffer_read_sync; - submit_bh(READ, bh); + submit_bh(REQ_OP_READ, 0, bh); continue; } } @@ -419,7 +419,7 @@ int ocfs2_write_super_or_backup(struct ocfs2_super *osb, get_bh(bh); /* for end_buffer_write_sync() */ bh->b_end_io = end_buffer_write_sync; ocfs2_compute_meta_ecc(osb->sb, bh->b_data, &di->i_check); - submit_bh(WRITE, bh); + submit_bh(REQ_OP_WRITE, 0, bh); wait_on_buffer(bh); diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index d5c2e9c..b72c23a 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c @@ -2668,7 +2668,7 @@ static int reiserfs_write_full_page(struct page *page, do { struct buffer_head *next = bh->b_this_page; if (buffer_async_write(bh)) { - submit_bh(WRITE, bh); + submit_bh(REQ_OP_WRITE, 0, bh); nr++; } put_bh(bh); @@ -2728,7 +2728,7 @@ fail: struct buffer_head *next = bh->b_this_page; if (buffer_async_write(bh)) { clear_buffer_dirty(bh); - submit_bh(WRITE, bh); + submit_bh(REQ_OP_WRITE, 0, bh); nr++; } put_bh(bh); diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c index 2ace90e..6945e71 100644 --- a/fs/reiserfs/journal.c +++ b/fs/reiserfs/journal.c @@ -652,7 +652,7 @@ static void submit_logged_buffer(struct buffer_head *bh) BUG(); if (!buffer_uptodate(bh)) BUG(); - submit_bh(WRITE, bh); + submit_bh(REQ_OP_WRITE, 0, bh); } static void submit_ordered_buffer(struct buffer_head *bh) @@ -662,7 +662,7 @@ static void submit_ordered_buffer(struct buffer_head *bh) clear_buffer_dirty(bh); if (!buffer_uptodate(bh)) BUG(); - submit_bh(WRITE, bh); + submit_bh(REQ_OP_WRITE, 0, bh); } #define CHUNK_SIZE 32 @@ -2269,7 +2269,7 @@ abort_replay: /* flush out the real blocks */ for (i = 0; i < get_desc_trans_len(desc); i++) { set_buffer_dirty(real_blocks[i]); - write_dirty_buffer(real_blocks[i], WRITE); + write_dirty_buffer(real_blocks[i], 0); } for (i = 0; i < get_desc_trans_len(desc); i++) { wait_on_buffer(real_blocks[i]); diff --git a/fs/ufs/util.c b/fs/ufs/util.c index a409e3e7..f41ad0a 100644 --- a/fs/ufs/util.c +++ b/fs/ufs/util.c @@ -118,7 +118,7 @@ void ubh_sync_block(struct ufs_buffer_head *ubh) unsigned i; for (i = 0; i < ubh->count; i++) - write_dirty_buffer(ubh->bh[i], WRITE); + write_dirty_buffer(ubh->bh[i], 0); for (i = 0; i < ubh->count; i++) wait_on_buffer(ubh->bh[i]); diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index d48daa3..bc9a45d 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h @@ -189,10 +189,11 @@ void unlock_buffer(struct buffer_head *bh); void __lock_buffer(struct buffer_head *bh); void ll_rw_block(int, int, struct buffer_head * bh[]); int sync_dirty_buffer(struct buffer_head *bh); -int __sync_dirty_buffer(struct buffer_head *bh, int rw); -void write_dirty_buffer(struct buffer_head *bh, int rw); -int _submit_bh(int rw, struct buffer_head *bh, unsigned long bio_flags); -int submit_bh(int, struct buffer_head *); +int __sync_dirty_buffer(struct buffer_head *bh, int op_flags); +void write_dirty_buffer(struct buffer_head *bh, int op_flags); +int _submit_bh(int op, int op_flags, struct buffer_head *bh, + unsigned long bio_flags); +int submit_bh(int, int, struct buffer_head *); void write_boundary_block(struct block_device *bdev, sector_t bblock, unsigned blocksize); int bh_uptodate_or_lock(struct buffer_head *bh); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:40:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E99377CC9 for ; Fri, 15 Apr 2016 05:40:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 32510AC004 for ; Fri, 15 Apr 2016 03:40:25 -0700 (PDT) X-ASG-Debug-ID: 1460716822-04cb6c2462614e70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id fTjGQF6LivRORzgU (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:40:23 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5B8D08553D; Fri, 15 Apr 2016 10:40:22 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe31r010243; Fri, 15 Apr 2016 06:40:20 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 07/42] btrfs: have submit_one_bio users setup bio bi_op Date: Fri, 15 Apr 2016 05:39:27 -0500 X-ASG-Orig-Subj: [PATCH 07/42] btrfs: have submit_one_bio users setup bio bi_op Message-Id: <1460716802-2294-8-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716822 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has btrfs's submit_one_bio callers set the bio->bi_op to a REQ_OP and the bi_rw to rq_flag_bits. The next patches will continue to convert btrfs, so submit_bio_hook and merge_bio_hook related code will be modified to take only the bio. I did not do it in this patch to try and keep it smaller. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- fs/btrfs/extent_io.c | 88 +++++++++++++++++++++++++++------------------------- 1 file changed, 45 insertions(+), 43 deletions(-) diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index fdeb8fa..45fa3be 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -2377,7 +2377,7 @@ static int bio_readpage_error(struct bio *failed_bio, u64 phy_offset, int read_mode; int ret; - BUG_ON(failed_bio->bi_rw & REQ_WRITE); + BUG_ON(failed_bio->bi_op == REQ_OP_WRITE); ret = btrfs_get_io_failure_record(inode, start, end, &failrec); if (ret) @@ -2403,6 +2403,8 @@ static int bio_readpage_error(struct bio *failed_bio, u64 phy_offset, free_io_failure(inode, failrec); return -EIO; } + bio->bi_op = REQ_OP_READ; + bio->bi_rw = read_mode; pr_debug("Repair Read Error: submitting new read[%#x] to this_mirror=%d, in_validation=%d\n", read_mode, failrec->this_mirror, failrec->in_validation); @@ -2714,8 +2716,8 @@ struct bio *btrfs_io_bio_alloc(gfp_t gfp_mask, unsigned int nr_iovecs) } -static int __must_check submit_one_bio(int rw, struct bio *bio, - int mirror_num, unsigned long bio_flags) +static int __must_check submit_one_bio(struct bio *bio, int mirror_num, + unsigned long bio_flags) { int ret = 0; struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1; @@ -2726,12 +2728,12 @@ static int __must_check submit_one_bio(int rw, struct bio *bio, start = page_offset(page) + bvec->bv_offset; bio->bi_private = NULL; - bio->bi_rw = rw; bio_get(bio); if (tree->ops && tree->ops->submit_bio_hook) - ret = tree->ops->submit_bio_hook(page->mapping->host, rw, bio, - mirror_num, bio_flags, start); + ret = tree->ops->submit_bio_hook(page->mapping->host, + bio->bi_rw, bio, mirror_num, + bio_flags, start); else btrfsic_submit_bio(bio); @@ -2739,20 +2741,20 @@ static int __must_check submit_one_bio(int rw, struct bio *bio, return ret; } -static int merge_bio(int rw, struct extent_io_tree *tree, struct page *page, +static int merge_bio(struct extent_io_tree *tree, struct page *page, unsigned long offset, size_t size, struct bio *bio, unsigned long bio_flags) { int ret = 0; if (tree->ops && tree->ops->merge_bio_hook) - ret = tree->ops->merge_bio_hook(rw, page, offset, size, bio, - bio_flags); + ret = tree->ops->merge_bio_hook(bio->bi_op, page, offset, size, + bio, bio_flags); BUG_ON(ret < 0); return ret; } -static int submit_extent_page(int rw, struct extent_io_tree *tree, +static int submit_extent_page(int op, int op_flags, struct extent_io_tree *tree, struct writeback_control *wbc, struct page *page, sector_t sector, size_t size, unsigned long offset, @@ -2780,10 +2782,9 @@ static int submit_extent_page(int rw, struct extent_io_tree *tree, if (prev_bio_flags != bio_flags || !contig || force_bio_submit || - merge_bio(rw, tree, page, offset, page_size, bio, bio_flags) || + merge_bio(tree, page, offset, page_size, bio, bio_flags) || bio_add_page(bio, page, page_size, offset) < page_size) { - ret = submit_one_bio(rw, bio, mirror_num, - prev_bio_flags); + ret = submit_one_bio(bio, mirror_num, prev_bio_flags); if (ret < 0) { *bio_ret = NULL; return ret; @@ -2804,6 +2805,8 @@ static int submit_extent_page(int rw, struct extent_io_tree *tree, bio_add_page(bio, page, page_size, offset); bio->bi_end_io = end_io_func; bio->bi_private = tree; + bio->bi_op = op; + bio->bi_rw = op_flags; if (wbc) { wbc_init_bio(wbc, bio); wbc_account_io(wbc, page, page_size); @@ -2812,7 +2815,7 @@ static int submit_extent_page(int rw, struct extent_io_tree *tree, if (bio_ret) *bio_ret = bio; else - ret = submit_one_bio(rw, bio, mirror_num, bio_flags); + ret = submit_one_bio(bio, mirror_num, bio_flags); return ret; } @@ -2876,7 +2879,7 @@ static int __do_readpage(struct extent_io_tree *tree, get_extent_t *get_extent, struct extent_map **em_cached, struct bio **bio, int mirror_num, - unsigned long *bio_flags, int rw, + unsigned long *bio_flags, int read_flags, u64 *prev_em_start) { struct inode *inode = page->mapping->host; @@ -3059,8 +3062,8 @@ static int __do_readpage(struct extent_io_tree *tree, } pnr -= page->index; - ret = submit_extent_page(rw, tree, NULL, page, - sector, disk_io_size, pg_offset, + ret = submit_extent_page(REQ_OP_READ, read_flags, tree, NULL, + page, sector, disk_io_size, pg_offset, bdev, bio, pnr, end_bio_extent_readpage, mirror_num, *bio_flags, @@ -3091,7 +3094,7 @@ static inline void __do_contiguous_readpages(struct extent_io_tree *tree, get_extent_t *get_extent, struct extent_map **em_cached, struct bio **bio, int mirror_num, - unsigned long *bio_flags, int rw, + unsigned long *bio_flags, u64 *prev_em_start) { struct inode *inode; @@ -3112,7 +3115,7 @@ static inline void __do_contiguous_readpages(struct extent_io_tree *tree, for (index = 0; index < nr_pages; index++) { __do_readpage(tree, pages[index], get_extent, em_cached, bio, - mirror_num, bio_flags, rw, prev_em_start); + mirror_num, bio_flags, 0, prev_em_start); put_page(pages[index]); } } @@ -3122,7 +3125,7 @@ static void __extent_readpages(struct extent_io_tree *tree, int nr_pages, get_extent_t *get_extent, struct extent_map **em_cached, struct bio **bio, int mirror_num, - unsigned long *bio_flags, int rw, + unsigned long *bio_flags, u64 *prev_em_start) { u64 start = 0; @@ -3144,7 +3147,7 @@ static void __extent_readpages(struct extent_io_tree *tree, index - first_index, start, end, get_extent, em_cached, bio, mirror_num, bio_flags, - rw, prev_em_start); + prev_em_start); start = page_start; end = start + PAGE_SIZE - 1; first_index = index; @@ -3155,7 +3158,7 @@ static void __extent_readpages(struct extent_io_tree *tree, __do_contiguous_readpages(tree, &pages[first_index], index - first_index, start, end, get_extent, em_cached, bio, - mirror_num, bio_flags, rw, + mirror_num, bio_flags, prev_em_start); } @@ -3163,7 +3166,7 @@ static int __extent_read_full_page(struct extent_io_tree *tree, struct page *page, get_extent_t *get_extent, struct bio **bio, int mirror_num, - unsigned long *bio_flags, int rw) + unsigned long *bio_flags, int read_flags) { struct inode *inode = page->mapping->host; struct btrfs_ordered_extent *ordered; @@ -3183,7 +3186,7 @@ static int __extent_read_full_page(struct extent_io_tree *tree, } ret = __do_readpage(tree, page, get_extent, NULL, bio, mirror_num, - bio_flags, rw, NULL); + bio_flags, read_flags, NULL); return ret; } @@ -3195,9 +3198,9 @@ int extent_read_full_page(struct extent_io_tree *tree, struct page *page, int ret; ret = __extent_read_full_page(tree, page, get_extent, &bio, mirror_num, - &bio_flags, READ); + &bio_flags, 0); if (bio) - ret = submit_one_bio(READ, bio, mirror_num, bio_flags); + ret = submit_one_bio(bio, mirror_num, bio_flags); return ret; } @@ -3438,7 +3441,8 @@ static noinline_for_stack int __extent_writepage_io(struct inode *inode, page->index, cur, end); } - ret = submit_extent_page(write_flags, tree, wbc, page, + ret = submit_extent_page(REQ_OP_WRITE, write_flags, + tree, wbc, page, sector, iosize, pg_offset, bdev, &epd->bio, max_nr, end_bio_extent_writepage, @@ -3478,13 +3482,11 @@ static int __extent_writepage(struct page *page, struct writeback_control *wbc, size_t pg_offset = 0; loff_t i_size = i_size_read(inode); unsigned long end_index = i_size >> PAGE_SHIFT; - int write_flags; + int write_flags = 0; unsigned long nr_written = 0; if (wbc->sync_mode == WB_SYNC_ALL) write_flags = WRITE_SYNC; - else - write_flags = WRITE; trace___extent_writepage(page, inode, wbc); @@ -3728,7 +3730,7 @@ static noinline_for_stack int write_one_eb(struct extent_buffer *eb, u64 offset = eb->start; unsigned long i, num_pages; unsigned long bio_flags = 0; - int rw = (epd->sync_io ? WRITE_SYNC : WRITE) | REQ_META; + int write_flags = (epd->sync_io ? WRITE_SYNC : 0) | REQ_META; int ret = 0; clear_bit(EXTENT_BUFFER_WRITE_ERR, &eb->bflags); @@ -3742,9 +3744,10 @@ static noinline_for_stack int write_one_eb(struct extent_buffer *eb, clear_page_dirty_for_io(p); set_page_writeback(p); - ret = submit_extent_page(rw, tree, wbc, p, offset >> 9, - PAGE_SIZE, 0, bdev, &epd->bio, - -1, end_bio_extent_buffer_writepage, + ret = submit_extent_page(REQ_OP_WRITE, write_flags, tree, wbc, + p, offset >> 9, PAGE_SIZE, 0, bdev, + &epd->bio, -1, + end_bio_extent_buffer_writepage, 0, epd->bio_flags, bio_flags, false); epd->bio_flags = bio_flags; if (ret) { @@ -4054,13 +4057,13 @@ retry: static void flush_epd_write_bio(struct extent_page_data *epd) { if (epd->bio) { - int rw = WRITE; int ret; + epd->bio->bi_op = REQ_OP_WRITE; if (epd->sync_io) - rw = WRITE_SYNC; + epd->bio->bi_rw = WRITE_SYNC; - ret = submit_one_bio(rw, epd->bio, 0, epd->bio_flags); + ret = submit_one_bio(epd->bio, 0, epd->bio_flags); BUG_ON(ret < 0); /* -ENOMEM */ epd->bio = NULL; } @@ -4187,19 +4190,19 @@ int extent_readpages(struct extent_io_tree *tree, if (nr < ARRAY_SIZE(pagepool)) continue; __extent_readpages(tree, pagepool, nr, get_extent, &em_cached, - &bio, 0, &bio_flags, READ, &prev_em_start); + &bio, 0, &bio_flags, &prev_em_start); nr = 0; } if (nr) __extent_readpages(tree, pagepool, nr, get_extent, &em_cached, - &bio, 0, &bio_flags, READ, &prev_em_start); + &bio, 0, &bio_flags, &prev_em_start); if (em_cached) free_extent_map(em_cached); BUG_ON(!list_empty(pages)); if (bio) - return submit_one_bio(READ, bio, 0, bio_flags); + return submit_one_bio(bio, 0, bio_flags); return 0; } @@ -5221,7 +5224,7 @@ int read_extent_buffer_pages(struct extent_io_tree *tree, err = __extent_read_full_page(tree, page, get_extent, &bio, mirror_num, &bio_flags, - READ | REQ_META); + REQ_META); if (err) ret = err; } else { @@ -5230,8 +5233,7 @@ int read_extent_buffer_pages(struct extent_io_tree *tree, } if (bio) { - err = submit_one_bio(READ | REQ_META, bio, mirror_num, - bio_flags); + err = submit_one_bio(bio, mirror_num, bio_flags); if (err) return err; } -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:40:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5FC867CD3 for ; Fri, 15 Apr 2016 05:40:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 314FC304048 for ; Fri, 15 Apr 2016 03:40:27 -0700 (PDT) X-ASG-Debug-ID: 1460716824-04cbb02e1c2e9770001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id zdB1L9AmF9AcgwmX (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:40:25 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 91A7B7F6B9; Fri, 15 Apr 2016 10:40:24 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe31s010243; Fri, 15 Apr 2016 06:40:22 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 08/42] btrfs: set bi_op tp REQ_OP Date: Fri, 15 Apr 2016 05:39:28 -0500 X-ASG-Orig-Subj: [PATCH 08/42] btrfs: set bi_op tp REQ_OP Message-Id: <1460716802-2294-9-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716825 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has btrfs use the bio bi_op for REQ_OP and bi_rw for rq_flag_bits. v5: - Misset bi_rw to REQ_OP_WRITE in finish_parity_scrub Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- fs/btrfs/check-integrity.c | 19 +++++++++---------- fs/btrfs/compression.c | 4 ++++ fs/btrfs/disk-io.c | 7 ++++--- fs/btrfs/inode.c | 20 +++++++++++++------- fs/btrfs/raid56.c | 10 +++++----- fs/btrfs/scrub.c | 9 +++++---- fs/btrfs/volumes.c | 20 ++++++++++---------- 7 files changed, 50 insertions(+), 39 deletions(-) diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index f82190f..c4a48e8 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c @@ -1673,7 +1673,7 @@ static int btrfsic_read_block(struct btrfsic_state *state, } bio->bi_bdev = block_ctx->dev->bdev; bio->bi_iter.bi_sector = dev_bytenr >> 9; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; for (j = i; j < num_pages; j++) { ret = bio_add_page(bio, block_ctx->pagev[j], @@ -2922,7 +2922,6 @@ int btrfsic_submit_bh(int op, int op_flags, struct buffer_head *bh) static void __btrfsic_submit_bio(struct bio *bio) { struct btrfsic_dev_state *dev_state; - int rw = bio->bi_rw; if (!btrfsic_is_initialized) return; @@ -2932,7 +2931,7 @@ static void __btrfsic_submit_bio(struct bio *bio) * btrfsic_mount(), this might return NULL */ dev_state = btrfsic_dev_state_lookup(bio->bi_bdev); if (NULL != dev_state && - (rw & WRITE) && NULL != bio->bi_io_vec) { + (bio->bi_op == REQ_OP_WRITE) && NULL != bio->bi_io_vec) { unsigned int i; u64 dev_bytenr; u64 cur_bytenr; @@ -2944,9 +2943,9 @@ static void __btrfsic_submit_bio(struct bio *bio) if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) printk(KERN_INFO - "submit_bio(rw=0x%x, bi_vcnt=%u," + "submit_bio(rw=%d,0x%lx, bi_vcnt=%u," " bi_sector=%llu (bytenr %llu), bi_bdev=%p)\n", - rw, bio->bi_vcnt, + bio->bi_op, bio->bi_rw, bio->bi_vcnt, (unsigned long long)bio->bi_iter.bi_sector, dev_bytenr, bio->bi_bdev); @@ -2977,18 +2976,18 @@ static void __btrfsic_submit_bio(struct bio *bio) btrfsic_process_written_block(dev_state, dev_bytenr, mapped_datav, bio->bi_vcnt, bio, &bio_is_patched, - NULL, rw); + NULL, bio->bi_rw); while (i > 0) { i--; kunmap(bio->bi_io_vec[i].bv_page); } kfree(mapped_datav); - } else if (NULL != dev_state && (rw & REQ_FLUSH)) { + } else if (NULL != dev_state && (bio->bi_rw & REQ_FLUSH)) { if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) printk(KERN_INFO - "submit_bio(rw=0x%x FLUSH, bdev=%p)\n", - rw, bio->bi_bdev); + "submit_bio(rw=%d,0x%lx FLUSH, bdev=%p)\n", + bio->bi_op, bio->bi_rw, bio->bi_bdev); if (!dev_state->dummy_block_for_bio_bh_flush.is_iodone) { if ((dev_state->state->print_mask & (BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH | @@ -3006,7 +3005,7 @@ static void __btrfsic_submit_bio(struct bio *bio) block->never_written = 0; block->iodone_w_error = 0; block->flush_gen = dev_state->last_flush_gen + 1; - block->submit_bio_bh_rw = rw; + block->submit_bio_bh_rw = bio->bi_rw; block->orig_bio_bh_private = bio->bi_private; block->orig_bio_bh_end_io.bio = bio->bi_end_io; block->next_in_same_bio = NULL; diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index ff61a41..334a00c 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c @@ -363,6 +363,7 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start, kfree(cb); return -ENOMEM; } + bio->bi_op = REQ_OP_WRITE; bio->bi_private = cb; bio->bi_end_io = end_compressed_bio_write; atomic_inc(&cb->pending_bios); @@ -408,6 +409,7 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start, bio = compressed_bio_alloc(bdev, first_byte, GFP_NOFS); BUG_ON(!bio); + bio->bi_op = REQ_OP_WRITE; bio->bi_private = cb; bio->bi_end_io = end_compressed_bio_write; bio_add_page(bio, page, PAGE_SIZE, 0); @@ -646,6 +648,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, comp_bio = compressed_bio_alloc(bdev, cur_disk_byte, GFP_NOFS); if (!comp_bio) goto fail2; + comp_bio->bi_op = REQ_OP_READ; comp_bio->bi_private = cb; comp_bio->bi_end_io = end_compressed_bio_read; atomic_inc(&cb->pending_bios); @@ -699,6 +702,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, comp_bio = compressed_bio_alloc(bdev, cur_disk_byte, GFP_NOFS); BUG_ON(!comp_bio); + comp_bio->bi_op = REQ_OP_READ; comp_bio->bi_private = cb; comp_bio->bi_end_io = end_compressed_bio_read; diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 9a13c85..932268b 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -727,7 +727,7 @@ static void end_workqueue_bio(struct bio *bio) fs_info = end_io_wq->info; end_io_wq->error = bio->bi_error; - if (bio->bi_rw & REQ_WRITE) { + if (bio->bi_op == REQ_OP_WRITE) { if (end_io_wq->metadata == BTRFS_WQ_ENDIO_METADATA) { wq = fs_info->endio_meta_write_workers; func = btrfs_endio_meta_write_helper; @@ -873,7 +873,7 @@ int btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, struct inode *inode, atomic_inc(&fs_info->nr_async_submits); - if (rw & REQ_SYNC) + if (bio->bi_rw & REQ_SYNC) btrfs_set_work_high_priority(&async->work); btrfs_queue_work(fs_info->workers, &async->work); @@ -951,7 +951,7 @@ static int btree_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, int async = check_async_write(inode, bio_flags); int ret; - if (!(rw & REQ_WRITE)) { + if (bio->bi_op != REQ_OP_WRITE) { /* * called for a read, do the setup so that checksum validation * can happen in the async kernel threads @@ -3476,6 +3476,7 @@ static int write_dev_flush(struct btrfs_device *device, int wait) bio->bi_end_io = btrfs_end_empty_barrier; bio->bi_bdev = device->bdev; + bio->bi_op = REQ_OP_WRITE; bio->bi_rw = WRITE_FLUSH; init_completion(&device->flush_wait); bio->bi_private = &device->flush_wait; diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index d999fdf..f693490 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -1894,7 +1894,7 @@ static int btrfs_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, if (btrfs_is_free_space_inode(inode)) metadata = BTRFS_WQ_ENDIO_FREE_SPACE; - if (!(rw & REQ_WRITE)) { + if (bio->bi_op != REQ_OP_WRITE) { ret = btrfs_bio_wq_end_io(root->fs_info, bio, metadata); if (ret) goto out; @@ -7751,7 +7751,7 @@ static inline int submit_dio_repair_bio(struct inode *inode, struct bio *bio, struct btrfs_root *root = BTRFS_I(inode)->root; int ret; - BUG_ON(rw & REQ_WRITE); + BUG_ON(bio->bi_op == REQ_OP_WRITE); bio_get(bio); @@ -7811,7 +7811,7 @@ static int dio_read_error(struct inode *inode, struct bio *failed_bio, int read_mode; int ret; - BUG_ON(failed_bio->bi_rw & REQ_WRITE); + BUG_ON(failed_bio->bi_op == REQ_OP_WRITE); ret = btrfs_get_io_failure_record(inode, start, end, &failrec); if (ret) @@ -7839,6 +7839,8 @@ static int dio_read_error(struct inode *inode, struct bio *failed_bio, free_io_failure(inode, failrec); return -EIO; } + bio->bi_op = REQ_OP_READ; + bio->bi_rw = read_mode; btrfs_debug(BTRFS_I(inode)->root->fs_info, "Repair DIO Read Error: submitting new dio read[%#x] to this_mirror=%d, in_validation=%d\n", @@ -8153,8 +8155,8 @@ static void btrfs_end_dio_bio(struct bio *bio) if (err) btrfs_warn(BTRFS_I(dip->inode)->root->fs_info, - "direct IO failed ino %llu rw %lu sector %#Lx len %u err no %d", - btrfs_ino(dip->inode), bio->bi_rw, + "direct IO failed ino %llu rw %d,%lu sector %#Lx len %u err no %d", + btrfs_ino(dip->inode), bio->bi_op, bio->bi_rw, (unsigned long long)bio->bi_iter.bi_sector, bio->bi_iter.bi_size, err); @@ -8232,7 +8234,7 @@ static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, int async_submit) { struct btrfs_dio_private *dip = bio->bi_private; - int write = rw & REQ_WRITE; + bool write = bio->bi_op == REQ_OP_WRITE; struct btrfs_root *root = BTRFS_I(inode)->root; int ret; @@ -8319,6 +8321,8 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, if (!bio) return -ENOMEM; + bio->bi_op = orig_bio->bi_op; + bio->bi_rw = orig_bio->bi_rw; bio->bi_private = dip; bio->bi_end_io = btrfs_end_dio_bio; btrfs_io_bio(bio)->logical = file_offset; @@ -8356,12 +8360,14 @@ next_block: start_sector, GFP_NOFS); if (!bio) goto out_err; + bio->bi_op = orig_bio->bi_op; + bio->bi_rw = orig_bio->bi_rw; bio->bi_private = dip; bio->bi_end_io = btrfs_end_dio_bio; btrfs_io_bio(bio)->logical = file_offset; map_length = orig_bio->bi_iter.bi_size; - ret = btrfs_map_block(root->fs_info, rw, + ret = btrfs_map_block(root->fs_info, orig_bio->bi_op, start_sector << 9, &map_length, NULL, 0); if (ret) { diff --git a/fs/btrfs/raid56.c b/fs/btrfs/raid56.c index 439d7eb..dea2dd9 100644 --- a/fs/btrfs/raid56.c +++ b/fs/btrfs/raid56.c @@ -1320,7 +1320,7 @@ write_data: bio->bi_private = rbio; bio->bi_end_io = raid_write_end_io; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; submit_bio(bio); } @@ -1575,7 +1575,7 @@ static int raid56_rmw_stripe(struct btrfs_raid_bio *rbio) bio->bi_private = rbio; bio->bi_end_io = raid_rmw_end_io; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; btrfs_bio_wq_end_io(rbio->fs_info, bio, BTRFS_WQ_ENDIO_RAID56); @@ -2100,7 +2100,7 @@ static int __raid56_parity_recover(struct btrfs_raid_bio *rbio) bio->bi_private = rbio; bio->bi_end_io = raid_recover_end_io; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; btrfs_bio_wq_end_io(rbio->fs_info, bio, BTRFS_WQ_ENDIO_RAID56); @@ -2437,7 +2437,7 @@ submit_write: bio->bi_private = rbio; bio->bi_end_io = raid_write_end_io; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; submit_bio(bio); } @@ -2616,7 +2616,7 @@ static void raid56_parity_scrub_stripe(struct btrfs_raid_bio *rbio) bio->bi_private = rbio; bio->bi_end_io = raid56_parity_scrub_end_io; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; btrfs_bio_wq_end_io(rbio->fs_info, bio, BTRFS_WQ_ENDIO_RAID56); diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 184cb57..155b547 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -1504,7 +1504,7 @@ static void scrub_recheck_block(struct btrfs_fs_info *fs_info, sblock->no_io_error_seen = 0; } else { bio->bi_iter.bi_sector = page->physical >> 9; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; if (btrfsic_submit_bio_wait(bio)) sblock->no_io_error_seen = 0; @@ -1584,7 +1584,7 @@ static int scrub_repair_page_from_good_copy(struct scrub_block *sblock_bad, return -EIO; bio->bi_bdev = page_bad->dev->bdev; bio->bi_iter.bi_sector = page_bad->physical >> 9; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; ret = bio_add_page(bio, page_good->page, PAGE_SIZE, 0); if (PAGE_SIZE != ret) { @@ -1686,7 +1686,7 @@ again: bio->bi_end_io = scrub_wr_bio_end_io; bio->bi_bdev = sbio->dev->bdev; bio->bi_iter.bi_sector = sbio->physical >> 9; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; sbio->err = 0; } else if (sbio->physical + sbio->page_count * PAGE_SIZE != spage->physical_for_dev_replace || @@ -2091,7 +2091,7 @@ again: bio->bi_end_io = scrub_bio_end_io; bio->bi_bdev = sbio->dev->bdev; bio->bi_iter.bi_sector = sbio->physical >> 9; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; sbio->err = 0; } else if (sbio->physical + sbio->page_count * PAGE_SIZE != spage->physical || @@ -4393,6 +4393,7 @@ static int write_page_nocow(struct scrub_ctx *sctx, bio->bi_iter.bi_size = 0; bio->bi_iter.bi_sector = physical_for_dev_replace >> 9; bio->bi_bdev = dev->bdev; + bio->bi_op = REQ_OP_WRITE; bio->bi_rw = WRITE_SYNC; ret = bio_add_page(bio, page, PAGE_SIZE, 0); if (ret != PAGE_SIZE) { diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 318215d..96fdf4b 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -5884,7 +5884,7 @@ static void btrfs_end_bio(struct bio *bio) BUG_ON(stripe_index >= bbio->num_stripes); dev = bbio->stripes[stripe_index].dev; if (dev->bdev) { - if (bio->bi_rw & WRITE) + if (bio->bi_op == REQ_OP_WRITE) btrfs_dev_stat_inc(dev, BTRFS_DEV_STAT_WRITE_ERRS); else @@ -5949,7 +5949,7 @@ static noinline void btrfs_schedule_bio(struct btrfs_root *root, } /* don't bother with additional async steps for reads, right now */ - if (!(bio->bi_rw & REQ_WRITE)) { + if (bio->bi_op == REQ_OP_READ) { bio_get(bio); btrfsic_submit_bio(bio); bio_put(bio); @@ -5998,15 +5998,14 @@ static void submit_stripe_bio(struct btrfs_root *root, struct btrfs_bio *bbio, btrfs_io_bio(bio)->stripe_index = dev_nr; bio->bi_end_io = btrfs_end_bio; bio->bi_iter.bi_sector = physical >> 9; - bio->bi_rw |= rw; #ifdef DEBUG { struct rcu_string *name; rcu_read_lock(); name = rcu_dereference(dev->name); - pr_debug("btrfs_map_bio: rw %d, sector=%llu, dev=%lu " - "(%s id %llu), size=%u\n", rw, + pr_debug("btrfs_map_bio: rw %d 0x%x, sector=%llu, dev=%lu " + "(%s id %llu), size=%u\n", bio->bi_op, bio->bi_rw, (u64)bio->bi_iter.bi_sector, (u_long)dev->bdev->bd_dev, name->str, dev->devid, bio->bi_iter.bi_size); rcu_read_unlock(); @@ -6053,8 +6052,8 @@ int btrfs_map_bio(struct btrfs_root *root, int rw, struct bio *bio, map_length = length; btrfs_bio_counter_inc_blocked(root->fs_info); - ret = __btrfs_map_block(root->fs_info, rw, logical, &map_length, &bbio, - mirror_num, 1); + ret = __btrfs_map_block(root->fs_info, bio->bi_op, logical, + &map_length, &bbio, mirror_num, 1); if (ret) { btrfs_bio_counter_dec(root->fs_info); return ret; @@ -6068,10 +6067,10 @@ int btrfs_map_bio(struct btrfs_root *root, int rw, struct bio *bio, atomic_set(&bbio->stripes_pending, bbio->num_stripes); if ((bbio->map_type & BTRFS_BLOCK_GROUP_RAID56_MASK) && - ((rw & WRITE) || (mirror_num > 1))) { + ((bio->bi_op == REQ_OP_WRITE) || (mirror_num > 1))) { /* In this case, map_length has been set to the length of a single stripe; not the whole write */ - if (rw & WRITE) { + if (bio->bi_op == REQ_OP_WRITE) { ret = raid56_parity_write(root, bio, bbio, map_length); } else { ret = raid56_parity_recover(root, bio, bbio, map_length, @@ -6090,7 +6089,8 @@ int btrfs_map_bio(struct btrfs_root *root, int rw, struct bio *bio, for (dev_nr = 0; dev_nr < total_devs; dev_nr++) { dev = bbio->stripes[dev_nr].dev; - if (!dev || !dev->bdev || (rw & WRITE && !dev->writeable)) { + if (!dev || !dev->bdev || + (bio->bi_op == REQ_OP_WRITE && !dev->writeable)) { bbio_error(bbio, first_bio, logical); continue; } -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:40:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9A7E57CCF for ; Fri, 15 Apr 2016 05:40:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 032F6AC005 for ; Fri, 15 Apr 2016 03:40:31 -0700 (PDT) X-ASG-Debug-ID: 1460716827-04cbb02e1a2e9770001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QHoVW5bYEwIAAuSh (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:40:27 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D85F7155B9; Fri, 15 Apr 2016 10:40:26 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe31t010243; Fri, 15 Apr 2016 06:40:24 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 09/42] btrfs: update __btrfs_map_block for bi_op transition Date: Fri, 15 Apr 2016 05:39:29 -0500 X-ASG-Orig-Subj: [PATCH 09/42] btrfs: update __btrfs_map_block for bi_op transition Message-Id: <1460716802-2294-10-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716827 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie We no longer pass in a bitmap of rq_flag_bits bits to __btrfs_map_block. It will always be a REQ_OP, or the btrfs specific REQ_GET_READ_MIRRORS, so this drops the bit tests. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- fs/btrfs/extent-tree.c | 2 +- fs/btrfs/inode.c | 2 +- fs/btrfs/volumes.c | 55 +++++++++++++++++++++++++++----------------------- fs/btrfs/volumes.h | 4 ++-- 4 files changed, 34 insertions(+), 29 deletions(-) diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 99decfb..f4bc8c1 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -2053,7 +2053,7 @@ int btrfs_discard_extent(struct btrfs_root *root, u64 bytenr, /* Tell the block device(s) that the sectors can be discarded */ - ret = btrfs_map_block(root->fs_info, REQ_DISCARD, + ret = btrfs_map_block(root->fs_info, REQ_OP_DISCARD, bytenr, &num_bytes, &bbio, 0); /* Error condition is -ENOMEM */ if (!ret) { diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index f693490..c2dc75b 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -8300,7 +8300,7 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, int i; map_length = orig_bio->bi_iter.bi_size; - ret = btrfs_map_block(root->fs_info, rw, start_sector << 9, + ret = btrfs_map_block(root->fs_info, orig_bio->bi_op, start_sector << 9, &map_length, NULL, 0); if (ret) return -EIO; diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 96fdf4b..dc56558 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -5212,7 +5212,7 @@ void btrfs_put_bbio(struct btrfs_bio *bbio) kfree(bbio); } -static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, +static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int op, u64 logical, u64 *length, struct btrfs_bio **bbio_ret, int mirror_num, int need_raid_map) @@ -5290,7 +5290,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, raid56_full_stripe_start *= full_stripe_len; } - if (rw & REQ_DISCARD) { + if (op == REQ_OP_DISCARD) { /* we don't discard raid56 yet */ if (map->type & BTRFS_BLOCK_GROUP_RAID56_MASK) { ret = -EOPNOTSUPP; @@ -5303,7 +5303,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, For other RAID types and for RAID[56] reads, just allow a single stripe (on a single disk). */ if ((map->type & BTRFS_BLOCK_GROUP_RAID56_MASK) && - (rw & REQ_WRITE)) { + (op == REQ_OP_WRITE)) { max_len = stripe_len * nr_data_stripes(map) - (offset - raid56_full_stripe_start); } else { @@ -5328,8 +5328,8 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, btrfs_dev_replace_set_lock_blocking(dev_replace); if (dev_replace_is_ongoing && mirror_num == map->num_stripes + 1 && - !(rw & (REQ_WRITE | REQ_DISCARD | REQ_GET_READ_MIRRORS)) && - dev_replace->tgtdev != NULL) { + op != REQ_OP_WRITE && op != REQ_OP_DISCARD && + op != REQ_GET_READ_MIRRORS && dev_replace->tgtdev != NULL) { /* * in dev-replace case, for repair case (that's the only * case where the mirror is selected explicitly when @@ -5416,15 +5416,17 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, (offset + *length); if (map->type & BTRFS_BLOCK_GROUP_RAID0) { - if (rw & REQ_DISCARD) + if (op == REQ_OP_DISCARD) num_stripes = min_t(u64, map->num_stripes, stripe_nr_end - stripe_nr_orig); stripe_nr = div_u64_rem(stripe_nr, map->num_stripes, &stripe_index); - if (!(rw & (REQ_WRITE | REQ_DISCARD | REQ_GET_READ_MIRRORS))) + if (op != REQ_OP_WRITE && op != REQ_OP_DISCARD && + op != REQ_GET_READ_MIRRORS) mirror_num = 1; } else if (map->type & BTRFS_BLOCK_GROUP_RAID1) { - if (rw & (REQ_WRITE | REQ_DISCARD | REQ_GET_READ_MIRRORS)) + if (op == REQ_OP_WRITE || op == REQ_OP_DISCARD || + op == REQ_GET_READ_MIRRORS) num_stripes = map->num_stripes; else if (mirror_num) stripe_index = mirror_num - 1; @@ -5437,7 +5439,8 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, } } else if (map->type & BTRFS_BLOCK_GROUP_DUP) { - if (rw & (REQ_WRITE | REQ_DISCARD | REQ_GET_READ_MIRRORS)) { + if (op == REQ_OP_WRITE || REQ_OP_DISCARD || + op == REQ_GET_READ_MIRRORS) { num_stripes = map->num_stripes; } else if (mirror_num) { stripe_index = mirror_num - 1; @@ -5451,9 +5454,9 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, stripe_nr = div_u64_rem(stripe_nr, factor, &stripe_index); stripe_index *= map->sub_stripes; - if (rw & (REQ_WRITE | REQ_GET_READ_MIRRORS)) + if (op == REQ_OP_WRITE || op == REQ_GET_READ_MIRRORS) num_stripes = map->sub_stripes; - else if (rw & REQ_DISCARD) + else if (op == REQ_OP_DISCARD) num_stripes = min_t(u64, map->sub_stripes * (stripe_nr_end - stripe_nr_orig), map->num_stripes); @@ -5471,7 +5474,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, } else if (map->type & BTRFS_BLOCK_GROUP_RAID56_MASK) { if (need_raid_map && - ((rw & (REQ_WRITE | REQ_GET_READ_MIRRORS)) || + (op == REQ_OP_WRITE || op == REQ_GET_READ_MIRRORS || mirror_num > 1)) { /* push stripe_nr back to the start of the full stripe */ stripe_nr = div_u64(raid56_full_stripe_start, @@ -5499,8 +5502,8 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, /* We distribute the parity blocks across stripes */ div_u64_rem(stripe_nr + stripe_index, map->num_stripes, &stripe_index); - if (!(rw & (REQ_WRITE | REQ_DISCARD | - REQ_GET_READ_MIRRORS)) && mirror_num <= 1) + if ((op != REQ_OP_WRITE && op != REQ_OP_DISCARD && + op != REQ_GET_READ_MIRRORS) && mirror_num <= 1) mirror_num = 1; } } else { @@ -5517,9 +5520,9 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, num_alloc_stripes = num_stripes; if (dev_replace_is_ongoing) { - if (rw & (REQ_WRITE | REQ_DISCARD)) + if (op == REQ_OP_WRITE || op == REQ_OP_DISCARD) num_alloc_stripes <<= 1; - if (rw & REQ_GET_READ_MIRRORS) + if (op == REQ_GET_READ_MIRRORS) num_alloc_stripes++; tgtdev_indexes = num_stripes; } @@ -5534,7 +5537,8 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, /* build raid_map */ if (map->type & BTRFS_BLOCK_GROUP_RAID56_MASK && - need_raid_map && ((rw & (REQ_WRITE | REQ_GET_READ_MIRRORS)) || + need_raid_map && + ((op == REQ_OP_WRITE || op == REQ_GET_READ_MIRRORS) || mirror_num > 1)) { u64 tmp; unsigned rot; @@ -5559,7 +5563,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, RAID6_Q_STRIPE; } - if (rw & REQ_DISCARD) { + if (op == REQ_OP_DISCARD) { u32 factor = 0; u32 sub_stripes = 0; u64 stripes_per_dev = 0; @@ -5639,14 +5643,15 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, } } - if (rw & (REQ_WRITE | REQ_GET_READ_MIRRORS)) + if (op == REQ_OP_WRITE || op == REQ_GET_READ_MIRRORS) max_errors = btrfs_chunk_max_errors(map); if (bbio->raid_map) sort_parity_stripes(bbio, num_stripes); tgtdev_indexes = 0; - if (dev_replace_is_ongoing && (rw & (REQ_WRITE | REQ_DISCARD)) && + if (dev_replace_is_ongoing && + (op == REQ_OP_WRITE || op == REQ_OP_DISCARD) && dev_replace->tgtdev != NULL) { int index_where_to_add; u64 srcdev_devid = dev_replace->srcdev->devid; @@ -5681,7 +5686,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, } } num_stripes = index_where_to_add; - } else if (dev_replace_is_ongoing && (rw & REQ_GET_READ_MIRRORS) && + } else if (dev_replace_is_ongoing && (op == REQ_GET_READ_MIRRORS) && dev_replace->tgtdev != NULL) { u64 srcdev_devid = dev_replace->srcdev->devid; int index_srcdev = 0; @@ -5756,21 +5761,21 @@ out: return ret; } -int btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, +int btrfs_map_block(struct btrfs_fs_info *fs_info, int op, u64 logical, u64 *length, struct btrfs_bio **bbio_ret, int mirror_num) { - return __btrfs_map_block(fs_info, rw, logical, length, bbio_ret, + return __btrfs_map_block(fs_info, op, logical, length, bbio_ret, mirror_num, 0); } /* For Scrub/replace */ -int btrfs_map_sblock(struct btrfs_fs_info *fs_info, int rw, +int btrfs_map_sblock(struct btrfs_fs_info *fs_info, int op, u64 logical, u64 *length, struct btrfs_bio **bbio_ret, int mirror_num, int need_raid_map) { - return __btrfs_map_block(fs_info, rw, logical, length, bbio_ret, + return __btrfs_map_block(fs_info, op, logical, length, bbio_ret, mirror_num, need_raid_map); } diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h index febdb7b..c64229e 100644 --- a/fs/btrfs/volumes.h +++ b/fs/btrfs/volumes.h @@ -421,10 +421,10 @@ int btrfs_account_dev_extents_size(struct btrfs_device *device, u64 start, u64 end, u64 *length); void btrfs_get_bbio(struct btrfs_bio *bbio); void btrfs_put_bbio(struct btrfs_bio *bbio); -int btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, +int btrfs_map_block(struct btrfs_fs_info *fs_info, int op, u64 logical, u64 *length, struct btrfs_bio **bbio_ret, int mirror_num); -int btrfs_map_sblock(struct btrfs_fs_info *fs_info, int rw, +int btrfs_map_sblock(struct btrfs_fs_info *fs_info, int op, u64 logical, u64 *length, struct btrfs_bio **bbio_ret, int mirror_num, int need_raid_map); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:40:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7DC917CBE for ; Fri, 15 Apr 2016 05:40:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 450CB8F8039 for ; Fri, 15 Apr 2016 03:40:32 -0700 (PDT) X-ASG-Debug-ID: 1460716829-04cbb02e1d2e9790001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id B5ujooKkmNVaI3jw (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:40:29 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1CB4A8F511; Fri, 15 Apr 2016 10:40:29 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe31u010243; Fri, 15 Apr 2016 06:40:26 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 10/42] btrfs: use bio fields for op and flags Date: Fri, 15 Apr 2016 05:39:30 -0500 X-ASG-Orig-Subj: [PATCH 10/42] btrfs: use bio fields for op and flags Message-Id: <1460716802-2294-11-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716829 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie The bio bi_op and bi_rw is now setup, so there is no need to pass around the rq_flag_bits bits too. btrfs users should should access the bio. v2: 1. Fix merge_bio issue where instead of removing rw/op argument I passed it in again to the merge_bio related functions. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- fs/btrfs/compression.c | 13 ++++++------- fs/btrfs/ctree.h | 2 +- fs/btrfs/disk-io.c | 30 ++++++++++++------------------ fs/btrfs/disk-io.h | 2 +- fs/btrfs/extent_io.c | 12 +++++------- fs/btrfs/extent_io.h | 8 ++++---- fs/btrfs/inode.c | 44 ++++++++++++++++++++------------------------ fs/btrfs/volumes.c | 6 +++--- fs/btrfs/volumes.h | 2 +- 9 files changed, 53 insertions(+), 66 deletions(-) diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index 334a00c..356ac36 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c @@ -374,7 +374,7 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start, page = compressed_pages[pg_index]; page->mapping = inode->i_mapping; if (bio->bi_iter.bi_size) - ret = io_tree->ops->merge_bio_hook(WRITE, page, 0, + ret = io_tree->ops->merge_bio_hook(page, 0, PAGE_SIZE, bio, 0); else @@ -402,7 +402,7 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start, BUG_ON(ret); /* -ENOMEM */ } - ret = btrfs_map_bio(root, WRITE, bio, 0, 1); + ret = btrfs_map_bio(root, bio, 0, 1); BUG_ON(ret); /* -ENOMEM */ bio_put(bio); @@ -433,7 +433,7 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start, BUG_ON(ret); /* -ENOMEM */ } - ret = btrfs_map_bio(root, WRITE, bio, 0, 1); + ret = btrfs_map_bio(root, bio, 0, 1); BUG_ON(ret); /* -ENOMEM */ bio_put(bio); @@ -659,7 +659,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, page->index = em_start >> PAGE_SHIFT; if (comp_bio->bi_iter.bi_size) - ret = tree->ops->merge_bio_hook(READ, page, 0, + ret = tree->ops->merge_bio_hook(page, 0, PAGE_SIZE, comp_bio, 0); else @@ -690,8 +690,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, sums += DIV_ROUND_UP(comp_bio->bi_iter.bi_size, root->sectorsize); - ret = btrfs_map_bio(root, READ, comp_bio, - mirror_num, 0); + ret = btrfs_map_bio(root, comp_bio, mirror_num, 0); if (ret) { bio->bi_error = ret; bio_endio(comp_bio); @@ -721,7 +720,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, BUG_ON(ret); /* -ENOMEM */ } - ret = btrfs_map_bio(root, READ, comp_bio, mirror_num, 0); + ret = btrfs_map_bio(root, comp_bio, mirror_num, 0); if (ret) { bio->bi_error = ret; bio_endio(comp_bio); diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index a0c6aca..4e50f59 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -4087,7 +4087,7 @@ int btrfs_create_subvol_root(struct btrfs_trans_handle *trans, struct btrfs_root *new_root, struct btrfs_root *parent_root, u64 new_dirid); -int btrfs_merge_bio_hook(int rw, struct page *page, unsigned long offset, +int btrfs_merge_bio_hook(struct page *page, unsigned long offset, size_t size, struct bio *bio, unsigned long bio_flags); int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf); diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 932268b..bea6df6 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -124,7 +124,6 @@ struct async_submit_bio { struct list_head list; extent_submit_bio_hook_t *submit_bio_start; extent_submit_bio_hook_t *submit_bio_done; - int rw; int mirror_num; unsigned long bio_flags; /* @@ -797,7 +796,7 @@ static void run_one_async_start(struct btrfs_work *work) int ret; async = container_of(work, struct async_submit_bio, work); - ret = async->submit_bio_start(async->inode, async->rw, async->bio, + ret = async->submit_bio_start(async->inode, async->bio, async->mirror_num, async->bio_flags, async->bio_offset); if (ret) @@ -830,9 +829,8 @@ static void run_one_async_done(struct btrfs_work *work) return; } - async->submit_bio_done(async->inode, async->rw, async->bio, - async->mirror_num, async->bio_flags, - async->bio_offset); + async->submit_bio_done(async->inode, async->bio, async->mirror_num, + async->bio_flags, async->bio_offset); } static void run_one_async_free(struct btrfs_work *work) @@ -844,7 +842,7 @@ static void run_one_async_free(struct btrfs_work *work) } int btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, struct inode *inode, - int rw, struct bio *bio, int mirror_num, + struct bio *bio, int mirror_num, unsigned long bio_flags, u64 bio_offset, extent_submit_bio_hook_t *submit_bio_start, @@ -857,7 +855,6 @@ int btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, struct inode *inode, return -ENOMEM; async->inode = inode; - async->rw = rw; async->bio = bio; async->mirror_num = mirror_num; async->submit_bio_start = submit_bio_start; @@ -903,9 +900,8 @@ static int btree_csum_one_bio(struct bio *bio) return ret; } -static int __btree_submit_bio_start(struct inode *inode, int rw, - struct bio *bio, int mirror_num, - unsigned long bio_flags, +static int __btree_submit_bio_start(struct inode *inode, struct bio *bio, + int mirror_num, unsigned long bio_flags, u64 bio_offset) { /* @@ -915,7 +911,7 @@ static int __btree_submit_bio_start(struct inode *inode, int rw, return btree_csum_one_bio(bio); } -static int __btree_submit_bio_done(struct inode *inode, int rw, struct bio *bio, +static int __btree_submit_bio_done(struct inode *inode, struct bio *bio, int mirror_num, unsigned long bio_flags, u64 bio_offset) { @@ -925,7 +921,7 @@ static int __btree_submit_bio_done(struct inode *inode, int rw, struct bio *bio, * when we're called for a write, we're already in the async * submission context. Just jump into btrfs_map_bio */ - ret = btrfs_map_bio(BTRFS_I(inode)->root, rw, bio, mirror_num, 1); + ret = btrfs_map_bio(BTRFS_I(inode)->root, bio, mirror_num, 1); if (ret) { bio->bi_error = ret; bio_endio(bio); @@ -944,7 +940,7 @@ static int check_async_write(struct inode *inode, unsigned long bio_flags) return 1; } -static int btree_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, +static int btree_submit_bio_hook(struct inode *inode, struct bio *bio, int mirror_num, unsigned long bio_flags, u64 bio_offset) { @@ -960,21 +956,19 @@ static int btree_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, bio, BTRFS_WQ_ENDIO_METADATA); if (ret) goto out_w_error; - ret = btrfs_map_bio(BTRFS_I(inode)->root, rw, bio, - mirror_num, 0); + ret = btrfs_map_bio(BTRFS_I(inode)->root, bio, mirror_num, 0); } else if (!async) { ret = btree_csum_one_bio(bio); if (ret) goto out_w_error; - ret = btrfs_map_bio(BTRFS_I(inode)->root, rw, bio, - mirror_num, 0); + ret = btrfs_map_bio(BTRFS_I(inode)->root, bio, mirror_num, 0); } else { /* * kthread helpers are used to submit writes so that * checksumming can happen in parallel across all CPUs */ ret = btrfs_wq_submit_bio(BTRFS_I(inode)->root->fs_info, - inode, rw, bio, mirror_num, 0, + inode, bio, mirror_num, 0, bio_offset, __btree_submit_bio_start, __btree_submit_bio_done); diff --git a/fs/btrfs/disk-io.h b/fs/btrfs/disk-io.h index 8e79d00..73c21a2 100644 --- a/fs/btrfs/disk-io.h +++ b/fs/btrfs/disk-io.h @@ -122,7 +122,7 @@ void btrfs_csum_final(u32 crc, char *result); int btrfs_bio_wq_end_io(struct btrfs_fs_info *info, struct bio *bio, enum btrfs_wq_endio_type metadata); int btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, struct inode *inode, - int rw, struct bio *bio, int mirror_num, + struct bio *bio, int mirror_num, unsigned long bio_flags, u64 bio_offset, extent_submit_bio_hook_t *submit_bio_start, extent_submit_bio_hook_t *submit_bio_done); diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 45fa3be..3bac80d 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -2409,8 +2409,7 @@ static int bio_readpage_error(struct bio *failed_bio, u64 phy_offset, pr_debug("Repair Read Error: submitting new read[%#x] to this_mirror=%d, in_validation=%d\n", read_mode, failrec->this_mirror, failrec->in_validation); - ret = tree->ops->submit_bio_hook(inode, read_mode, bio, - failrec->this_mirror, + ret = tree->ops->submit_bio_hook(inode, bio, failrec->this_mirror, failrec->bio_flags, 0); if (ret) { free_io_failure(inode, failrec); @@ -2731,9 +2730,8 @@ static int __must_check submit_one_bio(struct bio *bio, int mirror_num, bio_get(bio); if (tree->ops && tree->ops->submit_bio_hook) - ret = tree->ops->submit_bio_hook(page->mapping->host, - bio->bi_rw, bio, mirror_num, - bio_flags, start); + ret = tree->ops->submit_bio_hook(page->mapping->host, bio, + mirror_num, bio_flags, start); else btrfsic_submit_bio(bio); @@ -2747,8 +2745,8 @@ static int merge_bio(struct extent_io_tree *tree, struct page *page, { int ret = 0; if (tree->ops && tree->ops->merge_bio_hook) - ret = tree->ops->merge_bio_hook(bio->bi_op, page, offset, size, - bio, bio_flags); + ret = tree->ops->merge_bio_hook(page, offset, size, bio, + bio_flags); BUG_ON(ret < 0); return ret; diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h index b5e0ade..f8db2fd 100644 --- a/fs/btrfs/extent_io.h +++ b/fs/btrfs/extent_io.h @@ -63,9 +63,9 @@ struct btrfs_root; struct btrfs_io_bio; struct io_failure_record; -typedef int (extent_submit_bio_hook_t)(struct inode *inode, int rw, - struct bio *bio, int mirror_num, - unsigned long bio_flags, u64 bio_offset); +typedef int (extent_submit_bio_hook_t)(struct inode *inode, struct bio *bio, + int mirror_num, unsigned long bio_flags, + u64 bio_offset); struct extent_io_ops { int (*fill_delalloc)(struct inode *inode, struct page *locked_page, u64 start, u64 end, int *page_started, @@ -73,7 +73,7 @@ struct extent_io_ops { int (*writepage_start_hook)(struct page *page, u64 start, u64 end); int (*writepage_io_hook)(struct page *page, u64 start, u64 end); extent_submit_bio_hook_t *submit_bio_hook; - int (*merge_bio_hook)(int rw, struct page *page, unsigned long offset, + int (*merge_bio_hook)(struct page *page, unsigned long offset, size_t size, struct bio *bio, unsigned long bio_flags); int (*readpage_io_failed_hook)(struct page *page, int failed_mirror); diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index c2dc75b..bd214ab 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -1807,7 +1807,7 @@ static void btrfs_clear_bit_hook(struct inode *inode, * extent_io.c merge_bio_hook, this must check the chunk tree to make sure * we don't create bios that span stripes or chunks */ -int btrfs_merge_bio_hook(int rw, struct page *page, unsigned long offset, +int btrfs_merge_bio_hook(struct page *page, unsigned long offset, size_t size, struct bio *bio, unsigned long bio_flags) { @@ -1822,7 +1822,7 @@ int btrfs_merge_bio_hook(int rw, struct page *page, unsigned long offset, length = bio->bi_iter.bi_size; map_length = length; - ret = btrfs_map_block(root->fs_info, rw, logical, + ret = btrfs_map_block(root->fs_info, bio->bi_op, logical, &map_length, NULL, 0); /* Will always return 0 with map_multi == NULL */ BUG_ON(ret < 0); @@ -1839,9 +1839,8 @@ int btrfs_merge_bio_hook(int rw, struct page *page, unsigned long offset, * At IO completion time the cums attached on the ordered extent record * are inserted into the btree */ -static int __btrfs_submit_bio_start(struct inode *inode, int rw, - struct bio *bio, int mirror_num, - unsigned long bio_flags, +static int __btrfs_submit_bio_start(struct inode *inode, struct bio *bio, + int mirror_num, unsigned long bio_flags, u64 bio_offset) { struct btrfs_root *root = BTRFS_I(inode)->root; @@ -1860,14 +1859,14 @@ static int __btrfs_submit_bio_start(struct inode *inode, int rw, * At IO completion time the cums attached on the ordered extent record * are inserted into the btree */ -static int __btrfs_submit_bio_done(struct inode *inode, int rw, struct bio *bio, +static int __btrfs_submit_bio_done(struct inode *inode, struct bio *bio, int mirror_num, unsigned long bio_flags, u64 bio_offset) { struct btrfs_root *root = BTRFS_I(inode)->root; int ret; - ret = btrfs_map_bio(root, rw, bio, mirror_num, 1); + ret = btrfs_map_bio(root, bio, mirror_num, 1); if (ret) { bio->bi_error = ret; bio_endio(bio); @@ -1879,7 +1878,7 @@ static int __btrfs_submit_bio_done(struct inode *inode, int rw, struct bio *bio, * extent_io.c submission hook. This does the right thing for csum calculation * on write, or reading the csums from the tree before a read */ -static int btrfs_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, +static int btrfs_submit_bio_hook(struct inode *inode, struct bio *bio, int mirror_num, unsigned long bio_flags, u64 bio_offset) { @@ -1916,7 +1915,7 @@ static int btrfs_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, goto mapit; /* we're doing a write, do the async checksumming */ ret = btrfs_wq_submit_bio(BTRFS_I(inode)->root->fs_info, - inode, rw, bio, mirror_num, + inode, bio, mirror_num, bio_flags, bio_offset, __btrfs_submit_bio_start, __btrfs_submit_bio_done); @@ -1928,7 +1927,7 @@ static int btrfs_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, } mapit: - ret = btrfs_map_bio(root, rw, bio, mirror_num, 0); + ret = btrfs_map_bio(root, bio, mirror_num, 0); out: if (ret < 0) { @@ -7746,7 +7745,7 @@ err: } static inline int submit_dio_repair_bio(struct inode *inode, struct bio *bio, - int rw, int mirror_num) + int mirror_num) { struct btrfs_root *root = BTRFS_I(inode)->root; int ret; @@ -7760,7 +7759,7 @@ static inline int submit_dio_repair_bio(struct inode *inode, struct bio *bio, if (ret) goto err; - ret = btrfs_map_bio(root, rw, bio, mirror_num, 0); + ret = btrfs_map_bio(root, bio, mirror_num, 0); err: bio_put(bio); return ret; @@ -7846,8 +7845,7 @@ static int dio_read_error(struct inode *inode, struct bio *failed_bio, "Repair DIO Read Error: submitting new dio read[%#x] to this_mirror=%d, in_validation=%d\n", read_mode, failrec->this_mirror, failrec->in_validation); - ret = submit_dio_repair_bio(inode, bio, read_mode, - failrec->this_mirror); + ret = submit_dio_repair_bio(inode, bio, failrec->this_mirror); if (ret) { free_io_failure(inode, failrec); bio_put(bio); @@ -8137,7 +8135,7 @@ static void btrfs_endio_direct_write(struct bio *bio) bio_put(bio); } -static int __btrfs_submit_bio_start_direct_io(struct inode *inode, int rw, +static int __btrfs_submit_bio_start_direct_io(struct inode *inode, struct bio *bio, int mirror_num, unsigned long bio_flags, u64 offset) { @@ -8230,7 +8228,7 @@ static inline int btrfs_lookup_and_bind_dio_csum(struct btrfs_root *root, } static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, - int rw, u64 file_offset, int skip_sum, + u64 file_offset, int skip_sum, int async_submit) { struct btrfs_dio_private *dip = bio->bi_private; @@ -8255,8 +8253,7 @@ static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, if (write && async_submit) { ret = btrfs_wq_submit_bio(root->fs_info, - inode, rw, bio, 0, 0, - file_offset, + inode, bio, 0, 0, file_offset, __btrfs_submit_bio_start_direct_io, __btrfs_submit_bio_done); goto err; @@ -8275,13 +8272,13 @@ static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, goto err; } map: - ret = btrfs_map_bio(root, rw, bio, 0, async_submit); + ret = btrfs_map_bio(root, bio, 0, async_submit); err: bio_put(bio); return ret; } -static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, +static int btrfs_submit_direct_hook(struct btrfs_dio_private *dip, int skip_sum) { struct inode *inode = dip->inode; @@ -8342,7 +8339,7 @@ next_block: * before we're done setting it up */ atomic_inc(&dip->pending_bios); - ret = __btrfs_submit_dio_bio(bio, inode, rw, + ret = __btrfs_submit_dio_bio(bio, inode, file_offset, skip_sum, async_submit); if (ret) { @@ -8387,7 +8384,7 @@ next_block: } submit: - ret = __btrfs_submit_dio_bio(bio, inode, rw, file_offset, skip_sum, + ret = __btrfs_submit_dio_bio(bio, inode, file_offset, skip_sum, async_submit); if (!ret) return 0; @@ -8465,8 +8462,7 @@ static void btrfs_submit_direct(struct bio *dio_bio, struct inode *inode, dio_data->unsubmitted_oe_range_end; } - ret = btrfs_submit_direct_hook(dio_bio->bi_op | dio_bio->bi_rw, dip, - skip_sum); + ret = btrfs_submit_direct_hook(dip, skip_sum); if (!ret) return; diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index dc56558..2100514 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -5995,7 +5995,7 @@ static noinline void btrfs_schedule_bio(struct btrfs_root *root, static void submit_stripe_bio(struct btrfs_root *root, struct btrfs_bio *bbio, struct bio *bio, u64 physical, int dev_nr, - int rw, int async) + int async) { struct btrfs_device *dev = bbio->stripes[dev_nr].dev; @@ -6040,7 +6040,7 @@ static void bbio_error(struct btrfs_bio *bbio, struct bio *bio, u64 logical) } } -int btrfs_map_bio(struct btrfs_root *root, int rw, struct bio *bio, +int btrfs_map_bio(struct btrfs_root *root, struct bio *bio, int mirror_num, int async_submit) { struct btrfs_device *dev; @@ -6107,7 +6107,7 @@ int btrfs_map_bio(struct btrfs_root *root, int rw, struct bio *bio, bio = first_bio; submit_stripe_bio(root, bbio, bio, - bbio->stripes[dev_nr].physical, dev_nr, rw, + bbio->stripes[dev_nr].physical, dev_nr, async_submit); } btrfs_bio_counter_dec(root->fs_info); diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h index c64229e..372974d0 100644 --- a/fs/btrfs/volumes.h +++ b/fs/btrfs/volumes.h @@ -437,7 +437,7 @@ int btrfs_alloc_chunk(struct btrfs_trans_handle *trans, struct btrfs_root *extent_root, u64 type); void btrfs_mapping_init(struct btrfs_mapping_tree *tree); void btrfs_mapping_tree_free(struct btrfs_mapping_tree *tree); -int btrfs_map_bio(struct btrfs_root *root, int rw, struct bio *bio, +int btrfs_map_bio(struct btrfs_root *root, struct bio *bio, int mirror_num, int async_submit); int btrfs_open_devices(struct btrfs_fs_devices *fs_devices, fmode_t flags, void *holder); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:40:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 568837CE0 for ; Fri, 15 Apr 2016 05:40:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2A75630404E for ; Fri, 15 Apr 2016 03:40:34 -0700 (PDT) X-ASG-Debug-ID: 1460716831-04cbb02e1a2e9790001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 3y1686t49TUABZrP (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:40:32 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 60C1BC062CE5; Fri, 15 Apr 2016 10:40:31 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe31v010243; Fri, 15 Apr 2016 06:40:29 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 11/42] f2fs: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 05:39:31 -0500 X-ASG-Orig-Subj: [PATCH 11/42] f2fs: set bi_op to REQ_OP Message-Id: <1460716802-2294-12-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716832 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has f2fs use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- fs/f2fs/checkpoint.c | 10 ++++++---- fs/f2fs/data.c | 33 ++++++++++++++++++++------------- fs/f2fs/f2fs.h | 5 +++-- fs/f2fs/gc.c | 9 ++++++--- fs/f2fs/inline.c | 3 ++- fs/f2fs/node.c | 8 +++++--- fs/f2fs/segment.c | 10 +++++++--- fs/f2fs/trace.c | 7 ++++--- include/trace/events/f2fs.h | 34 +++++++++++++++++++++------------- 9 files changed, 74 insertions(+), 45 deletions(-) diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c index b92782f..6f9dc16 100644 --- a/fs/f2fs/checkpoint.c +++ b/fs/f2fs/checkpoint.c @@ -55,14 +55,15 @@ static struct page *__get_meta_page(struct f2fs_sb_info *sbi, pgoff_t index, struct f2fs_io_info fio = { .sbi = sbi, .type = META, - .rw = READ_SYNC | REQ_META | REQ_PRIO, + .op = REQ_OP_READ, + .op_flags = READ_SYNC | REQ_META | REQ_PRIO, .old_blkaddr = index, .new_blkaddr = index, .encrypted_page = NULL, }; if (unlikely(!is_meta)) - fio.rw &= ~REQ_META; + fio.op_flags &= ~REQ_META; repeat: page = grab_cache_page(mapping, index); if (!page) { @@ -149,13 +150,14 @@ int ra_meta_pages(struct f2fs_sb_info *sbi, block_t start, int nrpages, struct f2fs_io_info fio = { .sbi = sbi, .type = META, - .rw = sync ? (READ_SYNC | REQ_META | REQ_PRIO) : READA, + .op = REQ_OP_READ, + .op_flags = sync ? (READ_SYNC | REQ_META | REQ_PRIO) : READA, .encrypted_page = NULL, }; struct blk_plug plug; if (unlikely(type == META_POR)) - fio.rw &= ~REQ_META; + fio.op_flags &= ~REQ_META; blk_start_plug(&plug); for (; nrpages-- > 0; blkno++) { diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 74cf5cb..03b6362 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -105,11 +105,12 @@ static void __submit_merged_bio(struct f2fs_bio_info *io) if (!io->bio) return; - if (is_read_io(fio->rw)) + if (is_read_io(fio->op)) trace_f2fs_submit_read_bio(io->sbi->sb, fio, io->bio); else trace_f2fs_submit_write_bio(io->sbi->sb, fio, io->bio); - io->bio->bi_rw = fio->rw; + io->bio->bi_op = fio->op; + io->bio->bi_rw = fio->op_flags; submit_bio(io->bio); io->bio = NULL; @@ -177,10 +178,12 @@ static void __f2fs_submit_merged_bio(struct f2fs_sb_info *sbi, /* change META to META_FLUSH in the checkpoint procedure */ if (type >= META_FLUSH) { io->fio.type = META_FLUSH; + io->fio.op = REQ_OP_WRITE; if (test_opt(sbi, NOBARRIER)) - io->fio.rw = WRITE_FLUSH | REQ_META | REQ_PRIO; + io->fio.op_flags = WRITE_FLUSH | REQ_META | REQ_PRIO; else - io->fio.rw = WRITE_FLUSH_FUA | REQ_META | REQ_PRIO; + io->fio.op_flags = WRITE_FLUSH_FUA | REQ_META | + REQ_PRIO; } __submit_merged_bio(io); out: @@ -222,13 +225,14 @@ int f2fs_submit_page_bio(struct f2fs_io_info *fio) f2fs_trace_ios(fio, 0); /* Allocate a new bio */ - bio = __bio_alloc(fio->sbi, fio->new_blkaddr, 1, is_read_io(fio->rw)); + bio = __bio_alloc(fio->sbi, fio->new_blkaddr, 1, is_read_io(fio->op)); if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) { bio_put(bio); return -EFAULT; } - bio->bi_rw = fio->rw; + bio->bi_op = fio->op; + bio->bi_rw = fio->op_flags; submit_bio(bio); return 0; @@ -239,7 +243,7 @@ void f2fs_submit_page_mbio(struct f2fs_io_info *fio) struct f2fs_sb_info *sbi = fio->sbi; enum page_type btype = PAGE_TYPE_OF_BIO(fio->type); struct f2fs_bio_info *io; - bool is_read = is_read_io(fio->rw); + bool is_read = is_read_io(fio->op); struct page *bio_page; io = is_read ? &sbi->read_io : &sbi->write_io[btype]; @@ -254,7 +258,7 @@ void f2fs_submit_page_mbio(struct f2fs_io_info *fio) inc_page_count(sbi, F2FS_WRITEBACK); if (io->bio && (io->last_block_in_bio != fio->new_blkaddr - 1 || - io->fio.rw != fio->rw)) + (io->fio.op != fio->op || io->fio.op_flags != fio->op_flags))) __submit_merged_bio(io); alloc_new: if (io->bio == NULL) { @@ -359,7 +363,7 @@ int f2fs_get_block(struct dnode_of_data *dn, pgoff_t index) } struct page *get_read_data_page(struct inode *inode, pgoff_t index, - int rw, bool for_write) + int op_flags, bool for_write) { struct address_space *mapping = inode->i_mapping; struct dnode_of_data dn; @@ -369,7 +373,8 @@ struct page *get_read_data_page(struct inode *inode, pgoff_t index, struct f2fs_io_info fio = { .sbi = F2FS_I_SB(inode), .type = DATA, - .rw = rw, + .op = REQ_OP_READ, + .op_flags = op_flags, .encrypted_page = NULL, }; @@ -1014,7 +1019,7 @@ submit_and_realloc: bio->bi_iter.bi_sector = SECTOR_FROM_BLOCK(block_nr); bio->bi_end_io = f2fs_read_end_io; bio->bi_private = ctx; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; } if (bio_add_page(bio, page, blocksize, 0) < blocksize) @@ -1156,7 +1161,8 @@ static int f2fs_write_data_page(struct page *page, struct f2fs_io_info fio = { .sbi = sbi, .type = DATA, - .rw = (wbc->sync_mode == WB_SYNC_ALL) ? WRITE_SYNC : WRITE, + .op = REQ_OP_WRITE, + .op_flags = (wbc->sync_mode == WB_SYNC_ALL) ? WRITE_SYNC : 0, .page = page, .encrypted_page = NULL, }; @@ -1594,7 +1600,8 @@ repeat: struct f2fs_io_info fio = { .sbi = sbi, .type = DATA, - .rw = READ_SYNC, + .op = REQ_OP_READ, + .op_flags = READ_SYNC, .old_blkaddr = blkaddr, .new_blkaddr = blkaddr, .page = page, diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 3f15513..bc488e2 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -636,14 +636,15 @@ enum page_type { struct f2fs_io_info { struct f2fs_sb_info *sbi; /* f2fs_sb_info pointer */ enum page_type type; /* contains DATA/NODE/META/META_FLUSH */ - int rw; /* contains R/RS/W/WS with REQ_META/REQ_PRIO */ + int op; /* contains REQ_OP_ */ + int op_flags; /* rq_flag_bits */ block_t new_blkaddr; /* new block address to be written */ block_t old_blkaddr; /* old block address before Cow */ struct page *page; /* page to be written */ struct page *encrypted_page; /* encrypted page */ }; -#define is_read_io(rw) (((rw) & 1) == READ) +#define is_read_io(rw) (rw == READ) struct f2fs_bio_info { struct f2fs_sb_info *sbi; /* f2fs superblock */ struct bio *bio; /* bios to merge */ diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c index b0051a9..fbd4b88 100644 --- a/fs/f2fs/gc.c +++ b/fs/f2fs/gc.c @@ -546,7 +546,8 @@ static void move_encrypted_block(struct inode *inode, block_t bidx) struct f2fs_io_info fio = { .sbi = F2FS_I_SB(inode), .type = DATA, - .rw = READ_SYNC, + .op = REQ_OP_READ, + .op_flags = READ_SYNC, .encrypted_page = NULL, }; struct dnode_of_data dn; @@ -620,7 +621,8 @@ static void move_encrypted_block(struct inode *inode, block_t bidx) /* allocate block address */ f2fs_wait_on_page_writeback(dn.node_page, NODE, true); - fio.rw = WRITE_SYNC; + fio.op = REQ_OP_WRITE; + fio.op_flags = WRITE_SYNC; fio.new_blkaddr = newaddr; f2fs_submit_page_mbio(&fio); @@ -657,7 +659,8 @@ static void move_data_page(struct inode *inode, block_t bidx, int gc_type) struct f2fs_io_info fio = { .sbi = F2FS_I_SB(inode), .type = DATA, - .rw = WRITE_SYNC, + .op = REQ_OP_WRITE, + .op_flags = WRITE_SYNC, .page = page, .encrypted_page = NULL, }; diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c index 7720565..d3f7292 100644 --- a/fs/f2fs/inline.c +++ b/fs/f2fs/inline.c @@ -108,7 +108,8 @@ int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page) struct f2fs_io_info fio = { .sbi = F2FS_I_SB(dn->inode), .type = DATA, - .rw = WRITE_SYNC | REQ_PRIO, + .op = REQ_OP_WRITE, + .op_flags = WRITE_SYNC | REQ_PRIO, .page = page, .encrypted_page = NULL, }; diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index 095fc2c..c6935c5 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c @@ -1043,14 +1043,15 @@ fail: * 0: f2fs_put_page(page, 0) * LOCKED_PAGE or error: f2fs_put_page(page, 1) */ -static int read_node_page(struct page *page, int rw) +static int read_node_page(struct page *page, int op_flags) { struct f2fs_sb_info *sbi = F2FS_P_SB(page); struct node_info ni; struct f2fs_io_info fio = { .sbi = sbi, .type = NODE, - .rw = rw, + .op = REQ_OP_READ, + .op_flags = op_flags, .page = page, .encrypted_page = NULL, }; @@ -1389,7 +1390,8 @@ static int f2fs_write_node_page(struct page *page, struct f2fs_io_info fio = { .sbi = sbi, .type = NODE, - .rw = (wbc->sync_mode == WB_SYNC_ALL) ? WRITE_SYNC : WRITE, + .op = REQ_OP_WRITE, + .op_flags = (wbc->sync_mode == WB_SYNC_ALL) ? WRITE_SYNC : 0, .page = page, .encrypted_page = NULL, }; diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 0928d57..e271f16 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -255,7 +255,8 @@ static int __commit_inmem_pages(struct inode *inode, struct f2fs_io_info fio = { .sbi = sbi, .type = DATA, - .rw = WRITE_SYNC | REQ_PRIO, + .op = REQ_OP_WRITE, + .op_flags = WRITE_SYNC | REQ_PRIO, .encrypted_page = NULL, }; bool submit_bio = false; @@ -404,6 +405,7 @@ repeat: fcc->dispatch_list = llist_reverse_order(fcc->dispatch_list); bio->bi_bdev = sbi->sb->s_bdev; + bio->bi_op = REQ_OP_WRITE; bio->bi_rw = WRITE_FLUSH; ret = submit_bio_wait(bio); @@ -437,6 +439,7 @@ int f2fs_issue_flush(struct f2fs_sb_info *sbi) int ret; bio->bi_bdev = sbi->sb->s_bdev; + bio->bi_op = REQ_OP_WRITE; bio->bi_rw = WRITE_FLUSH; ret = submit_bio_wait(bio); bio_put(bio); @@ -1401,7 +1404,8 @@ void write_meta_page(struct f2fs_sb_info *sbi, struct page *page) struct f2fs_io_info fio = { .sbi = sbi, .type = META, - .rw = WRITE_SYNC | REQ_META | REQ_PRIO, + .op = REQ_OP_WRITE, + .op_flags = WRITE_SYNC | REQ_META | REQ_PRIO, .old_blkaddr = page->index, .new_blkaddr = page->index, .page = page, @@ -1409,7 +1413,7 @@ void write_meta_page(struct f2fs_sb_info *sbi, struct page *page) }; if (unlikely(page->index >= MAIN_BLKADDR(sbi))) - fio.rw &= ~REQ_META; + fio.op_flags &= ~REQ_META; set_page_writeback(page); f2fs_submit_page_mbio(&fio); diff --git a/fs/f2fs/trace.c b/fs/f2fs/trace.c index 562ce08..73b4e1d 100644 --- a/fs/f2fs/trace.c +++ b/fs/f2fs/trace.c @@ -25,11 +25,11 @@ static inline void __print_last_io(void) if (!last_io.len) return; - trace_printk("%3x:%3x %4x %-16s %2x %5x %12x %4x\n", + trace_printk("%3x:%3x %4x %-16s %2x %5x %5x %12x %4x\n", last_io.major, last_io.minor, last_io.pid, "----------------", last_io.type, - last_io.fio.rw, + last_io.fio.op, last_io.fio.op_flags, last_io.fio.new_blkaddr, last_io.len); memset(&last_io, 0, sizeof(last_io)); @@ -101,7 +101,8 @@ void f2fs_trace_ios(struct f2fs_io_info *fio, int flush) if (last_io.major == major && last_io.minor == minor && last_io.pid == pid && last_io.type == __file_type(inode, pid) && - last_io.fio.rw == fio->rw && + last_io.fio.op == fio->op && + last_io.fio.op_flags == fio->op_flags && last_io.fio.new_blkaddr + last_io.len == fio->new_blkaddr) { last_io.len++; diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h index 0f56584..db75d69 100644 --- a/include/trace/events/f2fs.h +++ b/include/trace/events/f2fs.h @@ -56,17 +56,21 @@ TRACE_DEFINE_ENUM(CP_DISCARD); { IPU, "IN-PLACE" }, \ { OPU, "OUT-OF-PLACE" }) -#define F2FS_BIO_MASK(t) (t & (READA | WRITE_FLUSH_FUA)) +#define F2FS_BIO_FLAG_MASK(t) (t & (READA | WRITE_FLUSH_FUA)) #define F2FS_BIO_EXTRA_MASK(t) (t & (REQ_META | REQ_PRIO)) -#define show_bio_type(type) show_bio_base(type), show_bio_extra(type) +#define show_bio_type(op, op_flags) show_bio_op(op), \ + show_bio_op_flags(op_flags), show_bio_extra(op_flags) -#define show_bio_base(type) \ - __print_symbolic(F2FS_BIO_MASK(type), \ +#define show_bio_op(op) \ + __print_symbolic(op, \ { READ, "READ" }, \ + { WRITE, "WRITE" }) + +#define show_bio_op_flags(flags) \ + __print_symbolic(F2FS_BIO_FLAG_MASK(flags), \ { READA, "READAHEAD" }, \ { READ_SYNC, "READ_SYNC" }, \ - { WRITE, "WRITE" }, \ { WRITE_SYNC, "WRITE_SYNC" }, \ { WRITE_FLUSH, "WRITE_FLUSH" }, \ { WRITE_FUA, "WRITE_FUA" }, \ @@ -730,7 +734,8 @@ DECLARE_EVENT_CLASS(f2fs__submit_page_bio, __field(pgoff_t, index) __field(block_t, old_blkaddr) __field(block_t, new_blkaddr) - __field(int, rw) + __field(int, op) + __field(int, op_flags) __field(int, type) ), @@ -740,17 +745,18 @@ DECLARE_EVENT_CLASS(f2fs__submit_page_bio, __entry->index = page->index; __entry->old_blkaddr = fio->old_blkaddr; __entry->new_blkaddr = fio->new_blkaddr; - __entry->rw = fio->rw; + __entry->op = fio->op; + __entry->op_flags = fio->op_flags; __entry->type = fio->type; ), TP_printk("dev = (%d,%d), ino = %lu, page_index = 0x%lx, " - "oldaddr = 0x%llx, newaddr = 0x%llx rw = %s%s, type = %s", + "oldaddr = 0x%llx, newaddr = 0x%llx rw = %s%si%s, type = %s", show_dev_ino(__entry), (unsigned long)__entry->index, (unsigned long long)__entry->old_blkaddr, (unsigned long long)__entry->new_blkaddr, - show_bio_type(__entry->rw), + show_bio_type(__entry->op, __entry->op_flags), show_block_type(__entry->type)) ); @@ -781,7 +787,8 @@ DECLARE_EVENT_CLASS(f2fs__submit_bio, TP_STRUCT__entry( __field(dev_t, dev) - __field(int, rw) + __field(int, op) + __field(int, op_flags) __field(int, type) __field(sector_t, sector) __field(unsigned int, size) @@ -789,15 +796,16 @@ DECLARE_EVENT_CLASS(f2fs__submit_bio, TP_fast_assign( __entry->dev = sb->s_dev; - __entry->rw = fio->rw; + __entry->op = fio->op; + __entry->op_flags = fio->op_flags; __entry->type = fio->type; __entry->sector = bio->bi_iter.bi_sector; __entry->size = bio->bi_iter.bi_size; ), - TP_printk("dev = (%d,%d), %s%s, %s, sector = %lld, size = %u", + TP_printk("dev = (%d,%d), %s%s%s, %s, sector = %lld, size = %u", show_dev(__entry), - show_bio_type(__entry->rw), + show_bio_type(__entry->op, __entry->op_flags), show_block_type(__entry->type), (unsigned long long)__entry->sector, __entry->size) -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:40:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0A8647CE3 for ; Fri, 15 Apr 2016 05:40:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 84D04AC001 for ; Fri, 15 Apr 2016 03:40:35 -0700 (PDT) X-ASG-Debug-ID: 1460716833-04bdf011025e4b10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id R70YPPyTUrkOxPHs (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:40:34 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A28137F092; Fri, 15 Apr 2016 10:40:33 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe31w010243; Fri, 15 Apr 2016 06:40:31 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 12/42] gfs2: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 05:39:32 -0500 X-ASG-Orig-Subj: [PATCH 12/42] gfs2: set bi_op to REQ_OP Message-Id: <1460716802-2294-13-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716833 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has gfs2 use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- fs/gfs2/log.c | 8 ++++---- fs/gfs2/lops.c | 12 +++++++----- fs/gfs2/lops.h | 2 +- fs/gfs2/meta_io.c | 8 +++++--- fs/gfs2/ops_fstype.c | 1 + 5 files changed, 18 insertions(+), 13 deletions(-) diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c index 0ff028c..e58ccef0 100644 --- a/fs/gfs2/log.c +++ b/fs/gfs2/log.c @@ -657,7 +657,7 @@ static void log_write_header(struct gfs2_sbd *sdp, u32 flags) struct gfs2_log_header *lh; unsigned int tail; u32 hash; - int rw = WRITE_FLUSH_FUA | REQ_META; + int op_flags = WRITE_FLUSH_FUA | REQ_META; struct page *page = mempool_alloc(gfs2_page_pool, GFP_NOIO); enum gfs2_freeze_state state = atomic_read(&sdp->sd_freeze_state); lh = page_address(page); @@ -682,12 +682,12 @@ static void log_write_header(struct gfs2_sbd *sdp, u32 flags) if (test_bit(SDF_NOBARRIERS, &sdp->sd_flags)) { gfs2_ordered_wait(sdp); log_flush_wait(sdp); - rw = WRITE_SYNC | REQ_META | REQ_PRIO; + op_flags = WRITE_SYNC | REQ_META | REQ_PRIO; } sdp->sd_log_idle = (tail == sdp->sd_log_flush_head); gfs2_log_write_page(sdp, page); - gfs2_log_flush_bio(sdp, rw); + gfs2_log_flush_bio(sdp, REQ_OP_WRITE, op_flags); log_flush_wait(sdp); if (sdp->sd_log_tail != tail) @@ -738,7 +738,7 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, gfs2_ordered_write(sdp); lops_before_commit(sdp, tr); - gfs2_log_flush_bio(sdp, WRITE); + gfs2_log_flush_bio(sdp, REQ_OP_WRITE, 0); if (sdp->sd_log_head != sdp->sd_log_flush_head) { log_flush_wait(sdp); diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c index ce28242..c1099b4 100644 --- a/fs/gfs2/lops.c +++ b/fs/gfs2/lops.c @@ -230,17 +230,19 @@ static void gfs2_end_log_write(struct bio *bio) /** * gfs2_log_flush_bio - Submit any pending log bio * @sdp: The superblock - * @rw: The rw flags + * @op: REQ_OP + * @op_flags: rq_flag_bits * * Submit any pending part-built or full bio to the block device. If * there is no pending bio, then this is a no-op. */ -void gfs2_log_flush_bio(struct gfs2_sbd *sdp, int rw) +void gfs2_log_flush_bio(struct gfs2_sbd *sdp, int op, int op_flags) { if (sdp->sd_log_bio) { atomic_inc(&sdp->sd_log_in_flight); - sdp->sd_log_bio->bi_rw = rw; + sdp->sd_log_bio->bi_op = op; + sdp->sd_log_bio->bi_rw = op_flags; submit_bio(sdp->sd_log_bio); sdp->sd_log_bio = NULL; } @@ -300,7 +302,7 @@ static struct bio *gfs2_log_get_bio(struct gfs2_sbd *sdp, u64 blkno) nblk >>= sdp->sd_fsb2bb_shift; if (blkno == nblk) return bio; - gfs2_log_flush_bio(sdp, WRITE); + gfs2_log_flush_bio(sdp, REQ_OP_WRITE, 0); } return gfs2_log_alloc_bio(sdp, blkno); @@ -329,7 +331,7 @@ static void gfs2_log_write(struct gfs2_sbd *sdp, struct page *page, bio = gfs2_log_get_bio(sdp, blkno); ret = bio_add_page(bio, page, size, offset); if (ret == 0) { - gfs2_log_flush_bio(sdp, WRITE); + gfs2_log_flush_bio(sdp, REQ_OP_WRITE, 0); bio = gfs2_log_alloc_bio(sdp, blkno); ret = bio_add_page(bio, page, size, offset); WARN_ON(ret == 0); diff --git a/fs/gfs2/lops.h b/fs/gfs2/lops.h index a65a7ba..e529f53 100644 --- a/fs/gfs2/lops.h +++ b/fs/gfs2/lops.h @@ -27,7 +27,7 @@ extern const struct gfs2_log_operations gfs2_databuf_lops; extern const struct gfs2_log_operations *gfs2_log_ops[]; extern void gfs2_log_write_page(struct gfs2_sbd *sdp, struct page *page); -extern void gfs2_log_flush_bio(struct gfs2_sbd *sdp, int rw); +extern void gfs2_log_flush_bio(struct gfs2_sbd *sdp, int op, int op_flags); extern void gfs2_pin(struct gfs2_sbd *sdp, struct buffer_head *bh); static inline unsigned int buf_limit(struct gfs2_sbd *sdp) diff --git a/fs/gfs2/meta_io.c b/fs/gfs2/meta_io.c index f56f3ca..55ae188 100644 --- a/fs/gfs2/meta_io.c +++ b/fs/gfs2/meta_io.c @@ -213,7 +213,8 @@ static void gfs2_meta_read_endio(struct bio *bio) * Submit several consecutive buffer head I/O requests as a single bio I/O * request. (See submit_bh_wbc.) */ -static void gfs2_submit_bhs(int rw, struct buffer_head *bhs[], int num) +static void gfs2_submit_bhs(int op, int op_flags, struct buffer_head *bhs[], + int num) { struct buffer_head *bh = bhs[0]; struct bio *bio; @@ -230,7 +231,8 @@ static void gfs2_submit_bhs(int rw, struct buffer_head *bhs[], int num) bio_add_page(bio, bh->b_page, bh->b_size, bh_offset(bh)); } bio->bi_end_io = gfs2_meta_read_endio; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; submit_bio(bio); } @@ -281,7 +283,7 @@ int gfs2_meta_read(struct gfs2_glock *gl, u64 blkno, int flags, } } - gfs2_submit_bhs(READ_SYNC | REQ_META | REQ_PRIO, bhs, num); + gfs2_submit_bhs(REQ_OP_READ, READ_SYNC | REQ_META | REQ_PRIO, bhs, num); if (!(flags & DIO_WAIT)) return 0; diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index 141b560..fda3e71 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c @@ -246,6 +246,7 @@ static int gfs2_read_super(struct gfs2_sbd *sdp, sector_t sector, int silent) bio->bi_end_io = end_bio_io_page; bio->bi_private = page; + bio->bi_op = REQ_OP_READ; bio->bi_rw = READ_SYNC | REQ_META; submit_bio(bio); wait_on_page_locked(page); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:40:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AD09B7CE4 for ; Fri, 15 Apr 2016 05:40:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 807FA8F8039 for ; Fri, 15 Apr 2016 03:40:37 -0700 (PDT) X-ASG-Debug-ID: 1460716836-04cbb02e1c2e97b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id fH7ZOae0d5A5zUq7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:40:36 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id DF818201EA; Fri, 15 Apr 2016 10:40:35 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe31x010243; Fri, 15 Apr 2016 06:40:33 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 13/42] xfs: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 05:39:33 -0500 X-ASG-Orig-Subj: [PATCH 13/42] xfs: set bi_op to REQ_OP Message-Id: <1460716802-2294-14-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716836 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has xfs use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke Acked-by: Dave Chinner --- fs/xfs/xfs_aops.c | 3 +-- fs/xfs/xfs_buf.c | 27 +++++++++++++++------------ 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 5852c5a..6c20336 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -439,10 +439,9 @@ xfs_submit_ioend( ioend->io_bio->bi_private = ioend; ioend->io_bio->bi_end_io = xfs_end_bio; + ioend->io_bio->bi_op = REQ_OP_WRITE; if (wbc->sync_mode) ioend->io_bio->bi_rw = WRITE_SYNC; - else - ioend->io_bio->bi_rw = WRITE; /* * If we are failing the IO now, just mark the ioend with an * error and finish it. This will run IO completion immediately diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 079bb77..917774e 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1131,7 +1131,8 @@ xfs_buf_ioapply_map( int map, int *buf_offset, int *count, - int rw) + int op, + int op_flags) { int page_index; int total_nr_pages = bp->b_page_count; @@ -1170,7 +1171,8 @@ next_chunk: bio->bi_iter.bi_sector = sector; bio->bi_end_io = xfs_buf_bio_end_io; bio->bi_private = bp; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; for (; size && nr_pages; nr_pages--, page_index++) { int rbytes, nbytes = PAGE_SIZE - offset; @@ -1214,7 +1216,8 @@ _xfs_buf_ioapply( struct xfs_buf *bp) { struct blk_plug plug; - int rw; + int op; + int op_flags = 0; int offset; int size; int i; @@ -1233,14 +1236,13 @@ _xfs_buf_ioapply( bp->b_ioend_wq = bp->b_target->bt_mount->m_buf_workqueue; if (bp->b_flags & XBF_WRITE) { + op = REQ_OP_WRITE; if (bp->b_flags & XBF_SYNCIO) - rw = WRITE_SYNC; - else - rw = WRITE; + op_flags = WRITE_SYNC; if (bp->b_flags & XBF_FUA) - rw |= REQ_FUA; + op_flags |= REQ_FUA; if (bp->b_flags & XBF_FLUSH) - rw |= REQ_FLUSH; + op_flags |= REQ_FLUSH; /* * Run the write verifier callback function if it exists. If @@ -1270,13 +1272,14 @@ _xfs_buf_ioapply( } } } else if (bp->b_flags & XBF_READ_AHEAD) { - rw = READA; + op = REQ_OP_READ; + op_flags = REQ_RAHEAD; } else { - rw = READ; + op = REQ_OP_READ; } /* we only use the buffer cache for meta-data */ - rw |= REQ_META; + op_flags |= REQ_META; /* * Walk all the vectors issuing IO on them. Set up the initial offset @@ -1288,7 +1291,7 @@ _xfs_buf_ioapply( size = BBTOB(bp->b_io_length); blk_start_plug(&plug); for (i = 0; i < bp->b_map_count; i++) { - xfs_buf_ioapply_map(bp, i, &offset, &size, rw); + xfs_buf_ioapply_map(bp, i, &offset, &size, op, op_flags); if (bp->b_error) break; if (size <= 0) -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:40:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 66CD37CF1 for ; Fri, 15 Apr 2016 05:40:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 171F030404E for ; Fri, 15 Apr 2016 03:40:40 -0700 (PDT) X-ASG-Debug-ID: 1460716838-04bdf011035e4b20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GJylql8kfhfi2jAv (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:40:38 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2D3A3201FB; Fri, 15 Apr 2016 10:40:38 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe320010243; Fri, 15 Apr 2016 06:40:35 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 14/42] hfsplus: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 05:39:34 -0500 X-ASG-Orig-Subj: [PATCH 14/42] hfsplus: set bi_op to REQ_OP Message-Id: <1460716802-2294-15-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716838 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has hfsplus use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- fs/hfsplus/hfsplus_fs.h | 2 +- fs/hfsplus/part_tbl.c | 5 +++-- fs/hfsplus/super.c | 6 ++++-- fs/hfsplus/wrapper.c | 15 +++++++++------ 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/fs/hfsplus/hfsplus_fs.h b/fs/hfsplus/hfsplus_fs.h index f91a1fa..80154aa 100644 --- a/fs/hfsplus/hfsplus_fs.h +++ b/fs/hfsplus/hfsplus_fs.h @@ -525,7 +525,7 @@ int hfsplus_compare_dentry(const struct dentry *parent, /* wrapper.c */ int hfsplus_submit_bio(struct super_block *sb, sector_t sector, void *buf, - void **data, int rw); + void **data, int op, int op_flags); int hfsplus_read_wrapper(struct super_block *sb); /* time macros */ diff --git a/fs/hfsplus/part_tbl.c b/fs/hfsplus/part_tbl.c index eb355d8..63164eb 100644 --- a/fs/hfsplus/part_tbl.c +++ b/fs/hfsplus/part_tbl.c @@ -112,7 +112,8 @@ static int hfs_parse_new_pmap(struct super_block *sb, void *buf, if ((u8 *)pm - (u8 *)buf >= buf_size) { res = hfsplus_submit_bio(sb, *part_start + HFS_PMAP_BLK + i, - buf, (void **)&pm, READ); + buf, (void **)&pm, REQ_OP_READ, + 0); if (res) return res; } @@ -136,7 +137,7 @@ int hfs_part_find(struct super_block *sb, return -ENOMEM; res = hfsplus_submit_bio(sb, *part_start + HFS_PMAP_BLK, - buf, &data, READ); + buf, &data, REQ_OP_READ, 0); if (res) goto out; diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c index c359113..d3646c2 100644 --- a/fs/hfsplus/super.c +++ b/fs/hfsplus/super.c @@ -219,7 +219,8 @@ static int hfsplus_sync_fs(struct super_block *sb, int wait) error2 = hfsplus_submit_bio(sb, sbi->part_start + HFSPLUS_VOLHEAD_SECTOR, - sbi->s_vhdr_buf, NULL, WRITE_SYNC); + sbi->s_vhdr_buf, NULL, REQ_OP_WRITE, + WRITE_SYNC); if (!error) error = error2; if (!write_backup) @@ -227,7 +228,8 @@ static int hfsplus_sync_fs(struct super_block *sb, int wait) error2 = hfsplus_submit_bio(sb, sbi->part_start + sbi->sect_count - 2, - sbi->s_backup_vhdr_buf, NULL, WRITE_SYNC); + sbi->s_backup_vhdr_buf, NULL, REQ_OP_WRITE, + WRITE_SYNC); if (!error) error2 = error; out: diff --git a/fs/hfsplus/wrapper.c b/fs/hfsplus/wrapper.c index d026bb3..c5c916d 100644 --- a/fs/hfsplus/wrapper.c +++ b/fs/hfsplus/wrapper.c @@ -30,7 +30,8 @@ struct hfsplus_wd { * @sector: block to read or write, for blocks of HFSPLUS_SECTOR_SIZE bytes * @buf: buffer for I/O * @data: output pointer for location of requested data - * @rw: direction of I/O + * @op: direction of I/O + * @op_flags: request op flags * * The unit of I/O is hfsplus_min_io_size(sb), which may be bigger than * HFSPLUS_SECTOR_SIZE, and @buf must be sized accordingly. On reads @@ -44,7 +45,7 @@ struct hfsplus_wd { * will work correctly. */ int hfsplus_submit_bio(struct super_block *sb, sector_t sector, - void *buf, void **data, int rw) + void *buf, void **data, int op, int op_flags) { struct bio *bio; int ret = 0; @@ -65,9 +66,10 @@ int hfsplus_submit_bio(struct super_block *sb, sector_t sector, bio = bio_alloc(GFP_NOIO, 1); bio->bi_iter.bi_sector = sector; bio->bi_bdev = sb->s_bdev; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; - if (!(rw & WRITE) && data) + if (op != WRITE && data) *data = (u8 *)buf + offset; while (io_size > 0) { @@ -182,7 +184,7 @@ int hfsplus_read_wrapper(struct super_block *sb) reread: error = hfsplus_submit_bio(sb, part_start + HFSPLUS_VOLHEAD_SECTOR, sbi->s_vhdr_buf, (void **)&sbi->s_vhdr, - READ); + REQ_OP_READ, 0); if (error) goto out_free_backup_vhdr; @@ -214,7 +216,8 @@ reread: error = hfsplus_submit_bio(sb, part_start + part_size - 2, sbi->s_backup_vhdr_buf, - (void **)&sbi->s_backup_vhdr, READ); + (void **)&sbi->s_backup_vhdr, REQ_OP_READ, + 0); if (error) goto out_free_backup_vhdr; -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:40:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4642F7CF1 for ; Fri, 15 Apr 2016 05:40:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9EA3AAC001 for ; Fri, 15 Apr 2016 03:40:42 -0700 (PDT) X-ASG-Debug-ID: 1460716840-04cb6c2464614ec0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id pQ8BNhVC6rEBbxr1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:40:41 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 778956264A; Fri, 15 Apr 2016 10:40:40 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe321010243; Fri, 15 Apr 2016 06:40:38 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 15/42] mpage: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 05:39:35 -0500 X-ASG-Orig-Subj: [PATCH 15/42] mpage: set bi_op to REQ_OP Message-Id: <1460716802-2294-16-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Fri, 15 Apr 2016 10:40:40 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460716841 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has mpage.c use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- fs/mpage.c | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/fs/mpage.c b/fs/mpage.c index 2c251ec..89f58f1 100644 --- a/fs/mpage.c +++ b/fs/mpage.c @@ -56,11 +56,12 @@ static void mpage_end_io(struct bio *bio) bio_put(bio); } -static struct bio *mpage_bio_submit(int rw, struct bio *bio) +static struct bio *mpage_bio_submit(int op, int op_flags, struct bio *bio) { bio->bi_end_io = mpage_end_io; - bio->bi_rw = rw; - guard_bio_eod(rw, bio); + bio->bi_op = op; + bio->bi_rw = op_flags; + guard_bio_eod(op, bio); submit_bio(bio); return NULL; } @@ -270,7 +271,7 @@ do_mpage_readpage(struct bio *bio, struct page *page, unsigned nr_pages, * This page will go to BIO. Do we need to send this BIO off first? */ if (bio && (*last_block_in_bio != blocks[0] - 1)) - bio = mpage_bio_submit(READ, bio); + bio = mpage_bio_submit(REQ_OP_READ, 0, bio); alloc_new: if (bio == NULL) { @@ -287,7 +288,7 @@ alloc_new: length = first_hole << blkbits; if (bio_add_page(bio, page, length, 0) < length) { - bio = mpage_bio_submit(READ, bio); + bio = mpage_bio_submit(REQ_OP_READ, 0, bio); goto alloc_new; } @@ -295,7 +296,7 @@ alloc_new: nblocks = map_bh->b_size >> blkbits; if ((buffer_boundary(map_bh) && relative_block == nblocks) || (first_hole != blocks_per_page)) - bio = mpage_bio_submit(READ, bio); + bio = mpage_bio_submit(REQ_OP_READ, 0, bio); else *last_block_in_bio = blocks[blocks_per_page - 1]; out: @@ -303,7 +304,7 @@ out: confused: if (bio) - bio = mpage_bio_submit(READ, bio); + bio = mpage_bio_submit(REQ_OP_READ, 0, bio); if (!PageUptodate(page)) block_read_full_page(page, get_block); else @@ -385,7 +386,7 @@ mpage_readpages(struct address_space *mapping, struct list_head *pages, } BUG_ON(!list_empty(pages)); if (bio) - mpage_bio_submit(READ, bio); + mpage_bio_submit(REQ_OP_READ, 0, bio); return 0; } EXPORT_SYMBOL(mpage_readpages); @@ -406,7 +407,7 @@ int mpage_readpage(struct page *page, get_block_t get_block) bio = do_mpage_readpage(bio, page, 1, &last_block_in_bio, &map_bh, &first_logical_block, get_block, gfp); if (bio) - mpage_bio_submit(READ, bio); + mpage_bio_submit(REQ_OP_READ, 0, bio); return 0; } EXPORT_SYMBOL(mpage_readpage); @@ -487,7 +488,7 @@ static int __mpage_writepage(struct page *page, struct writeback_control *wbc, struct buffer_head map_bh; loff_t i_size = i_size_read(inode); int ret = 0; - int wr = (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE); + int op_flags = (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : 0); if (page_has_buffers(page)) { struct buffer_head *head = page_buffers(page); @@ -596,7 +597,7 @@ page_is_mapped: * This page will go to BIO. Do we need to send this BIO off first? */ if (bio && mpd->last_block_in_bio != blocks[0] - 1) - bio = mpage_bio_submit(wr, bio); + bio = mpage_bio_submit(REQ_OP_WRITE, op_flags, bio); alloc_new: if (bio == NULL) { @@ -623,7 +624,7 @@ alloc_new: wbc_account_io(wbc, page, PAGE_SIZE); length = first_unmapped << blkbits; if (bio_add_page(bio, page, length, 0) < length) { - bio = mpage_bio_submit(wr, bio); + bio = mpage_bio_submit(REQ_OP_WRITE, op_flags, bio); goto alloc_new; } @@ -633,7 +634,7 @@ alloc_new: set_page_writeback(page); unlock_page(page); if (boundary || (first_unmapped != blocks_per_page)) { - bio = mpage_bio_submit(wr, bio); + bio = mpage_bio_submit(REQ_OP_WRITE, op_flags, bio); if (boundary_block) { write_boundary_block(boundary_bdev, boundary_block, 1 << blkbits); @@ -645,7 +646,7 @@ alloc_new: confused: if (bio) - bio = mpage_bio_submit(wr, bio); + bio = mpage_bio_submit(REQ_OP_WRITE, op_flags, bio); if (mpd->use_writepage) { ret = mapping->a_ops->writepage(page, wbc); @@ -702,9 +703,9 @@ mpage_writepages(struct address_space *mapping, ret = write_cache_pages(mapping, wbc, __mpage_writepage, &mpd); if (mpd.bio) { - int wr = (wbc->sync_mode == WB_SYNC_ALL ? - WRITE_SYNC : WRITE); - mpage_bio_submit(wr, mpd.bio); + int op_flags = (wbc->sync_mode == WB_SYNC_ALL ? + WRITE_SYNC : 0); + mpage_bio_submit(REQ_OP_WRITE, op_flags, mpd.bio); } } blk_finish_plug(&plug); @@ -723,9 +724,9 @@ int mpage_writepage(struct page *page, get_block_t get_block, }; int ret = __mpage_writepage(page, wbc, &mpd); if (mpd.bio) { - int wr = (wbc->sync_mode == WB_SYNC_ALL ? - WRITE_SYNC : WRITE); - mpage_bio_submit(wr, mpd.bio); + int op_flags = (wbc->sync_mode == WB_SYNC_ALL ? + WRITE_SYNC : 0); + mpage_bio_submit(REQ_OP_WRITE, op_flags, mpd.bio); } return ret; } -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:40:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8DB0D7CB2 for ; Fri, 15 Apr 2016 05:40:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5720B8F8039 for ; Fri, 15 Apr 2016 03:40:44 -0700 (PDT) X-ASG-Debug-ID: 1460716843-04cbb02e1d2e97d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ifxRVoG9PfUABCQT (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:40:43 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id BF3CC7AE9D; Fri, 15 Apr 2016 10:40:42 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe322010243; Fri, 15 Apr 2016 06:40:40 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 16/42] nilfs: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 05:39:36 -0500 X-ASG-Orig-Subj: [PATCH 16/42] nilfs: set bi_op to REQ_OP Message-Id: <1460716802-2294-17-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716843 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has nilfs use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- fs/nilfs2/segbuf.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/fs/nilfs2/segbuf.c b/fs/nilfs2/segbuf.c index 7666f1d..7b13e14 100644 --- a/fs/nilfs2/segbuf.c +++ b/fs/nilfs2/segbuf.c @@ -350,7 +350,8 @@ static void nilfs_end_bio_write(struct bio *bio) } static int nilfs_segbuf_submit_bio(struct nilfs_segment_buffer *segbuf, - struct nilfs_write_info *wi, int mode) + struct nilfs_write_info *wi, int mode, + int mode_flags) { struct bio *bio = wi->bio; int err; @@ -368,7 +369,8 @@ static int nilfs_segbuf_submit_bio(struct nilfs_segment_buffer *segbuf, bio->bi_end_io = nilfs_end_bio_write; bio->bi_private = segbuf; - bio->bi_rw = mode; + bio->bi_op = mode; + bio->bi_rw = mode_flags; submit_bio(bio); segbuf->sb_nbio++; @@ -442,7 +444,7 @@ static int nilfs_segbuf_submit_bh(struct nilfs_segment_buffer *segbuf, return 0; } /* bio is FULL */ - err = nilfs_segbuf_submit_bio(segbuf, wi, mode); + err = nilfs_segbuf_submit_bio(segbuf, wi, mode, 0); /* never submit current bh */ if (likely(!err)) goto repeat; @@ -466,19 +468,19 @@ static int nilfs_segbuf_write(struct nilfs_segment_buffer *segbuf, { struct nilfs_write_info wi; struct buffer_head *bh; - int res = 0, rw = WRITE; + int res = 0; wi.nilfs = nilfs; nilfs_segbuf_prepare_write(segbuf, &wi); list_for_each_entry(bh, &segbuf->sb_segsum_buffers, b_assoc_buffers) { - res = nilfs_segbuf_submit_bh(segbuf, &wi, bh, rw); + res = nilfs_segbuf_submit_bh(segbuf, &wi, bh, REQ_OP_WRITE); if (unlikely(res)) goto failed_bio; } list_for_each_entry(bh, &segbuf->sb_payload_buffers, b_assoc_buffers) { - res = nilfs_segbuf_submit_bh(segbuf, &wi, bh, rw); + res = nilfs_segbuf_submit_bh(segbuf, &wi, bh, REQ_OP_WRITE); if (unlikely(res)) goto failed_bio; } @@ -488,8 +490,8 @@ static int nilfs_segbuf_write(struct nilfs_segment_buffer *segbuf, * Last BIO is always sent through the following * submission. */ - rw |= REQ_SYNC; - res = nilfs_segbuf_submit_bio(segbuf, &wi, rw); + res = nilfs_segbuf_submit_bio(segbuf, &wi, REQ_OP_WRITE, + REQ_SYNC); } failed_bio: -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:40:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2BCFE7CD1 for ; Fri, 15 Apr 2016 05:40:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id F2A27304059 for ; Fri, 15 Apr 2016 03:40:48 -0700 (PDT) X-ASG-Debug-ID: 1460716847-04cb6c2460614ed0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id qRINBAZwyNe76SGw (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:40:47 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3F7EA64073; Fri, 15 Apr 2016 10:40:47 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe324010243; Fri, 15 Apr 2016 06:40:45 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 18/42] pm: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 05:39:38 -0500 X-ASG-Orig-Subj: [PATCH 18/42] pm: set bi_op to REQ_OP Message-Id: <1460716802-2294-19-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Fri, 15 Apr 2016 10:40:47 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460716847 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has the pm code use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- kernel/power/swap.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/kernel/power/swap.c b/kernel/power/swap.c index 4d050eb..adbcb1b 100644 --- a/kernel/power/swap.c +++ b/kernel/power/swap.c @@ -250,7 +250,7 @@ static void hib_end_io(struct bio *bio) bio_put(bio); } -static int hib_submit_io(int rw, pgoff_t page_off, void *addr, +static int hib_submit_io(int op, int op_flags, pgoff_t page_off, void *addr, struct hib_bio_batch *hb) { struct page *page = virt_to_page(addr); @@ -260,7 +260,8 @@ static int hib_submit_io(int rw, pgoff_t page_off, void *addr, bio = bio_alloc(__GFP_RECLAIM | __GFP_HIGH, 1); bio->bi_iter.bi_sector = page_off * (PAGE_SIZE >> 9); bio->bi_bdev = hib_resume_bdev; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) { printk(KERN_ERR "PM: Adding page to bio failed at %llu\n", @@ -296,7 +297,8 @@ static int mark_swapfiles(struct swap_map_handle *handle, unsigned int flags) { int error; - hib_submit_io(READ_SYNC, swsusp_resume_block, swsusp_header, NULL); + hib_submit_io(REQ_OP_READ, READ_SYNC, swsusp_resume_block, + swsusp_header, NULL); if (!memcmp("SWAP-SPACE",swsusp_header->sig, 10) || !memcmp("SWAPSPACE2",swsusp_header->sig, 10)) { memcpy(swsusp_header->orig_sig,swsusp_header->sig, 10); @@ -305,8 +307,8 @@ static int mark_swapfiles(struct swap_map_handle *handle, unsigned int flags) swsusp_header->flags = flags; if (flags & SF_CRC32_MODE) swsusp_header->crc32 = handle->crc32; - error = hib_submit_io(WRITE_SYNC, swsusp_resume_block, - swsusp_header, NULL); + error = hib_submit_io(REQ_OP_WRITE, WRITE_SYNC, + swsusp_resume_block, swsusp_header, NULL); } else { printk(KERN_ERR "PM: Swap header not found!\n"); error = -ENODEV; @@ -379,7 +381,7 @@ static int write_page(void *buf, sector_t offset, struct hib_bio_batch *hb) } else { src = buf; } - return hib_submit_io(WRITE_SYNC, offset, src, hb); + return hib_submit_io(REQ_OP_WRITE, WRITE_SYNC, offset, src, hb); } static void release_swap_writer(struct swap_map_handle *handle) @@ -982,7 +984,8 @@ static int get_swap_reader(struct swap_map_handle *handle, return -ENOMEM; } - error = hib_submit_io(READ_SYNC, offset, tmp->map, NULL); + error = hib_submit_io(REQ_OP_READ, READ_SYNC, offset, + tmp->map, NULL); if (error) { release_swap_reader(handle); return error; @@ -1006,7 +1009,7 @@ static int swap_read_page(struct swap_map_handle *handle, void *buf, offset = handle->cur->entries[handle->k]; if (!offset) return -EFAULT; - error = hib_submit_io(READ_SYNC, offset, buf, hb); + error = hib_submit_io(REQ_OP_READ, READ_SYNC, offset, buf, hb); if (error) return error; if (++handle->k >= MAP_PAGE_ENTRIES) { @@ -1508,7 +1511,8 @@ int swsusp_check(void) if (!IS_ERR(hib_resume_bdev)) { set_blocksize(hib_resume_bdev, PAGE_SIZE); clear_page(swsusp_header); - error = hib_submit_io(READ_SYNC, swsusp_resume_block, + error = hib_submit_io(REQ_OP_READ, READ_SYNC, + swsusp_resume_block, swsusp_header, NULL); if (error) goto put; @@ -1516,7 +1520,8 @@ int swsusp_check(void) if (!memcmp(HIBERNATE_SIG, swsusp_header->sig, 10)) { memcpy(swsusp_header->sig, swsusp_header->orig_sig, 10); /* Reset swap signature now */ - error = hib_submit_io(WRITE_SYNC, swsusp_resume_block, + error = hib_submit_io(REQ_OP_WRITE, WRITE_SYNC, + swsusp_resume_block, swsusp_header, NULL); } else { error = -EINVAL; @@ -1560,10 +1565,12 @@ int swsusp_unmark(void) { int error; - hib_submit_io(READ_SYNC, swsusp_resume_block, swsusp_header, NULL); + hib_submit_io(REQ_OP_READ, READ_SYNC, swsusp_resume_block, + swsusp_header, NULL); if (!memcmp(HIBERNATE_SIG,swsusp_header->sig, 10)) { memcpy(swsusp_header->sig,swsusp_header->orig_sig, 10); - error = hib_submit_io(WRITE_SYNC, swsusp_resume_block, + error = hib_submit_io(REQ_OP_WRITE, WRITE_SYNC, + swsusp_resume_block, swsusp_header, NULL); } else { printk(KERN_ERR "PM: Cannot find swsusp signature!\n"); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:40:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3523E7CA0 for ; Fri, 15 Apr 2016 05:40:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id CE3F2304059 for ; Fri, 15 Apr 2016 03:40:49 -0700 (PDT) X-ASG-Debug-ID: 1460716845-04bdf011025e4b30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id De7SnsZdhpxqj7OS (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:40:45 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0CB0562658; Fri, 15 Apr 2016 10:40:45 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe323010243; Fri, 15 Apr 2016 06:40:42 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 17/42] ocfs2: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 05:39:37 -0500 X-ASG-Orig-Subj: [PATCH 17/42] ocfs2: set bi_op to REQ_OP Message-Id: <1460716802-2294-18-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Fri, 15 Apr 2016 10:40:45 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460716845 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has ocfs2 use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- fs/ocfs2/cluster/heartbeat.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c index e37373d..0619a20 100644 --- a/fs/ocfs2/cluster/heartbeat.c +++ b/fs/ocfs2/cluster/heartbeat.c @@ -530,7 +530,8 @@ static void o2hb_bio_end_io(struct bio *bio) static struct bio *o2hb_setup_one_bio(struct o2hb_region *reg, struct o2hb_bio_wait_ctxt *wc, unsigned int *current_slot, - unsigned int max_slots, int rw) + unsigned int max_slots, int op, + int op_flags) { int len, current_page; unsigned int vec_len, vec_start; @@ -556,7 +557,8 @@ static struct bio *o2hb_setup_one_bio(struct o2hb_region *reg, bio->bi_bdev = reg->hr_bdev; bio->bi_private = wc; bio->bi_end_io = o2hb_bio_end_io; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; vec_start = (cs << bits) % PAGE_SIZE; while(cs < max_slots) { @@ -593,7 +595,7 @@ static int o2hb_read_slots(struct o2hb_region *reg, while(current_slot < max_slots) { bio = o2hb_setup_one_bio(reg, &wc, ¤t_slot, max_slots, - READ); + REQ_OP_READ, 0); if (IS_ERR(bio)) { status = PTR_ERR(bio); mlog_errno(status); @@ -625,7 +627,8 @@ static int o2hb_issue_node_write(struct o2hb_region *reg, slot = o2nm_this_node(); - bio = o2hb_setup_one_bio(reg, write_wc, &slot, slot+1, WRITE_SYNC); + bio = o2hb_setup_one_bio(reg, write_wc, &slot, slot+1, REQ_OP_WRITE, + WRITE_SYNC); if (IS_ERR(bio)) { status = PTR_ERR(bio); mlog_errno(status); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:40:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DA6567CCB for ; Fri, 15 Apr 2016 05:40:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7D32C30404E for ; Fri, 15 Apr 2016 03:40:52 -0700 (PDT) X-ASG-Debug-ID: 1460716849-04bdf011025e4b40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xxKAEGDA9N3BhKbk (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:40:49 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8270B8F518; Fri, 15 Apr 2016 10:40:49 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe325010243; Fri, 15 Apr 2016 06:40:47 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 19/42] dm: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 05:39:39 -0500 X-ASG-Orig-Subj: [PATCH 19/42] dm: set bi_op to REQ_OP Message-Id: <1460716802-2294-20-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716849 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has dm use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/md/dm-bufio.c | 8 +++--- drivers/md/dm-crypt.c | 1 + drivers/md/dm-io.c | 57 ++++++++++++++++++++++------------------- drivers/md/dm-kcopyd.c | 25 +++++++++--------- drivers/md/dm-log-writes.c | 6 ++--- drivers/md/dm-log.c | 5 ++-- drivers/md/dm-raid1.c | 11 +++++--- drivers/md/dm-snap-persistent.c | 24 +++++++++-------- drivers/md/dm-thin.c | 7 ++--- drivers/md/dm.c | 1 + include/linux/dm-io.h | 3 ++- 11 files changed, 82 insertions(+), 66 deletions(-) diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c index 9d3ee7f..b6055f2 100644 --- a/drivers/md/dm-bufio.c +++ b/drivers/md/dm-bufio.c @@ -574,7 +574,8 @@ static void use_dmio(struct dm_buffer *b, int rw, sector_t block, { int r; struct dm_io_request io_req = { - .bi_rw = rw, + .bi_op = rw, + .bi_op_flags = 0, .notify.fn = dmio_complete, .notify.context = b, .client = b->c->dm_io, @@ -634,7 +635,7 @@ static void use_inline_bio(struct dm_buffer *b, int rw, sector_t block, * the dm_buffer's inline bio is local to bufio. */ b->bio.bi_private = end_io; - b->bio.bi_rw = rw; + b->bio.bi_op = rw; /* * We assume that if len >= PAGE_SIZE ptr is page-aligned. @@ -1327,7 +1328,8 @@ EXPORT_SYMBOL_GPL(dm_bufio_write_dirty_buffers); int dm_bufio_issue_flush(struct dm_bufio_client *c) { struct dm_io_request io_req = { - .bi_rw = WRITE_FLUSH, + .bi_op = REQ_OP_WRITE, + .bi_op_flags = WRITE_FLUSH, .mem.type = DM_IO_KMEM, .mem.ptr.addr = NULL, .client = c->dm_io, diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index 4f3cb35..70fbf11 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c @@ -1136,6 +1136,7 @@ static void clone_init(struct dm_crypt_io *io, struct bio *clone) clone->bi_private = io; clone->bi_end_io = crypt_endio; clone->bi_bdev = cc->dev->bdev; + clone->bi_op = io->base_bio->bi_op; clone->bi_rw = io->base_bio->bi_rw; } diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c index 50f17e3..0f723ca 100644 --- a/drivers/md/dm-io.c +++ b/drivers/md/dm-io.c @@ -278,8 +278,9 @@ static void km_dp_init(struct dpages *dp, void *data) /*----------------------------------------------------------------- * IO routines that accept a list of pages. *---------------------------------------------------------------*/ -static void do_region(int rw, unsigned region, struct dm_io_region *where, - struct dpages *dp, struct io *io) +static void do_region(int op, int op_flags, unsigned region, + struct dm_io_region *where, struct dpages *dp, + struct io *io) { struct bio *bio; struct page *page; @@ -295,24 +296,25 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, /* * Reject unsupported discard and write same requests. */ - if (rw & REQ_DISCARD) + if (op == REQ_OP_DISCARD) special_cmd_max_sectors = q->limits.max_discard_sectors; - else if (rw & REQ_WRITE_SAME) + else if (op == REQ_OP_WRITE_SAME) special_cmd_max_sectors = q->limits.max_write_same_sectors; - if ((rw & (REQ_DISCARD | REQ_WRITE_SAME)) && special_cmd_max_sectors == 0) { + if ((op == REQ_OP_DISCARD || op == REQ_OP_WRITE_SAME) && + special_cmd_max_sectors == 0) { dec_count(io, region, -EOPNOTSUPP); return; } /* - * where->count may be zero if rw holds a flush and we need to + * where->count may be zero if op holds a flush and we need to * send a zero-sized flush. */ do { /* * Allocate a suitably sized-bio. */ - if ((rw & REQ_DISCARD) || (rw & REQ_WRITE_SAME)) + if ((op == REQ_OP_DISCARD) || (op == REQ_OP_WRITE_SAME)) num_bvecs = 1; else num_bvecs = min_t(int, BIO_MAX_PAGES, @@ -322,14 +324,15 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, bio->bi_iter.bi_sector = where->sector + (where->count - remaining); bio->bi_bdev = where->bdev; bio->bi_end_io = endio; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; store_io_and_region_in_bio(bio, io, region); - if (rw & REQ_DISCARD) { + if (op == REQ_OP_DISCARD) { num_sectors = min_t(sector_t, special_cmd_max_sectors, remaining); bio->bi_iter.bi_size = num_sectors << SECTOR_SHIFT; remaining -= num_sectors; - } else if (rw & REQ_WRITE_SAME) { + } else if (op == REQ_OP_WRITE_SAME) { /* * WRITE SAME only uses a single page. */ @@ -360,7 +363,7 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, } while (remaining); } -static void dispatch_io(int rw, unsigned int num_regions, +static void dispatch_io(int op, int op_flags, unsigned int num_regions, struct dm_io_region *where, struct dpages *dp, struct io *io, int sync) { @@ -370,7 +373,7 @@ static void dispatch_io(int rw, unsigned int num_regions, BUG_ON(num_regions > DM_IO_MAX_REGIONS); if (sync) - rw |= REQ_SYNC; + op_flags |= REQ_SYNC; /* * For multiple regions we need to be careful to rewind @@ -378,8 +381,8 @@ static void dispatch_io(int rw, unsigned int num_regions, */ for (i = 0; i < num_regions; i++) { *dp = old_pages; - if (where[i].count || (rw & REQ_FLUSH)) - do_region(rw, i, where + i, dp, io); + if (where[i].count || (op_flags & REQ_FLUSH)) + do_region(op, op_flags, i, where + i, dp, io); } /* @@ -403,13 +406,13 @@ static void sync_io_complete(unsigned long error, void *context) } static int sync_io(struct dm_io_client *client, unsigned int num_regions, - struct dm_io_region *where, int rw, struct dpages *dp, - unsigned long *error_bits) + struct dm_io_region *where, int op, int op_flags, + struct dpages *dp, unsigned long *error_bits) { struct io *io; struct sync_io sio; - if (num_regions > 1 && (rw & RW_MASK) != WRITE) { + if (num_regions > 1 && !op_is_write(op)) { WARN_ON(1); return -EIO; } @@ -426,7 +429,7 @@ static int sync_io(struct dm_io_client *client, unsigned int num_regions, io->vma_invalidate_address = dp->vma_invalidate_address; io->vma_invalidate_size = dp->vma_invalidate_size; - dispatch_io(rw, num_regions, where, dp, io, 1); + dispatch_io(op, op_flags, num_regions, where, dp, io, 1); wait_for_completion_io(&sio.wait); @@ -437,12 +440,12 @@ static int sync_io(struct dm_io_client *client, unsigned int num_regions, } static int async_io(struct dm_io_client *client, unsigned int num_regions, - struct dm_io_region *where, int rw, struct dpages *dp, - io_notify_fn fn, void *context) + struct dm_io_region *where, int op, int op_flags, + struct dpages *dp, io_notify_fn fn, void *context) { struct io *io; - if (num_regions > 1 && (rw & RW_MASK) != WRITE) { + if (num_regions > 1 && !op_is_write(op)) { WARN_ON(1); fn(1, context); return -EIO; @@ -458,7 +461,7 @@ static int async_io(struct dm_io_client *client, unsigned int num_regions, io->vma_invalidate_address = dp->vma_invalidate_address; io->vma_invalidate_size = dp->vma_invalidate_size; - dispatch_io(rw, num_regions, where, dp, io, 0); + dispatch_io(op, op_flags, num_regions, where, dp, io, 0); return 0; } @@ -481,7 +484,7 @@ static int dp_init(struct dm_io_request *io_req, struct dpages *dp, case DM_IO_VMA: flush_kernel_vmap_range(io_req->mem.ptr.vma, size); - if ((io_req->bi_rw & RW_MASK) == READ) { + if (io_req->bi_op == REQ_OP_READ) { dp->vma_invalidate_address = io_req->mem.ptr.vma; dp->vma_invalidate_size = size; } @@ -519,10 +522,12 @@ int dm_io(struct dm_io_request *io_req, unsigned num_regions, if (!io_req->notify.fn) return sync_io(io_req->client, num_regions, where, - io_req->bi_rw, &dp, sync_error_bits); + io_req->bi_op, io_req->bi_op_flags, &dp, + sync_error_bits); - return async_io(io_req->client, num_regions, where, io_req->bi_rw, - &dp, io_req->notify.fn, io_req->notify.context); + return async_io(io_req->client, num_regions, where, io_req->bi_op, + io_req->bi_op_flags, &dp, io_req->notify.fn, + io_req->notify.context); } EXPORT_SYMBOL(dm_io); diff --git a/drivers/md/dm-kcopyd.c b/drivers/md/dm-kcopyd.c index 1452ed9..4182bc7d 100644 --- a/drivers/md/dm-kcopyd.c +++ b/drivers/md/dm-kcopyd.c @@ -465,10 +465,10 @@ static void complete_io(unsigned long error, void *context) io_job_finish(kc->throttle); if (error) { - if (job->rw & WRITE) - job->write_err |= error; - else + if (job->rw == READ) job->read_err = 1; + else + job->write_err |= error; if (!test_bit(DM_KCOPYD_IGNORE_ERROR, &job->flags)) { push(&kc->complete_jobs, job); @@ -477,13 +477,11 @@ static void complete_io(unsigned long error, void *context) } } - if (job->rw & WRITE) - push(&kc->complete_jobs, job); - - else { + if (job->rw == READ) { job->rw = WRITE; push(&kc->io_jobs, job); - } + } else + push(&kc->complete_jobs, job); wake(kc); } @@ -496,7 +494,8 @@ static int run_io_job(struct kcopyd_job *job) { int r; struct dm_io_request io_req = { - .bi_rw = job->rw, + .bi_op = job->rw, + .bi_op_flags = 0, .mem.type = DM_IO_PAGE_LIST, .mem.ptr.pl = job->pages, .mem.offset = 0, @@ -550,10 +549,10 @@ static int process_jobs(struct list_head *jobs, struct dm_kcopyd_client *kc, if (r < 0) { /* error this rogue job */ - if (job->rw & WRITE) - job->write_err = (unsigned long) -1L; - else + if (job->rw == READ) job->read_err = 1; + else + job->write_err = (unsigned long) -1L; push(&kc->complete_jobs, job); break; } @@ -734,7 +733,7 @@ int dm_kcopyd_copy(struct dm_kcopyd_client *kc, struct dm_io_region *from, /* * Use WRITE SAME to optimize zeroing if all dests support it. */ - job->rw = WRITE | REQ_WRITE_SAME; + job->rw = REQ_OP_WRITE_SAME; for (i = 0; i < job->num_dests; i++) if (!bdev_write_same(job->dests[i].bdev)) { job->rw = WRITE; diff --git a/drivers/md/dm-log-writes.c b/drivers/md/dm-log-writes.c index addcc4b..27630c5 100644 --- a/drivers/md/dm-log-writes.c +++ b/drivers/md/dm-log-writes.c @@ -205,7 +205,7 @@ static int write_metadata(struct log_writes_c *lc, void *entry, bio->bi_bdev = lc->logdev->bdev; bio->bi_end_io = log_end_io; bio->bi_private = lc; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; page = alloc_page(GFP_KERNEL); if (!page) { @@ -270,7 +270,7 @@ static int log_one_block(struct log_writes_c *lc, bio->bi_bdev = lc->logdev->bdev; bio->bi_end_io = log_end_io; bio->bi_private = lc; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; for (i = 0; i < block->vec_cnt; i++) { /* @@ -292,7 +292,7 @@ static int log_one_block(struct log_writes_c *lc, bio->bi_bdev = lc->logdev->bdev; bio->bi_end_io = log_end_io; bio->bi_private = lc; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; ret = bio_add_page(bio, block->vecs[i].bv_page, block->vecs[i].bv_len, 0); diff --git a/drivers/md/dm-log.c b/drivers/md/dm-log.c index 627d191..4ca2d1d 100644 --- a/drivers/md/dm-log.c +++ b/drivers/md/dm-log.c @@ -293,7 +293,7 @@ static void header_from_disk(struct log_header_core *core, struct log_header_dis static int rw_header(struct log_c *lc, int rw) { - lc->io_req.bi_rw = rw; + lc->io_req.bi_op = rw; return dm_io(&lc->io_req, 1, &lc->header_location, NULL); } @@ -306,7 +306,8 @@ static int flush_header(struct log_c *lc) .count = 0, }; - lc->io_req.bi_rw = WRITE_FLUSH; + lc->io_req.bi_op = REQ_OP_WRITE; + lc->io_req.bi_op_flags = WRITE_FLUSH; return dm_io(&lc->io_req, 1, &null_location, NULL); } diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c index b3ccf1e..8a86bc3 100644 --- a/drivers/md/dm-raid1.c +++ b/drivers/md/dm-raid1.c @@ -260,7 +260,8 @@ static int mirror_flush(struct dm_target *ti) struct dm_io_region io[ms->nr_mirrors]; struct mirror *m; struct dm_io_request io_req = { - .bi_rw = WRITE_FLUSH, + .bi_op = REQ_OP_WRITE, + .bi_op_flags = WRITE_FLUSH, .mem.type = DM_IO_KMEM, .mem.ptr.addr = NULL, .client = ms->io_client, @@ -541,7 +542,8 @@ static void read_async_bio(struct mirror *m, struct bio *bio) { struct dm_io_region io; struct dm_io_request io_req = { - .bi_rw = READ, + .bi_op = REQ_OP_READ, + .bi_op_flags = 0, .mem.type = DM_IO_BIO, .mem.ptr.bio = bio, .notify.fn = read_callback, @@ -654,7 +656,8 @@ static void do_write(struct mirror_set *ms, struct bio *bio) struct dm_io_region io[ms->nr_mirrors], *dest = io; struct mirror *m; struct dm_io_request io_req = { - .bi_rw = WRITE | (bio->bi_rw & WRITE_FLUSH_FUA), + .bi_op = REQ_OP_WRITE, + .bi_op_flags = bio->bi_rw & WRITE_FLUSH_FUA, .mem.type = DM_IO_BIO, .mem.ptr.bio = bio, .notify.fn = write_callback, @@ -663,7 +666,7 @@ static void do_write(struct mirror_set *ms, struct bio *bio) }; if (bio->bi_rw & REQ_DISCARD) { - io_req.bi_rw |= REQ_DISCARD; + io_req.bi_op = REQ_OP_DISCARD; io_req.mem.type = DM_IO_KMEM; io_req.mem.ptr.addr = NULL; } diff --git a/drivers/md/dm-snap-persistent.c b/drivers/md/dm-snap-persistent.c index 4d39093..b8cf956 100644 --- a/drivers/md/dm-snap-persistent.c +++ b/drivers/md/dm-snap-persistent.c @@ -226,8 +226,8 @@ static void do_metadata(struct work_struct *work) /* * Read or write a chunk aligned and sized block of data from a device. */ -static int chunk_io(struct pstore *ps, void *area, chunk_t chunk, int rw, - int metadata) +static int chunk_io(struct pstore *ps, void *area, chunk_t chunk, int op, + int op_flags, int metadata) { struct dm_io_region where = { .bdev = dm_snap_cow(ps->store->snap)->bdev, @@ -235,7 +235,8 @@ static int chunk_io(struct pstore *ps, void *area, chunk_t chunk, int rw, .count = ps->store->chunk_size, }; struct dm_io_request io_req = { - .bi_rw = rw, + .bi_op = op, + .bi_op_flags = op_flags, .mem.type = DM_IO_VMA, .mem.ptr.vma = area, .client = ps->io_client, @@ -281,14 +282,14 @@ static void skip_metadata(struct pstore *ps) * Read or write a metadata area. Remembering to skip the first * chunk which holds the header. */ -static int area_io(struct pstore *ps, int rw) +static int area_io(struct pstore *ps, int op, int op_flags) { int r; chunk_t chunk; chunk = area_location(ps, ps->current_area); - r = chunk_io(ps, ps->area, chunk, rw, 0); + r = chunk_io(ps, ps->area, chunk, op, op_flags, 0); if (r) return r; @@ -302,7 +303,8 @@ static void zero_memory_area(struct pstore *ps) static int zero_disk_area(struct pstore *ps, chunk_t area) { - return chunk_io(ps, ps->zero_area, area_location(ps, area), WRITE, 0); + return chunk_io(ps, ps->zero_area, area_location(ps, area), + REQ_OP_WRITE, 0, 0); } static int read_header(struct pstore *ps, int *new_snapshot) @@ -334,7 +336,7 @@ static int read_header(struct pstore *ps, int *new_snapshot) if (r) return r; - r = chunk_io(ps, ps->header_area, 0, READ, 1); + r = chunk_io(ps, ps->header_area, 0, REQ_OP_READ, 0, 1); if (r) goto bad; @@ -395,7 +397,7 @@ static int write_header(struct pstore *ps) dh->version = cpu_to_le32(ps->version); dh->chunk_size = cpu_to_le32(ps->store->chunk_size); - return chunk_io(ps, ps->header_area, 0, WRITE, 1); + return chunk_io(ps, ps->header_area, 0, REQ_OP_WRITE, 0, 1); } /* @@ -739,7 +741,7 @@ static void persistent_commit_exception(struct dm_exception_store *store, /* * Commit exceptions to disk. */ - if (ps->valid && area_io(ps, WRITE_FLUSH_FUA)) + if (ps->valid && area_io(ps, REQ_OP_WRITE, WRITE_FLUSH_FUA)) ps->valid = 0; /* @@ -779,7 +781,7 @@ static int persistent_prepare_merge(struct dm_exception_store *store, return 0; ps->current_area--; - r = area_io(ps, READ); + r = area_io(ps, REQ_OP_READ, 0); if (r < 0) return r; ps->current_committed = ps->exceptions_per_area; @@ -816,7 +818,7 @@ static int persistent_commit_merge(struct dm_exception_store *store, for (i = 0; i < nr_merged; i++) clear_exception(ps, ps->current_committed - 1 - i); - r = area_io(ps, WRITE_FLUSH_FUA); + r = area_io(ps, REQ_OP_WRITE, WRITE_FLUSH_FUA); if (r < 0) return r; diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index 69d86e1..6049078 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c @@ -339,7 +339,7 @@ static int __blkdev_issue_discard_async(struct block_device *bdev, sector_t sect struct bio *parent_bio) { struct request_queue *q = bdev_get_queue(bdev); - int type = REQ_WRITE | REQ_DISCARD; + int op_flags = 0; struct bio *bio; if (!q || !nr_sects) @@ -351,7 +351,7 @@ static int __blkdev_issue_discard_async(struct block_device *bdev, sector_t sect if (flags & BLKDEV_DISCARD_SECURE) { if (!blk_queue_secdiscard(q)) return -EOPNOTSUPP; - type |= REQ_SECURE; + op_flags |= REQ_SECURE; } /* @@ -366,7 +366,8 @@ static int __blkdev_issue_discard_async(struct block_device *bdev, sector_t sect bio->bi_iter.bi_sector = sector; bio->bi_bdev = bdev; bio->bi_iter.bi_size = nr_sects << 9; - bio->bi_rw = type; + bio->bi_op = REQ_OP_DISCARD; + bio->bi_rw = op_flags; submit_bio(bio); diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 1b2f962..5432da7 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -2412,6 +2412,7 @@ static struct mapped_device *alloc_dev(int minor) bio_init(&md->flush_bio); md->flush_bio.bi_bdev = md->bdev; + md->flush_bio.bi_op = REQ_OP_WRITE; md->flush_bio.bi_rw = WRITE_FLUSH; dm_stats_init(&md->stats); diff --git a/include/linux/dm-io.h b/include/linux/dm-io.h index a68cbe5..b91b023 100644 --- a/include/linux/dm-io.h +++ b/include/linux/dm-io.h @@ -57,7 +57,8 @@ struct dm_io_notify { */ struct dm_io_client; struct dm_io_request { - int bi_rw; /* READ|WRITE - not READA */ + int bi_op; /* REQ_OP */ + int bi_op_flags; /* rq_flag_bits */ struct dm_io_memory mem; /* Memory to use for io */ struct dm_io_notify notify; /* Synchronous if notify.fn is NULL */ struct dm_io_client *client; /* Client memory handler */ -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:40:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 93D047CCB for ; Fri, 15 Apr 2016 05:40:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3BC648F8039 for ; Fri, 15 Apr 2016 03:40:54 -0700 (PDT) X-ASG-Debug-ID: 1460716852-04bdf011035e4b50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id CXnIDeadx3EGMH16 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:40:52 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CCB35C062CE8; Fri, 15 Apr 2016 10:40:51 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe326010243; Fri, 15 Apr 2016 06:40:49 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 20/42] dm: pass dm stats data dir instead of bi_rw Date: Fri, 15 Apr 2016 05:39:40 -0500 X-ASG-Orig-Subj: [PATCH 20/42] dm: pass dm stats data dir instead of bi_rw Message-Id: <1460716802-2294-21-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716852 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie It looks like dm stats cares about the data direction (READ vs WRITE) and does not need the bio/request flags. Commands like REQ_FLUSH, REQ_DISCARD and REQ_WRITE_SAME are currently always set with REQ_WRITE, so the extra check for REQ_DISCARD in dm_stats_account_io is not needed. This patch has it use the bio and request data_dir helpers instead of accessing the bi_rw/cmd_flags directly. This makes the next patches that remove the operation from the cmd_flags and bi_rw easier, because we will no longer have the REQ_WRITE bit set for operations like discards. This patch is compile tested only. v2: 1. Merged Mike Snitzer's fixes to pass in int instead of unsigned long. 2. Fix 80 char col issues. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/md/dm-stats.c | 9 ++++----- drivers/md/dm.c | 21 ++++++++++++--------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/drivers/md/dm-stats.c b/drivers/md/dm-stats.c index 8289804..4fba26c 100644 --- a/drivers/md/dm-stats.c +++ b/drivers/md/dm-stats.c @@ -514,11 +514,10 @@ static void dm_stat_round(struct dm_stat *s, struct dm_stat_shared *shared, } static void dm_stat_for_entry(struct dm_stat *s, size_t entry, - unsigned long bi_rw, sector_t len, + int idx, sector_t len, struct dm_stats_aux *stats_aux, bool end, unsigned long duration_jiffies) { - unsigned long idx = bi_rw & REQ_WRITE; struct dm_stat_shared *shared = &s->stat_shared[entry]; struct dm_stat_percpu *p; @@ -584,7 +583,7 @@ static void dm_stat_for_entry(struct dm_stat *s, size_t entry, #endif } -static void __dm_stat_bio(struct dm_stat *s, unsigned long bi_rw, +static void __dm_stat_bio(struct dm_stat *s, int bi_rw, sector_t bi_sector, sector_t end_sector, bool end, unsigned long duration_jiffies, struct dm_stats_aux *stats_aux) @@ -645,8 +644,8 @@ void dm_stats_account_io(struct dm_stats *stats, unsigned long bi_rw, last = raw_cpu_ptr(stats->last); stats_aux->merged = (bi_sector == (ACCESS_ONCE(last->last_sector) && - ((bi_rw & (REQ_WRITE | REQ_DISCARD)) == - (ACCESS_ONCE(last->last_rw) & (REQ_WRITE | REQ_DISCARD))) + ((bi_rw == WRITE) == + (ACCESS_ONCE(last->last_rw) == WRITE)) )); ACCESS_ONCE(last->last_sector) = end_sector; ACCESS_ONCE(last->last_rw) = bi_rw; diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 5432da7..98fea0e 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -723,8 +723,9 @@ static void start_io_acct(struct dm_io *io) atomic_inc_return(&md->pending[rw])); if (unlikely(dm_stats_used(&md->stats))) - dm_stats_account_io(&md->stats, bio->bi_rw, bio->bi_iter.bi_sector, - bio_sectors(bio), false, 0, &io->stats_aux); + dm_stats_account_io(&md->stats, bio_data_dir(bio), + bio->bi_iter.bi_sector, bio_sectors(bio), + false, 0, &io->stats_aux); } static void end_io_acct(struct dm_io *io) @@ -738,8 +739,9 @@ static void end_io_acct(struct dm_io *io) generic_end_io_acct(rw, &dm_disk(md)->part0, io->start_time); if (unlikely(dm_stats_used(&md->stats))) - dm_stats_account_io(&md->stats, bio->bi_rw, bio->bi_iter.bi_sector, - bio_sectors(bio), true, duration, &io->stats_aux); + dm_stats_account_io(&md->stats, bio_data_dir(bio), + bio->bi_iter.bi_sector, bio_sectors(bio), + true, duration, &io->stats_aux); /* * After this is decremented the bio must not be touched if it is @@ -1121,9 +1123,9 @@ static void rq_end_stats(struct mapped_device *md, struct request *orig) if (unlikely(dm_stats_used(&md->stats))) { struct dm_rq_target_io *tio = tio_from_request(orig); tio->duration_jiffies = jiffies - tio->duration_jiffies; - dm_stats_account_io(&md->stats, orig->cmd_flags, blk_rq_pos(orig), - tio->n_sectors, true, tio->duration_jiffies, - &tio->stats_aux); + dm_stats_account_io(&md->stats, rq_data_dir(orig), + blk_rq_pos(orig), tio->n_sectors, true, + tio->duration_jiffies, &tio->stats_aux); } } @@ -2082,8 +2084,9 @@ static void dm_start_request(struct mapped_device *md, struct request *orig) struct dm_rq_target_io *tio = tio_from_request(orig); tio->duration_jiffies = jiffies; tio->n_sectors = blk_rq_sectors(orig); - dm_stats_account_io(&md->stats, orig->cmd_flags, blk_rq_pos(orig), - tio->n_sectors, false, 0, &tio->stats_aux); + dm_stats_account_io(&md->stats, rq_data_dir(orig), + blk_rq_pos(orig), tio->n_sectors, false, 0, + &tio->stats_aux); } /* -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:40:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7C0417D06 for ; Fri, 15 Apr 2016 05:40:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1D173304048 for ; Fri, 15 Apr 2016 03:40:56 -0700 (PDT) X-ASG-Debug-ID: 1460716854-04bdf011035e4b60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id SYJAgX0z2Q3izGf4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:40:54 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1CE077F09D; Fri, 15 Apr 2016 10:40:54 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe327010243; Fri, 15 Apr 2016 06:40:51 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 21/42] bcache: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 05:39:41 -0500 X-ASG-Orig-Subj: [PATCH 21/42] bcache: set bi_op to REQ_OP Message-Id: <1460716802-2294-22-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716854 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has bcache use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/md/bcache/btree.c | 2 ++ drivers/md/bcache/debug.c | 2 ++ drivers/md/bcache/io.c | 2 +- drivers/md/bcache/journal.c | 7 ++++--- drivers/md/bcache/movinggc.c | 2 +- drivers/md/bcache/request.c | 9 +++++---- drivers/md/bcache/super.c | 26 +++++++++++++++----------- drivers/md/bcache/writeback.c | 4 ++-- 8 files changed, 32 insertions(+), 22 deletions(-) diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c index 22b9e34..752a44f 100644 --- a/drivers/md/bcache/btree.c +++ b/drivers/md/bcache/btree.c @@ -295,6 +295,7 @@ static void bch_btree_node_read(struct btree *b) closure_init_stack(&cl); bio = bch_bbio_alloc(b->c); + bio->bi_op = REQ_OP_READ; bio->bi_rw = REQ_META|READ_SYNC; bio->bi_iter.bi_size = KEY_SIZE(&b->key) << 9; bio->bi_end_io = btree_node_read_endio; @@ -397,6 +398,7 @@ static void do_btree_node_write(struct btree *b) b->bio->bi_end_io = btree_node_write_endio; b->bio->bi_private = cl; + b->bio->bi_op = REQ_OP_WRITE; b->bio->bi_rw = REQ_META|WRITE_SYNC|REQ_FUA; b->bio->bi_iter.bi_size = roundup(set_bytes(i), block_bytes(b->c)); bch_bio_map(b->bio, i); diff --git a/drivers/md/bcache/debug.c b/drivers/md/bcache/debug.c index 52b6bcf..8df9e66 100644 --- a/drivers/md/bcache/debug.c +++ b/drivers/md/bcache/debug.c @@ -52,6 +52,7 @@ void bch_btree_verify(struct btree *b) bio->bi_bdev = PTR_CACHE(b->c, &b->key, 0)->bdev; bio->bi_iter.bi_sector = PTR_OFFSET(&b->key, 0); bio->bi_iter.bi_size = KEY_SIZE(&v->key) << 9; + bio->bi_op = REQ_OP_READ; bio->bi_rw = REQ_META|READ_SYNC; bch_bio_map(bio, sorted); @@ -114,6 +115,7 @@ void bch_data_verify(struct cached_dev *dc, struct bio *bio) check = bio_clone(bio, GFP_NOIO); if (!check) return; + check->bi_op = REQ_OP_READ; check->bi_rw |= READ_SYNC; if (bio_alloc_pages(check, GFP_NOIO)) diff --git a/drivers/md/bcache/io.c b/drivers/md/bcache/io.c index 86a0bb8..f10a9a0 100644 --- a/drivers/md/bcache/io.c +++ b/drivers/md/bcache/io.c @@ -111,7 +111,7 @@ void bch_bbio_count_io_errors(struct cache_set *c, struct bio *bio, struct bbio *b = container_of(bio, struct bbio, bio); struct cache *ca = PTR_CACHE(c, &b->key, 0); - unsigned threshold = bio->bi_rw & REQ_WRITE + unsigned threshold = op_is_write(bio->bi_op) ? c->congested_write_threshold_us : c->congested_read_threshold_us; diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c index af3f9f7..68fa0f0 100644 --- a/drivers/md/bcache/journal.c +++ b/drivers/md/bcache/journal.c @@ -54,7 +54,7 @@ reread: left = ca->sb.bucket_size - offset; bio_reset(bio); bio->bi_iter.bi_sector = bucket + offset; bio->bi_bdev = ca->bdev; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; bio->bi_iter.bi_size = len << 9; bio->bi_end_io = journal_read_endio; @@ -452,7 +452,7 @@ static void do_journal_discard(struct cache *ca) bio->bi_iter.bi_sector = bucket_to_sector(ca->set, ca->sb.d[ja->discard_idx]); bio->bi_bdev = ca->bdev; - bio->bi_rw = REQ_WRITE|REQ_DISCARD; + bio->bi_op = REQ_OP_DISCARD; bio->bi_max_vecs = 1; bio->bi_io_vec = bio->bi_inline_vecs; bio->bi_iter.bi_size = bucket_bytes(ca); @@ -626,7 +626,8 @@ static void journal_write_unlocked(struct closure *cl) bio_reset(bio); bio->bi_iter.bi_sector = PTR_OFFSET(k, i); bio->bi_bdev = ca->bdev; - bio->bi_rw = REQ_WRITE|REQ_SYNC|REQ_META|REQ_FLUSH|REQ_FUA; + bio->bi_op = REQ_OP_WRITE; + bio->bi_rw = REQ_SYNC|REQ_META|REQ_FLUSH|REQ_FUA; bio->bi_iter.bi_size = sectors << 9; bio->bi_end_io = journal_write_endio; diff --git a/drivers/md/bcache/movinggc.c b/drivers/md/bcache/movinggc.c index b929fc9..f33860a 100644 --- a/drivers/md/bcache/movinggc.c +++ b/drivers/md/bcache/movinggc.c @@ -163,7 +163,7 @@ static void read_moving(struct cache_set *c) moving_init(io); bio = &io->bio.bio; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; bio->bi_end_io = read_moving_endio; if (bio_alloc_pages(bio, GFP_KERNEL)) diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c index 25fa844..cd6837c 100644 --- a/drivers/md/bcache/request.c +++ b/drivers/md/bcache/request.c @@ -253,7 +253,7 @@ static void bch_data_insert_start(struct closure *cl) trace_bcache_cache_insert(k); bch_keylist_push(&op->insert_keys); - n->bi_rw |= REQ_WRITE; + n->bi_op = REQ_OP_WRITE; bch_submit_bbio(n, op->c, k, 0); } while (n != bio); @@ -383,7 +383,7 @@ static bool check_should_bypass(struct cached_dev *dc, struct bio *bio) if (mode == CACHE_MODE_NONE || (mode == CACHE_MODE_WRITEAROUND && - (bio->bi_rw & REQ_WRITE))) + op_is_write(bio->bi_op))) goto skip; if (bio->bi_iter.bi_sector & (c->sb.block_size - 1) || @@ -404,7 +404,7 @@ static bool check_should_bypass(struct cached_dev *dc, struct bio *bio) if (!congested && mode == CACHE_MODE_WRITEBACK && - (bio->bi_rw & REQ_WRITE) && + op_is_write(bio->bi_op) && (bio->bi_rw & REQ_SYNC)) goto rescale; @@ -657,7 +657,7 @@ static inline struct search *search_alloc(struct bio *bio, s->cache_miss = NULL; s->d = d; s->recoverable = 1; - s->write = (bio->bi_rw & REQ_WRITE) != 0; + s->write = op_is_write(bio->bi_op); s->read_dirty_data = 0; s->start_time = jiffies; @@ -925,6 +925,7 @@ static void cached_dev_write(struct cached_dev *dc, struct search *s) struct bio *flush = bio_alloc_bioset(GFP_NOIO, 0, dc->disk.bio_split); + flush->bi_op = REQ_OP_WRITE; flush->bi_rw = WRITE_FLUSH; flush->bi_bdev = bio->bi_bdev; flush->bi_end_io = request_endio; diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index 1eb526a7..16e6108 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c @@ -212,7 +212,8 @@ static void __write_super(struct cache_sb *sb, struct bio *bio) unsigned i; bio->bi_iter.bi_sector = SB_SECTOR; - bio->bi_rw = REQ_WRITE|REQ_SYNC|REQ_META; + bio->bi_op = REQ_OP_WRITE; + bio->bi_rw = REQ_SYNC|REQ_META; bio->bi_iter.bi_size = SB_SIZE; bch_bio_map(bio, NULL); @@ -333,7 +334,7 @@ static void uuid_io_unlock(struct closure *cl) up(&c->uuid_write_mutex); } -static void uuid_io(struct cache_set *c, unsigned long rw, +static void uuid_io(struct cache_set *c, int op, unsigned long op_flags, struct bkey *k, struct closure *parent) { struct closure *cl = &c->uuid_write; @@ -348,7 +349,8 @@ static void uuid_io(struct cache_set *c, unsigned long rw, for (i = 0; i < KEY_PTRS(k); i++) { struct bio *bio = bch_bbio_alloc(c); - bio->bi_rw = REQ_SYNC|REQ_META|rw; + bio->bi_op = op; + bio->bi_rw = REQ_SYNC|REQ_META|op_flags; bio->bi_iter.bi_size = KEY_SIZE(k) << 9; bio->bi_end_io = uuid_endio; @@ -357,12 +359,12 @@ static void uuid_io(struct cache_set *c, unsigned long rw, bch_submit_bbio(bio, c, k, i); - if (!(rw & WRITE)) + if (op != REQ_OP_WRITE) break; } bch_extent_to_text(buf, sizeof(buf), k); - pr_debug("%s UUIDs at %s", rw & REQ_WRITE ? "wrote" : "read", buf); + pr_debug("%s UUIDs at %s", op == REQ_OP_WRITE ? "wrote" : "read", buf); for (u = c->uuids; u < c->uuids + c->nr_uuids; u++) if (!bch_is_zero(u->uuid, 16)) @@ -381,7 +383,7 @@ static char *uuid_read(struct cache_set *c, struct jset *j, struct closure *cl) return "bad uuid pointer"; bkey_copy(&c->uuid_bucket, k); - uuid_io(c, READ_SYNC, k, cl); + uuid_io(c, REQ_OP_READ, READ_SYNC, k, cl); if (j->version < BCACHE_JSET_VERSION_UUIDv1) { struct uuid_entry_v0 *u0 = (void *) c->uuids; @@ -426,7 +428,7 @@ static int __uuid_write(struct cache_set *c) return 1; SET_KEY_SIZE(&k.key, c->sb.bucket_size); - uuid_io(c, REQ_WRITE, &k.key, &cl); + uuid_io(c, REQ_OP_WRITE, 0, &k.key, &cl); closure_sync(&cl); bkey_copy(&c->uuid_bucket, &k.key); @@ -498,7 +500,8 @@ static void prio_endio(struct bio *bio) closure_put(&ca->prio); } -static void prio_io(struct cache *ca, uint64_t bucket, unsigned long rw) +static void prio_io(struct cache *ca, uint64_t bucket, int op, + unsigned long op_flags) { struct closure *cl = &ca->prio; struct bio *bio = bch_bbio_alloc(ca->set); @@ -507,7 +510,8 @@ static void prio_io(struct cache *ca, uint64_t bucket, unsigned long rw) bio->bi_iter.bi_sector = bucket * ca->sb.bucket_size; bio->bi_bdev = ca->bdev; - bio->bi_rw = REQ_SYNC|REQ_META|rw; + bio->bi_op = op; + bio->bi_rw = REQ_SYNC|REQ_META|op_flags; bio->bi_iter.bi_size = bucket_bytes(ca); bio->bi_end_io = prio_endio; @@ -557,7 +561,7 @@ void bch_prio_write(struct cache *ca) BUG_ON(bucket == -1); mutex_unlock(&ca->set->bucket_lock); - prio_io(ca, bucket, REQ_WRITE); + prio_io(ca, bucket, REQ_OP_WRITE, 0); mutex_lock(&ca->set->bucket_lock); ca->prio_buckets[i] = bucket; @@ -599,7 +603,7 @@ static void prio_read(struct cache *ca, uint64_t bucket) ca->prio_last_buckets[bucket_nr] = bucket; bucket_nr++; - prio_io(ca, bucket, READ_SYNC); + prio_io(ca, bucket, REQ_OP_READ, READ_SYNC); if (p->csum != bch_crc64(&p->magic, bucket_bytes(ca) - 8)) pr_warn("bad csum reading priorities"); diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c index b9346cd..96ddf28 100644 --- a/drivers/md/bcache/writeback.c +++ b/drivers/md/bcache/writeback.c @@ -183,7 +183,7 @@ static void write_dirty(struct closure *cl) struct keybuf_key *w = io->bio.bi_private; dirty_init(w); - io->bio.bi_rw = WRITE; + io->bio.bi_op = REQ_OP_WRITE; io->bio.bi_iter.bi_sector = KEY_START(&w->key); io->bio.bi_bdev = io->dc->bdev; io->bio.bi_end_io = dirty_endio; @@ -256,7 +256,7 @@ static void read_dirty(struct cached_dev *dc) io->bio.bi_iter.bi_sector = PTR_OFFSET(&w->key, 0); io->bio.bi_bdev = PTR_CACHE(dc->disk.c, &w->key, 0)->bdev; - io->bio.bi_rw = READ; + io->bio.bi_op = REQ_OP_READ; io->bio.bi_end_io = read_dirty_endio; if (bio_alloc_pages(&io->bio, GFP_KERNEL)) -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:40:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 308E17CA3 for ; Fri, 15 Apr 2016 05:40:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C009D8F8039 for ; Fri, 15 Apr 2016 03:40:58 -0700 (PDT) X-ASG-Debug-ID: 1460716856-04bdf011055e4b70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id iNFOBx3Odo4vnye2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:40:56 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5EBC281117; Fri, 15 Apr 2016 10:40:56 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe328010243; Fri, 15 Apr 2016 06:40:54 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 22/42] drbd: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 05:39:42 -0500 X-ASG-Orig-Subj: [PATCH 22/42] drbd: set bi_op to REQ_OP Message-Id: <1460716802-2294-23-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716856 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has drbd use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Lars and Philip, I might have split this patch up a little weird. The block layer has compat so you can set either bi_rw or bi_op. This patch handles setting up the bio in drbd. I then converted all the block device drivers and in 0037-block-fs-drivers-do-not-test-bi_rw-for-REQ_OPs.patch I modified the bi_rw checks so they use bi_op. This patch is compile tested only. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/block/drbd/drbd_actlog.c | 29 ++++++++++++++++------------- drivers/block/drbd/drbd_bitmap.c | 6 +++--- drivers/block/drbd/drbd_int.h | 4 ++-- drivers/block/drbd/drbd_main.c | 5 +++-- drivers/block/drbd/drbd_receiver.c | 37 +++++++++++++++++++++++++------------ drivers/block/drbd/drbd_worker.c | 3 ++- 6 files changed, 51 insertions(+), 33 deletions(-) diff --git a/drivers/block/drbd/drbd_actlog.c b/drivers/block/drbd/drbd_actlog.c index 6069e15..2fa8534 100644 --- a/drivers/block/drbd/drbd_actlog.c +++ b/drivers/block/drbd/drbd_actlog.c @@ -137,19 +137,19 @@ void wait_until_done_or_force_detached(struct drbd_device *device, struct drbd_b static int _drbd_md_sync_page_io(struct drbd_device *device, struct drbd_backing_dev *bdev, - sector_t sector, int rw) + sector_t sector, int op) { struct bio *bio; /* we do all our meta data IO in aligned 4k blocks. */ const int size = 4096; - int err; + int err, op_flags = 0; device->md_io.done = 0; device->md_io.error = -ENODEV; - if ((rw & WRITE) && !test_bit(MD_NO_FUA, &device->flags)) - rw |= REQ_FUA | REQ_FLUSH; - rw |= REQ_SYNC | REQ_NOIDLE; + if ((op == REQ_OP_WRITE) && !test_bit(MD_NO_FUA, &device->flags)) + op_flags |= REQ_FUA | REQ_FLUSH; + op_flags |= REQ_SYNC | REQ_NOIDLE; bio = bio_alloc_drbd(GFP_NOIO); bio->bi_bdev = bdev->md_bdev; @@ -159,9 +159,10 @@ static int _drbd_md_sync_page_io(struct drbd_device *device, goto out; bio->bi_private = device; bio->bi_end_io = drbd_md_endio; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; - if (!(rw & WRITE) && device->state.disk == D_DISKLESS && device->ldev == NULL) + if (op != REQ_OP_WRITE && device->state.disk == D_DISKLESS && device->ldev == NULL) /* special case, drbd_md_read() during drbd_adm_attach(): no get_ldev */ ; else if (!get_ldev_if_state(device, D_ATTACHING)) { @@ -174,7 +175,7 @@ static int _drbd_md_sync_page_io(struct drbd_device *device, bio_get(bio); /* one bio_put() is in the completion handler */ atomic_inc(&device->md_io.in_use); /* drbd_md_put_buffer() is in the completion handler */ device->md_io.submit_jif = jiffies; - if (drbd_insert_fault(device, (rw & WRITE) ? DRBD_FAULT_MD_WR : DRBD_FAULT_MD_RD)) + if (drbd_insert_fault(device, (op == REQ_OP_WRITE) ? DRBD_FAULT_MD_WR : DRBD_FAULT_MD_RD)) bio_io_error(bio); else submit_bio(bio); @@ -188,7 +189,7 @@ static int _drbd_md_sync_page_io(struct drbd_device *device, } int drbd_md_sync_page_io(struct drbd_device *device, struct drbd_backing_dev *bdev, - sector_t sector, int rw) + sector_t sector, int op) { int err; D_ASSERT(device, atomic_read(&device->md_io.in_use) == 1); @@ -197,19 +198,21 @@ int drbd_md_sync_page_io(struct drbd_device *device, struct drbd_backing_dev *bd dynamic_drbd_dbg(device, "meta_data io: %s [%d]:%s(,%llus,%s) %pS\n", current->comm, current->pid, __func__, - (unsigned long long)sector, (rw & WRITE) ? "WRITE" : "READ", + (unsigned long long)sector, (op == REQ_OP_WRITE) ? "WRITE" : "READ", (void*)_RET_IP_ ); if (sector < drbd_md_first_sector(bdev) || sector + 7 > drbd_md_last_sector(bdev)) drbd_alert(device, "%s [%d]:%s(,%llus,%s) out of range md access!\n", current->comm, current->pid, __func__, - (unsigned long long)sector, (rw & WRITE) ? "WRITE" : "READ"); + (unsigned long long)sector, + (op == REQ_OP_WRITE) ? "WRITE" : "READ"); - err = _drbd_md_sync_page_io(device, bdev, sector, rw); + err = _drbd_md_sync_page_io(device, bdev, sector, op); if (err) { drbd_err(device, "drbd_md_sync_page_io(,%llus,%s) failed with error %d\n", - (unsigned long long)sector, (rw & WRITE) ? "WRITE" : "READ", err); + (unsigned long long)sector, + (op == REQ_OP_WRITE) ? "WRITE" : "READ", err); } return err; } diff --git a/drivers/block/drbd/drbd_bitmap.c b/drivers/block/drbd/drbd_bitmap.c index e8959fe..126bf4a 100644 --- a/drivers/block/drbd/drbd_bitmap.c +++ b/drivers/block/drbd/drbd_bitmap.c @@ -980,7 +980,7 @@ static void bm_page_io_async(struct drbd_bm_aio_ctx *ctx, int page_nr) __must_ho struct drbd_bitmap *b = device->bitmap; struct page *page; unsigned int len; - unsigned int rw = (ctx->flags & BM_AIO_READ) ? READ : WRITE; + unsigned int op = (ctx->flags & BM_AIO_READ) ? REQ_OP_READ : REQ_OP_WRITE; sector_t on_disk_sector = device->ldev->md.md_offset + device->ldev->md.bm_offset; @@ -1011,9 +1011,9 @@ static void bm_page_io_async(struct drbd_bm_aio_ctx *ctx, int page_nr) __must_ho bio_add_page(bio, page, len, 0); bio->bi_private = ctx; bio->bi_end_io = drbd_bm_endio; - bio->bi_rw = rw; + bio->bi_op = op; - if (drbd_insert_fault(device, (rw & WRITE) ? DRBD_FAULT_MD_WR : DRBD_FAULT_MD_RD)) { + if (drbd_insert_fault(device, (op == REQ_OP_WRITE) ? DRBD_FAULT_MD_WR : DRBD_FAULT_MD_RD)) { bio_io_error(bio); } else { submit_bio(bio); diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index 7a1cf7e..33f0b82 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h @@ -1507,7 +1507,7 @@ extern int drbd_resync_finished(struct drbd_device *device); extern void *drbd_md_get_buffer(struct drbd_device *device, const char *intent); extern void drbd_md_put_buffer(struct drbd_device *device); extern int drbd_md_sync_page_io(struct drbd_device *device, - struct drbd_backing_dev *bdev, sector_t sector, int rw); + struct drbd_backing_dev *bdev, sector_t sector, int op); extern void drbd_ov_out_of_sync_found(struct drbd_device *, sector_t, int); extern void wait_until_done_or_force_detached(struct drbd_device *device, struct drbd_backing_dev *bdev, unsigned int *done); @@ -1557,7 +1557,7 @@ extern bool drbd_rs_should_slow_down(struct drbd_device *device, sector_t sector bool throttle_if_app_is_waiting); extern int drbd_submit_peer_request(struct drbd_device *, struct drbd_peer_request *, const unsigned, - const int); + const unsigned, const int); extern int drbd_free_peer_reqs(struct drbd_device *, struct list_head *); extern struct drbd_peer_request *drbd_alloc_peer_req(struct drbd_peer_device *, u64, sector_t, unsigned int, diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 2ba1494..30c93d6 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c @@ -3061,7 +3061,7 @@ void drbd_md_write(struct drbd_device *device, void *b) D_ASSERT(device, drbd_md_ss(device->ldev) == device->ldev->md.md_offset); sector = device->ldev->md.md_offset; - if (drbd_md_sync_page_io(device, device->ldev, sector, WRITE)) { + if (drbd_md_sync_page_io(device, device->ldev, sector, REQ_OP_WRITE)) { /* this was a try anyways ... */ drbd_err(device, "meta data update failed!\n"); drbd_chk_io_error(device, 1, DRBD_META_IO_ERROR); @@ -3263,7 +3263,8 @@ int drbd_md_read(struct drbd_device *device, struct drbd_backing_dev *bdev) * Affects the paranoia out-of-range access check in drbd_md_sync_page_io(). */ bdev->md.md_size_sect = 8; - if (drbd_md_sync_page_io(device, bdev, bdev->md.md_offset, READ)) { + if (drbd_md_sync_page_io(device, bdev, bdev->md.md_offset, + REQ_OP_READ)) { /* NOTE: can't do normal error processing here as this is called BEFORE disk is attached */ drbd_err(device, "Error while reading metadata.\n"); diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index 050aaa1..a0b95da 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c @@ -1398,7 +1398,8 @@ void drbd_bump_write_ordering(struct drbd_resource *resource, struct drbd_backin /* TODO allocate from our own bio_set. */ int drbd_submit_peer_request(struct drbd_device *device, struct drbd_peer_request *peer_req, - const unsigned rw, const int fault_type) + const unsigned op, const unsigned op_flags, + const int fault_type) { struct bio *bios = NULL; struct bio *bio; @@ -1450,7 +1451,8 @@ next_bio: /* > peer_req->i.sector, unless this is the first bio */ bio->bi_iter.bi_sector = sector; bio->bi_bdev = device->ldev->backing_bdev; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; bio->bi_private = peer_req; bio->bi_end_io = drbd_peer_request_endio; @@ -1458,7 +1460,7 @@ next_bio: bios = bio; ++n_bios; - if (rw & REQ_DISCARD) { + if (op == REQ_OP_DISCARD) { bio->bi_iter.bi_size = data_size; goto submit; } @@ -1830,7 +1832,8 @@ static int recv_resync_read(struct drbd_peer_device *peer_device, sector_t secto spin_unlock_irq(&device->resource->req_lock); atomic_add(pi->size >> 9, &device->rs_sect_ev); - if (drbd_submit_peer_request(device, peer_req, WRITE, DRBD_FAULT_RS_WR) == 0) + if (drbd_submit_peer_request(device, peer_req, REQ_OP_WRITE, 0, + DRBD_FAULT_RS_WR) == 0) return 0; /* don't care for the reason here */ @@ -2152,12 +2155,19 @@ static int wait_for_and_update_peer_seq(struct drbd_peer_device *peer_device, co /* see also bio_flags_to_wire() * DRBD_REQ_*, because we need to semantically map the flags to data packet * flags and back. We may replicate to other kernel versions. */ -static unsigned long wire_flags_to_bio(u32 dpf) +static unsigned long wire_flags_to_bio_flags(u32 dpf) { return (dpf & DP_RW_SYNC ? REQ_SYNC : 0) | (dpf & DP_FUA ? REQ_FUA : 0) | - (dpf & DP_FLUSH ? REQ_FLUSH : 0) | - (dpf & DP_DISCARD ? REQ_DISCARD : 0); + (dpf & DP_FLUSH ? REQ_FLUSH : 0); +} + +static unsigned long wire_flags_to_bio_op(u32 dpf) +{ + if (dpf & DP_DISCARD) + return REQ_OP_DISCARD; + else + return REQ_OP_WRITE; } static void fail_postponed_requests(struct drbd_device *device, sector_t sector, @@ -2303,7 +2313,7 @@ static int receive_Data(struct drbd_connection *connection, struct packet_info * struct drbd_peer_request *peer_req; struct p_data *p = pi->data; u32 peer_seq = be32_to_cpu(p->seq_num); - int rw = WRITE; + int op, op_flags; u32 dp_flags; int err, tp; @@ -2342,14 +2352,15 @@ static int receive_Data(struct drbd_connection *connection, struct packet_info * peer_req->flags |= EE_APPLICATION; dp_flags = be32_to_cpu(p->dp_flags); - rw |= wire_flags_to_bio(dp_flags); + op = wire_flags_to_bio_op(dp_flags); + op_flags = wire_flags_to_bio_flags(dp_flags); if (pi->cmd == P_TRIM) { struct request_queue *q = bdev_get_queue(device->ldev->backing_bdev); peer_req->flags |= EE_IS_TRIM; if (!blk_queue_discard(q)) peer_req->flags |= EE_IS_TRIM_USE_ZEROOUT; D_ASSERT(peer_device, peer_req->i.size > 0); - D_ASSERT(peer_device, rw & REQ_DISCARD); + D_ASSERT(peer_device, op == REQ_OP_DISCARD); D_ASSERT(peer_device, peer_req->pages == NULL); } else if (peer_req->pages == NULL) { D_ASSERT(device, peer_req->i.size == 0); @@ -2433,7 +2444,8 @@ static int receive_Data(struct drbd_connection *connection, struct packet_info * peer_req->flags |= EE_CALL_AL_COMPLETE_IO; } - err = drbd_submit_peer_request(device, peer_req, rw, DRBD_FAULT_DT_WR); + err = drbd_submit_peer_request(device, peer_req, op, op_flags, + DRBD_FAULT_DT_WR); if (!err) return 0; @@ -2723,7 +2735,8 @@ submit_for_resync: submit: update_receiver_timing_details(connection, drbd_submit_peer_request); inc_unacked(device); - if (drbd_submit_peer_request(device, peer_req, READ, fault_type) == 0) + if (drbd_submit_peer_request(device, peer_req, REQ_OP_READ, 0, + fault_type) == 0) return 0; /* don't care for the reason here */ diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_worker.c index 4d87499..2a04b43 100644 --- a/drivers/block/drbd/drbd_worker.c +++ b/drivers/block/drbd/drbd_worker.c @@ -397,7 +397,8 @@ static int read_for_csum(struct drbd_peer_device *peer_device, sector_t sector, spin_unlock_irq(&device->resource->req_lock); atomic_add(size >> 9, &device->rs_sect_ev); - if (drbd_submit_peer_request(device, peer_req, READ, DRBD_FAULT_RS_RD) == 0) + if (drbd_submit_peer_request(device, peer_req, REQ_OP_READ, 0, + DRBD_FAULT_RS_RD) == 0) return 0; /* If it failed because of ENOMEM, retry should help. If it failed -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:41:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3B2437D02 for ; Fri, 15 Apr 2016 05:41:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0FAAC8F8039 for ; Fri, 15 Apr 2016 03:41:02 -0700 (PDT) X-ASG-Debug-ID: 1460716858-04cbb02e1d2e9820001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ZqdqZGtLmEmJZoyV (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:40:59 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AA40E15553; Fri, 15 Apr 2016 10:40:58 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe329010243; Fri, 15 Apr 2016 06:40:56 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 23/42] md/raid: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 05:39:43 -0500 X-ASG-Orig-Subj: [PATCH 23/42] md/raid: set bi_op to REQ_OP Message-Id: <1460716802-2294-24-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716859 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has md use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/md/bitmap.c | 2 +- drivers/md/dm-raid.c | 5 +++-- drivers/md/md.c | 11 +++++++---- drivers/md/md.h | 3 ++- drivers/md/raid1.c | 34 ++++++++++++++++---------------- drivers/md/raid10.c | 50 ++++++++++++++++++++++++++---------------------- drivers/md/raid5-cache.c | 25 +++++++++++++++--------- drivers/md/raid5.c | 48 ++++++++++++++++++++++++++-------------------- 8 files changed, 101 insertions(+), 77 deletions(-) diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index 8b2e16f..9e8019e 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c @@ -159,7 +159,7 @@ static int read_sb_page(struct mddev *mddev, loff_t offset, if (sync_page_io(rdev, target, roundup(size, bdev_logical_block_size(rdev->bdev)), - page, READ, true)) { + page, REQ_OP_READ, 0, true)) { page->index = index; return 0; } diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index a090121..43a749c 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c @@ -792,7 +792,7 @@ static int read_disk_sb(struct md_rdev *rdev, int size) if (rdev->sb_loaded) return 0; - if (!sync_page_io(rdev, 0, size, rdev->sb_page, READ, 1)) { + if (!sync_page_io(rdev, 0, size, rdev->sb_page, REQ_OP_READ, 0, 1)) { DMERR("Failed to read superblock of device at position %d", rdev->raid_disk); md_error(rdev->mddev, rdev); @@ -1646,7 +1646,8 @@ static void attempt_restore_of_faulty_devices(struct raid_set *rs) for (i = 0; i < rs->md.raid_disks; i++) { r = &rs->dev[i].rdev; if (test_bit(Faulty, &r->flags) && r->sb_page && - sync_page_io(r, 0, r->sb_size, r->sb_page, READ, 1)) { + sync_page_io(r, 0, r->sb_size, r->sb_page, REQ_OP_READ, 0, + 1)) { DMINFO("Faulty %s device #%d has readable super block." " Attempting to revive it.", rs->raid_type->name, i); diff --git a/drivers/md/md.c b/drivers/md/md.c index ec3c98d..9c40368 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -392,6 +392,7 @@ static void submit_flushes(struct work_struct *ws) bi->bi_end_io = md_end_flush; bi->bi_private = rdev; bi->bi_bdev = rdev->bdev; + bi->bi_op = REQ_OP_WRITE; bi->bi_rw = WRITE_FLUSH; atomic_inc(&mddev->flush_pending); submit_bio(bi); @@ -741,6 +742,7 @@ void md_super_write(struct mddev *mddev, struct md_rdev *rdev, bio_add_page(bio, page, size, 0); bio->bi_private = rdev; bio->bi_end_io = super_written; + bio->bi_op = REQ_OP_WRITE; bio->bi_rw = WRITE_FLUSH_FUA; atomic_inc(&mddev->pending_writes); @@ -754,14 +756,15 @@ void md_super_wait(struct mddev *mddev) } int sync_page_io(struct md_rdev *rdev, sector_t sector, int size, - struct page *page, int rw, bool metadata_op) + struct page *page, int op, int op_flags, bool metadata_op) { struct bio *bio = bio_alloc_mddev(GFP_NOIO, 1, rdev->mddev); int ret; bio->bi_bdev = (metadata_op && rdev->meta_bdev) ? rdev->meta_bdev : rdev->bdev; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; if (metadata_op) bio->bi_iter.bi_sector = sector + rdev->sb_start; else if (rdev->mddev->reshape_position != MaxSector && @@ -787,7 +790,7 @@ static int read_disk_sb(struct md_rdev *rdev, int size) if (rdev->sb_loaded) return 0; - if (!sync_page_io(rdev, 0, size, rdev->sb_page, READ, true)) + if (!sync_page_io(rdev, 0, size, rdev->sb_page, REQ_OP_READ, 0, true)) goto fail; rdev->sb_loaded = 1; return 0; @@ -1473,7 +1476,7 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_ return -EINVAL; bb_sector = (long long)offset; if (!sync_page_io(rdev, bb_sector, sectors << 9, - rdev->bb_page, READ, true)) + rdev->bb_page, REQ_OP_READ, 0, true)) return -EIO; bbp = (u64 *)page_address(rdev->bb_page); rdev->badblocks.shift = sb->bblog_shift; diff --git a/drivers/md/md.h b/drivers/md/md.h index b5c4be7..2e0918f 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -618,7 +618,8 @@ extern void md_super_write(struct mddev *mddev, struct md_rdev *rdev, sector_t sector, int size, struct page *page); extern void md_super_wait(struct mddev *mddev); extern int sync_page_io(struct md_rdev *rdev, sector_t sector, int size, - struct page *page, int rw, bool metadata_op); + struct page *page, int op, int op_flags, + bool metadata_op); extern void md_do_sync(struct md_thread *thread); extern void md_new_event(struct mddev *mddev); extern int md_allow_write(struct mddev *mddev); diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 424df7e..c7abd2d 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -759,7 +759,7 @@ static void flush_pending_writes(struct r1conf *conf) while (bio) { /* submit pending writes */ struct bio *next = bio->bi_next; bio->bi_next = NULL; - if (unlikely((bio->bi_rw & REQ_DISCARD) && + if (unlikely((bio->bi_op == REQ_OP_DISCARD) && !blk_queue_discard(bdev_get_queue(bio->bi_bdev)))) /* Just ignore it */ bio_endio(bio); @@ -1033,7 +1033,7 @@ static void raid1_unplug(struct blk_plug_cb *cb, bool from_schedule) while (bio) { /* submit pending writes */ struct bio *next = bio->bi_next; bio->bi_next = NULL; - if (unlikely((bio->bi_rw & REQ_DISCARD) && + if (unlikely((bio->bi_op == REQ_OP_DISCARD) && !blk_queue_discard(bdev_get_queue(bio->bi_bdev)))) /* Just ignore it */ bio_endio(bio); @@ -1053,12 +1053,11 @@ static void raid1_make_request(struct mddev *mddev, struct bio * bio) int i, disks; struct bitmap *bitmap; unsigned long flags; + const int op = bio->bi_op; const int rw = bio_data_dir(bio); const unsigned long do_sync = (bio->bi_rw & REQ_SYNC); const unsigned long do_flush_fua = (bio->bi_rw & (REQ_FLUSH | REQ_FUA)); - const unsigned long do_discard = (bio->bi_rw - & (REQ_DISCARD | REQ_SECURE)); - const unsigned long do_same = (bio->bi_rw & REQ_WRITE_SAME); + const unsigned long do_sec = (bio->bi_rw & REQ_SECURE); struct md_rdev *blocked_rdev; struct blk_plug_cb *cb; struct raid1_plug_cb *plug = NULL; @@ -1166,7 +1165,8 @@ read_again: mirror->rdev->data_offset; read_bio->bi_bdev = mirror->rdev->bdev; read_bio->bi_end_io = raid1_end_read_request; - read_bio->bi_rw = READ | do_sync; + read_bio->bi_op = op; + read_bio->bi_rw = do_sync; read_bio->bi_private = r1_bio; if (max_sectors < r1_bio->sectors) { @@ -1376,8 +1376,9 @@ read_again: conf->mirrors[i].rdev->data_offset); mbio->bi_bdev = conf->mirrors[i].rdev->bdev; mbio->bi_end_io = raid1_end_write_request; + mbio->bi_op = op; mbio->bi_rw = - WRITE | do_flush_fua | do_sync | do_discard | do_same; + do_flush_fua | do_sync | do_sec; mbio->bi_private = r1_bio; atomic_inc(&r1_bio->remaining); @@ -1771,7 +1772,7 @@ static void end_sync_write(struct bio *bio) static int r1_sync_page_io(struct md_rdev *rdev, sector_t sector, int sectors, struct page *page, int rw) { - if (sync_page_io(rdev, sector, sectors << 9, page, rw, false)) + if (sync_page_io(rdev, sector, sectors << 9, page, rw, 0, false)) /* success */ return 1; if (rw == WRITE) { @@ -1825,7 +1826,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio) rdev = conf->mirrors[d].rdev; if (sync_page_io(rdev, sect, s<<9, bio->bi_io_vec[idx].bv_page, - READ, false)) { + REQ_OP_READ, 0, false)) { success = 1; break; } @@ -2030,7 +2031,7 @@ static void sync_request_write(struct mddev *mddev, struct r1bio *r1_bio) !test_bit(MD_RECOVERY_SYNC, &mddev->recovery)))) continue; - wbio->bi_rw = WRITE; + wbio->bi_op = REQ_OP_WRITE; wbio->bi_end_io = end_sync_write; atomic_inc(&r1_bio->remaining); md_sync_acct(conf->mirrors[i].rdev->bdev, bio_sectors(wbio)); @@ -2090,7 +2091,7 @@ static void fix_read_error(struct r1conf *conf, int read_disk, is_badblock(rdev, sect, s, &first_bad, &bad_sectors) == 0 && sync_page_io(rdev, sect, s<<9, - conf->tmppage, READ, false)) + conf->tmppage, REQ_OP_READ, 0, false)) success = 1; else { d++; @@ -2201,7 +2202,7 @@ static int narrow_write_error(struct r1bio *r1_bio, int i) wbio = bio_clone_mddev(r1_bio->master_bio, GFP_NOIO, mddev); } - wbio->bi_rw = WRITE; + wbio->bi_op = REQ_OP_WRITE; wbio->bi_iter.bi_sector = r1_bio->sector; wbio->bi_iter.bi_size = r1_bio->sectors << 9; @@ -2344,7 +2345,8 @@ read_more: bio->bi_iter.bi_sector = r1_bio->sector + rdev->data_offset; bio->bi_bdev = rdev->bdev; bio->bi_end_io = raid1_end_read_request; - bio->bi_rw = READ | do_sync; + bio->bi_op = REQ_OP_READ; + bio->bi_rw = do_sync; bio->bi_private = r1_bio; if (max_sectors < r1_bio->sectors) { /* Drat - have to split this up more */ @@ -2572,7 +2574,7 @@ static sector_t raid1_sync_request(struct mddev *mddev, sector_t sector_nr, if (i < conf->raid_disks) still_degraded = 1; } else if (!test_bit(In_sync, &rdev->flags)) { - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; bio->bi_end_io = end_sync_write; write_targets ++; } else { @@ -2599,7 +2601,7 @@ static sector_t raid1_sync_request(struct mddev *mddev, sector_t sector_nr, if (disk < 0) disk = i; } - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; bio->bi_end_io = end_sync_read; read_targets++; } else if (!test_bit(WriteErrorSeen, &rdev->flags) && @@ -2611,7 +2613,7 @@ static sector_t raid1_sync_request(struct mddev *mddev, sector_t sector_nr, * if we are doing resync or repair. Otherwise, leave * this device alone for this sync request. */ - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; bio->bi_end_io = end_sync_write; write_targets++; } diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 4736be8..63cd985 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -865,7 +865,7 @@ static void flush_pending_writes(struct r10conf *conf) while (bio) { /* submit pending writes */ struct bio *next = bio->bi_next; bio->bi_next = NULL; - if (unlikely((bio->bi_rw & REQ_DISCARD) && + if (unlikely((bio->bi_op == REQ_OP_DISCARD) && !blk_queue_discard(bdev_get_queue(bio->bi_bdev)))) /* Just ignore it */ bio_endio(bio); @@ -1041,7 +1041,7 @@ static void raid10_unplug(struct blk_plug_cb *cb, bool from_schedule) while (bio) { /* submit pending writes */ struct bio *next = bio->bi_next; bio->bi_next = NULL; - if (unlikely((bio->bi_rw & REQ_DISCARD) && + if (unlikely((bio->bi_op == REQ_OP_DISCARD) && !blk_queue_discard(bdev_get_queue(bio->bi_bdev)))) /* Just ignore it */ bio_endio(bio); @@ -1058,12 +1058,11 @@ static void __make_request(struct mddev *mddev, struct bio *bio) struct r10bio *r10_bio; struct bio *read_bio; int i; + const int op = bio->bi_op; const int rw = bio_data_dir(bio); const unsigned long do_sync = (bio->bi_rw & REQ_SYNC); const unsigned long do_fua = (bio->bi_rw & REQ_FUA); - const unsigned long do_discard = (bio->bi_rw - & (REQ_DISCARD | REQ_SECURE)); - const unsigned long do_same = (bio->bi_rw & REQ_WRITE_SAME); + const unsigned long do_sec = (bio->bi_rw & REQ_SECURE); unsigned long flags; struct md_rdev *blocked_rdev; struct blk_plug_cb *cb; @@ -1156,7 +1155,8 @@ read_again: choose_data_offset(r10_bio, rdev); read_bio->bi_bdev = rdev->bdev; read_bio->bi_end_io = raid10_end_read_request; - read_bio->bi_rw = READ | do_sync; + read_bio->bi_op = op; + read_bio->bi_rw = do_sync; read_bio->bi_private = r10_bio; if (max_sectors < r10_bio->sectors) { @@ -1363,8 +1363,9 @@ retry_write: rdev)); mbio->bi_bdev = rdev->bdev; mbio->bi_end_io = raid10_end_write_request; + mbio->bi_op = op; mbio->bi_rw = - WRITE | do_sync | do_fua | do_discard | do_same; + do_sync | do_fua | do_sec; mbio->bi_private = r10_bio; atomic_inc(&r10_bio->remaining); @@ -1406,8 +1407,9 @@ retry_write: r10_bio, rdev)); mbio->bi_bdev = rdev->bdev; mbio->bi_end_io = raid10_end_write_request; + mbio->bi_op = op; mbio->bi_rw = - WRITE | do_sync | do_fua | do_discard | do_same; + do_sync | do_fua | do_sec; mbio->bi_private = r10_bio; atomic_inc(&r10_bio->remaining); @@ -1992,7 +1994,7 @@ static void sync_request_write(struct mddev *mddev, struct r10bio *r10_bio) tbio->bi_vcnt = vcnt; tbio->bi_iter.bi_size = fbio->bi_iter.bi_size; - tbio->bi_rw = WRITE; + tbio->bi_op = REQ_OP_WRITE; tbio->bi_private = r10_bio; tbio->bi_iter.bi_sector = r10_bio->devs[i].addr; tbio->bi_end_io = end_sync_write; @@ -2078,7 +2080,7 @@ static void fix_recovery_read_error(struct r10bio *r10_bio) addr, s << 9, bio->bi_io_vec[idx].bv_page, - READ, false); + REQ_OP_READ, 0, false); if (ok) { rdev = conf->mirrors[dw].rdev; addr = r10_bio->devs[1].addr + sect; @@ -2086,7 +2088,7 @@ static void fix_recovery_read_error(struct r10bio *r10_bio) addr, s << 9, bio->bi_io_vec[idx].bv_page, - WRITE, false); + REQ_OP_WRITE, 0, false); if (!ok) { set_bit(WriteErrorSeen, &rdev->flags); if (!test_and_set_bit(WantReplacement, @@ -2213,7 +2215,7 @@ static int r10_sync_page_io(struct md_rdev *rdev, sector_t sector, if (is_badblock(rdev, sector, sectors, &first_bad, &bad_sectors) && (rw == READ || test_bit(WriteErrorSeen, &rdev->flags))) return -1; - if (sync_page_io(rdev, sector, sectors << 9, page, rw, false)) + if (sync_page_io(rdev, sector, sectors << 9, page, rw, 0, false)) /* success */ return 1; if (rw == WRITE) { @@ -2299,7 +2301,8 @@ static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10 r10_bio->devs[sl].addr + sect, s<<9, - conf->tmppage, READ, false); + conf->tmppage, + REQ_OP_READ, 0, false); rdev_dec_pending(rdev, mddev); rcu_read_lock(); if (success) @@ -2474,7 +2477,7 @@ static int narrow_write_error(struct r10bio *r10_bio, int i) choose_data_offset(r10_bio, rdev) + (sector - r10_bio->sector)); wbio->bi_bdev = rdev->bdev; - wbio->bi_rw = WRITE; + wbio->bi_op = REQ_OP_WRITE; if (submit_bio_wait(wbio) < 0) /* Failure! */ @@ -2550,7 +2553,8 @@ read_more: bio->bi_iter.bi_sector = r10_bio->devs[slot].addr + choose_data_offset(r10_bio, rdev); bio->bi_bdev = rdev->bdev; - bio->bi_rw = READ | do_sync; + bio->bi_op = REQ_OP_READ; + bio->bi_rw = do_sync; bio->bi_private = r10_bio; bio->bi_end_io = raid10_end_read_request; if (max_sectors < r10_bio->sectors) { @@ -3040,7 +3044,7 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr, biolist = bio; bio->bi_private = r10_bio; bio->bi_end_io = end_sync_read; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; from_addr = r10_bio->devs[j].addr; bio->bi_iter.bi_sector = from_addr + rdev->data_offset; @@ -3066,7 +3070,7 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr, biolist = bio; bio->bi_private = r10_bio; bio->bi_end_io = end_sync_write; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; bio->bi_iter.bi_sector = to_addr + rdev->data_offset; bio->bi_bdev = rdev->bdev; @@ -3095,7 +3099,7 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr, biolist = bio; bio->bi_private = r10_bio; bio->bi_end_io = end_sync_write; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; bio->bi_iter.bi_sector = to_addr + rdev->data_offset; bio->bi_bdev = rdev->bdev; @@ -3215,7 +3219,7 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr, biolist = bio; bio->bi_private = r10_bio; bio->bi_end_io = end_sync_read; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; bio->bi_iter.bi_sector = sector + conf->mirrors[d].rdev->data_offset; bio->bi_bdev = conf->mirrors[d].rdev->bdev; @@ -3237,7 +3241,7 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr, biolist = bio; bio->bi_private = r10_bio; bio->bi_end_io = end_sync_write; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; bio->bi_iter.bi_sector = sector + conf->mirrors[d].replacement->data_offset; bio->bi_bdev = conf->mirrors[d].replacement->bdev; @@ -4320,7 +4324,7 @@ read_more: + rdev->data_offset); read_bio->bi_private = r10_bio; read_bio->bi_end_io = end_sync_read; - read_bio->bi_rw = READ; + read_bio->bi_op = REQ_OP_READ; read_bio->bi_flags &= (~0UL << BIO_RESET_BITS); read_bio->bi_error = 0; read_bio->bi_vcnt = 0; @@ -4354,7 +4358,7 @@ read_more: rdev2->new_data_offset; b->bi_private = r10_bio; b->bi_end_io = end_reshape_write; - b->bi_rw = WRITE; + b->bi_op = REQ_OP_WRITE; b->bi_next = blist; blist = b; } @@ -4522,7 +4526,7 @@ static int handle_reshape_read_error(struct mddev *mddev, addr, s << 9, bvec[idx].bv_page, - READ, false); + REQ_OP_READ, 0, false); if (success) break; failed: diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c index 90c2618..56b20c3 100644 --- a/drivers/md/raid5-cache.c +++ b/drivers/md/raid5-cache.c @@ -261,7 +261,7 @@ static struct bio *r5l_bio_alloc(struct r5l_log *log) { struct bio *bio = bio_alloc_bioset(GFP_NOIO, BIO_MAX_PAGES, log->bs); - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; bio->bi_bdev = log->rdev->bdev; bio->bi_iter.bi_sector = log->rdev->data_offset + log->log_start; @@ -686,6 +686,7 @@ void r5l_flush_stripe_to_raid(struct r5l_log *log) bio_reset(&log->flush_bio); log->flush_bio.bi_bdev = log->rdev->bdev; log->flush_bio.bi_end_io = r5l_log_flush_endio; + log->flush_bio.bi_op = REQ_OP_WRITE; log->flush_bio.bi_rw = WRITE_FLUSH; submit_bio(&log->flush_bio); } @@ -882,7 +883,8 @@ static int r5l_read_meta_block(struct r5l_log *log, struct r5l_meta_block *mb; u32 crc, stored_crc; - if (!sync_page_io(log->rdev, ctx->pos, PAGE_SIZE, page, READ, false)) + if (!sync_page_io(log->rdev, ctx->pos, PAGE_SIZE, page, REQ_OP_READ, 0, + false)) return -EIO; mb = page_address(page); @@ -927,7 +929,8 @@ static int r5l_recovery_flush_one_stripe(struct r5l_log *log, &disk_index, sh); sync_page_io(log->rdev, *log_offset, PAGE_SIZE, - sh->dev[disk_index].page, READ, false); + sh->dev[disk_index].page, REQ_OP_READ, 0, + false); sh->dev[disk_index].log_checksum = le32_to_cpu(payload->checksum[0]); set_bit(R5_Wantwrite, &sh->dev[disk_index].flags); @@ -935,7 +938,8 @@ static int r5l_recovery_flush_one_stripe(struct r5l_log *log, } else { disk_index = sh->pd_idx; sync_page_io(log->rdev, *log_offset, PAGE_SIZE, - sh->dev[disk_index].page, READ, false); + sh->dev[disk_index].page, REQ_OP_READ, 0, + false); sh->dev[disk_index].log_checksum = le32_to_cpu(payload->checksum[0]); set_bit(R5_Wantwrite, &sh->dev[disk_index].flags); @@ -945,7 +949,7 @@ static int r5l_recovery_flush_one_stripe(struct r5l_log *log, sync_page_io(log->rdev, r5l_ring_add(log, *log_offset, BLOCK_SECTORS), PAGE_SIZE, sh->dev[disk_index].page, - READ, false); + REQ_OP_READ, 0, false); sh->dev[disk_index].log_checksum = le32_to_cpu(payload->checksum[1]); set_bit(R5_Wantwrite, @@ -987,11 +991,13 @@ static int r5l_recovery_flush_one_stripe(struct r5l_log *log, rdev = rcu_dereference(conf->disks[disk_index].rdev); if (rdev) sync_page_io(rdev, stripe_sect, PAGE_SIZE, - sh->dev[disk_index].page, WRITE, false); + sh->dev[disk_index].page, REQ_OP_WRITE, 0, + false); rrdev = rcu_dereference(conf->disks[disk_index].replacement); if (rrdev) sync_page_io(rrdev, stripe_sect, PAGE_SIZE, - sh->dev[disk_index].page, WRITE, false); + sh->dev[disk_index].page, REQ_OP_WRITE, 0, + false); } raid5_release_stripe(sh); return 0; @@ -1063,7 +1069,8 @@ static int r5l_log_write_empty_meta_block(struct r5l_log *log, sector_t pos, crc = crc32c_le(log->uuid_checksum, mb, PAGE_SIZE); mb->checksum = cpu_to_le32(crc); - if (!sync_page_io(log->rdev, pos, PAGE_SIZE, page, WRITE_FUA, false)) { + if (!sync_page_io(log->rdev, pos, PAGE_SIZE, page, REQ_OP_WRITE, + WRITE_FUA, false)) { __free_page(page); return -EIO; } @@ -1138,7 +1145,7 @@ static int r5l_load_log(struct r5l_log *log) if (!page) return -ENOMEM; - if (!sync_page_io(rdev, cp, PAGE_SIZE, page, READ, false)) { + if (!sync_page_io(rdev, cp, PAGE_SIZE, page, REQ_OP_READ, 0, false)) { ret = -EIO; goto ioerr; } diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 8ab8b65..c36b817 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -806,7 +806,8 @@ static void stripe_add_to_batch_list(struct r5conf *conf, struct stripe_head *sh dd_idx = 0; while (dd_idx == sh->pd_idx || dd_idx == sh->qd_idx) dd_idx++; - if (head->dev[dd_idx].towrite->bi_rw != sh->dev[dd_idx].towrite->bi_rw) + if (head->dev[dd_idx].towrite->bi_rw != sh->dev[dd_idx].towrite->bi_rw || + head->dev[dd_idx].towrite->bi_op != sh->dev[dd_idx].towrite->bi_op) goto unlock_out; if (head->batch_head) { @@ -891,29 +892,32 @@ static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s) if (r5l_write_stripe(conf->log, sh) == 0) return; for (i = disks; i--; ) { - int rw; + int op; + int op_flags = 0; int replace_only = 0; struct bio *bi, *rbi; struct md_rdev *rdev, *rrdev = NULL; sh = head_sh; if (test_and_clear_bit(R5_Wantwrite, &sh->dev[i].flags)) { - if (test_and_clear_bit(R5_WantFUA, &sh->dev[i].flags)) - rw = WRITE_FUA; - else - rw = WRITE; + if (test_and_clear_bit(R5_WantFUA, &sh->dev[i].flags)) { + op = REQ_OP_WRITE; + op_flags = WRITE_FUA; + } else { + op = REQ_OP_WRITE; + } if (test_bit(R5_Discard, &sh->dev[i].flags)) - rw |= REQ_DISCARD; + op = REQ_OP_DISCARD; } else if (test_and_clear_bit(R5_Wantread, &sh->dev[i].flags)) - rw = READ; + op = REQ_OP_READ; else if (test_and_clear_bit(R5_WantReplace, &sh->dev[i].flags)) { - rw = WRITE; + op = REQ_OP_WRITE; replace_only = 1; } else continue; if (test_and_clear_bit(R5_SyncIO, &sh->dev[i].flags)) - rw |= REQ_SYNC; + op_flags |= REQ_SYNC; again: bi = &sh->dev[i].req; @@ -927,7 +931,7 @@ again: rdev = rrdev; rrdev = NULL; } - if (rw & WRITE) { + if (op_is_write(op)) { if (replace_only) rdev = NULL; if (rdev == rrdev) @@ -953,7 +957,7 @@ again: * need to check for writes. We never accept write errors * on the replacement, so we don't to check rrdev. */ - while ((rw & WRITE) && rdev && + while (op_is_write(op) && rdev && test_bit(WriteErrorSeen, &rdev->flags)) { sector_t first_bad; int bad_sectors; @@ -995,8 +999,9 @@ again: bio_reset(bi); bi->bi_bdev = rdev->bdev; - bi->bi_rw = rw; - bi->bi_end_io = (rw & WRITE) + bi->bi_op = op; + bi->bi_rw = op_flags; + bi->bi_end_io = op_is_write(op) ? raid5_end_write_request : raid5_end_read_request; bi->bi_private = sh; @@ -1027,7 +1032,7 @@ again: * If this is discard request, set bi_vcnt 0. We don't * want to confuse SCSI because SCSI will replace payload */ - if (rw & REQ_DISCARD) + if (op == REQ_OP_DISCARD) bi->bi_vcnt = 0; if (rrdev) set_bit(R5_DOUBLE_LOCKED, &sh->dev[i].flags); @@ -1047,8 +1052,9 @@ again: bio_reset(rbi); rbi->bi_bdev = rrdev->bdev; - rbi->bi_rw = rw; - BUG_ON(!(rw & WRITE)); + rbi->bi_op = op; + rbi->bi_rw = op_flags; + BUG_ON(!op_is_write(op)); rbi->bi_end_io = raid5_end_write_request; rbi->bi_private = sh; @@ -1076,7 +1082,7 @@ again: * If this is discard request, set bi_vcnt 0. We don't * want to confuse SCSI because SCSI will replace payload */ - if (rw & REQ_DISCARD) + if (op == REQ_OP_DISCARD) rbi->bi_vcnt = 0; if (conf->mddev->gendisk) trace_block_bio_remap(bdev_get_queue(rbi->bi_bdev), @@ -1085,7 +1091,7 @@ again: generic_make_request(rbi); } if (!rdev && !rrdev) { - if (rw & WRITE) + if (op_is_write(op)) set_bit(STRIPE_DEGRADED, &sh->state); pr_debug("skip op %ld on disc %d for sector %llu\n", bi->bi_rw, i, (unsigned long long)sh->sector); @@ -1623,7 +1629,7 @@ again: set_bit(R5_WantFUA, &dev->flags); if (wbi->bi_rw & REQ_SYNC) set_bit(R5_SyncIO, &dev->flags); - if (wbi->bi_rw & REQ_DISCARD) + if (wbi->bi_op == REQ_OP_DISCARD) set_bit(R5_Discard, &dev->flags); else { tx = async_copy_data(1, wbi, &dev->page, @@ -5178,7 +5184,7 @@ static void raid5_make_request(struct mddev *mddev, struct bio * bi) return; } - if (unlikely(bi->bi_rw & REQ_DISCARD)) { + if (unlikely(bi->bi_op == REQ_OP_DISCARD)) { make_discard_request(mddev, bi); return; } -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:41:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BE7F37CCF for ; Fri, 15 Apr 2016 05:41:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1F3E9AC001 for ; Fri, 15 Apr 2016 03:41:03 -0700 (PDT) X-ASG-Debug-ID: 1460716861-04cbb02e1d2e9830001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id d6jDUwFZZ60YWdSi (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:41:01 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id F1A0F3B70E; Fri, 15 Apr 2016 10:41:00 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe32A010243; Fri, 15 Apr 2016 06:40:58 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 24/42] xen: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 05:39:44 -0500 X-ASG-Orig-Subj: [PATCH 24/42] xen: set bi_op to REQ_OP Message-Id: <1460716802-2294-25-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716861 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has the xen block driver use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/block/xen-blkback/blkback.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c index 79fe493..854ecca 100644 --- a/drivers/block/xen-blkback/blkback.c +++ b/drivers/block/xen-blkback/blkback.c @@ -501,7 +501,7 @@ static int xen_vbd_translate(struct phys_req *req, struct xen_blkif *blkif, struct xen_vbd *vbd = &blkif->vbd; int rc = -EACCES; - if ((operation != READ) && vbd->readonly) + if ((operation != REQ_OP_READ) && vbd->readonly) goto out; if (likely(req->nr_sects)) { @@ -1014,7 +1014,7 @@ static int dispatch_discard_io(struct xen_blkif_ring *ring, preq.sector_number = req->u.discard.sector_number; preq.nr_sects = req->u.discard.nr_sectors; - err = xen_vbd_translate(&preq, blkif, WRITE); + err = xen_vbd_translate(&preq, blkif, REQ_OP_WRITE); if (err) { pr_warn("access denied: DISCARD [%llu->%llu] on dev=%04x\n", preq.sector_number, @@ -1229,6 +1229,7 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, struct bio **biolist = pending_req->biolist; int i, nbio = 0; int operation; + int operation_flags = 0; struct blk_plug plug; bool drain = false; struct grant_page **pages = pending_req->segments; @@ -1247,17 +1248,19 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, switch (req_operation) { case BLKIF_OP_READ: ring->st_rd_req++; - operation = READ; + operation = REQ_OP_READ; break; case BLKIF_OP_WRITE: ring->st_wr_req++; - operation = WRITE_ODIRECT; + operation = REQ_OP_WRITE; + operation_flags = WRITE_ODIRECT; break; case BLKIF_OP_WRITE_BARRIER: drain = true; case BLKIF_OP_FLUSH_DISKCACHE: ring->st_f_req++; - operation = WRITE_FLUSH; + operation = REQ_OP_WRITE; + operation_flags = WRITE_FLUSH; break; default: operation = 0; /* make gcc happy */ @@ -1269,7 +1272,7 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, nseg = req->operation == BLKIF_OP_INDIRECT ? req->u.indirect.nr_segments : req->u.rw.nr_segments; - if (unlikely(nseg == 0 && operation != WRITE_FLUSH) || + if (unlikely(nseg == 0 && operation_flags != WRITE_FLUSH) || unlikely((req->operation != BLKIF_OP_INDIRECT) && (nseg > BLKIF_MAX_SEGMENTS_PER_REQUEST)) || unlikely((req->operation == BLKIF_OP_INDIRECT) && @@ -1310,7 +1313,7 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, if (xen_vbd_translate(&preq, ring->blkif, operation) != 0) { pr_debug("access denied: %s of [%llu,%llu] on dev=%04x\n", - operation == READ ? "read" : "write", + operation == REQ_OP_READ ? "read" : "write", preq.sector_number, preq.sector_number + preq.nr_sects, ring->blkif->vbd.pdevice); @@ -1369,7 +1372,8 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, bio->bi_private = pending_req; bio->bi_end_io = end_block_io_op; bio->bi_iter.bi_sector = preq.sector_number; - bio->bi_rw = operation; + bio->bi_op = operation; + bio->bi_rw = operation_flags; } preq.sector_number += seg[i].nsec; @@ -1377,7 +1381,7 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, /* This will be hit if the operation was a flush or discard. */ if (!bio) { - BUG_ON(operation != WRITE_FLUSH); + BUG_ON(operation_flags != WRITE_FLUSH); bio = bio_alloc(GFP_KERNEL, 0); if (unlikely(bio == NULL)) @@ -1387,7 +1391,8 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, bio->bi_bdev = preq.bdev; bio->bi_private = pending_req; bio->bi_end_io = end_block_io_op; - bio->bi_rw = operation; + bio->bi_op = operation; + bio->bi_rw = operation_flags; } atomic_set(&pending_req->pendcnt, nbio); @@ -1399,9 +1404,9 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, /* Let the I/Os go.. */ blk_finish_plug(&plug); - if (operation == READ) + if (operation == REQ_OP_READ) ring->st_rd_sect += preq.nr_sects; - else if (operation & WRITE) + else if (operation == REQ_OP_WRITE) ring->st_wr_sect += preq.nr_sects; return 0; -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:41:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 861637D11 for ; Fri, 15 Apr 2016 05:41:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 175BEAC001 for ; Fri, 15 Apr 2016 03:41:05 -0700 (PDT) X-ASG-Debug-ID: 1460716863-04bdf011025e4b80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id kHlGDCUvPE3Gl60S (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:41:03 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 27B746316D; Fri, 15 Apr 2016 10:41:03 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe32B010243; Fri, 15 Apr 2016 06:41:01 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 25/42] target: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 05:39:45 -0500 X-ASG-Orig-Subj: [PATCH 25/42] target: set bi_op to REQ_OP Message-Id: <1460716802-2294-26-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Fri, 15 Apr 2016 10:41:03 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460716863 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has the target modules use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke Acked-by: Nicholas Bellinger --- drivers/target/target_core_iblock.c | 30 +++++++++++++++--------------- drivers/target/target_core_pscsi.c | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c index c25109c..5e60dbc 100644 --- a/drivers/target/target_core_iblock.c +++ b/drivers/target/target_core_iblock.c @@ -312,7 +312,8 @@ static void iblock_bio_done(struct bio *bio) } static struct bio * -iblock_get_bio(struct se_cmd *cmd, sector_t lba, u32 sg_num, int rw) +iblock_get_bio(struct se_cmd *cmd, sector_t lba, u32 sg_num, int op, + int op_flags) { struct iblock_dev *ib_dev = IBLOCK_DEV(cmd->se_dev); struct bio *bio; @@ -334,7 +335,8 @@ iblock_get_bio(struct se_cmd *cmd, sector_t lba, u32 sg_num, int rw) bio->bi_private = cmd; bio->bi_end_io = &iblock_bio_done; bio->bi_iter.bi_sector = lba; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; return bio; } @@ -480,7 +482,7 @@ iblock_execute_write_same(struct se_cmd *cmd) goto fail; cmd->priv = ibr; - bio = iblock_get_bio(cmd, block_lba, 1, WRITE); + bio = iblock_get_bio(cmd, block_lba, 1, REQ_OP_WRITE, 0); if (!bio) goto fail_free_ibr; @@ -493,7 +495,8 @@ iblock_execute_write_same(struct se_cmd *cmd) while (bio_add_page(bio, sg_page(sg), sg->length, sg->offset) != sg->length) { - bio = iblock_get_bio(cmd, block_lba, 1, WRITE); + bio = iblock_get_bio(cmd, block_lba, 1, REQ_OP_WRITE, + 0); if (!bio) goto fail_put_bios; @@ -679,8 +682,7 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, struct scatterlist *sg; u32 sg_num = sgl_nents; unsigned bio_cnt; - int rw = 0; - int i; + int i, op, op_flags = 0; if (data_direction == DMA_TO_DEVICE) { struct iblock_dev *ib_dev = IBLOCK_DEV(dev); @@ -689,18 +691,15 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, * Force writethrough using WRITE_FUA if a volatile write cache * is not enabled, or if initiator set the Force Unit Access bit. */ + op = REQ_OP_WRITE; if (test_bit(QUEUE_FLAG_FUA, &q->queue_flags)) { if (cmd->se_cmd_flags & SCF_FUA) - rw = WRITE_FUA; + op_flags = WRITE_FUA; else if (!test_bit(QUEUE_FLAG_WC, &q->queue_flags)) - rw = WRITE_FUA; - else - rw = WRITE; - } else { - rw = WRITE; + op_flags = WRITE_FUA; } } else { - rw = READ; + op = REQ_OP_READ; } ibr = kzalloc(sizeof(struct iblock_req), GFP_KERNEL); @@ -714,7 +713,7 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, return 0; } - bio = iblock_get_bio(cmd, block_lba, sgl_nents, rw); + bio = iblock_get_bio(cmd, block_lba, sgl_nents, op, op_flags); if (!bio) goto fail_free_ibr; @@ -738,7 +737,8 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, bio_cnt = 0; } - bio = iblock_get_bio(cmd, block_lba, sg_num, rw); + bio = iblock_get_bio(cmd, block_lba, sg_num, op, + op_flags); if (!bio) goto fail_put_bios; diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c index de18790..2cf915c 100644 --- a/drivers/target/target_core_pscsi.c +++ b/drivers/target/target_core_pscsi.c @@ -922,7 +922,7 @@ pscsi_map_sg(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, goto fail; if (rw) - bio->bi_rw |= REQ_WRITE; + bio->bi_op = REQ_OP_WRITE; pr_debug("PSCSI: Allocated bio: %p," " dir: %s nr_vecs: %d\n", bio, -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:41:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9AADD7D0A for ; Fri, 15 Apr 2016 05:41:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1F242AC001 for ; Fri, 15 Apr 2016 03:41:07 -0700 (PDT) X-ASG-Debug-ID: 1460716865-04cbb02e1a2e9840001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id aHLxEoDiRT5970ea (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:41:06 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6B53F627DF; Fri, 15 Apr 2016 10:41:05 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe32C010243; Fri, 15 Apr 2016 06:41:03 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 26/42] block: copy bio op to request op Date: Fri, 15 Apr 2016 05:39:46 -0500 X-ASG-Orig-Subj: [PATCH 26/42] block: copy bio op to request op Message-Id: <1460716802-2294-27-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Fri, 15 Apr 2016 10:41:05 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460716866 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie The bio users should now always be setting up the bio->bi_op. This patch has us copy that to the struct request op field. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- block/blk-core.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/block/blk-core.c b/block/blk-core.c index 3b238ef..94736c3 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -2991,6 +2991,7 @@ void blk_rq_bio_prep(struct request_queue *q, struct request *rq, { /* tmp compat. Allow users to set bi_op or bi_rw */ rq->cmd_flags |= bio_data_dir(bio); + rq->op = bio->bi_op; if (bio_has_data(bio)) rq->nr_phys_segments = bio_phys_segments(q, bio); @@ -3075,6 +3076,7 @@ EXPORT_SYMBOL_GPL(blk_rq_unprep_clone); static void __blk_rq_prep_clone(struct request *dst, struct request *src) { dst->cpu = src->cpu; + dst->op = src->op; dst->cmd_flags |= (src->cmd_flags & REQ_CLONE_MASK) | REQ_NOMERGE; dst->cmd_type = src->cmd_type; dst->__sector = blk_rq_pos(src); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:41:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5D1917CA4 for ; Fri, 15 Apr 2016 05:41:10 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 04A39304048 for ; Fri, 15 Apr 2016 03:41:09 -0700 (PDT) X-ASG-Debug-ID: 1460716867-04bdf011035e4ba0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Kw3ON1iwECE9VOFw (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:41:08 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A60BC6316E; Fri, 15 Apr 2016 10:41:07 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe32D010243; Fri, 15 Apr 2016 06:41:05 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 27/42] block: prepare request creation/destruction code to use REQ_OPs Date: Fri, 15 Apr 2016 05:39:47 -0500 X-ASG-Orig-Subj: [PATCH 27/42] block: prepare request creation/destruction code to use REQ_OPs Message-Id: <1460716802-2294-28-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Fri, 15 Apr 2016 10:41:07 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460716868 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch prepares *_get_request/*_put_request and freed_request, to use separate variables for the operation and flags. In the next patches the struct request users will be converted like was done for bios. request->op will be used for the REQ_OP and request->cmd_flags for the rq_flag_bits. There is some temporary compat code in __get_request to allow users to read the operation from the cmd_flags. This will be deleted in one of the last patches when all drivers have been converted. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- block/blk-core.c | 56 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index 94736c3..3168962 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -959,10 +959,10 @@ static void __freed_request(struct request_list *rl, int sync) * A request has just been released. Account for it, update the full and * congestion status, wake up any waiters. Called under q->queue_lock. */ -static void freed_request(struct request_list *rl, unsigned int flags) +static void freed_request(struct request_list *rl, int op, unsigned int flags) { struct request_queue *q = rl->q; - int sync = rw_is_sync(flags); + int sync = rw_is_sync(op | flags); q->nr_rqs[sync]--; rl->count[sync]--; @@ -1054,7 +1054,8 @@ static struct io_context *rq_ioc(struct bio *bio) /** * __get_request - get a free request * @rl: request list to allocate from - * @rw_flags: RW and SYNC flags + * @op: REQ_OP_READ/REQ_OP_WRITE + * @op_flags: rq_flag_bits * @bio: bio to allocate request for (can be %NULL) * @gfp_mask: allocation mask * @@ -1065,21 +1066,22 @@ static struct io_context *rq_ioc(struct bio *bio) * Returns ERR_PTR on failure, with @q->queue_lock held. * Returns request pointer on success, with @q->queue_lock *not held*. */ -static struct request *__get_request(struct request_list *rl, int rw_flags, - struct bio *bio, gfp_t gfp_mask) +static struct request *__get_request(struct request_list *rl, int op, + int op_flags, struct bio *bio, + gfp_t gfp_mask) { struct request_queue *q = rl->q; struct request *rq; struct elevator_type *et = q->elevator->type; struct io_context *ioc = rq_ioc(bio); struct io_cq *icq = NULL; - const bool is_sync = rw_is_sync(rw_flags) != 0; + const bool is_sync = rw_is_sync(op | op_flags) != 0; int may_queue; if (unlikely(blk_queue_dying(q))) return ERR_PTR(-ENODEV); - may_queue = elv_may_queue(q, rw_flags); + may_queue = elv_may_queue(q, op | op_flags); if (may_queue == ELV_MQUEUE_NO) goto rq_starved; @@ -1123,7 +1125,7 @@ static struct request *__get_request(struct request_list *rl, int rw_flags, /* * Decide whether the new request will be managed by elevator. If - * so, mark @rw_flags and increment elvpriv. Non-zero elvpriv will + * so, mark @op_flags and increment elvpriv. Non-zero elvpriv will * prevent the current elevator from being destroyed until the new * request is freed. This guarantees icq's won't be destroyed and * makes creating new ones safe. @@ -1132,14 +1134,14 @@ static struct request *__get_request(struct request_list *rl, int rw_flags, * it will be created after releasing queue_lock. */ if (blk_rq_should_init_elevator(bio) && !blk_queue_bypass(q)) { - rw_flags |= REQ_ELVPRIV; + op_flags |= REQ_ELVPRIV; q->nr_rqs_elvpriv++; if (et->icq_cache && ioc) icq = ioc_lookup_icq(ioc, q); } if (blk_queue_io_stat(q)) - rw_flags |= REQ_IO_STAT; + op_flags |= REQ_IO_STAT; spin_unlock_irq(q->queue_lock); /* allocate and init request */ @@ -1149,10 +1151,12 @@ static struct request *__get_request(struct request_list *rl, int rw_flags, blk_rq_init(q, rq); blk_rq_set_rl(rq, rl); - rq->cmd_flags = rw_flags | REQ_ALLOCED; + /* tmp compat - allow users to check either one for the op */ + rq->cmd_flags = op | op_flags | REQ_ALLOCED; + rq->op = op; /* init elvpriv */ - if (rw_flags & REQ_ELVPRIV) { + if (op_flags & REQ_ELVPRIV) { if (unlikely(et->icq_cache && !icq)) { if (ioc) icq = ioc_create_icq(ioc, q, gfp_mask); @@ -1178,7 +1182,7 @@ out: if (ioc_batching(q, ioc)) ioc->nr_batch_requests--; - trace_block_getrq(q, bio, rw_flags & 1); + trace_block_getrq(q, bio, op); return rq; fail_elvpriv: @@ -1208,7 +1212,7 @@ fail_alloc: * queue, but this is pretty rare. */ spin_lock_irq(q->queue_lock); - freed_request(rl, rw_flags); + freed_request(rl, op, op_flags); /* * in the very unlikely event that allocation failed and no @@ -1226,7 +1230,8 @@ rq_starved: /** * get_request - get a free request * @q: request_queue to allocate request from - * @rw_flags: RW and SYNC flags + * @op: REQ_OP_READ/REQ_OP_WRITE + * @op_flags: rq_flag_bits * @bio: bio to allocate request for (can be %NULL) * @gfp_mask: allocation mask * @@ -1237,17 +1242,18 @@ rq_starved: * Returns ERR_PTR on failure, with @q->queue_lock held. * Returns request pointer on success, with @q->queue_lock *not held*. */ -static struct request *get_request(struct request_queue *q, int rw_flags, - struct bio *bio, gfp_t gfp_mask) +static struct request *get_request(struct request_queue *q, int op, + int op_flags, struct bio *bio, + gfp_t gfp_mask) { - const bool is_sync = rw_is_sync(rw_flags) != 0; + const bool is_sync = rw_is_sync(op | op_flags) != 0; DEFINE_WAIT(wait); struct request_list *rl; struct request *rq; rl = blk_get_rl(q, bio); /* transferred to @rq on success */ retry: - rq = __get_request(rl, rw_flags, bio, gfp_mask); + rq = __get_request(rl, op, op_flags, bio, gfp_mask); if (!IS_ERR(rq)) return rq; @@ -1260,7 +1266,7 @@ retry: prepare_to_wait_exclusive(&rl->wait[is_sync], &wait, TASK_UNINTERRUPTIBLE); - trace_block_sleeprq(q, bio, rw_flags & 1); + trace_block_sleeprq(q, bio, op); spin_unlock_irq(q->queue_lock); io_schedule(); @@ -1289,7 +1295,7 @@ static struct request *blk_old_get_request(struct request_queue *q, int rw, create_io_context(gfp_mask, q->node); spin_lock_irq(q->queue_lock); - rq = get_request(q, rw, NULL, gfp_mask); + rq = get_request(q, rw, 0, NULL, gfp_mask); if (IS_ERR(rq)) spin_unlock_irq(q->queue_lock); /* q->queue_lock is unlocked at this point */ @@ -1491,13 +1497,14 @@ void __blk_put_request(struct request_queue *q, struct request *req) */ if (req->cmd_flags & REQ_ALLOCED) { unsigned int flags = req->cmd_flags; + int op = req->op; struct request_list *rl = blk_rq_rl(req); BUG_ON(!list_empty(&req->queuelist)); BUG_ON(ELV_ON_HASH(req)); blk_free_request(rl, req); - freed_request(rl, flags); + freed_request(rl, op, flags); blk_put_rl(rl); } } @@ -1713,7 +1720,7 @@ static blk_qc_t blk_queue_bio(struct request_queue *q, struct bio *bio) { const bool sync = !!(bio->bi_rw & REQ_SYNC); struct blk_plug *plug; - int el_ret, rw_flags, where = ELEVATOR_INSERT_SORT; + int el_ret, rw_flags = 0, where = ELEVATOR_INSERT_SORT; struct request *req; unsigned int request_count = 0; @@ -1773,7 +1780,6 @@ get_rq: * but we need to set it earlier to expose the sync flag to the * rq allocator and io schedulers. */ - rw_flags = bio_data_dir(bio); if (sync) rw_flags |= REQ_SYNC; @@ -1781,7 +1787,7 @@ get_rq: * Grab a free request. This is might sleep but can not fail. * Returns with the queue unlocked. */ - req = get_request(q, rw_flags, bio, GFP_NOIO); + req = get_request(q, bio_data_dir(bio), rw_flags, bio, GFP_NOIO); if (IS_ERR(req)) { bio->bi_error = PTR_ERR(req); bio_endio(bio); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:41:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 272F67CA4 for ; Fri, 15 Apr 2016 05:41:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id EEA398F8039 for ; Fri, 15 Apr 2016 03:41:11 -0700 (PDT) X-ASG-Debug-ID: 1460716870-04cb6c2462614f40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ZWHTC1HPGvOu2oEh (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:41:10 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 20BBDC01AA22; Fri, 15 Apr 2016 10:41:10 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe32E010243; Fri, 15 Apr 2016 06:41:07 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 28/42] block: prepare mq request creation to use REQ_OPs Date: Fri, 15 Apr 2016 05:39:48 -0500 X-ASG-Orig-Subj: [PATCH 28/42] block: prepare mq request creation to use REQ_OPs Message-Id: <1460716802-2294-29-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716870 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch modifies the blk mq request creation code to use separate variables for the operation and flags, because in the the next patches the struct request users will be converted like was done for bios. request->op will be used for the REQ_OP and request->cmd_flags for the rq_flag_bits. Like the non mq patch there is some temporary compat code in blk_mq_rq_ctx_init to allow users to read the operation from the cmd_flags. This will be deleted in one of the last patches when all drivers have been converted. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- block/blk-mq.c | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/block/blk-mq.c b/block/blk-mq.c index 1699baf..4843c0b 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -159,16 +159,19 @@ bool blk_mq_can_queue(struct blk_mq_hw_ctx *hctx) EXPORT_SYMBOL(blk_mq_can_queue); static void blk_mq_rq_ctx_init(struct request_queue *q, struct blk_mq_ctx *ctx, - struct request *rq, unsigned int rw_flags) + struct request *rq, int op, + unsigned int op_flags) { if (blk_queue_io_stat(q)) - rw_flags |= REQ_IO_STAT; + op_flags |= REQ_IO_STAT; INIT_LIST_HEAD(&rq->queuelist); /* csd/requeue_work/fifo_time is initialized before use */ rq->q = q; rq->mq_ctx = ctx; - rq->cmd_flags |= rw_flags; + rq->op = op; + /* tmp compat - allow users to check either one for the op */ + rq->cmd_flags |= op | op_flags; /* do not touch atomic flags, it needs atomic ops against the timer */ rq->cpu = -1; INIT_HLIST_NODE(&rq->hash); @@ -203,11 +206,11 @@ static void blk_mq_rq_ctx_init(struct request_queue *q, struct blk_mq_ctx *ctx, rq->end_io_data = NULL; rq->next_rq = NULL; - ctx->rq_dispatched[rw_is_sync(rw_flags)]++; + ctx->rq_dispatched[rw_is_sync(op | op_flags)]++; } static struct request * -__blk_mq_alloc_request(struct blk_mq_alloc_data *data, int rw) +__blk_mq_alloc_request(struct blk_mq_alloc_data *data, int op, int op_flags) { struct request *rq; unsigned int tag; @@ -222,7 +225,7 @@ __blk_mq_alloc_request(struct blk_mq_alloc_data *data, int rw) } rq->tag = tag; - blk_mq_rq_ctx_init(data->q, data->ctx, rq, rw); + blk_mq_rq_ctx_init(data->q, data->ctx, rq, op, op_flags); return rq; } @@ -246,7 +249,7 @@ struct request *blk_mq_alloc_request(struct request_queue *q, int rw, hctx = q->mq_ops->map_queue(q, ctx->cpu); blk_mq_set_alloc_data(&alloc_data, q, flags, ctx, hctx); - rq = __blk_mq_alloc_request(&alloc_data, rw); + rq = __blk_mq_alloc_request(&alloc_data, rw, 0); if (!rq && !(flags & BLK_MQ_REQ_NOWAIT)) { __blk_mq_run_hw_queue(hctx); blk_mq_put_ctx(ctx); @@ -254,7 +257,7 @@ struct request *blk_mq_alloc_request(struct request_queue *q, int rw, ctx = blk_mq_get_ctx(q); hctx = q->mq_ops->map_queue(q, ctx->cpu); blk_mq_set_alloc_data(&alloc_data, q, flags, ctx, hctx); - rq = __blk_mq_alloc_request(&alloc_data, rw); + rq = __blk_mq_alloc_request(&alloc_data, rw, 0); ctx = alloc_data.ctx; } blk_mq_put_ctx(ctx); @@ -1170,28 +1173,29 @@ static struct request *blk_mq_map_request(struct request_queue *q, struct blk_mq_hw_ctx *hctx; struct blk_mq_ctx *ctx; struct request *rq; - int rw = bio_data_dir(bio); + int op = bio_data_dir(bio); + int op_flags = 0; struct blk_mq_alloc_data alloc_data; blk_queue_enter_live(q); ctx = blk_mq_get_ctx(q); hctx = q->mq_ops->map_queue(q, ctx->cpu); - if (rw_is_sync(bio->bi_rw)) - rw |= REQ_SYNC; + if (rw_is_sync(bio->bi_op | bio->bi_rw)) + op_flags |= REQ_SYNC; - trace_block_getrq(q, bio, rw); + trace_block_getrq(q, bio, op); blk_mq_set_alloc_data(&alloc_data, q, BLK_MQ_REQ_NOWAIT, ctx, hctx); - rq = __blk_mq_alloc_request(&alloc_data, rw); + rq = __blk_mq_alloc_request(&alloc_data, op, op_flags); if (unlikely(!rq)) { __blk_mq_run_hw_queue(hctx); blk_mq_put_ctx(ctx); - trace_block_sleeprq(q, bio, rw); + trace_block_sleeprq(q, bio, op); ctx = blk_mq_get_ctx(q); hctx = q->mq_ops->map_queue(q, ctx->cpu); blk_mq_set_alloc_data(&alloc_data, q, 0, ctx, hctx); - rq = __blk_mq_alloc_request(&alloc_data, rw); + rq = __blk_mq_alloc_request(&alloc_data, op, op_flags); ctx = alloc_data.ctx; hctx = alloc_data.hctx; } @@ -1245,7 +1249,7 @@ static int blk_mq_direct_issue_request(struct request *rq, blk_qc_t *cookie) */ static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio) { - const int is_sync = rw_is_sync(bio->bi_rw); + const int is_sync = rw_is_sync(bio->bi_op | bio->bi_rw); const int is_flush_fua = bio->bi_rw & (REQ_FLUSH | REQ_FUA); struct blk_map_ctx data; struct request *rq; @@ -1342,7 +1346,7 @@ done: */ static blk_qc_t blk_sq_make_request(struct request_queue *q, struct bio *bio) { - const int is_sync = rw_is_sync(bio->bi_rw); + const int is_sync = rw_is_sync(bio->bi_op | bio->bi_rw); const int is_flush_fua = bio->bi_rw & (REQ_FLUSH | REQ_FUA); struct blk_plug *plug; unsigned int request_count = 0; -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:41:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2BC3C7CE8 for ; Fri, 15 Apr 2016 05:41:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id F1B49304048 for ; Fri, 15 Apr 2016 03:41:13 -0700 (PDT) X-ASG-Debug-ID: 1460716872-04cb6c245f614f40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 1nMegDsNGTq45hMQ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:41:13 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5C3513B731; Fri, 15 Apr 2016 10:41:12 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe32F010243; Fri, 15 Apr 2016 06:41:10 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 29/42] block: prepare elevator to use REQ_OPs. Date: Fri, 15 Apr 2016 05:39:49 -0500 X-ASG-Orig-Subj: [PATCH 29/42] block: prepare elevator to use REQ_OPs. Message-Id: <1460716802-2294-30-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716872 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch converts the elevator code to use separate variables for the operation and flags, and to check request->op for the REQ_OP. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- block/blk-core.c | 2 +- block/cfq-iosched.c | 4 ++-- block/elevator.c | 7 +++---- include/linux/elevator.h | 4 ++-- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index 3168962..a796b35 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1081,7 +1081,7 @@ static struct request *__get_request(struct request_list *rl, int op, if (unlikely(blk_queue_dying(q))) return ERR_PTR(-ENODEV); - may_queue = elv_may_queue(q, op | op_flags); + may_queue = elv_may_queue(q, op, op_flags); if (may_queue == ELV_MQUEUE_NO) goto rq_starved; diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 4a34978..3fcc598 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c @@ -4285,7 +4285,7 @@ static inline int __cfq_may_queue(struct cfq_queue *cfqq) return ELV_MQUEUE_MAY; } -static int cfq_may_queue(struct request_queue *q, int rw) +static int cfq_may_queue(struct request_queue *q, int op, int op_flags) { struct cfq_data *cfqd = q->elevator->elevator_data; struct task_struct *tsk = current; @@ -4302,7 +4302,7 @@ static int cfq_may_queue(struct request_queue *q, int rw) if (!cic) return ELV_MQUEUE_MAY; - cfqq = cic_to_cfqq(cic, rw_is_sync(rw)); + cfqq = cic_to_cfqq(cic, rw_is_sync(op | op_flags)); if (cfqq) { cfq_init_prio_data(cfqq, cic); diff --git a/block/elevator.c b/block/elevator.c index c3555c9..6a282bf 100644 --- a/block/elevator.c +++ b/block/elevator.c @@ -366,8 +366,7 @@ void elv_dispatch_sort(struct request_queue *q, struct request *rq) list_for_each_prev(entry, &q->queue_head) { struct request *pos = list_entry_rq(entry); - if ((rq->cmd_flags & REQ_DISCARD) != - (pos->cmd_flags & REQ_DISCARD)) + if ((rq->op == REQ_OP_DISCARD) != (pos->op == REQ_OP_DISCARD)) break; if (rq_data_dir(rq) != rq_data_dir(pos)) break; @@ -717,12 +716,12 @@ void elv_put_request(struct request_queue *q, struct request *rq) e->type->ops.elevator_put_req_fn(rq); } -int elv_may_queue(struct request_queue *q, int rw) +int elv_may_queue(struct request_queue *q, int op, int op_flags) { struct elevator_queue *e = q->elevator; if (e->type->ops.elevator_may_queue_fn) - return e->type->ops.elevator_may_queue_fn(q, rw); + return e->type->ops.elevator_may_queue_fn(q, op, op_flags); return ELV_MQUEUE_MAY; } diff --git a/include/linux/elevator.h b/include/linux/elevator.h index 638b324..953d286 100644 --- a/include/linux/elevator.h +++ b/include/linux/elevator.h @@ -26,7 +26,7 @@ typedef int (elevator_dispatch_fn) (struct request_queue *, int); typedef void (elevator_add_req_fn) (struct request_queue *, struct request *); typedef struct request *(elevator_request_list_fn) (struct request_queue *, struct request *); typedef void (elevator_completed_req_fn) (struct request_queue *, struct request *); -typedef int (elevator_may_queue_fn) (struct request_queue *, int); +typedef int (elevator_may_queue_fn) (struct request_queue *, int, int); typedef void (elevator_init_icq_fn) (struct io_cq *); typedef void (elevator_exit_icq_fn) (struct io_cq *); @@ -134,7 +134,7 @@ extern struct request *elv_former_request(struct request_queue *, struct request extern struct request *elv_latter_request(struct request_queue *, struct request *); extern int elv_register_queue(struct request_queue *q); extern void elv_unregister_queue(struct request_queue *q); -extern int elv_may_queue(struct request_queue *, int); +extern int elv_may_queue(struct request_queue *, int, int); extern void elv_completed_request(struct request_queue *, struct request *); extern int elv_set_request(struct request_queue *q, struct request *rq, struct bio *bio, gfp_t gfp_mask); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:41:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E4DBB7D25 for ; Fri, 15 Apr 2016 05:41:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B85C2304048 for ; Fri, 15 Apr 2016 03:41:16 -0700 (PDT) X-ASG-Debug-ID: 1460716874-04cb6c2460614f50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id VqRM9aIRpeNz2B3q (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:41:15 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AC74B91E9C; Fri, 15 Apr 2016 10:41:14 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe32G010243; Fri, 15 Apr 2016 06:41:12 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 30/42] blkg_rwstat: separate op from flags Date: Fri, 15 Apr 2016 05:39:50 -0500 X-ASG-Orig-Subj: [PATCH 30/42] blkg_rwstat: separate op from flags Message-Id: <1460716802-2294-31-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716875 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie The bio and request operation and flags are going to be separate definitions, so we cannot pass them in as a bitmap. This patch converts the blkg_rwstat code and its caller, cfq, to pass in the values separately. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- block/cfq-iosched.c | 49 +++++++++++++++++++++++++++------------------- include/linux/blk-cgroup.h | 13 ++++++------ 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 3fcc598..0dfa2dd 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c @@ -667,9 +667,10 @@ static inline void cfqg_put(struct cfq_group *cfqg) } while (0) static inline void cfqg_stats_update_io_add(struct cfq_group *cfqg, - struct cfq_group *curr_cfqg, int rw) + struct cfq_group *curr_cfqg, int op, + int op_flags) { - blkg_rwstat_add(&cfqg->stats.queued, rw, 1); + blkg_rwstat_add(&cfqg->stats.queued, op, op_flags, 1); cfqg_stats_end_empty_time(&cfqg->stats); cfqg_stats_set_start_group_wait_time(cfqg, curr_cfqg); } @@ -683,26 +684,30 @@ static inline void cfqg_stats_update_timeslice_used(struct cfq_group *cfqg, #endif } -static inline void cfqg_stats_update_io_remove(struct cfq_group *cfqg, int rw) +static inline void cfqg_stats_update_io_remove(struct cfq_group *cfqg, int op, + int op_flags) { - blkg_rwstat_add(&cfqg->stats.queued, rw, -1); + blkg_rwstat_add(&cfqg->stats.queued, op, op_flags, -1); } -static inline void cfqg_stats_update_io_merged(struct cfq_group *cfqg, int rw) +static inline void cfqg_stats_update_io_merged(struct cfq_group *cfqg, int op, + int op_flags) { - blkg_rwstat_add(&cfqg->stats.merged, rw, 1); + blkg_rwstat_add(&cfqg->stats.merged, op, op_flags, 1); } static inline void cfqg_stats_update_completion(struct cfq_group *cfqg, - uint64_t start_time, uint64_t io_start_time, int rw) + uint64_t start_time, uint64_t io_start_time, int op, + int op_flags) { struct cfqg_stats *stats = &cfqg->stats; unsigned long long now = sched_clock(); if (time_after64(now, io_start_time)) - blkg_rwstat_add(&stats->service_time, rw, now - io_start_time); + blkg_rwstat_add(&stats->service_time, op, op_flags, + now - io_start_time); if (time_after64(io_start_time, start_time)) - blkg_rwstat_add(&stats->wait_time, rw, + blkg_rwstat_add(&stats->wait_time, op, op_flags, io_start_time - start_time); } @@ -781,13 +786,16 @@ static inline void cfqg_put(struct cfq_group *cfqg) { } #define cfq_log_cfqg(cfqd, cfqg, fmt, args...) do {} while (0) static inline void cfqg_stats_update_io_add(struct cfq_group *cfqg, - struct cfq_group *curr_cfqg, int rw) { } + struct cfq_group *curr_cfqg, int op, int op_flags) { } static inline void cfqg_stats_update_timeslice_used(struct cfq_group *cfqg, unsigned long time, unsigned long unaccounted_time) { } -static inline void cfqg_stats_update_io_remove(struct cfq_group *cfqg, int rw) { } -static inline void cfqg_stats_update_io_merged(struct cfq_group *cfqg, int rw) { } +static inline void cfqg_stats_update_io_remove(struct cfq_group *cfqg, int op, + int op_flags) { } +static inline void cfqg_stats_update_io_merged(struct cfq_group *cfqg, int op, + int op_flags) { } static inline void cfqg_stats_update_completion(struct cfq_group *cfqg, - uint64_t start_time, uint64_t io_start_time, int rw) { } + uint64_t start_time, uint64_t io_start_time, int op, + int op_flags) { } #endif /* CONFIG_CFQ_GROUP_IOSCHED */ @@ -2461,10 +2469,10 @@ static void cfq_reposition_rq_rb(struct cfq_queue *cfqq, struct request *rq) { elv_rb_del(&cfqq->sort_list, rq); cfqq->queued[rq_is_sync(rq)]--; - cfqg_stats_update_io_remove(RQ_CFQG(rq), rq->cmd_flags); + cfqg_stats_update_io_remove(RQ_CFQG(rq), rq->op, rq->cmd_flags); cfq_add_rq_rb(rq); cfqg_stats_update_io_add(RQ_CFQG(rq), cfqq->cfqd->serving_group, - rq->cmd_flags); + rq->op, rq->cmd_flags); } static struct request * @@ -2517,7 +2525,7 @@ static void cfq_remove_request(struct request *rq) cfq_del_rq_rb(rq); cfqq->cfqd->rq_queued--; - cfqg_stats_update_io_remove(RQ_CFQG(rq), rq->cmd_flags); + cfqg_stats_update_io_remove(RQ_CFQG(rq), rq->op, rq->cmd_flags); if (rq->cmd_flags & REQ_PRIO) { WARN_ON(!cfqq->prio_pending); cfqq->prio_pending--; @@ -2552,7 +2560,7 @@ static void cfq_merged_request(struct request_queue *q, struct request *req, static void cfq_bio_merged(struct request_queue *q, struct request *req, struct bio *bio) { - cfqg_stats_update_io_merged(RQ_CFQG(req), bio->bi_rw); + cfqg_stats_update_io_merged(RQ_CFQG(req), bio->bi_op, bio->bi_rw); } static void @@ -2575,7 +2583,7 @@ cfq_merged_requests(struct request_queue *q, struct request *rq, if (cfqq->next_rq == next) cfqq->next_rq = rq; cfq_remove_request(next); - cfqg_stats_update_io_merged(RQ_CFQG(rq), next->cmd_flags); + cfqg_stats_update_io_merged(RQ_CFQG(rq), next->op, next->cmd_flags); cfqq = RQ_CFQQ(next); /* @@ -4108,7 +4116,7 @@ static void cfq_insert_request(struct request_queue *q, struct request *rq) rq->fifo_time = jiffies + cfqd->cfq_fifo_expire[rq_is_sync(rq)]; list_add_tail(&rq->queuelist, &cfqq->fifo); cfq_add_rq_rb(rq); - cfqg_stats_update_io_add(RQ_CFQG(rq), cfqd->serving_group, + cfqg_stats_update_io_add(RQ_CFQG(rq), cfqd->serving_group, rq->op, rq->cmd_flags); cfq_rq_enqueued(cfqd, cfqq, rq); } @@ -4206,7 +4214,8 @@ static void cfq_completed_request(struct request_queue *q, struct request *rq) cfqq->dispatched--; (RQ_CFQG(rq))->dispatched--; cfqg_stats_update_completion(cfqq->cfqg, rq_start_time_ns(rq), - rq_io_start_time_ns(rq), rq->cmd_flags); + rq_io_start_time_ns(rq), rq->op, + rq->cmd_flags); cfqd->rq_in_flight[cfq_cfqq_sync(cfqq)]--; diff --git a/include/linux/blk-cgroup.h b/include/linux/blk-cgroup.h index c02e669..9071feb 100644 --- a/include/linux/blk-cgroup.h +++ b/include/linux/blk-cgroup.h @@ -590,25 +590,26 @@ static inline void blkg_rwstat_exit(struct blkg_rwstat *rwstat) /** * blkg_rwstat_add - add a value to a blkg_rwstat * @rwstat: target blkg_rwstat - * @rw: mask of REQ_{WRITE|SYNC} + * @op: REQ_OP + * @op_flags: rq_flag_bits * @val: value to add * * Add @val to @rwstat. The counters are chosen according to @rw. The * caller is responsible for synchronizing calls to this function. */ static inline void blkg_rwstat_add(struct blkg_rwstat *rwstat, - int rw, uint64_t val) + int op, int op_flags, uint64_t val) { struct percpu_counter *cnt; - if (rw & REQ_WRITE) + if (op_is_write(op)) cnt = &rwstat->cpu_cnt[BLKG_RWSTAT_WRITE]; else cnt = &rwstat->cpu_cnt[BLKG_RWSTAT_READ]; __percpu_counter_add(cnt, val, BLKG_STAT_CPU_BATCH); - if (rw & REQ_SYNC) + if (op_flags & REQ_SYNC) cnt = &rwstat->cpu_cnt[BLKG_RWSTAT_SYNC]; else cnt = &rwstat->cpu_cnt[BLKG_RWSTAT_ASYNC]; @@ -713,9 +714,9 @@ static inline bool blkcg_bio_issue_check(struct request_queue *q, if (!throtl) { blkg = blkg ?: q->root_blkg; - blkg_rwstat_add(&blkg->stat_bytes, bio->bi_rw, + blkg_rwstat_add(&blkg->stat_bytes, bio->bi_op, bio->bi_rw, bio->bi_iter.bi_size); - blkg_rwstat_add(&blkg->stat_ios, bio->bi_rw, 1); + blkg_rwstat_add(&blkg->stat_ios, bio->bi_op, bio->bi_rw, 1); } rcu_read_unlock(); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:41:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3AD9D7CA6 for ; Fri, 15 Apr 2016 05:41:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D68B130404E for ; Fri, 15 Apr 2016 03:41:21 -0700 (PDT) X-ASG-Debug-ID: 1460716879-04bdf011035e4c00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id sQvOtmhuzCS4qQQd (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:41:19 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2CD9F64075; Fri, 15 Apr 2016 10:41:19 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe32I010243; Fri, 15 Apr 2016 06:41:17 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 32/42] block: convert is_sync helpers to use REQ_OPs. Date: Fri, 15 Apr 2016 05:39:52 -0500 X-ASG-Orig-Subj: [PATCH 32/42] block: convert is_sync helpers to use REQ_OPs. Message-Id: <1460716802-2294-33-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Fri, 15 Apr 2016 10:41:19 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460716879 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch converts the is_sync helpers to use separate variables for the operation and flags. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- block/blk-core.c | 6 +++--- block/blk-mq.c | 8 ++++---- block/cfq-iosched.c | 2 +- include/linux/blkdev.h | 6 +++--- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index 660aeb8..e2f7b0a 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -962,7 +962,7 @@ static void __freed_request(struct request_list *rl, int sync) static void freed_request(struct request_list *rl, int op, unsigned int flags) { struct request_queue *q = rl->q; - int sync = rw_is_sync(op | flags); + int sync = rw_is_sync(op, flags); q->nr_rqs[sync]--; rl->count[sync]--; @@ -1075,7 +1075,7 @@ static struct request *__get_request(struct request_list *rl, int op, struct elevator_type *et = q->elevator->type; struct io_context *ioc = rq_ioc(bio); struct io_cq *icq = NULL; - const bool is_sync = rw_is_sync(op | op_flags) != 0; + const bool is_sync = rw_is_sync(op, op_flags) != 0; int may_queue; if (unlikely(blk_queue_dying(q))) @@ -1246,7 +1246,7 @@ static struct request *get_request(struct request_queue *q, int op, int op_flags, struct bio *bio, gfp_t gfp_mask) { - const bool is_sync = rw_is_sync(op | op_flags) != 0; + const bool is_sync = rw_is_sync(op, op_flags) != 0; DEFINE_WAIT(wait); struct request_list *rl; struct request *rq; diff --git a/block/blk-mq.c b/block/blk-mq.c index 4843c0b..64d61be 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -206,7 +206,7 @@ static void blk_mq_rq_ctx_init(struct request_queue *q, struct blk_mq_ctx *ctx, rq->end_io_data = NULL; rq->next_rq = NULL; - ctx->rq_dispatched[rw_is_sync(op | op_flags)]++; + ctx->rq_dispatched[rw_is_sync(op, op_flags)]++; } static struct request * @@ -1181,7 +1181,7 @@ static struct request *blk_mq_map_request(struct request_queue *q, ctx = blk_mq_get_ctx(q); hctx = q->mq_ops->map_queue(q, ctx->cpu); - if (rw_is_sync(bio->bi_op | bio->bi_rw)) + if (rw_is_sync(bio->bi_op, bio->bi_rw)) op_flags |= REQ_SYNC; trace_block_getrq(q, bio, op); @@ -1249,7 +1249,7 @@ static int blk_mq_direct_issue_request(struct request *rq, blk_qc_t *cookie) */ static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio) { - const int is_sync = rw_is_sync(bio->bi_op | bio->bi_rw); + const int is_sync = rw_is_sync(bio->bi_op, bio->bi_rw); const int is_flush_fua = bio->bi_rw & (REQ_FLUSH | REQ_FUA); struct blk_map_ctx data; struct request *rq; @@ -1346,7 +1346,7 @@ done: */ static blk_qc_t blk_sq_make_request(struct request_queue *q, struct bio *bio) { - const int is_sync = rw_is_sync(bio->bi_op | bio->bi_rw); + const int is_sync = rw_is_sync(bio->bi_op, bio->bi_rw); const int is_flush_fua = bio->bi_rw & (REQ_FLUSH | REQ_FUA); struct blk_plug *plug; unsigned int request_count = 0; diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 0dfa2dd..2fd5bcf 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c @@ -4311,7 +4311,7 @@ static int cfq_may_queue(struct request_queue *q, int op, int op_flags) if (!cic) return ELV_MQUEUE_MAY; - cfqq = cic_to_cfqq(cic, rw_is_sync(op | op_flags)); + cfqq = cic_to_cfqq(cic, rw_is_sync(op, op_flags)); if (cfqq) { cfq_init_prio_data(cfqq, cic); diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 4aaa317..42711ef 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -617,14 +617,14 @@ static inline unsigned int blk_queue_cluster(struct request_queue *q) /* * We regard a request as sync, if either a read or a sync write */ -static inline bool rw_is_sync(unsigned int rw_flags) +static inline bool rw_is_sync(int op, unsigned int rw_flags) { - return !(rw_flags & REQ_WRITE) || (rw_flags & REQ_SYNC); + return op == REQ_OP_READ || (rw_flags & REQ_SYNC); } static inline bool rq_is_sync(struct request *rq) { - return rw_is_sync(rq->cmd_flags); + return rw_is_sync(rq->op, rq->cmd_flags); } static inline bool blk_rl_full(struct request_list *rl, bool sync) -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:41:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5B7B37CB5 for ; Fri, 15 Apr 2016 05:41:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C12C3AC003 for ; Fri, 15 Apr 2016 03:41:18 -0700 (PDT) X-ASG-Debug-ID: 1460716877-04cbb02e1d2e9890001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id uA498BFd7Wo4CvzN (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:41:17 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E51F73B75A; Fri, 15 Apr 2016 10:41:16 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe32H010243; Fri, 15 Apr 2016 06:41:14 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 31/42] block: convert merge/insert code to check for REQ_OPs. Date: Fri, 15 Apr 2016 05:39:51 -0500 X-ASG-Orig-Subj: [PATCH 31/42] block: convert merge/insert code to check for REQ_OPs. Message-Id: <1460716802-2294-32-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716877 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch converts the block layer merging code to use separate variables for the operation and flags, and to check request->op for the REQ_OP. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- block/blk-core.c | 2 +- block/blk-merge.c | 10 ++++++---- include/linux/blkdev.h | 20 ++++++++++---------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index a796b35..660aeb8 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -2176,7 +2176,7 @@ EXPORT_SYMBOL(submit_bio); static int blk_cloned_rq_check_limits(struct request_queue *q, struct request *rq) { - if (blk_rq_sectors(rq) > blk_queue_get_max_sectors(q, rq->cmd_flags)) { + if (blk_rq_sectors(rq) > blk_queue_get_max_sectors(q, rq->op)) { printk(KERN_ERR "%s: over max size limit.\n", __func__); return -EIO; } diff --git a/block/blk-merge.c b/block/blk-merge.c index 2613531..c02371f 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -649,7 +649,8 @@ static int attempt_merge(struct request_queue *q, struct request *req, if (!rq_mergeable(req) || !rq_mergeable(next)) return 0; - if (!blk_check_merge_flags(req->cmd_flags, next->cmd_flags)) + if (!blk_check_merge_flags(req->cmd_flags, req->op, next->cmd_flags, + next->op)) return 0; /* @@ -663,7 +664,7 @@ static int attempt_merge(struct request_queue *q, struct request *req, || req_no_special_merge(next)) return 0; - if (req->cmd_flags & REQ_WRITE_SAME && + if (req->op == REQ_OP_WRITE_SAME && !blk_write_same_mergeable(req->bio, next->bio)) return 0; @@ -751,7 +752,8 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio) if (!rq_mergeable(rq) || !bio_mergeable(bio)) return false; - if (!blk_check_merge_flags(rq->cmd_flags, bio->bi_rw)) + if (!blk_check_merge_flags(rq->cmd_flags, rq->op, bio->bi_rw, + bio->bi_op)) return false; /* different data direction or already started, don't merge */ @@ -767,7 +769,7 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio) return false; /* must be using the same buffer */ - if (rq->cmd_flags & REQ_WRITE_SAME && + if (rq->op == REQ_OP_WRITE_SAME && !blk_write_same_mergeable(rq->bio, bio)) return false; diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index bce32e2..4aaa317 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -659,16 +659,16 @@ static inline bool rq_mergeable(struct request *rq) return true; } -static inline bool blk_check_merge_flags(unsigned int flags1, - unsigned int flags2) +static inline bool blk_check_merge_flags(unsigned int flags1, unsigned int op1, + unsigned int flags2, unsigned int op2) { - if ((flags1 & REQ_DISCARD) != (flags2 & REQ_DISCARD)) + if ((op1 == REQ_OP_DISCARD) != (op2 == REQ_OP_DISCARD)) return false; if ((flags1 & REQ_SECURE) != (flags2 & REQ_SECURE)) return false; - if ((flags1 & REQ_WRITE_SAME) != (flags2 & REQ_WRITE_SAME)) + if ((op1 == REQ_OP_WRITE_SAME) != (op2 == REQ_OP_WRITE_SAME)) return false; return true; @@ -869,12 +869,12 @@ static inline unsigned int blk_rq_cur_sectors(const struct request *rq) } static inline unsigned int blk_queue_get_max_sectors(struct request_queue *q, - unsigned int cmd_flags) + int op) { - if (unlikely(cmd_flags & REQ_DISCARD)) + if (unlikely(op == REQ_OP_DISCARD)) return min(q->limits.max_discard_sectors, UINT_MAX >> 9); - if (unlikely(cmd_flags & REQ_WRITE_SAME)) + if (unlikely(op == REQ_OP_WRITE_SAME)) return q->limits.max_write_same_sectors; return q->limits.max_sectors; @@ -901,11 +901,11 @@ static inline unsigned int blk_rq_get_max_sectors(struct request *rq) if (unlikely(rq->cmd_type != REQ_TYPE_FS)) return q->limits.max_hw_sectors; - if (!q->limits.chunk_sectors || (rq->cmd_flags & REQ_DISCARD)) - return blk_queue_get_max_sectors(q, rq->cmd_flags); + if (!q->limits.chunk_sectors || (rq->op == REQ_OP_DISCARD)) + return blk_queue_get_max_sectors(q, rq->op); return min(blk_max_size_offset(q, blk_rq_pos(rq)), - blk_queue_get_max_sectors(q, rq->cmd_flags)); + blk_queue_get_max_sectors(q, rq->op)); } static inline unsigned int blk_rq_count_bios(struct request *rq) -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:41:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4A43E7D48 for ; Fri, 15 Apr 2016 05:41:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1E082304048 for ; Fri, 15 Apr 2016 03:41:26 -0700 (PDT) X-ASG-Debug-ID: 1460716883-04cb6c2462614f80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id tJfzjVajxk9FbSeP (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:41:24 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id ACB7CC049D5B; Fri, 15 Apr 2016 10:41:23 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe32K010243; Fri, 15 Apr 2016 06:41:21 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 34/42] drivers: set request op to REQ_OP Date: Fri, 15 Apr 2016 05:39:54 -0500 X-ASG-Orig-Subj: [PATCH 34/42] drivers: set request op to REQ_OP Message-Id: <1460716802-2294-35-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716884 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has the block drivers use the request->op for REQ_OP operations and cmd_flags for rq_flag_bits. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/block/loop.c | 6 +++--- drivers/block/mtip32xx/mtip32xx.c | 2 +- drivers/block/nbd.c | 2 +- drivers/block/rbd.c | 2 +- drivers/block/skd_main.c | 11 ++++------- drivers/block/xen-blkfront.c | 8 +++++--- drivers/md/dm.c | 2 +- drivers/mmc/card/block.c | 7 +++---- drivers/mmc/card/queue.c | 6 ++---- drivers/mmc/card/queue.h | 5 ++++- drivers/mtd/mtd_blkdevs.c | 2 +- drivers/nvme/host/core.c | 2 +- drivers/nvme/host/nvme.h | 2 +- drivers/nvme/host/pci.c | 2 +- drivers/scsi/sd.c | 25 ++++++++++++++++--------- 15 files changed, 45 insertions(+), 39 deletions(-) diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 7e5e27a..0e80c9b 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -538,7 +538,7 @@ static int do_req_filebacked(struct loop_device *lo, struct request *rq) if (rq->cmd_flags & REQ_WRITE) { if (rq->cmd_flags & REQ_FLUSH) ret = lo_req_flush(lo, rq); - else if (rq->cmd_flags & REQ_DISCARD) + else if (rq->op == REQ_OP_DISCARD) ret = lo_discard(lo, rq, pos); else if (lo->transfer) ret = lo_write_transfer(lo, rq, pos); @@ -1653,8 +1653,8 @@ static int loop_queue_rq(struct blk_mq_hw_ctx *hctx, if (lo->lo_state != Lo_bound) return -EIO; - if (lo->use_dio && !(cmd->rq->cmd_flags & (REQ_FLUSH | - REQ_DISCARD))) + if (lo->use_dio && (!(cmd->rq->cmd_flags & REQ_FLUSH) || + cmd->rq->op == REQ_OP_DISCARD)) cmd->use_aio = true; else cmd->use_aio = false; diff --git a/drivers/block/mtip32xx/mtip32xx.c b/drivers/block/mtip32xx/mtip32xx.c index 6053e46..7638273 100644 --- a/drivers/block/mtip32xx/mtip32xx.c +++ b/drivers/block/mtip32xx/mtip32xx.c @@ -3765,7 +3765,7 @@ static int mtip_submit_request(struct blk_mq_hw_ctx *hctx, struct request *rq) return -ENODATA; } - if (rq->cmd_flags & REQ_DISCARD) { + if (rq->op == REQ_OP_DISCARD) { int err; err = mtip_send_trim(dd, blk_rq_pos(rq), blk_rq_sectors(rq)); diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 31e73a7..68a1476 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -282,7 +282,7 @@ static int nbd_send_req(struct nbd_device *nbd, struct request *req) if (req->cmd_type == REQ_TYPE_DRV_PRIV) type = NBD_CMD_DISC; - else if (req->cmd_flags & REQ_DISCARD) + else if (req->op == REQ_OP_DISCARD) type = NBD_CMD_TRIM; else if (req->cmd_flags & REQ_FLUSH) type = NBD_CMD_FLUSH; diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 94a1843..e8935af 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -3371,7 +3371,7 @@ static void rbd_queue_workfn(struct work_struct *work) goto err; } - if (rq->cmd_flags & REQ_DISCARD) + if (rq->op == REQ_OP_DISCARD) op_type = OBJ_OP_DISCARD; else if (rq->cmd_flags & REQ_WRITE) op_type = OBJ_OP_WRITE; diff --git a/drivers/block/skd_main.c b/drivers/block/skd_main.c index 41aaae3..5739223 100644 --- a/drivers/block/skd_main.c +++ b/drivers/block/skd_main.c @@ -576,7 +576,6 @@ static void skd_request_fn(struct request_queue *q) struct request *req = NULL; struct skd_scsi_request *scsi_req; struct page *page; - unsigned long io_flags; int error; u32 lba; u32 count; @@ -624,12 +623,11 @@ static void skd_request_fn(struct request_queue *q) lba = (u32)blk_rq_pos(req); count = blk_rq_sectors(req); data_dir = rq_data_dir(req); - io_flags = req->cmd_flags; - if (io_flags & REQ_FLUSH) + if (req->cmd_flags & REQ_FLUSH) flush++; - if (io_flags & REQ_FUA) + if (req->cmd_flags & REQ_FUA) fua++; pr_debug("%s:%s:%d new req=%p lba=%u(0x%x) " @@ -735,7 +733,7 @@ static void skd_request_fn(struct request_queue *q) else skreq->sg_data_dir = SKD_DATA_DIR_HOST_TO_CARD; - if (io_flags & REQ_DISCARD) { + if (req->op == REQ_OP_DISCARD) { page = alloc_page(GFP_ATOMIC | __GFP_ZERO); if (!page) { pr_err("request_fn:Page allocation failed.\n"); @@ -852,9 +850,8 @@ static void skd_end_request(struct skd_device *skdev, struct skd_request_context *skreq, int error) { struct request *req = skreq->req; - unsigned int io_flags = req->cmd_flags; - if ((io_flags & REQ_DISCARD) && + if ((req->op == REQ_OP_DISCARD) && (skreq->discard_page == 1)) { pr_debug("%s:%s:%d, free the page!", skdev->name, __func__, __LINE__); diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index 52963a2..dc08d4d 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c @@ -844,7 +844,8 @@ static int blkif_queue_request(struct request *req, struct blkfront_ring_info *r if (unlikely(rinfo->dev_info->connected != BLKIF_STATE_CONNECTED)) return 1; - if (unlikely(req->cmd_flags & (REQ_DISCARD | REQ_SECURE))) + if (unlikely(req->op == REQ_OP_DISCARD || + req->cmd_flags & REQ_SECURE)) return blkif_queue_discard_req(req, rinfo); else return blkif_queue_rw_req(req, rinfo); @@ -2054,8 +2055,9 @@ static int blkif_recover(struct blkfront_info *info) /* * Get the bios in the request so we can re-queue them. */ - if (copy[i].request->cmd_flags & - (REQ_FLUSH | REQ_FUA | REQ_DISCARD | REQ_SECURE)) { + if (copy[i].request->cmd_flags & REQ_FLUSH || + copy[i].request->op == REQ_OP_DISCARD || + copy[i].request->cmd_flags & (REQ_FUA | REQ_SECURE)) { /* * Flush operations don't contain bios, so * we need to requeue the whole request diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 98fea0e..13c869c 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -1322,7 +1322,7 @@ static void dm_done(struct request *clone, int error, bool mapped) r = rq_end_io(tio->ti, clone, error, &tio->info); } - if (unlikely(r == -EREMOTEIO && (clone->cmd_flags & REQ_WRITE_SAME) && + if (unlikely(r == -EREMOTEIO && (clone->op == REQ_OP_WRITE_SAME) && !clone->q->limits.max_write_same_sectors)) disable_write_same(tio->md); diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 8db2bf0..8fa3982 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -1696,8 +1696,7 @@ static u8 mmc_blk_prep_packed_list(struct mmc_queue *mq, struct request *req) !IS_ALIGNED(blk_rq_sectors(next), 8)) break; - if (next->cmd_flags & REQ_DISCARD || - next->cmd_flags & REQ_FLUSH) + if (next->op == REQ_OP_DISCARD || next->cmd_flags & REQ_FLUSH) break; if (rq_data_dir(cur) != rq_data_dir(next)) @@ -2138,7 +2137,7 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) } mq->flags &= ~MMC_QUEUE_NEW_REQUEST; - if (cmd_flags & REQ_DISCARD) { + if (req && req->op == REQ_OP_DISCARD) { /* complete ongoing async transfer before issuing discard */ if (card->host->areq) mmc_blk_issue_rw_rq(mq, NULL); @@ -2162,7 +2161,7 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) out: if ((!req && !(mq->flags & MMC_QUEUE_NEW_REQUEST)) || - (cmd_flags & MMC_REQ_SPECIAL_MASK)) + mmc_req_is_special(req)) /* * Release host when there are no more requests * and after special request(discard, flush) is done. diff --git a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c index 6f4323c..9fb8d21 100644 --- a/drivers/mmc/card/queue.c +++ b/drivers/mmc/card/queue.c @@ -33,7 +33,7 @@ static int mmc_prep_request(struct request_queue *q, struct request *req) /* * We only like normal block requests and discards. */ - if (req->cmd_type != REQ_TYPE_FS && !(req->cmd_flags & REQ_DISCARD)) { + if (req->cmd_type != REQ_TYPE_FS && req->op != REQ_OP_DISCARD) { blk_dump_rq_flags(req, "MMC bad request"); return BLKPREP_KILL; } @@ -56,7 +56,6 @@ static int mmc_queue_thread(void *d) down(&mq->thread_sem); do { struct request *req = NULL; - unsigned int cmd_flags = 0; spin_lock_irq(q->queue_lock); set_current_state(TASK_INTERRUPTIBLE); @@ -66,7 +65,6 @@ static int mmc_queue_thread(void *d) if (req || mq->mqrq_prev->req) { set_current_state(TASK_RUNNING); - cmd_flags = req ? req->cmd_flags : 0; mq->issue_fn(mq, req); cond_resched(); if (mq->flags & MMC_QUEUE_NEW_REQUEST) { @@ -81,7 +79,7 @@ static int mmc_queue_thread(void *d) * has been finished. Do not assign it to previous * request. */ - if (cmd_flags & MMC_REQ_SPECIAL_MASK) + if (mmc_req_is_special(req)) mq->mqrq_cur->req = NULL; mq->mqrq_prev->brq.mrq.data = NULL; diff --git a/drivers/mmc/card/queue.h b/drivers/mmc/card/queue.h index 36cddab..f166e5b 100644 --- a/drivers/mmc/card/queue.h +++ b/drivers/mmc/card/queue.h @@ -1,7 +1,10 @@ #ifndef MMC_QUEUE_H #define MMC_QUEUE_H -#define MMC_REQ_SPECIAL_MASK (REQ_DISCARD | REQ_FLUSH) +static inline bool mmc_req_is_special(struct request *req) +{ + return req && (req->cmd_flags & REQ_FLUSH || req->op == REQ_OP_DISCARD); +} struct request; struct task_struct; diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c index 74ae243..e8b0263 100644 --- a/drivers/mtd/mtd_blkdevs.c +++ b/drivers/mtd/mtd_blkdevs.c @@ -94,7 +94,7 @@ static int do_blktrans_request(struct mtd_blktrans_ops *tr, get_capacity(req->rq_disk)) return -EIO; - if (req->cmd_flags & REQ_DISCARD) + if (req->op == REQ_OP_DISCARD) return tr->discard(dev, block, nsect); if (rq_data_dir(req) == READ) { diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 4eb5759..b741aed 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -234,7 +234,7 @@ int nvme_setup_cmd(struct nvme_ns *ns, struct request *req, memcpy(cmd, req->cmd, sizeof(*cmd)); else if (req->cmd_flags & REQ_FLUSH) nvme_setup_flush(ns, cmd); - else if (req->cmd_flags & REQ_DISCARD) + else if (req->op == REQ_OP_DISCARD) ret = nvme_setup_discard(ns, req, cmd); else nvme_setup_rw(ns, req, cmd); diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index 8e8fae8..0f04523 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -175,7 +175,7 @@ static inline u64 nvme_block_nr(struct nvme_ns *ns, sector_t sector) static inline unsigned nvme_map_len(struct request *rq) { - if (rq->cmd_flags & REQ_DISCARD) + if (rq->op == REQ_OP_DISCARD) return sizeof(struct nvme_dsm_range); else return blk_rq_bytes(rq); diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index ff3c8d7..ea5f5eb 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -363,7 +363,7 @@ static void nvme_free_iod(struct nvme_dev *dev, struct request *req) __le64 **list = iod_list(req); dma_addr_t prp_dma = iod->first_dma; - if (req->cmd_flags & REQ_DISCARD) + if (req->op == REQ_OP_DISCARD) kfree(req->completion_data); if (iod->npages == 0) diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 428c03e..2fc7191 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1012,7 +1012,8 @@ static int sd_setup_read_write_cmnd(struct scsi_cmnd *SCpnt) } else if (rq_data_dir(rq) == READ) { SCpnt->cmnd[0] = READ_6; } else { - scmd_printk(KERN_ERR, SCpnt, "Unknown command %llx\n", (unsigned long long) rq->cmd_flags); + scmd_printk(KERN_ERR, SCpnt, "Unknown command %d,%llx\n", + rq->op, (unsigned long long) rq->cmd_flags); goto out; } @@ -1137,21 +1138,27 @@ static int sd_init_command(struct scsi_cmnd *cmd) { struct request *rq = cmd->request; - if (rq->cmd_flags & REQ_DISCARD) + switch (rq->op) { + case REQ_OP_DISCARD: return sd_setup_discard_cmnd(cmd); - else if (rq->cmd_flags & REQ_WRITE_SAME) + case REQ_OP_WRITE_SAME: return sd_setup_write_same_cmnd(cmd); - else if (rq->cmd_flags & REQ_FLUSH) - return sd_setup_flush_cmnd(cmd); - else - return sd_setup_read_write_cmnd(cmd); + case REQ_OP_READ: + case REQ_OP_WRITE: + if (rq->cmd_flags & REQ_FLUSH) + return sd_setup_flush_cmnd(cmd); + else + return sd_setup_read_write_cmnd(cmd); + default: + BUG(); + } } static void sd_uninit_command(struct scsi_cmnd *SCpnt) { struct request *rq = SCpnt->request; - if (rq->cmd_flags & REQ_DISCARD) + if (rq->op == REQ_OP_DISCARD) __free_page(rq->completion_data); if (SCpnt->cmnd != rq->cmd) { @@ -1769,7 +1776,7 @@ static int sd_done(struct scsi_cmnd *SCpnt) unsigned char op = SCpnt->cmnd[0]; unsigned char unmap = SCpnt->cmnd[1] & 8; - if (req->cmd_flags & REQ_DISCARD || req->cmd_flags & REQ_WRITE_SAME) { + if (req->op == REQ_OP_DISCARD || req->op == REQ_OP_WRITE_SAME) { if (!result) { good_bytes = blk_rq_bytes(req); scsi_set_resid(SCpnt, 0); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:41:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 466CA7D48 for ; Fri, 15 Apr 2016 05:41:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id BD8B3AC003 for ; Fri, 15 Apr 2016 03:41:26 -0700 (PDT) X-ASG-Debug-ID: 1460716881-04cbb02e1b2e98a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id jdRioIUHuBuRdxfR (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:41:22 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 69A647F084; Fri, 15 Apr 2016 10:41:21 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe32J010243; Fri, 15 Apr 2016 06:41:19 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 33/42] block: convert rq_data_dir helper to use REQ_OPs Date: Fri, 15 Apr 2016 05:39:53 -0500 X-ASG-Orig-Subj: [PATCH 33/42] block: convert rq_data_dir helper to use REQ_OPs Message-Id: <1460716802-2294-34-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716881 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie The request->op field is now always setup up with a REQ_OP. This patch has the rq_data_dir helper convert the operation to a WRITE or READ direction based on that. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- include/linux/blkdev.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 42711ef..5694894 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -598,7 +598,7 @@ static inline void queue_flag_clear(unsigned int flag, struct request_queue *q) #define list_entry_rq(ptr) list_entry((ptr), struct request, queuelist) -#define rq_data_dir(rq) ((int)((rq)->cmd_flags & 1)) +#define rq_data_dir(rq) (op_is_write(rq->op) ? WRITE : READ) /* * Driver can handle struct request, if it either has an old style -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:41:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C0DFF7CD0 for ; Fri, 15 Apr 2016 05:41:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9486D30404E for ; Fri, 15 Apr 2016 03:41:29 -0700 (PDT) X-ASG-Debug-ID: 1460716888-04cbb02e1d2e98c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YC42Hr8mglja1vLX (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:41:28 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3D0AE91E92; Fri, 15 Apr 2016 10:41:28 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe32M010243; Fri, 15 Apr 2016 06:41:26 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 36/42] ide cd: do not set REQ_WRITE on requests. Date: Fri, 15 Apr 2016 05:39:56 -0500 X-ASG-Orig-Subj: [PATCH 36/42] ide cd: do not set REQ_WRITE on requests. Message-Id: <1460716802-2294-37-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716888 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie The block layer will set the correct READ/WRITE operation flags/fields when creating a request, so there is not need for drivers to set the REQ_WRITE flag. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/ide/ide-cd_ioctl.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/drivers/ide/ide-cd_ioctl.c b/drivers/ide/ide-cd_ioctl.c index 474173e..5887a7a 100644 --- a/drivers/ide/ide-cd_ioctl.c +++ b/drivers/ide/ide-cd_ioctl.c @@ -459,9 +459,6 @@ int ide_cdrom_packet(struct cdrom_device_info *cdi, layer. the packet must be complete, as we do not touch it at all. */ - if (cgc->data_direction == CGC_DATA_WRITE) - flags |= REQ_WRITE; - if (cgc->sense) memset(cgc->sense, 0, sizeof(struct request_sense)); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:41:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 28E6D7D4A for ; Fri, 15 Apr 2016 05:41:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6E959AC004 for ; Fri, 15 Apr 2016 03:41:28 -0700 (PDT) X-ASG-Debug-ID: 1460716886-04cb6c245f614f80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 2lCD2BrHbt7nb95z (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:41:26 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id EED177F08B; Fri, 15 Apr 2016 10:41:25 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe32L010243; Fri, 15 Apr 2016 06:41:23 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 35/42] blktrace: get op from req->op/bio->bi_op Date: Fri, 15 Apr 2016 05:39:55 -0500 X-ASG-Orig-Subj: [PATCH 35/42] blktrace: get op from req->op/bio->bi_op Message-Id: <1460716802-2294-36-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716886 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie The bio and request structs now store the operation in bio->bi_op/request->op. This patch has blktrace use that field instead of bi_rw/cmd_flags. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- include/linux/blktrace_api.h | 2 +- include/trace/events/bcache.h | 12 ++++++---- include/trace/events/block.h | 31 +++++++++++++++++--------- kernel/trace/blktrace.c | 52 +++++++++++++++++++++++-------------------- 4 files changed, 57 insertions(+), 40 deletions(-) diff --git a/include/linux/blktrace_api.h b/include/linux/blktrace_api.h index afc1343..ee25ba4 100644 --- a/include/linux/blktrace_api.h +++ b/include/linux/blktrace_api.h @@ -109,7 +109,7 @@ static inline int blk_cmd_buf_len(struct request *rq) } extern void blk_dump_cmd(char *buf, struct request *rq); -extern void blk_fill_rwbs(char *rwbs, u32 rw, int bytes); +extern void blk_fill_rwbs(char *rwbs, int op, u32 rw, int bytes); #endif /* CONFIG_EVENT_TRACING && CONFIG_BLOCK */ diff --git a/include/trace/events/bcache.h b/include/trace/events/bcache.h index 981acf7..8abe564 100644 --- a/include/trace/events/bcache.h +++ b/include/trace/events/bcache.h @@ -27,7 +27,8 @@ DECLARE_EVENT_CLASS(bcache_request, __entry->sector = bio->bi_iter.bi_sector; __entry->orig_sector = bio->bi_iter.bi_sector - 16; __entry->nr_sector = bio->bi_iter.bi_size >> 9; - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); ), TP_printk("%d,%d %s %llu + %u (from %d,%d @ %llu)", @@ -101,7 +102,8 @@ DECLARE_EVENT_CLASS(bcache_bio, __entry->dev = bio->bi_bdev->bd_dev; __entry->sector = bio->bi_iter.bi_sector; __entry->nr_sector = bio->bi_iter.bi_size >> 9; - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); ), TP_printk("%d,%d %s %llu + %u", @@ -136,7 +138,8 @@ TRACE_EVENT(bcache_read, __entry->dev = bio->bi_bdev->bd_dev; __entry->sector = bio->bi_iter.bi_sector; __entry->nr_sector = bio->bi_iter.bi_size >> 9; - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); __entry->cache_hit = hit; __entry->bypass = bypass; ), @@ -167,7 +170,8 @@ TRACE_EVENT(bcache_write, __entry->inode = inode; __entry->sector = bio->bi_iter.bi_sector; __entry->nr_sector = bio->bi_iter.bi_size >> 9; - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); __entry->writeback = writeback; __entry->bypass = bypass; ), diff --git a/include/trace/events/block.h b/include/trace/events/block.h index e8a5eca..4416dcd 100644 --- a/include/trace/events/block.h +++ b/include/trace/events/block.h @@ -84,7 +84,8 @@ DECLARE_EVENT_CLASS(block_rq_with_error, 0 : blk_rq_sectors(rq); __entry->errors = rq->errors; - blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq)); + blk_fill_rwbs(__entry->rwbs, rq->op, rq->cmd_flags, + blk_rq_bytes(rq)); blk_dump_cmd(__get_str(cmd), rq); ), @@ -162,7 +163,7 @@ TRACE_EVENT(block_rq_complete, __entry->nr_sector = nr_bytes >> 9; __entry->errors = rq->errors; - blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, nr_bytes); + blk_fill_rwbs(__entry->rwbs, rq->op, rq->cmd_flags, nr_bytes); blk_dump_cmd(__get_str(cmd), rq); ), @@ -198,7 +199,8 @@ DECLARE_EVENT_CLASS(block_rq, __entry->bytes = (rq->cmd_type == REQ_TYPE_BLOCK_PC) ? blk_rq_bytes(rq) : 0; - blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq)); + blk_fill_rwbs(__entry->rwbs, rq->op, rq->cmd_flags, + blk_rq_bytes(rq)); blk_dump_cmd(__get_str(cmd), rq); memcpy(__entry->comm, current->comm, TASK_COMM_LEN); ), @@ -272,7 +274,8 @@ TRACE_EVENT(block_bio_bounce, bio->bi_bdev->bd_dev : 0; __entry->sector = bio->bi_iter.bi_sector; __entry->nr_sector = bio_sectors(bio); - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); memcpy(__entry->comm, current->comm, TASK_COMM_LEN); ), @@ -310,7 +313,8 @@ TRACE_EVENT(block_bio_complete, __entry->sector = bio->bi_iter.bi_sector; __entry->nr_sector = bio_sectors(bio); __entry->error = error; - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); ), TP_printk("%d,%d %s %llu + %u [%d]", @@ -337,7 +341,8 @@ DECLARE_EVENT_CLASS(block_bio_merge, __entry->dev = bio->bi_bdev->bd_dev; __entry->sector = bio->bi_iter.bi_sector; __entry->nr_sector = bio_sectors(bio); - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); memcpy(__entry->comm, current->comm, TASK_COMM_LEN); ), @@ -404,7 +409,8 @@ TRACE_EVENT(block_bio_queue, __entry->dev = bio->bi_bdev->bd_dev; __entry->sector = bio->bi_iter.bi_sector; __entry->nr_sector = bio_sectors(bio); - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); memcpy(__entry->comm, current->comm, TASK_COMM_LEN); ), @@ -432,7 +438,7 @@ DECLARE_EVENT_CLASS(block_get_rq, __entry->dev = bio ? bio->bi_bdev->bd_dev : 0; __entry->sector = bio ? bio->bi_iter.bi_sector : 0; __entry->nr_sector = bio ? bio_sectors(bio) : 0; - blk_fill_rwbs(__entry->rwbs, + blk_fill_rwbs(__entry->rwbs, bio ? bio->bi_op : 0, bio ? bio->bi_rw : 0, __entry->nr_sector); memcpy(__entry->comm, current->comm, TASK_COMM_LEN); ), @@ -567,7 +573,8 @@ TRACE_EVENT(block_split, __entry->dev = bio->bi_bdev->bd_dev; __entry->sector = bio->bi_iter.bi_sector; __entry->new_sector = new_sector; - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); memcpy(__entry->comm, current->comm, TASK_COMM_LEN); ), @@ -610,7 +617,8 @@ TRACE_EVENT(block_bio_remap, __entry->nr_sector = bio_sectors(bio); __entry->old_dev = dev; __entry->old_sector = from; - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); ), TP_printk("%d,%d %s %llu + %u <- (%d,%d) %llu", @@ -656,7 +664,8 @@ TRACE_EVENT(block_rq_remap, __entry->old_dev = dev; __entry->old_sector = from; __entry->nr_bios = blk_rq_count_bios(rq); - blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq)); + blk_fill_rwbs(__entry->rwbs, rq->op, rq->cmd_flags, + blk_rq_bytes(rq)); ), TP_printk("%d,%d %s %llu + %u <- (%d,%d) %llu %u", diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index f94e7a2..6a381ea 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c @@ -199,7 +199,8 @@ static const u32 ddir_act[2] = { BLK_TC_ACT(BLK_TC_READ), * blk_io_trace structure and places it in a per-cpu subbuffer. */ static void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes, - int rw, u32 what, int error, int pdu_len, void *pdu_data) + int op, int op_flags, u32 what, int error, int pdu_len, + void *pdu_data) { struct task_struct *tsk = current; struct ring_buffer_event *event = NULL; @@ -214,13 +215,14 @@ static void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes, if (unlikely(bt->trace_state != Blktrace_running && !blk_tracer)) return; - what |= ddir_act[rw & WRITE]; - what |= MASK_TC_BIT(rw, SYNC); - what |= MASK_TC_BIT(rw, RAHEAD); - what |= MASK_TC_BIT(rw, META); - what |= MASK_TC_BIT(rw, DISCARD); - what |= MASK_TC_BIT(rw, FLUSH); - what |= MASK_TC_BIT(rw, FUA); + what |= ddir_act[op_is_write(op) ? WRITE : READ]; + what |= MASK_TC_BIT(op_flags, SYNC); + what |= MASK_TC_BIT(op_flags, RAHEAD); + what |= MASK_TC_BIT(op_flags, META); + what |= MASK_TC_BIT(op_flags, FLUSH); + what |= MASK_TC_BIT(op_flags, FUA); + if (op == REQ_OP_DISCARD) + what |= BLK_TC_ACT(BLK_TC_DISCARD); pid = tsk->pid; if (act_log_check(bt, what, sector, pid)) @@ -708,11 +710,11 @@ static void blk_add_trace_rq(struct request_queue *q, struct request *rq, if (rq->cmd_type == REQ_TYPE_BLOCK_PC) { what |= BLK_TC_ACT(BLK_TC_PC); - __blk_add_trace(bt, 0, nr_bytes, rq->cmd_flags, + __blk_add_trace(bt, 0, nr_bytes, rq->op, rq->cmd_flags, what, rq->errors, rq->cmd_len, rq->cmd); } else { what |= BLK_TC_ACT(BLK_TC_FS); - __blk_add_trace(bt, blk_rq_pos(rq), nr_bytes, + __blk_add_trace(bt, blk_rq_pos(rq), nr_bytes, rq->op, rq->cmd_flags, what, rq->errors, 0, NULL); } } @@ -770,7 +772,7 @@ static void blk_add_trace_bio(struct request_queue *q, struct bio *bio, return; __blk_add_trace(bt, bio->bi_iter.bi_sector, bio->bi_iter.bi_size, - bio->bi_rw, what, error, 0, NULL); + bio->bi_op, bio->bi_rw, what, error, 0, NULL); } static void blk_add_trace_bio_bounce(void *ignore, @@ -818,7 +820,8 @@ static void blk_add_trace_getrq(void *ignore, struct blk_trace *bt = q->blk_trace; if (bt) - __blk_add_trace(bt, 0, 0, rw, BLK_TA_GETRQ, 0, 0, NULL); + __blk_add_trace(bt, 0, 0, rw, 0, BLK_TA_GETRQ, 0, 0, + NULL); } } @@ -833,7 +836,7 @@ static void blk_add_trace_sleeprq(void *ignore, struct blk_trace *bt = q->blk_trace; if (bt) - __blk_add_trace(bt, 0, 0, rw, BLK_TA_SLEEPRQ, + __blk_add_trace(bt, 0, 0, rw, 0, BLK_TA_SLEEPRQ, 0, 0, NULL); } } @@ -843,7 +846,7 @@ static void blk_add_trace_plug(void *ignore, struct request_queue *q) struct blk_trace *bt = q->blk_trace; if (bt) - __blk_add_trace(bt, 0, 0, 0, BLK_TA_PLUG, 0, 0, NULL); + __blk_add_trace(bt, 0, 0, 0, 0, BLK_TA_PLUG, 0, 0, NULL); } static void blk_add_trace_unplug(void *ignore, struct request_queue *q, @@ -860,7 +863,7 @@ static void blk_add_trace_unplug(void *ignore, struct request_queue *q, else what = BLK_TA_UNPLUG_TIMER; - __blk_add_trace(bt, 0, 0, 0, what, 0, sizeof(rpdu), &rpdu); + __blk_add_trace(bt, 0, 0, 0, 0, what, 0, sizeof(rpdu), &rpdu); } } @@ -874,8 +877,9 @@ static void blk_add_trace_split(void *ignore, __be64 rpdu = cpu_to_be64(pdu); __blk_add_trace(bt, bio->bi_iter.bi_sector, - bio->bi_iter.bi_size, bio->bi_rw, BLK_TA_SPLIT, - bio->bi_error, sizeof(rpdu), &rpdu); + bio->bi_iter.bi_size, bio->bi_op, bio->bi_rw, + BLK_TA_SPLIT, bio->bi_error, sizeof(rpdu), + &rpdu); } } @@ -907,7 +911,7 @@ static void blk_add_trace_bio_remap(void *ignore, r.sector_from = cpu_to_be64(from); __blk_add_trace(bt, bio->bi_iter.bi_sector, bio->bi_iter.bi_size, - bio->bi_rw, BLK_TA_REMAP, bio->bi_error, + bio->bi_op, bio->bi_rw, BLK_TA_REMAP, bio->bi_error, sizeof(r), &r); } @@ -940,7 +944,7 @@ static void blk_add_trace_rq_remap(void *ignore, r.sector_from = cpu_to_be64(from); __blk_add_trace(bt, blk_rq_pos(rq), blk_rq_bytes(rq), - rq_data_dir(rq), BLK_TA_REMAP, !!rq->errors, + rq_data_dir(rq), 0, BLK_TA_REMAP, !!rq->errors, sizeof(r), &r); } @@ -965,10 +969,10 @@ void blk_add_driver_data(struct request_queue *q, return; if (rq->cmd_type == REQ_TYPE_BLOCK_PC) - __blk_add_trace(bt, 0, blk_rq_bytes(rq), 0, + __blk_add_trace(bt, 0, blk_rq_bytes(rq), 0, 0, BLK_TA_DRV_DATA, rq->errors, len, data); else - __blk_add_trace(bt, blk_rq_pos(rq), blk_rq_bytes(rq), 0, + __blk_add_trace(bt, blk_rq_pos(rq), blk_rq_bytes(rq), 0, 0, BLK_TA_DRV_DATA, rq->errors, len, data); } EXPORT_SYMBOL_GPL(blk_add_driver_data); @@ -1767,16 +1771,16 @@ void blk_dump_cmd(char *buf, struct request *rq) } } -void blk_fill_rwbs(char *rwbs, u32 rw, int bytes) +void blk_fill_rwbs(char *rwbs, int op, u32 rw, int bytes) { int i = 0; if (rw & REQ_FLUSH) rwbs[i++] = 'F'; - if (rw & WRITE) + if (op == REQ_OP_WRITE) rwbs[i++] = 'W'; - else if (rw & REQ_DISCARD) + else if (op == REQ_OP_DISCARD) rwbs[i++] = 'D'; else if (bytes) rwbs[i++] = 'R'; -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:41:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AC36A7D45 for ; Fri, 15 Apr 2016 05:41:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6EAD430404E for ; Fri, 15 Apr 2016 03:41:34 -0700 (PDT) X-ASG-Debug-ID: 1460716893-04cbb02e1a2e9910001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DIvamJc2iqfkCWAQ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:41:33 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C537113A57; Fri, 15 Apr 2016 10:41:32 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe32O010243; Fri, 15 Apr 2016 06:41:30 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 38/42] block, fs: remove old REQ definitions. Date: Fri, 15 Apr 2016 05:39:58 -0500 X-ASG-Orig-Subj: [PATCH 38/42] block, fs: remove old REQ definitions. Message-Id: <1460716802-2294-39-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716893 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie We no longer use REQ_WRITE. REQ_WRITE_SAME and REQ_DISCARD, so this patch removes them. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- include/linux/blk_types.h | 21 ++++++--------------- include/linux/fs.h | 21 +++++++++++---------- include/trace/events/f2fs.h | 1 - 3 files changed, 17 insertions(+), 26 deletions(-) diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index 6e49c91..b4251ed 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -151,7 +151,6 @@ struct bio { */ enum rq_flag_bits { /* common flags */ - __REQ_WRITE, /* not set, read. set, write */ __REQ_FAILFAST_DEV, /* no driver retries of device errors */ __REQ_FAILFAST_TRANSPORT, /* no driver retries of transport errors */ __REQ_FAILFAST_DRIVER, /* no driver retries of driver errors */ @@ -159,9 +158,7 @@ enum rq_flag_bits { __REQ_SYNC, /* request is sync (sync write or read) */ __REQ_META, /* metadata io request */ __REQ_PRIO, /* boost priority in cfq */ - __REQ_DISCARD, /* request to discard sectors */ - __REQ_SECURE, /* secure discard (used with __REQ_DISCARD) */ - __REQ_WRITE_SAME, /* write same block many times */ + __REQ_SECURE, /* secure discard (used with REQ_OP_DISCARD) */ __REQ_NOIDLE, /* don't anticipate more IO after this one */ __REQ_INTEGRITY, /* I/O includes block integrity payload */ @@ -197,28 +194,22 @@ enum rq_flag_bits { __REQ_NR_BITS, /* stops here */ }; -#define REQ_WRITE (1ULL << __REQ_WRITE) #define REQ_FAILFAST_DEV (1ULL << __REQ_FAILFAST_DEV) #define REQ_FAILFAST_TRANSPORT (1ULL << __REQ_FAILFAST_TRANSPORT) #define REQ_FAILFAST_DRIVER (1ULL << __REQ_FAILFAST_DRIVER) #define REQ_SYNC (1ULL << __REQ_SYNC) #define REQ_META (1ULL << __REQ_META) #define REQ_PRIO (1ULL << __REQ_PRIO) -#define REQ_DISCARD (1ULL << __REQ_DISCARD) -#define REQ_WRITE_SAME (1ULL << __REQ_WRITE_SAME) #define REQ_NOIDLE (1ULL << __REQ_NOIDLE) #define REQ_INTEGRITY (1ULL << __REQ_INTEGRITY) #define REQ_FAILFAST_MASK \ (REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT | REQ_FAILFAST_DRIVER) #define REQ_COMMON_MASK \ - (REQ_WRITE | REQ_FAILFAST_MASK | REQ_SYNC | REQ_META | REQ_PRIO | \ - REQ_DISCARD | REQ_WRITE_SAME | REQ_NOIDLE | REQ_FLUSH | REQ_FUA | \ - REQ_SECURE | REQ_INTEGRITY) + (REQ_FAILFAST_MASK | REQ_SYNC | REQ_META | REQ_PRIO | REQ_NOIDLE | \ + REQ_FLUSH | REQ_FUA | REQ_SECURE | REQ_INTEGRITY) #define REQ_CLONE_MASK REQ_COMMON_MASK -#define BIO_NO_ADVANCE_ITER_MASK (REQ_DISCARD|REQ_WRITE_SAME) - /* This mask is used for both bio and request merge checking */ #define REQ_NOMERGE_FLAGS \ (REQ_NOMERGE | REQ_STARTED | REQ_SOFTBARRIER | REQ_FLUSH | REQ_FUA | REQ_FLUSH_SEQ) @@ -250,9 +241,9 @@ enum rq_flag_bits { enum req_op { REQ_OP_READ, - REQ_OP_WRITE = REQ_WRITE, - REQ_OP_DISCARD = REQ_DISCARD, - REQ_OP_WRITE_SAME = REQ_WRITE_SAME, + REQ_OP_WRITE, + REQ_OP_DISCARD, /* request to discard sectors */ + REQ_OP_WRITE_SAME, /* write same block many times */ }; typedef unsigned int blk_qc_t; diff --git a/include/linux/fs.h b/include/linux/fs.h index 9becf20..509e21f 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -153,9 +153,10 @@ typedef void (dax_iodone_t)(struct buffer_head *bh_map, int uptodate); #define CHECK_IOVEC_ONLY -1 /* - * The below are the various read and write types that we support. Some of + * The below are the various read and write flags that we support. Some of * them include behavioral modifiers that send information down to the - * block layer and IO scheduler. Terminology: + * block layer and IO scheduler. They should be used along with a req_op. + * Terminology: * * The block layer uses device plugging to defer IO a little bit, in * the hope that we will see more IO very shortly. This increases @@ -194,19 +195,19 @@ typedef void (dax_iodone_t)(struct buffer_head *bh_map, int uptodate); * non-volatile media on completion. * */ -#define RW_MASK REQ_WRITE +#define RW_MASK REQ_OP_WRITE #define RWA_MASK REQ_RAHEAD -#define READ 0 +#define READ REQ_OP_READ #define WRITE RW_MASK #define READA RWA_MASK -#define READ_SYNC (READ | REQ_SYNC) -#define WRITE_SYNC (WRITE | REQ_SYNC | REQ_NOIDLE) -#define WRITE_ODIRECT (WRITE | REQ_SYNC) -#define WRITE_FLUSH (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_FLUSH) -#define WRITE_FUA (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_FUA) -#define WRITE_FLUSH_FUA (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_FLUSH | REQ_FUA) +#define READ_SYNC REQ_SYNC +#define WRITE_SYNC (REQ_SYNC | REQ_NOIDLE) +#define WRITE_ODIRECT REQ_SYNC +#define WRITE_FLUSH (REQ_SYNC | REQ_NOIDLE | REQ_FLUSH) +#define WRITE_FUA (REQ_SYNC | REQ_NOIDLE | REQ_FUA) +#define WRITE_FLUSH_FUA (REQ_SYNC | REQ_NOIDLE | REQ_FLUSH | REQ_FUA) /* * Attribute flags. These should be or-ed together to figure out what diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h index db75d69..20f708e 100644 --- a/include/trace/events/f2fs.h +++ b/include/trace/events/f2fs.h @@ -31,7 +31,6 @@ TRACE_DEFINE_ENUM(BG_GC); TRACE_DEFINE_ENUM(LFS); TRACE_DEFINE_ENUM(SSR); TRACE_DEFINE_ENUM(__REQ_RAHEAD); -TRACE_DEFINE_ENUM(__REQ_WRITE); TRACE_DEFINE_ENUM(__REQ_SYNC); TRACE_DEFINE_ENUM(__REQ_NOIDLE); TRACE_DEFINE_ENUM(__REQ_FLUSH); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:41:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 43A457CE5 for ; Fri, 15 Apr 2016 05:41:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id CB01CAC003 for ; Fri, 15 Apr 2016 03:41:33 -0700 (PDT) X-ASG-Debug-ID: 1460716890-04bdf011045e4c50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id PCwHyVRCAKGHYskQ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:41:30 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 800B78553D; Fri, 15 Apr 2016 10:41:30 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe32N010243; Fri, 15 Apr 2016 06:41:28 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 37/42] block, fs, drivers: do use bi_rw/cmd_flags for REQ_OPs. Date: Fri, 15 Apr 2016 05:39:57 -0500 X-ASG-Orig-Subj: [PATCH 37/42] block, fs, drivers: do use bi_rw/cmd_flags for REQ_OPs. Message-Id: <1460716802-2294-38-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716890 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie We no longer use the bio->bi_rw and request->cmd_flags field for REQ_OPs: REQ_WRITE, REQ_DISCARD, REQ_WRITE_SAME, so this patch stops checking for them in bi_rw/cmd_flags and also removes the related compat code. v2: 1. Remove compat code in __get_request. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- block/bio.c | 6 ++--- block/blk-core.c | 34 ++++++++--------------------- block/blk-merge.c | 14 ++++++------ block/blk-mq.c | 3 +-- drivers/ata/libata-scsi.c | 2 +- drivers/block/brd.c | 2 +- drivers/block/drbd/drbd_main.c | 15 +++++++------ drivers/block/drbd/drbd_worker.c | 4 ++-- drivers/block/loop.c | 6 ++--- drivers/block/rbd.c | 2 +- drivers/block/rsxx/dma.c | 2 +- drivers/block/umem.c | 2 +- drivers/block/zram/zram_drv.c | 2 +- drivers/ide/ide-floppy.c | 2 +- drivers/lightnvm/rrpc.c | 2 +- drivers/md/bcache/request.c | 10 ++++----- drivers/md/dm-cache-target.c | 10 +++++---- drivers/md/dm-crypt.c | 2 +- drivers/md/dm-log-writes.c | 2 +- drivers/md/dm-raid1.c | 8 +++---- drivers/md/dm-region-hash.c | 4 ++-- drivers/md/dm-stripe.c | 4 ++-- drivers/md/dm-thin.c | 15 ++++++++----- drivers/md/dm.c | 6 ++--- drivers/md/linear.c | 2 +- drivers/md/raid0.c | 2 +- drivers/scsi/osd/osd_initiator.c | 4 ++-- drivers/staging/lustre/lustre/llite/lloop.c | 6 ++--- include/linux/bio.h | 15 ++++++++----- include/linux/fs.h | 25 +++++++-------------- 30 files changed, 99 insertions(+), 114 deletions(-) diff --git a/block/bio.c b/block/bio.c index 921de2e..bec5b54 100644 --- a/block/bio.c +++ b/block/bio.c @@ -675,10 +675,10 @@ struct bio *bio_clone_bioset(struct bio *bio_src, gfp_t gfp_mask, bio->bi_iter.bi_sector = bio_src->bi_iter.bi_sector; bio->bi_iter.bi_size = bio_src->bi_iter.bi_size; - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) goto integrity_clone; - if (bio->bi_rw & REQ_WRITE_SAME) { + if (bio->bi_op == REQ_OP_WRITE_SAME) { bio->bi_io_vec[bio->bi_vcnt++] = bio_src->bi_io_vec[0]; goto integrity_clone; } @@ -1797,7 +1797,7 @@ struct bio *bio_split(struct bio *bio, int sectors, * Discards need a mutable bio_vec to accommodate the payload * required by the DSM TRIM and UNMAP commands. */ - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) split = bio_clone_bioset(bio, gfp, bs); else split = bio_clone_fast(bio, gfp, bs); diff --git a/block/blk-core.c b/block/blk-core.c index e2f7b0a..ccf2056 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1151,8 +1151,7 @@ static struct request *__get_request(struct request_list *rl, int op, blk_rq_init(q, rq); blk_rq_set_rl(rq, rl); - /* tmp compat - allow users to check either one for the op */ - rq->cmd_flags = op | op_flags | REQ_ALLOCED; + rq->cmd_flags = op_flags | REQ_ALLOCED; rq->op = op; /* init elvpriv */ @@ -1705,8 +1704,7 @@ void init_request_from_bio(struct request *req, struct bio *bio) { req->cmd_type = REQ_TYPE_FS; - /* tmp compat. Allow users to set bi_op or bi_rw */ - req->cmd_flags |= (bio->bi_rw | bio->bi_op) & REQ_COMMON_MASK; + req->cmd_flags |= bio->bi_rw & REQ_COMMON_MASK; if (bio->bi_rw & REQ_RAHEAD) req->cmd_flags |= REQ_FAILFAST_MASK; @@ -1856,9 +1854,9 @@ static void handle_bad_sector(struct bio *bio) char b[BDEVNAME_SIZE]; printk(KERN_INFO "attempt to access beyond end of device\n"); - printk(KERN_INFO "%s: rw=%ld, want=%Lu, limit=%Lu\n", + printk(KERN_INFO "%s: rw=%d,%ld, want=%Lu, limit=%Lu\n", bdevname(bio->bi_bdev, b), - bio->bi_rw, + bio->bi_op, bio->bi_rw, (unsigned long long)bio_end_sector(bio), (long long)(i_size_read(bio->bi_bdev->bd_inode) >> 9)); } @@ -1980,14 +1978,14 @@ generic_make_request_checks(struct bio *bio) } } - if ((bio->bi_rw & REQ_DISCARD) && + if ((bio->bi_op == REQ_OP_DISCARD) && (!blk_queue_discard(q) || ((bio->bi_rw & REQ_SECURE) && !blk_queue_secdiscard(q)))) { err = -EOPNOTSUPP; goto end_io; } - if (bio->bi_rw & REQ_WRITE_SAME && !bdev_write_same(bio->bi_bdev)) { + if (bio->bi_op == REQ_OP_WRITE_SAME && !bdev_write_same(bio->bi_bdev)) { err = -EOPNOTSUPP; goto end_io; } @@ -2041,12 +2039,6 @@ blk_qc_t generic_make_request(struct bio *bio) struct bio_list bio_list_on_stack; blk_qc_t ret = BLK_QC_T_NONE; - /* tmp compat. Allow users to set either one or both. - * This will be removed when we have converted - * everyone in the next patches. - */ - bio->bi_rw |= bio->bi_op; - if (!generic_make_request_checks(bio)) goto out; @@ -2116,12 +2108,6 @@ EXPORT_SYMBOL(generic_make_request); */ blk_qc_t submit_bio(struct bio *bio) { - /* tmp compat. Allow users to set either one or both. - * This will be removed when we have converted - * everyone in the next patches. - */ - bio->bi_rw |= bio->bi_op; - /* * If it's a regular read/write or a barrier with data attached, * go through the normal accounting stuff before submission. @@ -2129,12 +2115,12 @@ blk_qc_t submit_bio(struct bio *bio) if (bio_has_data(bio)) { unsigned int count; - if (unlikely(bio->bi_rw & REQ_WRITE_SAME)) + if (unlikely(bio->bi_op == REQ_OP_WRITE_SAME)) count = bdev_logical_block_size(bio->bi_bdev) >> 9; else count = bio_sectors(bio); - if (bio->bi_rw & WRITE) { + if (op_is_write(bio->bi_op)) { count_vm_events(PGPGOUT, count); } else { task_io_account_read(bio->bi_iter.bi_size); @@ -2145,7 +2131,7 @@ blk_qc_t submit_bio(struct bio *bio) char b[BDEVNAME_SIZE]; printk(KERN_DEBUG "%s(%d): %s block %Lu on %s (%u sectors)\n", current->comm, task_pid_nr(current), - (bio->bi_rw & WRITE) ? "WRITE" : "READ", + op_is_write(bio->bi_op) ? "WRITE" : "READ", (unsigned long long)bio->bi_iter.bi_sector, bdevname(bio->bi_bdev, b), count); @@ -2995,8 +2981,6 @@ EXPORT_SYMBOL_GPL(__blk_end_request_err); void blk_rq_bio_prep(struct request_queue *q, struct request *rq, struct bio *bio) { - /* tmp compat. Allow users to set bi_op or bi_rw */ - rq->cmd_flags |= bio_data_dir(bio); rq->op = bio->bi_op; if (bio_has_data(bio)) diff --git a/block/blk-merge.c b/block/blk-merge.c index c02371f..31dc0c0 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -172,9 +172,9 @@ void blk_queue_split(struct request_queue *q, struct bio **bio, struct bio *split, *res; unsigned nsegs; - if ((*bio)->bi_rw & REQ_DISCARD) + if ((*bio)->bi_op == REQ_OP_DISCARD) split = blk_bio_discard_split(q, *bio, bs, &nsegs); - else if ((*bio)->bi_rw & REQ_WRITE_SAME) + else if ((*bio)->bi_op == REQ_OP_WRITE_SAME) split = blk_bio_write_same_split(q, *bio, bs, &nsegs); else split = blk_bio_segment_split(q, *bio, q->bio_split, &nsegs); @@ -213,10 +213,10 @@ static unsigned int __blk_recalc_rq_segments(struct request_queue *q, * This should probably be returning 0, but blk_add_request_payload() * (Christoph!!!!) */ - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) return 1; - if (bio->bi_rw & REQ_WRITE_SAME) + if (bio->bi_op == REQ_OP_WRITE_SAME) return 1; fbio = bio; @@ -385,7 +385,7 @@ static int __blk_bios_map_sg(struct request_queue *q, struct bio *bio, nsegs = 0; cluster = blk_queue_cluster(q); - if (bio->bi_rw & REQ_DISCARD) { + if (bio->bi_op == REQ_OP_DISCARD) { /* * This is a hack - drivers should be neither modifying the * biovec, nor relying on bi_vcnt - but because of @@ -400,7 +400,7 @@ static int __blk_bios_map_sg(struct request_queue *q, struct bio *bio, return 0; } - if (bio->bi_rw & REQ_WRITE_SAME) { + if (bio->bi_op == REQ_OP_WRITE_SAME) { single_segment: *sg = sglist; bvec = bio_iovec(bio); @@ -439,7 +439,7 @@ int blk_rq_map_sg(struct request_queue *q, struct request *rq, } if (q->dma_drain_size && q->dma_drain_needed(rq)) { - if (rq->cmd_flags & REQ_WRITE) + if (op_is_write(rq->op)) memset(q->dma_drain_buffer, 0, q->dma_drain_size); sg_unmark_end(sg); diff --git a/block/blk-mq.c b/block/blk-mq.c index 64d61be..840f57a 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -170,8 +170,7 @@ static void blk_mq_rq_ctx_init(struct request_queue *q, struct blk_mq_ctx *ctx, rq->q = q; rq->mq_ctx = ctx; rq->op = op; - /* tmp compat - allow users to check either one for the op */ - rq->cmd_flags |= op | op_flags; + rq->cmd_flags |= op_flags; /* do not touch atomic flags, it needs atomic ops against the timer */ rq->cpu = -1; INIT_HLIST_NODE(&rq->hash); diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index c7d0fc1..c6086c1 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c @@ -1184,7 +1184,7 @@ static int atapi_drain_needed(struct request *rq) if (likely(rq->cmd_type != REQ_TYPE_BLOCK_PC)) return 0; - if (!blk_rq_bytes(rq) || (rq->cmd_flags & REQ_WRITE)) + if (!blk_rq_bytes(rq) || op_is_write(rq->op)) return 0; return atapi_cmd_type(rq->cmd[0]) == ATAPI_MISC; diff --git a/drivers/block/brd.c b/drivers/block/brd.c index 51a071e..eaefb8c 100644 --- a/drivers/block/brd.c +++ b/drivers/block/brd.c @@ -339,7 +339,7 @@ static blk_qc_t brd_make_request(struct request_queue *q, struct bio *bio) if (bio_end_sector(bio) > get_capacity(bdev->bd_disk)) goto io_error; - if (unlikely(bio->bi_rw & REQ_DISCARD)) { + if (unlikely(bio->bi_op == REQ_OP_DISCARD)) { if (sector & ((PAGE_SIZE >> SECTOR_SHIFT) - 1) || bio->bi_iter.bi_size & ~PAGE_MASK) goto io_error; diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 30c93d6..ace906f 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c @@ -1603,15 +1603,16 @@ static int _drbd_send_zc_ee(struct drbd_peer_device *peer_device, return 0; } -static u32 bio_flags_to_wire(struct drbd_connection *connection, unsigned long bi_rw) +static u32 bio_flags_to_wire(struct drbd_connection *connection, + struct bio *bio) { if (connection->agreed_pro_version >= 95) - return (bi_rw & REQ_SYNC ? DP_RW_SYNC : 0) | - (bi_rw & REQ_FUA ? DP_FUA : 0) | - (bi_rw & REQ_FLUSH ? DP_FLUSH : 0) | - (bi_rw & REQ_DISCARD ? DP_DISCARD : 0); + return (bio->bi_rw & REQ_SYNC ? DP_RW_SYNC : 0) | + (bio->bi_rw & REQ_FUA ? DP_FUA : 0) | + (bio->bi_rw & REQ_FLUSH ? DP_FLUSH : 0) | + (bio->bi_op == REQ_OP_DISCARD ? DP_DISCARD : 0); else - return bi_rw & REQ_SYNC ? DP_RW_SYNC : 0; + return bio->bi_rw & REQ_SYNC ? DP_RW_SYNC : 0; } /* Used to send write or TRIM aka REQ_DISCARD requests @@ -1636,7 +1637,7 @@ int drbd_send_dblock(struct drbd_peer_device *peer_device, struct drbd_request * p->sector = cpu_to_be64(req->i.sector); p->block_id = (unsigned long)req; p->seq_num = cpu_to_be32(atomic_inc_return(&device->packet_seq)); - dp_flags = bio_flags_to_wire(peer_device->connection, req->master_bio->bi_rw); + dp_flags = bio_flags_to_wire(peer_device->connection, req->master_bio); if (device->state.conn >= C_SYNC_SOURCE && device->state.conn <= C_PAUSED_SYNC_T) dp_flags |= DP_MAY_SET_IN_SYNC; diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_worker.c index 2a04b43..0949961 100644 --- a/drivers/block/drbd/drbd_worker.c +++ b/drivers/block/drbd/drbd_worker.c @@ -174,7 +174,7 @@ void drbd_peer_request_endio(struct bio *bio) struct drbd_peer_request *peer_req = bio->bi_private; struct drbd_device *device = peer_req->peer_device->device; int is_write = bio_data_dir(bio) == WRITE; - int is_discard = !!(bio->bi_rw & REQ_DISCARD); + int is_discard = !!(bio->bi_op == REQ_OP_DISCARD); if (bio->bi_error && __ratelimit(&drbd_ratelimit_state)) drbd_warn(device, "%s: error=%d s=%llus\n", @@ -248,7 +248,7 @@ void drbd_request_endio(struct bio *bio) /* to avoid recursion in __req_mod */ if (unlikely(bio->bi_error)) { - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) what = (bio->bi_error == -EOPNOTSUPP) ? DISCARD_COMPLETED_NOTSUPP : DISCARD_COMPLETED_WITH_ERROR; diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 0e80c9b..f1f7a25 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -447,7 +447,7 @@ static int lo_req_flush(struct loop_device *lo, struct request *rq) static inline void handle_partial_read(struct loop_cmd *cmd, long bytes) { - if (bytes < 0 || (cmd->rq->cmd_flags & REQ_WRITE)) + if (bytes < 0 || op_is_write(cmd->rq->op)) return; if (unlikely(bytes < blk_rq_bytes(cmd->rq))) { @@ -535,7 +535,7 @@ static int do_req_filebacked(struct loop_device *lo, struct request *rq) pos = ((loff_t) blk_rq_pos(rq) << 9) + lo->lo_offset; - if (rq->cmd_flags & REQ_WRITE) { + if (op_is_write(rq->op)) { if (rq->cmd_flags & REQ_FLUSH) ret = lo_req_flush(lo, rq); else if (rq->op == REQ_OP_DISCARD) @@ -1666,7 +1666,7 @@ static int loop_queue_rq(struct blk_mq_hw_ctx *hctx, static void loop_handle_cmd(struct loop_cmd *cmd) { - const bool write = cmd->rq->cmd_flags & REQ_WRITE; + const bool write = op_is_write(cmd->rq->op); struct loop_device *lo = cmd->rq->q->queuedata; int ret = 0; diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index e8935af..4c0c057 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -3373,7 +3373,7 @@ static void rbd_queue_workfn(struct work_struct *work) if (rq->op == REQ_OP_DISCARD) op_type = OBJ_OP_DISCARD; - else if (rq->cmd_flags & REQ_WRITE) + else if (rq->op == REQ_OP_WRITE) op_type = OBJ_OP_WRITE; else op_type = OBJ_OP_READ; diff --git a/drivers/block/rsxx/dma.c b/drivers/block/rsxx/dma.c index cf8cd29..dfc189e 100644 --- a/drivers/block/rsxx/dma.c +++ b/drivers/block/rsxx/dma.c @@ -705,7 +705,7 @@ int rsxx_dma_queue_bio(struct rsxx_cardinfo *card, dma_cnt[i] = 0; } - if (bio->bi_rw & REQ_DISCARD) { + if (bio->bi_op == REQ_OP_DISCARD) { bv_len = bio->bi_iter.bi_size; while (bv_len > 0) { diff --git a/drivers/block/umem.c b/drivers/block/umem.c index 7939b9f..a24ccbc 100644 --- a/drivers/block/umem.c +++ b/drivers/block/umem.c @@ -462,7 +462,7 @@ static void process_page(unsigned long data) le32_to_cpu(desc->local_addr)>>9, le32_to_cpu(desc->transfer_size)); dump_dmastat(card, control); - } else if ((bio->bi_rw & REQ_WRITE) && + } else if (op_is_write(bio->bi_op) && le32_to_cpu(desc->local_addr) >> 9 == card->init_size) { card->init_size += le32_to_cpu(desc->transfer_size) >> 9; diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 370c2f7..3c7ef31 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -849,7 +849,7 @@ static void __zram_make_request(struct zram *zram, struct bio *bio) offset = (bio->bi_iter.bi_sector & (SECTORS_PER_PAGE - 1)) << SECTOR_SHIFT; - if (unlikely(bio->bi_rw & REQ_DISCARD)) { + if (unlikely(bio->bi_op == REQ_OP_DISCARD)) { zram_bio_discard(zram, index, offset, bio); bio_endio(bio); return; diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index 2fb5350..f079d8d 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c @@ -206,7 +206,7 @@ static void idefloppy_create_rw_cmd(ide_drive_t *drive, memcpy(rq->cmd, pc->c, 12); pc->rq = rq; - if (rq->cmd_flags & REQ_WRITE) + if (cmd == WRITE) pc->flags |= PC_FLAG_WRITING; pc->flags |= PC_FLAG_DMA_OK; diff --git a/drivers/lightnvm/rrpc.c b/drivers/lightnvm/rrpc.c index fd9b629..9b1a74e 100644 --- a/drivers/lightnvm/rrpc.c +++ b/drivers/lightnvm/rrpc.c @@ -911,7 +911,7 @@ static blk_qc_t rrpc_make_rq(struct request_queue *q, struct bio *bio) struct nvm_rq *rqd; int err; - if (bio->bi_rw & REQ_DISCARD) { + if (bio->bi_op == REQ_OP_DISCARD) { rrpc_discard(rrpc, bio); return BLK_QC_T_NONE; } diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c index cd6837c..be8cd63f 100644 --- a/drivers/md/bcache/request.c +++ b/drivers/md/bcache/request.c @@ -378,7 +378,7 @@ static bool check_should_bypass(struct cached_dev *dc, struct bio *bio) if (test_bit(BCACHE_DEV_DETACHING, &dc->disk.flags) || c->gc_stats.in_use > CUTOFF_CACHE_ADD || - (bio->bi_rw & REQ_DISCARD)) + (bio->bi_op == REQ_OP_DISCARD)) goto skip; if (mode == CACHE_MODE_NONE || @@ -899,7 +899,7 @@ static void cached_dev_write(struct cached_dev *dc, struct search *s) * But check_overlapping drops dirty keys for which io hasn't started, * so we still want to call it. */ - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) s->iop.bypass = true; if (should_writeback(dc, s->orig_bio, @@ -913,7 +913,7 @@ static void cached_dev_write(struct cached_dev *dc, struct search *s) s->iop.bio = s->orig_bio; bio_get(s->iop.bio); - if (!(bio->bi_rw & REQ_DISCARD) || + if (!(bio->bi_op == REQ_OP_DISCARD) || blk_queue_discard(bdev_get_queue(dc->bdev))) closure_bio_submit(bio, cl); } else if (s->iop.writeback) { @@ -993,7 +993,7 @@ static blk_qc_t cached_dev_make_request(struct request_queue *q, cached_dev_read(dc, s); } } else { - if ((bio->bi_rw & REQ_DISCARD) && + if ((bio->bi_op == REQ_OP_DISCARD) && !blk_queue_discard(bdev_get_queue(dc->bdev))) bio_endio(bio); else @@ -1104,7 +1104,7 @@ static blk_qc_t flash_dev_make_request(struct request_queue *q, &KEY(d->id, bio->bi_iter.bi_sector, 0), &KEY(d->id, bio_end_sector(bio), 0)); - s->iop.bypass = (bio->bi_rw & REQ_DISCARD) != 0; + s->iop.bypass = (bio->bi_op == REQ_OP_DISCARD) != 0; s->iop.writeback = true; s->iop.bio = bio; diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c index ee0510f..838f784 100644 --- a/drivers/md/dm-cache-target.c +++ b/drivers/md/dm-cache-target.c @@ -788,7 +788,8 @@ static void check_if_tick_bio_needed(struct cache *cache, struct bio *bio) spin_lock_irqsave(&cache->lock, flags); if (cache->need_tick_bio && - !(bio->bi_rw & (REQ_FUA | REQ_FLUSH | REQ_DISCARD))) { + !(bio->bi_rw & (REQ_FUA | REQ_FLUSH)) && + bio->bi_op != REQ_OP_DISCARD) { pb->tick = true; cache->need_tick_bio = false; } @@ -851,7 +852,7 @@ static void inc_ds(struct cache *cache, struct bio *bio, static bool accountable_bio(struct cache *cache, struct bio *bio) { return ((bio->bi_bdev == cache->origin_dev->bdev) && - !(bio->bi_rw & REQ_DISCARD)); + bio->bi_op != REQ_OP_DISCARD); } static void accounted_begin(struct cache *cache, struct bio *bio) @@ -1067,7 +1068,8 @@ static void dec_io_migrations(struct cache *cache) static bool discard_or_flush(struct bio *bio) { - return bio->bi_rw & (REQ_FLUSH | REQ_FUA | REQ_DISCARD); + return bio->bi_op == REQ_OP_DISCARD || + bio->bi_rw & (REQ_FLUSH | REQ_FUA); } static void __cell_defer(struct cache *cache, struct dm_bio_prison_cell *cell) @@ -1980,7 +1982,7 @@ static void process_deferred_bios(struct cache *cache) if (bio->bi_rw & REQ_FLUSH) process_flush_bio(cache, bio); - else if (bio->bi_rw & REQ_DISCARD) + else if (bio->bi_op == REQ_OP_DISCARD) process_discard_bio(cache, &structs, bio); else process_bio(cache, &structs, bio); diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index 70fbf11..3a4ddad 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c @@ -1916,7 +1916,7 @@ static int crypt_map(struct dm_target *ti, struct bio *bio) * - for REQ_FLUSH device-mapper core ensures that no IO is in-flight * - for REQ_DISCARD caller must use flush if IO ordering matters */ - if (unlikely(bio->bi_rw & (REQ_FLUSH | REQ_DISCARD))) { + if (unlikely(bio->bi_rw & REQ_FLUSH || bio->bi_op == REQ_OP_DISCARD)) { bio->bi_bdev = cc->dev->bdev; if (bio_sectors(bio)) bio->bi_iter.bi_sector = cc->start + diff --git a/drivers/md/dm-log-writes.c b/drivers/md/dm-log-writes.c index 27630c5..e991405 100644 --- a/drivers/md/dm-log-writes.c +++ b/drivers/md/dm-log-writes.c @@ -557,7 +557,7 @@ static int log_writes_map(struct dm_target *ti, struct bio *bio) int i = 0; bool flush_bio = (bio->bi_rw & REQ_FLUSH); bool fua_bio = (bio->bi_rw & REQ_FUA); - bool discard_bio = (bio->bi_rw & REQ_DISCARD); + bool discard_bio = (bio->bi_op == REQ_OP_DISCARD); pb->block = NULL; diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c index 8a86bc3..c4d23da 100644 --- a/drivers/md/dm-raid1.c +++ b/drivers/md/dm-raid1.c @@ -626,7 +626,7 @@ static void write_callback(unsigned long error, void *context) * If the bio is discard, return an error, but do not * degrade the array. */ - if (bio->bi_rw & REQ_DISCARD) { + if (bio->bi_op == REQ_OP_DISCARD) { bio->bi_error = -EOPNOTSUPP; bio_endio(bio); return; @@ -665,7 +665,7 @@ static void do_write(struct mirror_set *ms, struct bio *bio) .client = ms->io_client, }; - if (bio->bi_rw & REQ_DISCARD) { + if (bio->bi_op == REQ_OP_DISCARD) { io_req.bi_op = REQ_OP_DISCARD; io_req.mem.type = DM_IO_KMEM; io_req.mem.ptr.addr = NULL; @@ -705,7 +705,7 @@ static void do_writes(struct mirror_set *ms, struct bio_list *writes) while ((bio = bio_list_pop(writes))) { if ((bio->bi_rw & REQ_FLUSH) || - (bio->bi_rw & REQ_DISCARD)) { + (bio->bi_op == REQ_OP_DISCARD)) { bio_list_add(&sync, bio); continue; } @@ -1253,7 +1253,7 @@ static int mirror_end_io(struct dm_target *ti, struct bio *bio, int error) * We need to dec pending if this was a write. */ if (rw == WRITE) { - if (!(bio->bi_rw & (REQ_FLUSH | REQ_DISCARD))) + if (!(bio->bi_rw & REQ_FLUSH) && bio->bi_op != REQ_OP_DISCARD) dm_rh_dec(ms->rh, bio_record->write_region); return error; } diff --git a/drivers/md/dm-region-hash.c b/drivers/md/dm-region-hash.c index 74cb7b9..ce4af57 100644 --- a/drivers/md/dm-region-hash.c +++ b/drivers/md/dm-region-hash.c @@ -403,7 +403,7 @@ void dm_rh_mark_nosync(struct dm_region_hash *rh, struct bio *bio) return; } - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) return; /* We must inform the log that the sync count has changed. */ @@ -526,7 +526,7 @@ void dm_rh_inc_pending(struct dm_region_hash *rh, struct bio_list *bios) struct bio *bio; for (bio = bios->head; bio; bio = bio->bi_next) { - if (bio->bi_rw & (REQ_FLUSH | REQ_DISCARD)) + if (bio->bi_rw & REQ_FLUSH || bio->bi_op == REQ_OP_DISCARD) continue; rh_inc(rh, dm_rh_bio_to_region(rh, bio)); } diff --git a/drivers/md/dm-stripe.c b/drivers/md/dm-stripe.c index 797ddb9..12b1630 100644 --- a/drivers/md/dm-stripe.c +++ b/drivers/md/dm-stripe.c @@ -292,8 +292,8 @@ static int stripe_map(struct dm_target *ti, struct bio *bio) bio->bi_bdev = sc->stripe[target_bio_nr].dev->bdev; return DM_MAPIO_REMAPPED; } - if (unlikely(bio->bi_rw & REQ_DISCARD) || - unlikely(bio->bi_rw & REQ_WRITE_SAME)) { + if (unlikely(bio->bi_op == REQ_OP_DISCARD) || + unlikely(bio->bi_op == REQ_OP_WRITE_SAME)) { target_bio_nr = dm_bio_get_target_bio_nr(bio); BUG_ON(target_bio_nr >= sc->stripes); return stripe_map_range(sc, bio, target_bio_nr); diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index 6049078..85688b7 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c @@ -715,7 +715,7 @@ static void inc_all_io_entry(struct pool *pool, struct bio *bio) { struct dm_thin_endio_hook *h; - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) return; h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook)); @@ -878,7 +878,8 @@ static void __inc_remap_and_issue_cell(void *context, struct bio *bio; while ((bio = bio_list_pop(&cell->bios))) { - if (bio->bi_rw & (REQ_DISCARD | REQ_FLUSH | REQ_FUA)) + if (bio->bi_rw & (REQ_FLUSH | REQ_FUA) || + bio->bi_op == REQ_OP_DISCARD) bio_list_add(&info->defer_bios, bio); else { inc_all_io_entry(info->tc->pool, bio); @@ -1656,7 +1657,8 @@ static void __remap_and_issue_shared_cell(void *context, while ((bio = bio_list_pop(&cell->bios))) { if ((bio_data_dir(bio) == WRITE) || - (bio->bi_rw & (REQ_DISCARD | REQ_FLUSH | REQ_FUA))) + (bio->bi_rw & (REQ_FLUSH | REQ_FUA) || + bio->bi_op == REQ_OP_DISCARD)) bio_list_add(&info->defer_bios, bio); else { struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook));; @@ -2045,7 +2047,7 @@ static void process_thin_deferred_bios(struct thin_c *tc) break; } - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) pool->process_discard(tc, bio); else pool->process_bio(tc, bio); @@ -2132,7 +2134,7 @@ static void process_thin_deferred_cells(struct thin_c *tc) return; } - if (cell->holder->bi_rw & REQ_DISCARD) + if (cell->holder->bi_op == REQ_OP_DISCARD) pool->process_discard_cell(tc, cell); else pool->process_cell(tc, cell); @@ -2570,7 +2572,8 @@ static int thin_bio_map(struct dm_target *ti, struct bio *bio) return DM_MAPIO_SUBMITTED; } - if (bio->bi_rw & (REQ_DISCARD | REQ_FLUSH | REQ_FUA)) { + if (bio->bi_rw & (REQ_FLUSH | REQ_FUA) || + bio->bi_op == REQ_OP_DISCARD) { thin_defer_bio_with_throttle(tc, bio); return DM_MAPIO_SUBMITTED; } diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 13c869c..4ee7d5c 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -1053,7 +1053,7 @@ static void clone_endio(struct bio *bio) } } - if (unlikely(r == -EREMOTEIO && (bio->bi_rw & REQ_WRITE_SAME) && + if (unlikely(r == -EREMOTEIO && (bio->bi_op == REQ_OP_WRITE_SAME) && !bdev_get_queue(bio->bi_bdev)->limits.max_write_same_sectors)) disable_write_same(md); @@ -1748,9 +1748,9 @@ static int __split_and_process_non_flush(struct clone_info *ci) unsigned len; int r; - if (unlikely(bio->bi_rw & REQ_DISCARD)) + if (unlikely(bio->bi_op == REQ_OP_DISCARD)) return __send_discard(ci); - else if (unlikely(bio->bi_rw & REQ_WRITE_SAME)) + else if (unlikely(bio->bi_op == REQ_OP_WRITE_SAME)) return __send_write_same(ci); ti = dm_table_find_target(ci->map, ci->sector); diff --git a/drivers/md/linear.c b/drivers/md/linear.c index b7fe7e9..aad82c7 100644 --- a/drivers/md/linear.c +++ b/drivers/md/linear.c @@ -252,7 +252,7 @@ static void linear_make_request(struct mddev *mddev, struct bio *bio) split->bi_iter.bi_sector = split->bi_iter.bi_sector - start_sector + data_offset; - if (unlikely((split->bi_rw & REQ_DISCARD) && + if (unlikely((split->bi_op == REQ_OP_DISCARD) && !blk_queue_discard(bdev_get_queue(split->bi_bdev)))) { /* Just ignore it */ bio_endio(split); diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index f63dbb6..58ff1ff 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c @@ -489,7 +489,7 @@ static void raid0_make_request(struct mddev *mddev, struct bio *bio) split->bi_iter.bi_sector = sector + zone->dev_start + tmp_dev->data_offset; - if (unlikely((split->bi_rw & REQ_DISCARD) && + if (unlikely((split->bi_op == REQ_OP_DISCARD) && !blk_queue_discard(bdev_get_queue(split->bi_bdev)))) { /* Just ignore it */ bio_endio(split); diff --git a/drivers/scsi/osd/osd_initiator.c b/drivers/scsi/osd/osd_initiator.c index edcba56..f6572e6 100644 --- a/drivers/scsi/osd/osd_initiator.c +++ b/drivers/scsi/osd/osd_initiator.c @@ -824,7 +824,7 @@ void osd_req_write(struct osd_request *or, { _osd_req_encode_common(or, OSD_ACT_WRITE, obj, offset, len); WARN_ON(or->out.bio || or->out.total_bytes); - WARN_ON(0 == (bio->bi_rw & REQ_WRITE)); + WARN_ON(!op_is_write(bio->bi_op)); or->out.bio = bio; or->out.total_bytes = len; } @@ -875,7 +875,7 @@ void osd_req_read(struct osd_request *or, { _osd_req_encode_common(or, OSD_ACT_READ, obj, offset, len); WARN_ON(or->in.bio || or->in.total_bytes); - WARN_ON(bio->bi_rw & REQ_WRITE); + WARN_ON(op_is_write(bio->bi_op)); or->in.bio = bio; or->in.total_bytes = len; } diff --git a/drivers/staging/lustre/lustre/llite/lloop.c b/drivers/staging/lustre/lustre/llite/lloop.c index f169c0d..e602389 100644 --- a/drivers/staging/lustre/lustre/llite/lloop.c +++ b/drivers/staging/lustre/lustre/llite/lloop.c @@ -211,9 +211,9 @@ static int do_bio_lustrebacked(struct lloop_device *lo, struct bio *head) return io->ci_result; io->ci_lockreq = CILR_NEVER; - rw = head->bi_rw; + rw = bio_data_dir(head); for (bio = head; bio ; bio = bio->bi_next) { - LASSERT(rw == bio->bi_rw); + LASSERT(rw == bio_data_dir(bio)); offset = (pgoff_t)(bio->bi_iter.bi_sector << 9) + lo->lo_offset; bio_for_each_segment(bvec, bio, iter) { @@ -304,7 +304,7 @@ static unsigned int loop_get_bio(struct lloop_device *lo, struct bio **req) /* TODO: need to split the bio, too bad. */ LASSERT(first->bi_vcnt <= LLOOP_MAX_SEGMENTS); - rw = first->bi_rw; + rw = bio_data_dir(first); bio = &lo->lo_bio; while (*bio && (*bio)->bi_rw == rw) { CDEBUG(D_INFO, "bio sector %llu size %u count %u vcnt%u\n", diff --git a/include/linux/bio.h b/include/linux/bio.h index 4724810..9e7b18b 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -106,18 +106,23 @@ static inline bool bio_has_data(struct bio *bio) { if (bio && bio->bi_iter.bi_size && - !(bio->bi_rw & REQ_DISCARD)) + !(bio->bi_op == REQ_OP_DISCARD)) return true; return false; } +static inline bool bio_no_advance_iter(struct bio *bio) +{ + return bio->bi_op == REQ_OP_DISCARD || bio->bi_op == REQ_OP_WRITE_SAME; +} + static inline bool bio_is_rw(struct bio *bio) { if (!bio_has_data(bio)) return false; - if (bio->bi_rw & BIO_NO_ADVANCE_ITER_MASK) + if (bio_no_advance_iter(bio)) return false; return true; @@ -225,7 +230,7 @@ static inline void bio_advance_iter(struct bio *bio, struct bvec_iter *iter, { iter->bi_sector += bytes >> 9; - if (bio->bi_rw & BIO_NO_ADVANCE_ITER_MASK) + if (bio_no_advance_iter(bio)) iter->bi_size -= bytes; else bvec_iter_advance(bio->bi_io_vec, iter, bytes); @@ -253,10 +258,10 @@ static inline unsigned bio_segments(struct bio *bio) * differently: */ - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) return 1; - if (bio->bi_rw & REQ_WRITE_SAME) + if (bio->bi_op == REQ_OP_WRITE_SAME) return 1; bio_for_each_segment(bv, bio, iter) diff --git a/include/linux/fs.h b/include/linux/fs.h index f3f2f66..9becf20 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2466,33 +2466,24 @@ static inline bool op_is_write(int op) } /* - * return READ, READA, or WRITE + * return data direction, READ or WRITE */ -static inline int bio_rw(struct bio *bio) +static inline int bio_data_dir(struct bio *bio) { - /* - * tmp cpmpat. Allow users to set either op or rw, until - * all code is converted in the next patches. - */ if (op_is_write(bio->bi_op)) return WRITE; - - return bio->bi_rw & (RW_MASK | RWA_MASK); + return READ; } /* - * return data direction, READ or WRITE + * return READ, READA, or WRITE */ -static inline int bio_data_dir(struct bio *bio) +static inline int bio_rw(struct bio *bio) { - /* - * tmp cpmpat. Allow users to set either op or rw, until - * all code is converted in the next patches. - */ - if (op_is_write(bio->bi_op)) - return WRITE; + if (bio->bi_rw & RWA_MASK) + return READA; - return bio->bi_rw & 1; + return bio_data_dir(bio); } extern void check_disk_size_change(struct gendisk *disk, -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:41:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0941C7CA2 for ; Fri, 15 Apr 2016 05:41:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CCB5E8F8040 for ; Fri, 15 Apr 2016 03:41:36 -0700 (PDT) X-ASG-Debug-ID: 1460716895-04cbb02e1c2e9950001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 7bkOzvutKfyaVt8r (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:41:35 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0AD5BC0467ED; Fri, 15 Apr 2016 10:41:35 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe32P010243; Fri, 15 Apr 2016 06:41:32 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 39/42] block: shrink bio/request fields Date: Fri, 15 Apr 2016 05:39:59 -0500 X-ASG-Orig-Subj: [PATCH 39/42] block: shrink bio/request fields Message-Id: <1460716802-2294-40-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716895 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie bi_op only needed to be a int for temp compat reasons, so this patch shrinks it to u8. There is no need for bi_rw to be so large now, so that is reduced to a unsigned int and bi_ioprio is just put in its own field. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- block/blk-core.c | 2 +- drivers/md/dm-flakey.c | 2 +- drivers/md/raid5.c | 13 +++++++------ fs/btrfs/check-integrity.c | 4 ++-- fs/btrfs/inode.c | 2 +- include/linux/bio.h | 13 ++----------- include/linux/blk_types.h | 11 +++-------- include/linux/blkdev.h | 2 +- 8 files changed, 18 insertions(+), 31 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index ccf2056..57d21a0 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1854,7 +1854,7 @@ static void handle_bad_sector(struct bio *bio) char b[BDEVNAME_SIZE]; printk(KERN_INFO "attempt to access beyond end of device\n"); - printk(KERN_INFO "%s: rw=%d,%ld, want=%Lu, limit=%Lu\n", + printk(KERN_INFO "%s: rw=%d,%u, want=%Lu, limit=%Lu\n", bdevname(bio->bi_bdev, b), bio->bi_op, bio->bi_rw, (unsigned long long)bio_end_sector(bio), diff --git a/drivers/md/dm-flakey.c b/drivers/md/dm-flakey.c index b7341de..29b99fb 100644 --- a/drivers/md/dm-flakey.c +++ b/drivers/md/dm-flakey.c @@ -266,7 +266,7 @@ static void corrupt_bio_data(struct bio *bio, struct flakey_c *fc) data[fc->corrupt_bio_byte - 1] = fc->corrupt_bio_value; DMDEBUG("Corrupting data bio=%p by writing %u to byte %u " - "(rw=%c bi_rw=%lu bi_sector=%llu cur_bytes=%u)\n", + "(rw=%c bi_rw=%u bi_sector=%llu cur_bytes=%u)\n", bio, fc->corrupt_bio_value, fc->corrupt_bio_byte, (bio_data_dir(bio) == WRITE) ? 'w' : 'r', bio->bi_rw, (unsigned long long)bio->bi_iter.bi_sector, bio_bytes); diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index c36b817..7fb693f 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -1006,9 +1006,9 @@ again: : raid5_end_read_request; bi->bi_private = sh; - pr_debug("%s: for %llu schedule op %ld on disc %d\n", + pr_debug("%s: for %llu schedule op %d,%u on disc %d\n", __func__, (unsigned long long)sh->sector, - bi->bi_rw, i); + bi->bi_op, bi->bi_rw, i); atomic_inc(&sh->count); if (sh != head_sh) atomic_inc(&head_sh->count); @@ -1058,10 +1058,10 @@ again: rbi->bi_end_io = raid5_end_write_request; rbi->bi_private = sh; - pr_debug("%s: for %llu schedule op %ld on " + pr_debug("%s: for %llu schedule op %d,%u on " "replacement disc %d\n", __func__, (unsigned long long)sh->sector, - rbi->bi_rw, i); + rbi->bi_op, rbi->bi_rw, i); atomic_inc(&sh->count); if (sh != head_sh) atomic_inc(&head_sh->count); @@ -1093,8 +1093,9 @@ again: if (!rdev && !rrdev) { if (op_is_write(op)) set_bit(STRIPE_DEGRADED, &sh->state); - pr_debug("skip op %ld on disc %d for sector %llu\n", - bi->bi_rw, i, (unsigned long long)sh->sector); + pr_debug("skip op %d,%u on disc %d for sector %llu\n", + bi->bi_op, bi->bi_rw, i, + (unsigned long long)sh->sector); clear_bit(R5_LOCKED, &sh->dev[i].flags); set_bit(STRIPE_HANDLE, &sh->state); } diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index c4a48e8..921a858 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c @@ -2943,7 +2943,7 @@ static void __btrfsic_submit_bio(struct bio *bio) if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) printk(KERN_INFO - "submit_bio(rw=%d,0x%lx, bi_vcnt=%u," + "submit_bio(rw=%d,0x%x, bi_vcnt=%u," " bi_sector=%llu (bytenr %llu), bi_bdev=%p)\n", bio->bi_op, bio->bi_rw, bio->bi_vcnt, (unsigned long long)bio->bi_iter.bi_sector, @@ -2986,7 +2986,7 @@ static void __btrfsic_submit_bio(struct bio *bio) if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) printk(KERN_INFO - "submit_bio(rw=%d,0x%lx FLUSH, bdev=%p)\n", + "submit_bio(rw=%d,0x%x FLUSH, bdev=%p)\n", bio->bi_op, bio->bi_rw, bio->bi_bdev); if (!dev_state->dummy_block_for_bio_bh_flush.is_iodone) { if ((dev_state->state->print_mask & diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index bd214ab..e2617ba 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -8153,7 +8153,7 @@ static void btrfs_end_dio_bio(struct bio *bio) if (err) btrfs_warn(BTRFS_I(dip->inode)->root->fs_info, - "direct IO failed ino %llu rw %d,%lu sector %#Lx len %u err no %d", + "direct IO failed ino %llu rw %d,0x%x sector %#Lx len %u err no %d", btrfs_ino(dip->inode), bio->bi_op, bio->bi_rw, (unsigned long long)bio->bi_iter.bi_sector, bio->bi_iter.bi_size, err); diff --git a/include/linux/bio.h b/include/linux/bio.h index 9e7b18b..5ece950 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -44,18 +44,9 @@ #define BIO_MAX_SIZE (BIO_MAX_PAGES << PAGE_SHIFT) #define BIO_MAX_SECTORS (BIO_MAX_SIZE >> 9) -/* - * upper 16 bits of bi_rw define the io priority of this bio - */ -#define BIO_PRIO_SHIFT (8 * sizeof(unsigned long) - IOPRIO_BITS) -#define bio_prio(bio) ((bio)->bi_rw >> BIO_PRIO_SHIFT) +#define bio_prio(bio) (bio)->bi_ioprio #define bio_prio_valid(bio) ioprio_valid(bio_prio(bio)) - -#define bio_set_prio(bio, prio) do { \ - WARN_ON(prio >= (1 << IOPRIO_BITS)); \ - (bio)->bi_rw &= ((1UL << BIO_PRIO_SHIFT) - 1); \ - (bio)->bi_rw |= ((unsigned long) (prio) << BIO_PRIO_SHIFT); \ -} while (0) +#define bio_set_prio(bio, prio) ((bio)->bi_ioprio = prio) /* * various member access, note that bio_data should of course not be used diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index b4251ed..498f395 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -48,14 +48,9 @@ struct bio { struct block_device *bi_bdev; unsigned int bi_flags; /* status, command, etc */ int bi_error; - unsigned long bi_rw; /* bottom bits rq_flags_bits - * top bits priority - */ - /* - * this will be a u8 in the next patches and bi_rw can be shrunk to - * a u32. For compat in these transistional patches op is a int here. - */ - int bi_op; /* REQ_OP */ + unsigned int bi_rw; /* rq_flag_bits */ + unsigned short bi_ioprio; + u8 bi_op; /* REQ_OP */ struct bvec_iter bi_iter; diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 5694894..b483a66 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -96,7 +96,7 @@ struct request { struct request_queue *q; struct blk_mq_ctx *mq_ctx; - int op; + u8 op; u64 cmd_flags; unsigned cmd_type; unsigned long atomic_flags; -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:41:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9670E7D6A for ; Fri, 15 Apr 2016 05:41:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 68AA48F8040 for ; Fri, 15 Apr 2016 03:41:41 -0700 (PDT) X-ASG-Debug-ID: 1460716899-04cbb02e1b2e99b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id jDUJ4IYeDUweTSup (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:41:40 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 96F5CA78A; Fri, 15 Apr 2016 10:41:39 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe32R010243; Fri, 15 Apr 2016 06:41:37 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 41/42] block: do not use REQ_FLUSH for tracking flush support Date: Fri, 15 Apr 2016 05:40:01 -0500 X-ASG-Orig-Subj: [PATCH 41/42] block: do not use REQ_FLUSH for tracking flush support Message-Id: <1460716802-2294-42-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716900 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie The last patch added a REQ_OP_FLUSH for request_fn drivers and the next patch renames REQ_FLUSH to REQ_PREFLUSH which will be used by file systems and make_request_fn drivers so they can send a write/flush combo. This patch drops xen's use of REQ_FLUSH to track if it supports REQ_OP_FLUSH requests, so REQ_FLUSH can be deleted. v6: - Dropped parts of patch handled by Jens's QUEUE_FLAG_WC/FUA patches and modified patch to check feature_flush/fua bits. Signed-off-by: Mike Christie Reviewed-by: Hannes Reinecke --- drivers/block/xen-blkfront.c | 47 ++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index f01691a..d6429e7 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c @@ -196,6 +196,7 @@ struct blkfront_info unsigned int nr_ring_pages; struct request_queue *rq; unsigned int feature_flush; + unsigned int feature_fua; unsigned int feature_discard:1; unsigned int feature_secdiscard:1; unsigned int discard_granularity; @@ -763,19 +764,14 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri * implement it the same way. (It's also a FLUSH+FUA, * since it is guaranteed ordered WRT previous writes.) */ - switch (info->feature_flush & - ((REQ_FLUSH|REQ_FUA))) { - case REQ_FLUSH|REQ_FUA: + if (info->feature_flush && info->feature_fua) ring_req->operation = BLKIF_OP_WRITE_BARRIER; - break; - case REQ_FLUSH: + else if (info->feature_flush) ring_req->operation = BLKIF_OP_FLUSH_DISKCACHE; - break; - default: + else ring_req->operation = 0; - } } ring_req->u.rw.nr_segments = num_grant; if (unlikely(require_extra_req)) { @@ -866,9 +862,9 @@ static inline bool blkif_request_flush_invalid(struct request *req, { return ((req->cmd_type != REQ_TYPE_FS) || ((req->op == REQ_OP_FLUSH) && - !(info->feature_flush & REQ_FLUSH)) || + !info->feature_flush) || ((req->cmd_flags & REQ_FUA) && - !(info->feature_flush & REQ_FUA))); + !info->feature_fua)); } static int blkif_queue_rq(struct blk_mq_hw_ctx *hctx, @@ -985,24 +981,22 @@ static int xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size, return 0; } -static const char *flush_info(unsigned int feature_flush) +static const char *flush_info(struct blkfront_info *info) { - switch (feature_flush & ((REQ_FLUSH | REQ_FUA))) { - case REQ_FLUSH|REQ_FUA: + if (info->feature_flush && info->feature_fua) return "barrier: enabled;"; - case REQ_FLUSH: + else if (info->feature_fua) return "flush diskcache: enabled;"; - default: + else return "barrier or flush: disabled;"; - } } static void xlvbd_flush(struct blkfront_info *info) { - blk_queue_write_cache(info->rq, info->feature_flush & REQ_FLUSH, - info->feature_flush & REQ_FUA); + blk_queue_write_cache(info->rq, info->feature_flush ? true : false, + info->feature_flush ? true : false); pr_info("blkfront: %s: %s %s %s %s %s\n", - info->gd->disk_name, flush_info(info->feature_flush), + info->gd->disk_name, flush_info(info), "persistent grants:", info->feature_persistent ? "enabled;" : "disabled;", "indirect descriptors:", info->max_indirect_segments ? "enabled;" : "disabled;"); @@ -1621,6 +1615,7 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id) if (unlikely(error)) { if (error == -EOPNOTSUPP) error = 0; + info->feature_fua = 0; info->feature_flush = 0; xlvbd_flush(info); } @@ -2315,6 +2310,7 @@ static void blkfront_gather_backend_features(struct blkfront_info *info) unsigned int indirect_segments; info->feature_flush = 0; + info->feature_fua = 0; err = xenbus_gather(XBT_NIL, info->xbdev->otherend, "feature-barrier", "%d", &barrier, @@ -2327,8 +2323,11 @@ static void blkfront_gather_backend_features(struct blkfront_info *info) * * If there are barriers, then we use flush. */ - if (!err && barrier) - info->feature_flush = REQ_FLUSH | REQ_FUA; + if (!err && barrier) { + info->feature_flush = 1; + info->feature_fua = 1; + } + /* * And if there is "feature-flush-cache" use that above * barriers. @@ -2337,8 +2336,10 @@ static void blkfront_gather_backend_features(struct blkfront_info *info) "feature-flush-cache", "%d", &flush, NULL); - if (!err && flush) - info->feature_flush = REQ_FLUSH; + if (!err && flush) { + info->feature_flush = 1; + info->feature_fua = 0; + } err = xenbus_gather(XBT_NIL, info->xbdev->otherend, "feature-discard", "%d", &discard, -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:41:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 573967D52 for ; Fri, 15 Apr 2016 05:41:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id F40B08F8049 for ; Fri, 15 Apr 2016 03:41:42 -0700 (PDT) X-ASG-Debug-ID: 1460716897-04bdf011025e4c70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id XVcRNjGauxtntZZl (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:41:37 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 52CE57F6CF; Fri, 15 Apr 2016 10:41:37 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe32Q010243; Fri, 15 Apr 2016 06:41:35 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 40/42] block, drivers: add REQ_OP_FLUSH operation Date: Fri, 15 Apr 2016 05:40:00 -0500 X-ASG-Orig-Subj: [PATCH 40/42] block, drivers: add REQ_OP_FLUSH operation Message-Id: <1460716802-2294-41-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716897 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This adds a REQ_OP_FLUSH operation that is sent to request_fn based drivers by the block layer's flush code, instead of sending requests with the request->cmd_flags REQ_FLUSH bit set. For the following 3 flush related patches, I have not tested every driver. I have only tested scsi with xfs and btrfs. v2. 1. Fix kbuild failures. Forgot to update ubd driver. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- Documentation/block/writeback_cache_control.txt | 6 +++--- arch/um/drivers/ubd_kern.c | 2 +- block/blk-flush.c | 3 ++- drivers/block/loop.c | 4 ++-- drivers/block/nbd.c | 2 +- drivers/block/osdblk.c | 2 +- drivers/block/ps3disk.c | 4 ++-- drivers/block/skd_main.c | 2 +- drivers/block/virtio_blk.c | 2 +- drivers/block/xen-blkfront.c | 8 ++++---- drivers/ide/ide-disk.c | 2 +- drivers/md/dm.c | 2 +- drivers/mmc/card/block.c | 5 ++--- drivers/mmc/card/queue.h | 2 +- drivers/mtd/mtd_blkdevs.c | 2 +- drivers/nvme/host/core.c | 2 +- drivers/scsi/sd.c | 7 +++---- include/linux/blk_types.h | 1 + include/linux/blkdev.h | 3 +++ kernel/trace/blktrace.c | 5 ++++- 20 files changed, 36 insertions(+), 30 deletions(-) diff --git a/Documentation/block/writeback_cache_control.txt b/Documentation/block/writeback_cache_control.txt index 59e0516..da70bda 100644 --- a/Documentation/block/writeback_cache_control.txt +++ b/Documentation/block/writeback_cache_control.txt @@ -73,9 +73,9 @@ doing: blk_queue_write_cache(sdkp->disk->queue, true, false); -and handle empty REQ_FLUSH requests in its prep_fn/request_fn. Note that +and handle empty REQ_OP_FLUSH requests in its prep_fn/request_fn. Note that REQ_FLUSH requests with a payload are automatically turned into a sequence -of an empty REQ_FLUSH request followed by the actual write by the block +of an empty REQ_OP_FLUSH request followed by the actual write by the block layer. For devices that also support the FUA bit the block layer needs to be told to pass through the REQ_FUA bit using: @@ -83,4 +83,4 @@ to be told to pass through the REQ_FUA bit using: and the driver must handle write requests that have the REQ_FUA bit set in prep_fn/request_fn. If the FUA bit is not natively supported the block -layer turns it into an empty REQ_FLUSH request after the actual write. +layer turns it into an empty REQ_OP_FLUSH request after the actual write. diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c index 17e96dc..0cb2dab 100644 --- a/arch/um/drivers/ubd_kern.c +++ b/arch/um/drivers/ubd_kern.c @@ -1286,7 +1286,7 @@ static void do_ubd_request(struct request_queue *q) req = dev->request; - if (req->cmd_flags & REQ_FLUSH) { + if (req->op == REQ_OP_FLUSH) { io_req = kmalloc(sizeof(struct io_thread_req), GFP_ATOMIC); if (io_req == NULL) { diff --git a/block/blk-flush.c b/block/blk-flush.c index 6611bcb..a499af7 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c @@ -29,7 +29,7 @@ * The actual execution of flush is double buffered. Whenever a request * needs to execute PRE or POSTFLUSH, it queues at * fq->flush_queue[fq->flush_pending_idx]. Once certain criteria are met, a - * flush is issued and the pending_idx is toggled. When the flush + * REQ_OP_FLUSH is issued and the pending_idx is toggled. When the flush * completes, all the requests which were pending are proceeded to the next * step. This allows arbitrary merging of different types of FLUSH/FUA * requests. @@ -331,6 +331,7 @@ static bool blk_kick_flush(struct request_queue *q, struct blk_flush_queue *fq) flush_rq->cmd_type = REQ_TYPE_FS; flush_rq->cmd_flags = WRITE_FLUSH | REQ_FLUSH_SEQ; + flush_rq->op = REQ_OP_FLUSH; flush_rq->rq_disk = first_rq->rq_disk; flush_rq->end_io = flush_end_io; diff --git a/drivers/block/loop.c b/drivers/block/loop.c index f1f7a25..7d7d7a4f 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -536,7 +536,7 @@ static int do_req_filebacked(struct loop_device *lo, struct request *rq) pos = ((loff_t) blk_rq_pos(rq) << 9) + lo->lo_offset; if (op_is_write(rq->op)) { - if (rq->cmd_flags & REQ_FLUSH) + if (rq->op == REQ_OP_FLUSH) ret = lo_req_flush(lo, rq); else if (rq->op == REQ_OP_DISCARD) ret = lo_discard(lo, rq, pos); @@ -1653,7 +1653,7 @@ static int loop_queue_rq(struct blk_mq_hw_ctx *hctx, if (lo->lo_state != Lo_bound) return -EIO; - if (lo->use_dio && (!(cmd->rq->cmd_flags & REQ_FLUSH) || + if (lo->use_dio && (cmd->rq->op != REQ_OP_FLUSH || cmd->rq->op == REQ_OP_DISCARD)) cmd->use_aio = true; else diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 68a1476..4e9fd5b 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -284,7 +284,7 @@ static int nbd_send_req(struct nbd_device *nbd, struct request *req) type = NBD_CMD_DISC; else if (req->op == REQ_OP_DISCARD) type = NBD_CMD_TRIM; - else if (req->cmd_flags & REQ_FLUSH) + else if (req->op == REQ_OP_FLUSH) type = NBD_CMD_FLUSH; else if (rq_data_dir(req) == WRITE) type = NBD_CMD_WRITE; diff --git a/drivers/block/osdblk.c b/drivers/block/osdblk.c index c2854a2..806e3a3 100644 --- a/drivers/block/osdblk.c +++ b/drivers/block/osdblk.c @@ -321,7 +321,7 @@ static void osdblk_rq_fn(struct request_queue *q) * driver-specific, etc. */ - do_flush = rq->cmd_flags & REQ_FLUSH; + do_flush = (rq->op == REQ_OP_FLUSH); do_write = (rq_data_dir(rq) == WRITE); if (!do_flush) { /* osd_flush does not use a bio */ diff --git a/drivers/block/ps3disk.c b/drivers/block/ps3disk.c index 4b7e405..2e652db 100644 --- a/drivers/block/ps3disk.c +++ b/drivers/block/ps3disk.c @@ -196,7 +196,7 @@ static void ps3disk_do_request(struct ps3_storage_device *dev, dev_dbg(&dev->sbd.core, "%s:%u\n", __func__, __LINE__); while ((req = blk_fetch_request(q))) { - if (req->cmd_flags & REQ_FLUSH) { + if (req->op == REQ_OP_FLUSH) { if (ps3disk_submit_flush_request(dev, req)) break; } else if (req->cmd_type == REQ_TYPE_FS) { @@ -256,7 +256,7 @@ static irqreturn_t ps3disk_interrupt(int irq, void *data) return IRQ_HANDLED; } - if (req->cmd_flags & REQ_FLUSH) { + if (req->op == REQ_OP_FLUSH) { read = 0; op = "flush"; } else { diff --git a/drivers/block/skd_main.c b/drivers/block/skd_main.c index 5739223..01c3cd3 100644 --- a/drivers/block/skd_main.c +++ b/drivers/block/skd_main.c @@ -624,7 +624,7 @@ static void skd_request_fn(struct request_queue *q) count = blk_rq_sectors(req); data_dir = rq_data_dir(req); - if (req->cmd_flags & REQ_FLUSH) + if (req->op == REQ_OP_FLUSH) flush++; if (req->cmd_flags & REQ_FUA) diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index 42758b5..7e1d041 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c @@ -172,7 +172,7 @@ static int virtio_queue_rq(struct blk_mq_hw_ctx *hctx, BUG_ON(req->nr_phys_segments + 2 > vblk->sg_elems); vbr->req = req; - if (req->cmd_flags & REQ_FLUSH) { + if (req->op == REQ_OP_FLUSH) { vbr->out_hdr.type = cpu_to_virtio32(vblk->vdev, VIRTIO_BLK_T_FLUSH); vbr->out_hdr.sector = 0; vbr->out_hdr.ioprio = cpu_to_virtio32(vblk->vdev, req_get_ioprio(vbr->req)); diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index dc08d4d..f01691a 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c @@ -743,7 +743,7 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri * The indirect operation can only be a BLKIF_OP_READ or * BLKIF_OP_WRITE */ - BUG_ON(req->cmd_flags & (REQ_FLUSH | REQ_FUA)); + BUG_ON(req->op == REQ_OP_FLUSH || req->cmd_flags & REQ_FUA); ring_req->operation = BLKIF_OP_INDIRECT; ring_req->u.indirect.indirect_op = rq_data_dir(req) ? BLKIF_OP_WRITE : BLKIF_OP_READ; @@ -755,7 +755,7 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri ring_req->u.rw.handle = info->handle; ring_req->operation = rq_data_dir(req) ? BLKIF_OP_WRITE : BLKIF_OP_READ; - if (req->cmd_flags & (REQ_FLUSH | REQ_FUA)) { + if (req->op == REQ_OP_FLUSH || req->cmd_flags & REQ_FUA) { /* * Ideally we can do an unordered flush-to-disk. * In case the backend onlysupports barriers, use that. @@ -865,7 +865,7 @@ static inline bool blkif_request_flush_invalid(struct request *req, struct blkfront_info *info) { return ((req->cmd_type != REQ_TYPE_FS) || - ((req->cmd_flags & REQ_FLUSH) && + ((req->op == REQ_OP_FLUSH) && !(info->feature_flush & REQ_FLUSH)) || ((req->cmd_flags & REQ_FUA) && !(info->feature_flush & REQ_FUA))); @@ -2055,7 +2055,7 @@ static int blkif_recover(struct blkfront_info *info) /* * Get the bios in the request so we can re-queue them. */ - if (copy[i].request->cmd_flags & REQ_FLUSH || + if (copy[i].request->op == REQ_OP_FLUSH || copy[i].request->op == REQ_OP_DISCARD || copy[i].request->cmd_flags & (REQ_FUA | REQ_SECURE)) { /* diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 05dbcce..538c343 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c @@ -431,7 +431,7 @@ static int idedisk_prep_fn(struct request_queue *q, struct request *rq) ide_drive_t *drive = q->queuedata; struct ide_cmd *cmd; - if (!(rq->cmd_flags & REQ_FLUSH)) + if (rq->op != REQ_OP_FLUSH) return BLKPREP_OK; if (rq->special) { diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 4ee7d5c..bd852bc 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -2171,7 +2171,7 @@ static void dm_request_fn(struct request_queue *q) /* always use block 0 to find the target for flushes for now */ pos = 0; - if (!(rq->cmd_flags & REQ_FLUSH)) + if (rq->op != REQ_OP_FLUSH) pos = blk_rq_pos(rq); if ((dm_request_peeked_before_merge_deadline(md) && diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 8fa3982..25dd331 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -1696,7 +1696,7 @@ static u8 mmc_blk_prep_packed_list(struct mmc_queue *mq, struct request *req) !IS_ALIGNED(blk_rq_sectors(next), 8)) break; - if (next->op == REQ_OP_DISCARD || next->cmd_flags & REQ_FLUSH) + if (next->op == REQ_OP_DISCARD || next->op == REQ_OP_FLUSH) break; if (rq_data_dir(cur) != rq_data_dir(next)) @@ -2121,7 +2121,6 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) struct mmc_card *card = md->queue.card; struct mmc_host *host = card->host; unsigned long flags; - unsigned int cmd_flags = req ? req->cmd_flags : 0; if (req && !mq->mqrq_prev->req) /* claim host only for the first request */ @@ -2145,7 +2144,7 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) ret = mmc_blk_issue_secdiscard_rq(mq, req); else ret = mmc_blk_issue_discard_rq(mq, req); - } else if (cmd_flags & REQ_FLUSH) { + } else if (req && req->op == REQ_OP_FLUSH) { /* complete ongoing async transfer before issuing flush */ if (card->host->areq) mmc_blk_issue_rw_rq(mq, NULL); diff --git a/drivers/mmc/card/queue.h b/drivers/mmc/card/queue.h index f166e5b..6c67e4e 100644 --- a/drivers/mmc/card/queue.h +++ b/drivers/mmc/card/queue.h @@ -3,7 +3,7 @@ static inline bool mmc_req_is_special(struct request *req) { - return req && (req->cmd_flags & REQ_FLUSH || req->op == REQ_OP_DISCARD); + return req && (req->op == REQ_OP_FLUSH || req->op == REQ_OP_DISCARD); } struct request; diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c index e8b0263..688e689 100644 --- a/drivers/mtd/mtd_blkdevs.c +++ b/drivers/mtd/mtd_blkdevs.c @@ -87,7 +87,7 @@ static int do_blktrans_request(struct mtd_blktrans_ops *tr, if (req->cmd_type != REQ_TYPE_FS) return -EIO; - if (req->cmd_flags & REQ_FLUSH) + if (req->op == REQ_OP_FLUSH) return tr->flush(dev); if (blk_rq_pos(req) + blk_rq_cur_sectors(req) > diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index b741aed..7055675 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -232,7 +232,7 @@ int nvme_setup_cmd(struct nvme_ns *ns, struct request *req, if (req->cmd_type == REQ_TYPE_DRV_PRIV) memcpy(cmd, req->cmd, sizeof(*cmd)); - else if (req->cmd_flags & REQ_FLUSH) + else if (req->op == REQ_OP_FLUSH) nvme_setup_flush(ns, cmd); else if (req->op == REQ_OP_DISCARD) ret = nvme_setup_discard(ns, req, cmd); diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 2fc7191..5fe24e6 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1143,12 +1143,11 @@ static int sd_init_command(struct scsi_cmnd *cmd) return sd_setup_discard_cmnd(cmd); case REQ_OP_WRITE_SAME: return sd_setup_write_same_cmnd(cmd); + case REQ_OP_FLUSH: + return sd_setup_flush_cmnd(cmd); case REQ_OP_READ: case REQ_OP_WRITE: - if (rq->cmd_flags & REQ_FLUSH) - return sd_setup_flush_cmnd(cmd); - else - return sd_setup_read_write_cmnd(cmd); + return sd_setup_read_write_cmnd(cmd); default: BUG(); } diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index 498f395..f9e53ca 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -239,6 +239,7 @@ enum req_op { REQ_OP_WRITE, REQ_OP_DISCARD, /* request to discard sectors */ REQ_OP_WRITE_SAME, /* write same block many times */ + REQ_OP_FLUSH, /* request for cache flush */ }; typedef unsigned int blk_qc_t; diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index b483a66..2164e23 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -653,6 +653,9 @@ static inline bool rq_mergeable(struct request *rq) if (rq->cmd_type != REQ_TYPE_FS) return false; + if (rq->op == REQ_OP_FLUSH) + return false; + if (rq->cmd_flags & REQ_NOMERGE_FLAGS) return false; diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index 6a381ea..192d714 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c @@ -223,6 +223,8 @@ static void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes, what |= MASK_TC_BIT(op_flags, FUA); if (op == REQ_OP_DISCARD) what |= BLK_TC_ACT(BLK_TC_DISCARD); + if (op == REQ_OP_FLUSH) + what |= BLK_TC_ACT(BLK_TC_FLUSH); pid = tsk->pid; if (act_log_check(bt, what, sector, pid)) @@ -1775,7 +1777,8 @@ void blk_fill_rwbs(char *rwbs, int op, u32 rw, int bytes) { int i = 0; - if (rw & REQ_FLUSH) + if (rw & REQ_FLUSH || + op == REQ_OP_FLUSH) rwbs[i++] = 'F'; if (op == REQ_OP_WRITE) -- 2.7.2 From mchristi@redhat.com Fri Apr 15 05:41:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 307957D73 for ; Fri, 15 Apr 2016 05:41:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id AD8FE8F8049 for ; Fri, 15 Apr 2016 03:41:45 -0700 (PDT) X-ASG-Debug-ID: 1460716902-04bdf011055e4ca0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id snKFyGtR5ODTUnho (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:41:42 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E077D1112; Fri, 15 Apr 2016 10:41:41 +0000 (UTC) Received: from rh2.redhat.com (vpn-48-158.rdu2.redhat.com [10.10.48.158]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FAe32S010243; Fri, 15 Apr 2016 06:41:39 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 42/42] block, drivers, fs: rename REQ_FLUSH to REQ_PREFLUSH Date: Fri, 15 Apr 2016 05:40:02 -0500 X-ASG-Orig-Subj: [PATCH 42/42] block, drivers, fs: rename REQ_FLUSH to REQ_PREFLUSH Message-Id: <1460716802-2294-43-git-send-email-mchristi@redhat.com> In-Reply-To: <1460716802-2294-1-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@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: 1460716902 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie To avoid confusion between REQ_OP_FLUSH, which is handled by request_fn drivers, and upper layers requesting the block layer perform a flush sequence along with possibly a WRITE, this patch renames REQ_FLUSH to REQ_PREFLUSH. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- Documentation/block/writeback_cache_control.txt | 22 +++++++++++----------- Documentation/device-mapper/log-writes.txt | 10 +++++----- block/blk-core.c | 12 ++++++------ block/blk-flush.c | 16 ++++++++-------- block/blk-mq.c | 4 ++-- drivers/block/drbd/drbd_actlog.c | 4 ++-- drivers/block/drbd/drbd_main.c | 2 +- drivers/block/drbd/drbd_protocol.h | 2 +- drivers/block/drbd/drbd_receiver.c | 2 +- drivers/block/drbd/drbd_req.c | 2 +- drivers/md/bcache/journal.c | 2 +- drivers/md/bcache/request.c | 8 ++++---- drivers/md/dm-cache-target.c | 12 ++++++------ drivers/md/dm-crypt.c | 7 ++++--- drivers/md/dm-era-target.c | 4 ++-- drivers/md/dm-io.c | 2 +- drivers/md/dm-log-writes.c | 2 +- drivers/md/dm-raid1.c | 5 +++-- drivers/md/dm-region-hash.c | 4 ++-- drivers/md/dm-snap.c | 6 +++--- drivers/md/dm-stripe.c | 2 +- drivers/md/dm-thin.c | 8 ++++---- drivers/md/dm.c | 12 ++++++------ drivers/md/linear.c | 2 +- drivers/md/md.c | 2 +- drivers/md/md.h | 2 +- drivers/md/multipath.c | 2 +- drivers/md/raid0.c | 2 +- drivers/md/raid1.c | 3 ++- drivers/md/raid10.c | 2 +- drivers/md/raid5-cache.c | 2 +- drivers/md/raid5.c | 2 +- fs/btrfs/check-integrity.c | 8 ++++---- fs/jbd2/journal.c | 2 +- fs/xfs/xfs_buf.c | 2 +- include/linux/blk_types.h | 8 ++++---- include/linux/fs.h | 4 ++-- include/trace/events/f2fs.h | 2 +- kernel/trace/blktrace.c | 5 +++-- 39 files changed, 102 insertions(+), 98 deletions(-) diff --git a/Documentation/block/writeback_cache_control.txt b/Documentation/block/writeback_cache_control.txt index da70bda..8a6bdad 100644 --- a/Documentation/block/writeback_cache_control.txt +++ b/Documentation/block/writeback_cache_control.txt @@ -20,11 +20,11 @@ a forced cache flush, and the Force Unit Access (FUA) flag for requests. Explicit cache flushes ---------------------- -The REQ_FLUSH flag can be OR ed into the r/w flags of a bio submitted from +The REQ_PREFLUSH flag can be OR ed into the r/w flags of a bio submitted from the filesystem and will make sure the volatile cache of the storage device has been flushed before the actual I/O operation is started. This explicitly guarantees that previously completed write requests are on non-volatile -storage before the flagged bio starts. In addition the REQ_FLUSH flag can be +storage before the flagged bio starts. In addition the REQ_PREFLUSH flag can be set on an otherwise empty bio structure, which causes only an explicit cache flush without any dependent I/O. It is recommend to use the blkdev_issue_flush() helper for a pure cache flush. @@ -41,21 +41,21 @@ signaled after the data has been committed to non-volatile storage. Implementation details for filesystems -------------------------------------- -Filesystems can simply set the REQ_FLUSH and REQ_FUA bits and do not have to +Filesystems can simply set the REQ_PREFLUSH and REQ_FUA bits and do not have to worry if the underlying devices need any explicit cache flushing and how -the Forced Unit Access is implemented. The REQ_FLUSH and REQ_FUA flags +the Forced Unit Access is implemented. The REQ_PREFLUSH and REQ_FUA flags may both be set on a single bio. Implementation details for make_request_fn based block drivers -------------------------------------------------------------- -These drivers will always see the REQ_FLUSH and REQ_FUA bits as they sit +These drivers will always see the REQ_PREFLUSH and REQ_FUA bits as they sit directly below the submit_bio interface. For remapping drivers the REQ_FUA bits need to be propagated to underlying devices, and a global flush needs -to be implemented for bios with the REQ_FLUSH bit set. For real device -drivers that do not have a volatile cache the REQ_FLUSH and REQ_FUA bits -on non-empty bios can simply be ignored, and REQ_FLUSH requests without +to be implemented for bios with the REQ_PREFLUSH bit set. For real device +drivers that do not have a volatile cache the REQ_PREFLUSH and REQ_FUA bits +on non-empty bios can simply be ignored, and REQ_PREFLUSH requests without data can be completed successfully without doing any work. Drivers for devices with volatile caches need to implement the support for these flags themselves without any help from the block layer. @@ -65,8 +65,8 @@ Implementation details for request_fn based block drivers -------------------------------------------------------------- For devices that do not support volatile write caches there is no driver -support required, the block layer completes empty REQ_FLUSH requests before -entering the driver and strips off the REQ_FLUSH and REQ_FUA bits from +support required, the block layer completes empty REQ_PREFLUSH requests before +entering the driver and strips off the REQ_PREFLUSH and REQ_FUA bits from requests that have a payload. For devices with volatile write caches the driver needs to tell the block layer that it supports flushing caches by doing: @@ -74,7 +74,7 @@ doing: blk_queue_write_cache(sdkp->disk->queue, true, false); and handle empty REQ_OP_FLUSH requests in its prep_fn/request_fn. Note that -REQ_FLUSH requests with a payload are automatically turned into a sequence +REQ_PREFLUSH requests with a payload are automatically turned into a sequence of an empty REQ_OP_FLUSH request followed by the actual write by the block layer. For devices that also support the FUA bit the block layer needs to be told to pass through the REQ_FUA bit using: diff --git a/Documentation/device-mapper/log-writes.txt b/Documentation/device-mapper/log-writes.txt index c10f30c..f4ebcba 100644 --- a/Documentation/device-mapper/log-writes.txt +++ b/Documentation/device-mapper/log-writes.txt @@ -14,14 +14,14 @@ Log Ordering We log things in order of completion once we are sure the write is no longer in cache. This means that normal WRITE requests are not actually logged until the -next REQ_FLUSH request. This is to make it easier for userspace to replay the -log in a way that correlates to what is on disk and not what is in cache, to -make it easier to detect improper waiting/flushing. +next REQ_PREFLUSH request. This is to make it easier for userspace to replay +the log in a way that correlates to what is on disk and not what is in cache, +to make it easier to detect improper waiting/flushing. This works by attaching all WRITE requests to a list once the write completes. -Once we see a REQ_FLUSH request we splice this list onto the request and once +Once we see a REQ_PREFLUSH request we splice this list onto the request and once the FLUSH request completes we log all of the WRITEs and then the FLUSH. Only -completed WRITEs, at the time the REQ_FLUSH is issued, are added in order to +completed WRITEs, at the time the REQ_PREFLUSH is issued, are added in order to simulate the worst case scenario with regard to power failures. Consider the following example (W means write, C means complete): diff --git a/block/blk-core.c b/block/blk-core.c index 57d21a0..486f805 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1029,7 +1029,7 @@ static bool blk_rq_should_init_elevator(struct bio *bio) * Flush requests do not use the elevator so skip initialization. * This allows a request to share the flush and elevator data. */ - if (bio->bi_rw & (REQ_FLUSH | REQ_FUA)) + if (bio->bi_rw & (REQ_PREFLUSH | REQ_FUA)) return false; return true; @@ -1737,7 +1737,7 @@ static blk_qc_t blk_queue_bio(struct request_queue *q, struct bio *bio) return BLK_QC_T_NONE; } - if (bio->bi_rw & (REQ_FLUSH | REQ_FUA)) { + if (bio->bi_rw & (REQ_PREFLUSH | REQ_FUA)) { spin_lock_irq(q->queue_lock); where = ELEVATOR_INSERT_FLUSH; goto get_rq; @@ -1969,9 +1969,9 @@ generic_make_request_checks(struct bio *bio) * drivers without flush support don't have to worry * about them. */ - if ((bio->bi_rw & (REQ_FLUSH | REQ_FUA)) && + if ((bio->bi_rw & (REQ_PREFLUSH | REQ_FUA)) && !test_bit(QUEUE_FLAG_WC, &q->queue_flags)) { - bio->bi_rw &= ~(REQ_FLUSH | REQ_FUA); + bio->bi_rw &= ~(REQ_PREFLUSH | REQ_FUA); if (!nr_sectors) { err = 0; goto end_io; @@ -2218,7 +2218,7 @@ int blk_insert_cloned_request(struct request_queue *q, struct request *rq) */ BUG_ON(blk_queued_rq(rq)); - if (rq->cmd_flags & (REQ_FLUSH|REQ_FUA)) + if (rq->cmd_flags & (REQ_PREFLUSH | REQ_FUA)) where = ELEVATOR_INSERT_FLUSH; add_acct_request(q, rq, where); @@ -3312,7 +3312,7 @@ void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule) /* * rq is already accounted, so use raw insert */ - if (rq->cmd_flags & (REQ_FLUSH | REQ_FUA)) + if (rq->cmd_flags & (REQ_PREFLUSH | REQ_FUA)) __elv_add_request(q, rq, ELEVATOR_INSERT_FLUSH); else __elv_add_request(q, rq, ELEVATOR_INSERT_SORT_MERGE); diff --git a/block/blk-flush.c b/block/blk-flush.c index a499af7..75a8a58 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c @@ -10,8 +10,8 @@ * optional steps - PREFLUSH, DATA and POSTFLUSH - according to the request * properties and hardware capability. * - * If a request doesn't have data, only REQ_FLUSH makes sense, which - * indicates a simple flush request. If there is data, REQ_FLUSH indicates + * If a request doesn't have data, only REQ_PREFLUSH makes sense, which + * indicates a simple flush request. If there is data, REQ_PREFLUSH indicates * that the device cache should be flushed before the data is executed, and * REQ_FUA means that the data must be on non-volatile media on request * completion. @@ -20,11 +20,11 @@ * difference. The requests are either completed immediately if there's no * data or executed as normal requests otherwise. * - * If the device has writeback cache and supports FUA, REQ_FLUSH is + * If the device has writeback cache and supports FUA, REQ_PREFLUSH is * translated to PREFLUSH but REQ_FUA is passed down directly with DATA. * - * If the device has writeback cache and doesn't support FUA, REQ_FLUSH is - * translated to PREFLUSH and REQ_FUA to POSTFLUSH. + * If the device has writeback cache and doesn't support FUA, REQ_PREFLUSH + * is translated to PREFLUSH and REQ_FUA to POSTFLUSH. * * The actual execution of flush is double buffered. Whenever a request * needs to execute PRE or POSTFLUSH, it queues at @@ -103,7 +103,7 @@ static unsigned int blk_flush_policy(unsigned long fflags, struct request *rq) policy |= REQ_FSEQ_DATA; if (fflags & (1UL << QUEUE_FLAG_WC)) { - if (rq->cmd_flags & REQ_FLUSH) + if (rq->cmd_flags & REQ_PREFLUSH) policy |= REQ_FSEQ_PREFLUSH; if (!(fflags & (1UL << QUEUE_FLAG_FUA)) && (rq->cmd_flags & REQ_FUA)) @@ -392,9 +392,9 @@ void blk_insert_flush(struct request *rq) /* * @policy now records what operations need to be done. Adjust - * REQ_FLUSH and FUA for the driver. + * REQ_PREFLUSH and FUA for the driver. */ - rq->cmd_flags &= ~REQ_FLUSH; + rq->cmd_flags &= ~REQ_PREFLUSH; if (!(fflags & (1UL << QUEUE_FLAG_FUA))) rq->cmd_flags &= ~REQ_FUA; diff --git a/block/blk-mq.c b/block/blk-mq.c index 840f57a..6b0c98d 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -1249,7 +1249,7 @@ static int blk_mq_direct_issue_request(struct request *rq, blk_qc_t *cookie) static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio) { const int is_sync = rw_is_sync(bio->bi_op, bio->bi_rw); - const int is_flush_fua = bio->bi_rw & (REQ_FLUSH | REQ_FUA); + const int is_flush_fua = bio->bi_rw & (REQ_PREFLUSH | REQ_FUA); struct blk_map_ctx data; struct request *rq; unsigned int request_count = 0; @@ -1346,7 +1346,7 @@ done: static blk_qc_t blk_sq_make_request(struct request_queue *q, struct bio *bio) { const int is_sync = rw_is_sync(bio->bi_op, bio->bi_rw); - const int is_flush_fua = bio->bi_rw & (REQ_FLUSH | REQ_FUA); + const int is_flush_fua = bio->bi_rw & (REQ_PREFLUSH | REQ_FUA); struct blk_plug *plug; unsigned int request_count = 0; struct blk_map_ctx data; diff --git a/drivers/block/drbd/drbd_actlog.c b/drivers/block/drbd/drbd_actlog.c index 2fa8534..b12ff76 100644 --- a/drivers/block/drbd/drbd_actlog.c +++ b/drivers/block/drbd/drbd_actlog.c @@ -148,7 +148,7 @@ static int _drbd_md_sync_page_io(struct drbd_device *device, device->md_io.error = -ENODEV; if ((op == REQ_OP_WRITE) && !test_bit(MD_NO_FUA, &device->flags)) - op_flags |= REQ_FUA | REQ_FLUSH; + op_flags |= REQ_FUA | REQ_PREFLUSH; op_flags |= REQ_SYNC | REQ_NOIDLE; bio = bio_alloc_drbd(GFP_NOIO); @@ -848,7 +848,7 @@ int __drbd_change_sync(struct drbd_device *device, sector_t sector, int size, unsigned long count = 0; sector_t esector, nr_sectors; - /* This would be an empty REQ_FLUSH, be silent. */ + /* This would be an empty REQ_PREFLUSH, be silent. */ if ((mode == SET_OUT_OF_SYNC) && size == 0) return 0; diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index ace906f..7936e0e 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c @@ -1609,7 +1609,7 @@ static u32 bio_flags_to_wire(struct drbd_connection *connection, if (connection->agreed_pro_version >= 95) return (bio->bi_rw & REQ_SYNC ? DP_RW_SYNC : 0) | (bio->bi_rw & REQ_FUA ? DP_FUA : 0) | - (bio->bi_rw & REQ_FLUSH ? DP_FLUSH : 0) | + (bio->bi_rw & REQ_PREFLUSH ? DP_FLUSH : 0) | (bio->bi_op == REQ_OP_DISCARD ? DP_DISCARD : 0); else return bio->bi_rw & REQ_SYNC ? DP_RW_SYNC : 0; diff --git a/drivers/block/drbd/drbd_protocol.h b/drivers/block/drbd/drbd_protocol.h index ef92453..129f8c7 100644 --- a/drivers/block/drbd/drbd_protocol.h +++ b/drivers/block/drbd/drbd_protocol.h @@ -112,7 +112,7 @@ struct p_header100 { #define DP_MAY_SET_IN_SYNC 4 #define DP_UNPLUG 8 /* not used anymore */ #define DP_FUA 16 /* equals REQ_FUA */ -#define DP_FLUSH 32 /* equals REQ_FLUSH */ +#define DP_FLUSH 32 /* equals REQ_PREFLUSH */ #define DP_DISCARD 64 /* equals REQ_DISCARD */ #define DP_SEND_RECEIVE_ACK 128 /* This is a proto B write request */ #define DP_SEND_WRITE_ACK 256 /* This is a proto C write request */ diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index a0b95da..4303731 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c @@ -2159,7 +2159,7 @@ static unsigned long wire_flags_to_bio_flags(u32 dpf) { return (dpf & DP_RW_SYNC ? REQ_SYNC : 0) | (dpf & DP_FUA ? REQ_FUA : 0) | - (dpf & DP_FLUSH ? REQ_FLUSH : 0); + (dpf & DP_FLUSH ? REQ_PREFLUSH : 0); } static unsigned long wire_flags_to_bio_op(u32 dpf) diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c index 2255dcf..eef6e95 100644 --- a/drivers/block/drbd/drbd_req.c +++ b/drivers/block/drbd/drbd_req.c @@ -1132,7 +1132,7 @@ static int drbd_process_write_request(struct drbd_request *req) * replicating, in which case there is no point. */ if (unlikely(req->i.size == 0)) { /* The only size==0 bios we expect are empty flushes. */ - D_ASSERT(device, req->master_bio->bi_rw & REQ_FLUSH); + D_ASSERT(device, req->master_bio->bi_rw & REQ_PREFLUSH); if (remote) _req_mod(req, QUEUE_AS_DRBD_BARRIER); return remote; diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c index 68fa0f0..6e0a330 100644 --- a/drivers/md/bcache/journal.c +++ b/drivers/md/bcache/journal.c @@ -627,7 +627,7 @@ static void journal_write_unlocked(struct closure *cl) bio->bi_iter.bi_sector = PTR_OFFSET(k, i); bio->bi_bdev = ca->bdev; bio->bi_op = REQ_OP_WRITE; - bio->bi_rw = REQ_SYNC|REQ_META|REQ_FLUSH|REQ_FUA; + bio->bi_rw = REQ_SYNC|REQ_META|REQ_PREFLUSH|REQ_FUA; bio->bi_iter.bi_size = sectors << 9; bio->bi_end_io = journal_write_endio; diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c index be8cd63f..3947114 100644 --- a/drivers/md/bcache/request.c +++ b/drivers/md/bcache/request.c @@ -205,10 +205,10 @@ static void bch_data_insert_start(struct closure *cl) return bch_data_invalidate(cl); /* - * Journal writes are marked REQ_FLUSH; if the original write was a + * Journal writes are marked REQ_PREFLUSH; if the original write was a * flush, it'll wait on the journal write. */ - bio->bi_rw &= ~(REQ_FLUSH|REQ_FUA); + bio->bi_rw &= ~(REQ_PREFLUSH|REQ_FUA); do { unsigned i; @@ -668,7 +668,7 @@ static inline struct search *search_alloc(struct bio *bio, s->iop.write_prio = 0; s->iop.error = 0; s->iop.flags = 0; - s->iop.flush_journal = (bio->bi_rw & (REQ_FLUSH|REQ_FUA)) != 0; + s->iop.flush_journal = (bio->bi_rw & (REQ_PREFLUSH|REQ_FUA)) != 0; s->iop.wq = bcache_wq; return s; @@ -920,7 +920,7 @@ static void cached_dev_write(struct cached_dev *dc, struct search *s) bch_writeback_add(dc); s->iop.bio = bio; - if (bio->bi_rw & REQ_FLUSH) { + if (bio->bi_rw & REQ_PREFLUSH) { /* Also need to send a flush to the backing device */ struct bio *flush = bio_alloc_bioset(GFP_NOIO, 0, dc->disk.bio_split); diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c index 838f784..af753a6 100644 --- a/drivers/md/dm-cache-target.c +++ b/drivers/md/dm-cache-target.c @@ -788,7 +788,7 @@ static void check_if_tick_bio_needed(struct cache *cache, struct bio *bio) spin_lock_irqsave(&cache->lock, flags); if (cache->need_tick_bio && - !(bio->bi_rw & (REQ_FUA | REQ_FLUSH)) && + !(bio->bi_rw & (REQ_FUA | REQ_PREFLUSH)) && bio->bi_op != REQ_OP_DISCARD) { pb->tick = true; cache->need_tick_bio = false; @@ -830,7 +830,7 @@ static dm_oblock_t get_bio_block(struct cache *cache, struct bio *bio) static int bio_triggers_commit(struct cache *cache, struct bio *bio) { - return bio->bi_rw & (REQ_FLUSH | REQ_FUA); + return bio->bi_rw & (REQ_PREFLUSH | REQ_FUA); } /* @@ -1069,7 +1069,7 @@ static void dec_io_migrations(struct cache *cache) static bool discard_or_flush(struct bio *bio) { return bio->bi_op == REQ_OP_DISCARD || - bio->bi_rw & (REQ_FLUSH | REQ_FUA); + bio->bi_rw & (REQ_PREFLUSH | REQ_FUA); } static void __cell_defer(struct cache *cache, struct dm_bio_prison_cell *cell) @@ -1614,8 +1614,8 @@ static void process_flush_bio(struct cache *cache, struct bio *bio) remap_to_cache(cache, bio, 0); /* - * REQ_FLUSH is not directed at any particular block so we don't - * need to inc_ds(). REQ_FUA's are split into a write + REQ_FLUSH + * REQ_PREFLUSH is not directed at any particular block so we don't + * need to inc_ds(). REQ_FUA's are split into a write + REQ_PREFLUSH * by dm-core. */ issue(cache, bio); @@ -1980,7 +1980,7 @@ static void process_deferred_bios(struct cache *cache) bio = bio_list_pop(&bios); - if (bio->bi_rw & REQ_FLUSH) + if (bio->bi_rw & REQ_PREFLUSH) process_flush_bio(cache, bio); else if (bio->bi_op == REQ_OP_DISCARD) process_discard_bio(cache, &structs, bio); diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index 3a4ddad..9481dbc 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c @@ -1912,11 +1912,12 @@ static int crypt_map(struct dm_target *ti, struct bio *bio) struct crypt_config *cc = ti->private; /* - * If bio is REQ_FLUSH or REQ_DISCARD, just bypass crypt queues. - * - for REQ_FLUSH device-mapper core ensures that no IO is in-flight + * If bio is REQ_PREFLUSH or REQ_DISCARD, just bypass crypt queues. + * - for REQ_PREFLUSH device-mapper core ensures that no IO is in-flight * - for REQ_DISCARD caller must use flush if IO ordering matters */ - if (unlikely(bio->bi_rw & REQ_FLUSH || bio->bi_op == REQ_OP_DISCARD)) { + if (unlikely(bio->bi_rw & REQ_PREFLUSH || + bio->bi_op == REQ_OP_DISCARD)) { bio->bi_bdev = cc->dev->bdev; if (bio_sectors(bio)) bio->bi_iter.bi_sector = cc->start + diff --git a/drivers/md/dm-era-target.c b/drivers/md/dm-era-target.c index 665bf32..2faf49d8 100644 --- a/drivers/md/dm-era-target.c +++ b/drivers/md/dm-era-target.c @@ -1540,9 +1540,9 @@ static int era_map(struct dm_target *ti, struct bio *bio) remap_to_origin(era, bio); /* - * REQ_FLUSH bios carry no data, so we're not interested in them. + * REQ_PREFLUSH bios carry no data, so we're not interested in them. */ - if (!(bio->bi_rw & REQ_FLUSH) && + if (!(bio->bi_rw & REQ_PREFLUSH) && (bio_data_dir(bio) == WRITE) && !metadata_current_marked(era->md, block)) { defer_bio(era, bio); diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c index 0f723ca..f96ba41 100644 --- a/drivers/md/dm-io.c +++ b/drivers/md/dm-io.c @@ -381,7 +381,7 @@ static void dispatch_io(int op, int op_flags, unsigned int num_regions, */ for (i = 0; i < num_regions; i++) { *dp = old_pages; - if (where[i].count || (op_flags & REQ_FLUSH)) + if (where[i].count || (op_flags & REQ_PREFLUSH)) do_region(op, op_flags, i, where + i, dp, io); } diff --git a/drivers/md/dm-log-writes.c b/drivers/md/dm-log-writes.c index e991405..73793bd 100644 --- a/drivers/md/dm-log-writes.c +++ b/drivers/md/dm-log-writes.c @@ -555,7 +555,7 @@ static int log_writes_map(struct dm_target *ti, struct bio *bio) struct bio_vec bv; size_t alloc_size; int i = 0; - bool flush_bio = (bio->bi_rw & REQ_FLUSH); + bool flush_bio = (bio->bi_rw & REQ_PREFLUSH); bool fua_bio = (bio->bi_rw & REQ_FUA); bool discard_bio = (bio->bi_op == REQ_OP_DISCARD); diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c index c4d23da..bd1ba80 100644 --- a/drivers/md/dm-raid1.c +++ b/drivers/md/dm-raid1.c @@ -704,7 +704,7 @@ static void do_writes(struct mirror_set *ms, struct bio_list *writes) bio_list_init(&requeue); while ((bio = bio_list_pop(writes))) { - if ((bio->bi_rw & REQ_FLUSH) || + if ((bio->bi_rw & REQ_PREFLUSH) || (bio->bi_op == REQ_OP_DISCARD)) { bio_list_add(&sync, bio); continue; @@ -1253,7 +1253,8 @@ static int mirror_end_io(struct dm_target *ti, struct bio *bio, int error) * We need to dec pending if this was a write. */ if (rw == WRITE) { - if (!(bio->bi_rw & REQ_FLUSH) && bio->bi_op != REQ_OP_DISCARD) + if (!(bio->bi_rw & REQ_PREFLUSH) && + bio->bi_op != REQ_OP_DISCARD) dm_rh_dec(ms->rh, bio_record->write_region); return error; } diff --git a/drivers/md/dm-region-hash.c b/drivers/md/dm-region-hash.c index ce4af57..d257428 100644 --- a/drivers/md/dm-region-hash.c +++ b/drivers/md/dm-region-hash.c @@ -398,7 +398,7 @@ void dm_rh_mark_nosync(struct dm_region_hash *rh, struct bio *bio) region_t region = dm_rh_bio_to_region(rh, bio); int recovering = 0; - if (bio->bi_rw & REQ_FLUSH) { + if (bio->bi_rw & REQ_PREFLUSH) { rh->flush_failure = 1; return; } @@ -526,7 +526,7 @@ void dm_rh_inc_pending(struct dm_region_hash *rh, struct bio_list *bios) struct bio *bio; for (bio = bios->head; bio; bio = bio->bi_next) { - if (bio->bi_rw & REQ_FLUSH || bio->bi_op == REQ_OP_DISCARD) + if (bio->bi_rw & REQ_PREFLUSH || bio->bi_op == REQ_OP_DISCARD) continue; rh_inc(rh, dm_rh_bio_to_region(rh, bio)); } diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c index 70bb0e8..69ab1ff 100644 --- a/drivers/md/dm-snap.c +++ b/drivers/md/dm-snap.c @@ -1680,7 +1680,7 @@ static int snapshot_map(struct dm_target *ti, struct bio *bio) init_tracked_chunk(bio); - if (bio->bi_rw & REQ_FLUSH) { + if (bio->bi_rw & REQ_PREFLUSH) { bio->bi_bdev = s->cow->bdev; return DM_MAPIO_REMAPPED; } @@ -1799,7 +1799,7 @@ static int snapshot_merge_map(struct dm_target *ti, struct bio *bio) init_tracked_chunk(bio); - if (bio->bi_rw & REQ_FLUSH) { + if (bio->bi_rw & REQ_PREFLUSH) { if (!dm_bio_get_target_bio_nr(bio)) bio->bi_bdev = s->origin->bdev; else @@ -2285,7 +2285,7 @@ static int origin_map(struct dm_target *ti, struct bio *bio) bio->bi_bdev = o->dev->bdev; - if (unlikely(bio->bi_rw & REQ_FLUSH)) + if (unlikely(bio->bi_rw & REQ_PREFLUSH)) return DM_MAPIO_REMAPPED; if (bio_rw(bio) != WRITE) diff --git a/drivers/md/dm-stripe.c b/drivers/md/dm-stripe.c index 12b1630..e6f330c 100644 --- a/drivers/md/dm-stripe.c +++ b/drivers/md/dm-stripe.c @@ -286,7 +286,7 @@ static int stripe_map(struct dm_target *ti, struct bio *bio) uint32_t stripe; unsigned target_bio_nr; - if (bio->bi_rw & REQ_FLUSH) { + if (bio->bi_rw & REQ_PREFLUSH) { target_bio_nr = dm_bio_get_target_bio_nr(bio); BUG_ON(target_bio_nr >= sc->stripes); bio->bi_bdev = sc->stripe[target_bio_nr].dev->bdev; diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index 85688b7..a75815d 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c @@ -707,7 +707,7 @@ static void remap_to_origin(struct thin_c *tc, struct bio *bio) static int bio_triggers_commit(struct thin_c *tc, struct bio *bio) { - return (bio->bi_rw & (REQ_FLUSH | REQ_FUA)) && + return (bio->bi_rw & (REQ_PREFLUSH | REQ_FUA)) && dm_thin_changed_this_transaction(tc->td); } @@ -878,7 +878,7 @@ static void __inc_remap_and_issue_cell(void *context, struct bio *bio; while ((bio = bio_list_pop(&cell->bios))) { - if (bio->bi_rw & (REQ_FLUSH | REQ_FUA) || + if (bio->bi_rw & (REQ_PREFLUSH | REQ_FUA) || bio->bi_op == REQ_OP_DISCARD) bio_list_add(&info->defer_bios, bio); else { @@ -1657,7 +1657,7 @@ static void __remap_and_issue_shared_cell(void *context, while ((bio = bio_list_pop(&cell->bios))) { if ((bio_data_dir(bio) == WRITE) || - (bio->bi_rw & (REQ_FLUSH | REQ_FUA) || + (bio->bi_rw & (REQ_PREFLUSH | REQ_FUA) || bio->bi_op == REQ_OP_DISCARD)) bio_list_add(&info->defer_bios, bio); else { @@ -2572,7 +2572,7 @@ static int thin_bio_map(struct dm_target *ti, struct bio *bio) return DM_MAPIO_SUBMITTED; } - if (bio->bi_rw & (REQ_FLUSH | REQ_FUA) || + if (bio->bi_rw & (REQ_PREFLUSH | REQ_FUA) || bio->bi_op == REQ_OP_DISCARD) { thin_defer_bio_with_throttle(tc, bio); return DM_MAPIO_SUBMITTED; diff --git a/drivers/md/dm.c b/drivers/md/dm.c index bd852bc..f8ec80f 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -1003,12 +1003,12 @@ static void dec_pending(struct dm_io *io, int error) if (io_error == DM_ENDIO_REQUEUE) return; - if ((bio->bi_rw & REQ_FLUSH) && bio->bi_iter.bi_size) { + if ((bio->bi_rw & REQ_PREFLUSH) && bio->bi_iter.bi_size) { /* * Preflush done for flush with data, reissue - * without REQ_FLUSH. + * without REQ_PREFLUSH. */ - bio->bi_rw &= ~REQ_FLUSH; + bio->bi_rw &= ~REQ_PREFLUSH; queue_io(md, bio); } else { /* done with normal IO or empty flush */ @@ -1477,7 +1477,7 @@ EXPORT_SYMBOL_GPL(dm_set_target_max_io_len); /* * A target may call dm_accept_partial_bio only from the map routine. It is - * allowed for all bio types except REQ_FLUSH. + * allowed for all bio types except REQ_PREFLUSH. * * dm_accept_partial_bio informs the dm that the target only wants to process * additional n_sectors sectors of the bio and the rest of the data should be @@ -1507,7 +1507,7 @@ void dm_accept_partial_bio(struct bio *bio, unsigned n_sectors) { struct dm_target_io *tio = container_of(bio, struct dm_target_io, clone); unsigned bi_size = bio->bi_iter.bi_size >> SECTOR_SHIFT; - BUG_ON(bio->bi_rw & REQ_FLUSH); + BUG_ON(bio->bi_rw & REQ_PREFLUSH); BUG_ON(bi_size > *tio->len_ptr); BUG_ON(n_sectors > bi_size); *tio->len_ptr -= bi_size - n_sectors; @@ -1795,7 +1795,7 @@ static void __split_and_process_bio(struct mapped_device *md, start_io_acct(ci.io); - if (bio->bi_rw & REQ_FLUSH) { + if (bio->bi_rw & REQ_PREFLUSH) { ci.bio = &ci.md->flush_bio; ci.sector_count = 0; error = __send_empty_flush(&ci); diff --git a/drivers/md/linear.c b/drivers/md/linear.c index aad82c7..657053e 100644 --- a/drivers/md/linear.c +++ b/drivers/md/linear.c @@ -221,7 +221,7 @@ static void linear_make_request(struct mddev *mddev, struct bio *bio) struct bio *split; sector_t start_sector, end_sector, data_offset; - if (unlikely(bio->bi_rw & REQ_FLUSH)) { + if (unlikely(bio->bi_rw & REQ_PREFLUSH)) { md_flush_request(mddev, bio); return; } diff --git a/drivers/md/md.c b/drivers/md/md.c index 9c40368..3bfdc79 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -413,7 +413,7 @@ static void md_submit_flush_data(struct work_struct *ws) /* an empty barrier - all done */ bio_endio(bio); else { - bio->bi_rw &= ~REQ_FLUSH; + bio->bi_rw &= ~REQ_PREFLUSH; mddev->pers->make_request(mddev, bio); } diff --git a/drivers/md/md.h b/drivers/md/md.h index 2e0918f..b4f3352 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -424,7 +424,7 @@ struct mddev { /* Generic flush handling. * The last to finish preflush schedules a worker to submit - * the rest of the request (without the REQ_FLUSH flag). + * the rest of the request (without the REQ_PREFLUSH flag). */ struct bio *flush_bio; atomic_t flush_pending; diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c index dd483bb..72ea98e 100644 --- a/drivers/md/multipath.c +++ b/drivers/md/multipath.c @@ -111,7 +111,7 @@ static void multipath_make_request(struct mddev *mddev, struct bio * bio) struct multipath_bh * mp_bh; struct multipath_info *multipath; - if (unlikely(bio->bi_rw & REQ_FLUSH)) { + if (unlikely(bio->bi_rw & REQ_PREFLUSH)) { md_flush_request(mddev, bio); return; } diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index 58ff1ff..8cfc5a6 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c @@ -459,7 +459,7 @@ static void raid0_make_request(struct mddev *mddev, struct bio *bio) struct md_rdev *tmp_dev; struct bio *split; - if (unlikely(bio->bi_rw & REQ_FLUSH)) { + if (unlikely(bio->bi_rw & REQ_PREFLUSH)) { md_flush_request(mddev, bio); return; } diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index c7abd2d..2a2c177 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -1056,7 +1056,8 @@ static void raid1_make_request(struct mddev *mddev, struct bio * bio) const int op = bio->bi_op; const int rw = bio_data_dir(bio); const unsigned long do_sync = (bio->bi_rw & REQ_SYNC); - const unsigned long do_flush_fua = (bio->bi_rw & (REQ_FLUSH | REQ_FUA)); + const unsigned long do_flush_fua = (bio->bi_rw & + (REQ_PREFLUSH | REQ_FUA)); const unsigned long do_sec = (bio->bi_rw & REQ_SECURE); struct md_rdev *blocked_rdev; struct blk_plug_cb *cb; diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 63cd985..c5dc4e4 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -1452,7 +1452,7 @@ static void raid10_make_request(struct mddev *mddev, struct bio *bio) struct bio *split; - if (unlikely(bio->bi_rw & REQ_FLUSH)) { + if (unlikely(bio->bi_rw & REQ_PREFLUSH)) { md_flush_request(mddev, bio); return; } diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c index 56b20c3..e7c8b63 100644 --- a/drivers/md/raid5-cache.c +++ b/drivers/md/raid5-cache.c @@ -536,7 +536,7 @@ int r5l_handle_flush_request(struct r5l_log *log, struct bio *bio) bio_endio(bio); return 0; } - bio->bi_rw &= ~REQ_FLUSH; + bio->bi_rw &= ~REQ_PREFLUSH; return -EAGAIN; } diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 7fb693f..ff7cb4e 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -5159,7 +5159,7 @@ static void raid5_make_request(struct mddev *mddev, struct bio * bi) DEFINE_WAIT(w); bool do_prepare; - if (unlikely(bi->bi_rw & REQ_FLUSH)) { + if (unlikely(bi->bi_rw & REQ_PREFLUSH)) { int ret = r5l_handle_flush_request(conf->log, bi); if (ret == 0) diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index 921a858..c1915f8 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c @@ -2207,7 +2207,7 @@ static void btrfsic_bio_end_io(struct bio *bp) block->dev_bytenr, block->mirror_num); next_block = block->next_in_same_bio; block->iodone_w_error = iodone_w_error; - if (block->submit_bio_bh_rw & REQ_FLUSH) { + if (block->submit_bio_bh_rw & REQ_PREFLUSH) { dev_state->last_flush_gen++; if ((dev_state->state->print_mask & BTRFSIC_PRINT_MASK_END_IO_BIO_BH)) @@ -2243,7 +2243,7 @@ static void btrfsic_bh_end_io(struct buffer_head *bh, int uptodate) block->dev_bytenr, block->mirror_num); block->iodone_w_error = iodone_w_error; - if (block->submit_bio_bh_rw & REQ_FLUSH) { + if (block->submit_bio_bh_rw & REQ_PREFLUSH) { dev_state->last_flush_gen++; if ((dev_state->state->print_mask & BTRFSIC_PRINT_MASK_END_IO_BIO_BH)) @@ -2884,7 +2884,7 @@ int btrfsic_submit_bh(int op, int op_flags, struct buffer_head *bh) btrfsic_process_written_block(dev_state, dev_bytenr, &bh->b_data, 1, NULL, NULL, bh, op_flags); - } else if (NULL != dev_state && (op_flags & REQ_FLUSH)) { + } else if (NULL != dev_state && (op_flags & REQ_PREFLUSH)) { if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) printk(KERN_INFO @@ -2982,7 +2982,7 @@ static void __btrfsic_submit_bio(struct bio *bio) kunmap(bio->bi_io_vec[i].bv_page); } kfree(mapped_datav); - } else if (NULL != dev_state && (bio->bi_rw & REQ_FLUSH)) { + } else if (NULL != dev_state && (bio->bi_rw & REQ_PREFLUSH)) { if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) printk(KERN_INFO diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index 3675b8e..b5d568d 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c @@ -1353,7 +1353,7 @@ static int jbd2_write_superblock(journal_t *journal, int write_flags) trace_jbd2_write_superblock(journal, write_flags); if (!(journal->j_flags & JBD2_BARRIER)) - write_flags &= ~(REQ_FUA | REQ_FLUSH); + write_flags &= ~(REQ_FUA | REQ_PREFLUSH); lock_buffer(bh); if (buffer_write_io_error(bh)) { /* diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 917774e..0caffba 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1242,7 +1242,7 @@ _xfs_buf_ioapply( if (bp->b_flags & XBF_FUA) op_flags |= REQ_FUA; if (bp->b_flags & XBF_FLUSH) - op_flags |= REQ_FLUSH; + op_flags |= REQ_PREFLUSH; /* * Run the write verifier callback function if it exists. If diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index f9e53ca..2b6583a 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -158,7 +158,7 @@ enum rq_flag_bits { __REQ_NOIDLE, /* don't anticipate more IO after this one */ __REQ_INTEGRITY, /* I/O includes block integrity payload */ __REQ_FUA, /* forced unit access */ - __REQ_FLUSH, /* request for cache flush */ + __REQ_PREFLUSH, /* request for cache flush */ /* bio only flags */ __REQ_RAHEAD, /* read ahead, can fail anytime */ @@ -202,12 +202,12 @@ enum rq_flag_bits { (REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT | REQ_FAILFAST_DRIVER) #define REQ_COMMON_MASK \ (REQ_FAILFAST_MASK | REQ_SYNC | REQ_META | REQ_PRIO | REQ_NOIDLE | \ - REQ_FLUSH | REQ_FUA | REQ_SECURE | REQ_INTEGRITY) + REQ_PREFLUSH | REQ_FUA | REQ_SECURE | REQ_INTEGRITY) #define REQ_CLONE_MASK REQ_COMMON_MASK /* This mask is used for both bio and request merge checking */ #define REQ_NOMERGE_FLAGS \ - (REQ_NOMERGE | REQ_STARTED | REQ_SOFTBARRIER | REQ_FLUSH | REQ_FUA | REQ_FLUSH_SEQ) + (REQ_NOMERGE | REQ_STARTED | REQ_SOFTBARRIER | REQ_PREFLUSH | REQ_FUA | REQ_FLUSH_SEQ) #define REQ_RAHEAD (1ULL << __REQ_RAHEAD) #define REQ_THROTTLED (1ULL << __REQ_THROTTLED) @@ -225,7 +225,7 @@ enum rq_flag_bits { #define REQ_PREEMPT (1ULL << __REQ_PREEMPT) #define REQ_ALLOCED (1ULL << __REQ_ALLOCED) #define REQ_COPY_USER (1ULL << __REQ_COPY_USER) -#define REQ_FLUSH (1ULL << __REQ_FLUSH) +#define REQ_PREFLUSH (1ULL << __REQ_PREFLUSH) #define REQ_FLUSH_SEQ (1ULL << __REQ_FLUSH_SEQ) #define REQ_IO_STAT (1ULL << __REQ_IO_STAT) #define REQ_MIXED_MERGE (1ULL << __REQ_MIXED_MERGE) diff --git a/include/linux/fs.h b/include/linux/fs.h index 509e21f..e9ed622 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -205,9 +205,9 @@ typedef void (dax_iodone_t)(struct buffer_head *bh_map, int uptodate); #define READ_SYNC REQ_SYNC #define WRITE_SYNC (REQ_SYNC | REQ_NOIDLE) #define WRITE_ODIRECT REQ_SYNC -#define WRITE_FLUSH (REQ_SYNC | REQ_NOIDLE | REQ_FLUSH) +#define WRITE_FLUSH (REQ_SYNC | REQ_NOIDLE | REQ_PREFLUSH) #define WRITE_FUA (REQ_SYNC | REQ_NOIDLE | REQ_FUA) -#define WRITE_FLUSH_FUA (REQ_SYNC | REQ_NOIDLE | REQ_FLUSH | REQ_FUA) +#define WRITE_FLUSH_FUA (REQ_SYNC | REQ_NOIDLE | REQ_PREFLUSH | REQ_FUA) /* * Attribute flags. These should be or-ed together to figure out what diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h index 20f708e..1e5ab0c 100644 --- a/include/trace/events/f2fs.h +++ b/include/trace/events/f2fs.h @@ -33,7 +33,7 @@ TRACE_DEFINE_ENUM(SSR); TRACE_DEFINE_ENUM(__REQ_RAHEAD); TRACE_DEFINE_ENUM(__REQ_SYNC); TRACE_DEFINE_ENUM(__REQ_NOIDLE); -TRACE_DEFINE_ENUM(__REQ_FLUSH); +TRACE_DEFINE_ENUM(__REQ_PREFLUSH); TRACE_DEFINE_ENUM(__REQ_FUA); TRACE_DEFINE_ENUM(__REQ_PRIO); TRACE_DEFINE_ENUM(__REQ_META); diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index 192d714..bcdd3d3 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c @@ -189,6 +189,7 @@ static const u32 ddir_act[2] = { BLK_TC_ACT(BLK_TC_READ), BLK_TC_ACT(BLK_TC_WRITE) }; #define BLK_TC_RAHEAD BLK_TC_AHEAD +#define BLK_TC_PREFLUSH BLK_TC_FLUSH /* The ilog2() calls fall out because they're constant */ #define MASK_TC_BIT(rw, __name) ((rw & REQ_ ## __name) << \ @@ -219,7 +220,7 @@ static void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes, what |= MASK_TC_BIT(op_flags, SYNC); what |= MASK_TC_BIT(op_flags, RAHEAD); what |= MASK_TC_BIT(op_flags, META); - what |= MASK_TC_BIT(op_flags, FLUSH); + what |= MASK_TC_BIT(op_flags, PREFLUSH); what |= MASK_TC_BIT(op_flags, FUA); if (op == REQ_OP_DISCARD) what |= BLK_TC_ACT(BLK_TC_DISCARD); @@ -1777,7 +1778,7 @@ void blk_fill_rwbs(char *rwbs, int op, u32 rw, int bytes) { int i = 0; - if (rw & REQ_FLUSH || + if (rw & REQ_PREFLUSH || op == REQ_OP_FLUSH) rwbs[i++] = 'F'; -- 2.7.2 From kernel@pfupf.net Fri Apr 15 05:50:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 387577CFC for ; Fri, 15 Apr 2016 05:50:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D5C3F30404E for ; Fri, 15 Apr 2016 03:50:49 -0700 (PDT) X-ASG-Debug-ID: 1460717444-04bdf011045e5770001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id ydoh7EFjBBEnmeFP (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 15 Apr 2016 03:50:45 -0700 (PDT) X-Barracuda-Envelope-From: kernel@pfupf.net 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 A8675AD1C; Fri, 15 Apr 2016 10:50:40 +0000 (UTC) Subject: Re: [PATCH 41/42] block: do not use REQ_FLUSH for tracking flush support To: mchristi@redhat.com, linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com X-ASG-Orig-Subj: Re: [PATCH 41/42] block: do not use REQ_FLUSH for tracking flush support References: <1460716802-2294-1-git-send-email-mchristi@redhat.com> <1460716802-2294-42-git-send-email-mchristi@redhat.com> From: Juergen Gross Message-ID: <5710C77F.2000405@pfupf.net> Date: Fri, 15 Apr 2016 12:50:39 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.7.0 MIME-Version: 1.0 In-Reply-To: <1460716802-2294-42-git-send-email-mchristi@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1460717445 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28757 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 15/04/16 12:40, mchristi@redhat.com wrote: > From: Mike Christie > > The last patch added a REQ_OP_FLUSH for request_fn drivers > and the next patch renames REQ_FLUSH to REQ_PREFLUSH which > will be used by file systems and make_request_fn drivers so > they can send a write/flush combo. > > This patch drops xen's use of REQ_FLUSH to track if it supports > REQ_OP_FLUSH requests, so REQ_FLUSH can be deleted. > > v6: > - Dropped parts of patch handled by Jens's QUEUE_FLAG_WC/FUA > patches and modified patch to check feature_flush/fua bits. > > Signed-off-by: Mike Christie > Reviewed-by: Hannes Reinecke > --- > drivers/block/xen-blkfront.c | 47 ++++++++++++++++++++++---------------------- > 1 file changed, 24 insertions(+), 23 deletions(-) > > diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c > index f01691a..d6429e7 100644 > --- a/drivers/block/xen-blkfront.c > +++ b/drivers/block/xen-blkfront.c ... > @@ -985,24 +981,22 @@ static int xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size, > return 0; > } > > -static const char *flush_info(unsigned int feature_flush) > +static const char *flush_info(struct blkfront_info *info) > { > - switch (feature_flush & ((REQ_FLUSH | REQ_FUA))) { > - case REQ_FLUSH|REQ_FUA: > + if (info->feature_flush && info->feature_fua) > return "barrier: enabled;"; > - case REQ_FLUSH: > + else if (info->feature_fua) Shouldn't this test feature_flush? > return "flush diskcache: enabled;"; > - default: > + else > return "barrier or flush: disabled;"; > - } > } > > static void xlvbd_flush(struct blkfront_info *info) > { > - blk_queue_write_cache(info->rq, info->feature_flush & REQ_FLUSH, > - info->feature_flush & REQ_FUA); > + blk_queue_write_cache(info->rq, info->feature_flush ? true : false, > + info->feature_flush ? true : false); And here the second test should be feature_fua? > pr_info("blkfront: %s: %s %s %s %s %s\n", > - info->gd->disk_name, flush_info(info->feature_flush), > + info->gd->disk_name, flush_info(info), > "persistent grants:", info->feature_persistent ? > "enabled;" : "disabled;", "indirect descriptors:", > info->max_indirect_segments ? "enabled;" : "disabled;"); Juergen From bfoster@redhat.com Fri Apr 15 06:48:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EDBD67CBA for ; Fri, 15 Apr 2016 06:48:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id BC49E8F8033 for ; Fri, 15 Apr 2016 04:48:17 -0700 (PDT) X-ASG-Debug-ID: 1460720893-04cbb02e1a2ef290001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BqRkNZ3Wxaxh1bQL (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 04:48:14 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 44EBE64073; Fri, 15 Apr 2016 11:48:13 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-148.bos.redhat.com [10.18.41.148]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FBmCDZ001000; Fri, 15 Apr 2016 07:48:12 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id D759C1237F0; Fri, 15 Apr 2016 07:48:11 -0400 (EDT) Date: Fri, 15 Apr 2016 07:48:11 -0400 From: Brian Foster To: Mike Snitzer Cc: "Darrick J. Wong" , dm-devel@redhat.com, xfs@oss.sgi.com, linux-block@vger.kernel.org, Joe Thornber , linux-fsdevel@vger.kernel.org Subject: Re: [RFC v2 PATCH 05/10] dm thin: add methods to set and get reserved space Message-ID: <20160415114811.GA36382@bfoster.bfoster> X-ASG-Orig-Subj: Re: [RFC v2 PATCH 05/10] dm thin: add methods to set and get reserved space References: <1460479373-63317-1-git-send-email-bfoster@redhat.com> <1460479373-63317-6-git-send-email-bfoster@redhat.com> <20160413174442.GD18517@birch.djwong.org> <20160413183352.GB2775@bfoster.bfoster> <20160413204117.GA6870@bfoster.bfoster> <20160414151014.GA13074@redhat.com> <20160414162344.GG20696@bfoster.bfoster> <20160414201812.GA14466@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160414201812.GA14466@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Fri, 15 Apr 2016 11:48:13 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460720893 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Apr 14, 2016 at 04:18:12PM -0400, Mike Snitzer wrote: > On Thu, Apr 14 2016 at 12:23pm -0400, > Brian Foster wrote: > > > On Thu, Apr 14, 2016 at 11:10:14AM -0400, Mike Snitzer wrote: > > > > > > Brian, I need to circle back with you to understand why XFS even needs > > > reservation as opposed to just using something like fallocate (which > > > would provision the space before you actually initiate the IO that would > > > use it). But we can discuss that in person and then report back to the > > > list if it makes it easier... > > > > > > > The primary reason is delayed allocation. Buffered writes to the fs copy > > data into the pagecache before the physical space has been allocated. > > E.g., we only modify the free blocks counters at write() time in order > > to guarantee that we have space somewhere in the fs. The physical > > extents aren't allocated until later at writeback time. > > > > So reservation from dm-thin basically extends the mechanism to also > > guarantee that the underlying thin volume has space for writes that > > we've received but haven't written back yet. > > OK, so even if/when we have bdev_fallocate support that would be more > rigid than XFS would like. > Yeah, fallocate is still useful on its own. For example, we could still invoke bdev_fallocate() in response to userspace fallocate to ensure the space is physically allocated (i.e., provide the no -ENOSPC guarantee). That just doesn't help us avoid the overprovisioned situation where we have data in pagecache and nowhere to write it back to (w/o setting the volume read-only). The only way I'm aware of to handle that is to account for the space at write time. > As you've said, the XFS established reservation is larger than is really > needed. Whereas regularly provisioning more than is actually needed is > a recipe for disaster. > Indeed, this prototype ties right into XFS' existing transaction reservation mechanism. It basically adds bdev reservation to the blocks that we already locally reserve during creation of a transaction or a delalloc write. This already does worst case reservation. What's interesting is that the worst case 1-1 fs-dm block reservation doesn't appear to be as much of a functional impediment as anticipated. I think that's because XFS is already designed for such worst case reservations and has mechanisms in place to handle it in appropriate situations. For example, if an incoming write fails to reserve blocks due to too much outstanding reservation, xfs_file_buffered_aio_write() will do things like flush inodes and run our post-eof (for speculatively preallocated space) scanner to reclaim some of that space and retry before it gives up. I'm sure there's a performance issue in there somewhere when that whole sequence occurs more frequently than normal due to the amplified reservation (a 4k fs block reserving 64k or more in the dm vol), but I don't think that's necessarily a disaster scenario. Brian > > > > > > > + if (error) > > > > > > > + return error; > > > > > > > + > > > > > > > + error = dm_thin_insert_block(tc->td, vblock, pblock); > > > > > > > > > > > > Having reserved and mapped blocks, what happens when we try to read them? > > > > > > Do we actually get zeroes, or does the read go straight through to whatever > > > > > > happens to be in the disk blocks? I don't think it's correct that we could > > > > > > BDEV_RES_PROVISION and end up with stale credit card numbers from some other > > > > > > thin device. > > > > > > > > > > > > > > > > Agree, but I'm not really sure how this works in thinp tbh. fallocate > > > > > wasn't really on my mind when doing this. I was simply trying to cobble > > > > > together what I could to facilitate making progress on the fs parts > > > > > (e.g., I just needed a call that allocated blocks and consumed > > > > > reservation in the process). > > > > > > > > > > Skimming through the dm-thin code, it looks like a (configurable) block > > > > > zeroing mechanism can be triggered from somewhere around > > > > > provision_block()->schedule_zero(), depending on whether the incoming > > > > > write overwrites the newly allocated block. If that's the case, then I > > > > > suspect that means reads would just fall through to the block and return > > > > > whatever was on disk. This code would probably need to tie into that > > > > > zeroing mechanism one way or another to deal with that issue. (Though > > > > > somebody who actually knows something about dm-thin should verify that. > > > > > :) > > > > > > > > > > > > > BTW, if that mechanism is in fact doing I/O, that might not be the > > > > appropriate solution for fallocate. Perhaps we'd have to consider an > > > > unwritten flag or some such in dm-thin, if possible. > > > > > > DM thinp defaults to enabling 'zero_new_blocks' (can be disabled using > > > the 'skip_block_zeroing' feature when loading the DM table for the > > > thin-pool). With block-zeroing any blocks that are provisioned _will_ > > > be overwritten with zeroes (using dm-kcopyd which is trained to use > > > WRITE_SAME if supported). > > > > > > > Ok, thanks. > > > > > But yeah, for fallocate.. certainly not something we want as it defeats > > > the point of fallocate being cheap. > > > > > > > Indeed. > > > > > So we probably would need a flag comparable to the > > > ext4-stale-flag-that-shall-not-be-named ;) > > > > > > > Any chance to support an unwritten flag for all blocks that are > > allocated via fallocate? E.g., subsequent reads detect the flag and > > return zeroes as if the block wasn't there and a subsequent write clears > > the flag (doing any partial block zeroing that might be necessary as > > well). > > Yeah, I've already started talking to Joe about doing exactly that. > Without it we cannot securely provide fallocate support in DM thinp. > > I'll keep discussing with Joe... he doesn't like this requirement but > we'll work through it. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Apr 15 07:47:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3FBFF7CB0 for ; Fri, 15 Apr 2016 07:47:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id EB6BF30405F for ; Fri, 15 Apr 2016 05:46:58 -0700 (PDT) X-ASG-Debug-ID: 1460724417-04bdf011035ee9f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id svIu2Ip6IsP8VDXF (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 05:46:57 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1693513A62; Fri, 15 Apr 2016 12:46:57 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-148.bos.redhat.com [10.18.41.148]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FCkuMP007268; Fri, 15 Apr 2016 08:46:56 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id DAEAE1237F0; Fri, 15 Apr 2016 08:46:55 -0400 (EDT) Date: Fri, 15 Apr 2016 08:46:55 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 07/11] xfs: mark reclaimed inodes invalid earlier Message-ID: <20160415124655.GB36382@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 07/11] xfs: mark reclaimed inodes invalid earlier References: <1460525492-1170-1-git-send-email-david@fromorbit.com> <1460525492-1170-8-git-send-email-david@fromorbit.com> <20160413064900.GP567@dastard> <20160414121048.GB20696@bfoster.bfoster> <20160414233101.GY567@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160414233101.GY567@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460724417 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Apr 15, 2016 at 09:31:01AM +1000, Dave Chinner wrote: > On Thu, Apr 14, 2016 at 08:10:49AM -0400, Brian Foster wrote: > > On Wed, Apr 13, 2016 at 04:49:00PM +1000, Dave Chinner wrote: > > > On Wed, Apr 13, 2016 at 03:31:28PM +1000, Dave Chinner wrote: > > > > From: Dave Chinner > > > > > > > > The last thing we do before using call_rcu() on an xfs_inode to be > > > > freed is mark it as invalid. This means there is a window between > > > > when we know for certain that the inode is going to be freed and > > > > when we do actually mark it as "freed". > > > > > > > > This is important in the context of RCU lookups - we can look up the > > > > inode, find that it is valid, and then use it as such not realising > > > > that it is in the final stages of being freed. > > > > > > > > As such, mark the inode as being invalid the moment we know it is > > > > going to be reclaimed. This can be done while we still hold the > > > > XFS_ILOCK_EXCL and the flush lock in xfs_inode_reclaim, meaning that > > > > it occurs well before we remove it from the radix tree, and that > > > > the i_flags_lock, the XFS_ILOCK and the inode flush lock all act as > > > > synchronisation points for detecting that an inode is about to go > > > > away. > > > > > > > > For defensive purposes, this allows us to add a further check to > > > > xfs_iflush_cluster to ensure we skip inodes that are being freed > > > > after we grab the XFS_ILOCK_SHARED and the flush lock - we know that > > > > if the inode number if valid while we have these locks held we know > > > > that it has not progressed through reclaim to the point where it is > > > > clean and is about to be freed. > > > > > > > > [bfoster: fixed __xfs_inode_clear_reclaim() using ip->i_ino after it > > > > had already been zeroed.] > > > > > > And, of course, in reordering this I dropped this fix because it was > > > handled by the reworking of tagging code to use pag->pag_agno. > > > > > > So I've brought that small change forward to this patch (using > > > pag->pag_agno instead of deriving it from the ip->i_ino in > > > __xfs_inode_clear_reclaim()). > > > > > > > I don't see any such change in this patch..? > > __xfs_inode_clear_reclaim() still uses ip->i_ino. > > I meant that I realised that I'd screwed it up and so I'd changed my > local copy after I sent this. > Oh, Ok. Anyways, the long running reproducer I had running (against v2 + the reclaim tag hunk that I had posted) completed without an error. That's the first time I've seen that, so I think it's safe to confirm this series fixes the original problem: Tested-by: Brian Foster > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From jmoyer@redhat.com Fri Apr 15 09:55:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 010377CA1 for ; Fri, 15 Apr 2016 09:55:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C7DE1304032 for ; Fri, 15 Apr 2016 07:55:24 -0700 (PDT) X-ASG-Debug-ID: 1460732120-04cb6c245f62b4f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id l5vrZTIsBuwMBtOf (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 07:55:20 -0700 (PDT) X-Barracuda-Envelope-From: jmoyer@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9C47A6265A; Fri, 15 Apr 2016 14:55:19 +0000 (UTC) Received: from segfault.boston.devel.redhat.com (segfault.boston.devel.redhat.com [10.19.60.26]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FEtHI2010378 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Fri, 15 Apr 2016 10:55:18 -0400 From: Jeff Moyer To: Vishal Verma Cc: linux-nvdimm@ml01.01.org, Jens Axboe , Jan Kara , Andrew Morton , Christoph Hellwig , Dave Chinner , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-block@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, Al Viro Subject: Re: [PATCH v2 1/5] block, dax: pass blk_dax_ctl through to drivers References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-2-git-send-email-vishal.l.verma@intel.com> X-ASG-Orig-Subj: Re: [PATCH v2 1/5] block, dax: pass blk_dax_ctl through to drivers X-PGP-KeyID: 1F78E1B4 X-PGP-CertKey: F6FE 280D 8293 F72C 65FD 5A58 1FF8 A7CA 1F78 E1B4 X-PCLoadLetter: What the f**k does that mean? Date: Fri, 15 Apr 2016 10:55:17 -0400 In-Reply-To: <1459303190-20072-2-git-send-email-vishal.l.verma@intel.com> (Vishal Verma's message of "Tue, 29 Mar 2016 19:59:46 -0600") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Fri, 15 Apr 2016 14:55:20 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460732120 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Vishal Verma writes: > From: Dan Williams > > This is in preparation for doing badblocks checking against the > requested sector range in the driver. Currently we opportunistically > return as much data that can be "dax'd" starting at the given sector. > When errors are present we want to limit that range to the first > encountered error, or fail the dax request if the range encompasses an > error. I'm not a fan of hiding arguments like this, but it looks fine. Reviewed-by: Jeff Moyer > Signed-off-by: Dan Williams > --- > arch/powerpc/sysdev/axonram.c | 10 +++++----- > drivers/block/brd.c | 9 +++++---- > drivers/nvdimm/pmem.c | 9 +++++---- > drivers/s390/block/dcssblk.c | 12 ++++++------ > fs/block_dev.c | 2 +- > include/linux/blkdev.h | 3 +-- > 6 files changed, 23 insertions(+), 22 deletions(-) > > diff --git a/arch/powerpc/sysdev/axonram.c b/arch/powerpc/sysdev/axonram.c > index 0d112b9..d85673f 100644 > --- a/arch/powerpc/sysdev/axonram.c > +++ b/arch/powerpc/sysdev/axonram.c > @@ -139,17 +139,17 @@ axon_ram_make_request(struct request_queue *queue, struct bio *bio) > > /** > * axon_ram_direct_access - direct_access() method for block device > - * @device, @sector, @data: see block_device_operations method > + * @dax: see block_device_operations method > */ > static long > -axon_ram_direct_access(struct block_device *device, sector_t sector, > - void __pmem **kaddr, pfn_t *pfn) > +axon_ram_direct_access(struct block_device *device, struct blk_dax_ctl *dax) > { > + sector_t sector = get_start_sect(device) + dax->sector; > struct axon_ram_bank *bank = device->bd_disk->private_data; > loff_t offset = (loff_t)sector << AXON_RAM_SECTOR_SHIFT; > > - *kaddr = (void __pmem __force *) bank->io_addr + offset; > - *pfn = phys_to_pfn_t(bank->ph_addr + offset, PFN_DEV); > + dax->addr = (void __pmem __force *) bank->io_addr + offset; > + dax->pfn = phys_to_pfn_t(bank->ph_addr + offset, PFN_DEV); > return bank->size - offset; > } > > diff --git a/drivers/block/brd.c b/drivers/block/brd.c > index f7ecc28..e3e4780 100644 > --- a/drivers/block/brd.c > +++ b/drivers/block/brd.c > @@ -380,9 +380,10 @@ static int brd_rw_page(struct block_device *bdev, sector_t sector, > } > > #ifdef CONFIG_BLK_DEV_RAM_DAX > -static long brd_direct_access(struct block_device *bdev, sector_t sector, > - void __pmem **kaddr, pfn_t *pfn) > +static long brd_direct_access(struct block_device *bdev, > + struct blk_dax_ctl *dax) > { > + sector_t sector = get_start_sect(bdev) + dax->sector; > struct brd_device *brd = bdev->bd_disk->private_data; > struct page *page; > > @@ -391,8 +392,8 @@ static long brd_direct_access(struct block_device *bdev, sector_t sector, > page = brd_insert_page(brd, sector); > if (!page) > return -ENOSPC; > - *kaddr = (void __pmem *)page_address(page); > - *pfn = page_to_pfn_t(page); > + dax->addr = (void __pmem *)page_address(page); > + dax->pfn = page_to_pfn_t(page); > > return PAGE_SIZE; > } > diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c > index ca5721c..da10554 100644 > --- a/drivers/nvdimm/pmem.c > +++ b/drivers/nvdimm/pmem.c > @@ -167,14 +167,15 @@ static int pmem_rw_page(struct block_device *bdev, sector_t sector, > return rc; > } > > -static long pmem_direct_access(struct block_device *bdev, sector_t sector, > - void __pmem **kaddr, pfn_t *pfn) > +static long pmem_direct_access(struct block_device *bdev, > + struct blk_dax_ctl *dax) > { > + sector_t sector = get_start_sect(bdev) + dax->sector; > struct pmem_device *pmem = bdev->bd_disk->private_data; > resource_size_t offset = sector * 512 + pmem->data_offset; > > - *kaddr = pmem->virt_addr + offset; > - *pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags); > + dax->addr = pmem->virt_addr + offset; > + dax->pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags); > > return pmem->size - pmem->pfn_pad - offset; > } > diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c > index 1bce9cf..5719c30 100644 > --- a/drivers/s390/block/dcssblk.c > +++ b/drivers/s390/block/dcssblk.c > @@ -30,8 +30,8 @@ static int dcssblk_open(struct block_device *bdev, fmode_t mode); > static void dcssblk_release(struct gendisk *disk, fmode_t mode); > static blk_qc_t dcssblk_make_request(struct request_queue *q, > struct bio *bio); > -static long dcssblk_direct_access(struct block_device *bdev, sector_t secnum, > - void __pmem **kaddr, pfn_t *pfn); > +static long dcssblk_direct_access(struct block_device *bdev, > + struct blk_dax_ctl *dax) > > static char dcssblk_segments[DCSSBLK_PARM_LEN] = "\0"; > > @@ -882,9 +882,9 @@ fail: > } > > static long > -dcssblk_direct_access (struct block_device *bdev, sector_t secnum, > - void __pmem **kaddr, pfn_t *pfn) > +dcssblk_direct_access(struct block_device *bdev, struct blk_dax_ctl *dax) > { > + sector_t secnum = get_start_sect(bdev) + dax->sector; > struct dcssblk_dev_info *dev_info; > unsigned long offset, dev_sz; > > @@ -893,8 +893,8 @@ dcssblk_direct_access (struct block_device *bdev, sector_t secnum, > return -ENODEV; > dev_sz = dev_info->end - dev_info->start; > offset = secnum * 512; > - *kaddr = (void __pmem *) (dev_info->start + offset); > - *pfn = __pfn_to_pfn_t(PFN_DOWN(dev_info->start + offset), PFN_DEV); > + dax->addr = (void __pmem *) (dev_info->start + offset); > + dax->pfn = __pfn_to_pfn_t(PFN_DOWN(dev_info->start + offset), PFN_DEV); > > return dev_sz - offset; > } > diff --git a/fs/block_dev.c b/fs/block_dev.c > index 3172c4e..c5837fa 100644 > --- a/fs/block_dev.c > +++ b/fs/block_dev.c > @@ -488,7 +488,7 @@ long bdev_direct_access(struct block_device *bdev, struct blk_dax_ctl *dax) > sector += get_start_sect(bdev); > if (sector % (PAGE_SIZE / 512)) > return -EINVAL; > - avail = ops->direct_access(bdev, sector, &dax->addr, &dax->pfn); > + avail = ops->direct_access(bdev, dax); > if (!avail) > return -ERANGE; > if (avail > 0 && avail & ~PAGE_MASK) > diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h > index 7e5d7e0..92f8a1f 100644 > --- a/include/linux/blkdev.h > +++ b/include/linux/blkdev.h > @@ -1656,8 +1656,7 @@ struct block_device_operations { > int (*rw_page)(struct block_device *, sector_t, struct page *, int rw); > int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); > int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); > - long (*direct_access)(struct block_device *, sector_t, void __pmem **, > - pfn_t *); > + long (*direct_access)(struct block_device *, struct blk_dax_ctl *dax); > unsigned int (*check_events) (struct gendisk *disk, > unsigned int clearing); > /* ->media_changed() is DEPRECATED, use ->check_events() instead */ From jmoyer@redhat.com Fri Apr 15 09:55:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9709D7CA1 for ; Fri, 15 Apr 2016 09:55:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 04298AC005 for ; Fri, 15 Apr 2016 07:55:46 -0700 (PDT) X-ASG-Debug-ID: 1460732145-04cb6c246462b570001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 5KEtNpc4xQYLD4ov (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 07:55:46 -0700 (PDT) X-Barracuda-Envelope-From: jmoyer@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3257064079; Fri, 15 Apr 2016 14:55:45 +0000 (UTC) Received: from segfault.boston.devel.redhat.com (segfault.boston.devel.redhat.com [10.19.60.26]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FEthSA001989 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Fri, 15 Apr 2016 10:55:43 -0400 From: Jeff Moyer To: Vishal Verma Cc: linux-nvdimm@ml01.01.org, Jens Axboe , Jan Kara , Andrew Morton , Christoph Hellwig , Dave Chinner , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-block@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, Al Viro Subject: Re: [PATCH v2 2/5] dax: fallback from pmd to pte on error References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-3-git-send-email-vishal.l.verma@intel.com> X-ASG-Orig-Subj: Re: [PATCH v2 2/5] dax: fallback from pmd to pte on error X-PGP-KeyID: 1F78E1B4 X-PGP-CertKey: F6FE 280D 8293 F72C 65FD 5A58 1FF8 A7CA 1F78 E1B4 X-PCLoadLetter: What the f**k does that mean? Date: Fri, 15 Apr 2016 10:55:43 -0400 In-Reply-To: <1459303190-20072-3-git-send-email-vishal.l.verma@intel.com> (Vishal Verma's message of "Tue, 29 Mar 2016 19:59:47 -0600") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Fri, 15 Apr 2016 14:55:45 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460732145 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Vishal Verma writes: > From: Dan Williams > > In preparation for consulting a badblocks list in pmem_direct_access(), > teach dax_pmd_fault() to fallback rather than fail immediately upon > encountering an error. The thought being that reducing the span of the > dax request may avoid the error region. > > Signed-off-by: Dan Williams Reviewed-by: Jeff Moyer > --- > fs/dax.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/fs/dax.c b/fs/dax.c > index 90322eb..ec6417b 100644 > --- a/fs/dax.c > +++ b/fs/dax.c > @@ -945,8 +945,8 @@ int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address, > long length = dax_map_atomic(bdev, &dax); > > if (length < 0) { > - result = VM_FAULT_SIGBUS; > - goto out; > + dax_pmd_dbg(&bh, address, "dax-error fallback"); > + goto fallback; > } > if (length < PMD_SIZE) { > dax_pmd_dbg(&bh, address, "dax-length too small"); From jmoyer@redhat.com Fri Apr 15 09:56:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D68AD7CA1 for ; Fri, 15 Apr 2016 09:56:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3449DAC002 for ; Fri, 15 Apr 2016 07:56:15 -0700 (PDT) X-ASG-Debug-ID: 1460732173-04cb6c246262b5c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id VA7QOYHLU9zCSD1x (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 07:56:13 -0700 (PDT) X-Barracuda-Envelope-From: jmoyer@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E878278241; Fri, 15 Apr 2016 14:56:12 +0000 (UTC) Received: from segfault.boston.devel.redhat.com (segfault.boston.devel.redhat.com [10.19.60.26]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FEuAsE020602 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Fri, 15 Apr 2016 10:56:11 -0400 From: Jeff Moyer To: Vishal Verma Cc: linux-nvdimm@ml01.01.org, Jens Axboe , Jan Kara , Andrew Morton , Christoph Hellwig , Dave Chinner , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-block@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, Al Viro Subject: Re: [PATCH v2 3/5] dax: enable dax in the presence of known media errors (badblocks) References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-4-git-send-email-vishal.l.verma@intel.com> X-ASG-Orig-Subj: Re: [PATCH v2 3/5] dax: enable dax in the presence of known media errors (badblocks) X-PGP-KeyID: 1F78E1B4 X-PGP-CertKey: F6FE 280D 8293 F72C 65FD 5A58 1FF8 A7CA 1F78 E1B4 X-PCLoadLetter: What the f**k does that mean? Date: Fri, 15 Apr 2016 10:56:10 -0400 In-Reply-To: <1459303190-20072-4-git-send-email-vishal.l.verma@intel.com> (Vishal Verma's message of "Tue, 29 Mar 2016 19:59:48 -0600") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain 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: 1460732173 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Vishal Verma writes: > From: Dan Williams > > 1/ If a mapping overlaps a bad sector fail the request. > > 2/ Do not opportunistically report more dax-capable capacity than is > requested when errors present. > > [vishal: fix a conflict with system RAM collision patches] > Signed-off-by: Dan Williams Reviewed-by: Jeff Moyer > --- > block/ioctl.c | 9 --------- > drivers/nvdimm/pmem.c | 8 ++++++++ > 2 files changed, 8 insertions(+), 9 deletions(-) > > diff --git a/block/ioctl.c b/block/ioctl.c > index d8996bb..cd7f392 100644 > --- a/block/ioctl.c > +++ b/block/ioctl.c > @@ -423,15 +423,6 @@ bool blkdev_dax_capable(struct block_device *bdev) > || (bdev->bd_part->nr_sects % (PAGE_SIZE / 512))) > return false; > > - /* > - * If the device has known bad blocks, force all I/O through the > - * driver / page cache. > - * > - * TODO: support finer grained dax error handling > - */ > - if (disk->bb && disk->bb->count) > - return false; > - > return true; > } > #endif > diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c > index da10554..eac5f93 100644 > --- a/drivers/nvdimm/pmem.c > +++ b/drivers/nvdimm/pmem.c > @@ -174,9 +174,17 @@ static long pmem_direct_access(struct block_device *bdev, > struct pmem_device *pmem = bdev->bd_disk->private_data; > resource_size_t offset = sector * 512 + pmem->data_offset; > > + if (unlikely(is_bad_pmem(&pmem->bb, sector, dax->size))) > + return -EIO; > dax->addr = pmem->virt_addr + offset; > dax->pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags); > > + /* > + * If badblocks are present, limit known good range to the > + * requested range. > + */ > + if (unlikely(pmem->bb.count)) > + return dax->size; > return pmem->size - pmem->pfn_pad - offset; > } From jmoyer@redhat.com Fri Apr 15 10:18:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 348297CA2 for ; Fri, 15 Apr 2016 10:18:33 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id EB17830405F for ; Fri, 15 Apr 2016 08:18:29 -0700 (PDT) X-ASG-Debug-ID: 1460733505-04cbb02e1b300870001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id mxFimEBAQMnZasRC (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 08:18:26 -0700 (PDT) X-Barracuda-Envelope-From: jmoyer@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1FD4E7F084; Fri, 15 Apr 2016 15:18:25 +0000 (UTC) Received: from segfault.boston.devel.redhat.com (segfault.boston.devel.redhat.com [10.19.60.26]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FFIM7C012754 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Fri, 15 Apr 2016 11:18:23 -0400 From: Jeff Moyer To: Vishal Verma Cc: linux-nvdimm@ml01.01.org, Jens Axboe , Jan Kara , Andrew Morton , Christoph Hellwig , Dave Chinner , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-block@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, Al Viro Subject: Re: [PATCH v2 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-5-git-send-email-vishal.l.verma@intel.com> X-ASG-Orig-Subj: Re: [PATCH v2 4/5] dax: use sb_issue_zerout instead of calling dax_clear_sectors X-PGP-KeyID: 1F78E1B4 X-PGP-CertKey: F6FE 280D 8293 F72C 65FD 5A58 1FF8 A7CA 1F78 E1B4 X-PCLoadLetter: What the f**k does that mean? Date: Fri, 15 Apr 2016 11:18:22 -0400 In-Reply-To: <1459303190-20072-5-git-send-email-vishal.l.verma@intel.com> (Vishal Verma's message of "Tue, 29 Mar 2016 19:59:49 -0600") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain 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: 1460733506 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Vishal Verma writes: > From: Matthew Wilcox > > dax_clear_sectors() cannot handle poisoned blocks. These must be > zeroed using the BIO interface instead. Convert ext2 and XFS to use > only sb_issue_zerout(). > > Signed-off-by: Matthew Wilcox > [vishal: Also remove the dax_clear_sectors function entirely] > Signed-off-by: Vishal Verma Reviewed-by: Jeff Moyer From bfoster@redhat.com Fri Apr 15 11:08:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 513777CA2 for ; Fri, 15 Apr 2016 11:08:46 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 22E948F8035 for ; Fri, 15 Apr 2016 09:08:42 -0700 (PDT) X-ASG-Debug-ID: 1460736521-04cb6c245f632420001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id b8gbm7Ns2BxzgLze (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 09:08:41 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 33D2AD2ED6 for ; Fri, 15 Apr 2016 16:08:41 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-148.bos.redhat.com [10.18.41.148]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FG8eiO025126 for ; Fri, 15 Apr 2016 12:08:41 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id ABF3F1237F0; Fri, 15 Apr 2016 12:08:39 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH] xfs: buffer ->bi_end_io function requires irq-safe lock Date: Fri, 15 Apr 2016 12:08:39 -0400 X-ASG-Orig-Subj: [PATCH] xfs: buffer ->bi_end_io function requires irq-safe lock Message-Id: <1460736519-39428-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Fri, 15 Apr 2016 16:08:41 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460736521 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Reports have surfaced of a lockdep splat complaining about an irq-safe -> irq-unsafe locking order in the xfs_buf_bio_end_io() bio completion handler. This only occurs when I/O errors are present because bp->b_lock is only acquired in this context to protect setting an error on the buffer. The problem is that this lock can be acquired with the (request_queue) q->queue_lock held. See scsi_end_request() or ata_qc_schedule_eh(), for example. Replace bp->b_lock with a new irq-safe lock for use in bio completion. This avoids the bad lock ordering and should be otherwise low impact as the lock is only acquired on I/O error. Signed-off-by: Brian Foster --- Hi all, I'm not totally sure this is a real issue, but the fix seemed simple enough... Brian fs/xfs/xfs_buf.c | 10 ++++++---- fs/xfs/xfs_buf.h | 1 + 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 9a2191b..aa0ce4a 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -174,6 +174,7 @@ _xfs_buf_alloc( RB_CLEAR_NODE(&bp->b_rbnode); sema_init(&bp->b_sema, 0); /* held, no waiters */ spin_lock_init(&bp->b_lock); + spin_lock_init(&bp->b_error_lock); XB_SET_OWNER(bp); bp->b_target = target; bp->b_flags = flags; @@ -1100,21 +1101,22 @@ xfs_bwrite( return error; } -STATIC void +static void xfs_buf_bio_end_io( struct bio *bio) { - xfs_buf_t *bp = (xfs_buf_t *)bio->bi_private; + struct xfs_buf *bp = (struct xfs_buf *)bio->bi_private; + unsigned long flags; /* * don't overwrite existing errors - otherwise we can lose errors on * buffers that require multiple bios to complete. */ if (bio->bi_error) { - spin_lock(&bp->b_lock); + spin_lock_irqsave(&bp->b_error_lock, flags); if (!bp->b_io_error) bp->b_io_error = bio->bi_error; - spin_unlock(&bp->b_lock); + spin_unlock_irqrestore(&bp->b_error_lock, flags); } if (!bp->b_error && xfs_buf_is_vmapped(bp) && (bp->b_flags & XBF_READ)) diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index 4eb89bd..c84529c 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h @@ -161,6 +161,7 @@ typedef struct xfs_buf { spinlock_t b_lock; /* internal state lock */ unsigned int b_state; /* internal state flags */ int b_io_error; /* internal IO error state */ + spinlock_t b_error_lock; /* irq-safe IO error lock */ wait_queue_head_t b_waiters; /* unpin waiters */ struct list_head b_list; struct xfs_perag *b_pag; /* contains rbtree root */ -- 2.4.11 From jmoyer@redhat.com Fri Apr 15 11:11:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5DF4C7CA2 for ; Fri, 15 Apr 2016 11:11:45 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B9EBDAC004 for ; Fri, 15 Apr 2016 09:11:41 -0700 (PDT) X-ASG-Debug-ID: 1460736699-04bdf01102601ef0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ZBcgGhY6M5San2Nf (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 09:11:40 -0700 (PDT) X-Barracuda-Envelope-From: jmoyer@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9C7946F66C; Fri, 15 Apr 2016 16:11:39 +0000 (UTC) Received: from segfault.boston.devel.redhat.com (segfault.boston.devel.redhat.com [10.19.60.26]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FGBbL3028402 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Fri, 15 Apr 2016 12:11:37 -0400 From: Jeff Moyer To: Vishal Verma Cc: linux-nvdimm@ml01.01.org, Jens Axboe , Jan Kara , Andrew Morton , Christoph Hellwig , Dave Chinner , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-block@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, Al Viro Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io X-PGP-KeyID: 1F78E1B4 X-PGP-CertKey: F6FE 280D 8293 F72C 65FD 5A58 1FF8 A7CA 1F78 E1B4 X-PCLoadLetter: What the f**k does that mean? Date: Fri, 15 Apr 2016 12:11:36 -0400 In-Reply-To: <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> (Vishal Verma's message of "Tue, 29 Mar 2016 19:59:50 -0600") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain 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: 1460736700 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Vishal Verma writes: > dax_do_io (called for read() or write() for a dax file system) may fail > in the presence of bad blocks or media errors. Since we expect that a > write should clear media errors on nvdimms, make dax_do_io fall back to > the direct_IO path, which will send down a bio to the driver, which can > then attempt to clear the error. [snip] > + if (IS_DAX(inode)) { > + ret = dax_do_io(iocb, inode, iter, offset, blkdev_get_block, > NULL, DIO_SKIP_DIO_COUNT); > - return __blockdev_direct_IO(iocb, inode, I_BDEV(inode), iter, offset, > + if (ret == -EIO && (iov_iter_rw(iter) == WRITE)) > + ret_saved = ret; > + else > + return ret; > + } > + > + ret = __blockdev_direct_IO(iocb, inode, I_BDEV(inode), iter, offset, > blkdev_get_block, NULL, NULL, > DIO_SKIP_DIO_COUNT); > + if (ret < 0 && ret_saved) > + return ret_saved; > + Hmm, did you just break async DIO? I think you did! :) __blockdev_direct_IO can return -EIOCBQUEUED, and you've now turned that into -EIO. Really, I don't see a reason to save that first -EIO. The same applies to all instances in this patch. Cheers, Jeff > + return ret; > } > > int __sync_blockdev(struct block_device *bdev, int wait) > diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c > index 824f249..64792c6 100644 > --- a/fs/ext2/inode.c > +++ b/fs/ext2/inode.c > @@ -859,14 +859,22 @@ ext2_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) > struct address_space *mapping = file->f_mapping; > struct inode *inode = mapping->host; > size_t count = iov_iter_count(iter); > - ssize_t ret; > + ssize_t ret, ret_saved = 0; > > - if (IS_DAX(inode)) > - ret = dax_do_io(iocb, inode, iter, offset, ext2_get_block, NULL, > - DIO_LOCKING); > - else > - ret = blockdev_direct_IO(iocb, inode, iter, offset, > - ext2_get_block); > + if (IS_DAX(inode)) { > + ret = dax_do_io(iocb, inode, iter, offset, ext2_get_block, > + NULL, DIO_LOCKING | DIO_SKIP_HOLES); > + if (ret == -EIO && iov_iter_rw(iter) == WRITE) > + ret_saved = ret; > + else > + goto out; > + } > + > + ret = blockdev_direct_IO(iocb, inode, iter, offset, ext2_get_block); > + if (ret < 0 && ret_saved) > + ret = ret_saved; > + > + out: > if (ret < 0 && iov_iter_rw(iter) == WRITE) > ext2_write_failed(mapping, offset + count); > return ret; > diff --git a/fs/ext4/indirect.c b/fs/ext4/indirect.c > index 3027fa6..798f341 100644 > --- a/fs/ext4/indirect.c > +++ b/fs/ext4/indirect.c > @@ -716,14 +716,22 @@ retry: > NULL, NULL, 0); > inode_dio_end(inode); > } else { > + ssize_t ret_saved = 0; > + > locked: > - if (IS_DAX(inode)) > + if (IS_DAX(inode)) { > ret = dax_do_io(iocb, inode, iter, offset, > ext4_dio_get_block, NULL, DIO_LOCKING); > - else > - ret = blockdev_direct_IO(iocb, inode, iter, offset, > - ext4_dio_get_block); > - > + if (ret == -EIO && iov_iter_rw(iter) == WRITE) > + ret_saved = ret; > + else > + goto skip_dio; > + } > + ret = blockdev_direct_IO(iocb, inode, iter, offset, > + ext4_get_block); > + if (ret < 0 && ret_saved) > + ret = ret_saved; > +skip_dio: > if (unlikely(iov_iter_rw(iter) == WRITE && ret < 0)) { > loff_t isize = i_size_read(inode); > loff_t end = offset + count; > diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c > index dab84a2..27f07c2 100644 > --- a/fs/ext4/inode.c > +++ b/fs/ext4/inode.c > @@ -3341,7 +3341,7 @@ static ssize_t ext4_ext_direct_IO(struct kiocb *iocb, struct iov_iter *iter, > { > struct file *file = iocb->ki_filp; > struct inode *inode = file->f_mapping->host; > - ssize_t ret; > + ssize_t ret, ret_saved = 0; > size_t count = iov_iter_count(iter); > int overwrite = 0; > get_block_t *get_block_func = NULL; > @@ -3401,15 +3401,22 @@ static ssize_t ext4_ext_direct_IO(struct kiocb *iocb, struct iov_iter *iter, > #ifdef CONFIG_EXT4_FS_ENCRYPTION > BUG_ON(ext4_encrypted_inode(inode) && S_ISREG(inode->i_mode)); > #endif > - if (IS_DAX(inode)) > + if (IS_DAX(inode)) { > ret = dax_do_io(iocb, inode, iter, offset, get_block_func, > ext4_end_io_dio, dio_flags); > - else > - ret = __blockdev_direct_IO(iocb, inode, > - inode->i_sb->s_bdev, iter, offset, > - get_block_func, > - ext4_end_io_dio, NULL, dio_flags); > + if (ret == -EIO && iov_iter_rw(iter) == WRITE) > + ret_saved = ret; > + else > + goto skip_dio; > + } > > + ret = __blockdev_direct_IO(iocb, inode, > + inode->i_sb->s_bdev, iter, offset, > + get_block_func, > + ext4_end_io_dio, NULL, dio_flags); > + if (ret < 0 && ret_saved) > + ret = ret_saved; > + skip_dio: > if (ret > 0 && !overwrite && ext4_test_inode_state(inode, > EXT4_STATE_DIO_UNWRITTEN)) { > int err; > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index d445a64..7cfcf86 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -1413,6 +1413,7 @@ xfs_vm_direct_IO( > dio_iodone_t *endio = NULL; > int flags = 0; > struct block_device *bdev; > + ssize_t ret, ret_saved = 0; > > if (iov_iter_rw(iter) == WRITE) { > endio = xfs_end_io_direct_write; > @@ -1420,13 +1421,22 @@ xfs_vm_direct_IO( > } > > if (IS_DAX(inode)) { > - return dax_do_io(iocb, inode, iter, offset, > + ret = dax_do_io(iocb, inode, iter, offset, > xfs_get_blocks_direct, endio, 0); > + if (ret == -EIO && iov_iter_rw(iter) == WRITE) > + ret_saved = ret; > + else > + return ret; > } > > bdev = xfs_find_bdev_for_inode(inode); > - return __blockdev_direct_IO(iocb, inode, bdev, iter, offset, > + ret = __blockdev_direct_IO(iocb, inode, bdev, iter, offset, > xfs_get_blocks_direct, endio, NULL, flags); > + > + if (ret < 0 && ret_saved) > + ret = ret_saved; > + > + return ret; > } > > /* From vishal.l.verma@intel.com Fri Apr 15 11:54:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 015127CA0 for ; Fri, 15 Apr 2016 11:54:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9D9F8304059 for ; Fri, 15 Apr 2016 09:54:52 -0700 (PDT) X-ASG-Debug-ID: 1460739291-04bdf011026070c0001-NocioJ Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by cuda.sgi.com with ESMTP id sYuXlanxq8a8aDQF for ; Fri, 15 Apr 2016 09:54:51 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Apparent-Source-IP: 134.134.136.20 X-ASG-Whitelist: Client Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga101.jf.intel.com with ESMTP; 15 Apr 2016 09:54:51 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,488,1455004800"; d="scan'208";a="785720859" Received: from fmsmsx106.amr.corp.intel.com ([10.18.124.204]) by orsmga003.jf.intel.com with ESMTP; 15 Apr 2016 09:54:50 -0700 Received: from fmsmsx118.amr.corp.intel.com (10.18.116.18) by FMSMSX106.amr.corp.intel.com (10.18.124.204) with Microsoft SMTP Server (TLS) id 14.3.248.2; Fri, 15 Apr 2016 09:54:50 -0700 Received: from fmsmsx113.amr.corp.intel.com ([169.254.13.211]) by fmsmsx118.amr.corp.intel.com ([10.18.116.18]) with mapi id 14.03.0248.002; Fri, 15 Apr 2016 09:54:49 -0700 From: "Verma, Vishal L" To: "jmoyer@redhat.com" CC: "Wilcox, Matthew R" , "linux-kernel@vger.kernel.org" , "linux-block@vger.kernel.org" , "hch@infradead.org" , "linux-nvdimm@ml01.01.org" , "xfs@oss.sgi.com" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "akpm@linux-foundation.org" , "axboe@fb.com" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , "david@fromorbit.com" , "jack@suse.cz" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Thread-Topic: [PATCH v2 5/5] dax: handle media errors in dax_do_io X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Thread-Index: AQHRlzGOmdVyB28MyEyyQ/rUxU8Y+Z+Ltf8A Date: Fri, 15 Apr 2016 16:54:48 +0000 Message-ID: <1460739288.3012.3.camel@intel.com> References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.254.176.69] Content-Type: text/plain; charset="utf-8" Content-ID: <16063EC031B1C2489B91594D65C22F50@intel.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-Barracuda-Connect: mga02.intel.com[134.134.136.20] X-Barracuda-Start-Time: 1460739291 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 T24gRnJpLCAyMDE2LTA0LTE1IGF0IDEyOjExIC0wNDAwLCBKZWZmIE1veWVyIHdyb3RlOg0KPiBW aXNoYWwgVmVybWEgPHZpc2hhbC5sLnZlcm1hQGludGVsLmNvbT4gd3JpdGVzOg0KPiANCj4gPiAN Cj4gPiBkYXhfZG9faW8gKGNhbGxlZCBmb3IgcmVhZCgpIG9yIHdyaXRlKCkgZm9yIGEgZGF4IGZp bGUgc3lzdGVtKSBtYXkNCj4gPiBmYWlsDQo+ID4gaW4gdGhlIHByZXNlbmNlIG9mIGJhZCBibG9j a3Mgb3IgbWVkaWEgZXJyb3JzLiBTaW5jZSB3ZSBleHBlY3QgdGhhdA0KPiA+IGENCj4gPiB3cml0 ZSBzaG91bGQgY2xlYXIgbWVkaWEgZXJyb3JzIG9uIG52ZGltbXMsIG1ha2UgZGF4X2RvX2lvIGZh bGwNCj4gPiBiYWNrIHRvDQo+ID4gdGhlIGRpcmVjdF9JTyBwYXRoLCB3aGljaCB3aWxsIHNlbmQg ZG93biBhIGJpbyB0byB0aGUgZHJpdmVyLCB3aGljaA0KPiA+IGNhbg0KPiA+IHRoZW4gYXR0ZW1w dCB0byBjbGVhciB0aGUgZXJyb3IuDQo+IFtzbmlwXQ0KPiANCj4gPiANCj4gPiArCWlmIChJU19E QVgoaW5vZGUpKSB7DQo+ID4gKwkJcmV0ID0gZGF4X2RvX2lvKGlvY2IsIGlub2RlLCBpdGVyLCBv ZmZzZXQsDQo+ID4gYmxrZGV2X2dldF9ibG9jaywNCj4gPiDCoAkJCQlOVUxMLCBESU9fU0tJUF9E SU9fQ09VTlQpOw0KPiA+IC0JcmV0dXJuIF9fYmxvY2tkZXZfZGlyZWN0X0lPKGlvY2IsIGlub2Rl LCBJX0JERVYoaW5vZGUpLA0KPiA+IGl0ZXIsIG9mZnNldCwNCj4gPiArCQlpZiAocmV0ID09IC1F SU8gJiYgKGlvdl9pdGVyX3J3KGl0ZXIpID09IFdSSVRFKSkNCj4gPiArCQkJcmV0X3NhdmVkID0g cmV0Ow0KPiA+ICsJCWVsc2UNCj4gPiArCQkJcmV0dXJuIHJldDsNCj4gPiArCX0NCj4gPiArDQo+ ID4gKwlyZXQgPSBfX2Jsb2NrZGV2X2RpcmVjdF9JTyhpb2NiLCBpbm9kZSwgSV9CREVWKGlub2Rl KSwNCj4gPiBpdGVyLCBvZmZzZXQsDQo+ID4gwqAJCQkJwqDCoMKgwqBibGtkZXZfZ2V0X2Jsb2Nr LCBOVUxMLCBOVUxMLA0KPiA+IMKgCQkJCcKgwqDCoMKgRElPX1NLSVBfRElPX0NPVU5UKTsNCj4g PiArCWlmIChyZXQgPCAwICYmIHJldF9zYXZlZCkNCj4gPiArCQlyZXR1cm4gcmV0X3NhdmVkOw0K PiA+ICsNCj4gSG1tLCBkaWQgeW91IGp1c3QgYnJlYWsgYXN5bmMgRElPP8KgwqBJIHRoaW5rIHlv dSBkaWQhwqDCoDopDQo+IF9fYmxvY2tkZXZfZGlyZWN0X0lPIGNhbiByZXR1cm4gLUVJT0NCUVVF VUVELCBhbmQgeW91J3ZlIG5vdyB0dXJuZWQNCj4gdGhhdA0KPiBpbnRvIC1FSU8uwqDCoFJlYWxs eSwgSSBkb24ndCBzZWUgYSByZWFzb24gdG8gc2F2ZSB0aGF0IGZpcnN0DQo+IC1FSU8uwqDCoFRo ZQ0KPiBzYW1lIGFwcGxpZXMgdG8gYWxsIGluc3RhbmNlcyBpbiB0aGlzIHBhdGNoLg0KDQpUaGUg cmVhc29uIEkgc2F2ZWQgaXQgd2FzIGlmIF9fYmxvY2tkZXZfZGlyZWN0X0lPIGZhaWxzIGZvciBz b21lDQpyZWFzb24sIHdlIHNob3VsZCByZXR1cm4gdGhlIG9yaWdpbmFsIGNhdXNlIG8gdGhlIGVy cm9yLCB3aGljaCB3YXMgYW4NCkVJTy4uIGkuZS4gd2Ugc2hvdWxkbid0IGJlIGhpZGluZyB0aGUg RUlPIGlmIHRoZSBkaXJlY3RfSU8gZmFpbHMgd2l0aA0Kc29tZXRoaW5nIGVsc2UuLg0KQnV0LCBo b3cgZG9lcyBfRUlPQ0JRVUVVRUQgd29yaz8gTWF5YmUgd2UgbmVlZCBhbiBleGNlcHRpb24gZm9y IGl0P8KgDQoNClRoYW5rcywNCgktVmlzaGFs From jmoyer@redhat.com Fri Apr 15 12:11:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A6CF77CA0 for ; Fri, 15 Apr 2016 12:11:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5B0AA8F8037 for ; Fri, 15 Apr 2016 10:11:21 -0700 (PDT) X-ASG-Debug-ID: 1460740280-04cbb02e1b30c700001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id OTUXB4wFrCfomNNS (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 10:11:21 -0700 (PDT) X-Barracuda-Envelope-From: jmoyer@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 12A2F7F6CF; Fri, 15 Apr 2016 17:11:20 +0000 (UTC) Received: from segfault.boston.devel.redhat.com (segfault.boston.devel.redhat.com [10.19.60.26]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FHBH8W007840 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Fri, 15 Apr 2016 13:11:18 -0400 From: Jeff Moyer To: "Verma\, Vishal L" Cc: "Wilcox\, Matthew R" , "linux-kernel\@vger.kernel.org" , "linux-block\@vger.kernel.org" , "hch\@infradead.org" , "linux-nvdimm\@ml01.01.org" , "xfs\@oss.sgi.com" , "linux-mm\@kvack.org" , "viro\@zeniv.linux.org.uk" , "akpm\@linux-foundation.org" , "axboe\@fb.com" , "linux-fsdevel\@vger.kernel.org" , "linux-ext4\@vger.kernel.org" , "david\@fromorbit.com" , "jack\@suse.cz" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <1460739288.3012.3.camel@intel.com> X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io X-PGP-KeyID: 1F78E1B4 X-PGP-CertKey: F6FE 280D 8293 F72C 65FD 5A58 1FF8 A7CA 1F78 E1B4 X-PCLoadLetter: What the f**k does that mean? Date: Fri, 15 Apr 2016 13:11:17 -0400 In-Reply-To: <1460739288.3012.3.camel@intel.com> (Vishal L. Verma's message of "Fri, 15 Apr 2016 16:54:48 +0000") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable 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: 1460740281 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 "Verma, Vishal L" writes: > On Fri, 2016-04-15 at 12:11 -0400, Jeff Moyer wrote: >> Vishal Verma writes: >> > + if (IS_DAX(inode)) { >> > + ret =3D dax_do_io(iocb, inode, iter, offset, >> > blkdev_get_block, >> > =C2=A0 NULL, DIO_SKIP_DIO_COUNT); >> > - return __blockdev_direct_IO(iocb, inode, I_BDEV(inode), >> > iter, offset, >> > + if (ret =3D=3D -EIO && (iov_iter_rw(iter) =3D=3D WRITE)) >> > + ret_saved =3D ret; >> > + else >> > + return ret; >> > + } >> > + >> > + ret =3D __blockdev_direct_IO(iocb, inode, I_BDEV(inode), >> > iter, offset, >> > =C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0blkdev_get_block, NULL, NULL, >> > =C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0DIO_SKIP_DIO_COUNT); >> > + if (ret < 0 && ret_saved) >> > + return ret_saved; >> > + >> Hmm, did you just break async DIO?=C2=A0=C2=A0I think you did!=C2=A0=C2= =A0:) >> __blockdev_direct_IO can return -EIOCBQUEUED, and you've now turned >> that >> into -EIO.=C2=A0=C2=A0Really, I don't see a reason to save that first >> -EIO.=C2=A0=C2=A0The >> same applies to all instances in this patch. > > The reason I saved it was if __blockdev_direct_IO fails for some > reason, we should return the original cause o the error, which was an > EIO.. i.e. we shouldn't be hiding the EIO if the direct_IO fails with > something else.. OK. > But, how does _EIOCBQUEUED work? Maybe we need an exception for it? For async direct I/O, only the setup phase of the I/O is performed and then we return to the caller. -EIOCBQUEUED signifies this. You're heading towards code that looks like this: if (IS_DAX(inode)) { ret =3D dax_do_io(iocb, inode, iter, offset, blkdev_get_blo= ck, NULL, DIO_SKIP_DIO_COUNT); if (ret =3D=3D -EIO && (iov_iter_rw(iter) =3D=3D WRITE)) ret_saved =3D ret; else return ret; } ret =3D __blockdev_direct_IO(iocb, inode, I_BDEV(inode), iter, offs= et, blkdev_get_block, NULL, NULL, DIO_SKIP_DIO_COUNT); if (ret < 0 && ret !=3D -EIOCBQUEUED && ret_saved) return ret_saved; There's a lot of special casing here, so you might consider adding comments. Cheers, Jeff From vishal.l.verma@intel.com Fri Apr 15 12:37:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BE0137CA2 for ; Fri, 15 Apr 2016 12:37:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 205ADAC001 for ; Fri, 15 Apr 2016 10:37:05 -0700 (PDT) X-ASG-Debug-ID: 1460741824-04cb6c245f639fe0001-NocioJ Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by cuda.sgi.com with ESMTP id cYwf8tfJO31jiyv3 for ; Fri, 15 Apr 2016 10:37:04 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Apparent-Source-IP: 134.134.136.65 X-ASG-Whitelist: Client Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga103.jf.intel.com with ESMTP; 15 Apr 2016 10:37:04 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,488,1455004800"; d="scan'208";a="85932641" Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by fmsmga004.fm.intel.com with ESMTP; 15 Apr 2016 10:37:03 -0700 Received: from fmsmsx112.amr.corp.intel.com (10.18.116.6) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.248.2; Fri, 15 Apr 2016 10:37:03 -0700 Received: from fmsmsx113.amr.corp.intel.com ([169.254.13.211]) by FMSMSX112.amr.corp.intel.com ([169.254.5.173]) with mapi id 14.03.0248.002; Fri, 15 Apr 2016 10:37:02 -0700 From: "Verma, Vishal L" To: "jmoyer@redhat.com" CC: "linux-kernel@vger.kernel.org" , "linux-block@vger.kernel.org" , "hch@infradead.org" , "xfs@oss.sgi.com" , "linux-nvdimm@ml01.01.org" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "akpm@linux-foundation.org" , "axboe@fb.com" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" , "david@fromorbit.com" , "jack@suse.cz" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Thread-Topic: [PATCH v2 5/5] dax: handle media errors in dax_do_io X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Thread-Index: AQHRlznSmdVyB28MyEyyQ/rUxU8Y+Z+LwbqA Date: Fri, 15 Apr 2016 17:37:02 +0000 Message-ID: <1460741821.3012.11.camel@intel.com> References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <1460739288.3012.3.camel@intel.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.254.176.69] Content-Type: text/plain; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-Barracuda-Connect: mga03.intel.com[134.134.136.65] X-Barracuda-Start-Time: 1460741824 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 T24gRnJpLCAyMDE2LTA0LTE1IGF0IDEzOjExIC0wNDAwLCBKZWZmIE1veWVyIHdyb3RlOg0KPiAi VmVybWEsIFZpc2hhbCBMIiA8dmlzaGFsLmwudmVybWFAaW50ZWwuY29tPiB3cml0ZXM6DQo+IA0K PiA+IA0KPiA+IE9uIEZyaSwgMjAxNi0wNC0xNSBhdCAxMjoxMSAtMDQwMCwgSmVmZiBNb3llciB3 cm90ZToNCj4gPiA+IA0KPiA+ID4gVmlzaGFsIFZlcm1hIDx2aXNoYWwubC52ZXJtYUBpbnRlbC5j b20+IHdyaXRlczoNCj4gPiA+ID4gDQo+ID4gPiA+ICsJaWYgKElTX0RBWChpbm9kZSkpIHsNCj4g PiA+ID4gKwkJcmV0ID0gZGF4X2RvX2lvKGlvY2IsIGlub2RlLCBpdGVyLCBvZmZzZXQsDQo+ID4g PiA+IGJsa2Rldl9nZXRfYmxvY2ssDQo+ID4gPiA+IMKgCQkJCU5VTEwsIERJT19TS0lQX0RJT19D T1VOVCk7DQo+ID4gPiA+IC0JcmV0dXJuIF9fYmxvY2tkZXZfZGlyZWN0X0lPKGlvY2IsIGlub2Rl LA0KPiA+ID4gPiBJX0JERVYoaW5vZGUpLA0KPiA+ID4gPiBpdGVyLCBvZmZzZXQsDQo+ID4gPiA+ ICsJCWlmIChyZXQgPT0gLUVJTyAmJiAoaW92X2l0ZXJfcncoaXRlcikgPT0NCj4gPiA+ID4gV1JJ VEUpKQ0KPiA+ID4gPiArCQkJcmV0X3NhdmVkID0gcmV0Ow0KPiA+ID4gPiArCQllbHNlDQo+ID4g PiA+ICsJCQlyZXR1cm4gcmV0Ow0KPiA+ID4gPiArCX0NCj4gPiA+ID4gKw0KPiA+ID4gPiArCXJl dCA9IF9fYmxvY2tkZXZfZGlyZWN0X0lPKGlvY2IsIGlub2RlLCBJX0JERVYoaW5vZGUpLA0KPiA+ ID4gPiBpdGVyLCBvZmZzZXQsDQo+ID4gPiA+IMKgCQkJCcKgwqDCoMKgYmxrZGV2X2dldF9ibG9j aywgTlVMTCwNCj4gPiA+ID4gTlVMTCwNCj4gPiA+ID4gwqAJCQkJwqDCoMKgwqBESU9fU0tJUF9E SU9fQ09VTlQpOw0KPiA+ID4gPiArCWlmIChyZXQgPCAwICYmIHJldF9zYXZlZCkNCj4gPiA+ID4g KwkJcmV0dXJuIHJldF9zYXZlZDsNCj4gPiA+ID4gKw0KPiA+ID4gSG1tLCBkaWQgeW91IGp1c3Qg YnJlYWsgYXN5bmMgRElPP8KgwqBJIHRoaW5rIHlvdSBkaWQhwqDCoDopDQo+ID4gPiBfX2Jsb2Nr ZGV2X2RpcmVjdF9JTyBjYW4gcmV0dXJuIC1FSU9DQlFVRVVFRCwgYW5kIHlvdSd2ZSBub3cNCj4g PiA+IHR1cm5lZA0KPiA+ID4gdGhhdA0KPiA+ID4gaW50byAtRUlPLsKgwqBSZWFsbHksIEkgZG9u J3Qgc2VlIGEgcmVhc29uIHRvIHNhdmUgdGhhdCBmaXJzdA0KPiA+ID4gLUVJTy7CoMKgVGhlDQo+ ID4gPiBzYW1lIGFwcGxpZXMgdG8gYWxsIGluc3RhbmNlcyBpbiB0aGlzIHBhdGNoLg0KPiA+IFRo ZSByZWFzb24gSSBzYXZlZCBpdCB3YXMgaWYgX19ibG9ja2Rldl9kaXJlY3RfSU8gZmFpbHMgZm9y IHNvbWUNCj4gPiByZWFzb24sIHdlIHNob3VsZCByZXR1cm4gdGhlIG9yaWdpbmFsIGNhdXNlIG8g dGhlIGVycm9yLCB3aGljaCB3YXMNCj4gPiBhbg0KPiA+IEVJTy4uIGkuZS4gd2Ugc2hvdWxkbid0 IGJlIGhpZGluZyB0aGUgRUlPIGlmIHRoZSBkaXJlY3RfSU8gZmFpbHMNCj4gPiB3aXRoDQo+ID4g c29tZXRoaW5nIGVsc2UuLg0KPiBPSy4NCj4gDQo+ID4gDQo+ID4gQnV0LCBob3cgZG9lcyBfRUlP Q0JRVUVVRUQgd29yaz8gTWF5YmUgd2UgbmVlZCBhbiBleGNlcHRpb24gZm9yIGl0Pw0KPiBGb3Ig YXN5bmMgZGlyZWN0IEkvTywgb25seSB0aGUgc2V0dXAgcGhhc2Ugb2YgdGhlIEkvTyBpcyBwZXJm b3JtZWQNCj4gYW5kDQo+IHRoZW4gd2UgcmV0dXJuIHRvIHRoZSBjYWxsZXIuwqDCoC1FSU9DQlFV RVVFRCBzaWduaWZpZXMgdGhpcy4NCj4gDQo+IFlvdSdyZSBoZWFkaW5nIHRvd2FyZHMgY29kZSB0 aGF0IGxvb2tzIGxpa2UgdGhpczoNCj4gDQo+IMKgwqDCoMKgwqDCoMKgwqBpZiAoSVNfREFYKGlu b2RlKSkgew0KPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldCA9IGRheF9kb19p byhpb2NiLCBpbm9kZSwgaXRlciwgb2Zmc2V0LA0KPiBibGtkZXZfZ2V0X2Jsb2NrLA0KPiDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgTlVMTCwgRElPX1NLSVBfRElPX0NPVU5UKTsNCj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBpZiAocmV0ID09IC1FSU8gJiYgKGlvdl9pdGVyX3J3KGl0ZXIpID09IFdSSVRFKSkN Cj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0X3Nh dmVkID0gcmV0Ow0KPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UNCj4gwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIHJldDsN Cj4gwqDCoMKgwqDCoMKgwqDCoH0NCj4gDQo+IMKgwqDCoMKgwqDCoMKgwqByZXQgPSBfX2Jsb2Nr ZGV2X2RpcmVjdF9JTyhpb2NiLCBpbm9kZSwgSV9CREVWKGlub2RlKSwgaXRlciwNCj4gb2Zmc2V0 LA0KPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBibGtkZXZfZ2V0X2Jsb2NrLCBOVUxMLCBOVUxMLA0KPiDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBESU9fU0tJUF9ESU9fQ09VTlQpOw0KPiDCoMKgwqDCoMKgwqDCoMKgaWYgKHJl dCA8IDAgJiYgcmV0ICE9IC1FSU9DQlFVRVVFRCAmJiByZXRfc2F2ZWQpDQo+IMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIHJldF9zYXZlZDsNCj4gDQo+IFRoZXJlJ3MgYSBs b3Qgb2Ygc3BlY2lhbCBjYXNpbmcgaGVyZSwgc28geW91IG1pZ2h0IGNvbnNpZGVyIGFkZGluZw0K PiBjb21tZW50cy4NCg0KQ29ycmVjdCAtIG1heWJlIHdlIHNob3VsZCByZWNvbnNpZGVyIHdyYXBw ZXItaXppbmcgdGhpcz8gOikNCg0KVGhhbmtzIGZvciB0aGUgZXhwbGFuYXRpb24gYW5kIGZvciBj YXRjaGluZyB0aGlzLiBJJ2xsIGZpeCBpdCBmb3IgdGhlDQpuZXh0IHJldmlzaW9uLg0KDQo+IA0K PiBDaGVlcnMsDQo+IEplZmY= From dan.j.williams@intel.com Fri Apr 15 12:57:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E62467CA0 for ; Fri, 15 Apr 2016 12:57:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id AE9A18F8033 for ; Fri, 15 Apr 2016 10:57:33 -0700 (PDT) X-ASG-Debug-ID: 1460743048-04cb6c246263ae30001-NocioJ Received: from mail-ob0-f177.google.com (mail-ob0-f177.google.com [209.85.214.177]) by cuda.sgi.com with ESMTP id kcGRfE3u9K2zrCgJ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 15 Apr 2016 10:57:28 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Apparent-Source-IP: 209.85.214.177 Received: by mail-ob0-f177.google.com with SMTP id tz8so68273370obc.0 for ; Fri, 15 Apr 2016 10:57:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=oTbrV0ZF+i7x+UFhUzBmVLPejEwXWxrjpOdmn2HFK/4=; b=oZeNNp/L0/vviLWBaSqHslAfO/C6qF5MXjeGH9N+RjHyBQ6QJ5z/Ch5nEftU/n8NyI UGKsd31LL8iku42c9SK35yWEhCMX0ziUZNs691gn/DnTodbw6h7h9wir55KM9LPcDBt5 xhnLo8FHzfY7uFANoxI5I2c/xxCbe/ePIfsn0vw4tidTQjP9VscEdgR/GNfyQHX1BLIV 53h3GaGOkdXnMJ180++H30FGQoCq3Mgh8EiE018QEeJ+Kv03NgLmANAiHebflAmKGDh5 UuyyExJF8wjpaj36mdj6r8uId9jAjYm9h4iH1CTKNTz1SRa6RfXl0BsNWfs+9qPko33p AzLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=oTbrV0ZF+i7x+UFhUzBmVLPejEwXWxrjpOdmn2HFK/4=; b=lonitKUxg7LRy/0s9WjqUgh3nkXiSZeKDaXfZmgo1Ubf7wbo2zuGS5MUx+stMcyj5y HerOufTs6h0MOf856DvGJlEssExFyZ6omA5Odz7m3zs5C6U/FiGbDwErRnaY2TGGFYwv EIdXP/UB2mLKXhbCuG5WA7LPBpGxpFogJPFnwu97xIPrmu7HZltQc0DZgrApfgXK3r1X 7WWiojlHy+X/5T95HeIriCxQioEjbUChDxxqd6wGTScNuTHPDkLwSHBejmY0F9dz7o5u XQzMFaXgKDBQDnrHQOp4bXvf6QasqhxAQJSAO6IqidBzSfbz4ZWkA1JjpCcIwXtX6jmN 3BYQ== X-Gm-Message-State: AOPr4FUrVN/oYXh8prxCAb1E5iU7DNbMA6C4HP4J8KzbPfoyoUABlDWPZpuq/oZjXkXDWtkUrq1+AdsMnGpMSSlz MIME-Version: 1.0 X-Received: by 10.182.104.194 with SMTP id gg2mr11080517obb.5.1460743047813; Fri, 15 Apr 2016 10:57:27 -0700 (PDT) Received: by 10.157.38.146 with HTTP; Fri, 15 Apr 2016 10:57:27 -0700 (PDT) In-Reply-To: <1460741821.3012.11.camel@intel.com> References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <1460739288.3012.3.camel@intel.com> <1460741821.3012.11.camel@intel.com> Date: Fri, 15 Apr 2016 10:57:27 -0700 Message-ID: Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io From: Dan Williams X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io To: "Verma, Vishal L" Cc: "jmoyer@redhat.com" , "hch@infradead.org" , "jack@suse.cz" , "axboe@fb.com" , "linux-nvdimm@ml01.01.org" , "david@fromorbit.com" , "linux-kernel@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-block@vger.kernel.org" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "linux-fsdevel@vger.kernel.org" , "akpm@linux-foundation.org" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ob0-f177.google.com[209.85.214.177] X-Barracuda-Start-Time: 1460743048 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28766 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain On Fri, Apr 15, 2016 at 10:37 AM, Verma, Vishal L wrote: > On Fri, 2016-04-15 at 13:11 -0400, Jeff Moyer wrote: [..] >> > >> > But, how does _EIOCBQUEUED work? Maybe we need an exception for it? >> For async direct I/O, only the setup phase of the I/O is performed >> and >> then we return to the caller. -EIOCBQUEUED signifies this. >> >> You're heading towards code that looks like this: >> >> if (IS_DAX(inode)) { >> ret = dax_do_io(iocb, inode, iter, offset, >> blkdev_get_block, >> NULL, DIO_SKIP_DIO_COUNT); >> if (ret == -EIO && (iov_iter_rw(iter) == WRITE)) >> ret_saved = ret; >> else >> return ret; >> } >> >> ret = __blockdev_direct_IO(iocb, inode, I_BDEV(inode), iter, >> offset, >> blkdev_get_block, NULL, NULL, >> DIO_SKIP_DIO_COUNT); >> if (ret < 0 && ret != -EIOCBQUEUED && ret_saved) >> return ret_saved; >> >> There's a lot of special casing here, so you might consider adding >> comments. > > Correct - maybe we should reconsider wrapper-izing this? :) Another option is just to skip dax_do_io() and this special casing fallback entirely if errors are present. I.e. only attempt dax_do_io when: IS_DAX() && gendisk->bb && bb->count == 0. From jmoyer@redhat.com Fri Apr 15 13:06:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 09BE77CA0 for ; Fri, 15 Apr 2016 13:06:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CEDF0304059 for ; Fri, 15 Apr 2016 11:06:33 -0700 (PDT) X-ASG-Debug-ID: 1460743586-04cbb02e1b310200001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id q1TwQU1CtTS2UM7u (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 11:06:27 -0700 (PDT) X-Barracuda-Envelope-From: jmoyer@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5B2BDC062C93; Fri, 15 Apr 2016 18:06:26 +0000 (UTC) Received: from segfault.boston.devel.redhat.com (segfault.boston.devel.redhat.com [10.19.60.26]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FI6Oei018193 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Fri, 15 Apr 2016 14:06:24 -0400 From: Jeff Moyer To: Dan Williams Cc: "Verma\, Vishal L" , "hch\@infradead.org" , "jack\@suse.cz" , "axboe\@fb.com" , "linux-nvdimm\@ml01.01.org" , "david\@fromorbit.com" , "linux-kernel\@vger.kernel.org" , "xfs\@oss.sgi.com" , "linux-block\@vger.kernel.org" , "linux-mm\@kvack.org" , "viro\@zeniv.linux.org.uk" , "linux-fsdevel\@vger.kernel.org" , "akpm\@linux-foundation.org" , "linux-ext4\@vger.kernel.org" , "Wilcox\, Matthew R" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <1460739288.3012.3.camel@intel.com> <1460741821.3012.11.camel@intel.com> X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io X-PGP-KeyID: 1F78E1B4 X-PGP-CertKey: F6FE 280D 8293 F72C 65FD 5A58 1FF8 A7CA 1F78 E1B4 X-PCLoadLetter: What the f**k does that mean? Date: Fri, 15 Apr 2016 14:06:23 -0400 In-Reply-To: (Dan Williams's message of "Fri, 15 Apr 2016 10:57:27 -0700") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain 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: 1460743587 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Dan Williams writes: >>> There's a lot of special casing here, so you might consider adding >>> comments. >> >> Correct - maybe we should reconsider wrapper-izing this? :) > > Another option is just to skip dax_do_io() and this special casing > fallback entirely if errors are present. I.e. only attempt dax_do_io > when: IS_DAX() && gendisk->bb && bb->count == 0. So, if there's an error anywhere on the device, penalize all I/O (not just writes, and not just on sectors that are bad)? I'm not sure that's a great plan, either. -Jeff From BATV+f27270e1444f8cca30dd+4618+infradead.org+hch@bombadil.srs.infradead.org Fri Apr 15 13:08:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B19077CA6 for ; Fri, 15 Apr 2016 13:08:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 75E5B304059 for ; Fri, 15 Apr 2016 11:08:23 -0700 (PDT) X-ASG-Debug-ID: 1460743700-04cbb02e1a310370001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id AybLy15ZcWRBShGz (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 15 Apr 2016 11:08:20 -0700 (PDT) X-Barracuda-Envelope-From: BATV+f27270e1444f8cca30dd+4618+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ar8AG-0006hv-2r; Fri, 15 Apr 2016 18:08:20 +0000 Date: Fri, 15 Apr 2016 11:08:20 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: buffer ->bi_end_io function requires irq-safe lock Message-ID: <20160415180820.GA20260@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: buffer ->bi_end_io function requires irq-safe lock References: <1460736519-39428-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460736519-39428-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1460743700 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28766 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS How about just doing a cmpxchg on bi_error? From dan.j.williams@intel.com Fri Apr 15 13:17:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 993A67CA0 for ; Fri, 15 Apr 2016 13:17:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6AB38304059 for ; Fri, 15 Apr 2016 11:17:42 -0700 (PDT) X-ASG-Debug-ID: 1460744260-04cbb02e1b310ec0001-NocioJ Received: from mail-ob0-f181.google.com (mail-ob0-f181.google.com [209.85.214.181]) by cuda.sgi.com with ESMTP id j6TldZjUOsHDPKwU (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 15 Apr 2016 11:17:41 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Apparent-Source-IP: 209.85.214.181 Received: by mail-ob0-f181.google.com with SMTP id bg3so68579185obb.1 for ; Fri, 15 Apr 2016 11:17:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=Vv/eF/r9plR/v7wjPrn9RxaKU61ZtDPrLf2WyniEYDI=; b=kBl5aBXs1olKeKMqUR9Nff2JTM+5CdRc9AzhHi5X9Uc9VnGj4zSsQpTL2r7g0h3A65 VKPmYljC6c+sLpxYf3+HrdpMxuvb7nzlgb0IPx4Kne9XacR/sx1NtI8MSL8uwEx+ztAe a+AOAqB7BSyiAxd91CWr2HD4WoG8HX9tFAsyX28qFVYyqZVWwT7SffkGQiHyyZyM0phU SbfJaZE3T2i12omn5AriU4wAUcA7YqG/9XjzVKQuvy47+rEzqAJTAEpfeVoFtQuI8dsI o7IaRfCPE96ZBvo34DadFl5762hI3VSqssfAvAxjBTi23o3jyQ/jMqJIS45bslueQLpa z2Jg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=Vv/eF/r9plR/v7wjPrn9RxaKU61ZtDPrLf2WyniEYDI=; b=THNLBRO8SiT0QuBakGGayFUIIou/4YrxnZmqyugBypPkFP7pU2w0hvhXu92dDICNHi CQCiplo+N1jF5P2X0it3XREabItQP19WpDrrHlh0AzFYikQE0G2cuEFuBL9wgFQoHqMc bUq8qUuNQmjx8g3XzWx2begjCJLj2R5urcu5XH6mq30FLF7LAecf4UYZtEDvrIeXFz0x hSOpmp5mOQ26P4g26Tg81pS0WkEO2v6rM8KtEnBhaLkA6J2BL7Nhg/CQtKupfpeVC1Lb y5Yl2iDpXLG56tvE9iHfFoXiR6Q6RdiNoiyPzX3+dS38TuJVk075LjPenERBKVYU7WHL LUJQ== X-Gm-Message-State: AOPr4FWfpWg9IFRFPBF2cIShRiyP18UjeaF6SsKd32hG77J1NvHpjPhmJsMk/8kuVTRT+3+Uyi6kayoD+p4gbT56 MIME-Version: 1.0 X-Received: by 10.60.233.5 with SMTP id ts5mr11307913oec.67.1460744260117; Fri, 15 Apr 2016 11:17:40 -0700 (PDT) Received: by 10.157.38.146 with HTTP; Fri, 15 Apr 2016 11:17:39 -0700 (PDT) In-Reply-To: References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <1460739288.3012.3.camel@intel.com> <1460741821.3012.11.camel@intel.com> Date: Fri, 15 Apr 2016 11:17:39 -0700 Message-ID: Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io From: Dan Williams X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io To: Jeff Moyer Cc: "Verma, Vishal L" , "hch@infradead.org" , "jack@suse.cz" , "axboe@fb.com" , "linux-nvdimm@ml01.01.org" , "david@fromorbit.com" , "linux-kernel@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-block@vger.kernel.org" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "linux-fsdevel@vger.kernel.org" , "akpm@linux-foundation.org" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ob0-f181.google.com[209.85.214.181] X-Barracuda-Start-Time: 1460744260 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28766 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Fri, Apr 15, 2016 at 11:06 AM, Jeff Moyer wrote: > Dan Williams writes: > >>>> There's a lot of special casing here, so you might consider adding >>>> comments. >>> >>> Correct - maybe we should reconsider wrapper-izing this? :) >> >> Another option is just to skip dax_do_io() and this special casing >> fallback entirely if errors are present. I.e. only attempt dax_do_io >> when: IS_DAX() && gendisk->bb && bb->count == 0. > > So, if there's an error anywhere on the device, penalize all I/O (not > just writes, and not just on sectors that are bad)? I'm not sure that's > a great plan, either. > If errors are rare how much are we actually losing in practice? Moreover, we're going to do the full badblocks lookup anyway when we call ->direct_access(). If we had that information earlier we can avoid this fallback dance. From jmoyer@redhat.com Fri Apr 15 13:24:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 158507CA0 for ; Fri, 15 Apr 2016 13:24:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8E401AC001 for ; Fri, 15 Apr 2016 11:24:14 -0700 (PDT) X-ASG-Debug-ID: 1460744653-04bdf0110560c100001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 7v1QvMQDe8BkMXX8 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 11:24:13 -0700 (PDT) X-Barracuda-Envelope-From: jmoyer@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1B76D7F084; Fri, 15 Apr 2016 18:24:13 +0000 (UTC) Received: from segfault.boston.devel.redhat.com (segfault.boston.devel.redhat.com [10.19.60.26]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FIOAev008020 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Fri, 15 Apr 2016 14:24:11 -0400 From: Jeff Moyer To: Dan Williams Cc: "Verma\, Vishal L" , "hch\@infradead.org" , "jack\@suse.cz" , "axboe\@fb.com" , "linux-nvdimm\@ml01.01.org" , "david\@fromorbit.com" , "linux-kernel\@vger.kernel.org" , "xfs\@oss.sgi.com" , "linux-block\@vger.kernel.org" , "linux-mm\@kvack.org" , "viro\@zeniv.linux.org.uk" , "linux-fsdevel\@vger.kernel.org" , "akpm\@linux-foundation.org" , "linux-ext4\@vger.kernel.org" , "Wilcox\, Matthew R" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <1460739288.3012.3.camel@intel.com> <1460741821.3012.11.camel@intel.com> X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io X-PGP-KeyID: 1F78E1B4 X-PGP-CertKey: F6FE 280D 8293 F72C 65FD 5A58 1FF8 A7CA 1F78 E1B4 X-PCLoadLetter: What the f**k does that mean? Date: Fri, 15 Apr 2016 14:24:10 -0400 In-Reply-To: (Dan Williams's message of "Fri, 15 Apr 2016 11:17:39 -0700") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain 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: 1460744653 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Dan Williams writes: > On Fri, Apr 15, 2016 at 11:06 AM, Jeff Moyer wrote: >> Dan Williams writes: >> >>>>> There's a lot of special casing here, so you might consider adding >>>>> comments. >>>> >>>> Correct - maybe we should reconsider wrapper-izing this? :) >>> >>> Another option is just to skip dax_do_io() and this special casing >>> fallback entirely if errors are present. I.e. only attempt dax_do_io >>> when: IS_DAX() && gendisk->bb && bb->count == 0. >> >> So, if there's an error anywhere on the device, penalize all I/O (not >> just writes, and not just on sectors that are bad)? I'm not sure that's >> a great plan, either. >> > > If errors are rare how much are we actually losing in practice? How long is a piece of string? > Moreover, we're going to do the full badblocks lookup anyway when we > call ->direct_access(). If we had that information earlier we can > avoid this fallback dance. None of the proposed approaches looks clean to me. I'll go along with whatever you guys think is best. I am in favor of wrapping up all that duplicated code, though. Cheers, Jeff From bfoster@redhat.com Fri Apr 15 13:28:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 97B4C7CA0 for ; Fri, 15 Apr 2016 13:28:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5429B8F8033 for ; Fri, 15 Apr 2016 11:28:31 -0700 (PDT) X-ASG-Debug-ID: 1460744910-04bdf0110460c9c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id OABPTB1qpon8aHC3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 11:28:30 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3DC5DC01AA37; Fri, 15 Apr 2016 18:28:30 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-148.bos.redhat.com [10.18.41.148]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FISTH9030815; Fri, 15 Apr 2016 14:28:30 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 967471237F0; Fri, 15 Apr 2016 14:28:28 -0400 (EDT) Date: Fri, 15 Apr 2016 14:28:28 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: buffer ->bi_end_io function requires irq-safe lock Message-ID: <20160415182828.GA39792@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: buffer ->bi_end_io function requires irq-safe lock References: <1460736519-39428-1-git-send-email-bfoster@redhat.com> <20160415180820.GA20260@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160415180820.GA20260@infradead.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460744910 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Apr 15, 2016 at 11:08:20AM -0700, Christoph Hellwig wrote: > How about just doing a cmpxchg on bi_error? Hmm, good idea. Something like this I take it..? if (bio->bi_error) cmpxchg(&bp->b_io_error, 0, bio->bi_error); Brian From bfoster@redhat.com Fri Apr 15 13:43:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0C0267CA1 for ; Fri, 15 Apr 2016 13:43:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 671BAAC002 for ; Fri, 15 Apr 2016 11:43:13 -0700 (PDT) X-ASG-Debug-ID: 1460745791-04cb6c245f63e560001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id s6tCUs72hjNpTKMR (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 11:43:12 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 50026C062C94 for ; Fri, 15 Apr 2016 18:43:11 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-148.bos.redhat.com [10.18.41.148]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FIhBeO006868 for ; Fri, 15 Apr 2016 14:43:11 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 9A3921237F0; Fri, 15 Apr 2016 14:43:09 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2] xfs: buffer ->bi_end_io function requires irq-safe lock Date: Fri, 15 Apr 2016 14:43:09 -0400 X-ASG-Orig-Subj: [PATCH v2] xfs: buffer ->bi_end_io function requires irq-safe lock Message-Id: <1460745789-42073-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: 1460745792 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Reports have surfaced of a lockdep splat complaining about an irq-safe -> irq-unsafe locking order in the xfs_buf_bio_end_io() bio completion handler. This only occurs when I/O errors are present because bp->b_lock is only acquired in this context to protect setting an error on the buffer. The problem is that this lock can be acquired with the (request_queue) q->queue_lock held. See scsi_end_request() or ata_qc_schedule_eh(), for example. Replace the locked test/set of b_io_error with a cmpxchg() call. This eliminates the need for the lock and thus the lock ordering problem goes away. Signed-off-by: Brian Foster --- v2: - Use cmpxchg() instead of lock. [hch] v1: http://oss.sgi.com/pipermail/xfs/2016-April/048384.html fs/xfs/xfs_buf.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 9a2191b..e71cfbd 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1100,22 +1100,18 @@ xfs_bwrite( return error; } -STATIC void +static void xfs_buf_bio_end_io( struct bio *bio) { - xfs_buf_t *bp = (xfs_buf_t *)bio->bi_private; + struct xfs_buf *bp = (struct xfs_buf *)bio->bi_private; /* * don't overwrite existing errors - otherwise we can lose errors on * buffers that require multiple bios to complete. */ - if (bio->bi_error) { - spin_lock(&bp->b_lock); - if (!bp->b_io_error) - bp->b_io_error = bio->bi_error; - spin_unlock(&bp->b_lock); - } + if (bio->bi_error) + cmpxchg(&bp->b_io_error, 0, bio->bi_error); if (!bp->b_error && xfs_buf_is_vmapped(bp) && (bp->b_flags & XBF_READ)) invalidate_kernel_vmap_range(bp->b_addr, xfs_buf_vmap_len(bp)); -- 2.4.11 From dan.j.williams@intel.com Fri Apr 15 13:56:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 35E367CA2 for ; Fri, 15 Apr 2016 13:56:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7F7E3AC001 for ; Fri, 15 Apr 2016 11:56:23 -0700 (PDT) X-ASG-Debug-ID: 1460746581-04cbb02e1d313fa0001-NocioJ Received: from mail-oi0-f41.google.com (mail-oi0-f41.google.com [209.85.218.41]) by cuda.sgi.com with ESMTP id 8Q38gvsP70bCdeQu (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 15 Apr 2016 11:56:21 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Apparent-Source-IP: 209.85.218.41 Received: by mail-oi0-f41.google.com with SMTP id r78so1213959oie.0 for ; Fri, 15 Apr 2016 11:56:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=4UXOIgA15Dj0iBrT12T49T+xq0keZCAEg+1NEQH5DDc=; b=GjuRFuo5R+VFCO7s2W082B4nO84umWuM5utywYVGK1xsh4n4AKKJRWM5Om2Zoa5Oas 3kZY22POpxolwTHtDC5pUGDGfj8HzyZl9kdyPExjaiAHBpEJGo1KqWCywQvThixpRPH3 zWG0orP1AjnXXD5rOVobGsYYcxwOgHvmjaqvynAY/3nhqJBzhBcH3o4iAckPKjYS/RwZ A7qyvIDHvVkLRm8vtZl3QhsDL7glJR2qdSnboaL9ZdptRXV91KQOPokqlFU3l5Ya+DTl TEDX93icGFuG2mdJP3hZb8Gw21986VYx83BKZBkk7N07oc06DvAddIq7r5rLRb52jYSr xIYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=4UXOIgA15Dj0iBrT12T49T+xq0keZCAEg+1NEQH5DDc=; b=MOeIBo0Mp522xyNAIQ2SoJ2NF+t1bcZpVYWS/3oDBUDw2aCn6nTJZM4F2aaqhbkdGq vnTh5AMy5qExStIFM/JJKRPysRM4TrWFBFIWkf6Y8bBn7NBwbopzJN79BC1ECIRCvQdz T0m2ZdwPo7S0iSR/s88hPr5DD5NpxEwOWl99BTqSJnAhBwlW+TAqrQ9nCAsBZL8Je8yk hQv4d7JIJojNL+epYl1twoMO4IlwhhB0sMxeljpJIa47W+E41u85lIC5xFMY6VKFnRaH 8FaqLGaFNMu6LjCHka8fv3ngQU+MXRI/TQVp4L1UEDSMaTKC9BKHB8rRJdmYU1PlJ8LO BM3w== X-Gm-Message-State: AOPr4FWFfJ5MZBMCIIIhg4T1uZYGzqxFJO+jhLHfsFsD8r9tMy7spFzyeXKJu6YtAJ4d4aC+OoDxT/tXqLR8duXu MIME-Version: 1.0 X-Received: by 10.157.44.73 with SMTP id f67mr568295otb.155.1460746580807; Fri, 15 Apr 2016 11:56:20 -0700 (PDT) Received: by 10.157.38.146 with HTTP; Fri, 15 Apr 2016 11:56:20 -0700 (PDT) In-Reply-To: References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <1460739288.3012.3.camel@intel.com> <1460741821.3012.11.camel@intel.com> Date: Fri, 15 Apr 2016 11:56:20 -0700 Message-ID: Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io From: Dan Williams X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io To: Jeff Moyer Cc: "Verma, Vishal L" , "hch@infradead.org" , "jack@suse.cz" , "axboe@fb.com" , "linux-nvdimm@ml01.01.org" , "david@fromorbit.com" , "linux-kernel@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-block@vger.kernel.org" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "linux-fsdevel@vger.kernel.org" , "akpm@linux-foundation.org" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oi0-f41.google.com[209.85.218.41] X-Barracuda-Start-Time: 1460746581 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28767 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Fri, Apr 15, 2016 at 11:24 AM, Jeff Moyer wrote: >> Moreover, we're going to do the full badblocks lookup anyway when we >> call ->direct_access(). If we had that information earlier we can >> avoid this fallback dance. > > None of the proposed approaches looks clean to me. I'll go along with > whatever you guys think is best. I am in favor of wrapping up all that > duplicated code, though. Christoph originally pushed for open coding this fallback decision per-filesystem. I agree with you on the "none the above" options are clean. From mchristi@redhat.com Fri Apr 15 13:58:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 175D17CA2 for ; Fri, 15 Apr 2016 13:58:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D00DC8F8037 for ; Fri, 15 Apr 2016 11:58:27 -0700 (PDT) X-ASG-Debug-ID: 1460746702-04cb6c246463f620001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ggFLzHMEDPidGPBD (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 11:58:23 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D1AF66264A; Fri, 15 Apr 2016 18:58:21 +0000 (UTC) Received: from [10.10.53.120] (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FIwH8P020570; Fri, 15 Apr 2016 14:58:17 -0400 Subject: Re: [PATCH 41/42] block: do not use REQ_FLUSH for tracking flush support To: Juergen Gross , linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com X-ASG-Orig-Subj: Re: [PATCH 41/42] block: do not use REQ_FLUSH for tracking flush support References: <1460716802-2294-1-git-send-email-mchristi@redhat.com> <1460716802-2294-42-git-send-email-mchristi@redhat.com> <5710C77F.2000405@pfupf.net> From: Mike Christie Message-ID: <571139C9.8060405@redhat.com> Date: Fri, 15 Apr 2016 13:58:17 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <5710C77F.2000405@pfupf.net> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Fri, 15 Apr 2016 18:58:22 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460746703 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 04/15/2016 05:50 AM, Juergen Gross wrote: > On 15/04/16 12:40, mchristi@redhat.com wrote: >> From: Mike Christie >> >> The last patch added a REQ_OP_FLUSH for request_fn drivers >> and the next patch renames REQ_FLUSH to REQ_PREFLUSH which >> will be used by file systems and make_request_fn drivers so >> they can send a write/flush combo. >> >> This patch drops xen's use of REQ_FLUSH to track if it supports >> REQ_OP_FLUSH requests, so REQ_FLUSH can be deleted. >> >> v6: >> - Dropped parts of patch handled by Jens's QUEUE_FLAG_WC/FUA >> patches and modified patch to check feature_flush/fua bits. >> >> Signed-off-by: Mike Christie >> Reviewed-by: Hannes Reinecke >> --- >> drivers/block/xen-blkfront.c | 47 ++++++++++++++++++++++---------------------- >> 1 file changed, 24 insertions(+), 23 deletions(-) >> >> diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c >> index f01691a..d6429e7 100644 >> --- a/drivers/block/xen-blkfront.c >> +++ b/drivers/block/xen-blkfront.c > > ... > >> @@ -985,24 +981,22 @@ static int xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size, >> return 0; >> } >> >> -static const char *flush_info(unsigned int feature_flush) >> +static const char *flush_info(struct blkfront_info *info) >> { >> - switch (feature_flush & ((REQ_FLUSH | REQ_FUA))) { >> - case REQ_FLUSH|REQ_FUA: >> + if (info->feature_flush && info->feature_fua) >> return "barrier: enabled;"; >> - case REQ_FLUSH: >> + else if (info->feature_fua) > > Shouldn't this test feature_flush? > >> return "flush diskcache: enabled;"; >> - default: >> + else >> return "barrier or flush: disabled;"; >> - } >> } >> >> static void xlvbd_flush(struct blkfront_info *info) >> { >> - blk_queue_write_cache(info->rq, info->feature_flush & REQ_FLUSH, >> - info->feature_flush & REQ_FUA); >> + blk_queue_write_cache(info->rq, info->feature_flush ? true : false, >> + info->feature_flush ? true : false); > > And here the second test should be feature_fua? > You are right. Will fix up and resend. From joe@perches.com Fri Apr 15 14:09:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 13A167CA0 for ; Fri, 15 Apr 2016 14:09:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CAD178F8033 for ; Fri, 15 Apr 2016 12:09:13 -0700 (PDT) X-ASG-Debug-ID: 1460747350-04bdf0110360f770001-NocioJ Received: from smtprelay.hostedemail.com (smtprelay0082.hostedemail.com [216.40.44.82]) by cuda.sgi.com with ESMTP id UzDAa21CGQvL4Epl (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:09:11 -0700 (PDT) X-Barracuda-Envelope-From: joe@perches.com X-Barracuda-Apparent-Source-IP: 216.40.44.82 Received: from filter.hostedemail.com (unknown [216.40.38.60]) by smtprelay06.hostedemail.com (Postfix) with ESMTP id 6BD5A9EA21; Fri, 15 Apr 2016 19:09:09 +0000 (UTC) X-Session-Marker: 6A6F6540706572636865732E636F6D X-HE-Tag: flock64_32b9d53e9dc00 X-Filterd-Recvd-Size: 897 Received: from XPS-9350.home (unknown [71.118.176.190]) (Authenticated sender: joe@perches.com) by omf05.hostedemail.com (Postfix) with ESMTPA; Fri, 15 Apr 2016 19:09:08 +0000 (UTC) Message-ID: <1460747340.19090.42.camel@perches.com> Subject: xfs: compiler implementation dependent behavior? From: Joe Perches X-ASG-Orig-Subj: xfs: compiler implementation dependent behavior? To: Dave Chinner Cc: xfs@oss.sgi.com, LKML Date: Fri, 15 Apr 2016 12:09:00 -0700 Content-Type: text/plain; charset="ISO-8859-1" X-Mailer: Evolution 3.18.5.2-0ubuntu1 Mime-Version: 1.0 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: smtprelay0082.hostedemail.com[216.40.44.82] X-Barracuda-Start-Time: 1460747350 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28767 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header The value stored in *cycle in xlog_crack_grant_head_val in xfs_log_priv.h is compiler implementation dependent. Does it matter? static inline void xlog_crack_grant_head_val(int64_t val, int *cycle, int *space) { *cycle = val >> 32; *space = val & 0xffffffff; } From toshi.kani@hpe.com Fri Apr 15 14:10:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5D6C57CA0 for ; Fri, 15 Apr 2016 14:10:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id CFD12AC001 for ; Fri, 15 Apr 2016 12:10:26 -0700 (PDT) X-ASG-Debug-ID: 1460747423-04bdf0110460f8f0001-NocioJ Received: from g4t3426.houston.hp.com (g4t3426.houston.hp.com [15.201.208.54]) by cuda.sgi.com with ESMTP id fDlGNO9CnCsFER0P (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:10:24 -0700 (PDT) X-Barracuda-Envelope-From: toshi.kani@hpe.com X-Barracuda-Apparent-Source-IP: 15.201.208.54 Received: from g9t2301.houston.hp.com (g9t2301.houston.hp.com [16.216.185.78]) by g4t3426.houston.hp.com (Postfix) with ESMTP id 23CF548; Fri, 15 Apr 2016 19:10:23 +0000 (UTC) Received: from misato.fc.hp.com (misato.fc.hp.com [16.78.168.61]) by g9t2301.houston.hp.com (Postfix) with ESMTP id E040B4A; Fri, 15 Apr 2016 19:10:20 +0000 (UTC) Message-ID: <1460746909.4597.7.camel@hpe.com> Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io From: Toshi Kani X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io To: Dan Williams , Jeff Moyer Cc: "axboe@fb.com" , "jack@suse.cz" , "david@fromorbit.com" , "linux-kernel@vger.kernel.org" , "xfs@oss.sgi.com" , "hch@infradead.org" , "linux-mm@kvack.org" , "linux-block@vger.kernel.org" , "viro@zeniv.linux.org.uk" , "linux-nvdimm@ml01.01.org" , "linux-fsdevel@vger.kernel.org" , "akpm@linux-foundation.org" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" Date: Fri, 15 Apr 2016 13:01:49 -0600 In-Reply-To: References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <1460739288.3012.3.camel@intel.com> <1460741821.3012.11.camel@intel.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.18.5.2 (3.18.5.2-1.fc23) Mime-Version: 1.0 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: g4t3426.houston.hp.com[15.201.208.54] X-Barracuda-Start-Time: 1460747424 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28767 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, 2016-04-15 at 11:17 -0700, Dan Williams wrote: > On Fri, Apr 15, 2016 at 11:06 AM, Jeff Moyer wrote: > > > > Dan Williams writes: > >  > > > > > There's a lot of special casing here, so you might consider > > > > > adding comments. > > > > Correct - maybe we should reconsider wrapper-izing this? :) > > > Another option is just to skip dax_do_io() and this special casing > > > fallback entirely if errors are present.  I.e. only attempt dax_do_io > > > when: IS_DAX() && gendisk->bb && bb->count == 0. > > > > So, if there's an error anywhere on the device, penalize all I/O (not > > just writes, and not just on sectors that are bad)?  I'm not sure > > that's a great plan, either. > > > If errors are rare how much are we actually losing in practice? > Moreover, we're going to do the full badblocks lookup anyway when we > call ->direct_access().  If we had that information earlier we can > avoid this fallback dance. A system running with DAX may have active data set in NVDIMM lager than RAM size.  In this case, falling back to non-DAX will allocate page cache for the data, which will saturate the system with memory pressure. Thanks, -Toshi   From jmoyer@redhat.com Fri Apr 15 14:13:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2843D7CA0 for ; Fri, 15 Apr 2016 14:13:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E9F2B8F8037 for ; Fri, 15 Apr 2016 12:13:30 -0700 (PDT) X-ASG-Debug-ID: 1460747609-04cbb02e1b3157e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 9OawgQjgRrARsUDu (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:13:30 -0700 (PDT) X-Barracuda-Envelope-From: jmoyer@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 10DD862655; Fri, 15 Apr 2016 19:13:29 +0000 (UTC) Received: from segfault.boston.devel.redhat.com (segfault.boston.devel.redhat.com [10.19.60.26]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJDQH8006083 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Fri, 15 Apr 2016 15:13:27 -0400 From: Jeff Moyer To: Dan Williams Cc: "Verma\, Vishal L" , "hch\@infradead.org" , "jack\@suse.cz" , "axboe\@fb.com" , "linux-nvdimm\@ml01.01.org" , "david\@fromorbit.com" , "linux-kernel\@vger.kernel.org" , "xfs\@oss.sgi.com" , "linux-block\@vger.kernel.org" , "linux-mm\@kvack.org" , "viro\@zeniv.linux.org.uk" , "linux-fsdevel\@vger.kernel.org" , "akpm\@linux-foundation.org" , "linux-ext4\@vger.kernel.org" , "Wilcox\, Matthew R" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <1460739288.3012.3.camel@intel.com> <1460741821.3012.11.camel@intel.com> X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io X-PGP-KeyID: 1F78E1B4 X-PGP-CertKey: F6FE 280D 8293 F72C 65FD 5A58 1FF8 A7CA 1F78 E1B4 X-PCLoadLetter: What the f**k does that mean? Date: Fri, 15 Apr 2016 15:13:26 -0400 In-Reply-To: (Dan Williams's message of "Fri, 15 Apr 2016 11:56:20 -0700") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Fri, 15 Apr 2016 19:13:29 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460747610 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Dan Williams writes: > On Fri, Apr 15, 2016 at 11:24 AM, Jeff Moyer wrote: >>> Moreover, we're going to do the full badblocks lookup anyway when we >>> call ->direct_access(). If we had that information earlier we can >>> avoid this fallback dance. >> >> None of the proposed approaches looks clean to me. I'll go along with >> whatever you guys think is best. I am in favor of wrapping up all that >> duplicated code, though. > > Christoph originally pushed for open coding this fallback decision > per-filesystem. I agree with you on the "none the above" options are > clean. I don't recall him saying "open code". Rather, the sentiment was to leave the fallback to the callers. That doesn't mean you can't wrap it up in a convenience function. Cheers, Jeff From mchristi@redhat.com Fri Apr 15 14:16:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 938C47CA0 for ; Fri, 15 Apr 2016 14:16:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 386AE304032 for ; Fri, 15 Apr 2016 12:16:26 -0700 (PDT) X-ASG-Debug-ID: 1460747782-04bdf011056103e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id H9Hycbb39rlyDVu0 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:16:22 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CDD5F62659; Fri, 15 Apr 2016 19:16:21 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhQ007872; Fri, 15 Apr 2016 15:16:18 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Subject: [PATCH 00/42] v7: separate operations from flags in the bio/request structs Date: Fri, 15 Apr 2016 14:15:35 -0500 X-ASG-Orig-Subj: [PATCH 00/42] v7: separate operations from flags in the bio/request structs Message-Id: <1460747777-8479-1-git-send-email-mchristi@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Fri, 15 Apr 2016 19:16:22 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460747782 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The following patches begin to cleanup the request->cmd_flags and bio->bi_rw mess. We currently use cmd_flags to specify the operation, attributes and state of the request. For bi_rw we use it for similar info and also the priority but then also have another bi_flags field for state. At some point, we abused them so much we just made cmd_flags 64 bits, so we could add more. The following patches seperate the operation (read, write discard, flush, etc) from cmd_flags/bi_rw. This patchset was made against linux-next from today April 15 (git tag next-20160415). I put a git tree here: https://github.com/mikechristie/linux-kernel.git The patches are in the op branch. v7: 1. Fix broken feature_flush/fua use. v6 and maybe hopfully the last version: 1. Adapt patch 41 to Jens's QUEUE_FLAG_WC/FUA patchset. v5: 1. Missed crypto fs submit_bio_wait call. 2. Change nfs bi_rw check to bi_op. 3. btrfs. Convert finish_parity_scrub. 4. Reworked against Jens's QUEUE_FLAG patches so I could drop my similar code. 5. Separated the core block layer change into multiple patches for merging, elevator, stats, mq and non mq request allocation to try and make it easier to read. v4: 1. Rebased to current linux-next tree. v3: 1. Used "=" instead of "|=" to setup bio bi_rw. 2. Removed __get_request cmd_flags compat code. 3. Merged initial dm related changes requested by Mike Snitzer. 4. Fixed ubd kbuild errors in flush related patches. 5. Fix 80 char col issues in several patches. 6. Fix issue with one of the btrfs patches where it looks like I reverted a patch when trying to fix a merge error. v2 1. Dropped arguments from submit_bio, and had callers setup bio. 2. Add REQ_OP_FLUSH for request_fn users and renamed REQ_FLUSH to REQ_PREFLUSH for make_request_fn users. 3. Dropped bio/rq_data_dir functions, and added a op_is_write function instead. Diffstat for the set: Documentation/block/writeback_cache_control.txt | 28 ++++---- Documentation/device-mapper/log-writes.txt | 10 +-- arch/um/drivers/ubd_kern.c | 2 +- block/bio.c | 21 +++--- block/blk-core.c | 92 +++++++++++++------------ block/blk-flush.c | 23 ++++--- block/blk-lib.c | 12 ++-- block/blk-map.c | 2 +- block/blk-merge.c | 24 ++++--- block/blk-mq.c | 41 ++++++----- block/cfq-iosched.c | 53 ++++++++------ block/elevator.c | 7 +- drivers/ata/libata-scsi.c | 2 +- drivers/block/brd.c | 2 +- drivers/block/drbd/drbd_actlog.c | 33 +++++---- drivers/block/drbd/drbd_bitmap.c | 8 +-- drivers/block/drbd/drbd_int.h | 4 +- drivers/block/drbd/drbd_main.c | 20 +++--- drivers/block/drbd/drbd_protocol.h | 2 +- drivers/block/drbd/drbd_receiver.c | 37 ++++++---- drivers/block/drbd/drbd_req.c | 2 +- drivers/block/drbd/drbd_worker.c | 7 +- drivers/block/floppy.c | 3 +- drivers/block/loop.c | 14 ++-- drivers/block/mtip32xx/mtip32xx.c | 2 +- drivers/block/nbd.c | 4 +- drivers/block/osdblk.c | 2 +- drivers/block/pktcdvd.c | 4 +- drivers/block/ps3disk.c | 4 +- drivers/block/rbd.c | 4 +- drivers/block/rsxx/dma.c | 2 +- drivers/block/skd_main.c | 11 ++- drivers/block/umem.c | 2 +- drivers/block/virtio_blk.c | 2 +- drivers/block/xen-blkback/blkback.c | 29 +++++--- drivers/block/xen-blkfront.c | 65 ++++++++--------- drivers/block/zram/zram_drv.c | 2 +- drivers/ide/ide-cd_ioctl.c | 3 - drivers/ide/ide-disk.c | 2 +- drivers/ide/ide-floppy.c | 2 +- drivers/lightnvm/rrpc.c | 6 +- drivers/md/bcache/btree.c | 2 + drivers/md/bcache/debug.c | 8 ++- drivers/md/bcache/io.c | 2 +- drivers/md/bcache/journal.c | 9 +-- drivers/md/bcache/movinggc.c | 2 +- drivers/md/bcache/request.c | 27 ++++---- drivers/md/bcache/super.c | 26 ++++--- drivers/md/bcache/writeback.c | 4 +- drivers/md/bitmap.c | 6 +- drivers/md/dm-bufio.c | 9 ++- drivers/md/dm-cache-target.c | 18 ++--- drivers/md/dm-crypt.c | 8 ++- drivers/md/dm-era-target.c | 4 +- drivers/md/dm-flakey.c | 2 +- drivers/md/dm-io.c | 58 +++++++++------- drivers/md/dm-kcopyd.c | 25 ++++--- drivers/md/dm-log-writes.c | 13 ++-- drivers/md/dm-log.c | 5 +- drivers/md/dm-raid.c | 5 +- drivers/md/dm-raid1.c | 22 +++--- drivers/md/dm-region-hash.c | 6 +- drivers/md/dm-snap-persistent.c | 24 ++++--- drivers/md/dm-snap.c | 6 +- drivers/md/dm-stats.c | 9 ++- drivers/md/dm-stripe.c | 6 +- drivers/md/dm-thin.c | 25 ++++--- drivers/md/dm.c | 44 ++++++------ drivers/md/linear.c | 4 +- drivers/md/md.c | 21 ++++-- drivers/md/md.h | 5 +- drivers/md/multipath.c | 2 +- drivers/md/raid0.c | 4 +- drivers/md/raid1.c | 40 ++++++----- drivers/md/raid10.c | 54 ++++++++------- drivers/md/raid5-cache.c | 34 +++++---- drivers/md/raid5.c | 63 +++++++++-------- drivers/mmc/card/block.c | 10 ++- drivers/mmc/card/queue.c | 6 +- drivers/mmc/card/queue.h | 5 +- drivers/mtd/mtd_blkdevs.c | 4 +- drivers/nvme/host/core.c | 4 +- drivers/nvme/host/nvme.h | 2 +- drivers/nvme/host/pci.c | 2 +- drivers/scsi/osd/osd_initiator.c | 12 ++-- drivers/scsi/sd.c | 20 ++++-- drivers/staging/lustre/lustre/llite/lloop.c | 6 +- drivers/target/target_core_iblock.c | 42 +++++------ drivers/target/target_core_pscsi.c | 2 +- fs/btrfs/check-integrity.c | 61 ++++++++-------- fs/btrfs/check-integrity.h | 6 +- fs/btrfs/compression.c | 17 +++-- fs/btrfs/ctree.h | 2 +- fs/btrfs/disk-io.c | 44 ++++++------ fs/btrfs/disk-io.h | 2 +- fs/btrfs/extent-tree.c | 2 +- fs/btrfs/extent_io.c | 91 ++++++++++++------------ fs/btrfs/extent_io.h | 8 +-- fs/btrfs/inode.c | 71 ++++++++++--------- fs/btrfs/raid56.c | 17 +++-- fs/btrfs/scrub.c | 16 +++-- fs/btrfs/volumes.c | 91 ++++++++++++------------ fs/btrfs/volumes.h | 6 +- fs/buffer.c | 70 ++++++++++--------- fs/crypto/crypto.c | 3 +- fs/direct-io.c | 36 ++++++---- fs/exofs/ore.c | 2 +- fs/ext4/balloc.c | 2 +- fs/ext4/crypto.c | 3 +- fs/ext4/ialloc.c | 2 +- fs/ext4/inode.c | 8 +-- fs/ext4/mmp.c | 4 +- fs/ext4/namei.c | 3 +- fs/ext4/page-io.c | 9 ++- fs/ext4/readpage.c | 9 +-- fs/ext4/super.c | 2 +- fs/f2fs/checkpoint.c | 10 +-- fs/f2fs/data.c | 40 +++++++---- fs/f2fs/f2fs.h | 5 +- fs/f2fs/gc.c | 9 ++- fs/f2fs/inline.c | 3 +- fs/f2fs/node.c | 8 ++- fs/f2fs/segment.c | 16 +++-- fs/f2fs/trace.c | 7 +- fs/fat/misc.c | 2 +- fs/gfs2/bmap.c | 4 +- fs/gfs2/dir.c | 2 +- fs/gfs2/log.c | 8 +-- fs/gfs2/lops.c | 13 ++-- fs/gfs2/lops.h | 2 +- fs/gfs2/meta_io.c | 19 ++--- fs/gfs2/ops_fstype.c | 4 +- fs/gfs2/quota.c | 2 +- fs/hfsplus/hfsplus_fs.h | 2 +- fs/hfsplus/part_tbl.c | 5 +- fs/hfsplus/super.c | 6 +- fs/hfsplus/wrapper.c | 16 +++-- fs/isofs/compress.c | 2 +- fs/jbd2/commit.c | 6 +- fs/jbd2/journal.c | 10 +-- fs/jbd2/recovery.c | 4 +- fs/jfs/jfs_logmgr.c | 8 ++- fs/jfs/jfs_metapage.c | 10 +-- fs/logfs/dev_bdev.c | 17 +++-- fs/mpage.c | 42 +++++------ fs/nfs/blocklayout/blocklayout.c | 22 +++--- fs/nilfs2/btnode.c | 6 +- fs/nilfs2/btnode.h | 2 +- fs/nilfs2/btree.c | 6 +- fs/nilfs2/gcinode.c | 5 +- fs/nilfs2/mdt.c | 11 +-- fs/nilfs2/segbuf.c | 19 ++--- fs/ntfs/aops.c | 6 +- fs/ntfs/compress.c | 2 +- fs/ntfs/file.c | 2 +- fs/ntfs/logfile.c | 2 +- fs/ntfs/mft.c | 4 +- fs/ocfs2/aops.c | 2 +- fs/ocfs2/buffer_head_io.c | 8 +-- fs/ocfs2/cluster/heartbeat.c | 15 ++-- fs/ocfs2/super.c | 2 +- fs/reiserfs/inode.c | 4 +- fs/reiserfs/journal.c | 14 ++-- fs/reiserfs/stree.c | 4 +- fs/reiserfs/super.c | 2 +- fs/squashfs/block.c | 4 +- fs/udf/dir.c | 2 +- fs/udf/directory.c | 2 +- fs/udf/inode.c | 2 +- fs/ufs/balloc.c | 2 +- fs/ufs/util.c | 2 +- fs/xfs/xfs_aops.c | 14 ++-- fs/xfs/xfs_buf.c | 29 ++++---- include/linux/bio.h | 30 ++++---- include/linux/blk-cgroup.h | 13 ++-- include/linux/blk_types.h | 36 +++++----- include/linux/blkdev.h | 32 +++++---- include/linux/blktrace_api.h | 2 +- include/linux/buffer_head.h | 11 +-- include/linux/dm-io.h | 3 +- include/linux/elevator.h | 4 +- include/linux/fs.h | 57 ++++++++++----- include/trace/events/bcache.h | 12 ++-- include/trace/events/block.h | 31 ++++++--- include/trace/events/f2fs.h | 37 ++++++---- kernel/power/swap.c | 34 +++++---- kernel/trace/blktrace.c | 58 +++++++++------- mm/page_io.c | 10 +-- 188 files changed, 1529 insertions(+), 1217 deletions(-) From mchristi@redhat.com Fri Apr 15 14:16:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8778E7CA6 for ; Fri, 15 Apr 2016 14:16:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id DEEF1AC003 for ; Fri, 15 Apr 2016 12:16:28 -0700 (PDT) X-ASG-Debug-ID: 1460747786-04cb6c2460640f80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id IqwEsgxqv4HaLTEB (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:16:27 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9807A7F6B9; Fri, 15 Apr 2016 19:16:26 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhS007872; Fri, 15 Apr 2016 15:16:24 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 02/42] block: add REQ_OP definitions and bi_op/op fields Date: Fri, 15 Apr 2016 14:15:37 -0500 X-ASG-Orig-Subj: [PATCH 02/42] block: add REQ_OP definitions and bi_op/op fields Message-Id: <1460747777-8479-3-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747787 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie The following patches separate the operation (write, read, discard, etc) from the rq_flag_bits flags. This patch adds definitions for request/bio operations, adds fields to the request/bio to set them, and some temporary compat code so the kernel/modules can use either one. In the final patches this compat code will be removed when everything is converted. In this patch the REQ_OPs match the REQ rq_flag_bits ones for compat reasons while all the code is converted in this set. In the last patches that will abe removed and the bi_op field will be shrunk. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- block/blk-core.c | 19 ++++++++++++++++--- include/linux/blk_types.h | 15 ++++++++++++++- include/linux/blkdev.h | 1 + include/linux/fs.h | 37 +++++++++++++++++++++++++++++++++++-- 4 files changed, 66 insertions(+), 6 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index e953407..3b238ef 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1698,7 +1698,8 @@ void init_request_from_bio(struct request *req, struct bio *bio) { req->cmd_type = REQ_TYPE_FS; - req->cmd_flags |= bio->bi_rw & REQ_COMMON_MASK; + /* tmp compat. Allow users to set bi_op or bi_rw */ + req->cmd_flags |= (bio->bi_rw | bio->bi_op) & REQ_COMMON_MASK; if (bio->bi_rw & REQ_RAHEAD) req->cmd_flags |= REQ_FAILFAST_MASK; @@ -2034,6 +2035,12 @@ blk_qc_t generic_make_request(struct bio *bio) struct bio_list bio_list_on_stack; blk_qc_t ret = BLK_QC_T_NONE; + /* tmp compat. Allow users to set either one or both. + * This will be removed when we have converted + * everyone in the next patches. + */ + bio->bi_rw |= bio->bi_op; + if (!generic_make_request_checks(bio)) goto out; @@ -2103,6 +2110,12 @@ EXPORT_SYMBOL(generic_make_request); */ blk_qc_t submit_bio(struct bio *bio) { + /* tmp compat. Allow users to set either one or both. + * This will be removed when we have converted + * everyone in the next patches. + */ + bio->bi_rw |= bio->bi_op; + /* * If it's a regular read/write or a barrier with data attached, * go through the normal accounting stuff before submission. @@ -2976,8 +2989,8 @@ EXPORT_SYMBOL_GPL(__blk_end_request_err); void blk_rq_bio_prep(struct request_queue *q, struct request *rq, struct bio *bio) { - /* Bit 0 (R/W) is identical in rq->cmd_flags and bio->bi_rw */ - rq->cmd_flags |= bio->bi_rw & REQ_WRITE; + /* tmp compat. Allow users to set bi_op or bi_rw */ + rq->cmd_flags |= bio_data_dir(bio); if (bio_has_data(bio)) rq->nr_phys_segments = bio_phys_segments(q, bio); diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index 86a38ea..6e49c91 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -48,9 +48,15 @@ struct bio { struct block_device *bi_bdev; unsigned int bi_flags; /* status, command, etc */ int bi_error; - unsigned long bi_rw; /* bottom bits READ/WRITE, + unsigned long bi_rw; /* bottom bits rq_flags_bits * top bits priority */ + /* + * this will be a u8 in the next patches and bi_rw can be shrunk to + * a u32. For compat in these transistional patches op is a int here. + */ + int bi_op; /* REQ_OP */ + struct bvec_iter bi_iter; @@ -242,6 +248,13 @@ enum rq_flag_bits { #define REQ_HASHED (1ULL << __REQ_HASHED) #define REQ_MQ_INFLIGHT (1ULL << __REQ_MQ_INFLIGHT) +enum req_op { + REQ_OP_READ, + REQ_OP_WRITE = REQ_WRITE, + REQ_OP_DISCARD = REQ_DISCARD, + REQ_OP_WRITE_SAME = REQ_WRITE_SAME, +}; + typedef unsigned int blk_qc_t; #define BLK_QC_T_NONE -1U #define BLK_QC_T_SHIFT 16 diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 57c0859..bce32e2 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -96,6 +96,7 @@ struct request { struct request_queue *q; struct blk_mq_ctx *mq_ctx; + int op; u64 cmd_flags; unsigned cmd_type; unsigned long atomic_flags; diff --git a/include/linux/fs.h b/include/linux/fs.h index 69bdd03..96ace0f 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2452,15 +2452,48 @@ extern void make_bad_inode(struct inode *); extern bool is_bad_inode(struct inode *); #ifdef CONFIG_BLOCK + +static inline bool op_is_write(int op) +{ + switch (op) { + case REQ_OP_WRITE: + case REQ_OP_WRITE_SAME: + case REQ_OP_DISCARD: + return true; + default: + return false; + } +} + /* * return READ, READA, or WRITE */ -#define bio_rw(bio) ((bio)->bi_rw & (RW_MASK | RWA_MASK)) +static inline int bio_rw(struct bio *bio) +{ + /* + * tmp cpmpat. Allow users to set either op or rw, until + * all code is converted in the next patches. + */ + if (op_is_write(bio->bi_op)) + return WRITE; + + return bio->bi_rw & (RW_MASK | RWA_MASK); +} /* * return data direction, READ or WRITE */ -#define bio_data_dir(bio) ((bio)->bi_rw & 1) +static inline int bio_data_dir(struct bio *bio) +{ + /* + * tmp cpmpat. Allow users to set either op or rw, until + * all code is converted in the next patches. + */ + if (op_is_write(bio->bi_op)) + return WRITE; + + return bio->bi_rw & 1; +} extern void check_disk_size_change(struct gendisk *disk, struct block_device *bdev); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:16:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D24617CB6 for ; Fri, 15 Apr 2016 14:16:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 676C5304032 for ; Fri, 15 Apr 2016 12:16:31 -0700 (PDT) X-ASG-Debug-ID: 1460747789-04bdf01103610440001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id RWu4UTYstjGBOO4B (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:16:29 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D787C81106; Fri, 15 Apr 2016 19:16:28 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhT007872; Fri, 15 Apr 2016 15:16:26 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 03/42] block, fs, mm, drivers: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 14:15:38 -0500 X-ASG-Orig-Subj: [PATCH 03/42] block, fs, mm, drivers: set bi_op to REQ_OP Message-Id: <1460747777-8479-4-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747789 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch converts the simple bi_rw use cases in the block, drivers, mm and fs code to set the bio->bi_op to a REQ_OP. These should be simple one liner cases, so I just did them in one patch. The next patches handle the more complicated cases in a module per patch. v5: 1. Add missed crypto call. 2. Change nfs bi_rw check to bi_op. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- block/bio.c | 8 +++++--- block/blk-flush.c | 1 + block/blk-lib.c | 7 ++++--- block/blk-map.c | 2 +- drivers/block/floppy.c | 2 +- drivers/block/pktcdvd.c | 4 ++-- drivers/lightnvm/rrpc.c | 4 ++-- drivers/scsi/osd/osd_initiator.c | 8 ++++---- fs/crypto/crypto.c | 2 +- fs/exofs/ore.c | 2 +- fs/ext4/crypto.c | 2 +- fs/ext4/page-io.c | 8 +++++--- fs/ext4/readpage.c | 2 +- fs/jfs/jfs_logmgr.c | 2 ++ fs/jfs/jfs_metapage.c | 4 ++-- fs/logfs/dev_bdev.c | 12 ++++++------ fs/nfs/blocklayout/blocklayout.c | 4 ++-- mm/page_io.c | 4 ++-- 18 files changed, 43 insertions(+), 35 deletions(-) diff --git a/block/bio.c b/block/bio.c index f319b78..921de2e 100644 --- a/block/bio.c +++ b/block/bio.c @@ -587,6 +587,7 @@ void __bio_clone_fast(struct bio *bio, struct bio *bio_src) */ bio->bi_bdev = bio_src->bi_bdev; bio_set_flag(bio, BIO_CLONED); + bio->bi_op = bio_src->bi_op; bio->bi_rw = bio_src->bi_rw; bio->bi_iter = bio_src->bi_iter; bio->bi_io_vec = bio_src->bi_io_vec; @@ -669,6 +670,7 @@ struct bio *bio_clone_bioset(struct bio *bio_src, gfp_t gfp_mask, return NULL; bio->bi_bdev = bio_src->bi_bdev; + bio->bi_op = bio_src->bi_op; bio->bi_rw = bio_src->bi_rw; bio->bi_iter.bi_sector = bio_src->bi_iter.bi_sector; bio->bi_iter.bi_size = bio_src->bi_iter.bi_size; @@ -1177,7 +1179,7 @@ struct bio *bio_copy_user_iov(struct request_queue *q, goto out_bmd; if (iter->type & WRITE) - bio->bi_rw |= REQ_WRITE; + bio->bi_op = REQ_OP_WRITE; ret = 0; @@ -1347,7 +1349,7 @@ struct bio *bio_map_user_iov(struct request_queue *q, * set data direction, and check if mapped pages need bouncing */ if (iter->type & WRITE) - bio->bi_rw |= REQ_WRITE; + bio->bi_op = REQ_OP_WRITE; bio_set_flag(bio, BIO_USER_MAPPED); @@ -1540,7 +1542,7 @@ struct bio *bio_copy_kern(struct request_queue *q, void *data, unsigned int len, bio->bi_private = data; } else { bio->bi_end_io = bio_copy_kern_endio; - bio->bi_rw |= REQ_WRITE; + bio->bi_op = REQ_OP_WRITE; } return bio; diff --git a/block/blk-flush.c b/block/blk-flush.c index 3af4a5a..6611bcb 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c @@ -485,6 +485,7 @@ int blkdev_issue_flush(struct block_device *bdev, gfp_t gfp_mask, bio = bio_alloc(gfp_mask, 0); bio->bi_bdev = bdev; + bio->bi_op = REQ_OP_WRITE; bio->bi_rw = WRITE_FLUSH; ret = submit_bio_wait(bio); diff --git a/block/blk-lib.c b/block/blk-lib.c index 87e3de4..d01b5f2 100644 --- a/block/blk-lib.c +++ b/block/blk-lib.c @@ -42,7 +42,7 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, { DECLARE_COMPLETION_ONSTACK(wait); struct request_queue *q = bdev_get_queue(bdev); - int type = REQ_WRITE | REQ_DISCARD; + int type = 0; unsigned int granularity; int alignment; struct bio_batch bb; @@ -102,6 +102,7 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, bio->bi_end_io = bio_batch_end_io; bio->bi_bdev = bdev; bio->bi_private = &bb; + bio->bi_op = REQ_OP_DISCARD; bio->bi_rw = type; bio->bi_iter.bi_size = req_sects << 9; @@ -178,7 +179,7 @@ int blkdev_issue_write_same(struct block_device *bdev, sector_t sector, bio->bi_io_vec->bv_page = page; bio->bi_io_vec->bv_offset = 0; bio->bi_io_vec->bv_len = bdev_logical_block_size(bdev); - bio->bi_rw = REQ_WRITE | REQ_WRITE_SAME; + bio->bi_op = REQ_OP_WRITE_SAME; if (nr_sects > max_write_same_sectors) { bio->bi_iter.bi_size = max_write_same_sectors << 9; @@ -240,7 +241,7 @@ static int __blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, bio->bi_bdev = bdev; bio->bi_end_io = bio_batch_end_io; bio->bi_private = &bb; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; while (nr_sects != 0) { sz = min((sector_t) PAGE_SIZE >> 9 , nr_sects); diff --git a/block/blk-map.c b/block/blk-map.c index a54f054..c489ecd 100644 --- a/block/blk-map.c +++ b/block/blk-map.c @@ -255,7 +255,7 @@ int blk_rq_map_kern(struct request_queue *q, struct request *rq, void *kbuf, return PTR_ERR(bio); if (!reading) - bio->bi_rw |= REQ_WRITE; + bio->bi_op = REQ_OP_WRITE; if (do_copy) rq->cmd_flags |= REQ_COPY_USER; diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 73ded25..84b1584 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c @@ -3822,7 +3822,7 @@ static int __floppy_read_block_0(struct block_device *bdev, int drive) bio.bi_flags |= (1 << BIO_QUIET); bio.bi_private = &cbdata; bio.bi_end_io = floppy_rb0_cb; - bio.bi_rw = READ; + bio.bi_op = REQ_OP_READ; submit_bio(&bio); process_fd_request(); diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c index d06c62e..a4ecbd3 100644 --- a/drivers/block/pktcdvd.c +++ b/drivers/block/pktcdvd.c @@ -1074,7 +1074,7 @@ static void pkt_gather_data(struct pktcdvd_device *pd, struct packet_data *pkt) BUG(); atomic_inc(&pkt->io_wait); - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; pkt_queue_bio(pd, bio); frames_read++; } @@ -1336,7 +1336,7 @@ static void pkt_start_write(struct pktcdvd_device *pd, struct packet_data *pkt) /* Start the write request */ atomic_set(&pkt->io_wait, 1); - pkt->w_bio->bi_rw = WRITE; + pkt->w_bio->bi_op = REQ_OP_WRITE; pkt_queue_bio(pd, pkt->w_bio); } diff --git a/drivers/lightnvm/rrpc.c b/drivers/lightnvm/rrpc.c index 3ab6495..fd9b629 100644 --- a/drivers/lightnvm/rrpc.c +++ b/drivers/lightnvm/rrpc.c @@ -342,7 +342,7 @@ try: /* Perform read to do GC */ bio->bi_iter.bi_sector = rrpc_get_sector(rev->addr); - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; bio->bi_private = &wait; bio->bi_end_io = rrpc_end_sync_bio; @@ -364,7 +364,7 @@ try: reinit_completion(&wait); bio->bi_iter.bi_sector = rrpc_get_sector(rev->addr); - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; bio->bi_private = &wait; bio->bi_end_io = rrpc_end_sync_bio; diff --git a/drivers/scsi/osd/osd_initiator.c b/drivers/scsi/osd/osd_initiator.c index 3b11aad..edcba56 100644 --- a/drivers/scsi/osd/osd_initiator.c +++ b/drivers/scsi/osd/osd_initiator.c @@ -726,7 +726,7 @@ static int _osd_req_list_objects(struct osd_request *or, return PTR_ERR(bio); } - bio->bi_rw &= ~REQ_WRITE; + bio->bi_op = REQ_OP_READ; or->in.bio = bio; or->in.total_bytes = bio->bi_iter.bi_size; return 0; @@ -839,7 +839,7 @@ int osd_req_write_kern(struct osd_request *or, if (IS_ERR(bio)) return PTR_ERR(bio); - bio->bi_rw |= REQ_WRITE; /* FIXME: bio_set_dir() */ + bio->bi_op = REQ_OP_WRITE; osd_req_write(or, obj, offset, bio, len); return 0; } @@ -956,7 +956,7 @@ static int _osd_req_finalize_cdb_cont(struct osd_request *or, const u8 *cap_key) if (IS_ERR(bio)) return PTR_ERR(bio); - bio->bi_rw |= REQ_WRITE; + bio->bi_op = REQ_OP_WRITE; /* integrity check the continuation before the bio is linked * with the other data segments since the continuation @@ -1077,7 +1077,7 @@ int osd_req_write_sg_kern(struct osd_request *or, if (IS_ERR(bio)) return PTR_ERR(bio); - bio->bi_rw |= REQ_WRITE; + bio->bi_op = REQ_OP_WRITE; osd_req_write_sg(or, obj, bio, sglist, numentries); return 0; diff --git a/fs/crypto/crypto.c b/fs/crypto/crypto.c index 5b75856..4bb62fe 100644 --- a/fs/crypto/crypto.c +++ b/fs/crypto/crypto.c @@ -318,7 +318,7 @@ int fscrypt_zeroout_range(struct inode *inode, pgoff_t lblk, bio->bi_bdev = inode->i_sb->s_bdev; bio->bi_iter.bi_sector = pblk << (inode->i_sb->s_blocksize_bits - 9); - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; ret = bio_add_page(bio, ciphertext_page, inode->i_sb->s_blocksize, 0); if (ret != inode->i_sb->s_blocksize) { diff --git a/fs/exofs/ore.c b/fs/exofs/ore.c index 7bd8ac8..c40ed74 100644 --- a/fs/exofs/ore.c +++ b/fs/exofs/ore.c @@ -878,7 +878,7 @@ static int _write_mirror(struct ore_io_state *ios, int cur_comp) } else { bio = master_dev->bio; /* FIXME: bio_set_dir() */ - bio->bi_rw |= REQ_WRITE; + bio->bi_op = REQ_OP_WRITE; } osd_req_write(or, _ios_obj(ios, cur_comp), diff --git a/fs/ext4/crypto.c b/fs/ext4/crypto.c index 811bd5d..f08d860 100644 --- a/fs/ext4/crypto.c +++ b/fs/ext4/crypto.c @@ -428,7 +428,7 @@ int ext4_encrypted_zeroout(struct inode *inode, ext4_lblk_t lblk, bio->bi_bdev = inode->i_sb->s_bdev; bio->bi_iter.bi_sector = pblk << (inode->i_sb->s_blocksize_bits - 9); - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; ret = bio_add_page(bio, ciphertext_page, inode->i_sb->s_blocksize, 0); if (ret != inode->i_sb->s_blocksize) { diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c index e945b31..43655e9 100644 --- a/fs/ext4/page-io.c +++ b/fs/ext4/page-io.c @@ -340,10 +340,12 @@ void ext4_io_submit(struct ext4_io_submit *io) struct bio *bio = io->io_bio; if (bio) { - int io_op = io->io_wbc->sync_mode == WB_SYNC_ALL ? - WRITE_SYNC : WRITE; + int io_op_flags = io->io_wbc->sync_mode == WB_SYNC_ALL ? + WRITE_SYNC : 0; + bio_get(io->io_bio); - io->io_bio->bi_rw = io_op; + io->io_bio->bi_op = REQ_OP_WRITE; + io->io_bio->bi_rw = io_op_flags; submit_bio(io->io_bio); bio_put(io->io_bio); } diff --git a/fs/ext4/readpage.c b/fs/ext4/readpage.c index 130bd45..7452ecf 100644 --- a/fs/ext4/readpage.c +++ b/fs/ext4/readpage.c @@ -294,7 +294,7 @@ int ext4_mpage_readpages(struct address_space *mapping, bio->bi_iter.bi_sector = blocks[0] << (blkbits - 9); bio->bi_end_io = mpage_end_io; bio->bi_private = ctx; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; } length = first_hole << blkbits; diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c index 3ee3f32..d315c1e 100644 --- a/fs/jfs/jfs_logmgr.c +++ b/fs/jfs/jfs_logmgr.c @@ -2002,6 +2002,7 @@ static int lbmRead(struct jfs_log * log, int pn, struct lbuf ** bpp) bio->bi_end_io = lbmIODone; bio->bi_private = bp; + bio->bi_op = REQ_OP_READ; bio->bi_rw = READ_SYNC; /*check if journaling to disk has been disabled*/ if (log->no_integrity) { @@ -2146,6 +2147,7 @@ static void lbmStartIO(struct lbuf * bp) bio->bi_end_io = lbmIODone; bio->bi_private = bp; + bio->bi_op = REQ_OP_WRITE; bio->bi_rw = WRITE_SYNC; /* check if journaling to disk has been disabled */ diff --git a/fs/jfs/jfs_metapage.c b/fs/jfs/jfs_metapage.c index 9725443..048342f 100644 --- a/fs/jfs/jfs_metapage.c +++ b/fs/jfs/jfs_metapage.c @@ -434,7 +434,7 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc) bio->bi_iter.bi_sector = pblock << (inode->i_blkbits - 9); bio->bi_end_io = metapage_write_end_io; bio->bi_private = page; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; /* Don't call bio_add_page yet, we may add to this vec */ bio_offset = offset; @@ -515,7 +515,7 @@ static int metapage_readpage(struct file *fp, struct page *page) pblock << (inode->i_blkbits - 9); bio->bi_end_io = metapage_read_end_io; bio->bi_private = page; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; len = xlen << inode->i_blkbits; offset = block_offset << inode->i_blkbits; if (bio_add_page(bio, page, len, offset) < len) diff --git a/fs/logfs/dev_bdev.c b/fs/logfs/dev_bdev.c index 29704bd..5c02271 100644 --- a/fs/logfs/dev_bdev.c +++ b/fs/logfs/dev_bdev.c @@ -14,7 +14,7 @@ #define PAGE_OFS(ofs) ((ofs) & (PAGE_SIZE-1)) -static int sync_request(struct page *page, struct block_device *bdev, int rw) +static int sync_request(struct page *page, struct block_device *bdev, int op) { struct bio bio; struct bio_vec bio_vec; @@ -29,7 +29,7 @@ static int sync_request(struct page *page, struct block_device *bdev, int rw) bio.bi_bdev = bdev; bio.bi_iter.bi_sector = page->index * (PAGE_SIZE >> 9); bio.bi_iter.bi_size = PAGE_SIZE; - bio.bi_rw = rw; + bio.bi_op = op; return submit_bio_wait(&bio); } @@ -96,7 +96,7 @@ static int __bdev_writeseg(struct super_block *sb, u64 ofs, pgoff_t index, bio->bi_iter.bi_sector = ofs >> 9; bio->bi_private = sb; bio->bi_end_io = writeseg_end_io; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; atomic_inc(&super->s_pending_writes); submit_bio(bio); @@ -124,7 +124,7 @@ static int __bdev_writeseg(struct super_block *sb, u64 ofs, pgoff_t index, bio->bi_iter.bi_sector = ofs >> 9; bio->bi_private = sb; bio->bi_end_io = writeseg_end_io; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; atomic_inc(&super->s_pending_writes); submit_bio(bio); return 0; @@ -188,7 +188,7 @@ static int do_erase(struct super_block *sb, u64 ofs, pgoff_t index, bio->bi_iter.bi_sector = ofs >> 9; bio->bi_private = sb; bio->bi_end_io = erase_end_io; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; atomic_inc(&super->s_pending_writes); submit_bio(bio); @@ -210,7 +210,7 @@ static int do_erase(struct super_block *sb, u64 ofs, pgoff_t index, bio->bi_iter.bi_sector = ofs >> 9; bio->bi_private = sb; bio->bi_end_io = erase_end_io; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; atomic_inc(&super->s_pending_writes); submit_bio(bio); return 0; diff --git a/fs/nfs/blocklayout/blocklayout.c b/fs/nfs/blocklayout/blocklayout.c index 4c79f4d..7b6af2e 100644 --- a/fs/nfs/blocklayout/blocklayout.c +++ b/fs/nfs/blocklayout/blocklayout.c @@ -107,7 +107,7 @@ bl_submit_bio(struct bio *bio) if (bio) { get_parallel(bio->bi_private); dprintk("%s submitting %s bio %u@%llu\n", __func__, - bio->bi_rw == READ ? "read" : "write", + bio->bi_op == READ ? "read" : "write", bio->bi_iter.bi_size, (unsigned long long)bio->bi_iter.bi_sector); submit_bio(bio); @@ -175,7 +175,7 @@ retry: disk_addr >> SECTOR_SHIFT, end_io, par); if (!bio) return ERR_PTR(-ENOMEM); - bio->bi_rw = rw; + bio->bi_op = rw; } if (bio_add_page(bio, page, *len, offset) < *len) { bio = bl_submit_bio(bio); diff --git a/mm/page_io.c b/mm/page_io.c index 85cc7e1..24da235 100644 --- a/mm/page_io.c +++ b/mm/page_io.c @@ -317,7 +317,7 @@ int __swap_writepage(struct page *page, struct writeback_control *wbc, ret = -ENOMEM; goto out; } - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; if (wbc->sync_mode == WB_SYNC_ALL) bio->bi_rw |= REQ_SYNC; count_vm_event(PSWPOUT); @@ -370,7 +370,7 @@ int swap_readpage(struct page *page) ret = -ENOMEM; goto out; } - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; count_vm_event(PSWPIN); submit_bio(bio); out: -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:16:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 155857CA6 for ; Fri, 15 Apr 2016 14:16:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 63B628F8033 for ; Fri, 15 Apr 2016 12:16:30 -0700 (PDT) X-ASG-Debug-ID: 1460747784-04bdf011026103f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 3mXTNAHPOGFAj3ej (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:16:24 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 57F9A552E6; Fri, 15 Apr 2016 19:16:24 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhR007872; Fri, 15 Apr 2016 15:16:21 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 01/42] block/fs/drivers: remove rw argument from submit_bio Date: Fri, 15 Apr 2016 14:15:36 -0500 X-ASG-Orig-Subj: [PATCH 01/42] block/fs/drivers: remove rw argument from submit_bio Message-Id: <1460747777-8479-2-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747784 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com From: Mike Christie This has callers of submit_bio/submit_bio_wait set the bio->bi_rw instead of passing it in. This makes that use the same as generic_make_request and how we set the other bio fields. v5: 1. Missed crypto fs submit_bio_wait call. v2: 1. Set bi_rw instead of ORing it. For cloned bios, I still OR it to keep the old behavior incase there bits we wanted to keep. Signed-off-by: Mike Christie Reviewed-by: Bart Van Assche Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- block/bio.c | 7 +++---- block/blk-core.c | 11 ++++------- block/blk-flush.c | 3 ++- block/blk-lib.c | 9 ++++++--- drivers/block/drbd/drbd_actlog.c | 2 +- drivers/block/drbd/drbd_bitmap.c | 4 ++-- drivers/block/floppy.c | 3 ++- drivers/block/xen-blkback/blkback.c | 4 +++- drivers/block/xen-blkfront.c | 4 ++-- drivers/md/bcache/debug.c | 6 ++++-- drivers/md/bcache/journal.c | 2 +- drivers/md/bcache/super.c | 4 ++-- drivers/md/dm-bufio.c | 3 ++- drivers/md/dm-io.c | 3 ++- drivers/md/dm-log-writes.c | 9 ++++++--- drivers/md/dm-thin.c | 3 ++- drivers/md/md.c | 10 +++++++--- drivers/md/raid1.c | 3 ++- drivers/md/raid10.c | 4 +++- drivers/md/raid5-cache.c | 7 ++++--- drivers/target/target_core_iblock.c | 24 +++++++++++++----------- fs/btrfs/check-integrity.c | 18 ++++++++++-------- fs/btrfs/check-integrity.h | 4 ++-- fs/btrfs/disk-io.c | 3 ++- fs/btrfs/extent_io.c | 7 ++++--- fs/btrfs/raid56.c | 17 ++++++++++++----- fs/btrfs/scrub.c | 15 ++++++++++----- fs/btrfs/volumes.c | 14 +++++++------- fs/buffer.c | 3 ++- fs/crypto/crypto.c | 3 ++- fs/direct-io.c | 3 ++- fs/ext4/crypto.c | 3 ++- fs/ext4/page-io.c | 3 ++- fs/ext4/readpage.c | 9 +++++---- fs/f2fs/data.c | 13 ++++++++----- fs/f2fs/segment.c | 6 ++++-- fs/gfs2/lops.c | 3 ++- fs/gfs2/meta_io.c | 3 ++- fs/gfs2/ops_fstype.c | 3 ++- fs/hfsplus/wrapper.c | 3 ++- fs/jfs/jfs_logmgr.c | 6 ++++-- fs/jfs/jfs_metapage.c | 10 ++++++---- fs/logfs/dev_bdev.c | 15 ++++++++++----- fs/mpage.c | 3 ++- fs/nfs/blocklayout/blocklayout.c | 22 ++++++++++++---------- fs/nilfs2/segbuf.c | 3 ++- fs/ocfs2/cluster/heartbeat.c | 12 +++++++----- fs/xfs/xfs_aops.c | 15 ++++++++++----- fs/xfs/xfs_buf.c | 4 ++-- include/linux/bio.h | 2 +- include/linux/fs.h | 2 +- kernel/power/swap.c | 5 +++-- mm/page_io.c | 10 ++++++---- 53 files changed, 221 insertions(+), 146 deletions(-) diff --git a/block/bio.c b/block/bio.c index 807d25e..f319b78 100644 --- a/block/bio.c +++ b/block/bio.c @@ -865,21 +865,20 @@ static void submit_bio_wait_endio(struct bio *bio) /** * submit_bio_wait - submit a bio, and wait until it completes - * @rw: whether to %READ or %WRITE, or maybe to %READA (read ahead) * @bio: The &struct bio which describes the I/O * * Simple wrapper around submit_bio(). Returns 0 on success, or the error from * bio_endio() on failure. */ -int submit_bio_wait(int rw, struct bio *bio) +int submit_bio_wait(struct bio *bio) { struct submit_bio_ret ret; - rw |= REQ_SYNC; init_completion(&ret.event); bio->bi_private = &ret; bio->bi_end_io = submit_bio_wait_endio; - submit_bio(rw, bio); + bio->bi_rw |= REQ_SYNC; + submit_bio(bio); wait_for_completion_io(&ret.event); return ret.error; diff --git a/block/blk-core.c b/block/blk-core.c index 2475b1c7..e953407 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -2094,7 +2094,6 @@ EXPORT_SYMBOL(generic_make_request); /** * submit_bio - submit a bio to the block device layer for I/O - * @rw: whether to %READ or %WRITE, or maybe to %READA (read ahead) * @bio: The &struct bio which describes the I/O * * submit_bio() is very similar in purpose to generic_make_request(), and @@ -2102,10 +2101,8 @@ EXPORT_SYMBOL(generic_make_request); * interfaces; @bio must be presetup and ready for I/O. * */ -blk_qc_t submit_bio(int rw, struct bio *bio) +blk_qc_t submit_bio(struct bio *bio) { - bio->bi_rw |= rw; - /* * If it's a regular read/write or a barrier with data attached, * go through the normal accounting stuff before submission. @@ -2113,12 +2110,12 @@ blk_qc_t submit_bio(int rw, struct bio *bio) if (bio_has_data(bio)) { unsigned int count; - if (unlikely(rw & REQ_WRITE_SAME)) + if (unlikely(bio->bi_rw & REQ_WRITE_SAME)) count = bdev_logical_block_size(bio->bi_bdev) >> 9; else count = bio_sectors(bio); - if (rw & WRITE) { + if (bio->bi_rw & WRITE) { count_vm_events(PGPGOUT, count); } else { task_io_account_read(bio->bi_iter.bi_size); @@ -2129,7 +2126,7 @@ blk_qc_t submit_bio(int rw, struct bio *bio) char b[BDEVNAME_SIZE]; printk(KERN_DEBUG "%s(%d): %s block %Lu on %s (%u sectors)\n", current->comm, task_pid_nr(current), - (rw & WRITE) ? "WRITE" : "READ", + (bio->bi_rw & WRITE) ? "WRITE" : "READ", (unsigned long long)bio->bi_iter.bi_sector, bdevname(bio->bi_bdev, b), count); diff --git a/block/blk-flush.c b/block/blk-flush.c index b1c91d2..3af4a5a 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c @@ -485,8 +485,9 @@ int blkdev_issue_flush(struct block_device *bdev, gfp_t gfp_mask, bio = bio_alloc(gfp_mask, 0); bio->bi_bdev = bdev; + bio->bi_rw = WRITE_FLUSH; - ret = submit_bio_wait(WRITE_FLUSH, bio); + ret = submit_bio_wait(bio); /* * The driver must store the error location in ->bi_sector, if diff --git a/block/blk-lib.c b/block/blk-lib.c index 9ebf653..87e3de4 100644 --- a/block/blk-lib.c +++ b/block/blk-lib.c @@ -102,13 +102,14 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, bio->bi_end_io = bio_batch_end_io; bio->bi_bdev = bdev; bio->bi_private = &bb; + bio->bi_rw = type; bio->bi_iter.bi_size = req_sects << 9; nr_sects -= req_sects; sector = end_sect; atomic_inc(&bb.done); - submit_bio(type, bio); + submit_bio(bio); /* * We can loop for a long time in here, if someone does @@ -177,6 +178,7 @@ int blkdev_issue_write_same(struct block_device *bdev, sector_t sector, bio->bi_io_vec->bv_page = page; bio->bi_io_vec->bv_offset = 0; bio->bi_io_vec->bv_len = bdev_logical_block_size(bdev); + bio->bi_rw = REQ_WRITE | REQ_WRITE_SAME; if (nr_sects > max_write_same_sectors) { bio->bi_iter.bi_size = max_write_same_sectors << 9; @@ -188,7 +190,7 @@ int blkdev_issue_write_same(struct block_device *bdev, sector_t sector, } atomic_inc(&bb.done); - submit_bio(REQ_WRITE | REQ_WRITE_SAME, bio); + submit_bio(bio); } /* Wait for bios in-flight */ @@ -238,6 +240,7 @@ static int __blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, bio->bi_bdev = bdev; bio->bi_end_io = bio_batch_end_io; bio->bi_private = &bb; + bio->bi_rw = WRITE; while (nr_sects != 0) { sz = min((sector_t) PAGE_SIZE >> 9 , nr_sects); @@ -249,7 +252,7 @@ static int __blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, } ret = 0; atomic_inc(&bb.done); - submit_bio(WRITE, bio); + submit_bio(bio); } /* Wait for bios in-flight */ diff --git a/drivers/block/drbd/drbd_actlog.c b/drivers/block/drbd/drbd_actlog.c index 10459a1..6069e15 100644 --- a/drivers/block/drbd/drbd_actlog.c +++ b/drivers/block/drbd/drbd_actlog.c @@ -177,7 +177,7 @@ static int _drbd_md_sync_page_io(struct drbd_device *device, if (drbd_insert_fault(device, (rw & WRITE) ? DRBD_FAULT_MD_WR : DRBD_FAULT_MD_RD)) bio_io_error(bio); else - submit_bio(rw, bio); + submit_bio(bio); wait_until_done_or_force_detached(device, bdev, &device->md_io.done); if (!bio->bi_error) err = device->md_io.error; diff --git a/drivers/block/drbd/drbd_bitmap.c b/drivers/block/drbd/drbd_bitmap.c index 92d6fc0..e8959fe 100644 --- a/drivers/block/drbd/drbd_bitmap.c +++ b/drivers/block/drbd/drbd_bitmap.c @@ -1011,12 +1011,12 @@ static void bm_page_io_async(struct drbd_bm_aio_ctx *ctx, int page_nr) __must_ho bio_add_page(bio, page, len, 0); bio->bi_private = ctx; bio->bi_end_io = drbd_bm_endio; + bio->bi_rw = rw; if (drbd_insert_fault(device, (rw & WRITE) ? DRBD_FAULT_MD_WR : DRBD_FAULT_MD_RD)) { - bio->bi_rw |= rw; bio_io_error(bio); } else { - submit_bio(rw, bio); + submit_bio(bio); /* this should not count as user activity and cause the * resync to throttle -- see drbd_rs_should_slow_down(). */ atomic_add(len >> 9, &device->rs_sect_ev); diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 84708a5..73ded25 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c @@ -3822,8 +3822,9 @@ static int __floppy_read_block_0(struct block_device *bdev, int drive) bio.bi_flags |= (1 << BIO_QUIET); bio.bi_private = &cbdata; bio.bi_end_io = floppy_rb0_cb; + bio.bi_rw = READ; - submit_bio(READ, &bio); + submit_bio(&bio); process_fd_request(); init_completion(&cbdata.complete); diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c index 4809c150..79fe493 100644 --- a/drivers/block/xen-blkback/blkback.c +++ b/drivers/block/xen-blkback/blkback.c @@ -1369,6 +1369,7 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, bio->bi_private = pending_req; bio->bi_end_io = end_block_io_op; bio->bi_iter.bi_sector = preq.sector_number; + bio->bi_rw = operation; } preq.sector_number += seg[i].nsec; @@ -1386,13 +1387,14 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, bio->bi_bdev = preq.bdev; bio->bi_private = pending_req; bio->bi_end_io = end_block_io_op; + bio->bi_rw = operation; } atomic_set(&pending_req->pendcnt, nbio); blk_start_plug(&plug); for (i = 0; i < nbio; i++) - submit_bio(operation, biolist[i]); + submit_bio(biolist[i]); /* Let the I/Os go.. */ blk_finish_plug(&plug); diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index ca13df8..52963a2 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c @@ -2114,7 +2114,7 @@ static int blkif_recover(struct blkfront_info *info) bio_trim(cloned_bio, offset, size); cloned_bio->bi_private = split_bio; cloned_bio->bi_end_io = split_bio_end; - submit_bio(cloned_bio->bi_rw, cloned_bio); + submit_bio(cloned_bio); } /* * Now we have to wait for all those smaller bios to @@ -2123,7 +2123,7 @@ static int blkif_recover(struct blkfront_info *info) continue; } /* We don't need to split this bio */ - submit_bio(bio->bi_rw, bio); + submit_bio(bio); } return 0; diff --git a/drivers/md/bcache/debug.c b/drivers/md/bcache/debug.c index 8b1f1d5..52b6bcf 100644 --- a/drivers/md/bcache/debug.c +++ b/drivers/md/bcache/debug.c @@ -52,9 +52,10 @@ void bch_btree_verify(struct btree *b) bio->bi_bdev = PTR_CACHE(b->c, &b->key, 0)->bdev; bio->bi_iter.bi_sector = PTR_OFFSET(&b->key, 0); bio->bi_iter.bi_size = KEY_SIZE(&v->key) << 9; + bio->bi_rw = REQ_META|READ_SYNC; bch_bio_map(bio, sorted); - submit_bio_wait(REQ_META|READ_SYNC, bio); + submit_bio_wait(bio); bch_bbio_free(bio, b->c); memcpy(ondisk, sorted, KEY_SIZE(&v->key) << 9); @@ -113,11 +114,12 @@ void bch_data_verify(struct cached_dev *dc, struct bio *bio) check = bio_clone(bio, GFP_NOIO); if (!check) return; + check->bi_rw |= READ_SYNC; if (bio_alloc_pages(check, GFP_NOIO)) goto out_put; - submit_bio_wait(READ_SYNC, check); + submit_bio_wait(check); bio_for_each_segment(bv, bio, iter) { void *p1 = kmap_atomic(bv.bv_page); diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c index 29eba72..af3f9f7 100644 --- a/drivers/md/bcache/journal.c +++ b/drivers/md/bcache/journal.c @@ -418,7 +418,7 @@ static void journal_discard_work(struct work_struct *work) struct journal_device *ja = container_of(work, struct journal_device, discard_work); - submit_bio(0, &ja->discard_bio); + submit_bio(&ja->discard_bio); } static void do_journal_discard(struct cache *ca) diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index f5dbb4e..1eb526a7 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c @@ -212,7 +212,7 @@ static void __write_super(struct cache_sb *sb, struct bio *bio) unsigned i; bio->bi_iter.bi_sector = SB_SECTOR; - bio->bi_rw = REQ_SYNC|REQ_META; + bio->bi_rw = REQ_WRITE|REQ_SYNC|REQ_META; bio->bi_iter.bi_size = SB_SIZE; bch_bio_map(bio, NULL); @@ -238,7 +238,7 @@ static void __write_super(struct cache_sb *sb, struct bio *bio) pr_debug("ver %llu, flags %llu, seq %llu", sb->version, sb->flags, sb->seq); - submit_bio(REQ_WRITE, bio); + submit_bio(bio); } static void bch_write_bdev_super_unlock(struct closure *cl) diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c index cd77216..9d3ee7f 100644 --- a/drivers/md/dm-bufio.c +++ b/drivers/md/dm-bufio.c @@ -634,6 +634,7 @@ static void use_inline_bio(struct dm_buffer *b, int rw, sector_t block, * the dm_buffer's inline bio is local to bufio. */ b->bio.bi_private = end_io; + b->bio.bi_rw = rw; /* * We assume that if len >= PAGE_SIZE ptr is page-aligned. @@ -660,7 +661,7 @@ static void use_inline_bio(struct dm_buffer *b, int rw, sector_t block, ptr += PAGE_SIZE; } while (len > 0); - submit_bio(rw, &b->bio); + submit_bio(&b->bio); } static void submit_io(struct dm_buffer *b, int rw, sector_t block, diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c index 06d426e..50f17e3 100644 --- a/drivers/md/dm-io.c +++ b/drivers/md/dm-io.c @@ -322,6 +322,7 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, bio->bi_iter.bi_sector = where->sector + (where->count - remaining); bio->bi_bdev = where->bdev; bio->bi_end_io = endio; + bio->bi_rw = rw; store_io_and_region_in_bio(bio, io, region); if (rw & REQ_DISCARD) { @@ -355,7 +356,7 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, } atomic_inc(&io->count); - submit_bio(rw, bio); + submit_bio(bio); } while (remaining); } diff --git a/drivers/md/dm-log-writes.c b/drivers/md/dm-log-writes.c index 608302e..addcc4b 100644 --- a/drivers/md/dm-log-writes.c +++ b/drivers/md/dm-log-writes.c @@ -205,6 +205,7 @@ static int write_metadata(struct log_writes_c *lc, void *entry, bio->bi_bdev = lc->logdev->bdev; bio->bi_end_io = log_end_io; bio->bi_private = lc; + bio->bi_rw = WRITE; page = alloc_page(GFP_KERNEL); if (!page) { @@ -226,7 +227,7 @@ static int write_metadata(struct log_writes_c *lc, void *entry, DMERR("Couldn't add page to the log block"); goto error_bio; } - submit_bio(WRITE, bio); + submit_bio(bio); return 0; error_bio: bio_put(bio); @@ -269,6 +270,7 @@ static int log_one_block(struct log_writes_c *lc, bio->bi_bdev = lc->logdev->bdev; bio->bi_end_io = log_end_io; bio->bi_private = lc; + bio->bi_rw = WRITE; for (i = 0; i < block->vec_cnt; i++) { /* @@ -279,7 +281,7 @@ static int log_one_block(struct log_writes_c *lc, block->vecs[i].bv_len, 0); if (ret != block->vecs[i].bv_len) { atomic_inc(&lc->io_blocks); - submit_bio(WRITE, bio); + submit_bio(bio); bio = bio_alloc(GFP_KERNEL, block->vec_cnt - i); if (!bio) { DMERR("Couldn't alloc log bio"); @@ -290,6 +292,7 @@ static int log_one_block(struct log_writes_c *lc, bio->bi_bdev = lc->logdev->bdev; bio->bi_end_io = log_end_io; bio->bi_private = lc; + bio->bi_rw = WRITE; ret = bio_add_page(bio, block->vecs[i].bv_page, block->vecs[i].bv_len, 0); @@ -301,7 +304,7 @@ static int log_one_block(struct log_writes_c *lc, } sector += block->vecs[i].bv_len >> SECTOR_SHIFT; } - submit_bio(WRITE, bio); + submit_bio(bio); out: kfree(block->data); kfree(block); diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index 04e7f3b..69d86e1 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c @@ -366,8 +366,9 @@ static int __blkdev_issue_discard_async(struct block_device *bdev, sector_t sect bio->bi_iter.bi_sector = sector; bio->bi_bdev = bdev; bio->bi_iter.bi_size = nr_sects << 9; + bio->bi_rw = type; - submit_bio(type, bio); + submit_bio(bio); return 0; } diff --git a/drivers/md/md.c b/drivers/md/md.c index 5d61e76..ec3c98d 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -392,8 +392,9 @@ static void submit_flushes(struct work_struct *ws) bi->bi_end_io = md_end_flush; bi->bi_private = rdev; bi->bi_bdev = rdev->bdev; + bi->bi_rw = WRITE_FLUSH; atomic_inc(&mddev->flush_pending); - submit_bio(WRITE_FLUSH, bi); + submit_bio(bi); rcu_read_lock(); rdev_dec_pending(rdev, mddev); } @@ -740,9 +741,10 @@ void md_super_write(struct mddev *mddev, struct md_rdev *rdev, bio_add_page(bio, page, size, 0); bio->bi_private = rdev; bio->bi_end_io = super_written; + bio->bi_rw = WRITE_FLUSH_FUA; atomic_inc(&mddev->pending_writes); - submit_bio(WRITE_FLUSH_FUA, bio); + submit_bio(bio); } void md_super_wait(struct mddev *mddev) @@ -759,6 +761,7 @@ int sync_page_io(struct md_rdev *rdev, sector_t sector, int size, bio->bi_bdev = (metadata_op && rdev->meta_bdev) ? rdev->meta_bdev : rdev->bdev; + bio->bi_rw = rw; if (metadata_op) bio->bi_iter.bi_sector = sector + rdev->sb_start; else if (rdev->mddev->reshape_position != MaxSector && @@ -768,7 +771,8 @@ int sync_page_io(struct md_rdev *rdev, sector_t sector, int size, else bio->bi_iter.bi_sector = sector + rdev->data_offset; bio_add_page(bio, page, size, 0); - submit_bio_wait(rw, bio); + + submit_bio_wait(bio); ret = !bio->bi_error; bio_put(bio); diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index a7f2b9c..424df7e 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -2208,7 +2208,8 @@ static int narrow_write_error(struct r1bio *r1_bio, int i) bio_trim(wbio, sector - r1_bio->sector, sectors); wbio->bi_iter.bi_sector += rdev->data_offset; wbio->bi_bdev = rdev->bdev; - if (submit_bio_wait(WRITE, wbio) < 0) + + if (submit_bio_wait(wbio) < 0) /* failure! */ ok = rdev_set_badblocks(rdev, sector, sectors, 0) diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index e3fd725..4736be8 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -2474,7 +2474,9 @@ static int narrow_write_error(struct r10bio *r10_bio, int i) choose_data_offset(r10_bio, rdev) + (sector - r10_bio->sector)); wbio->bi_bdev = rdev->bdev; - if (submit_bio_wait(WRITE, wbio) < 0) + wbio->bi_rw = WRITE; + + if (submit_bio_wait(wbio) < 0) /* Failure! */ ok = rdev_set_badblocks(rdev, sector, sectors, 0) diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c index 26f1497..90c2618 100644 --- a/drivers/md/raid5-cache.c +++ b/drivers/md/raid5-cache.c @@ -254,7 +254,7 @@ static void r5l_submit_current_io(struct r5l_log *log) __r5l_set_io_unit_state(io, IO_UNIT_IO_START); spin_unlock_irqrestore(&log->io_list_lock, flags); - submit_bio(WRITE, io->current_bio); + submit_bio(io->current_bio); } static struct bio *r5l_bio_alloc(struct r5l_log *log) @@ -373,7 +373,7 @@ static void r5l_append_payload_page(struct r5l_log *log, struct page *page) io->current_bio = r5l_bio_alloc(log); bio_chain(io->current_bio, prev); - submit_bio(WRITE, prev); + submit_bio(prev); } if (!bio_add_page(io->current_bio, page, PAGE_SIZE, 0)) @@ -686,7 +686,8 @@ void r5l_flush_stripe_to_raid(struct r5l_log *log) bio_reset(&log->flush_bio); log->flush_bio.bi_bdev = log->rdev->bdev; log->flush_bio.bi_end_io = r5l_log_flush_endio; - submit_bio(WRITE_FLUSH, &log->flush_bio); + log->flush_bio.bi_rw = WRITE_FLUSH; + submit_bio(&log->flush_bio); } static void r5l_write_super(struct r5l_log *log, sector_t cp); diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c index 7c4efb4..c25109c 100644 --- a/drivers/target/target_core_iblock.c +++ b/drivers/target/target_core_iblock.c @@ -312,7 +312,7 @@ static void iblock_bio_done(struct bio *bio) } static struct bio * -iblock_get_bio(struct se_cmd *cmd, sector_t lba, u32 sg_num) +iblock_get_bio(struct se_cmd *cmd, sector_t lba, u32 sg_num, int rw) { struct iblock_dev *ib_dev = IBLOCK_DEV(cmd->se_dev); struct bio *bio; @@ -334,18 +334,19 @@ iblock_get_bio(struct se_cmd *cmd, sector_t lba, u32 sg_num) bio->bi_private = cmd; bio->bi_end_io = &iblock_bio_done; bio->bi_iter.bi_sector = lba; + bio->bi_rw = rw; return bio; } -static void iblock_submit_bios(struct bio_list *list, int rw) +static void iblock_submit_bios(struct bio_list *list) { struct blk_plug plug; struct bio *bio; blk_start_plug(&plug); while ((bio = bio_list_pop(list))) - submit_bio(rw, bio); + submit_bio(bio); blk_finish_plug(&plug); } @@ -387,9 +388,10 @@ iblock_execute_sync_cache(struct se_cmd *cmd) bio = bio_alloc(GFP_KERNEL, 0); bio->bi_end_io = iblock_end_io_flush; bio->bi_bdev = ib_dev->ibd_bd; + bio->bi_rw = WRITE_FLUSH; if (!immed) bio->bi_private = cmd; - submit_bio(WRITE_FLUSH, bio); + submit_bio(bio); return 0; } @@ -478,7 +480,7 @@ iblock_execute_write_same(struct se_cmd *cmd) goto fail; cmd->priv = ibr; - bio = iblock_get_bio(cmd, block_lba, 1); + bio = iblock_get_bio(cmd, block_lba, 1, WRITE); if (!bio) goto fail_free_ibr; @@ -491,7 +493,7 @@ iblock_execute_write_same(struct se_cmd *cmd) while (bio_add_page(bio, sg_page(sg), sg->length, sg->offset) != sg->length) { - bio = iblock_get_bio(cmd, block_lba, 1); + bio = iblock_get_bio(cmd, block_lba, 1, WRITE); if (!bio) goto fail_put_bios; @@ -504,7 +506,7 @@ iblock_execute_write_same(struct se_cmd *cmd) sectors -= 1; } - iblock_submit_bios(&list, WRITE); + iblock_submit_bios(&list); return 0; fail_put_bios: @@ -712,7 +714,7 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, return 0; } - bio = iblock_get_bio(cmd, block_lba, sgl_nents); + bio = iblock_get_bio(cmd, block_lba, sgl_nents, rw); if (!bio) goto fail_free_ibr; @@ -732,11 +734,11 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, while (bio_add_page(bio, sg_page(sg), sg->length, sg->offset) != sg->length) { if (bio_cnt >= IBLOCK_MAX_BIO_PER_TASK) { - iblock_submit_bios(&list, rw); + iblock_submit_bios(&list); bio_cnt = 0; } - bio = iblock_get_bio(cmd, block_lba, sg_num); + bio = iblock_get_bio(cmd, block_lba, sg_num, rw); if (!bio) goto fail_put_bios; @@ -756,7 +758,7 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, goto fail_put_bios; } - iblock_submit_bios(&list, rw); + iblock_submit_bios(&list); iblock_complete_cmd(cmd); return 0; diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index 516e19d..9400acd 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c @@ -1673,6 +1673,7 @@ static int btrfsic_read_block(struct btrfsic_state *state, } bio->bi_bdev = block_ctx->dev->bdev; bio->bi_iter.bi_sector = dev_bytenr >> 9; + bio->bi_rw = READ; for (j = i; j < num_pages; j++) { ret = bio_add_page(bio, block_ctx->pagev[j], @@ -1685,7 +1686,7 @@ static int btrfsic_read_block(struct btrfsic_state *state, "btrfsic: error, failed to add a single page!\n"); return -1; } - if (submit_bio_wait(READ, bio)) { + if (submit_bio_wait(bio)) { printk(KERN_INFO "btrfsic: read error at logical %llu dev %s!\n", block_ctx->start, block_ctx->dev->name); @@ -2918,9 +2919,10 @@ int btrfsic_submit_bh(int rw, struct buffer_head *bh) return submit_bh(rw, bh); } -static void __btrfsic_submit_bio(int rw, struct bio *bio) +static void __btrfsic_submit_bio(struct bio *bio) { struct btrfsic_dev_state *dev_state; + int rw = bio->bi_rw; if (!btrfsic_is_initialized) return; @@ -3016,16 +3018,16 @@ leave: mutex_unlock(&btrfsic_mutex); } -void btrfsic_submit_bio(int rw, struct bio *bio) +void btrfsic_submit_bio(struct bio *bio) { - __btrfsic_submit_bio(rw, bio); - submit_bio(rw, bio); + __btrfsic_submit_bio(bio); + submit_bio(bio); } -int btrfsic_submit_bio_wait(int rw, struct bio *bio) +int btrfsic_submit_bio_wait(struct bio *bio) { - __btrfsic_submit_bio(rw, bio); - return submit_bio_wait(rw, bio); + __btrfsic_submit_bio(bio); + return submit_bio_wait(bio); } int btrfsic_mount(struct btrfs_root *root, diff --git a/fs/btrfs/check-integrity.h b/fs/btrfs/check-integrity.h index 13b8566..c04e249 100644 --- a/fs/btrfs/check-integrity.h +++ b/fs/btrfs/check-integrity.h @@ -21,8 +21,8 @@ #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY int btrfsic_submit_bh(int rw, struct buffer_head *bh); -void btrfsic_submit_bio(int rw, struct bio *bio); -int btrfsic_submit_bio_wait(int rw, struct bio *bio); +void btrfsic_submit_bio(struct bio *bio); +int btrfsic_submit_bio_wait(struct bio *bio); #else #define btrfsic_submit_bh submit_bh #define btrfsic_submit_bio submit_bio diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index aeb0905..0bd25e4 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -3476,12 +3476,13 @@ static int write_dev_flush(struct btrfs_device *device, int wait) bio->bi_end_io = btrfs_end_empty_barrier; bio->bi_bdev = device->bdev; + bio->bi_rw = WRITE_FLUSH; init_completion(&device->flush_wait); bio->bi_private = &device->flush_wait; device->flush_bio = bio; bio_get(bio); - btrfsic_submit_bio(WRITE_FLUSH, bio); + btrfsic_submit_bio(bio); return 0; } diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index b67d6d2..fdeb8fa 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -2040,9 +2040,10 @@ int repair_io_failure(struct inode *inode, u64 start, u64 length, u64 logical, return -EIO; } bio->bi_bdev = dev->bdev; + bio->bi_rw = WRITE_SYNC; bio_add_page(bio, page, length, pg_offset); - if (btrfsic_submit_bio_wait(WRITE_SYNC, bio)) { + if (btrfsic_submit_bio_wait(bio)) { /* try to remap that extent elsewhere? */ bio_put(bio); btrfs_dev_stat_inc_and_print(dev, BTRFS_DEV_STAT_WRITE_ERRS); @@ -2725,14 +2726,14 @@ static int __must_check submit_one_bio(int rw, struct bio *bio, start = page_offset(page) + bvec->bv_offset; bio->bi_private = NULL; - + bio->bi_rw = rw; bio_get(bio); if (tree->ops && tree->ops->submit_bio_hook) ret = tree->ops->submit_bio_hook(page->mapping->host, rw, bio, mirror_num, bio_flags, start); else - btrfsic_submit_bio(rw, bio); + btrfsic_submit_bio(bio); bio_put(bio); return ret; diff --git a/fs/btrfs/raid56.c b/fs/btrfs/raid56.c index 0b7792e..439d7eb 100644 --- a/fs/btrfs/raid56.c +++ b/fs/btrfs/raid56.c @@ -1320,7 +1320,9 @@ write_data: bio->bi_private = rbio; bio->bi_end_io = raid_write_end_io; - submit_bio(WRITE, bio); + bio->bi_rw = WRITE; + + submit_bio(bio); } return; @@ -1573,11 +1575,12 @@ static int raid56_rmw_stripe(struct btrfs_raid_bio *rbio) bio->bi_private = rbio; bio->bi_end_io = raid_rmw_end_io; + bio->bi_rw = READ; btrfs_bio_wq_end_io(rbio->fs_info, bio, BTRFS_WQ_ENDIO_RAID56); - submit_bio(READ, bio); + submit_bio(bio); } /* the actual write will happen once the reads are done */ return 0; @@ -2097,11 +2100,12 @@ static int __raid56_parity_recover(struct btrfs_raid_bio *rbio) bio->bi_private = rbio; bio->bi_end_io = raid_recover_end_io; + bio->bi_rw = READ; btrfs_bio_wq_end_io(rbio->fs_info, bio, BTRFS_WQ_ENDIO_RAID56); - submit_bio(READ, bio); + submit_bio(bio); } out: return 0; @@ -2433,7 +2437,9 @@ submit_write: bio->bi_private = rbio; bio->bi_end_io = raid_write_end_io; - submit_bio(WRITE, bio); + bio->bi_rw = WRITE; + + submit_bio(bio); } return; @@ -2610,11 +2616,12 @@ static void raid56_parity_scrub_stripe(struct btrfs_raid_bio *rbio) bio->bi_private = rbio; bio->bi_end_io = raid56_parity_scrub_end_io; + bio->bi_rw = READ; btrfs_bio_wq_end_io(rbio->fs_info, bio, BTRFS_WQ_ENDIO_RAID56); - submit_bio(READ, bio); + submit_bio(bio); } /* the actual write will happen once the reads are done */ return; diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 2ff2876..184cb57 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -1504,8 +1504,9 @@ static void scrub_recheck_block(struct btrfs_fs_info *fs_info, sblock->no_io_error_seen = 0; } else { bio->bi_iter.bi_sector = page->physical >> 9; + bio->bi_rw = READ; - if (btrfsic_submit_bio_wait(READ, bio)) + if (btrfsic_submit_bio_wait(bio)) sblock->no_io_error_seen = 0; } @@ -1583,6 +1584,7 @@ static int scrub_repair_page_from_good_copy(struct scrub_block *sblock_bad, return -EIO; bio->bi_bdev = page_bad->dev->bdev; bio->bi_iter.bi_sector = page_bad->physical >> 9; + bio->bi_rw = WRITE; ret = bio_add_page(bio, page_good->page, PAGE_SIZE, 0); if (PAGE_SIZE != ret) { @@ -1590,7 +1592,7 @@ static int scrub_repair_page_from_good_copy(struct scrub_block *sblock_bad, return -EIO; } - if (btrfsic_submit_bio_wait(WRITE, bio)) { + if (btrfsic_submit_bio_wait(bio)) { btrfs_dev_stat_inc_and_print(page_bad->dev, BTRFS_DEV_STAT_WRITE_ERRS); btrfs_dev_replace_stats_inc( @@ -1684,6 +1686,7 @@ again: bio->bi_end_io = scrub_wr_bio_end_io; bio->bi_bdev = sbio->dev->bdev; bio->bi_iter.bi_sector = sbio->physical >> 9; + bio->bi_rw = WRITE; sbio->err = 0; } else if (sbio->physical + sbio->page_count * PAGE_SIZE != spage->physical_for_dev_replace || @@ -1731,7 +1734,7 @@ static void scrub_wr_submit(struct scrub_ctx *sctx) * orders the requests before sending them to the driver which * doubled the write performance on spinning disks when measured * with Linux 3.5 */ - btrfsic_submit_bio(WRITE, sbio->bio); + btrfsic_submit_bio(sbio->bio); } static void scrub_wr_bio_end_io(struct bio *bio) @@ -2041,7 +2044,7 @@ static void scrub_submit(struct scrub_ctx *sctx) sbio = sctx->bios[sctx->curr]; sctx->curr = -1; scrub_pending_bio_inc(sctx); - btrfsic_submit_bio(READ, sbio->bio); + btrfsic_submit_bio(sbio->bio); } static int scrub_add_page_to_rd_bio(struct scrub_ctx *sctx, @@ -2088,6 +2091,7 @@ again: bio->bi_end_io = scrub_bio_end_io; bio->bi_bdev = sbio->dev->bdev; bio->bi_iter.bi_sector = sbio->physical >> 9; + bio->bi_rw = READ; sbio->err = 0; } else if (sbio->physical + sbio->page_count * PAGE_SIZE != spage->physical || @@ -4389,6 +4393,7 @@ static int write_page_nocow(struct scrub_ctx *sctx, bio->bi_iter.bi_size = 0; bio->bi_iter.bi_sector = physical_for_dev_replace >> 9; bio->bi_bdev = dev->bdev; + bio->bi_rw = WRITE_SYNC; ret = bio_add_page(bio, page, PAGE_SIZE, 0); if (ret != PAGE_SIZE) { leave_with_eio: @@ -4397,7 +4402,7 @@ leave_with_eio: return -EIO; } - if (btrfsic_submit_bio_wait(WRITE_SYNC, bio)) + if (btrfsic_submit_bio_wait(bio)) goto leave_with_eio; bio_put(bio); diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 4dc66e6..318215d 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -462,7 +462,7 @@ loop_lock: sync_pending = 0; } - btrfsic_submit_bio(cur->bi_rw, cur); + btrfsic_submit_bio(cur); num_run++; batch_run++; @@ -5938,7 +5938,7 @@ static void btrfs_end_bio(struct bio *bio) */ static noinline void btrfs_schedule_bio(struct btrfs_root *root, struct btrfs_device *device, - int rw, struct bio *bio) + struct bio *bio) { int should_queue = 1; struct btrfs_pending_bios *pending_bios; @@ -5949,9 +5949,9 @@ static noinline void btrfs_schedule_bio(struct btrfs_root *root, } /* don't bother with additional async steps for reads, right now */ - if (!(rw & REQ_WRITE)) { + if (!(bio->bi_rw & REQ_WRITE)) { bio_get(bio); - btrfsic_submit_bio(rw, bio); + btrfsic_submit_bio(bio); bio_put(bio); return; } @@ -5965,7 +5965,6 @@ static noinline void btrfs_schedule_bio(struct btrfs_root *root, atomic_inc(&root->fs_info->nr_async_bios); WARN_ON(bio->bi_next); bio->bi_next = NULL; - bio->bi_rw |= rw; spin_lock(&device->io_lock); if (bio->bi_rw & REQ_SYNC) @@ -5999,6 +5998,7 @@ static void submit_stripe_bio(struct btrfs_root *root, struct btrfs_bio *bbio, btrfs_io_bio(bio)->stripe_index = dev_nr; bio->bi_end_io = btrfs_end_bio; bio->bi_iter.bi_sector = physical >> 9; + bio->bi_rw |= rw; #ifdef DEBUG { struct rcu_string *name; @@ -6017,9 +6017,9 @@ static void submit_stripe_bio(struct btrfs_root *root, struct btrfs_bio *bbio, btrfs_bio_counter_inc_noblocked(root->fs_info); if (async) - btrfs_schedule_bio(root, dev, rw, bio); + btrfs_schedule_bio(root, dev, bio); else - btrfsic_submit_bio(rw, bio); + btrfsic_submit_bio(bio); } static void bbio_error(struct btrfs_bio *bbio, struct bio *bio, u64 logical) diff --git a/fs/buffer.c b/fs/buffer.c index af0d9a8..7ed7869 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -3030,8 +3030,9 @@ static int submit_bh_wbc(int rw, struct buffer_head *bh, rw |= REQ_META; if (buffer_prio(bh)) rw |= REQ_PRIO; + bio->bi_rw = rw; - submit_bio(rw, bio); + submit_bio(bio); return 0; } diff --git a/fs/crypto/crypto.c b/fs/crypto/crypto.c index 2fc8c43..5b75856 100644 --- a/fs/crypto/crypto.c +++ b/fs/crypto/crypto.c @@ -318,6 +318,7 @@ int fscrypt_zeroout_range(struct inode *inode, pgoff_t lblk, bio->bi_bdev = inode->i_sb->s_bdev; bio->bi_iter.bi_sector = pblk << (inode->i_sb->s_blocksize_bits - 9); + bio->bi_rw = WRITE; ret = bio_add_page(bio, ciphertext_page, inode->i_sb->s_blocksize, 0); if (ret != inode->i_sb->s_blocksize) { @@ -327,7 +328,7 @@ int fscrypt_zeroout_range(struct inode *inode, pgoff_t lblk, err = -EIO; goto errout; } - err = submit_bio_wait(WRITE, bio); + err = submit_bio_wait(bio); if ((err == 0) && bio->bi_error) err = -EIO; bio_put(bio); diff --git a/fs/direct-io.c b/fs/direct-io.c index 4720377..1890ad2 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -374,6 +374,7 @@ dio_bio_alloc(struct dio *dio, struct dio_submit *sdio, bio->bi_bdev = bdev; bio->bi_iter.bi_sector = first_sector; + bio->bi_rw = dio->rw; if (dio->is_async) bio->bi_end_io = dio_bio_end_aio; else @@ -411,7 +412,7 @@ static inline void dio_bio_submit(struct dio *dio, struct dio_submit *sdio) sdio->logical_offset_in_bio); dio->bio_cookie = BLK_QC_T_NONE; } else - dio->bio_cookie = submit_bio(dio->rw, bio); + dio->bio_cookie = submit_bio(bio); sdio->bio = NULL; sdio->boundary = 0; diff --git a/fs/ext4/crypto.c b/fs/ext4/crypto.c index 6a6c273..811bd5d 100644 --- a/fs/ext4/crypto.c +++ b/fs/ext4/crypto.c @@ -428,6 +428,7 @@ int ext4_encrypted_zeroout(struct inode *inode, ext4_lblk_t lblk, bio->bi_bdev = inode->i_sb->s_bdev; bio->bi_iter.bi_sector = pblk << (inode->i_sb->s_blocksize_bits - 9); + bio->bi_rw = WRITE; ret = bio_add_page(bio, ciphertext_page, inode->i_sb->s_blocksize, 0); if (ret != inode->i_sb->s_blocksize) { @@ -439,7 +440,7 @@ int ext4_encrypted_zeroout(struct inode *inode, ext4_lblk_t lblk, err = -EIO; goto errout; } - err = submit_bio_wait(WRITE, bio); + err = submit_bio_wait(bio); if ((err == 0) && bio->bi_error) err = -EIO; bio_put(bio); diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c index e4fc8ea..e945b31 100644 --- a/fs/ext4/page-io.c +++ b/fs/ext4/page-io.c @@ -343,7 +343,8 @@ void ext4_io_submit(struct ext4_io_submit *io) int io_op = io->io_wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE; bio_get(io->io_bio); - submit_bio(io_op, io->io_bio); + io->io_bio->bi_rw = io_op; + submit_bio(io->io_bio); bio_put(io->io_bio); } io->io_bio = NULL; diff --git a/fs/ext4/readpage.c b/fs/ext4/readpage.c index dc54a4b..130bd45 100644 --- a/fs/ext4/readpage.c +++ b/fs/ext4/readpage.c @@ -271,7 +271,7 @@ int ext4_mpage_readpages(struct address_space *mapping, */ if (bio && (last_block_in_bio != blocks[0] - 1)) { submit_and_realloc: - submit_bio(READ, bio); + submit_bio(bio); bio = NULL; } if (bio == NULL) { @@ -294,6 +294,7 @@ int ext4_mpage_readpages(struct address_space *mapping, bio->bi_iter.bi_sector = blocks[0] << (blkbits - 9); bio->bi_end_io = mpage_end_io; bio->bi_private = ctx; + bio->bi_rw = READ; } length = first_hole << blkbits; @@ -303,14 +304,14 @@ int ext4_mpage_readpages(struct address_space *mapping, if (((map.m_flags & EXT4_MAP_BOUNDARY) && (relative_block == map.m_len)) || (first_hole != blocks_per_page)) { - submit_bio(READ, bio); + submit_bio(bio); bio = NULL; } else last_block_in_bio = blocks[blocks_per_page - 1]; goto next_page; confused: if (bio) { - submit_bio(READ, bio); + submit_bio(bio); bio = NULL; } if (!PageUptodate(page)) @@ -323,6 +324,6 @@ int ext4_mpage_readpages(struct address_space *mapping, } BUG_ON(pages && !list_empty(pages)); if (bio) - submit_bio(READ, bio); + submit_bio(bio); return 0; } diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index c29bcf4..74cf5cb 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -109,8 +109,9 @@ static void __submit_merged_bio(struct f2fs_bio_info *io) trace_f2fs_submit_read_bio(io->sbi->sb, fio, io->bio); else trace_f2fs_submit_write_bio(io->sbi->sb, fio, io->bio); + io->bio->bi_rw = fio->rw; - submit_bio(fio->rw, io->bio); + submit_bio(io->bio); io->bio = NULL; } @@ -227,8 +228,9 @@ int f2fs_submit_page_bio(struct f2fs_io_info *fio) bio_put(bio); return -EFAULT; } + bio->bi_rw = fio->rw; - submit_bio(fio->rw, bio); + submit_bio(bio); return 0; } @@ -983,7 +985,7 @@ got_it: */ if (bio && (last_block_in_bio != block_nr - 1)) { submit_and_realloc: - submit_bio(READ, bio); + submit_bio(bio); bio = NULL; } if (bio == NULL) { @@ -1012,6 +1014,7 @@ submit_and_realloc: bio->bi_iter.bi_sector = SECTOR_FROM_BLOCK(block_nr); bio->bi_end_io = f2fs_read_end_io; bio->bi_private = ctx; + bio->bi_rw = READ; } if (bio_add_page(bio, page, blocksize, 0) < blocksize) @@ -1026,7 +1029,7 @@ set_error_page: goto next_page; confused: if (bio) { - submit_bio(READ, bio); + submit_bio(bio); bio = NULL; } unlock_page(page); @@ -1036,7 +1039,7 @@ next_page: } BUG_ON(pages && !list_empty(pages)); if (bio) - submit_bio(READ, bio); + submit_bio(bio); return 0; } diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 299c784..0928d57 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -404,7 +404,8 @@ repeat: fcc->dispatch_list = llist_reverse_order(fcc->dispatch_list); bio->bi_bdev = sbi->sb->s_bdev; - ret = submit_bio_wait(WRITE_FLUSH, bio); + bio->bi_rw = WRITE_FLUSH; + ret = submit_bio_wait(bio); llist_for_each_entry_safe(cmd, next, fcc->dispatch_list, llnode) { @@ -436,7 +437,8 @@ int f2fs_issue_flush(struct f2fs_sb_info *sbi) int ret; bio->bi_bdev = sbi->sb->s_bdev; - ret = submit_bio_wait(WRITE_FLUSH, bio); + bio->bi_rw = WRITE_FLUSH; + ret = submit_bio_wait(bio); bio_put(bio); return ret; } diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c index d5369a1..ce28242 100644 --- a/fs/gfs2/lops.c +++ b/fs/gfs2/lops.c @@ -240,7 +240,8 @@ void gfs2_log_flush_bio(struct gfs2_sbd *sdp, int rw) { if (sdp->sd_log_bio) { atomic_inc(&sdp->sd_log_in_flight); - submit_bio(rw, sdp->sd_log_bio); + sdp->sd_log_bio->bi_rw = rw; + submit_bio(sdp->sd_log_bio); sdp->sd_log_bio = NULL; } } diff --git a/fs/gfs2/meta_io.c b/fs/gfs2/meta_io.c index 0448524..f8d33e8 100644 --- a/fs/gfs2/meta_io.c +++ b/fs/gfs2/meta_io.c @@ -230,7 +230,8 @@ static void gfs2_submit_bhs(int rw, struct buffer_head *bhs[], int num) bio_add_page(bio, bh->b_page, bh->b_size, bh_offset(bh)); } bio->bi_end_io = gfs2_meta_read_endio; - submit_bio(rw, bio); + bio->bi_rw = rw; + submit_bio(bio); } /** diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index 49b0bff..141b560 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c @@ -246,7 +246,8 @@ static int gfs2_read_super(struct gfs2_sbd *sdp, sector_t sector, int silent) bio->bi_end_io = end_bio_io_page; bio->bi_private = page; - submit_bio(READ_SYNC | REQ_META, bio); + bio->bi_rw = READ_SYNC | REQ_META; + submit_bio(bio); wait_on_page_locked(page); bio_put(bio); if (!PageUptodate(page)) { diff --git a/fs/hfsplus/wrapper.c b/fs/hfsplus/wrapper.c index cc62356..d026bb3 100644 --- a/fs/hfsplus/wrapper.c +++ b/fs/hfsplus/wrapper.c @@ -65,6 +65,7 @@ int hfsplus_submit_bio(struct super_block *sb, sector_t sector, bio = bio_alloc(GFP_NOIO, 1); bio->bi_iter.bi_sector = sector; bio->bi_bdev = sb->s_bdev; + bio->bi_rw = rw; if (!(rw & WRITE) && data) *data = (u8 *)buf + offset; @@ -83,7 +84,7 @@ int hfsplus_submit_bio(struct super_block *sb, sector_t sector, buf = (u8 *)buf + len; } - ret = submit_bio_wait(rw, bio); + ret = submit_bio_wait(bio); out: bio_put(bio); return ret < 0 ? ret : 0; diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c index 63759d7..3ee3f32 100644 --- a/fs/jfs/jfs_logmgr.c +++ b/fs/jfs/jfs_logmgr.c @@ -2002,12 +2002,13 @@ static int lbmRead(struct jfs_log * log, int pn, struct lbuf ** bpp) bio->bi_end_io = lbmIODone; bio->bi_private = bp; + bio->bi_rw = READ_SYNC; /*check if journaling to disk has been disabled*/ if (log->no_integrity) { bio->bi_iter.bi_size = 0; lbmIODone(bio); } else { - submit_bio(READ_SYNC, bio); + submit_bio(bio); } wait_event(bp->l_ioevent, (bp->l_flag != lbmREAD)); @@ -2145,13 +2146,14 @@ static void lbmStartIO(struct lbuf * bp) bio->bi_end_io = lbmIODone; bio->bi_private = bp; + bio->bi_rw = WRITE_SYNC; /* check if journaling to disk has been disabled */ if (log->no_integrity) { bio->bi_iter.bi_size = 0; lbmIODone(bio); } else { - submit_bio(WRITE_SYNC, bio); + submit_bio(bio); INCREMENT(lmStat.submitted); } } diff --git a/fs/jfs/jfs_metapage.c b/fs/jfs/jfs_metapage.c index b60e015..9725443 100644 --- a/fs/jfs/jfs_metapage.c +++ b/fs/jfs/jfs_metapage.c @@ -411,7 +411,7 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc) inc_io(page); if (!bio->bi_iter.bi_size) goto dump_bio; - submit_bio(WRITE, bio); + submit_bio(bio); nr_underway++; bio = NULL; } else @@ -434,6 +434,7 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc) bio->bi_iter.bi_sector = pblock << (inode->i_blkbits - 9); bio->bi_end_io = metapage_write_end_io; bio->bi_private = page; + bio->bi_rw = WRITE; /* Don't call bio_add_page yet, we may add to this vec */ bio_offset = offset; @@ -448,7 +449,7 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc) if (!bio->bi_iter.bi_size) goto dump_bio; - submit_bio(WRITE, bio); + submit_bio(bio); nr_underway++; } if (redirty) @@ -506,7 +507,7 @@ static int metapage_readpage(struct file *fp, struct page *page) insert_metapage(page, NULL); inc_io(page); if (bio) - submit_bio(READ, bio); + submit_bio(bio); bio = bio_alloc(GFP_NOFS, 1); bio->bi_bdev = inode->i_sb->s_bdev; @@ -514,6 +515,7 @@ static int metapage_readpage(struct file *fp, struct page *page) pblock << (inode->i_blkbits - 9); bio->bi_end_io = metapage_read_end_io; bio->bi_private = page; + bio->bi_rw = READ; len = xlen << inode->i_blkbits; offset = block_offset << inode->i_blkbits; if (bio_add_page(bio, page, len, offset) < len) @@ -523,7 +525,7 @@ static int metapage_readpage(struct file *fp, struct page *page) block_offset++; } if (bio) - submit_bio(READ, bio); + submit_bio(bio); else unlock_page(page); diff --git a/fs/logfs/dev_bdev.c b/fs/logfs/dev_bdev.c index cc26f8f..29704bd 100644 --- a/fs/logfs/dev_bdev.c +++ b/fs/logfs/dev_bdev.c @@ -29,8 +29,9 @@ static int sync_request(struct page *page, struct block_device *bdev, int rw) bio.bi_bdev = bdev; bio.bi_iter.bi_sector = page->index * (PAGE_SIZE >> 9); bio.bi_iter.bi_size = PAGE_SIZE; + bio.bi_rw = rw; - return submit_bio_wait(rw, &bio); + return submit_bio_wait(&bio); } static int bdev_readpage(void *_sb, struct page *page) @@ -95,8 +96,9 @@ static int __bdev_writeseg(struct super_block *sb, u64 ofs, pgoff_t index, bio->bi_iter.bi_sector = ofs >> 9; bio->bi_private = sb; bio->bi_end_io = writeseg_end_io; + bio->bi_rw = WRITE; atomic_inc(&super->s_pending_writes); - submit_bio(WRITE, bio); + submit_bio(bio); ofs += i * PAGE_SIZE; index += i; @@ -122,8 +124,9 @@ static int __bdev_writeseg(struct super_block *sb, u64 ofs, pgoff_t index, bio->bi_iter.bi_sector = ofs >> 9; bio->bi_private = sb; bio->bi_end_io = writeseg_end_io; + bio->bi_rw = WRITE; atomic_inc(&super->s_pending_writes); - submit_bio(WRITE, bio); + submit_bio(bio); return 0; } @@ -185,8 +188,9 @@ static int do_erase(struct super_block *sb, u64 ofs, pgoff_t index, bio->bi_iter.bi_sector = ofs >> 9; bio->bi_private = sb; bio->bi_end_io = erase_end_io; + bio->bi_rw = WRITE; atomic_inc(&super->s_pending_writes); - submit_bio(WRITE, bio); + submit_bio(bio); ofs += i * PAGE_SIZE; index += i; @@ -206,8 +210,9 @@ static int do_erase(struct super_block *sb, u64 ofs, pgoff_t index, bio->bi_iter.bi_sector = ofs >> 9; bio->bi_private = sb; bio->bi_end_io = erase_end_io; + bio->bi_rw = WRITE; atomic_inc(&super->s_pending_writes); - submit_bio(WRITE, bio); + submit_bio(bio); return 0; } diff --git a/fs/mpage.c b/fs/mpage.c index eedc644..2c251ec 100644 --- a/fs/mpage.c +++ b/fs/mpage.c @@ -59,8 +59,9 @@ static void mpage_end_io(struct bio *bio) static struct bio *mpage_bio_submit(int rw, struct bio *bio) { bio->bi_end_io = mpage_end_io; + bio->bi_rw = rw; guard_bio_eod(rw, bio); - submit_bio(rw, bio); + submit_bio(bio); return NULL; } diff --git a/fs/nfs/blocklayout/blocklayout.c b/fs/nfs/blocklayout/blocklayout.c index 17a42e4..4c79f4d 100644 --- a/fs/nfs/blocklayout/blocklayout.c +++ b/fs/nfs/blocklayout/blocklayout.c @@ -102,14 +102,15 @@ static inline void put_parallel(struct parallel_io *p) } static struct bio * -bl_submit_bio(int rw, struct bio *bio) +bl_submit_bio(struct bio *bio) { if (bio) { get_parallel(bio->bi_private); dprintk("%s submitting %s bio %u@%llu\n", __func__, - rw == READ ? "read" : "write", bio->bi_iter.bi_size, + bio->bi_rw == READ ? "read" : "write", + bio->bi_iter.bi_size, (unsigned long long)bio->bi_iter.bi_sector); - submit_bio(rw, bio); + submit_bio(bio); } return NULL; } @@ -158,7 +159,7 @@ do_add_page_to_bio(struct bio *bio, int npg, int rw, sector_t isect, if (disk_addr < map->start || disk_addr >= map->start + map->len) { if (!dev->map(dev, disk_addr, map)) return ERR_PTR(-EIO); - bio = bl_submit_bio(rw, bio); + bio = bl_submit_bio(bio); } disk_addr += map->disk_offset; disk_addr -= map->start; @@ -174,9 +175,10 @@ retry: disk_addr >> SECTOR_SHIFT, end_io, par); if (!bio) return ERR_PTR(-ENOMEM); + bio->bi_rw = rw; } if (bio_add_page(bio, page, *len, offset) < *len) { - bio = bl_submit_bio(rw, bio); + bio = bl_submit_bio(bio); goto retry; } return bio; @@ -252,7 +254,7 @@ bl_read_pagelist(struct nfs_pgio_header *header) for (i = pg_index; i < header->page_array.npages; i++) { if (extent_length <= 0) { /* We've used up the previous extent */ - bio = bl_submit_bio(READ, bio); + bio = bl_submit_bio(bio); /* Get the next one */ if (!ext_tree_lookup(bl, isect, &be, false)) { @@ -273,7 +275,7 @@ bl_read_pagelist(struct nfs_pgio_header *header) } if (is_hole(&be)) { - bio = bl_submit_bio(READ, bio); + bio = bl_submit_bio(bio); /* Fill hole w/ zeroes w/o accessing device */ dprintk("%s Zeroing page for hole\n", __func__); zero_user_segment(pages[i], pg_offset, pg_len); @@ -306,7 +308,7 @@ bl_read_pagelist(struct nfs_pgio_header *header) header->res.count = (isect << SECTOR_SHIFT) - header->args.offset; } out: - bl_submit_bio(READ, bio); + bl_submit_bio(bio); blk_finish_plug(&plug); put_parallel(par); return PNFS_ATTEMPTED; @@ -398,7 +400,7 @@ bl_write_pagelist(struct nfs_pgio_header *header, int sync) for (i = pg_index; i < header->page_array.npages; i++) { if (extent_length <= 0) { /* We've used up the previous extent */ - bio = bl_submit_bio(WRITE, bio); + bio = bl_submit_bio(bio); /* Get the next one */ if (!ext_tree_lookup(bl, isect, &be, true)) { header->pnfs_error = -EINVAL; @@ -427,7 +429,7 @@ bl_write_pagelist(struct nfs_pgio_header *header, int sync) header->res.count = header->args.count; out: - bl_submit_bio(WRITE, bio); + bl_submit_bio(bio); blk_finish_plug(&plug); put_parallel(par); return PNFS_ATTEMPTED; diff --git a/fs/nilfs2/segbuf.c b/fs/nilfs2/segbuf.c index f63620c..7666f1d 100644 --- a/fs/nilfs2/segbuf.c +++ b/fs/nilfs2/segbuf.c @@ -368,7 +368,8 @@ static int nilfs_segbuf_submit_bio(struct nilfs_segment_buffer *segbuf, bio->bi_end_io = nilfs_end_bio_write; bio->bi_private = segbuf; - submit_bio(mode, bio); + bio->bi_rw = mode; + submit_bio(bio); segbuf->sb_nbio++; wi->bio = NULL; diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c index 6e04b1a..e37373d 100644 --- a/fs/ocfs2/cluster/heartbeat.c +++ b/fs/ocfs2/cluster/heartbeat.c @@ -530,7 +530,7 @@ static void o2hb_bio_end_io(struct bio *bio) static struct bio *o2hb_setup_one_bio(struct o2hb_region *reg, struct o2hb_bio_wait_ctxt *wc, unsigned int *current_slot, - unsigned int max_slots) + unsigned int max_slots, int rw) { int len, current_page; unsigned int vec_len, vec_start; @@ -556,6 +556,7 @@ static struct bio *o2hb_setup_one_bio(struct o2hb_region *reg, bio->bi_bdev = reg->hr_bdev; bio->bi_private = wc; bio->bi_end_io = o2hb_bio_end_io; + bio->bi_rw = rw; vec_start = (cs << bits) % PAGE_SIZE; while(cs < max_slots) { @@ -591,7 +592,8 @@ static int o2hb_read_slots(struct o2hb_region *reg, o2hb_bio_wait_init(&wc); while(current_slot < max_slots) { - bio = o2hb_setup_one_bio(reg, &wc, ¤t_slot, max_slots); + bio = o2hb_setup_one_bio(reg, &wc, ¤t_slot, max_slots, + READ); if (IS_ERR(bio)) { status = PTR_ERR(bio); mlog_errno(status); @@ -599,7 +601,7 @@ static int o2hb_read_slots(struct o2hb_region *reg, } atomic_inc(&wc.wc_num_reqs); - submit_bio(READ, bio); + submit_bio(bio); } status = 0; @@ -623,7 +625,7 @@ static int o2hb_issue_node_write(struct o2hb_region *reg, slot = o2nm_this_node(); - bio = o2hb_setup_one_bio(reg, write_wc, &slot, slot+1); + bio = o2hb_setup_one_bio(reg, write_wc, &slot, slot+1, WRITE_SYNC); if (IS_ERR(bio)) { status = PTR_ERR(bio); mlog_errno(status); @@ -631,7 +633,7 @@ static int o2hb_issue_node_write(struct o2hb_region *reg, } atomic_inc(&write_wc->wc_num_reqs); - submit_bio(WRITE_SYNC, bio); + submit_bio(bio); status = 0; bail: diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index e5c3a45..5852c5a 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -439,7 +439,10 @@ xfs_submit_ioend( ioend->io_bio->bi_private = ioend; ioend->io_bio->bi_end_io = xfs_end_bio; - + if (wbc->sync_mode) + ioend->io_bio->bi_rw = WRITE_SYNC; + else + ioend->io_bio->bi_rw = WRITE; /* * If we are failing the IO now, just mark the ioend with an * error and finish it. This will run IO completion immediately @@ -452,8 +455,7 @@ xfs_submit_ioend( return status; } - submit_bio(wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE, - ioend->io_bio); + submit_bio(ioend->io_bio); return 0; } @@ -511,8 +513,11 @@ xfs_chain_bio( bio_chain(ioend->io_bio, new); bio_get(ioend->io_bio); /* for xfs_destroy_ioend */ - submit_bio(wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE, - ioend->io_bio); + if (wbc->sync_mode) + ioend->io_bio->bi_rw = WRITE_SYNC; + else + ioend->io_bio->bi_rw = WRITE; + submit_bio(ioend->io_bio); ioend->io_bio = new; } diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 9a2191b..079bb77 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1170,7 +1170,7 @@ next_chunk: bio->bi_iter.bi_sector = sector; bio->bi_end_io = xfs_buf_bio_end_io; bio->bi_private = bp; - + bio->bi_rw = rw; for (; size && nr_pages; nr_pages--, page_index++) { int rbytes, nbytes = PAGE_SIZE - offset; @@ -1194,7 +1194,7 @@ next_chunk: flush_kernel_vmap_range(bp->b_addr, xfs_buf_vmap_len(bp)); } - submit_bio(rw, bio); + submit_bio(bio); if (size) goto next_chunk; } else { diff --git a/include/linux/bio.h b/include/linux/bio.h index 6b7481f..4724810 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -473,7 +473,7 @@ static inline void bio_io_error(struct bio *bio) struct request_queue; extern int bio_phys_segments(struct request_queue *, struct bio *); -extern int submit_bio_wait(int rw, struct bio *bio); +extern int submit_bio_wait(struct bio *bio); extern void bio_advance(struct bio *, unsigned); extern void bio_init(struct bio *); diff --git a/include/linux/fs.h b/include/linux/fs.h index e3c0b7e..69bdd03 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2704,7 +2704,7 @@ static inline void remove_inode_hash(struct inode *inode) extern void inode_sb_list_add(struct inode *inode); #ifdef CONFIG_BLOCK -extern blk_qc_t submit_bio(int, struct bio *); +extern blk_qc_t submit_bio(struct bio *); extern int bdev_read_only(struct block_device *); #endif extern int set_blocksize(struct block_device *, int); diff --git a/kernel/power/swap.c b/kernel/power/swap.c index 12cd989..4d050eb 100644 --- a/kernel/power/swap.c +++ b/kernel/power/swap.c @@ -260,6 +260,7 @@ static int hib_submit_io(int rw, pgoff_t page_off, void *addr, bio = bio_alloc(__GFP_RECLAIM | __GFP_HIGH, 1); bio->bi_iter.bi_sector = page_off * (PAGE_SIZE >> 9); bio->bi_bdev = hib_resume_bdev; + bio->bi_rw = rw; if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) { printk(KERN_ERR "PM: Adding page to bio failed at %llu\n", @@ -272,9 +273,9 @@ static int hib_submit_io(int rw, pgoff_t page_off, void *addr, bio->bi_end_io = hib_end_io; bio->bi_private = hb; atomic_inc(&hb->count); - submit_bio(rw, bio); + submit_bio(bio); } else { - error = submit_bio_wait(rw, bio); + error = submit_bio_wait(bio); bio_put(bio); } diff --git a/mm/page_io.c b/mm/page_io.c index 985f23c..85cc7e1 100644 --- a/mm/page_io.c +++ b/mm/page_io.c @@ -259,7 +259,7 @@ int __swap_writepage(struct page *page, struct writeback_control *wbc, bio_end_io_t end_write_func) { struct bio *bio; - int ret, rw = WRITE; + int ret; struct swap_info_struct *sis = page_swap_info(page); if (sis->flags & SWP_FILE) { @@ -317,12 +317,13 @@ int __swap_writepage(struct page *page, struct writeback_control *wbc, ret = -ENOMEM; goto out; } + bio->bi_rw = WRITE; if (wbc->sync_mode == WB_SYNC_ALL) - rw |= REQ_SYNC; + bio->bi_rw |= REQ_SYNC; count_vm_event(PSWPOUT); set_page_writeback(page); unlock_page(page); - submit_bio(rw, bio); + submit_bio(bio); out: return ret; } @@ -369,8 +370,9 @@ int swap_readpage(struct page *page) ret = -ENOMEM; goto out; } + bio->bi_rw = READ; count_vm_event(PSWPIN); - submit_bio(READ, bio); + submit_bio(bio); out: return ret; } -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:16:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1C8987CA0 for ; Fri, 15 Apr 2016 14:16:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 92662AC001 for ; Fri, 15 Apr 2016 12:16:34 -0700 (PDT) X-ASG-Debug-ID: 1460747791-04bdf01103610480001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id i5I7sWFqdueASD6y (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:16:31 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 24F0B201E9; Fri, 15 Apr 2016 19:16:31 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhU007872; Fri, 15 Apr 2016 15:16:28 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 04/42] fs: have submit_bh users pass in op and flags separately Date: Fri, 15 Apr 2016 14:15:39 -0500 X-ASG-Orig-Subj: [PATCH 04/42] fs: have submit_bh users pass in op and flags separately Message-Id: <1460747777-8479-5-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747791 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This has submit_bh users pass in the operation and flags separately, so submit_bh_wbc can setup bio->bi_op and bio-bi_rw on the bio that is submitted. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/md/bitmap.c | 4 ++-- fs/btrfs/check-integrity.c | 24 ++++++++++---------- fs/btrfs/check-integrity.h | 2 +- fs/btrfs/disk-io.c | 4 ++-- fs/buffer.c | 54 +++++++++++++++++++++++---------------------- fs/ext4/balloc.c | 2 +- fs/ext4/ialloc.c | 2 +- fs/ext4/inode.c | 2 +- fs/ext4/mmp.c | 4 ++-- fs/fat/misc.c | 2 +- fs/gfs2/bmap.c | 2 +- fs/gfs2/dir.c | 2 +- fs/gfs2/meta_io.c | 6 ++--- fs/jbd2/commit.c | 6 ++--- fs/jbd2/journal.c | 8 +++---- fs/nilfs2/btnode.c | 6 ++--- fs/nilfs2/btnode.h | 2 +- fs/nilfs2/btree.c | 6 +++-- fs/nilfs2/gcinode.c | 5 +++-- fs/nilfs2/mdt.c | 11 ++++----- fs/ntfs/aops.c | 6 ++--- fs/ntfs/compress.c | 2 +- fs/ntfs/file.c | 2 +- fs/ntfs/logfile.c | 2 +- fs/ntfs/mft.c | 4 ++-- fs/ocfs2/buffer_head_io.c | 8 +++---- fs/reiserfs/inode.c | 4 ++-- fs/reiserfs/journal.c | 6 ++--- fs/ufs/util.c | 2 +- include/linux/buffer_head.h | 9 ++++---- 30 files changed, 103 insertions(+), 96 deletions(-) diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index 3fe86b5..8b2e16f 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c @@ -294,7 +294,7 @@ static void write_page(struct bitmap *bitmap, struct page *page, int wait) atomic_inc(&bitmap->pending_writes); set_buffer_locked(bh); set_buffer_mapped(bh); - submit_bh(WRITE | REQ_SYNC, bh); + submit_bh(REQ_OP_WRITE, REQ_SYNC, bh); bh = bh->b_this_page; } @@ -389,7 +389,7 @@ static int read_page(struct file *file, unsigned long index, atomic_inc(&bitmap->pending_writes); set_buffer_locked(bh); set_buffer_mapped(bh); - submit_bh(READ, bh); + submit_bh(REQ_OP_READ, 0, bh); } block++; bh = bh->b_this_page; diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index 9400acd..f82190f 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c @@ -2856,12 +2856,12 @@ static struct btrfsic_dev_state *btrfsic_dev_state_lookup( return ds; } -int btrfsic_submit_bh(int rw, struct buffer_head *bh) +int btrfsic_submit_bh(int op, int op_flags, struct buffer_head *bh) { struct btrfsic_dev_state *dev_state; if (!btrfsic_is_initialized) - return submit_bh(rw, bh); + return submit_bh(op, op_flags, bh); mutex_lock(&btrfsic_mutex); /* since btrfsic_submit_bh() might also be called before @@ -2870,26 +2870,26 @@ int btrfsic_submit_bh(int rw, struct buffer_head *bh) /* Only called to write the superblock (incl. FLUSH/FUA) */ if (NULL != dev_state && - (rw & WRITE) && bh->b_size > 0) { + (op == REQ_OP_WRITE) && bh->b_size > 0) { u64 dev_bytenr; dev_bytenr = 4096 * bh->b_blocknr; if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) printk(KERN_INFO - "submit_bh(rw=0x%x, blocknr=%llu (bytenr %llu)," - " size=%zu, data=%p, bdev=%p)\n", - rw, (unsigned long long)bh->b_blocknr, + "submit_bh(op=0x%x,0x%x, blocknr=%llu " + "(bytenr %llu), size=%zu, data=%p, bdev=%p)\n", + op, op_flags, (unsigned long long)bh->b_blocknr, dev_bytenr, bh->b_size, bh->b_data, bh->b_bdev); btrfsic_process_written_block(dev_state, dev_bytenr, &bh->b_data, 1, NULL, - NULL, bh, rw); - } else if (NULL != dev_state && (rw & REQ_FLUSH)) { + NULL, bh, op_flags); + } else if (NULL != dev_state && (op_flags & REQ_FLUSH)) { if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) printk(KERN_INFO - "submit_bh(rw=0x%x FLUSH, bdev=%p)\n", - rw, bh->b_bdev); + "submit_bh(op=0x%x,0x%x FLUSH, bdev=%p)\n", + op, op_flags, bh->b_bdev); if (!dev_state->dummy_block_for_bio_bh_flush.is_iodone) { if ((dev_state->state->print_mask & (BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH | @@ -2907,7 +2907,7 @@ int btrfsic_submit_bh(int rw, struct buffer_head *bh) block->never_written = 0; block->iodone_w_error = 0; block->flush_gen = dev_state->last_flush_gen + 1; - block->submit_bio_bh_rw = rw; + block->submit_bio_bh_rw = op_flags; block->orig_bio_bh_private = bh->b_private; block->orig_bio_bh_end_io.bh = bh->b_end_io; block->next_in_same_bio = NULL; @@ -2916,7 +2916,7 @@ int btrfsic_submit_bh(int rw, struct buffer_head *bh) } } mutex_unlock(&btrfsic_mutex); - return submit_bh(rw, bh); + return submit_bh(op, op_flags, bh); } static void __btrfsic_submit_bio(struct bio *bio) diff --git a/fs/btrfs/check-integrity.h b/fs/btrfs/check-integrity.h index c04e249..f78dff1 100644 --- a/fs/btrfs/check-integrity.h +++ b/fs/btrfs/check-integrity.h @@ -20,7 +20,7 @@ #define __BTRFS_CHECK_INTEGRITY__ #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY -int btrfsic_submit_bh(int rw, struct buffer_head *bh); +int btrfsic_submit_bh(int op, int op_flags, struct buffer_head *bh); void btrfsic_submit_bio(struct bio *bio); int btrfsic_submit_bio_wait(struct bio *bio); #else diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 0bd25e4..9a13c85 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -3410,9 +3410,9 @@ static int write_dev_supers(struct btrfs_device *device, * to go down lazy. */ if (i == 0) - ret = btrfsic_submit_bh(WRITE_FUA, bh); + ret = btrfsic_submit_bh(REQ_OP_WRITE, WRITE_FUA, bh); else - ret = btrfsic_submit_bh(WRITE_SYNC, bh); + ret = btrfsic_submit_bh(REQ_OP_WRITE, WRITE_SYNC, bh); if (ret) errors++; } diff --git a/fs/buffer.c b/fs/buffer.c index 7ed7869..1e1a474 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -45,7 +45,7 @@ #include static int fsync_buffers_list(spinlock_t *lock, struct list_head *list); -static int submit_bh_wbc(int rw, struct buffer_head *bh, +static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh, unsigned long bio_flags, struct writeback_control *wbc); @@ -1225,7 +1225,7 @@ static struct buffer_head *__bread_slow(struct buffer_head *bh) } else { get_bh(bh); bh->b_end_io = end_buffer_read_sync; - submit_bh(READ, bh); + submit_bh(REQ_OP_READ, 0, bh); wait_on_buffer(bh); if (buffer_uptodate(bh)) return bh; @@ -1697,7 +1697,7 @@ static int __block_write_full_page(struct inode *inode, struct page *page, struct buffer_head *bh, *head; unsigned int blocksize, bbits; int nr_underway = 0; - int write_op = (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE); + int write_flags = (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : 0); head = create_page_buffers(page, inode, (1 << BH_Dirty)|(1 << BH_Uptodate)); @@ -1786,7 +1786,7 @@ static int __block_write_full_page(struct inode *inode, struct page *page, do { struct buffer_head *next = bh->b_this_page; if (buffer_async_write(bh)) { - submit_bh_wbc(write_op, bh, 0, wbc); + submit_bh_wbc(REQ_OP_WRITE, write_flags, bh, 0, wbc); nr_underway++; } bh = next; @@ -1840,7 +1840,7 @@ recover: struct buffer_head *next = bh->b_this_page; if (buffer_async_write(bh)) { clear_buffer_dirty(bh); - submit_bh_wbc(write_op, bh, 0, wbc); + submit_bh_wbc(REQ_OP_WRITE, write_flags, bh, 0, wbc); nr_underway++; } bh = next; @@ -2248,7 +2248,7 @@ int block_read_full_page(struct page *page, get_block_t *get_block) if (buffer_uptodate(bh)) end_buffer_async_read(bh, 1); else - submit_bh(READ, bh); + submit_bh(REQ_OP_READ, 0, bh); } return 0; } @@ -2582,7 +2582,7 @@ int nobh_write_begin(struct address_space *mapping, if (block_start < from || block_end > to) { lock_buffer(bh); bh->b_end_io = end_buffer_read_nobh; - submit_bh(READ, bh); + submit_bh(REQ_OP_READ, 0, bh); nr_reads++; } } @@ -2949,7 +2949,7 @@ static void end_bio_bh_io_sync(struct bio *bio) * errors, this only handles the "we need to be able to * do IO at the final sector" case. */ -void guard_bio_eod(int rw, struct bio *bio) +void guard_bio_eod(int op, struct bio *bio) { sector_t maxsector; struct bio_vec *bvec = &bio->bi_io_vec[bio->bi_vcnt - 1]; @@ -2979,13 +2979,13 @@ void guard_bio_eod(int rw, struct bio *bio) bvec->bv_len -= truncated_bytes; /* ..and clear the end of the buffer for reads */ - if ((rw & RW_MASK) == READ) { + if (op == REQ_OP_READ) { zero_user(bvec->bv_page, bvec->bv_offset + bvec->bv_len, truncated_bytes); } } -static int submit_bh_wbc(int rw, struct buffer_head *bh, +static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh, unsigned long bio_flags, struct writeback_control *wbc) { struct bio *bio; @@ -2999,7 +2999,7 @@ static int submit_bh_wbc(int rw, struct buffer_head *bh, /* * Only clear out a write error when rewriting */ - if (test_set_buffer_req(bh) && (rw & WRITE)) + if (test_set_buffer_req(bh) && (op == REQ_OP_WRITE)) clear_buffer_write_io_error(bh); /* @@ -3022,29 +3022,31 @@ static int submit_bh_wbc(int rw, struct buffer_head *bh, bio->bi_end_io = end_bio_bh_io_sync; bio->bi_private = bh; bio->bi_flags |= bio_flags; + bio->bi_op = op; /* Take care of bh's that straddle the end of the device */ - guard_bio_eod(rw, bio); + guard_bio_eod(op, bio); if (buffer_meta(bh)) - rw |= REQ_META; + op_flags |= REQ_META; if (buffer_prio(bh)) - rw |= REQ_PRIO; - bio->bi_rw = rw; + op_flags |= REQ_PRIO; + bio->bi_rw = op_flags; submit_bio(bio); return 0; } -int _submit_bh(int rw, struct buffer_head *bh, unsigned long bio_flags) +int _submit_bh(int op, int op_flags, struct buffer_head *bh, + unsigned long bio_flags) { - return submit_bh_wbc(rw, bh, bio_flags, NULL); + return submit_bh_wbc(op, op_flags, bh, bio_flags, NULL); } EXPORT_SYMBOL_GPL(_submit_bh); -int submit_bh(int rw, struct buffer_head *bh) +int submit_bh(int op, int op_flags, struct buffer_head *bh) { - return submit_bh_wbc(rw, bh, 0, NULL); + return submit_bh_wbc(op, op_flags, bh, 0, NULL); } EXPORT_SYMBOL(submit_bh); @@ -3086,14 +3088,14 @@ void ll_rw_block(int rw, int nr, struct buffer_head *bhs[]) if (test_clear_buffer_dirty(bh)) { bh->b_end_io = end_buffer_write_sync; get_bh(bh); - submit_bh(WRITE, bh); + submit_bh(rw, 0, bh); continue; } } else { if (!buffer_uptodate(bh)) { bh->b_end_io = end_buffer_read_sync; get_bh(bh); - submit_bh(rw, bh); + submit_bh(rw, 0, bh); continue; } } @@ -3102,7 +3104,7 @@ void ll_rw_block(int rw, int nr, struct buffer_head *bhs[]) } EXPORT_SYMBOL(ll_rw_block); -void write_dirty_buffer(struct buffer_head *bh, int rw) +void write_dirty_buffer(struct buffer_head *bh, int op_flags) { lock_buffer(bh); if (!test_clear_buffer_dirty(bh)) { @@ -3111,7 +3113,7 @@ void write_dirty_buffer(struct buffer_head *bh, int rw) } bh->b_end_io = end_buffer_write_sync; get_bh(bh); - submit_bh(rw, bh); + submit_bh(REQ_OP_WRITE, op_flags, bh); } EXPORT_SYMBOL(write_dirty_buffer); @@ -3120,7 +3122,7 @@ EXPORT_SYMBOL(write_dirty_buffer); * and then start new I/O and then wait upon it. The caller must have a ref on * the buffer_head. */ -int __sync_dirty_buffer(struct buffer_head *bh, int rw) +int __sync_dirty_buffer(struct buffer_head *bh, int op_flags) { int ret = 0; @@ -3129,7 +3131,7 @@ int __sync_dirty_buffer(struct buffer_head *bh, int rw) if (test_clear_buffer_dirty(bh)) { get_bh(bh); bh->b_end_io = end_buffer_write_sync; - ret = submit_bh(rw, bh); + ret = submit_bh(REQ_OP_WRITE, op_flags, bh); wait_on_buffer(bh); if (!ret && !buffer_uptodate(bh)) ret = -EIO; @@ -3392,7 +3394,7 @@ int bh_submit_read(struct buffer_head *bh) get_bh(bh); bh->b_end_io = end_buffer_read_sync; - submit_bh(READ, bh); + submit_bh(REQ_OP_READ, 0, bh); wait_on_buffer(bh); if (buffer_uptodate(bh)) return 0; diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c index fe1f50f..d06823b 100644 --- a/fs/ext4/balloc.c +++ b/fs/ext4/balloc.c @@ -470,7 +470,7 @@ ext4_read_block_bitmap_nowait(struct super_block *sb, ext4_group_t block_group) trace_ext4_read_block_bitmap_load(sb, block_group); bh->b_end_io = ext4_end_bitmap_read; get_bh(bh); - submit_bh(READ | REQ_META | REQ_PRIO, bh); + submit_bh(REQ_OP_READ, REQ_META | REQ_PRIO, bh); return bh; verify: err = ext4_validate_block_bitmap(sb, desc, block_group, bh); diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index 237b877..0b08abc 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c @@ -214,7 +214,7 @@ ext4_read_inode_bitmap(struct super_block *sb, ext4_group_t block_group) trace_ext4_load_inode_bitmap(sb, block_group); bh->b_end_io = ext4_end_bitmap_read; get_bh(bh); - submit_bh(READ | REQ_META | REQ_PRIO, bh); + submit_bh(REQ_OP_READ, REQ_META | REQ_PRIO, bh); wait_on_buffer(bh); if (!buffer_uptodate(bh)) { put_bh(bh); diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 981a1fc..f19220b 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -4186,7 +4186,7 @@ make_io: trace_ext4_load_inode(inode); get_bh(bh); bh->b_end_io = end_buffer_read_sync; - submit_bh(READ | REQ_META | REQ_PRIO, bh); + submit_bh(REQ_OP_READ, REQ_META | REQ_PRIO, bh); wait_on_buffer(bh); if (!buffer_uptodate(bh)) { EXT4_ERROR_INODE_BLOCK(inode, block, diff --git a/fs/ext4/mmp.c b/fs/ext4/mmp.c index 2444527..cef1db4 100644 --- a/fs/ext4/mmp.c +++ b/fs/ext4/mmp.c @@ -52,7 +52,7 @@ static int write_mmp_block(struct super_block *sb, struct buffer_head *bh) lock_buffer(bh); bh->b_end_io = end_buffer_write_sync; get_bh(bh); - submit_bh(WRITE_SYNC | REQ_META | REQ_PRIO, bh); + submit_bh(REQ_OP_WRITE, WRITE_SYNC | REQ_META | REQ_PRIO, bh); wait_on_buffer(bh); sb_end_write(sb); if (unlikely(!buffer_uptodate(bh))) @@ -88,7 +88,7 @@ static int read_mmp_block(struct super_block *sb, struct buffer_head **bh, get_bh(*bh); lock_buffer(*bh); (*bh)->b_end_io = end_buffer_read_sync; - submit_bh(READ_SYNC | REQ_META | REQ_PRIO, *bh); + submit_bh(REQ_OP_READ, READ_SYNC | REQ_META | REQ_PRIO, *bh); wait_on_buffer(*bh); if (!buffer_uptodate(*bh)) { ret = -EIO; diff --git a/fs/fat/misc.c b/fs/fat/misc.c index c4589e9..8a86981 100644 --- a/fs/fat/misc.c +++ b/fs/fat/misc.c @@ -267,7 +267,7 @@ int fat_sync_bhs(struct buffer_head **bhs, int nr_bhs) int i, err = 0; for (i = 0; i < nr_bhs; i++) - write_dirty_buffer(bhs[i], WRITE); + write_dirty_buffer(bhs[i], 0); for (i = 0; i < nr_bhs; i++) { wait_on_buffer(bhs[i]); diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c index 24ce1cd..06d79aa 100644 --- a/fs/gfs2/bmap.c +++ b/fs/gfs2/bmap.c @@ -285,7 +285,7 @@ static void gfs2_metapath_ra(struct gfs2_glock *gl, if (trylock_buffer(rabh)) { if (!buffer_uptodate(rabh)) { rabh->b_end_io = end_buffer_read_sync; - submit_bh(READA | REQ_META, rabh); + submit_bh(REQ_OP_READ, READA | REQ_META, rabh); continue; } unlock_buffer(rabh); diff --git a/fs/gfs2/dir.c b/fs/gfs2/dir.c index 4a01f30..97a7d47 100644 --- a/fs/gfs2/dir.c +++ b/fs/gfs2/dir.c @@ -1510,7 +1510,7 @@ static void gfs2_dir_readahead(struct inode *inode, unsigned hsize, u32 index, continue; } bh->b_end_io = end_buffer_read_sync; - submit_bh(READA | REQ_META, bh); + submit_bh(REQ_OP_READ, READA | REQ_META, bh); continue; } brelse(bh); diff --git a/fs/gfs2/meta_io.c b/fs/gfs2/meta_io.c index f8d33e8..3c63087 100644 --- a/fs/gfs2/meta_io.c +++ b/fs/gfs2/meta_io.c @@ -37,8 +37,8 @@ static int gfs2_aspace_writepage(struct page *page, struct writeback_control *wb { struct buffer_head *bh, *head; int nr_underway = 0; - int write_op = REQ_META | REQ_PRIO | - (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE); + int write_flags = REQ_META | REQ_PRIO | + (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : 0); BUG_ON(!PageLocked(page)); BUG_ON(!page_has_buffers(page)); @@ -79,7 +79,7 @@ static int gfs2_aspace_writepage(struct page *page, struct writeback_control *wb do { struct buffer_head *next = bh->b_this_page; if (buffer_async_write(bh)) { - submit_bh(write_op, bh); + submit_bh(REQ_OP_WRITE, write_flags, bh); nr_underway++; } bh = next; diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c index 2ad98d6..956bcf0 100644 --- a/fs/jbd2/commit.c +++ b/fs/jbd2/commit.c @@ -155,9 +155,9 @@ static int journal_submit_commit_record(journal_t *journal, if (journal->j_flags & JBD2_BARRIER && !jbd2_has_feature_async_commit(journal)) - ret = submit_bh(WRITE_SYNC | WRITE_FLUSH_FUA, bh); + ret = submit_bh(REQ_OP_WRITE, WRITE_SYNC | WRITE_FLUSH_FUA, bh); else - ret = submit_bh(WRITE_SYNC, bh); + ret = submit_bh(REQ_OP_WRITE, WRITE_SYNC, bh); *cbh = bh; return ret; @@ -714,7 +714,7 @@ start_journal_io: clear_buffer_dirty(bh); set_buffer_uptodate(bh); bh->b_end_io = journal_end_buffer_io_sync; - submit_bh(WRITE_SYNC, bh); + submit_bh(REQ_OP_WRITE, WRITE_SYNC, bh); } cond_resched(); stats.run.rs_blocks_logged += bufs; diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index 435f0b2..6d7e33a 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c @@ -1345,15 +1345,15 @@ static int journal_reset(journal_t *journal) return jbd2_journal_start_thread(journal); } -static int jbd2_write_superblock(journal_t *journal, int write_op) +static int jbd2_write_superblock(journal_t *journal, int write_flags) { struct buffer_head *bh = journal->j_sb_buffer; journal_superblock_t *sb = journal->j_superblock; int ret; - trace_jbd2_write_superblock(journal, write_op); + trace_jbd2_write_superblock(journal, write_flags); if (!(journal->j_flags & JBD2_BARRIER)) - write_op &= ~(REQ_FUA | REQ_FLUSH); + write_flags &= ~(REQ_FUA | REQ_FLUSH); lock_buffer(bh); if (buffer_write_io_error(bh)) { /* @@ -1373,7 +1373,7 @@ static int jbd2_write_superblock(journal_t *journal, int write_op) jbd2_superblock_csum_set(journal, sb); get_bh(bh); bh->b_end_io = end_buffer_write_sync; - ret = submit_bh(write_op, bh); + ret = submit_bh(REQ_OP_WRITE, write_flags, bh); wait_on_buffer(bh); if (buffer_write_io_error(bh)) { clear_buffer_write_io_error(bh); diff --git a/fs/nilfs2/btnode.c b/fs/nilfs2/btnode.c index e0c9daf..87baf87 100644 --- a/fs/nilfs2/btnode.c +++ b/fs/nilfs2/btnode.c @@ -67,7 +67,7 @@ nilfs_btnode_create_block(struct address_space *btnc, __u64 blocknr) } int nilfs_btnode_submit_block(struct address_space *btnc, __u64 blocknr, - sector_t pblocknr, int mode, + sector_t pblocknr, int mode, int mode_flags, struct buffer_head **pbh, sector_t *submit_ptr) { struct buffer_head *bh; @@ -100,7 +100,7 @@ int nilfs_btnode_submit_block(struct address_space *btnc, __u64 blocknr, } } - if (mode == READA) { + if (mode_flags & REQ_RAHEAD) { if (pblocknr != *submit_ptr + 1 || !trylock_buffer(bh)) { err = -EBUSY; /* internal code */ brelse(bh); @@ -119,7 +119,7 @@ int nilfs_btnode_submit_block(struct address_space *btnc, __u64 blocknr, bh->b_blocknr = pblocknr; /* set block address for read */ bh->b_end_io = end_buffer_read_sync; get_bh(bh); - submit_bh(mode, bh); + submit_bh(mode, mode_flags, bh); bh->b_blocknr = blocknr; /* set back to the given block address */ *submit_ptr = pblocknr; err = 0; diff --git a/fs/nilfs2/btnode.h b/fs/nilfs2/btnode.h index d876b56..3f93197 100644 --- a/fs/nilfs2/btnode.h +++ b/fs/nilfs2/btnode.h @@ -47,7 +47,7 @@ void nilfs_btnode_cache_clear(struct address_space *); struct buffer_head *nilfs_btnode_create_block(struct address_space *btnc, __u64 blocknr); int nilfs_btnode_submit_block(struct address_space *, __u64, sector_t, int, - struct buffer_head **, sector_t *); + int, struct buffer_head **, sector_t *); void nilfs_btnode_delete(struct buffer_head *); int nilfs_btnode_prepare_change_key(struct address_space *, struct nilfs_btnode_chkey_ctxt *); diff --git a/fs/nilfs2/btree.c b/fs/nilfs2/btree.c index 3a3821b..5d6a2c6 100644 --- a/fs/nilfs2/btree.c +++ b/fs/nilfs2/btree.c @@ -480,7 +480,8 @@ static int __nilfs_btree_get_block(const struct nilfs_bmap *btree, __u64 ptr, sector_t submit_ptr = 0; int ret; - ret = nilfs_btnode_submit_block(btnc, ptr, 0, READ, &bh, &submit_ptr); + ret = nilfs_btnode_submit_block(btnc, ptr, 0, REQ_OP_READ, 0, &bh, + &submit_ptr); if (ret) { if (ret != -EEXIST) return ret; @@ -496,7 +497,8 @@ static int __nilfs_btree_get_block(const struct nilfs_bmap *btree, __u64 ptr, n > 0 && i < ra->ncmax; n--, i++) { ptr2 = nilfs_btree_node_get_ptr(ra->node, i, ra->ncmax); - ret = nilfs_btnode_submit_block(btnc, ptr2, 0, READA, + ret = nilfs_btnode_submit_block(btnc, ptr2, 0, + REQ_OP_READ, REQ_RAHEAD, &ra_bh, &submit_ptr); if (likely(!ret || ret == -EEXIST)) brelse(ra_bh); diff --git a/fs/nilfs2/gcinode.c b/fs/nilfs2/gcinode.c index 0224b78..90be270 100644 --- a/fs/nilfs2/gcinode.c +++ b/fs/nilfs2/gcinode.c @@ -106,7 +106,7 @@ int nilfs_gccache_submit_read_data(struct inode *inode, sector_t blkoff, bh->b_blocknr = pbn; bh->b_end_io = end_buffer_read_sync; get_bh(bh); - submit_bh(READ, bh); + submit_bh(REQ_OP_READ, 0, bh); if (vbn) bh->b_blocknr = vbn; out: @@ -143,7 +143,8 @@ int nilfs_gccache_submit_read_node(struct inode *inode, sector_t pbn, int ret; ret = nilfs_btnode_submit_block(&NILFS_I(inode)->i_btnode_cache, - vbn ? : pbn, pbn, READ, out_bh, &pbn); + vbn ? : pbn, pbn, REQ_OP_READ, 0, + out_bh, &pbn); if (ret == -EEXIST) /* internal code (cache hit) */ ret = 0; return ret; diff --git a/fs/nilfs2/mdt.c b/fs/nilfs2/mdt.c index f6982b9..27aee74 100644 --- a/fs/nilfs2/mdt.c +++ b/fs/nilfs2/mdt.c @@ -124,7 +124,7 @@ static int nilfs_mdt_create_block(struct inode *inode, unsigned long block, static int nilfs_mdt_submit_block(struct inode *inode, unsigned long blkoff, - int mode, struct buffer_head **out_bh) + int mode, int mode_flags, struct buffer_head **out_bh) { struct buffer_head *bh; __u64 blknum = 0; @@ -138,7 +138,7 @@ nilfs_mdt_submit_block(struct inode *inode, unsigned long blkoff, if (buffer_uptodate(bh)) goto out; - if (mode == READA) { + if (mode_flags & REQ_RAHEAD) { if (!trylock_buffer(bh)) { ret = -EBUSY; goto failed_bh; @@ -160,7 +160,7 @@ nilfs_mdt_submit_block(struct inode *inode, unsigned long blkoff, bh->b_end_io = end_buffer_read_sync; get_bh(bh); - submit_bh(mode, bh); + submit_bh(mode, mode_flags, bh); ret = 0; trace_nilfs2_mdt_submit_block(inode, inode->i_ino, blkoff, mode); @@ -184,7 +184,7 @@ static int nilfs_mdt_read_block(struct inode *inode, unsigned long block, int i, nr_ra_blocks = NILFS_MDT_MAX_RA_BLOCKS; int err; - err = nilfs_mdt_submit_block(inode, block, READ, &first_bh); + err = nilfs_mdt_submit_block(inode, block, REQ_OP_READ, 0, &first_bh); if (err == -EEXIST) /* internal code */ goto out; @@ -194,7 +194,8 @@ static int nilfs_mdt_read_block(struct inode *inode, unsigned long block, if (readahead) { blkoff = block + 1; for (i = 0; i < nr_ra_blocks; i++, blkoff++) { - err = nilfs_mdt_submit_block(inode, blkoff, READA, &bh); + err = nilfs_mdt_submit_block(inode, blkoff, REQ_OP_READ, + REQ_RAHEAD, &bh); if (likely(!err || err == -EEXIST)) brelse(bh); else if (err != -EBUSY) diff --git a/fs/ntfs/aops.c b/fs/ntfs/aops.c index 97768a1..fe251f1 100644 --- a/fs/ntfs/aops.c +++ b/fs/ntfs/aops.c @@ -362,7 +362,7 @@ handle_zblock: for (i = 0; i < nr; i++) { tbh = arr[i]; if (likely(!buffer_uptodate(tbh))) - submit_bh(READ, tbh); + submit_bh(REQ_OP_READ, 0, tbh); else ntfs_end_buffer_async_read(tbh, 1); } @@ -877,7 +877,7 @@ lock_retry_remap: do { struct buffer_head *next = bh->b_this_page; if (buffer_async_write(bh)) { - submit_bh(WRITE, bh); + submit_bh(REQ_OP_WRITE, 0, bh); need_end_writeback = false; } bh = next; @@ -1202,7 +1202,7 @@ lock_retry_remap: BUG_ON(!buffer_mapped(tbh)); get_bh(tbh); tbh->b_end_io = end_buffer_write_sync; - submit_bh(WRITE, tbh); + submit_bh(REQ_OP_WRITE, 0, tbh); } /* Synchronize the mft mirror now if not @sync. */ if (is_mft && !sync) diff --git a/fs/ntfs/compress.c b/fs/ntfs/compress.c index f2b5e74..f8eb043 100644 --- a/fs/ntfs/compress.c +++ b/fs/ntfs/compress.c @@ -670,7 +670,7 @@ lock_retry_remap: } get_bh(tbh); tbh->b_end_io = end_buffer_read_sync; - submit_bh(READ, tbh); + submit_bh(REQ_OP_READ, 0, tbh); } /* Wait for io completion on all buffer heads. */ diff --git a/fs/ntfs/file.c b/fs/ntfs/file.c index 91117ad..d96f0c1 100644 --- a/fs/ntfs/file.c +++ b/fs/ntfs/file.c @@ -553,7 +553,7 @@ static inline int ntfs_submit_bh_for_read(struct buffer_head *bh) lock_buffer(bh); get_bh(bh); bh->b_end_io = end_buffer_read_sync; - return submit_bh(READ, bh); + return submit_bh(REQ_OP_READ, 0, bh); } /** diff --git a/fs/ntfs/logfile.c b/fs/ntfs/logfile.c index 9d71213..761f12f 100644 --- a/fs/ntfs/logfile.c +++ b/fs/ntfs/logfile.c @@ -821,7 +821,7 @@ map_vcn: * completed ignore errors afterwards as we can assume * that if one buffer worked all of them will work. */ - submit_bh(WRITE, bh); + submit_bh(REQ_OP_WRITE, 0, bh); if (should_wait) { should_wait = false; wait_on_buffer(bh); diff --git a/fs/ntfs/mft.c b/fs/ntfs/mft.c index 37b2501..d15d492 100644 --- a/fs/ntfs/mft.c +++ b/fs/ntfs/mft.c @@ -592,7 +592,7 @@ int ntfs_sync_mft_mirror(ntfs_volume *vol, const unsigned long mft_no, clear_buffer_dirty(tbh); get_bh(tbh); tbh->b_end_io = end_buffer_write_sync; - submit_bh(WRITE, tbh); + submit_bh(REQ_OP_WRITE, 0, tbh); } /* Wait on i/o completion of buffers. */ for (i_bhs = 0; i_bhs < nr_bhs; i_bhs++) { @@ -785,7 +785,7 @@ int write_mft_record_nolock(ntfs_inode *ni, MFT_RECORD *m, int sync) clear_buffer_dirty(tbh); get_bh(tbh); tbh->b_end_io = end_buffer_write_sync; - submit_bh(WRITE, tbh); + submit_bh(REQ_OP_WRITE, 0, tbh); } /* Synchronize the mft mirror now if not @sync. */ if (!sync && ni->mft_no < vol->mftmirr_size) diff --git a/fs/ocfs2/buffer_head_io.c b/fs/ocfs2/buffer_head_io.c index fe50ded..fb775c9 100644 --- a/fs/ocfs2/buffer_head_io.c +++ b/fs/ocfs2/buffer_head_io.c @@ -79,7 +79,7 @@ int ocfs2_write_block(struct ocfs2_super *osb, struct buffer_head *bh, get_bh(bh); /* for end_buffer_write_sync() */ bh->b_end_io = end_buffer_write_sync; - submit_bh(WRITE, bh); + submit_bh(REQ_OP_WRITE, 0, bh); wait_on_buffer(bh); @@ -149,7 +149,7 @@ int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block, clear_buffer_uptodate(bh); get_bh(bh); /* for end_buffer_read_sync() */ bh->b_end_io = end_buffer_read_sync; - submit_bh(READ, bh); + submit_bh(REQ_OP_READ, 0, bh); } for (i = nr; i > 0; i--) { @@ -305,7 +305,7 @@ int ocfs2_read_blocks(struct ocfs2_caching_info *ci, u64 block, int nr, if (validate) set_buffer_needs_validate(bh); bh->b_end_io = end_buffer_read_sync; - submit_bh(READ, bh); + submit_bh(REQ_OP_READ, 0, bh); continue; } } @@ -419,7 +419,7 @@ int ocfs2_write_super_or_backup(struct ocfs2_super *osb, get_bh(bh); /* for end_buffer_write_sync() */ bh->b_end_io = end_buffer_write_sync; ocfs2_compute_meta_ecc(osb->sb, bh->b_data, &di->i_check); - submit_bh(WRITE, bh); + submit_bh(REQ_OP_WRITE, 0, bh); wait_on_buffer(bh); diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index d5c2e9c..b72c23a 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c @@ -2668,7 +2668,7 @@ static int reiserfs_write_full_page(struct page *page, do { struct buffer_head *next = bh->b_this_page; if (buffer_async_write(bh)) { - submit_bh(WRITE, bh); + submit_bh(REQ_OP_WRITE, 0, bh); nr++; } put_bh(bh); @@ -2728,7 +2728,7 @@ fail: struct buffer_head *next = bh->b_this_page; if (buffer_async_write(bh)) { clear_buffer_dirty(bh); - submit_bh(WRITE, bh); + submit_bh(REQ_OP_WRITE, 0, bh); nr++; } put_bh(bh); diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c index 2ace90e..6945e71 100644 --- a/fs/reiserfs/journal.c +++ b/fs/reiserfs/journal.c @@ -652,7 +652,7 @@ static void submit_logged_buffer(struct buffer_head *bh) BUG(); if (!buffer_uptodate(bh)) BUG(); - submit_bh(WRITE, bh); + submit_bh(REQ_OP_WRITE, 0, bh); } static void submit_ordered_buffer(struct buffer_head *bh) @@ -662,7 +662,7 @@ static void submit_ordered_buffer(struct buffer_head *bh) clear_buffer_dirty(bh); if (!buffer_uptodate(bh)) BUG(); - submit_bh(WRITE, bh); + submit_bh(REQ_OP_WRITE, 0, bh); } #define CHUNK_SIZE 32 @@ -2269,7 +2269,7 @@ abort_replay: /* flush out the real blocks */ for (i = 0; i < get_desc_trans_len(desc); i++) { set_buffer_dirty(real_blocks[i]); - write_dirty_buffer(real_blocks[i], WRITE); + write_dirty_buffer(real_blocks[i], 0); } for (i = 0; i < get_desc_trans_len(desc); i++) { wait_on_buffer(real_blocks[i]); diff --git a/fs/ufs/util.c b/fs/ufs/util.c index a409e3e7..f41ad0a 100644 --- a/fs/ufs/util.c +++ b/fs/ufs/util.c @@ -118,7 +118,7 @@ void ubh_sync_block(struct ufs_buffer_head *ubh) unsigned i; for (i = 0; i < ubh->count; i++) - write_dirty_buffer(ubh->bh[i], WRITE); + write_dirty_buffer(ubh->bh[i], 0); for (i = 0; i < ubh->count; i++) wait_on_buffer(ubh->bh[i]); diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index d48daa3..bc9a45d 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h @@ -189,10 +189,11 @@ void unlock_buffer(struct buffer_head *bh); void __lock_buffer(struct buffer_head *bh); void ll_rw_block(int, int, struct buffer_head * bh[]); int sync_dirty_buffer(struct buffer_head *bh); -int __sync_dirty_buffer(struct buffer_head *bh, int rw); -void write_dirty_buffer(struct buffer_head *bh, int rw); -int _submit_bh(int rw, struct buffer_head *bh, unsigned long bio_flags); -int submit_bh(int, struct buffer_head *); +int __sync_dirty_buffer(struct buffer_head *bh, int op_flags); +void write_dirty_buffer(struct buffer_head *bh, int op_flags); +int _submit_bh(int op, int op_flags, struct buffer_head *bh, + unsigned long bio_flags); +int submit_bh(int, int, struct buffer_head *); void write_boundary_block(struct block_device *bdev, sector_t bblock, unsigned blocksize); int bh_uptodate_or_lock(struct buffer_head *bh); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:16:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 78A4B7CA7 for ; Fri, 15 Apr 2016 14:16:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 12AF58F8039 for ; Fri, 15 Apr 2016 12:16:36 -0700 (PDT) X-ASG-Debug-ID: 1460747793-04bdf011026104b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id JqmEDnBktBlhG6zP (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:16:33 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 643C56407E; Fri, 15 Apr 2016 19:16:33 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhV007872; Fri, 15 Apr 2016 15:16:31 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 05/42] fs: have ll_rw_block users pass in op and flags separately Date: Fri, 15 Apr 2016 14:15:40 -0500 X-ASG-Orig-Subj: [PATCH 05/42] fs: have ll_rw_block users pass in op and flags separately Message-Id: <1460747777-8479-6-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Fri, 15 Apr 2016 19:16:33 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460747793 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This has ll_rw_block users pass in the operation and flags separately, so ll_rw_block can setup bio->bi_op and bio-bi_rw on the bio that is submitted. v2: 1. Fix for kbuild error in ll_rw_block comments. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- fs/buffer.c | 19 ++++++++++--------- fs/ext4/inode.c | 6 +++--- fs/ext4/namei.c | 3 ++- fs/ext4/super.c | 2 +- fs/gfs2/bmap.c | 2 +- fs/gfs2/meta_io.c | 4 ++-- fs/gfs2/quota.c | 2 +- fs/isofs/compress.c | 2 +- fs/jbd2/journal.c | 2 +- fs/jbd2/recovery.c | 4 ++-- fs/ocfs2/aops.c | 2 +- fs/ocfs2/super.c | 2 +- fs/reiserfs/journal.c | 8 ++++---- fs/reiserfs/stree.c | 4 ++-- fs/reiserfs/super.c | 2 +- fs/squashfs/block.c | 4 ++-- fs/udf/dir.c | 2 +- fs/udf/directory.c | 2 +- fs/udf/inode.c | 2 +- fs/ufs/balloc.c | 2 +- include/linux/buffer_head.h | 2 +- 21 files changed, 40 insertions(+), 38 deletions(-) diff --git a/fs/buffer.c b/fs/buffer.c index 1e1a474..68c8f27 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -588,7 +588,7 @@ void write_boundary_block(struct block_device *bdev, struct buffer_head *bh = __find_get_block(bdev, bblock + 1, blocksize); if (bh) { if (buffer_dirty(bh)) - ll_rw_block(WRITE, 1, &bh); + ll_rw_block(REQ_OP_WRITE, 0, 1, &bh); put_bh(bh); } } @@ -1395,7 +1395,7 @@ void __breadahead(struct block_device *bdev, sector_t block, unsigned size) { struct buffer_head *bh = __getblk(bdev, block, size); if (likely(bh)) { - ll_rw_block(READA, 1, &bh); + ll_rw_block(REQ_OP_READ, READA, 1, &bh); brelse(bh); } } @@ -1955,7 +1955,7 @@ int __block_write_begin(struct page *page, loff_t pos, unsigned len, if (!buffer_uptodate(bh) && !buffer_delay(bh) && !buffer_unwritten(bh) && (block_start < from || block_end > to)) { - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); *wait_bh++=bh; } } @@ -2852,7 +2852,7 @@ int block_truncate_page(struct address_space *mapping, if (!buffer_uptodate(bh) && !buffer_delay(bh) && !buffer_unwritten(bh)) { err = -EIO; - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); wait_on_buffer(bh); /* Uhhuh. Read error. Complain and punt. */ if (!buffer_uptodate(bh)) @@ -3052,7 +3052,8 @@ EXPORT_SYMBOL(submit_bh); /** * ll_rw_block: low-level access to block devices (DEPRECATED) - * @rw: whether to %READ or %WRITE or maybe %READA (readahead) + * @op: whether to %READ or %WRITE + * @op_flags: rq_flag_bits or %READA (readahead) * @nr: number of &struct buffer_heads in the array * @bhs: array of pointers to &struct buffer_head * @@ -3075,7 +3076,7 @@ EXPORT_SYMBOL(submit_bh); * All of the buffers must be for the same device, and must also be a * multiple of the current approved size for the device. */ -void ll_rw_block(int rw, int nr, struct buffer_head *bhs[]) +void ll_rw_block(int op, int op_flags, int nr, struct buffer_head *bhs[]) { int i; @@ -3084,18 +3085,18 @@ void ll_rw_block(int rw, int nr, struct buffer_head *bhs[]) if (!trylock_buffer(bh)) continue; - if (rw == WRITE) { + if (op == WRITE) { if (test_clear_buffer_dirty(bh)) { bh->b_end_io = end_buffer_write_sync; get_bh(bh); - submit_bh(rw, 0, bh); + submit_bh(op, op_flags, bh); continue; } } else { if (!buffer_uptodate(bh)) { bh->b_end_io = end_buffer_read_sync; get_bh(bh); - submit_bh(rw, 0, bh); + submit_bh(op, op_flags, bh); continue; } } diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index f19220b..320b8f0b 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -963,7 +963,7 @@ struct buffer_head *ext4_bread(handle_t *handle, struct inode *inode, return bh; if (!bh || buffer_uptodate(bh)) return bh; - ll_rw_block(READ | REQ_META | REQ_PRIO, 1, &bh); + ll_rw_block(REQ_OP_READ, REQ_META | REQ_PRIO, 1, &bh); wait_on_buffer(bh); if (buffer_uptodate(bh)) return bh; @@ -1117,7 +1117,7 @@ static int ext4_block_write_begin(struct page *page, loff_t pos, unsigned len, if (!buffer_uptodate(bh) && !buffer_delay(bh) && !buffer_unwritten(bh) && (block_start < from || block_end > to)) { - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); *wait_bh++ = bh; decrypt = ext4_encrypted_inode(inode) && S_ISREG(inode->i_mode); @@ -3603,7 +3603,7 @@ static int __ext4_block_zero_page_range(handle_t *handle, if (!buffer_uptodate(bh)) { err = -EIO; - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); wait_on_buffer(bh); /* Uhhuh. Read error. Complain and punt. */ if (!buffer_uptodate(bh)) diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 48e4b89..a03d2e6 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c @@ -1438,7 +1438,8 @@ restart: } bh_use[ra_max] = bh; if (bh) - ll_rw_block(READ | REQ_META | REQ_PRIO, + ll_rw_block(REQ_OP_READ, + REQ_META | REQ_PRIO, 1, &bh); } } diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 304c712..389adea 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -4207,7 +4207,7 @@ static journal_t *ext4_get_dev_journal(struct super_block *sb, goto out_bdev; } journal->j_private = sb; - ll_rw_block(READ | REQ_META | REQ_PRIO, 1, &journal->j_sb_buffer); + ll_rw_block(REQ_OP_READ, REQ_META | REQ_PRIO, 1, &journal->j_sb_buffer); wait_on_buffer(journal->j_sb_buffer); if (!buffer_uptodate(journal->j_sb_buffer)) { ext4_msg(sb, KERN_ERR, "I/O error on journal device"); diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c index 06d79aa..fd6389c 100644 --- a/fs/gfs2/bmap.c +++ b/fs/gfs2/bmap.c @@ -974,7 +974,7 @@ static int gfs2_block_truncate_page(struct address_space *mapping, loff_t from) if (!buffer_uptodate(bh)) { err = -EIO; - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); wait_on_buffer(bh); /* Uhhuh. Read error. Complain and punt. */ if (!buffer_uptodate(bh)) diff --git a/fs/gfs2/meta_io.c b/fs/gfs2/meta_io.c index 3c63087..f56f3ca 100644 --- a/fs/gfs2/meta_io.c +++ b/fs/gfs2/meta_io.c @@ -448,7 +448,7 @@ struct buffer_head *gfs2_meta_ra(struct gfs2_glock *gl, u64 dblock, u32 extlen) if (buffer_uptodate(first_bh)) goto out; if (!buffer_locked(first_bh)) - ll_rw_block(READ_SYNC | REQ_META, 1, &first_bh); + ll_rw_block(REQ_OP_READ, READ_SYNC | REQ_META, 1, &first_bh); dblock++; extlen--; @@ -457,7 +457,7 @@ struct buffer_head *gfs2_meta_ra(struct gfs2_glock *gl, u64 dblock, u32 extlen) bh = gfs2_getbuf(gl, dblock, CREATE); if (!buffer_uptodate(bh) && !buffer_locked(bh)) - ll_rw_block(READA | REQ_META, 1, &bh); + ll_rw_block(REQ_OP_READ, READA | REQ_META, 1, &bh); brelse(bh); dblock++; extlen--; diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index ce7d69a..62a6823 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c @@ -730,7 +730,7 @@ static int gfs2_write_buf_to_page(struct gfs2_inode *ip, unsigned long index, if (PageUptodate(page)) set_buffer_uptodate(bh); if (!buffer_uptodate(bh)) { - ll_rw_block(READ | REQ_META, 1, &bh); + ll_rw_block(REQ_OP_READ, REQ_META, 1, &bh); wait_on_buffer(bh); if (!buffer_uptodate(bh)) goto unlock_out; diff --git a/fs/isofs/compress.c b/fs/isofs/compress.c index 2e4e834..2ce5b75 100644 --- a/fs/isofs/compress.c +++ b/fs/isofs/compress.c @@ -81,7 +81,7 @@ static loff_t zisofs_uncompress_block(struct inode *inode, loff_t block_start, blocknum = block_start >> bufshift; memset(bhs, 0, (needblocks + 1) * sizeof(struct buffer_head *)); haveblocks = isofs_get_blocks(inode, blocknum, bhs, needblocks); - ll_rw_block(READ, haveblocks, bhs); + ll_rw_block(REQ_OP_READ, 0, haveblocks, bhs); curbh = 0; curpage = 0; diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index 6d7e33a..3675b8e 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c @@ -1497,7 +1497,7 @@ static int journal_get_superblock(journal_t *journal) J_ASSERT(bh != NULL); if (!buffer_uptodate(bh)) { - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); wait_on_buffer(bh); if (!buffer_uptodate(bh)) { printk(KERN_ERR diff --git a/fs/jbd2/recovery.c b/fs/jbd2/recovery.c index 08a456b..6daf0c9 100644 --- a/fs/jbd2/recovery.c +++ b/fs/jbd2/recovery.c @@ -104,7 +104,7 @@ static int do_readahead(journal_t *journal, unsigned int start) if (!buffer_uptodate(bh) && !buffer_locked(bh)) { bufs[nbufs++] = bh; if (nbufs == MAXBUF) { - ll_rw_block(READ, nbufs, bufs); + ll_rw_block(REQ_OP_READ, 0, nbufs, bufs); journal_brelse_array(bufs, nbufs); nbufs = 0; } @@ -113,7 +113,7 @@ static int do_readahead(journal_t *journal, unsigned int start) } if (nbufs) - ll_rw_block(READ, nbufs, bufs); + ll_rw_block(REQ_OP_READ, 0, nbufs, bufs); err = 0; failed: diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index ad15773..8f0c138 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c @@ -640,7 +640,7 @@ int ocfs2_map_page_blocks(struct page *page, u64 *p_blkno, !buffer_new(bh) && ocfs2_should_read_blk(inode, page, block_start) && (block_start < from || block_end > to)) { - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); *wait_bh++=bh; } diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index d7cae33..3971146 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c @@ -1819,7 +1819,7 @@ static int ocfs2_get_sector(struct super_block *sb, if (!buffer_dirty(*bh)) clear_buffer_uptodate(*bh); unlock_buffer(*bh); - ll_rw_block(READ, 1, bh); + ll_rw_block(REQ_OP_READ, 0, 1, bh); wait_on_buffer(*bh); if (!buffer_uptodate(*bh)) { mlog_errno(-EIO); diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c index 6945e71..bc2dde2 100644 --- a/fs/reiserfs/journal.c +++ b/fs/reiserfs/journal.c @@ -870,7 +870,7 @@ loop_next: */ if (buffer_dirty(bh) && unlikely(bh->b_page->mapping == NULL)) { spin_unlock(lock); - ll_rw_block(WRITE, 1, &bh); + ll_rw_block(REQ_OP_WRITE, 0, 1, &bh); spin_lock(lock); } put_bh(bh); @@ -1057,7 +1057,7 @@ static int flush_commit_list(struct super_block *s, if (tbh) { if (buffer_dirty(tbh)) { depth = reiserfs_write_unlock_nested(s); - ll_rw_block(WRITE, 1, &tbh); + ll_rw_block(REQ_OP_WRITE, 0, 1, &tbh); reiserfs_write_lock_nested(s, depth); } put_bh(tbh) ; @@ -2244,7 +2244,7 @@ abort_replay: } } /* read in the log blocks, memcpy to the corresponding real block */ - ll_rw_block(READ, get_desc_trans_len(desc), log_blocks); + ll_rw_block(REQ_OP_READ, 0, get_desc_trans_len(desc), log_blocks); for (i = 0; i < get_desc_trans_len(desc); i++) { wait_on_buffer(log_blocks[i]); @@ -2346,7 +2346,7 @@ static struct buffer_head *reiserfs_breada(struct block_device *dev, } else bhlist[j++] = bh; } - ll_rw_block(READ, j, bhlist); + ll_rw_block(REQ_OP_READ, 0, j, bhlist); for (i = 1; i < j; i++) brelse(bhlist[i]); bh = bhlist[0]; diff --git a/fs/reiserfs/stree.c b/fs/reiserfs/stree.c index 5feacd6..64b29b5 100644 --- a/fs/reiserfs/stree.c +++ b/fs/reiserfs/stree.c @@ -551,7 +551,7 @@ static int search_by_key_reada(struct super_block *s, if (!buffer_uptodate(bh[j])) { if (depth == -1) depth = reiserfs_write_unlock_nested(s); - ll_rw_block(READA, 1, bh + j); + ll_rw_block(REQ_OP_READ, READA, 1, bh + j); } brelse(bh[j]); } @@ -660,7 +660,7 @@ int search_by_key(struct super_block *sb, const struct cpu_key *key, if (!buffer_uptodate(bh) && depth == -1) depth = reiserfs_write_unlock_nested(sb); - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); wait_on_buffer(bh); if (depth != -1) diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index b8f2d1e..9938a51 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c @@ -1661,7 +1661,7 @@ static int read_super_block(struct super_block *s, int offset) /* after journal replay, reread all bitmap and super blocks */ static int reread_meta_blocks(struct super_block *s) { - ll_rw_block(READ, 1, &SB_BUFFER_WITH_SB(s)); + ll_rw_block(REQ_OP_READ, 0, 1, &SB_BUFFER_WITH_SB(s)); wait_on_buffer(SB_BUFFER_WITH_SB(s)); if (!buffer_uptodate(SB_BUFFER_WITH_SB(s))) { reiserfs_warning(s, "reiserfs-2504", "error reading the super"); diff --git a/fs/squashfs/block.c b/fs/squashfs/block.c index 2c26184..ce62a38 100644 --- a/fs/squashfs/block.c +++ b/fs/squashfs/block.c @@ -124,7 +124,7 @@ int squashfs_read_data(struct super_block *sb, u64 index, int length, goto block_release; bytes += msblk->devblksize; } - ll_rw_block(READ, b, bh); + ll_rw_block(REQ_OP_READ, 0, b, bh); } else { /* * Metadata block. @@ -156,7 +156,7 @@ int squashfs_read_data(struct super_block *sb, u64 index, int length, goto block_release; bytes += msblk->devblksize; } - ll_rw_block(READ, b - 1, bh + 1); + ll_rw_block(REQ_OP_READ, 0, b - 1, bh + 1); } for (i = 0; i < b; i++) { diff --git a/fs/udf/dir.c b/fs/udf/dir.c index b51b371..cfadce0 100644 --- a/fs/udf/dir.c +++ b/fs/udf/dir.c @@ -113,7 +113,7 @@ static int udf_readdir(struct file *file, struct dir_context *ctx) brelse(tmp); } if (num) { - ll_rw_block(READA, num, bha); + ll_rw_block(REQ_OP_READ, READA, num, bha); for (i = 0; i < num; i++) brelse(bha[i]); } diff --git a/fs/udf/directory.c b/fs/udf/directory.c index c763fda..71f3e0b 100644 --- a/fs/udf/directory.c +++ b/fs/udf/directory.c @@ -87,7 +87,7 @@ struct fileIdentDesc *udf_fileident_read(struct inode *dir, loff_t *nf_pos, brelse(tmp); } if (num) { - ll_rw_block(READA, num, bha); + ll_rw_block(REQ_OP_READ, READA, num, bha); for (i = 0; i < num; i++) brelse(bha[i]); } diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 2dc461e..a401bdbe 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c @@ -1200,7 +1200,7 @@ struct buffer_head *udf_bread(struct inode *inode, int block, if (buffer_uptodate(bh)) return bh; - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); wait_on_buffer(bh); if (buffer_uptodate(bh)) diff --git a/fs/ufs/balloc.c b/fs/ufs/balloc.c index 0447b94..67e085d 100644 --- a/fs/ufs/balloc.c +++ b/fs/ufs/balloc.c @@ -292,7 +292,7 @@ static void ufs_change_blocknr(struct inode *inode, sector_t beg, if (!buffer_mapped(bh)) map_bh(bh, inode->i_sb, oldb + pos); if (!buffer_uptodate(bh)) { - ll_rw_block(READ, 1, &bh); + ll_rw_block(REQ_OP_READ, 0, 1, &bh); wait_on_buffer(bh); if (!buffer_uptodate(bh)) { ufs_error(inode->i_sb, __func__, diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index bc9a45d..d1dd293 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h @@ -187,7 +187,7 @@ struct buffer_head *alloc_buffer_head(gfp_t gfp_flags); void free_buffer_head(struct buffer_head * bh); void unlock_buffer(struct buffer_head *bh); void __lock_buffer(struct buffer_head *bh); -void ll_rw_block(int, int, struct buffer_head * bh[]); +void ll_rw_block(int, int, int, struct buffer_head * bh[]); int sync_dirty_buffer(struct buffer_head *bh); int __sync_dirty_buffer(struct buffer_head *bh, int op_flags); void write_dirty_buffer(struct buffer_head *bh, int op_flags); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:16:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9FD947CA7 for ; Fri, 15 Apr 2016 14:16:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 720488F8049 for ; Fri, 15 Apr 2016 12:16:37 -0700 (PDT) X-ASG-Debug-ID: 1460747795-04cbb02e1b3162d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id mHu21xJcef4RgRcK (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:16:36 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A40396407A; Fri, 15 Apr 2016 19:16:35 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhW007872; Fri, 15 Apr 2016 15:16:33 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 06/42] direct-io: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 14:15:41 -0500 X-ASG-Orig-Subj: [PATCH 06/42] direct-io: set bi_op to REQ_OP Message-Id: <1460747777-8479-7-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Fri, 15 Apr 2016 19:16:35 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460747796 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has the dio code set the bio bi_op to a REQ_OP and bio op_flags to rq_flag_bits. It also begins to convert btrfs's dio_submit_t because of the dio submit_io callout use. In the btrfs_submit_direct change, I OR'd the op and flag back together. It is only temporary. The next patched will completely convert all the btrfs code paths. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- fs/btrfs/inode.c | 9 +++++---- fs/direct-io.c | 35 +++++++++++++++++++++-------------- include/linux/fs.h | 2 +- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 9cc2256..d999fdf 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -8401,14 +8401,14 @@ out_err: return 0; } -static void btrfs_submit_direct(int rw, struct bio *dio_bio, - struct inode *inode, loff_t file_offset) +static void btrfs_submit_direct(struct bio *dio_bio, struct inode *inode, + loff_t file_offset) { struct btrfs_dio_private *dip = NULL; struct bio *io_bio = NULL; struct btrfs_io_bio *btrfs_bio; int skip_sum; - int write = rw & REQ_WRITE; + bool write = (dio_bio->bi_op == REQ_OP_WRITE); int ret = 0; skip_sum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM; @@ -8459,7 +8459,8 @@ static void btrfs_submit_direct(int rw, struct bio *dio_bio, dio_data->unsubmitted_oe_range_end; } - ret = btrfs_submit_direct_hook(rw, dip, skip_sum); + ret = btrfs_submit_direct_hook(dio_bio->bi_op | dio_bio->bi_rw, dip, + skip_sum); if (!ret) return; diff --git a/fs/direct-io.c b/fs/direct-io.c index 1890ad2..64bfab0 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -108,7 +108,8 @@ struct dio_submit { /* dio_state communicated between submission path and end_io */ struct dio { int flags; /* doesn't change */ - int rw; + int op; + int op_flags; blk_qc_t bio_cookie; struct block_device *bio_bdev; struct inode *inode; @@ -163,7 +164,7 @@ static inline int dio_refill_pages(struct dio *dio, struct dio_submit *sdio) ret = iov_iter_get_pages(sdio->iter, dio->pages, LONG_MAX, DIO_PAGES, &sdio->from); - if (ret < 0 && sdio->blocks_available && (dio->rw & WRITE)) { + if (ret < 0 && sdio->blocks_available && (dio->op == REQ_OP_WRITE)) { struct page *page = ZERO_PAGE(0); /* * A memory fault, but the filesystem has some outstanding @@ -242,7 +243,8 @@ static ssize_t dio_complete(struct dio *dio, loff_t offset, ssize_t ret, transferred = dio->result; /* Check for short read case */ - if ((dio->rw == READ) && ((offset + transferred) > dio->i_size)) + if ((dio->op == REQ_OP_READ) && + ((offset + transferred) > dio->i_size)) transferred = dio->i_size - offset; } @@ -265,7 +267,7 @@ static ssize_t dio_complete(struct dio *dio, loff_t offset, ssize_t ret, inode_dio_end(dio->inode); if (is_async) { - if (dio->rw & WRITE) { + if (dio->op == REQ_OP_WRITE) { int err; err = generic_write_sync(dio->iocb->ki_filp, offset, @@ -374,7 +376,8 @@ dio_bio_alloc(struct dio *dio, struct dio_submit *sdio, bio->bi_bdev = bdev; bio->bi_iter.bi_sector = first_sector; - bio->bi_rw = dio->rw; + bio->bi_op = dio->op; + bio->bi_rw = dio->op_flags; if (dio->is_async) bio->bi_end_io = dio_bio_end_aio; else @@ -402,14 +405,13 @@ static inline void dio_bio_submit(struct dio *dio, struct dio_submit *sdio) dio->refcount++; spin_unlock_irqrestore(&dio->bio_lock, flags); - if (dio->is_async && dio->rw == READ && dio->should_dirty) + if (dio->is_async && dio->op == REQ_OP_READ && dio->should_dirty) bio_set_pages_dirty(bio); dio->bio_bdev = bio->bi_bdev; if (sdio->submit_io) { - sdio->submit_io(dio->rw, bio, dio->inode, - sdio->logical_offset_in_bio); + sdio->submit_io(bio, dio->inode, sdio->logical_offset_in_bio); dio->bio_cookie = BLK_QC_T_NONE; } else dio->bio_cookie = submit_bio(bio); @@ -478,14 +480,14 @@ static int dio_bio_complete(struct dio *dio, struct bio *bio) if (bio->bi_error) dio->io_error = -EIO; - if (dio->is_async && dio->rw == READ && dio->should_dirty) { + if (dio->is_async && dio->op == REQ_OP_READ && dio->should_dirty) { err = bio->bi_error; bio_check_pages_dirty(bio); /* transfers ownership */ } else { bio_for_each_segment_all(bvec, bio, i) { struct page *page = bvec->bv_page; - if (dio->rw == READ && !PageCompound(page) && + if (dio->op == REQ_OP_READ && !PageCompound(page) && dio->should_dirty) set_page_dirty_lock(page); put_page(page); @@ -638,7 +640,7 @@ static int get_more_blocks(struct dio *dio, struct dio_submit *sdio, * which may decide to handle it or also return an unmapped * buffer head. */ - create = dio->rw & WRITE; + create = dio->op == REQ_OP_WRITE; if (dio->flags & DIO_SKIP_HOLES) { if (sdio->block_in_file < (i_size_read(dio->inode) >> sdio->blkbits)) @@ -788,7 +790,7 @@ submit_page_section(struct dio *dio, struct dio_submit *sdio, struct page *page, { int ret = 0; - if (dio->rw & WRITE) { + if (dio->op == REQ_OP_WRITE) { /* * Read accounting is performed in submit_bio() */ @@ -988,7 +990,7 @@ do_holes: loff_t i_size_aligned; /* AKPM: eargh, -ENOTBLK is a hack */ - if (dio->rw & WRITE) { + if (dio->op == REQ_OP_WRITE) { put_page(page); return -ENOTBLK; } @@ -1201,7 +1203,12 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, dio->is_async = true; dio->inode = inode; - dio->rw = iov_iter_rw(iter) == WRITE ? WRITE_ODIRECT : READ; + if (iov_iter_rw(iter) == WRITE) { + dio->op = REQ_OP_WRITE; + dio->op_flags = WRITE_ODIRECT; + } else { + dio->op = REQ_OP_READ; + } /* * For AIO O_(D)SYNC writes we need to defer completions to a workqueue diff --git a/include/linux/fs.h b/include/linux/fs.h index 96ace0f..f3f2f66 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2792,7 +2792,7 @@ extern int generic_file_open(struct inode * inode, struct file * filp); extern int nonseekable_open(struct inode * inode, struct file * filp); #ifdef CONFIG_BLOCK -typedef void (dio_submit_t)(int rw, struct bio *bio, struct inode *inode, +typedef void (dio_submit_t)(struct bio *bio, struct inode *inode, loff_t file_offset); enum { -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:16:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6FF537CD7 for ; Fri, 15 Apr 2016 14:16:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 361778F8037 for ; Fri, 15 Apr 2016 12:16:40 -0700 (PDT) X-ASG-Debug-ID: 1460747798-04cbb02e1b3162f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id RLyts0ZAgJqv8Kr9 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:16:38 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 07275C04B319; Fri, 15 Apr 2016 19:16:38 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhX007872; Fri, 15 Apr 2016 15:16:35 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 07/42] btrfs: have submit_one_bio users setup bio bi_op Date: Fri, 15 Apr 2016 14:15:42 -0500 X-ASG-Orig-Subj: [PATCH 07/42] btrfs: have submit_one_bio users setup bio bi_op Message-Id: <1460747777-8479-8-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747798 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has btrfs's submit_one_bio callers set the bio->bi_op to a REQ_OP and the bi_rw to rq_flag_bits. The next patches will continue to convert btrfs, so submit_bio_hook and merge_bio_hook related code will be modified to take only the bio. I did not do it in this patch to try and keep it smaller. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- fs/btrfs/extent_io.c | 88 +++++++++++++++++++++++++++------------------------- 1 file changed, 45 insertions(+), 43 deletions(-) diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index fdeb8fa..45fa3be 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -2377,7 +2377,7 @@ static int bio_readpage_error(struct bio *failed_bio, u64 phy_offset, int read_mode; int ret; - BUG_ON(failed_bio->bi_rw & REQ_WRITE); + BUG_ON(failed_bio->bi_op == REQ_OP_WRITE); ret = btrfs_get_io_failure_record(inode, start, end, &failrec); if (ret) @@ -2403,6 +2403,8 @@ static int bio_readpage_error(struct bio *failed_bio, u64 phy_offset, free_io_failure(inode, failrec); return -EIO; } + bio->bi_op = REQ_OP_READ; + bio->bi_rw = read_mode; pr_debug("Repair Read Error: submitting new read[%#x] to this_mirror=%d, in_validation=%d\n", read_mode, failrec->this_mirror, failrec->in_validation); @@ -2714,8 +2716,8 @@ struct bio *btrfs_io_bio_alloc(gfp_t gfp_mask, unsigned int nr_iovecs) } -static int __must_check submit_one_bio(int rw, struct bio *bio, - int mirror_num, unsigned long bio_flags) +static int __must_check submit_one_bio(struct bio *bio, int mirror_num, + unsigned long bio_flags) { int ret = 0; struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1; @@ -2726,12 +2728,12 @@ static int __must_check submit_one_bio(int rw, struct bio *bio, start = page_offset(page) + bvec->bv_offset; bio->bi_private = NULL; - bio->bi_rw = rw; bio_get(bio); if (tree->ops && tree->ops->submit_bio_hook) - ret = tree->ops->submit_bio_hook(page->mapping->host, rw, bio, - mirror_num, bio_flags, start); + ret = tree->ops->submit_bio_hook(page->mapping->host, + bio->bi_rw, bio, mirror_num, + bio_flags, start); else btrfsic_submit_bio(bio); @@ -2739,20 +2741,20 @@ static int __must_check submit_one_bio(int rw, struct bio *bio, return ret; } -static int merge_bio(int rw, struct extent_io_tree *tree, struct page *page, +static int merge_bio(struct extent_io_tree *tree, struct page *page, unsigned long offset, size_t size, struct bio *bio, unsigned long bio_flags) { int ret = 0; if (tree->ops && tree->ops->merge_bio_hook) - ret = tree->ops->merge_bio_hook(rw, page, offset, size, bio, - bio_flags); + ret = tree->ops->merge_bio_hook(bio->bi_op, page, offset, size, + bio, bio_flags); BUG_ON(ret < 0); return ret; } -static int submit_extent_page(int rw, struct extent_io_tree *tree, +static int submit_extent_page(int op, int op_flags, struct extent_io_tree *tree, struct writeback_control *wbc, struct page *page, sector_t sector, size_t size, unsigned long offset, @@ -2780,10 +2782,9 @@ static int submit_extent_page(int rw, struct extent_io_tree *tree, if (prev_bio_flags != bio_flags || !contig || force_bio_submit || - merge_bio(rw, tree, page, offset, page_size, bio, bio_flags) || + merge_bio(tree, page, offset, page_size, bio, bio_flags) || bio_add_page(bio, page, page_size, offset) < page_size) { - ret = submit_one_bio(rw, bio, mirror_num, - prev_bio_flags); + ret = submit_one_bio(bio, mirror_num, prev_bio_flags); if (ret < 0) { *bio_ret = NULL; return ret; @@ -2804,6 +2805,8 @@ static int submit_extent_page(int rw, struct extent_io_tree *tree, bio_add_page(bio, page, page_size, offset); bio->bi_end_io = end_io_func; bio->bi_private = tree; + bio->bi_op = op; + bio->bi_rw = op_flags; if (wbc) { wbc_init_bio(wbc, bio); wbc_account_io(wbc, page, page_size); @@ -2812,7 +2815,7 @@ static int submit_extent_page(int rw, struct extent_io_tree *tree, if (bio_ret) *bio_ret = bio; else - ret = submit_one_bio(rw, bio, mirror_num, bio_flags); + ret = submit_one_bio(bio, mirror_num, bio_flags); return ret; } @@ -2876,7 +2879,7 @@ static int __do_readpage(struct extent_io_tree *tree, get_extent_t *get_extent, struct extent_map **em_cached, struct bio **bio, int mirror_num, - unsigned long *bio_flags, int rw, + unsigned long *bio_flags, int read_flags, u64 *prev_em_start) { struct inode *inode = page->mapping->host; @@ -3059,8 +3062,8 @@ static int __do_readpage(struct extent_io_tree *tree, } pnr -= page->index; - ret = submit_extent_page(rw, tree, NULL, page, - sector, disk_io_size, pg_offset, + ret = submit_extent_page(REQ_OP_READ, read_flags, tree, NULL, + page, sector, disk_io_size, pg_offset, bdev, bio, pnr, end_bio_extent_readpage, mirror_num, *bio_flags, @@ -3091,7 +3094,7 @@ static inline void __do_contiguous_readpages(struct extent_io_tree *tree, get_extent_t *get_extent, struct extent_map **em_cached, struct bio **bio, int mirror_num, - unsigned long *bio_flags, int rw, + unsigned long *bio_flags, u64 *prev_em_start) { struct inode *inode; @@ -3112,7 +3115,7 @@ static inline void __do_contiguous_readpages(struct extent_io_tree *tree, for (index = 0; index < nr_pages; index++) { __do_readpage(tree, pages[index], get_extent, em_cached, bio, - mirror_num, bio_flags, rw, prev_em_start); + mirror_num, bio_flags, 0, prev_em_start); put_page(pages[index]); } } @@ -3122,7 +3125,7 @@ static void __extent_readpages(struct extent_io_tree *tree, int nr_pages, get_extent_t *get_extent, struct extent_map **em_cached, struct bio **bio, int mirror_num, - unsigned long *bio_flags, int rw, + unsigned long *bio_flags, u64 *prev_em_start) { u64 start = 0; @@ -3144,7 +3147,7 @@ static void __extent_readpages(struct extent_io_tree *tree, index - first_index, start, end, get_extent, em_cached, bio, mirror_num, bio_flags, - rw, prev_em_start); + prev_em_start); start = page_start; end = start + PAGE_SIZE - 1; first_index = index; @@ -3155,7 +3158,7 @@ static void __extent_readpages(struct extent_io_tree *tree, __do_contiguous_readpages(tree, &pages[first_index], index - first_index, start, end, get_extent, em_cached, bio, - mirror_num, bio_flags, rw, + mirror_num, bio_flags, prev_em_start); } @@ -3163,7 +3166,7 @@ static int __extent_read_full_page(struct extent_io_tree *tree, struct page *page, get_extent_t *get_extent, struct bio **bio, int mirror_num, - unsigned long *bio_flags, int rw) + unsigned long *bio_flags, int read_flags) { struct inode *inode = page->mapping->host; struct btrfs_ordered_extent *ordered; @@ -3183,7 +3186,7 @@ static int __extent_read_full_page(struct extent_io_tree *tree, } ret = __do_readpage(tree, page, get_extent, NULL, bio, mirror_num, - bio_flags, rw, NULL); + bio_flags, read_flags, NULL); return ret; } @@ -3195,9 +3198,9 @@ int extent_read_full_page(struct extent_io_tree *tree, struct page *page, int ret; ret = __extent_read_full_page(tree, page, get_extent, &bio, mirror_num, - &bio_flags, READ); + &bio_flags, 0); if (bio) - ret = submit_one_bio(READ, bio, mirror_num, bio_flags); + ret = submit_one_bio(bio, mirror_num, bio_flags); return ret; } @@ -3438,7 +3441,8 @@ static noinline_for_stack int __extent_writepage_io(struct inode *inode, page->index, cur, end); } - ret = submit_extent_page(write_flags, tree, wbc, page, + ret = submit_extent_page(REQ_OP_WRITE, write_flags, + tree, wbc, page, sector, iosize, pg_offset, bdev, &epd->bio, max_nr, end_bio_extent_writepage, @@ -3478,13 +3482,11 @@ static int __extent_writepage(struct page *page, struct writeback_control *wbc, size_t pg_offset = 0; loff_t i_size = i_size_read(inode); unsigned long end_index = i_size >> PAGE_SHIFT; - int write_flags; + int write_flags = 0; unsigned long nr_written = 0; if (wbc->sync_mode == WB_SYNC_ALL) write_flags = WRITE_SYNC; - else - write_flags = WRITE; trace___extent_writepage(page, inode, wbc); @@ -3728,7 +3730,7 @@ static noinline_for_stack int write_one_eb(struct extent_buffer *eb, u64 offset = eb->start; unsigned long i, num_pages; unsigned long bio_flags = 0; - int rw = (epd->sync_io ? WRITE_SYNC : WRITE) | REQ_META; + int write_flags = (epd->sync_io ? WRITE_SYNC : 0) | REQ_META; int ret = 0; clear_bit(EXTENT_BUFFER_WRITE_ERR, &eb->bflags); @@ -3742,9 +3744,10 @@ static noinline_for_stack int write_one_eb(struct extent_buffer *eb, clear_page_dirty_for_io(p); set_page_writeback(p); - ret = submit_extent_page(rw, tree, wbc, p, offset >> 9, - PAGE_SIZE, 0, bdev, &epd->bio, - -1, end_bio_extent_buffer_writepage, + ret = submit_extent_page(REQ_OP_WRITE, write_flags, tree, wbc, + p, offset >> 9, PAGE_SIZE, 0, bdev, + &epd->bio, -1, + end_bio_extent_buffer_writepage, 0, epd->bio_flags, bio_flags, false); epd->bio_flags = bio_flags; if (ret) { @@ -4054,13 +4057,13 @@ retry: static void flush_epd_write_bio(struct extent_page_data *epd) { if (epd->bio) { - int rw = WRITE; int ret; + epd->bio->bi_op = REQ_OP_WRITE; if (epd->sync_io) - rw = WRITE_SYNC; + epd->bio->bi_rw = WRITE_SYNC; - ret = submit_one_bio(rw, epd->bio, 0, epd->bio_flags); + ret = submit_one_bio(epd->bio, 0, epd->bio_flags); BUG_ON(ret < 0); /* -ENOMEM */ epd->bio = NULL; } @@ -4187,19 +4190,19 @@ int extent_readpages(struct extent_io_tree *tree, if (nr < ARRAY_SIZE(pagepool)) continue; __extent_readpages(tree, pagepool, nr, get_extent, &em_cached, - &bio, 0, &bio_flags, READ, &prev_em_start); + &bio, 0, &bio_flags, &prev_em_start); nr = 0; } if (nr) __extent_readpages(tree, pagepool, nr, get_extent, &em_cached, - &bio, 0, &bio_flags, READ, &prev_em_start); + &bio, 0, &bio_flags, &prev_em_start); if (em_cached) free_extent_map(em_cached); BUG_ON(!list_empty(pages)); if (bio) - return submit_one_bio(READ, bio, 0, bio_flags); + return submit_one_bio(bio, 0, bio_flags); return 0; } @@ -5221,7 +5224,7 @@ int read_extent_buffer_pages(struct extent_io_tree *tree, err = __extent_read_full_page(tree, page, get_extent, &bio, mirror_num, &bio_flags, - READ | REQ_META); + REQ_META); if (err) ret = err; } else { @@ -5230,8 +5233,7 @@ int read_extent_buffer_pages(struct extent_io_tree *tree, } if (bio) { - err = submit_one_bio(READ | REQ_META, bio, mirror_num, - bio_flags); + err = submit_one_bio(bio, mirror_num, bio_flags); if (err) return err; } -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:16:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E7E207CDA for ; Fri, 15 Apr 2016 14:16:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B96A68F8039 for ; Fri, 15 Apr 2016 12:16:42 -0700 (PDT) X-ASG-Debug-ID: 1460747800-04cbb02e1a316300001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id z82TebRVbKVDtCPu (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:16:40 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3D9818EA22; Fri, 15 Apr 2016 19:16:40 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhY007872; Fri, 15 Apr 2016 15:16:38 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 08/42] btrfs: set bi_op tp REQ_OP Date: Fri, 15 Apr 2016 14:15:43 -0500 X-ASG-Orig-Subj: [PATCH 08/42] btrfs: set bi_op tp REQ_OP Message-Id: <1460747777-8479-9-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747800 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has btrfs use the bio bi_op for REQ_OP and bi_rw for rq_flag_bits. v5: - Misset bi_rw to REQ_OP_WRITE in finish_parity_scrub Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- fs/btrfs/check-integrity.c | 19 +++++++++---------- fs/btrfs/compression.c | 4 ++++ fs/btrfs/disk-io.c | 7 ++++--- fs/btrfs/inode.c | 20 +++++++++++++------- fs/btrfs/raid56.c | 10 +++++----- fs/btrfs/scrub.c | 9 +++++---- fs/btrfs/volumes.c | 20 ++++++++++---------- 7 files changed, 50 insertions(+), 39 deletions(-) diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index f82190f..c4a48e8 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c @@ -1673,7 +1673,7 @@ static int btrfsic_read_block(struct btrfsic_state *state, } bio->bi_bdev = block_ctx->dev->bdev; bio->bi_iter.bi_sector = dev_bytenr >> 9; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; for (j = i; j < num_pages; j++) { ret = bio_add_page(bio, block_ctx->pagev[j], @@ -2922,7 +2922,6 @@ int btrfsic_submit_bh(int op, int op_flags, struct buffer_head *bh) static void __btrfsic_submit_bio(struct bio *bio) { struct btrfsic_dev_state *dev_state; - int rw = bio->bi_rw; if (!btrfsic_is_initialized) return; @@ -2932,7 +2931,7 @@ static void __btrfsic_submit_bio(struct bio *bio) * btrfsic_mount(), this might return NULL */ dev_state = btrfsic_dev_state_lookup(bio->bi_bdev); if (NULL != dev_state && - (rw & WRITE) && NULL != bio->bi_io_vec) { + (bio->bi_op == REQ_OP_WRITE) && NULL != bio->bi_io_vec) { unsigned int i; u64 dev_bytenr; u64 cur_bytenr; @@ -2944,9 +2943,9 @@ static void __btrfsic_submit_bio(struct bio *bio) if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) printk(KERN_INFO - "submit_bio(rw=0x%x, bi_vcnt=%u," + "submit_bio(rw=%d,0x%lx, bi_vcnt=%u," " bi_sector=%llu (bytenr %llu), bi_bdev=%p)\n", - rw, bio->bi_vcnt, + bio->bi_op, bio->bi_rw, bio->bi_vcnt, (unsigned long long)bio->bi_iter.bi_sector, dev_bytenr, bio->bi_bdev); @@ -2977,18 +2976,18 @@ static void __btrfsic_submit_bio(struct bio *bio) btrfsic_process_written_block(dev_state, dev_bytenr, mapped_datav, bio->bi_vcnt, bio, &bio_is_patched, - NULL, rw); + NULL, bio->bi_rw); while (i > 0) { i--; kunmap(bio->bi_io_vec[i].bv_page); } kfree(mapped_datav); - } else if (NULL != dev_state && (rw & REQ_FLUSH)) { + } else if (NULL != dev_state && (bio->bi_rw & REQ_FLUSH)) { if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) printk(KERN_INFO - "submit_bio(rw=0x%x FLUSH, bdev=%p)\n", - rw, bio->bi_bdev); + "submit_bio(rw=%d,0x%lx FLUSH, bdev=%p)\n", + bio->bi_op, bio->bi_rw, bio->bi_bdev); if (!dev_state->dummy_block_for_bio_bh_flush.is_iodone) { if ((dev_state->state->print_mask & (BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH | @@ -3006,7 +3005,7 @@ static void __btrfsic_submit_bio(struct bio *bio) block->never_written = 0; block->iodone_w_error = 0; block->flush_gen = dev_state->last_flush_gen + 1; - block->submit_bio_bh_rw = rw; + block->submit_bio_bh_rw = bio->bi_rw; block->orig_bio_bh_private = bio->bi_private; block->orig_bio_bh_end_io.bio = bio->bi_end_io; block->next_in_same_bio = NULL; diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index ff61a41..334a00c 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c @@ -363,6 +363,7 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start, kfree(cb); return -ENOMEM; } + bio->bi_op = REQ_OP_WRITE; bio->bi_private = cb; bio->bi_end_io = end_compressed_bio_write; atomic_inc(&cb->pending_bios); @@ -408,6 +409,7 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start, bio = compressed_bio_alloc(bdev, first_byte, GFP_NOFS); BUG_ON(!bio); + bio->bi_op = REQ_OP_WRITE; bio->bi_private = cb; bio->bi_end_io = end_compressed_bio_write; bio_add_page(bio, page, PAGE_SIZE, 0); @@ -646,6 +648,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, comp_bio = compressed_bio_alloc(bdev, cur_disk_byte, GFP_NOFS); if (!comp_bio) goto fail2; + comp_bio->bi_op = REQ_OP_READ; comp_bio->bi_private = cb; comp_bio->bi_end_io = end_compressed_bio_read; atomic_inc(&cb->pending_bios); @@ -699,6 +702,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, comp_bio = compressed_bio_alloc(bdev, cur_disk_byte, GFP_NOFS); BUG_ON(!comp_bio); + comp_bio->bi_op = REQ_OP_READ; comp_bio->bi_private = cb; comp_bio->bi_end_io = end_compressed_bio_read; diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 9a13c85..932268b 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -727,7 +727,7 @@ static void end_workqueue_bio(struct bio *bio) fs_info = end_io_wq->info; end_io_wq->error = bio->bi_error; - if (bio->bi_rw & REQ_WRITE) { + if (bio->bi_op == REQ_OP_WRITE) { if (end_io_wq->metadata == BTRFS_WQ_ENDIO_METADATA) { wq = fs_info->endio_meta_write_workers; func = btrfs_endio_meta_write_helper; @@ -873,7 +873,7 @@ int btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, struct inode *inode, atomic_inc(&fs_info->nr_async_submits); - if (rw & REQ_SYNC) + if (bio->bi_rw & REQ_SYNC) btrfs_set_work_high_priority(&async->work); btrfs_queue_work(fs_info->workers, &async->work); @@ -951,7 +951,7 @@ static int btree_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, int async = check_async_write(inode, bio_flags); int ret; - if (!(rw & REQ_WRITE)) { + if (bio->bi_op != REQ_OP_WRITE) { /* * called for a read, do the setup so that checksum validation * can happen in the async kernel threads @@ -3476,6 +3476,7 @@ static int write_dev_flush(struct btrfs_device *device, int wait) bio->bi_end_io = btrfs_end_empty_barrier; bio->bi_bdev = device->bdev; + bio->bi_op = REQ_OP_WRITE; bio->bi_rw = WRITE_FLUSH; init_completion(&device->flush_wait); bio->bi_private = &device->flush_wait; diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index d999fdf..f693490 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -1894,7 +1894,7 @@ static int btrfs_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, if (btrfs_is_free_space_inode(inode)) metadata = BTRFS_WQ_ENDIO_FREE_SPACE; - if (!(rw & REQ_WRITE)) { + if (bio->bi_op != REQ_OP_WRITE) { ret = btrfs_bio_wq_end_io(root->fs_info, bio, metadata); if (ret) goto out; @@ -7751,7 +7751,7 @@ static inline int submit_dio_repair_bio(struct inode *inode, struct bio *bio, struct btrfs_root *root = BTRFS_I(inode)->root; int ret; - BUG_ON(rw & REQ_WRITE); + BUG_ON(bio->bi_op == REQ_OP_WRITE); bio_get(bio); @@ -7811,7 +7811,7 @@ static int dio_read_error(struct inode *inode, struct bio *failed_bio, int read_mode; int ret; - BUG_ON(failed_bio->bi_rw & REQ_WRITE); + BUG_ON(failed_bio->bi_op == REQ_OP_WRITE); ret = btrfs_get_io_failure_record(inode, start, end, &failrec); if (ret) @@ -7839,6 +7839,8 @@ static int dio_read_error(struct inode *inode, struct bio *failed_bio, free_io_failure(inode, failrec); return -EIO; } + bio->bi_op = REQ_OP_READ; + bio->bi_rw = read_mode; btrfs_debug(BTRFS_I(inode)->root->fs_info, "Repair DIO Read Error: submitting new dio read[%#x] to this_mirror=%d, in_validation=%d\n", @@ -8153,8 +8155,8 @@ static void btrfs_end_dio_bio(struct bio *bio) if (err) btrfs_warn(BTRFS_I(dip->inode)->root->fs_info, - "direct IO failed ino %llu rw %lu sector %#Lx len %u err no %d", - btrfs_ino(dip->inode), bio->bi_rw, + "direct IO failed ino %llu rw %d,%lu sector %#Lx len %u err no %d", + btrfs_ino(dip->inode), bio->bi_op, bio->bi_rw, (unsigned long long)bio->bi_iter.bi_sector, bio->bi_iter.bi_size, err); @@ -8232,7 +8234,7 @@ static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, int async_submit) { struct btrfs_dio_private *dip = bio->bi_private; - int write = rw & REQ_WRITE; + bool write = bio->bi_op == REQ_OP_WRITE; struct btrfs_root *root = BTRFS_I(inode)->root; int ret; @@ -8319,6 +8321,8 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, if (!bio) return -ENOMEM; + bio->bi_op = orig_bio->bi_op; + bio->bi_rw = orig_bio->bi_rw; bio->bi_private = dip; bio->bi_end_io = btrfs_end_dio_bio; btrfs_io_bio(bio)->logical = file_offset; @@ -8356,12 +8360,14 @@ next_block: start_sector, GFP_NOFS); if (!bio) goto out_err; + bio->bi_op = orig_bio->bi_op; + bio->bi_rw = orig_bio->bi_rw; bio->bi_private = dip; bio->bi_end_io = btrfs_end_dio_bio; btrfs_io_bio(bio)->logical = file_offset; map_length = orig_bio->bi_iter.bi_size; - ret = btrfs_map_block(root->fs_info, rw, + ret = btrfs_map_block(root->fs_info, orig_bio->bi_op, start_sector << 9, &map_length, NULL, 0); if (ret) { diff --git a/fs/btrfs/raid56.c b/fs/btrfs/raid56.c index 439d7eb..dea2dd9 100644 --- a/fs/btrfs/raid56.c +++ b/fs/btrfs/raid56.c @@ -1320,7 +1320,7 @@ write_data: bio->bi_private = rbio; bio->bi_end_io = raid_write_end_io; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; submit_bio(bio); } @@ -1575,7 +1575,7 @@ static int raid56_rmw_stripe(struct btrfs_raid_bio *rbio) bio->bi_private = rbio; bio->bi_end_io = raid_rmw_end_io; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; btrfs_bio_wq_end_io(rbio->fs_info, bio, BTRFS_WQ_ENDIO_RAID56); @@ -2100,7 +2100,7 @@ static int __raid56_parity_recover(struct btrfs_raid_bio *rbio) bio->bi_private = rbio; bio->bi_end_io = raid_recover_end_io; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; btrfs_bio_wq_end_io(rbio->fs_info, bio, BTRFS_WQ_ENDIO_RAID56); @@ -2437,7 +2437,7 @@ submit_write: bio->bi_private = rbio; bio->bi_end_io = raid_write_end_io; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; submit_bio(bio); } @@ -2616,7 +2616,7 @@ static void raid56_parity_scrub_stripe(struct btrfs_raid_bio *rbio) bio->bi_private = rbio; bio->bi_end_io = raid56_parity_scrub_end_io; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; btrfs_bio_wq_end_io(rbio->fs_info, bio, BTRFS_WQ_ENDIO_RAID56); diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 184cb57..155b547 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -1504,7 +1504,7 @@ static void scrub_recheck_block(struct btrfs_fs_info *fs_info, sblock->no_io_error_seen = 0; } else { bio->bi_iter.bi_sector = page->physical >> 9; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; if (btrfsic_submit_bio_wait(bio)) sblock->no_io_error_seen = 0; @@ -1584,7 +1584,7 @@ static int scrub_repair_page_from_good_copy(struct scrub_block *sblock_bad, return -EIO; bio->bi_bdev = page_bad->dev->bdev; bio->bi_iter.bi_sector = page_bad->physical >> 9; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; ret = bio_add_page(bio, page_good->page, PAGE_SIZE, 0); if (PAGE_SIZE != ret) { @@ -1686,7 +1686,7 @@ again: bio->bi_end_io = scrub_wr_bio_end_io; bio->bi_bdev = sbio->dev->bdev; bio->bi_iter.bi_sector = sbio->physical >> 9; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; sbio->err = 0; } else if (sbio->physical + sbio->page_count * PAGE_SIZE != spage->physical_for_dev_replace || @@ -2091,7 +2091,7 @@ again: bio->bi_end_io = scrub_bio_end_io; bio->bi_bdev = sbio->dev->bdev; bio->bi_iter.bi_sector = sbio->physical >> 9; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; sbio->err = 0; } else if (sbio->physical + sbio->page_count * PAGE_SIZE != spage->physical || @@ -4393,6 +4393,7 @@ static int write_page_nocow(struct scrub_ctx *sctx, bio->bi_iter.bi_size = 0; bio->bi_iter.bi_sector = physical_for_dev_replace >> 9; bio->bi_bdev = dev->bdev; + bio->bi_op = REQ_OP_WRITE; bio->bi_rw = WRITE_SYNC; ret = bio_add_page(bio, page, PAGE_SIZE, 0); if (ret != PAGE_SIZE) { diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 318215d..96fdf4b 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -5884,7 +5884,7 @@ static void btrfs_end_bio(struct bio *bio) BUG_ON(stripe_index >= bbio->num_stripes); dev = bbio->stripes[stripe_index].dev; if (dev->bdev) { - if (bio->bi_rw & WRITE) + if (bio->bi_op == REQ_OP_WRITE) btrfs_dev_stat_inc(dev, BTRFS_DEV_STAT_WRITE_ERRS); else @@ -5949,7 +5949,7 @@ static noinline void btrfs_schedule_bio(struct btrfs_root *root, } /* don't bother with additional async steps for reads, right now */ - if (!(bio->bi_rw & REQ_WRITE)) { + if (bio->bi_op == REQ_OP_READ) { bio_get(bio); btrfsic_submit_bio(bio); bio_put(bio); @@ -5998,15 +5998,14 @@ static void submit_stripe_bio(struct btrfs_root *root, struct btrfs_bio *bbio, btrfs_io_bio(bio)->stripe_index = dev_nr; bio->bi_end_io = btrfs_end_bio; bio->bi_iter.bi_sector = physical >> 9; - bio->bi_rw |= rw; #ifdef DEBUG { struct rcu_string *name; rcu_read_lock(); name = rcu_dereference(dev->name); - pr_debug("btrfs_map_bio: rw %d, sector=%llu, dev=%lu " - "(%s id %llu), size=%u\n", rw, + pr_debug("btrfs_map_bio: rw %d 0x%x, sector=%llu, dev=%lu " + "(%s id %llu), size=%u\n", bio->bi_op, bio->bi_rw, (u64)bio->bi_iter.bi_sector, (u_long)dev->bdev->bd_dev, name->str, dev->devid, bio->bi_iter.bi_size); rcu_read_unlock(); @@ -6053,8 +6052,8 @@ int btrfs_map_bio(struct btrfs_root *root, int rw, struct bio *bio, map_length = length; btrfs_bio_counter_inc_blocked(root->fs_info); - ret = __btrfs_map_block(root->fs_info, rw, logical, &map_length, &bbio, - mirror_num, 1); + ret = __btrfs_map_block(root->fs_info, bio->bi_op, logical, + &map_length, &bbio, mirror_num, 1); if (ret) { btrfs_bio_counter_dec(root->fs_info); return ret; @@ -6068,10 +6067,10 @@ int btrfs_map_bio(struct btrfs_root *root, int rw, struct bio *bio, atomic_set(&bbio->stripes_pending, bbio->num_stripes); if ((bbio->map_type & BTRFS_BLOCK_GROUP_RAID56_MASK) && - ((rw & WRITE) || (mirror_num > 1))) { + ((bio->bi_op == REQ_OP_WRITE) || (mirror_num > 1))) { /* In this case, map_length has been set to the length of a single stripe; not the whole write */ - if (rw & WRITE) { + if (bio->bi_op == REQ_OP_WRITE) { ret = raid56_parity_write(root, bio, bbio, map_length); } else { ret = raid56_parity_recover(root, bio, bbio, map_length, @@ -6090,7 +6089,8 @@ int btrfs_map_bio(struct btrfs_root *root, int rw, struct bio *bio, for (dev_nr = 0; dev_nr < total_devs; dev_nr++) { dev = bbio->stripes[dev_nr].dev; - if (!dev || !dev->bdev || (rw & WRITE && !dev->writeable)) { + if (!dev || !dev->bdev || + (bio->bi_op == REQ_OP_WRITE && !dev->writeable)) { bbio_error(bbio, first_bio, logical); continue; } -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:16:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E599F7CE0 for ; Fri, 15 Apr 2016 14:16:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B56F18F8039 for ; Fri, 15 Apr 2016 12:16:44 -0700 (PDT) X-ASG-Debug-ID: 1460747802-04cb6c24646410c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id u3EAV3fptKveUscy (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:16:43 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B7B127F0BE; Fri, 15 Apr 2016 19:16:42 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhZ007872; Fri, 15 Apr 2016 15:16:40 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 09/42] btrfs: update __btrfs_map_block for bi_op transition Date: Fri, 15 Apr 2016 14:15:44 -0500 X-ASG-Orig-Subj: [PATCH 09/42] btrfs: update __btrfs_map_block for bi_op transition Message-Id: <1460747777-8479-10-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747803 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie We no longer pass in a bitmap of rq_flag_bits bits to __btrfs_map_block. It will always be a REQ_OP, or the btrfs specific REQ_GET_READ_MIRRORS, so this drops the bit tests. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- fs/btrfs/extent-tree.c | 2 +- fs/btrfs/inode.c | 2 +- fs/btrfs/volumes.c | 55 +++++++++++++++++++++++++++----------------------- fs/btrfs/volumes.h | 4 ++-- 4 files changed, 34 insertions(+), 29 deletions(-) diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 99decfb..f4bc8c1 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -2053,7 +2053,7 @@ int btrfs_discard_extent(struct btrfs_root *root, u64 bytenr, /* Tell the block device(s) that the sectors can be discarded */ - ret = btrfs_map_block(root->fs_info, REQ_DISCARD, + ret = btrfs_map_block(root->fs_info, REQ_OP_DISCARD, bytenr, &num_bytes, &bbio, 0); /* Error condition is -ENOMEM */ if (!ret) { diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index f693490..c2dc75b 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -8300,7 +8300,7 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, int i; map_length = orig_bio->bi_iter.bi_size; - ret = btrfs_map_block(root->fs_info, rw, start_sector << 9, + ret = btrfs_map_block(root->fs_info, orig_bio->bi_op, start_sector << 9, &map_length, NULL, 0); if (ret) return -EIO; diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 96fdf4b..dc56558 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -5212,7 +5212,7 @@ void btrfs_put_bbio(struct btrfs_bio *bbio) kfree(bbio); } -static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, +static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int op, u64 logical, u64 *length, struct btrfs_bio **bbio_ret, int mirror_num, int need_raid_map) @@ -5290,7 +5290,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, raid56_full_stripe_start *= full_stripe_len; } - if (rw & REQ_DISCARD) { + if (op == REQ_OP_DISCARD) { /* we don't discard raid56 yet */ if (map->type & BTRFS_BLOCK_GROUP_RAID56_MASK) { ret = -EOPNOTSUPP; @@ -5303,7 +5303,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, For other RAID types and for RAID[56] reads, just allow a single stripe (on a single disk). */ if ((map->type & BTRFS_BLOCK_GROUP_RAID56_MASK) && - (rw & REQ_WRITE)) { + (op == REQ_OP_WRITE)) { max_len = stripe_len * nr_data_stripes(map) - (offset - raid56_full_stripe_start); } else { @@ -5328,8 +5328,8 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, btrfs_dev_replace_set_lock_blocking(dev_replace); if (dev_replace_is_ongoing && mirror_num == map->num_stripes + 1 && - !(rw & (REQ_WRITE | REQ_DISCARD | REQ_GET_READ_MIRRORS)) && - dev_replace->tgtdev != NULL) { + op != REQ_OP_WRITE && op != REQ_OP_DISCARD && + op != REQ_GET_READ_MIRRORS && dev_replace->tgtdev != NULL) { /* * in dev-replace case, for repair case (that's the only * case where the mirror is selected explicitly when @@ -5416,15 +5416,17 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, (offset + *length); if (map->type & BTRFS_BLOCK_GROUP_RAID0) { - if (rw & REQ_DISCARD) + if (op == REQ_OP_DISCARD) num_stripes = min_t(u64, map->num_stripes, stripe_nr_end - stripe_nr_orig); stripe_nr = div_u64_rem(stripe_nr, map->num_stripes, &stripe_index); - if (!(rw & (REQ_WRITE | REQ_DISCARD | REQ_GET_READ_MIRRORS))) + if (op != REQ_OP_WRITE && op != REQ_OP_DISCARD && + op != REQ_GET_READ_MIRRORS) mirror_num = 1; } else if (map->type & BTRFS_BLOCK_GROUP_RAID1) { - if (rw & (REQ_WRITE | REQ_DISCARD | REQ_GET_READ_MIRRORS)) + if (op == REQ_OP_WRITE || op == REQ_OP_DISCARD || + op == REQ_GET_READ_MIRRORS) num_stripes = map->num_stripes; else if (mirror_num) stripe_index = mirror_num - 1; @@ -5437,7 +5439,8 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, } } else if (map->type & BTRFS_BLOCK_GROUP_DUP) { - if (rw & (REQ_WRITE | REQ_DISCARD | REQ_GET_READ_MIRRORS)) { + if (op == REQ_OP_WRITE || REQ_OP_DISCARD || + op == REQ_GET_READ_MIRRORS) { num_stripes = map->num_stripes; } else if (mirror_num) { stripe_index = mirror_num - 1; @@ -5451,9 +5454,9 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, stripe_nr = div_u64_rem(stripe_nr, factor, &stripe_index); stripe_index *= map->sub_stripes; - if (rw & (REQ_WRITE | REQ_GET_READ_MIRRORS)) + if (op == REQ_OP_WRITE || op == REQ_GET_READ_MIRRORS) num_stripes = map->sub_stripes; - else if (rw & REQ_DISCARD) + else if (op == REQ_OP_DISCARD) num_stripes = min_t(u64, map->sub_stripes * (stripe_nr_end - stripe_nr_orig), map->num_stripes); @@ -5471,7 +5474,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, } else if (map->type & BTRFS_BLOCK_GROUP_RAID56_MASK) { if (need_raid_map && - ((rw & (REQ_WRITE | REQ_GET_READ_MIRRORS)) || + (op == REQ_OP_WRITE || op == REQ_GET_READ_MIRRORS || mirror_num > 1)) { /* push stripe_nr back to the start of the full stripe */ stripe_nr = div_u64(raid56_full_stripe_start, @@ -5499,8 +5502,8 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, /* We distribute the parity blocks across stripes */ div_u64_rem(stripe_nr + stripe_index, map->num_stripes, &stripe_index); - if (!(rw & (REQ_WRITE | REQ_DISCARD | - REQ_GET_READ_MIRRORS)) && mirror_num <= 1) + if ((op != REQ_OP_WRITE && op != REQ_OP_DISCARD && + op != REQ_GET_READ_MIRRORS) && mirror_num <= 1) mirror_num = 1; } } else { @@ -5517,9 +5520,9 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, num_alloc_stripes = num_stripes; if (dev_replace_is_ongoing) { - if (rw & (REQ_WRITE | REQ_DISCARD)) + if (op == REQ_OP_WRITE || op == REQ_OP_DISCARD) num_alloc_stripes <<= 1; - if (rw & REQ_GET_READ_MIRRORS) + if (op == REQ_GET_READ_MIRRORS) num_alloc_stripes++; tgtdev_indexes = num_stripes; } @@ -5534,7 +5537,8 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, /* build raid_map */ if (map->type & BTRFS_BLOCK_GROUP_RAID56_MASK && - need_raid_map && ((rw & (REQ_WRITE | REQ_GET_READ_MIRRORS)) || + need_raid_map && + ((op == REQ_OP_WRITE || op == REQ_GET_READ_MIRRORS) || mirror_num > 1)) { u64 tmp; unsigned rot; @@ -5559,7 +5563,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, RAID6_Q_STRIPE; } - if (rw & REQ_DISCARD) { + if (op == REQ_OP_DISCARD) { u32 factor = 0; u32 sub_stripes = 0; u64 stripes_per_dev = 0; @@ -5639,14 +5643,15 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, } } - if (rw & (REQ_WRITE | REQ_GET_READ_MIRRORS)) + if (op == REQ_OP_WRITE || op == REQ_GET_READ_MIRRORS) max_errors = btrfs_chunk_max_errors(map); if (bbio->raid_map) sort_parity_stripes(bbio, num_stripes); tgtdev_indexes = 0; - if (dev_replace_is_ongoing && (rw & (REQ_WRITE | REQ_DISCARD)) && + if (dev_replace_is_ongoing && + (op == REQ_OP_WRITE || op == REQ_OP_DISCARD) && dev_replace->tgtdev != NULL) { int index_where_to_add; u64 srcdev_devid = dev_replace->srcdev->devid; @@ -5681,7 +5686,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, } } num_stripes = index_where_to_add; - } else if (dev_replace_is_ongoing && (rw & REQ_GET_READ_MIRRORS) && + } else if (dev_replace_is_ongoing && (op == REQ_GET_READ_MIRRORS) && dev_replace->tgtdev != NULL) { u64 srcdev_devid = dev_replace->srcdev->devid; int index_srcdev = 0; @@ -5756,21 +5761,21 @@ out: return ret; } -int btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, +int btrfs_map_block(struct btrfs_fs_info *fs_info, int op, u64 logical, u64 *length, struct btrfs_bio **bbio_ret, int mirror_num) { - return __btrfs_map_block(fs_info, rw, logical, length, bbio_ret, + return __btrfs_map_block(fs_info, op, logical, length, bbio_ret, mirror_num, 0); } /* For Scrub/replace */ -int btrfs_map_sblock(struct btrfs_fs_info *fs_info, int rw, +int btrfs_map_sblock(struct btrfs_fs_info *fs_info, int op, u64 logical, u64 *length, struct btrfs_bio **bbio_ret, int mirror_num, int need_raid_map) { - return __btrfs_map_block(fs_info, rw, logical, length, bbio_ret, + return __btrfs_map_block(fs_info, op, logical, length, bbio_ret, mirror_num, need_raid_map); } diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h index febdb7b..c64229e 100644 --- a/fs/btrfs/volumes.h +++ b/fs/btrfs/volumes.h @@ -421,10 +421,10 @@ int btrfs_account_dev_extents_size(struct btrfs_device *device, u64 start, u64 end, u64 *length); void btrfs_get_bbio(struct btrfs_bio *bbio); void btrfs_put_bbio(struct btrfs_bio *bbio); -int btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, +int btrfs_map_block(struct btrfs_fs_info *fs_info, int op, u64 logical, u64 *length, struct btrfs_bio **bbio_ret, int mirror_num); -int btrfs_map_sblock(struct btrfs_fs_info *fs_info, int rw, +int btrfs_map_sblock(struct btrfs_fs_info *fs_info, int op, u64 logical, u64 *length, struct btrfs_bio **bbio_ret, int mirror_num, int need_raid_map); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:16:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B92707CE7 for ; Fri, 15 Apr 2016 14:16:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 38B13AC001 for ; Fri, 15 Apr 2016 12:16:47 -0700 (PDT) X-ASG-Debug-ID: 1460747805-04bdf01103610580001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id jLO60OYLkOS6lXeZ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:16:45 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D5F4F81121; Fri, 15 Apr 2016 19:16:44 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIha007872; Fri, 15 Apr 2016 15:16:42 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 10/42] btrfs: use bio fields for op and flags Date: Fri, 15 Apr 2016 14:15:45 -0500 X-ASG-Orig-Subj: [PATCH 10/42] btrfs: use bio fields for op and flags Message-Id: <1460747777-8479-11-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747805 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie The bio bi_op and bi_rw is now setup, so there is no need to pass around the rq_flag_bits bits too. btrfs users should should access the bio. v2: 1. Fix merge_bio issue where instead of removing rw/op argument I passed it in again to the merge_bio related functions. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- fs/btrfs/compression.c | 13 ++++++------- fs/btrfs/ctree.h | 2 +- fs/btrfs/disk-io.c | 30 ++++++++++++------------------ fs/btrfs/disk-io.h | 2 +- fs/btrfs/extent_io.c | 12 +++++------- fs/btrfs/extent_io.h | 8 ++++---- fs/btrfs/inode.c | 44 ++++++++++++++++++++------------------------ fs/btrfs/volumes.c | 6 +++--- fs/btrfs/volumes.h | 2 +- 9 files changed, 53 insertions(+), 66 deletions(-) diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index 334a00c..356ac36 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c @@ -374,7 +374,7 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start, page = compressed_pages[pg_index]; page->mapping = inode->i_mapping; if (bio->bi_iter.bi_size) - ret = io_tree->ops->merge_bio_hook(WRITE, page, 0, + ret = io_tree->ops->merge_bio_hook(page, 0, PAGE_SIZE, bio, 0); else @@ -402,7 +402,7 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start, BUG_ON(ret); /* -ENOMEM */ } - ret = btrfs_map_bio(root, WRITE, bio, 0, 1); + ret = btrfs_map_bio(root, bio, 0, 1); BUG_ON(ret); /* -ENOMEM */ bio_put(bio); @@ -433,7 +433,7 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start, BUG_ON(ret); /* -ENOMEM */ } - ret = btrfs_map_bio(root, WRITE, bio, 0, 1); + ret = btrfs_map_bio(root, bio, 0, 1); BUG_ON(ret); /* -ENOMEM */ bio_put(bio); @@ -659,7 +659,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, page->index = em_start >> PAGE_SHIFT; if (comp_bio->bi_iter.bi_size) - ret = tree->ops->merge_bio_hook(READ, page, 0, + ret = tree->ops->merge_bio_hook(page, 0, PAGE_SIZE, comp_bio, 0); else @@ -690,8 +690,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, sums += DIV_ROUND_UP(comp_bio->bi_iter.bi_size, root->sectorsize); - ret = btrfs_map_bio(root, READ, comp_bio, - mirror_num, 0); + ret = btrfs_map_bio(root, comp_bio, mirror_num, 0); if (ret) { bio->bi_error = ret; bio_endio(comp_bio); @@ -721,7 +720,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, BUG_ON(ret); /* -ENOMEM */ } - ret = btrfs_map_bio(root, READ, comp_bio, mirror_num, 0); + ret = btrfs_map_bio(root, comp_bio, mirror_num, 0); if (ret) { bio->bi_error = ret; bio_endio(comp_bio); diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index a0c6aca..4e50f59 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -4087,7 +4087,7 @@ int btrfs_create_subvol_root(struct btrfs_trans_handle *trans, struct btrfs_root *new_root, struct btrfs_root *parent_root, u64 new_dirid); -int btrfs_merge_bio_hook(int rw, struct page *page, unsigned long offset, +int btrfs_merge_bio_hook(struct page *page, unsigned long offset, size_t size, struct bio *bio, unsigned long bio_flags); int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf); diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 932268b..bea6df6 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -124,7 +124,6 @@ struct async_submit_bio { struct list_head list; extent_submit_bio_hook_t *submit_bio_start; extent_submit_bio_hook_t *submit_bio_done; - int rw; int mirror_num; unsigned long bio_flags; /* @@ -797,7 +796,7 @@ static void run_one_async_start(struct btrfs_work *work) int ret; async = container_of(work, struct async_submit_bio, work); - ret = async->submit_bio_start(async->inode, async->rw, async->bio, + ret = async->submit_bio_start(async->inode, async->bio, async->mirror_num, async->bio_flags, async->bio_offset); if (ret) @@ -830,9 +829,8 @@ static void run_one_async_done(struct btrfs_work *work) return; } - async->submit_bio_done(async->inode, async->rw, async->bio, - async->mirror_num, async->bio_flags, - async->bio_offset); + async->submit_bio_done(async->inode, async->bio, async->mirror_num, + async->bio_flags, async->bio_offset); } static void run_one_async_free(struct btrfs_work *work) @@ -844,7 +842,7 @@ static void run_one_async_free(struct btrfs_work *work) } int btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, struct inode *inode, - int rw, struct bio *bio, int mirror_num, + struct bio *bio, int mirror_num, unsigned long bio_flags, u64 bio_offset, extent_submit_bio_hook_t *submit_bio_start, @@ -857,7 +855,6 @@ int btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, struct inode *inode, return -ENOMEM; async->inode = inode; - async->rw = rw; async->bio = bio; async->mirror_num = mirror_num; async->submit_bio_start = submit_bio_start; @@ -903,9 +900,8 @@ static int btree_csum_one_bio(struct bio *bio) return ret; } -static int __btree_submit_bio_start(struct inode *inode, int rw, - struct bio *bio, int mirror_num, - unsigned long bio_flags, +static int __btree_submit_bio_start(struct inode *inode, struct bio *bio, + int mirror_num, unsigned long bio_flags, u64 bio_offset) { /* @@ -915,7 +911,7 @@ static int __btree_submit_bio_start(struct inode *inode, int rw, return btree_csum_one_bio(bio); } -static int __btree_submit_bio_done(struct inode *inode, int rw, struct bio *bio, +static int __btree_submit_bio_done(struct inode *inode, struct bio *bio, int mirror_num, unsigned long bio_flags, u64 bio_offset) { @@ -925,7 +921,7 @@ static int __btree_submit_bio_done(struct inode *inode, int rw, struct bio *bio, * when we're called for a write, we're already in the async * submission context. Just jump into btrfs_map_bio */ - ret = btrfs_map_bio(BTRFS_I(inode)->root, rw, bio, mirror_num, 1); + ret = btrfs_map_bio(BTRFS_I(inode)->root, bio, mirror_num, 1); if (ret) { bio->bi_error = ret; bio_endio(bio); @@ -944,7 +940,7 @@ static int check_async_write(struct inode *inode, unsigned long bio_flags) return 1; } -static int btree_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, +static int btree_submit_bio_hook(struct inode *inode, struct bio *bio, int mirror_num, unsigned long bio_flags, u64 bio_offset) { @@ -960,21 +956,19 @@ static int btree_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, bio, BTRFS_WQ_ENDIO_METADATA); if (ret) goto out_w_error; - ret = btrfs_map_bio(BTRFS_I(inode)->root, rw, bio, - mirror_num, 0); + ret = btrfs_map_bio(BTRFS_I(inode)->root, bio, mirror_num, 0); } else if (!async) { ret = btree_csum_one_bio(bio); if (ret) goto out_w_error; - ret = btrfs_map_bio(BTRFS_I(inode)->root, rw, bio, - mirror_num, 0); + ret = btrfs_map_bio(BTRFS_I(inode)->root, bio, mirror_num, 0); } else { /* * kthread helpers are used to submit writes so that * checksumming can happen in parallel across all CPUs */ ret = btrfs_wq_submit_bio(BTRFS_I(inode)->root->fs_info, - inode, rw, bio, mirror_num, 0, + inode, bio, mirror_num, 0, bio_offset, __btree_submit_bio_start, __btree_submit_bio_done); diff --git a/fs/btrfs/disk-io.h b/fs/btrfs/disk-io.h index 8e79d00..73c21a2 100644 --- a/fs/btrfs/disk-io.h +++ b/fs/btrfs/disk-io.h @@ -122,7 +122,7 @@ void btrfs_csum_final(u32 crc, char *result); int btrfs_bio_wq_end_io(struct btrfs_fs_info *info, struct bio *bio, enum btrfs_wq_endio_type metadata); int btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, struct inode *inode, - int rw, struct bio *bio, int mirror_num, + struct bio *bio, int mirror_num, unsigned long bio_flags, u64 bio_offset, extent_submit_bio_hook_t *submit_bio_start, extent_submit_bio_hook_t *submit_bio_done); diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 45fa3be..3bac80d 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -2409,8 +2409,7 @@ static int bio_readpage_error(struct bio *failed_bio, u64 phy_offset, pr_debug("Repair Read Error: submitting new read[%#x] to this_mirror=%d, in_validation=%d\n", read_mode, failrec->this_mirror, failrec->in_validation); - ret = tree->ops->submit_bio_hook(inode, read_mode, bio, - failrec->this_mirror, + ret = tree->ops->submit_bio_hook(inode, bio, failrec->this_mirror, failrec->bio_flags, 0); if (ret) { free_io_failure(inode, failrec); @@ -2731,9 +2730,8 @@ static int __must_check submit_one_bio(struct bio *bio, int mirror_num, bio_get(bio); if (tree->ops && tree->ops->submit_bio_hook) - ret = tree->ops->submit_bio_hook(page->mapping->host, - bio->bi_rw, bio, mirror_num, - bio_flags, start); + ret = tree->ops->submit_bio_hook(page->mapping->host, bio, + mirror_num, bio_flags, start); else btrfsic_submit_bio(bio); @@ -2747,8 +2745,8 @@ static int merge_bio(struct extent_io_tree *tree, struct page *page, { int ret = 0; if (tree->ops && tree->ops->merge_bio_hook) - ret = tree->ops->merge_bio_hook(bio->bi_op, page, offset, size, - bio, bio_flags); + ret = tree->ops->merge_bio_hook(page, offset, size, bio, + bio_flags); BUG_ON(ret < 0); return ret; diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h index b5e0ade..f8db2fd 100644 --- a/fs/btrfs/extent_io.h +++ b/fs/btrfs/extent_io.h @@ -63,9 +63,9 @@ struct btrfs_root; struct btrfs_io_bio; struct io_failure_record; -typedef int (extent_submit_bio_hook_t)(struct inode *inode, int rw, - struct bio *bio, int mirror_num, - unsigned long bio_flags, u64 bio_offset); +typedef int (extent_submit_bio_hook_t)(struct inode *inode, struct bio *bio, + int mirror_num, unsigned long bio_flags, + u64 bio_offset); struct extent_io_ops { int (*fill_delalloc)(struct inode *inode, struct page *locked_page, u64 start, u64 end, int *page_started, @@ -73,7 +73,7 @@ struct extent_io_ops { int (*writepage_start_hook)(struct page *page, u64 start, u64 end); int (*writepage_io_hook)(struct page *page, u64 start, u64 end); extent_submit_bio_hook_t *submit_bio_hook; - int (*merge_bio_hook)(int rw, struct page *page, unsigned long offset, + int (*merge_bio_hook)(struct page *page, unsigned long offset, size_t size, struct bio *bio, unsigned long bio_flags); int (*readpage_io_failed_hook)(struct page *page, int failed_mirror); diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index c2dc75b..bd214ab 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -1807,7 +1807,7 @@ static void btrfs_clear_bit_hook(struct inode *inode, * extent_io.c merge_bio_hook, this must check the chunk tree to make sure * we don't create bios that span stripes or chunks */ -int btrfs_merge_bio_hook(int rw, struct page *page, unsigned long offset, +int btrfs_merge_bio_hook(struct page *page, unsigned long offset, size_t size, struct bio *bio, unsigned long bio_flags) { @@ -1822,7 +1822,7 @@ int btrfs_merge_bio_hook(int rw, struct page *page, unsigned long offset, length = bio->bi_iter.bi_size; map_length = length; - ret = btrfs_map_block(root->fs_info, rw, logical, + ret = btrfs_map_block(root->fs_info, bio->bi_op, logical, &map_length, NULL, 0); /* Will always return 0 with map_multi == NULL */ BUG_ON(ret < 0); @@ -1839,9 +1839,8 @@ int btrfs_merge_bio_hook(int rw, struct page *page, unsigned long offset, * At IO completion time the cums attached on the ordered extent record * are inserted into the btree */ -static int __btrfs_submit_bio_start(struct inode *inode, int rw, - struct bio *bio, int mirror_num, - unsigned long bio_flags, +static int __btrfs_submit_bio_start(struct inode *inode, struct bio *bio, + int mirror_num, unsigned long bio_flags, u64 bio_offset) { struct btrfs_root *root = BTRFS_I(inode)->root; @@ -1860,14 +1859,14 @@ static int __btrfs_submit_bio_start(struct inode *inode, int rw, * At IO completion time the cums attached on the ordered extent record * are inserted into the btree */ -static int __btrfs_submit_bio_done(struct inode *inode, int rw, struct bio *bio, +static int __btrfs_submit_bio_done(struct inode *inode, struct bio *bio, int mirror_num, unsigned long bio_flags, u64 bio_offset) { struct btrfs_root *root = BTRFS_I(inode)->root; int ret; - ret = btrfs_map_bio(root, rw, bio, mirror_num, 1); + ret = btrfs_map_bio(root, bio, mirror_num, 1); if (ret) { bio->bi_error = ret; bio_endio(bio); @@ -1879,7 +1878,7 @@ static int __btrfs_submit_bio_done(struct inode *inode, int rw, struct bio *bio, * extent_io.c submission hook. This does the right thing for csum calculation * on write, or reading the csums from the tree before a read */ -static int btrfs_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, +static int btrfs_submit_bio_hook(struct inode *inode, struct bio *bio, int mirror_num, unsigned long bio_flags, u64 bio_offset) { @@ -1916,7 +1915,7 @@ static int btrfs_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, goto mapit; /* we're doing a write, do the async checksumming */ ret = btrfs_wq_submit_bio(BTRFS_I(inode)->root->fs_info, - inode, rw, bio, mirror_num, + inode, bio, mirror_num, bio_flags, bio_offset, __btrfs_submit_bio_start, __btrfs_submit_bio_done); @@ -1928,7 +1927,7 @@ static int btrfs_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, } mapit: - ret = btrfs_map_bio(root, rw, bio, mirror_num, 0); + ret = btrfs_map_bio(root, bio, mirror_num, 0); out: if (ret < 0) { @@ -7746,7 +7745,7 @@ err: } static inline int submit_dio_repair_bio(struct inode *inode, struct bio *bio, - int rw, int mirror_num) + int mirror_num) { struct btrfs_root *root = BTRFS_I(inode)->root; int ret; @@ -7760,7 +7759,7 @@ static inline int submit_dio_repair_bio(struct inode *inode, struct bio *bio, if (ret) goto err; - ret = btrfs_map_bio(root, rw, bio, mirror_num, 0); + ret = btrfs_map_bio(root, bio, mirror_num, 0); err: bio_put(bio); return ret; @@ -7846,8 +7845,7 @@ static int dio_read_error(struct inode *inode, struct bio *failed_bio, "Repair DIO Read Error: submitting new dio read[%#x] to this_mirror=%d, in_validation=%d\n", read_mode, failrec->this_mirror, failrec->in_validation); - ret = submit_dio_repair_bio(inode, bio, read_mode, - failrec->this_mirror); + ret = submit_dio_repair_bio(inode, bio, failrec->this_mirror); if (ret) { free_io_failure(inode, failrec); bio_put(bio); @@ -8137,7 +8135,7 @@ static void btrfs_endio_direct_write(struct bio *bio) bio_put(bio); } -static int __btrfs_submit_bio_start_direct_io(struct inode *inode, int rw, +static int __btrfs_submit_bio_start_direct_io(struct inode *inode, struct bio *bio, int mirror_num, unsigned long bio_flags, u64 offset) { @@ -8230,7 +8228,7 @@ static inline int btrfs_lookup_and_bind_dio_csum(struct btrfs_root *root, } static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, - int rw, u64 file_offset, int skip_sum, + u64 file_offset, int skip_sum, int async_submit) { struct btrfs_dio_private *dip = bio->bi_private; @@ -8255,8 +8253,7 @@ static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, if (write && async_submit) { ret = btrfs_wq_submit_bio(root->fs_info, - inode, rw, bio, 0, 0, - file_offset, + inode, bio, 0, 0, file_offset, __btrfs_submit_bio_start_direct_io, __btrfs_submit_bio_done); goto err; @@ -8275,13 +8272,13 @@ static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, goto err; } map: - ret = btrfs_map_bio(root, rw, bio, 0, async_submit); + ret = btrfs_map_bio(root, bio, 0, async_submit); err: bio_put(bio); return ret; } -static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, +static int btrfs_submit_direct_hook(struct btrfs_dio_private *dip, int skip_sum) { struct inode *inode = dip->inode; @@ -8342,7 +8339,7 @@ next_block: * before we're done setting it up */ atomic_inc(&dip->pending_bios); - ret = __btrfs_submit_dio_bio(bio, inode, rw, + ret = __btrfs_submit_dio_bio(bio, inode, file_offset, skip_sum, async_submit); if (ret) { @@ -8387,7 +8384,7 @@ next_block: } submit: - ret = __btrfs_submit_dio_bio(bio, inode, rw, file_offset, skip_sum, + ret = __btrfs_submit_dio_bio(bio, inode, file_offset, skip_sum, async_submit); if (!ret) return 0; @@ -8465,8 +8462,7 @@ static void btrfs_submit_direct(struct bio *dio_bio, struct inode *inode, dio_data->unsubmitted_oe_range_end; } - ret = btrfs_submit_direct_hook(dio_bio->bi_op | dio_bio->bi_rw, dip, - skip_sum); + ret = btrfs_submit_direct_hook(dip, skip_sum); if (!ret) return; diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index dc56558..2100514 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -5995,7 +5995,7 @@ static noinline void btrfs_schedule_bio(struct btrfs_root *root, static void submit_stripe_bio(struct btrfs_root *root, struct btrfs_bio *bbio, struct bio *bio, u64 physical, int dev_nr, - int rw, int async) + int async) { struct btrfs_device *dev = bbio->stripes[dev_nr].dev; @@ -6040,7 +6040,7 @@ static void bbio_error(struct btrfs_bio *bbio, struct bio *bio, u64 logical) } } -int btrfs_map_bio(struct btrfs_root *root, int rw, struct bio *bio, +int btrfs_map_bio(struct btrfs_root *root, struct bio *bio, int mirror_num, int async_submit) { struct btrfs_device *dev; @@ -6107,7 +6107,7 @@ int btrfs_map_bio(struct btrfs_root *root, int rw, struct bio *bio, bio = first_bio; submit_stripe_bio(root, bbio, bio, - bbio->stripes[dev_nr].physical, dev_nr, rw, + bbio->stripes[dev_nr].physical, dev_nr, async_submit); } btrfs_bio_counter_dec(root->fs_info); diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h index c64229e..372974d0 100644 --- a/fs/btrfs/volumes.h +++ b/fs/btrfs/volumes.h @@ -437,7 +437,7 @@ int btrfs_alloc_chunk(struct btrfs_trans_handle *trans, struct btrfs_root *extent_root, u64 type); void btrfs_mapping_init(struct btrfs_mapping_tree *tree); void btrfs_mapping_tree_free(struct btrfs_mapping_tree *tree); -int btrfs_map_bio(struct btrfs_root *root, int rw, struct bio *bio, +int btrfs_map_bio(struct btrfs_root *root, struct bio *bio, int mirror_num, int async_submit); int btrfs_open_devices(struct btrfs_fs_devices *fs_devices, fmode_t flags, void *holder); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:16:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C72FC7CDD for ; Fri, 15 Apr 2016 14:16:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 589EBAC002 for ; Fri, 15 Apr 2016 12:16:49 -0700 (PDT) X-ASG-Debug-ID: 1460747807-04bdf01103610590001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id CVS7LkduUb9qjADT (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:16:47 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 23AC5BB18; Fri, 15 Apr 2016 19:16:47 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhb007872; Fri, 15 Apr 2016 15:16:44 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 11/42] f2fs: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 14:15:46 -0500 X-ASG-Orig-Subj: [PATCH 11/42] f2fs: set bi_op to REQ_OP Message-Id: <1460747777-8479-12-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747807 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has f2fs use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- fs/f2fs/checkpoint.c | 10 ++++++---- fs/f2fs/data.c | 33 ++++++++++++++++++++------------- fs/f2fs/f2fs.h | 5 +++-- fs/f2fs/gc.c | 9 ++++++--- fs/f2fs/inline.c | 3 ++- fs/f2fs/node.c | 8 +++++--- fs/f2fs/segment.c | 10 +++++++--- fs/f2fs/trace.c | 7 ++++--- include/trace/events/f2fs.h | 34 +++++++++++++++++++++------------- 9 files changed, 74 insertions(+), 45 deletions(-) diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c index b92782f..6f9dc16 100644 --- a/fs/f2fs/checkpoint.c +++ b/fs/f2fs/checkpoint.c @@ -55,14 +55,15 @@ static struct page *__get_meta_page(struct f2fs_sb_info *sbi, pgoff_t index, struct f2fs_io_info fio = { .sbi = sbi, .type = META, - .rw = READ_SYNC | REQ_META | REQ_PRIO, + .op = REQ_OP_READ, + .op_flags = READ_SYNC | REQ_META | REQ_PRIO, .old_blkaddr = index, .new_blkaddr = index, .encrypted_page = NULL, }; if (unlikely(!is_meta)) - fio.rw &= ~REQ_META; + fio.op_flags &= ~REQ_META; repeat: page = grab_cache_page(mapping, index); if (!page) { @@ -149,13 +150,14 @@ int ra_meta_pages(struct f2fs_sb_info *sbi, block_t start, int nrpages, struct f2fs_io_info fio = { .sbi = sbi, .type = META, - .rw = sync ? (READ_SYNC | REQ_META | REQ_PRIO) : READA, + .op = REQ_OP_READ, + .op_flags = sync ? (READ_SYNC | REQ_META | REQ_PRIO) : READA, .encrypted_page = NULL, }; struct blk_plug plug; if (unlikely(type == META_POR)) - fio.rw &= ~REQ_META; + fio.op_flags &= ~REQ_META; blk_start_plug(&plug); for (; nrpages-- > 0; blkno++) { diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 74cf5cb..03b6362 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -105,11 +105,12 @@ static void __submit_merged_bio(struct f2fs_bio_info *io) if (!io->bio) return; - if (is_read_io(fio->rw)) + if (is_read_io(fio->op)) trace_f2fs_submit_read_bio(io->sbi->sb, fio, io->bio); else trace_f2fs_submit_write_bio(io->sbi->sb, fio, io->bio); - io->bio->bi_rw = fio->rw; + io->bio->bi_op = fio->op; + io->bio->bi_rw = fio->op_flags; submit_bio(io->bio); io->bio = NULL; @@ -177,10 +178,12 @@ static void __f2fs_submit_merged_bio(struct f2fs_sb_info *sbi, /* change META to META_FLUSH in the checkpoint procedure */ if (type >= META_FLUSH) { io->fio.type = META_FLUSH; + io->fio.op = REQ_OP_WRITE; if (test_opt(sbi, NOBARRIER)) - io->fio.rw = WRITE_FLUSH | REQ_META | REQ_PRIO; + io->fio.op_flags = WRITE_FLUSH | REQ_META | REQ_PRIO; else - io->fio.rw = WRITE_FLUSH_FUA | REQ_META | REQ_PRIO; + io->fio.op_flags = WRITE_FLUSH_FUA | REQ_META | + REQ_PRIO; } __submit_merged_bio(io); out: @@ -222,13 +225,14 @@ int f2fs_submit_page_bio(struct f2fs_io_info *fio) f2fs_trace_ios(fio, 0); /* Allocate a new bio */ - bio = __bio_alloc(fio->sbi, fio->new_blkaddr, 1, is_read_io(fio->rw)); + bio = __bio_alloc(fio->sbi, fio->new_blkaddr, 1, is_read_io(fio->op)); if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) { bio_put(bio); return -EFAULT; } - bio->bi_rw = fio->rw; + bio->bi_op = fio->op; + bio->bi_rw = fio->op_flags; submit_bio(bio); return 0; @@ -239,7 +243,7 @@ void f2fs_submit_page_mbio(struct f2fs_io_info *fio) struct f2fs_sb_info *sbi = fio->sbi; enum page_type btype = PAGE_TYPE_OF_BIO(fio->type); struct f2fs_bio_info *io; - bool is_read = is_read_io(fio->rw); + bool is_read = is_read_io(fio->op); struct page *bio_page; io = is_read ? &sbi->read_io : &sbi->write_io[btype]; @@ -254,7 +258,7 @@ void f2fs_submit_page_mbio(struct f2fs_io_info *fio) inc_page_count(sbi, F2FS_WRITEBACK); if (io->bio && (io->last_block_in_bio != fio->new_blkaddr - 1 || - io->fio.rw != fio->rw)) + (io->fio.op != fio->op || io->fio.op_flags != fio->op_flags))) __submit_merged_bio(io); alloc_new: if (io->bio == NULL) { @@ -359,7 +363,7 @@ int f2fs_get_block(struct dnode_of_data *dn, pgoff_t index) } struct page *get_read_data_page(struct inode *inode, pgoff_t index, - int rw, bool for_write) + int op_flags, bool for_write) { struct address_space *mapping = inode->i_mapping; struct dnode_of_data dn; @@ -369,7 +373,8 @@ struct page *get_read_data_page(struct inode *inode, pgoff_t index, struct f2fs_io_info fio = { .sbi = F2FS_I_SB(inode), .type = DATA, - .rw = rw, + .op = REQ_OP_READ, + .op_flags = op_flags, .encrypted_page = NULL, }; @@ -1014,7 +1019,7 @@ submit_and_realloc: bio->bi_iter.bi_sector = SECTOR_FROM_BLOCK(block_nr); bio->bi_end_io = f2fs_read_end_io; bio->bi_private = ctx; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; } if (bio_add_page(bio, page, blocksize, 0) < blocksize) @@ -1156,7 +1161,8 @@ static int f2fs_write_data_page(struct page *page, struct f2fs_io_info fio = { .sbi = sbi, .type = DATA, - .rw = (wbc->sync_mode == WB_SYNC_ALL) ? WRITE_SYNC : WRITE, + .op = REQ_OP_WRITE, + .op_flags = (wbc->sync_mode == WB_SYNC_ALL) ? WRITE_SYNC : 0, .page = page, .encrypted_page = NULL, }; @@ -1594,7 +1600,8 @@ repeat: struct f2fs_io_info fio = { .sbi = sbi, .type = DATA, - .rw = READ_SYNC, + .op = REQ_OP_READ, + .op_flags = READ_SYNC, .old_blkaddr = blkaddr, .new_blkaddr = blkaddr, .page = page, diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 3f15513..bc488e2 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -636,14 +636,15 @@ enum page_type { struct f2fs_io_info { struct f2fs_sb_info *sbi; /* f2fs_sb_info pointer */ enum page_type type; /* contains DATA/NODE/META/META_FLUSH */ - int rw; /* contains R/RS/W/WS with REQ_META/REQ_PRIO */ + int op; /* contains REQ_OP_ */ + int op_flags; /* rq_flag_bits */ block_t new_blkaddr; /* new block address to be written */ block_t old_blkaddr; /* old block address before Cow */ struct page *page; /* page to be written */ struct page *encrypted_page; /* encrypted page */ }; -#define is_read_io(rw) (((rw) & 1) == READ) +#define is_read_io(rw) (rw == READ) struct f2fs_bio_info { struct f2fs_sb_info *sbi; /* f2fs superblock */ struct bio *bio; /* bios to merge */ diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c index b0051a9..fbd4b88 100644 --- a/fs/f2fs/gc.c +++ b/fs/f2fs/gc.c @@ -546,7 +546,8 @@ static void move_encrypted_block(struct inode *inode, block_t bidx) struct f2fs_io_info fio = { .sbi = F2FS_I_SB(inode), .type = DATA, - .rw = READ_SYNC, + .op = REQ_OP_READ, + .op_flags = READ_SYNC, .encrypted_page = NULL, }; struct dnode_of_data dn; @@ -620,7 +621,8 @@ static void move_encrypted_block(struct inode *inode, block_t bidx) /* allocate block address */ f2fs_wait_on_page_writeback(dn.node_page, NODE, true); - fio.rw = WRITE_SYNC; + fio.op = REQ_OP_WRITE; + fio.op_flags = WRITE_SYNC; fio.new_blkaddr = newaddr; f2fs_submit_page_mbio(&fio); @@ -657,7 +659,8 @@ static void move_data_page(struct inode *inode, block_t bidx, int gc_type) struct f2fs_io_info fio = { .sbi = F2FS_I_SB(inode), .type = DATA, - .rw = WRITE_SYNC, + .op = REQ_OP_WRITE, + .op_flags = WRITE_SYNC, .page = page, .encrypted_page = NULL, }; diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c index 7720565..d3f7292 100644 --- a/fs/f2fs/inline.c +++ b/fs/f2fs/inline.c @@ -108,7 +108,8 @@ int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page) struct f2fs_io_info fio = { .sbi = F2FS_I_SB(dn->inode), .type = DATA, - .rw = WRITE_SYNC | REQ_PRIO, + .op = REQ_OP_WRITE, + .op_flags = WRITE_SYNC | REQ_PRIO, .page = page, .encrypted_page = NULL, }; diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index 095fc2c..c6935c5 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c @@ -1043,14 +1043,15 @@ fail: * 0: f2fs_put_page(page, 0) * LOCKED_PAGE or error: f2fs_put_page(page, 1) */ -static int read_node_page(struct page *page, int rw) +static int read_node_page(struct page *page, int op_flags) { struct f2fs_sb_info *sbi = F2FS_P_SB(page); struct node_info ni; struct f2fs_io_info fio = { .sbi = sbi, .type = NODE, - .rw = rw, + .op = REQ_OP_READ, + .op_flags = op_flags, .page = page, .encrypted_page = NULL, }; @@ -1389,7 +1390,8 @@ static int f2fs_write_node_page(struct page *page, struct f2fs_io_info fio = { .sbi = sbi, .type = NODE, - .rw = (wbc->sync_mode == WB_SYNC_ALL) ? WRITE_SYNC : WRITE, + .op = REQ_OP_WRITE, + .op_flags = (wbc->sync_mode == WB_SYNC_ALL) ? WRITE_SYNC : 0, .page = page, .encrypted_page = NULL, }; diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 0928d57..e271f16 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -255,7 +255,8 @@ static int __commit_inmem_pages(struct inode *inode, struct f2fs_io_info fio = { .sbi = sbi, .type = DATA, - .rw = WRITE_SYNC | REQ_PRIO, + .op = REQ_OP_WRITE, + .op_flags = WRITE_SYNC | REQ_PRIO, .encrypted_page = NULL, }; bool submit_bio = false; @@ -404,6 +405,7 @@ repeat: fcc->dispatch_list = llist_reverse_order(fcc->dispatch_list); bio->bi_bdev = sbi->sb->s_bdev; + bio->bi_op = REQ_OP_WRITE; bio->bi_rw = WRITE_FLUSH; ret = submit_bio_wait(bio); @@ -437,6 +439,7 @@ int f2fs_issue_flush(struct f2fs_sb_info *sbi) int ret; bio->bi_bdev = sbi->sb->s_bdev; + bio->bi_op = REQ_OP_WRITE; bio->bi_rw = WRITE_FLUSH; ret = submit_bio_wait(bio); bio_put(bio); @@ -1401,7 +1404,8 @@ void write_meta_page(struct f2fs_sb_info *sbi, struct page *page) struct f2fs_io_info fio = { .sbi = sbi, .type = META, - .rw = WRITE_SYNC | REQ_META | REQ_PRIO, + .op = REQ_OP_WRITE, + .op_flags = WRITE_SYNC | REQ_META | REQ_PRIO, .old_blkaddr = page->index, .new_blkaddr = page->index, .page = page, @@ -1409,7 +1413,7 @@ void write_meta_page(struct f2fs_sb_info *sbi, struct page *page) }; if (unlikely(page->index >= MAIN_BLKADDR(sbi))) - fio.rw &= ~REQ_META; + fio.op_flags &= ~REQ_META; set_page_writeback(page); f2fs_submit_page_mbio(&fio); diff --git a/fs/f2fs/trace.c b/fs/f2fs/trace.c index 562ce08..73b4e1d 100644 --- a/fs/f2fs/trace.c +++ b/fs/f2fs/trace.c @@ -25,11 +25,11 @@ static inline void __print_last_io(void) if (!last_io.len) return; - trace_printk("%3x:%3x %4x %-16s %2x %5x %12x %4x\n", + trace_printk("%3x:%3x %4x %-16s %2x %5x %5x %12x %4x\n", last_io.major, last_io.minor, last_io.pid, "----------------", last_io.type, - last_io.fio.rw, + last_io.fio.op, last_io.fio.op_flags, last_io.fio.new_blkaddr, last_io.len); memset(&last_io, 0, sizeof(last_io)); @@ -101,7 +101,8 @@ void f2fs_trace_ios(struct f2fs_io_info *fio, int flush) if (last_io.major == major && last_io.minor == minor && last_io.pid == pid && last_io.type == __file_type(inode, pid) && - last_io.fio.rw == fio->rw && + last_io.fio.op == fio->op && + last_io.fio.op_flags == fio->op_flags && last_io.fio.new_blkaddr + last_io.len == fio->new_blkaddr) { last_io.len++; diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h index 0f56584..db75d69 100644 --- a/include/trace/events/f2fs.h +++ b/include/trace/events/f2fs.h @@ -56,17 +56,21 @@ TRACE_DEFINE_ENUM(CP_DISCARD); { IPU, "IN-PLACE" }, \ { OPU, "OUT-OF-PLACE" }) -#define F2FS_BIO_MASK(t) (t & (READA | WRITE_FLUSH_FUA)) +#define F2FS_BIO_FLAG_MASK(t) (t & (READA | WRITE_FLUSH_FUA)) #define F2FS_BIO_EXTRA_MASK(t) (t & (REQ_META | REQ_PRIO)) -#define show_bio_type(type) show_bio_base(type), show_bio_extra(type) +#define show_bio_type(op, op_flags) show_bio_op(op), \ + show_bio_op_flags(op_flags), show_bio_extra(op_flags) -#define show_bio_base(type) \ - __print_symbolic(F2FS_BIO_MASK(type), \ +#define show_bio_op(op) \ + __print_symbolic(op, \ { READ, "READ" }, \ + { WRITE, "WRITE" }) + +#define show_bio_op_flags(flags) \ + __print_symbolic(F2FS_BIO_FLAG_MASK(flags), \ { READA, "READAHEAD" }, \ { READ_SYNC, "READ_SYNC" }, \ - { WRITE, "WRITE" }, \ { WRITE_SYNC, "WRITE_SYNC" }, \ { WRITE_FLUSH, "WRITE_FLUSH" }, \ { WRITE_FUA, "WRITE_FUA" }, \ @@ -730,7 +734,8 @@ DECLARE_EVENT_CLASS(f2fs__submit_page_bio, __field(pgoff_t, index) __field(block_t, old_blkaddr) __field(block_t, new_blkaddr) - __field(int, rw) + __field(int, op) + __field(int, op_flags) __field(int, type) ), @@ -740,17 +745,18 @@ DECLARE_EVENT_CLASS(f2fs__submit_page_bio, __entry->index = page->index; __entry->old_blkaddr = fio->old_blkaddr; __entry->new_blkaddr = fio->new_blkaddr; - __entry->rw = fio->rw; + __entry->op = fio->op; + __entry->op_flags = fio->op_flags; __entry->type = fio->type; ), TP_printk("dev = (%d,%d), ino = %lu, page_index = 0x%lx, " - "oldaddr = 0x%llx, newaddr = 0x%llx rw = %s%s, type = %s", + "oldaddr = 0x%llx, newaddr = 0x%llx rw = %s%si%s, type = %s", show_dev_ino(__entry), (unsigned long)__entry->index, (unsigned long long)__entry->old_blkaddr, (unsigned long long)__entry->new_blkaddr, - show_bio_type(__entry->rw), + show_bio_type(__entry->op, __entry->op_flags), show_block_type(__entry->type)) ); @@ -781,7 +787,8 @@ DECLARE_EVENT_CLASS(f2fs__submit_bio, TP_STRUCT__entry( __field(dev_t, dev) - __field(int, rw) + __field(int, op) + __field(int, op_flags) __field(int, type) __field(sector_t, sector) __field(unsigned int, size) @@ -789,15 +796,16 @@ DECLARE_EVENT_CLASS(f2fs__submit_bio, TP_fast_assign( __entry->dev = sb->s_dev; - __entry->rw = fio->rw; + __entry->op = fio->op; + __entry->op_flags = fio->op_flags; __entry->type = fio->type; __entry->sector = bio->bi_iter.bi_sector; __entry->size = bio->bi_iter.bi_size; ), - TP_printk("dev = (%d,%d), %s%s, %s, sector = %lld, size = %u", + TP_printk("dev = (%d,%d), %s%s%s, %s, sector = %lld, size = %u", show_dev(__entry), - show_bio_type(__entry->rw), + show_bio_type(__entry->op, __entry->op_flags), show_block_type(__entry->type), (unsigned long long)__entry->sector, __entry->size) -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:16:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1F28B7CA6 for ; Fri, 15 Apr 2016 14:16:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8831EAC002 for ; Fri, 15 Apr 2016 12:16:51 -0700 (PDT) X-ASG-Debug-ID: 1460747809-04cb6c245f6410f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id FavRZzIAcpFbwxgD (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:16:50 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 63B806265B; Fri, 15 Apr 2016 19:16:49 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhc007872; Fri, 15 Apr 2016 15:16:47 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 12/42] gfs2: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 14:15:47 -0500 X-ASG-Orig-Subj: [PATCH 12/42] gfs2: set bi_op to REQ_OP Message-Id: <1460747777-8479-13-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Fri, 15 Apr 2016 19:16:49 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460747809 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has gfs2 use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- fs/gfs2/log.c | 8 ++++---- fs/gfs2/lops.c | 12 +++++++----- fs/gfs2/lops.h | 2 +- fs/gfs2/meta_io.c | 8 +++++--- fs/gfs2/ops_fstype.c | 1 + 5 files changed, 18 insertions(+), 13 deletions(-) diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c index 0ff028c..e58ccef0 100644 --- a/fs/gfs2/log.c +++ b/fs/gfs2/log.c @@ -657,7 +657,7 @@ static void log_write_header(struct gfs2_sbd *sdp, u32 flags) struct gfs2_log_header *lh; unsigned int tail; u32 hash; - int rw = WRITE_FLUSH_FUA | REQ_META; + int op_flags = WRITE_FLUSH_FUA | REQ_META; struct page *page = mempool_alloc(gfs2_page_pool, GFP_NOIO); enum gfs2_freeze_state state = atomic_read(&sdp->sd_freeze_state); lh = page_address(page); @@ -682,12 +682,12 @@ static void log_write_header(struct gfs2_sbd *sdp, u32 flags) if (test_bit(SDF_NOBARRIERS, &sdp->sd_flags)) { gfs2_ordered_wait(sdp); log_flush_wait(sdp); - rw = WRITE_SYNC | REQ_META | REQ_PRIO; + op_flags = WRITE_SYNC | REQ_META | REQ_PRIO; } sdp->sd_log_idle = (tail == sdp->sd_log_flush_head); gfs2_log_write_page(sdp, page); - gfs2_log_flush_bio(sdp, rw); + gfs2_log_flush_bio(sdp, REQ_OP_WRITE, op_flags); log_flush_wait(sdp); if (sdp->sd_log_tail != tail) @@ -738,7 +738,7 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, gfs2_ordered_write(sdp); lops_before_commit(sdp, tr); - gfs2_log_flush_bio(sdp, WRITE); + gfs2_log_flush_bio(sdp, REQ_OP_WRITE, 0); if (sdp->sd_log_head != sdp->sd_log_flush_head) { log_flush_wait(sdp); diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c index ce28242..c1099b4 100644 --- a/fs/gfs2/lops.c +++ b/fs/gfs2/lops.c @@ -230,17 +230,19 @@ static void gfs2_end_log_write(struct bio *bio) /** * gfs2_log_flush_bio - Submit any pending log bio * @sdp: The superblock - * @rw: The rw flags + * @op: REQ_OP + * @op_flags: rq_flag_bits * * Submit any pending part-built or full bio to the block device. If * there is no pending bio, then this is a no-op. */ -void gfs2_log_flush_bio(struct gfs2_sbd *sdp, int rw) +void gfs2_log_flush_bio(struct gfs2_sbd *sdp, int op, int op_flags) { if (sdp->sd_log_bio) { atomic_inc(&sdp->sd_log_in_flight); - sdp->sd_log_bio->bi_rw = rw; + sdp->sd_log_bio->bi_op = op; + sdp->sd_log_bio->bi_rw = op_flags; submit_bio(sdp->sd_log_bio); sdp->sd_log_bio = NULL; } @@ -300,7 +302,7 @@ static struct bio *gfs2_log_get_bio(struct gfs2_sbd *sdp, u64 blkno) nblk >>= sdp->sd_fsb2bb_shift; if (blkno == nblk) return bio; - gfs2_log_flush_bio(sdp, WRITE); + gfs2_log_flush_bio(sdp, REQ_OP_WRITE, 0); } return gfs2_log_alloc_bio(sdp, blkno); @@ -329,7 +331,7 @@ static void gfs2_log_write(struct gfs2_sbd *sdp, struct page *page, bio = gfs2_log_get_bio(sdp, blkno); ret = bio_add_page(bio, page, size, offset); if (ret == 0) { - gfs2_log_flush_bio(sdp, WRITE); + gfs2_log_flush_bio(sdp, REQ_OP_WRITE, 0); bio = gfs2_log_alloc_bio(sdp, blkno); ret = bio_add_page(bio, page, size, offset); WARN_ON(ret == 0); diff --git a/fs/gfs2/lops.h b/fs/gfs2/lops.h index a65a7ba..e529f53 100644 --- a/fs/gfs2/lops.h +++ b/fs/gfs2/lops.h @@ -27,7 +27,7 @@ extern const struct gfs2_log_operations gfs2_databuf_lops; extern const struct gfs2_log_operations *gfs2_log_ops[]; extern void gfs2_log_write_page(struct gfs2_sbd *sdp, struct page *page); -extern void gfs2_log_flush_bio(struct gfs2_sbd *sdp, int rw); +extern void gfs2_log_flush_bio(struct gfs2_sbd *sdp, int op, int op_flags); extern void gfs2_pin(struct gfs2_sbd *sdp, struct buffer_head *bh); static inline unsigned int buf_limit(struct gfs2_sbd *sdp) diff --git a/fs/gfs2/meta_io.c b/fs/gfs2/meta_io.c index f56f3ca..55ae188 100644 --- a/fs/gfs2/meta_io.c +++ b/fs/gfs2/meta_io.c @@ -213,7 +213,8 @@ static void gfs2_meta_read_endio(struct bio *bio) * Submit several consecutive buffer head I/O requests as a single bio I/O * request. (See submit_bh_wbc.) */ -static void gfs2_submit_bhs(int rw, struct buffer_head *bhs[], int num) +static void gfs2_submit_bhs(int op, int op_flags, struct buffer_head *bhs[], + int num) { struct buffer_head *bh = bhs[0]; struct bio *bio; @@ -230,7 +231,8 @@ static void gfs2_submit_bhs(int rw, struct buffer_head *bhs[], int num) bio_add_page(bio, bh->b_page, bh->b_size, bh_offset(bh)); } bio->bi_end_io = gfs2_meta_read_endio; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; submit_bio(bio); } @@ -281,7 +283,7 @@ int gfs2_meta_read(struct gfs2_glock *gl, u64 blkno, int flags, } } - gfs2_submit_bhs(READ_SYNC | REQ_META | REQ_PRIO, bhs, num); + gfs2_submit_bhs(REQ_OP_READ, READ_SYNC | REQ_META | REQ_PRIO, bhs, num); if (!(flags & DIO_WAIT)) return 0; diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index 141b560..fda3e71 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c @@ -246,6 +246,7 @@ static int gfs2_read_super(struct gfs2_sbd *sdp, sector_t sector, int silent) bio->bi_end_io = end_bio_io_page; bio->bi_private = page; + bio->bi_op = REQ_OP_READ; bio->bi_rw = READ_SYNC | REQ_META; submit_bio(bio); wait_on_page_locked(page); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:16:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9046A7CED for ; Fri, 15 Apr 2016 14:16:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 631A5304032 for ; Fri, 15 Apr 2016 12:16:53 -0700 (PDT) X-ASG-Debug-ID: 1460747811-04cbb02e1c3163a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id tPTESVd8HjP2WYty (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:16:52 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A8D7113A5F; Fri, 15 Apr 2016 19:16:51 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhd007872; Fri, 15 Apr 2016 15:16:49 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 13/42] xfs: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 14:15:48 -0500 X-ASG-Orig-Subj: [PATCH 13/42] xfs: set bi_op to REQ_OP Message-Id: <1460747777-8479-14-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747812 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has xfs use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke Acked-by: Dave Chinner --- fs/xfs/xfs_aops.c | 3 +-- fs/xfs/xfs_buf.c | 27 +++++++++++++++------------ 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 5852c5a..6c20336 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -439,10 +439,9 @@ xfs_submit_ioend( ioend->io_bio->bi_private = ioend; ioend->io_bio->bi_end_io = xfs_end_bio; + ioend->io_bio->bi_op = REQ_OP_WRITE; if (wbc->sync_mode) ioend->io_bio->bi_rw = WRITE_SYNC; - else - ioend->io_bio->bi_rw = WRITE; /* * If we are failing the IO now, just mark the ioend with an * error and finish it. This will run IO completion immediately diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 079bb77..917774e 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1131,7 +1131,8 @@ xfs_buf_ioapply_map( int map, int *buf_offset, int *count, - int rw) + int op, + int op_flags) { int page_index; int total_nr_pages = bp->b_page_count; @@ -1170,7 +1171,8 @@ next_chunk: bio->bi_iter.bi_sector = sector; bio->bi_end_io = xfs_buf_bio_end_io; bio->bi_private = bp; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; for (; size && nr_pages; nr_pages--, page_index++) { int rbytes, nbytes = PAGE_SIZE - offset; @@ -1214,7 +1216,8 @@ _xfs_buf_ioapply( struct xfs_buf *bp) { struct blk_plug plug; - int rw; + int op; + int op_flags = 0; int offset; int size; int i; @@ -1233,14 +1236,13 @@ _xfs_buf_ioapply( bp->b_ioend_wq = bp->b_target->bt_mount->m_buf_workqueue; if (bp->b_flags & XBF_WRITE) { + op = REQ_OP_WRITE; if (bp->b_flags & XBF_SYNCIO) - rw = WRITE_SYNC; - else - rw = WRITE; + op_flags = WRITE_SYNC; if (bp->b_flags & XBF_FUA) - rw |= REQ_FUA; + op_flags |= REQ_FUA; if (bp->b_flags & XBF_FLUSH) - rw |= REQ_FLUSH; + op_flags |= REQ_FLUSH; /* * Run the write verifier callback function if it exists. If @@ -1270,13 +1272,14 @@ _xfs_buf_ioapply( } } } else if (bp->b_flags & XBF_READ_AHEAD) { - rw = READA; + op = REQ_OP_READ; + op_flags = REQ_RAHEAD; } else { - rw = READ; + op = REQ_OP_READ; } /* we only use the buffer cache for meta-data */ - rw |= REQ_META; + op_flags |= REQ_META; /* * Walk all the vectors issuing IO on them. Set up the initial offset @@ -1288,7 +1291,7 @@ _xfs_buf_ioapply( size = BBTOB(bp->b_io_length); blk_start_plug(&plug); for (i = 0; i < bp->b_map_count; i++) { - xfs_buf_ioapply_map(bp, i, &offset, &size, rw); + xfs_buf_ioapply_map(bp, i, &offset, &size, op, op_flags); if (bp->b_error) break; if (size <= 0) -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:16:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E93D87CE4 for ; Fri, 15 Apr 2016 14:16:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id BCE8A304032 for ; Fri, 15 Apr 2016 12:16:55 -0700 (PDT) X-ASG-Debug-ID: 1460747814-04cb6c2460641130001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id zLEXf6Gl97aIrtgk (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:16:54 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id F322C8F50A; Fri, 15 Apr 2016 19:16:53 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhe007872; Fri, 15 Apr 2016 15:16:51 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 14/42] hfsplus: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 14:15:49 -0500 X-ASG-Orig-Subj: [PATCH 14/42] hfsplus: set bi_op to REQ_OP Message-Id: <1460747777-8479-15-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747814 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has hfsplus use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- fs/hfsplus/hfsplus_fs.h | 2 +- fs/hfsplus/part_tbl.c | 5 +++-- fs/hfsplus/super.c | 6 ++++-- fs/hfsplus/wrapper.c | 15 +++++++++------ 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/fs/hfsplus/hfsplus_fs.h b/fs/hfsplus/hfsplus_fs.h index f91a1fa..80154aa 100644 --- a/fs/hfsplus/hfsplus_fs.h +++ b/fs/hfsplus/hfsplus_fs.h @@ -525,7 +525,7 @@ int hfsplus_compare_dentry(const struct dentry *parent, /* wrapper.c */ int hfsplus_submit_bio(struct super_block *sb, sector_t sector, void *buf, - void **data, int rw); + void **data, int op, int op_flags); int hfsplus_read_wrapper(struct super_block *sb); /* time macros */ diff --git a/fs/hfsplus/part_tbl.c b/fs/hfsplus/part_tbl.c index eb355d8..63164eb 100644 --- a/fs/hfsplus/part_tbl.c +++ b/fs/hfsplus/part_tbl.c @@ -112,7 +112,8 @@ static int hfs_parse_new_pmap(struct super_block *sb, void *buf, if ((u8 *)pm - (u8 *)buf >= buf_size) { res = hfsplus_submit_bio(sb, *part_start + HFS_PMAP_BLK + i, - buf, (void **)&pm, READ); + buf, (void **)&pm, REQ_OP_READ, + 0); if (res) return res; } @@ -136,7 +137,7 @@ int hfs_part_find(struct super_block *sb, return -ENOMEM; res = hfsplus_submit_bio(sb, *part_start + HFS_PMAP_BLK, - buf, &data, READ); + buf, &data, REQ_OP_READ, 0); if (res) goto out; diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c index c359113..d3646c2 100644 --- a/fs/hfsplus/super.c +++ b/fs/hfsplus/super.c @@ -219,7 +219,8 @@ static int hfsplus_sync_fs(struct super_block *sb, int wait) error2 = hfsplus_submit_bio(sb, sbi->part_start + HFSPLUS_VOLHEAD_SECTOR, - sbi->s_vhdr_buf, NULL, WRITE_SYNC); + sbi->s_vhdr_buf, NULL, REQ_OP_WRITE, + WRITE_SYNC); if (!error) error = error2; if (!write_backup) @@ -227,7 +228,8 @@ static int hfsplus_sync_fs(struct super_block *sb, int wait) error2 = hfsplus_submit_bio(sb, sbi->part_start + sbi->sect_count - 2, - sbi->s_backup_vhdr_buf, NULL, WRITE_SYNC); + sbi->s_backup_vhdr_buf, NULL, REQ_OP_WRITE, + WRITE_SYNC); if (!error) error2 = error; out: diff --git a/fs/hfsplus/wrapper.c b/fs/hfsplus/wrapper.c index d026bb3..c5c916d 100644 --- a/fs/hfsplus/wrapper.c +++ b/fs/hfsplus/wrapper.c @@ -30,7 +30,8 @@ struct hfsplus_wd { * @sector: block to read or write, for blocks of HFSPLUS_SECTOR_SIZE bytes * @buf: buffer for I/O * @data: output pointer for location of requested data - * @rw: direction of I/O + * @op: direction of I/O + * @op_flags: request op flags * * The unit of I/O is hfsplus_min_io_size(sb), which may be bigger than * HFSPLUS_SECTOR_SIZE, and @buf must be sized accordingly. On reads @@ -44,7 +45,7 @@ struct hfsplus_wd { * will work correctly. */ int hfsplus_submit_bio(struct super_block *sb, sector_t sector, - void *buf, void **data, int rw) + void *buf, void **data, int op, int op_flags) { struct bio *bio; int ret = 0; @@ -65,9 +66,10 @@ int hfsplus_submit_bio(struct super_block *sb, sector_t sector, bio = bio_alloc(GFP_NOIO, 1); bio->bi_iter.bi_sector = sector; bio->bi_bdev = sb->s_bdev; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; - if (!(rw & WRITE) && data) + if (op != WRITE && data) *data = (u8 *)buf + offset; while (io_size > 0) { @@ -182,7 +184,7 @@ int hfsplus_read_wrapper(struct super_block *sb) reread: error = hfsplus_submit_bio(sb, part_start + HFSPLUS_VOLHEAD_SECTOR, sbi->s_vhdr_buf, (void **)&sbi->s_vhdr, - READ); + REQ_OP_READ, 0); if (error) goto out_free_backup_vhdr; @@ -214,7 +216,8 @@ reread: error = hfsplus_submit_bio(sb, part_start + part_size - 2, sbi->s_backup_vhdr_buf, - (void **)&sbi->s_backup_vhdr, READ); + (void **)&sbi->s_backup_vhdr, REQ_OP_READ, + 0); if (error) goto out_free_backup_vhdr; -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:16:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B69AF7CC5 for ; Fri, 15 Apr 2016 14:16:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 848E78F8033 for ; Fri, 15 Apr 2016 12:16:59 -0700 (PDT) X-ASG-Debug-ID: 1460747816-04cb6c2464641160001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id edIL6bxC910PsXDu (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:16:56 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4403781125; Fri, 15 Apr 2016 19:16:56 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhf007872; Fri, 15 Apr 2016 15:16:54 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 15/42] mpage: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 14:15:50 -0500 X-ASG-Orig-Subj: [PATCH 15/42] mpage: set bi_op to REQ_OP Message-Id: <1460747777-8479-16-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747816 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has mpage.c use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- fs/mpage.c | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/fs/mpage.c b/fs/mpage.c index 2c251ec..89f58f1 100644 --- a/fs/mpage.c +++ b/fs/mpage.c @@ -56,11 +56,12 @@ static void mpage_end_io(struct bio *bio) bio_put(bio); } -static struct bio *mpage_bio_submit(int rw, struct bio *bio) +static struct bio *mpage_bio_submit(int op, int op_flags, struct bio *bio) { bio->bi_end_io = mpage_end_io; - bio->bi_rw = rw; - guard_bio_eod(rw, bio); + bio->bi_op = op; + bio->bi_rw = op_flags; + guard_bio_eod(op, bio); submit_bio(bio); return NULL; } @@ -270,7 +271,7 @@ do_mpage_readpage(struct bio *bio, struct page *page, unsigned nr_pages, * This page will go to BIO. Do we need to send this BIO off first? */ if (bio && (*last_block_in_bio != blocks[0] - 1)) - bio = mpage_bio_submit(READ, bio); + bio = mpage_bio_submit(REQ_OP_READ, 0, bio); alloc_new: if (bio == NULL) { @@ -287,7 +288,7 @@ alloc_new: length = first_hole << blkbits; if (bio_add_page(bio, page, length, 0) < length) { - bio = mpage_bio_submit(READ, bio); + bio = mpage_bio_submit(REQ_OP_READ, 0, bio); goto alloc_new; } @@ -295,7 +296,7 @@ alloc_new: nblocks = map_bh->b_size >> blkbits; if ((buffer_boundary(map_bh) && relative_block == nblocks) || (first_hole != blocks_per_page)) - bio = mpage_bio_submit(READ, bio); + bio = mpage_bio_submit(REQ_OP_READ, 0, bio); else *last_block_in_bio = blocks[blocks_per_page - 1]; out: @@ -303,7 +304,7 @@ out: confused: if (bio) - bio = mpage_bio_submit(READ, bio); + bio = mpage_bio_submit(REQ_OP_READ, 0, bio); if (!PageUptodate(page)) block_read_full_page(page, get_block); else @@ -385,7 +386,7 @@ mpage_readpages(struct address_space *mapping, struct list_head *pages, } BUG_ON(!list_empty(pages)); if (bio) - mpage_bio_submit(READ, bio); + mpage_bio_submit(REQ_OP_READ, 0, bio); return 0; } EXPORT_SYMBOL(mpage_readpages); @@ -406,7 +407,7 @@ int mpage_readpage(struct page *page, get_block_t get_block) bio = do_mpage_readpage(bio, page, 1, &last_block_in_bio, &map_bh, &first_logical_block, get_block, gfp); if (bio) - mpage_bio_submit(READ, bio); + mpage_bio_submit(REQ_OP_READ, 0, bio); return 0; } EXPORT_SYMBOL(mpage_readpage); @@ -487,7 +488,7 @@ static int __mpage_writepage(struct page *page, struct writeback_control *wbc, struct buffer_head map_bh; loff_t i_size = i_size_read(inode); int ret = 0; - int wr = (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE); + int op_flags = (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : 0); if (page_has_buffers(page)) { struct buffer_head *head = page_buffers(page); @@ -596,7 +597,7 @@ page_is_mapped: * This page will go to BIO. Do we need to send this BIO off first? */ if (bio && mpd->last_block_in_bio != blocks[0] - 1) - bio = mpage_bio_submit(wr, bio); + bio = mpage_bio_submit(REQ_OP_WRITE, op_flags, bio); alloc_new: if (bio == NULL) { @@ -623,7 +624,7 @@ alloc_new: wbc_account_io(wbc, page, PAGE_SIZE); length = first_unmapped << blkbits; if (bio_add_page(bio, page, length, 0) < length) { - bio = mpage_bio_submit(wr, bio); + bio = mpage_bio_submit(REQ_OP_WRITE, op_flags, bio); goto alloc_new; } @@ -633,7 +634,7 @@ alloc_new: set_page_writeback(page); unlock_page(page); if (boundary || (first_unmapped != blocks_per_page)) { - bio = mpage_bio_submit(wr, bio); + bio = mpage_bio_submit(REQ_OP_WRITE, op_flags, bio); if (boundary_block) { write_boundary_block(boundary_bdev, boundary_block, 1 << blkbits); @@ -645,7 +646,7 @@ alloc_new: confused: if (bio) - bio = mpage_bio_submit(wr, bio); + bio = mpage_bio_submit(REQ_OP_WRITE, op_flags, bio); if (mpd->use_writepage) { ret = mapping->a_ops->writepage(page, wbc); @@ -702,9 +703,9 @@ mpage_writepages(struct address_space *mapping, ret = write_cache_pages(mapping, wbc, __mpage_writepage, &mpd); if (mpd.bio) { - int wr = (wbc->sync_mode == WB_SYNC_ALL ? - WRITE_SYNC : WRITE); - mpage_bio_submit(wr, mpd.bio); + int op_flags = (wbc->sync_mode == WB_SYNC_ALL ? + WRITE_SYNC : 0); + mpage_bio_submit(REQ_OP_WRITE, op_flags, mpd.bio); } } blk_finish_plug(&plug); @@ -723,9 +724,9 @@ int mpage_writepage(struct page *page, get_block_t get_block, }; int ret = __mpage_writepage(page, wbc, &mpd); if (mpd.bio) { - int wr = (wbc->sync_mode == WB_SYNC_ALL ? - WRITE_SYNC : WRITE); - mpage_bio_submit(wr, mpd.bio); + int op_flags = (wbc->sync_mode == WB_SYNC_ALL ? + WRITE_SYNC : 0); + mpage_bio_submit(REQ_OP_WRITE, op_flags, mpd.bio); } return ret; } -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:17:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6B8E17CF7 for ; Fri, 15 Apr 2016 14:17:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 225968F8037 for ; Fri, 15 Apr 2016 12:17:00 -0700 (PDT) X-ASG-Debug-ID: 1460747818-04bdf01104610610001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id CCcvTfIFJ6qEo4Mt (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:16:58 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 90D8EC0467E4; Fri, 15 Apr 2016 19:16:58 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhg007872; Fri, 15 Apr 2016 15:16:56 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 16/42] nilfs: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 14:15:51 -0500 X-ASG-Orig-Subj: [PATCH 16/42] nilfs: set bi_op to REQ_OP Message-Id: <1460747777-8479-17-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747818 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has nilfs use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- fs/nilfs2/segbuf.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/fs/nilfs2/segbuf.c b/fs/nilfs2/segbuf.c index 7666f1d..7b13e14 100644 --- a/fs/nilfs2/segbuf.c +++ b/fs/nilfs2/segbuf.c @@ -350,7 +350,8 @@ static void nilfs_end_bio_write(struct bio *bio) } static int nilfs_segbuf_submit_bio(struct nilfs_segment_buffer *segbuf, - struct nilfs_write_info *wi, int mode) + struct nilfs_write_info *wi, int mode, + int mode_flags) { struct bio *bio = wi->bio; int err; @@ -368,7 +369,8 @@ static int nilfs_segbuf_submit_bio(struct nilfs_segment_buffer *segbuf, bio->bi_end_io = nilfs_end_bio_write; bio->bi_private = segbuf; - bio->bi_rw = mode; + bio->bi_op = mode; + bio->bi_rw = mode_flags; submit_bio(bio); segbuf->sb_nbio++; @@ -442,7 +444,7 @@ static int nilfs_segbuf_submit_bh(struct nilfs_segment_buffer *segbuf, return 0; } /* bio is FULL */ - err = nilfs_segbuf_submit_bio(segbuf, wi, mode); + err = nilfs_segbuf_submit_bio(segbuf, wi, mode, 0); /* never submit current bh */ if (likely(!err)) goto repeat; @@ -466,19 +468,19 @@ static int nilfs_segbuf_write(struct nilfs_segment_buffer *segbuf, { struct nilfs_write_info wi; struct buffer_head *bh; - int res = 0, rw = WRITE; + int res = 0; wi.nilfs = nilfs; nilfs_segbuf_prepare_write(segbuf, &wi); list_for_each_entry(bh, &segbuf->sb_segsum_buffers, b_assoc_buffers) { - res = nilfs_segbuf_submit_bh(segbuf, &wi, bh, rw); + res = nilfs_segbuf_submit_bh(segbuf, &wi, bh, REQ_OP_WRITE); if (unlikely(res)) goto failed_bio; } list_for_each_entry(bh, &segbuf->sb_payload_buffers, b_assoc_buffers) { - res = nilfs_segbuf_submit_bh(segbuf, &wi, bh, rw); + res = nilfs_segbuf_submit_bh(segbuf, &wi, bh, REQ_OP_WRITE); if (unlikely(res)) goto failed_bio; } @@ -488,8 +490,8 @@ static int nilfs_segbuf_write(struct nilfs_segment_buffer *segbuf, * Last BIO is always sent through the following * submission. */ - rw |= REQ_SYNC; - res = nilfs_segbuf_submit_bio(segbuf, &wi, rw); + res = nilfs_segbuf_submit_bio(segbuf, &wi, REQ_OP_WRITE, + REQ_SYNC); } failed_bio: -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:17:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E78EA7D01 for ; Fri, 15 Apr 2016 14:17:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 29E8AAC002 for ; Fri, 15 Apr 2016 12:17:02 -0700 (PDT) X-ASG-Debug-ID: 1460747821-04bdf01103610630001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id iDP2wSj18ymv8fpD (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:01 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E37827F0BC; Fri, 15 Apr 2016 19:17:00 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhh007872; Fri, 15 Apr 2016 15:16:58 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 17/42] ocfs2: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 14:15:52 -0500 X-ASG-Orig-Subj: [PATCH 17/42] ocfs2: set bi_op to REQ_OP Message-Id: <1460747777-8479-18-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747821 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has ocfs2 use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- fs/ocfs2/cluster/heartbeat.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c index e37373d..0619a20 100644 --- a/fs/ocfs2/cluster/heartbeat.c +++ b/fs/ocfs2/cluster/heartbeat.c @@ -530,7 +530,8 @@ static void o2hb_bio_end_io(struct bio *bio) static struct bio *o2hb_setup_one_bio(struct o2hb_region *reg, struct o2hb_bio_wait_ctxt *wc, unsigned int *current_slot, - unsigned int max_slots, int rw) + unsigned int max_slots, int op, + int op_flags) { int len, current_page; unsigned int vec_len, vec_start; @@ -556,7 +557,8 @@ static struct bio *o2hb_setup_one_bio(struct o2hb_region *reg, bio->bi_bdev = reg->hr_bdev; bio->bi_private = wc; bio->bi_end_io = o2hb_bio_end_io; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; vec_start = (cs << bits) % PAGE_SIZE; while(cs < max_slots) { @@ -593,7 +595,7 @@ static int o2hb_read_slots(struct o2hb_region *reg, while(current_slot < max_slots) { bio = o2hb_setup_one_bio(reg, &wc, ¤t_slot, max_slots, - READ); + REQ_OP_READ, 0); if (IS_ERR(bio)) { status = PTR_ERR(bio); mlog_errno(status); @@ -625,7 +627,8 @@ static int o2hb_issue_node_write(struct o2hb_region *reg, slot = o2nm_this_node(); - bio = o2hb_setup_one_bio(reg, write_wc, &slot, slot+1, WRITE_SYNC); + bio = o2hb_setup_one_bio(reg, write_wc, &slot, slot+1, REQ_OP_WRITE, + WRITE_SYNC); if (IS_ERR(bio)) { status = PTR_ERR(bio); mlog_errno(status); -- 2.7.2 From toshi.kani@hpe.com Fri Apr 15 14:17:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8D03A7D01 for ; Fri, 15 Apr 2016 14:17:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E9061AC001 for ; Fri, 15 Apr 2016 12:17:03 -0700 (PDT) X-ASG-Debug-ID: 1460747822-04cb6c24626411a0001-NocioJ Received: from g4t3426.houston.hp.com (g4t3426.houston.hp.com [15.201.208.54]) by cuda.sgi.com with ESMTP id NZhtVQZpMFm1uyLl (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:02 -0700 (PDT) X-Barracuda-Envelope-From: toshi.kani@hpe.com X-Barracuda-Apparent-Source-IP: 15.201.208.54 Received: from g4t3433.houston.hp.com (g4t3433.houston.hp.com [16.210.25.219]) by g4t3426.houston.hp.com (Postfix) with ESMTP id 6853F4B; Fri, 15 Apr 2016 19:17:01 +0000 (UTC) Received: from misato.fc.hp.com (misato.fc.hp.com [16.78.168.61]) by g4t3433.houston.hp.com (Postfix) with ESMTP id C425146; Fri, 15 Apr 2016 19:16:59 +0000 (UTC) Message-ID: <1460747308.4597.9.camel@hpe.com> Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io From: Toshi Kani X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io To: Dan Williams , Jeff Moyer Cc: "axboe@fb.com" , "jack@suse.cz" , "david@fromorbit.com" , "linux-kernel@vger.kernel.org" , "xfs@oss.sgi.com" , "hch@infradead.org" , "linux-mm@kvack.org" , "linux-block@vger.kernel.org" , "viro@zeniv.linux.org.uk" , "linux-nvdimm@ml01.01.org" , "linux-fsdevel@vger.kernel.org" , "akpm@linux-foundation.org" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" Date: Fri, 15 Apr 2016 13:08:28 -0600 In-Reply-To: <1460746909.4597.7.camel@hpe.com> References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <1460739288.3012.3.camel@intel.com> <1460741821.3012.11.camel@intel.com> <1460746909.4597.7.camel@hpe.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.18.5.2 (3.18.5.2-1.fc23) Mime-Version: 1.0 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: g4t3426.houston.hp.com[15.201.208.54] X-Barracuda-Start-Time: 1460747822 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28767 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, 2016-04-15 at 13:01 -0600, Toshi Kani wrote: > On Fri, 2016-04-15 at 11:17 -0700, Dan Williams wrote: > > > > On Fri, Apr 15, 2016 at 11:06 AM, Jeff Moyer wrote: > > > > > > Dan Williams writes: > > >   > > > > > > There's a lot of special casing here, so you might consider > > > > > > adding comments. > > > > > Correct - maybe we should reconsider wrapper-izing this? :) > > > > Another option is just to skip dax_do_io() and this special casing > > > > fallback entirely if errors are present.  I.e. only attempt > > > > dax_do_io when: IS_DAX() && gendisk->bb && bb->count == 0. > > > > > > So, if there's an error anywhere on the device, penalize all I/O (not > > > just writes, and not just on sectors that are bad)?  I'm not sure > > > that's a great plan, either. > > > > > If errors are rare how much are we actually losing in practice? > > Moreover, we're going to do the full badblocks lookup anyway when we > > call ->direct_access().  If we had that information earlier we can > > avoid this fallback dance. > > A system running with DAX may have active data set in NVDIMM lager than > RAM size.  In this case, falling back to non-DAX will allocate page cache > for the data, which will saturate the system with memory pressure. Oh, sorry, we are still in DIO path.  Falling back to DIO should not cause this issue. -Toshi From mchristi@redhat.com Fri Apr 15 14:17:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0606B7D01 for ; Fri, 15 Apr 2016 14:17:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id AF321304048 for ; Fri, 15 Apr 2016 12:17:04 -0700 (PDT) X-ASG-Debug-ID: 1460747823-04bdf01103610650001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wYfvgmYapGvH9MGq (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:03 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 21F6F62655; Fri, 15 Apr 2016 19:17:03 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhi007872; Fri, 15 Apr 2016 15:17:00 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 18/42] pm: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 14:15:53 -0500 X-ASG-Orig-Subj: [PATCH 18/42] pm: set bi_op to REQ_OP Message-Id: <1460747777-8479-19-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Fri, 15 Apr 2016 19:17:03 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460747823 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has the pm code use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- kernel/power/swap.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/kernel/power/swap.c b/kernel/power/swap.c index 4d050eb..adbcb1b 100644 --- a/kernel/power/swap.c +++ b/kernel/power/swap.c @@ -250,7 +250,7 @@ static void hib_end_io(struct bio *bio) bio_put(bio); } -static int hib_submit_io(int rw, pgoff_t page_off, void *addr, +static int hib_submit_io(int op, int op_flags, pgoff_t page_off, void *addr, struct hib_bio_batch *hb) { struct page *page = virt_to_page(addr); @@ -260,7 +260,8 @@ static int hib_submit_io(int rw, pgoff_t page_off, void *addr, bio = bio_alloc(__GFP_RECLAIM | __GFP_HIGH, 1); bio->bi_iter.bi_sector = page_off * (PAGE_SIZE >> 9); bio->bi_bdev = hib_resume_bdev; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) { printk(KERN_ERR "PM: Adding page to bio failed at %llu\n", @@ -296,7 +297,8 @@ static int mark_swapfiles(struct swap_map_handle *handle, unsigned int flags) { int error; - hib_submit_io(READ_SYNC, swsusp_resume_block, swsusp_header, NULL); + hib_submit_io(REQ_OP_READ, READ_SYNC, swsusp_resume_block, + swsusp_header, NULL); if (!memcmp("SWAP-SPACE",swsusp_header->sig, 10) || !memcmp("SWAPSPACE2",swsusp_header->sig, 10)) { memcpy(swsusp_header->orig_sig,swsusp_header->sig, 10); @@ -305,8 +307,8 @@ static int mark_swapfiles(struct swap_map_handle *handle, unsigned int flags) swsusp_header->flags = flags; if (flags & SF_CRC32_MODE) swsusp_header->crc32 = handle->crc32; - error = hib_submit_io(WRITE_SYNC, swsusp_resume_block, - swsusp_header, NULL); + error = hib_submit_io(REQ_OP_WRITE, WRITE_SYNC, + swsusp_resume_block, swsusp_header, NULL); } else { printk(KERN_ERR "PM: Swap header not found!\n"); error = -ENODEV; @@ -379,7 +381,7 @@ static int write_page(void *buf, sector_t offset, struct hib_bio_batch *hb) } else { src = buf; } - return hib_submit_io(WRITE_SYNC, offset, src, hb); + return hib_submit_io(REQ_OP_WRITE, WRITE_SYNC, offset, src, hb); } static void release_swap_writer(struct swap_map_handle *handle) @@ -982,7 +984,8 @@ static int get_swap_reader(struct swap_map_handle *handle, return -ENOMEM; } - error = hib_submit_io(READ_SYNC, offset, tmp->map, NULL); + error = hib_submit_io(REQ_OP_READ, READ_SYNC, offset, + tmp->map, NULL); if (error) { release_swap_reader(handle); return error; @@ -1006,7 +1009,7 @@ static int swap_read_page(struct swap_map_handle *handle, void *buf, offset = handle->cur->entries[handle->k]; if (!offset) return -EFAULT; - error = hib_submit_io(READ_SYNC, offset, buf, hb); + error = hib_submit_io(REQ_OP_READ, READ_SYNC, offset, buf, hb); if (error) return error; if (++handle->k >= MAP_PAGE_ENTRIES) { @@ -1508,7 +1511,8 @@ int swsusp_check(void) if (!IS_ERR(hib_resume_bdev)) { set_blocksize(hib_resume_bdev, PAGE_SIZE); clear_page(swsusp_header); - error = hib_submit_io(READ_SYNC, swsusp_resume_block, + error = hib_submit_io(REQ_OP_READ, READ_SYNC, + swsusp_resume_block, swsusp_header, NULL); if (error) goto put; @@ -1516,7 +1520,8 @@ int swsusp_check(void) if (!memcmp(HIBERNATE_SIG, swsusp_header->sig, 10)) { memcpy(swsusp_header->sig, swsusp_header->orig_sig, 10); /* Reset swap signature now */ - error = hib_submit_io(WRITE_SYNC, swsusp_resume_block, + error = hib_submit_io(REQ_OP_WRITE, WRITE_SYNC, + swsusp_resume_block, swsusp_header, NULL); } else { error = -EINVAL; @@ -1560,10 +1565,12 @@ int swsusp_unmark(void) { int error; - hib_submit_io(READ_SYNC, swsusp_resume_block, swsusp_header, NULL); + hib_submit_io(REQ_OP_READ, READ_SYNC, swsusp_resume_block, + swsusp_header, NULL); if (!memcmp(HIBERNATE_SIG,swsusp_header->sig, 10)) { memcpy(swsusp_header->sig,swsusp_header->orig_sig, 10); - error = hib_submit_io(WRITE_SYNC, swsusp_resume_block, + error = hib_submit_io(REQ_OP_WRITE, WRITE_SYNC, + swsusp_resume_block, swsusp_header, NULL); } else { printk(KERN_ERR "PM: Cannot find swsusp signature!\n"); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:17:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5BBF47D0B for ; Fri, 15 Apr 2016 14:17:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2B9DA304032 for ; Fri, 15 Apr 2016 12:17:08 -0700 (PDT) X-ASG-Debug-ID: 1460747825-04cb6c245f6411b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 1mDCKUx7bLvDz2d4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:06 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 671DD15553; Fri, 15 Apr 2016 19:17:05 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhj007872; Fri, 15 Apr 2016 15:17:03 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 19/42] dm: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 14:15:54 -0500 X-ASG-Orig-Subj: [PATCH 19/42] dm: set bi_op to REQ_OP Message-Id: <1460747777-8479-20-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747825 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has dm use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/md/dm-bufio.c | 8 +++--- drivers/md/dm-crypt.c | 1 + drivers/md/dm-io.c | 57 ++++++++++++++++++++++------------------- drivers/md/dm-kcopyd.c | 25 +++++++++--------- drivers/md/dm-log-writes.c | 6 ++--- drivers/md/dm-log.c | 5 ++-- drivers/md/dm-raid1.c | 11 +++++--- drivers/md/dm-snap-persistent.c | 24 +++++++++-------- drivers/md/dm-thin.c | 7 ++--- drivers/md/dm.c | 1 + include/linux/dm-io.h | 3 ++- 11 files changed, 82 insertions(+), 66 deletions(-) diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c index 9d3ee7f..b6055f2 100644 --- a/drivers/md/dm-bufio.c +++ b/drivers/md/dm-bufio.c @@ -574,7 +574,8 @@ static void use_dmio(struct dm_buffer *b, int rw, sector_t block, { int r; struct dm_io_request io_req = { - .bi_rw = rw, + .bi_op = rw, + .bi_op_flags = 0, .notify.fn = dmio_complete, .notify.context = b, .client = b->c->dm_io, @@ -634,7 +635,7 @@ static void use_inline_bio(struct dm_buffer *b, int rw, sector_t block, * the dm_buffer's inline bio is local to bufio. */ b->bio.bi_private = end_io; - b->bio.bi_rw = rw; + b->bio.bi_op = rw; /* * We assume that if len >= PAGE_SIZE ptr is page-aligned. @@ -1327,7 +1328,8 @@ EXPORT_SYMBOL_GPL(dm_bufio_write_dirty_buffers); int dm_bufio_issue_flush(struct dm_bufio_client *c) { struct dm_io_request io_req = { - .bi_rw = WRITE_FLUSH, + .bi_op = REQ_OP_WRITE, + .bi_op_flags = WRITE_FLUSH, .mem.type = DM_IO_KMEM, .mem.ptr.addr = NULL, .client = c->dm_io, diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index 4f3cb35..70fbf11 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c @@ -1136,6 +1136,7 @@ static void clone_init(struct dm_crypt_io *io, struct bio *clone) clone->bi_private = io; clone->bi_end_io = crypt_endio; clone->bi_bdev = cc->dev->bdev; + clone->bi_op = io->base_bio->bi_op; clone->bi_rw = io->base_bio->bi_rw; } diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c index 50f17e3..0f723ca 100644 --- a/drivers/md/dm-io.c +++ b/drivers/md/dm-io.c @@ -278,8 +278,9 @@ static void km_dp_init(struct dpages *dp, void *data) /*----------------------------------------------------------------- * IO routines that accept a list of pages. *---------------------------------------------------------------*/ -static void do_region(int rw, unsigned region, struct dm_io_region *where, - struct dpages *dp, struct io *io) +static void do_region(int op, int op_flags, unsigned region, + struct dm_io_region *where, struct dpages *dp, + struct io *io) { struct bio *bio; struct page *page; @@ -295,24 +296,25 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, /* * Reject unsupported discard and write same requests. */ - if (rw & REQ_DISCARD) + if (op == REQ_OP_DISCARD) special_cmd_max_sectors = q->limits.max_discard_sectors; - else if (rw & REQ_WRITE_SAME) + else if (op == REQ_OP_WRITE_SAME) special_cmd_max_sectors = q->limits.max_write_same_sectors; - if ((rw & (REQ_DISCARD | REQ_WRITE_SAME)) && special_cmd_max_sectors == 0) { + if ((op == REQ_OP_DISCARD || op == REQ_OP_WRITE_SAME) && + special_cmd_max_sectors == 0) { dec_count(io, region, -EOPNOTSUPP); return; } /* - * where->count may be zero if rw holds a flush and we need to + * where->count may be zero if op holds a flush and we need to * send a zero-sized flush. */ do { /* * Allocate a suitably sized-bio. */ - if ((rw & REQ_DISCARD) || (rw & REQ_WRITE_SAME)) + if ((op == REQ_OP_DISCARD) || (op == REQ_OP_WRITE_SAME)) num_bvecs = 1; else num_bvecs = min_t(int, BIO_MAX_PAGES, @@ -322,14 +324,15 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, bio->bi_iter.bi_sector = where->sector + (where->count - remaining); bio->bi_bdev = where->bdev; bio->bi_end_io = endio; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; store_io_and_region_in_bio(bio, io, region); - if (rw & REQ_DISCARD) { + if (op == REQ_OP_DISCARD) { num_sectors = min_t(sector_t, special_cmd_max_sectors, remaining); bio->bi_iter.bi_size = num_sectors << SECTOR_SHIFT; remaining -= num_sectors; - } else if (rw & REQ_WRITE_SAME) { + } else if (op == REQ_OP_WRITE_SAME) { /* * WRITE SAME only uses a single page. */ @@ -360,7 +363,7 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, } while (remaining); } -static void dispatch_io(int rw, unsigned int num_regions, +static void dispatch_io(int op, int op_flags, unsigned int num_regions, struct dm_io_region *where, struct dpages *dp, struct io *io, int sync) { @@ -370,7 +373,7 @@ static void dispatch_io(int rw, unsigned int num_regions, BUG_ON(num_regions > DM_IO_MAX_REGIONS); if (sync) - rw |= REQ_SYNC; + op_flags |= REQ_SYNC; /* * For multiple regions we need to be careful to rewind @@ -378,8 +381,8 @@ static void dispatch_io(int rw, unsigned int num_regions, */ for (i = 0; i < num_regions; i++) { *dp = old_pages; - if (where[i].count || (rw & REQ_FLUSH)) - do_region(rw, i, where + i, dp, io); + if (where[i].count || (op_flags & REQ_FLUSH)) + do_region(op, op_flags, i, where + i, dp, io); } /* @@ -403,13 +406,13 @@ static void sync_io_complete(unsigned long error, void *context) } static int sync_io(struct dm_io_client *client, unsigned int num_regions, - struct dm_io_region *where, int rw, struct dpages *dp, - unsigned long *error_bits) + struct dm_io_region *where, int op, int op_flags, + struct dpages *dp, unsigned long *error_bits) { struct io *io; struct sync_io sio; - if (num_regions > 1 && (rw & RW_MASK) != WRITE) { + if (num_regions > 1 && !op_is_write(op)) { WARN_ON(1); return -EIO; } @@ -426,7 +429,7 @@ static int sync_io(struct dm_io_client *client, unsigned int num_regions, io->vma_invalidate_address = dp->vma_invalidate_address; io->vma_invalidate_size = dp->vma_invalidate_size; - dispatch_io(rw, num_regions, where, dp, io, 1); + dispatch_io(op, op_flags, num_regions, where, dp, io, 1); wait_for_completion_io(&sio.wait); @@ -437,12 +440,12 @@ static int sync_io(struct dm_io_client *client, unsigned int num_regions, } static int async_io(struct dm_io_client *client, unsigned int num_regions, - struct dm_io_region *where, int rw, struct dpages *dp, - io_notify_fn fn, void *context) + struct dm_io_region *where, int op, int op_flags, + struct dpages *dp, io_notify_fn fn, void *context) { struct io *io; - if (num_regions > 1 && (rw & RW_MASK) != WRITE) { + if (num_regions > 1 && !op_is_write(op)) { WARN_ON(1); fn(1, context); return -EIO; @@ -458,7 +461,7 @@ static int async_io(struct dm_io_client *client, unsigned int num_regions, io->vma_invalidate_address = dp->vma_invalidate_address; io->vma_invalidate_size = dp->vma_invalidate_size; - dispatch_io(rw, num_regions, where, dp, io, 0); + dispatch_io(op, op_flags, num_regions, where, dp, io, 0); return 0; } @@ -481,7 +484,7 @@ static int dp_init(struct dm_io_request *io_req, struct dpages *dp, case DM_IO_VMA: flush_kernel_vmap_range(io_req->mem.ptr.vma, size); - if ((io_req->bi_rw & RW_MASK) == READ) { + if (io_req->bi_op == REQ_OP_READ) { dp->vma_invalidate_address = io_req->mem.ptr.vma; dp->vma_invalidate_size = size; } @@ -519,10 +522,12 @@ int dm_io(struct dm_io_request *io_req, unsigned num_regions, if (!io_req->notify.fn) return sync_io(io_req->client, num_regions, where, - io_req->bi_rw, &dp, sync_error_bits); + io_req->bi_op, io_req->bi_op_flags, &dp, + sync_error_bits); - return async_io(io_req->client, num_regions, where, io_req->bi_rw, - &dp, io_req->notify.fn, io_req->notify.context); + return async_io(io_req->client, num_regions, where, io_req->bi_op, + io_req->bi_op_flags, &dp, io_req->notify.fn, + io_req->notify.context); } EXPORT_SYMBOL(dm_io); diff --git a/drivers/md/dm-kcopyd.c b/drivers/md/dm-kcopyd.c index 1452ed9..4182bc7d 100644 --- a/drivers/md/dm-kcopyd.c +++ b/drivers/md/dm-kcopyd.c @@ -465,10 +465,10 @@ static void complete_io(unsigned long error, void *context) io_job_finish(kc->throttle); if (error) { - if (job->rw & WRITE) - job->write_err |= error; - else + if (job->rw == READ) job->read_err = 1; + else + job->write_err |= error; if (!test_bit(DM_KCOPYD_IGNORE_ERROR, &job->flags)) { push(&kc->complete_jobs, job); @@ -477,13 +477,11 @@ static void complete_io(unsigned long error, void *context) } } - if (job->rw & WRITE) - push(&kc->complete_jobs, job); - - else { + if (job->rw == READ) { job->rw = WRITE; push(&kc->io_jobs, job); - } + } else + push(&kc->complete_jobs, job); wake(kc); } @@ -496,7 +494,8 @@ static int run_io_job(struct kcopyd_job *job) { int r; struct dm_io_request io_req = { - .bi_rw = job->rw, + .bi_op = job->rw, + .bi_op_flags = 0, .mem.type = DM_IO_PAGE_LIST, .mem.ptr.pl = job->pages, .mem.offset = 0, @@ -550,10 +549,10 @@ static int process_jobs(struct list_head *jobs, struct dm_kcopyd_client *kc, if (r < 0) { /* error this rogue job */ - if (job->rw & WRITE) - job->write_err = (unsigned long) -1L; - else + if (job->rw == READ) job->read_err = 1; + else + job->write_err = (unsigned long) -1L; push(&kc->complete_jobs, job); break; } @@ -734,7 +733,7 @@ int dm_kcopyd_copy(struct dm_kcopyd_client *kc, struct dm_io_region *from, /* * Use WRITE SAME to optimize zeroing if all dests support it. */ - job->rw = WRITE | REQ_WRITE_SAME; + job->rw = REQ_OP_WRITE_SAME; for (i = 0; i < job->num_dests; i++) if (!bdev_write_same(job->dests[i].bdev)) { job->rw = WRITE; diff --git a/drivers/md/dm-log-writes.c b/drivers/md/dm-log-writes.c index addcc4b..27630c5 100644 --- a/drivers/md/dm-log-writes.c +++ b/drivers/md/dm-log-writes.c @@ -205,7 +205,7 @@ static int write_metadata(struct log_writes_c *lc, void *entry, bio->bi_bdev = lc->logdev->bdev; bio->bi_end_io = log_end_io; bio->bi_private = lc; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; page = alloc_page(GFP_KERNEL); if (!page) { @@ -270,7 +270,7 @@ static int log_one_block(struct log_writes_c *lc, bio->bi_bdev = lc->logdev->bdev; bio->bi_end_io = log_end_io; bio->bi_private = lc; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; for (i = 0; i < block->vec_cnt; i++) { /* @@ -292,7 +292,7 @@ static int log_one_block(struct log_writes_c *lc, bio->bi_bdev = lc->logdev->bdev; bio->bi_end_io = log_end_io; bio->bi_private = lc; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; ret = bio_add_page(bio, block->vecs[i].bv_page, block->vecs[i].bv_len, 0); diff --git a/drivers/md/dm-log.c b/drivers/md/dm-log.c index 627d191..4ca2d1d 100644 --- a/drivers/md/dm-log.c +++ b/drivers/md/dm-log.c @@ -293,7 +293,7 @@ static void header_from_disk(struct log_header_core *core, struct log_header_dis static int rw_header(struct log_c *lc, int rw) { - lc->io_req.bi_rw = rw; + lc->io_req.bi_op = rw; return dm_io(&lc->io_req, 1, &lc->header_location, NULL); } @@ -306,7 +306,8 @@ static int flush_header(struct log_c *lc) .count = 0, }; - lc->io_req.bi_rw = WRITE_FLUSH; + lc->io_req.bi_op = REQ_OP_WRITE; + lc->io_req.bi_op_flags = WRITE_FLUSH; return dm_io(&lc->io_req, 1, &null_location, NULL); } diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c index b3ccf1e..8a86bc3 100644 --- a/drivers/md/dm-raid1.c +++ b/drivers/md/dm-raid1.c @@ -260,7 +260,8 @@ static int mirror_flush(struct dm_target *ti) struct dm_io_region io[ms->nr_mirrors]; struct mirror *m; struct dm_io_request io_req = { - .bi_rw = WRITE_FLUSH, + .bi_op = REQ_OP_WRITE, + .bi_op_flags = WRITE_FLUSH, .mem.type = DM_IO_KMEM, .mem.ptr.addr = NULL, .client = ms->io_client, @@ -541,7 +542,8 @@ static void read_async_bio(struct mirror *m, struct bio *bio) { struct dm_io_region io; struct dm_io_request io_req = { - .bi_rw = READ, + .bi_op = REQ_OP_READ, + .bi_op_flags = 0, .mem.type = DM_IO_BIO, .mem.ptr.bio = bio, .notify.fn = read_callback, @@ -654,7 +656,8 @@ static void do_write(struct mirror_set *ms, struct bio *bio) struct dm_io_region io[ms->nr_mirrors], *dest = io; struct mirror *m; struct dm_io_request io_req = { - .bi_rw = WRITE | (bio->bi_rw & WRITE_FLUSH_FUA), + .bi_op = REQ_OP_WRITE, + .bi_op_flags = bio->bi_rw & WRITE_FLUSH_FUA, .mem.type = DM_IO_BIO, .mem.ptr.bio = bio, .notify.fn = write_callback, @@ -663,7 +666,7 @@ static void do_write(struct mirror_set *ms, struct bio *bio) }; if (bio->bi_rw & REQ_DISCARD) { - io_req.bi_rw |= REQ_DISCARD; + io_req.bi_op = REQ_OP_DISCARD; io_req.mem.type = DM_IO_KMEM; io_req.mem.ptr.addr = NULL; } diff --git a/drivers/md/dm-snap-persistent.c b/drivers/md/dm-snap-persistent.c index 4d39093..b8cf956 100644 --- a/drivers/md/dm-snap-persistent.c +++ b/drivers/md/dm-snap-persistent.c @@ -226,8 +226,8 @@ static void do_metadata(struct work_struct *work) /* * Read or write a chunk aligned and sized block of data from a device. */ -static int chunk_io(struct pstore *ps, void *area, chunk_t chunk, int rw, - int metadata) +static int chunk_io(struct pstore *ps, void *area, chunk_t chunk, int op, + int op_flags, int metadata) { struct dm_io_region where = { .bdev = dm_snap_cow(ps->store->snap)->bdev, @@ -235,7 +235,8 @@ static int chunk_io(struct pstore *ps, void *area, chunk_t chunk, int rw, .count = ps->store->chunk_size, }; struct dm_io_request io_req = { - .bi_rw = rw, + .bi_op = op, + .bi_op_flags = op_flags, .mem.type = DM_IO_VMA, .mem.ptr.vma = area, .client = ps->io_client, @@ -281,14 +282,14 @@ static void skip_metadata(struct pstore *ps) * Read or write a metadata area. Remembering to skip the first * chunk which holds the header. */ -static int area_io(struct pstore *ps, int rw) +static int area_io(struct pstore *ps, int op, int op_flags) { int r; chunk_t chunk; chunk = area_location(ps, ps->current_area); - r = chunk_io(ps, ps->area, chunk, rw, 0); + r = chunk_io(ps, ps->area, chunk, op, op_flags, 0); if (r) return r; @@ -302,7 +303,8 @@ static void zero_memory_area(struct pstore *ps) static int zero_disk_area(struct pstore *ps, chunk_t area) { - return chunk_io(ps, ps->zero_area, area_location(ps, area), WRITE, 0); + return chunk_io(ps, ps->zero_area, area_location(ps, area), + REQ_OP_WRITE, 0, 0); } static int read_header(struct pstore *ps, int *new_snapshot) @@ -334,7 +336,7 @@ static int read_header(struct pstore *ps, int *new_snapshot) if (r) return r; - r = chunk_io(ps, ps->header_area, 0, READ, 1); + r = chunk_io(ps, ps->header_area, 0, REQ_OP_READ, 0, 1); if (r) goto bad; @@ -395,7 +397,7 @@ static int write_header(struct pstore *ps) dh->version = cpu_to_le32(ps->version); dh->chunk_size = cpu_to_le32(ps->store->chunk_size); - return chunk_io(ps, ps->header_area, 0, WRITE, 1); + return chunk_io(ps, ps->header_area, 0, REQ_OP_WRITE, 0, 1); } /* @@ -739,7 +741,7 @@ static void persistent_commit_exception(struct dm_exception_store *store, /* * Commit exceptions to disk. */ - if (ps->valid && area_io(ps, WRITE_FLUSH_FUA)) + if (ps->valid && area_io(ps, REQ_OP_WRITE, WRITE_FLUSH_FUA)) ps->valid = 0; /* @@ -779,7 +781,7 @@ static int persistent_prepare_merge(struct dm_exception_store *store, return 0; ps->current_area--; - r = area_io(ps, READ); + r = area_io(ps, REQ_OP_READ, 0); if (r < 0) return r; ps->current_committed = ps->exceptions_per_area; @@ -816,7 +818,7 @@ static int persistent_commit_merge(struct dm_exception_store *store, for (i = 0; i < nr_merged; i++) clear_exception(ps, ps->current_committed - 1 - i); - r = area_io(ps, WRITE_FLUSH_FUA); + r = area_io(ps, REQ_OP_WRITE, WRITE_FLUSH_FUA); if (r < 0) return r; diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index 69d86e1..6049078 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c @@ -339,7 +339,7 @@ static int __blkdev_issue_discard_async(struct block_device *bdev, sector_t sect struct bio *parent_bio) { struct request_queue *q = bdev_get_queue(bdev); - int type = REQ_WRITE | REQ_DISCARD; + int op_flags = 0; struct bio *bio; if (!q || !nr_sects) @@ -351,7 +351,7 @@ static int __blkdev_issue_discard_async(struct block_device *bdev, sector_t sect if (flags & BLKDEV_DISCARD_SECURE) { if (!blk_queue_secdiscard(q)) return -EOPNOTSUPP; - type |= REQ_SECURE; + op_flags |= REQ_SECURE; } /* @@ -366,7 +366,8 @@ static int __blkdev_issue_discard_async(struct block_device *bdev, sector_t sect bio->bi_iter.bi_sector = sector; bio->bi_bdev = bdev; bio->bi_iter.bi_size = nr_sects << 9; - bio->bi_rw = type; + bio->bi_op = REQ_OP_DISCARD; + bio->bi_rw = op_flags; submit_bio(bio); diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 1b2f962..5432da7 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -2412,6 +2412,7 @@ static struct mapped_device *alloc_dev(int minor) bio_init(&md->flush_bio); md->flush_bio.bi_bdev = md->bdev; + md->flush_bio.bi_op = REQ_OP_WRITE; md->flush_bio.bi_rw = WRITE_FLUSH; dm_stats_init(&md->stats); diff --git a/include/linux/dm-io.h b/include/linux/dm-io.h index a68cbe5..b91b023 100644 --- a/include/linux/dm-io.h +++ b/include/linux/dm-io.h @@ -57,7 +57,8 @@ struct dm_io_notify { */ struct dm_io_client; struct dm_io_request { - int bi_rw; /* READ|WRITE - not READA */ + int bi_op; /* REQ_OP */ + int bi_op_flags; /* rq_flag_bits */ struct dm_io_memory mem; /* Memory to use for io */ struct dm_io_notify notify; /* Synchronous if notify.fn is NULL */ struct dm_io_client *client; /* Client memory handler */ -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:17:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A3BEC7CCC for ; Fri, 15 Apr 2016 14:17:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 58797304032 for ; Fri, 15 Apr 2016 12:17:09 -0700 (PDT) X-ASG-Debug-ID: 1460747827-04bdf011056106b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id jyIQQSCuluHzBLvt (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:08 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id ADE656265D; Fri, 15 Apr 2016 19:17:07 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhk007872; Fri, 15 Apr 2016 15:17:05 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 20/42] dm: pass dm stats data dir instead of bi_rw Date: Fri, 15 Apr 2016 14:15:55 -0500 X-ASG-Orig-Subj: [PATCH 20/42] dm: pass dm stats data dir instead of bi_rw Message-Id: <1460747777-8479-21-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Fri, 15 Apr 2016 19:17:07 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460747828 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie It looks like dm stats cares about the data direction (READ vs WRITE) and does not need the bio/request flags. Commands like REQ_FLUSH, REQ_DISCARD and REQ_WRITE_SAME are currently always set with REQ_WRITE, so the extra check for REQ_DISCARD in dm_stats_account_io is not needed. This patch has it use the bio and request data_dir helpers instead of accessing the bi_rw/cmd_flags directly. This makes the next patches that remove the operation from the cmd_flags and bi_rw easier, because we will no longer have the REQ_WRITE bit set for operations like discards. This patch is compile tested only. v2: 1. Merged Mike Snitzer's fixes to pass in int instead of unsigned long. 2. Fix 80 char col issues. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/md/dm-stats.c | 9 ++++----- drivers/md/dm.c | 21 ++++++++++++--------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/drivers/md/dm-stats.c b/drivers/md/dm-stats.c index 8289804..4fba26c 100644 --- a/drivers/md/dm-stats.c +++ b/drivers/md/dm-stats.c @@ -514,11 +514,10 @@ static void dm_stat_round(struct dm_stat *s, struct dm_stat_shared *shared, } static void dm_stat_for_entry(struct dm_stat *s, size_t entry, - unsigned long bi_rw, sector_t len, + int idx, sector_t len, struct dm_stats_aux *stats_aux, bool end, unsigned long duration_jiffies) { - unsigned long idx = bi_rw & REQ_WRITE; struct dm_stat_shared *shared = &s->stat_shared[entry]; struct dm_stat_percpu *p; @@ -584,7 +583,7 @@ static void dm_stat_for_entry(struct dm_stat *s, size_t entry, #endif } -static void __dm_stat_bio(struct dm_stat *s, unsigned long bi_rw, +static void __dm_stat_bio(struct dm_stat *s, int bi_rw, sector_t bi_sector, sector_t end_sector, bool end, unsigned long duration_jiffies, struct dm_stats_aux *stats_aux) @@ -645,8 +644,8 @@ void dm_stats_account_io(struct dm_stats *stats, unsigned long bi_rw, last = raw_cpu_ptr(stats->last); stats_aux->merged = (bi_sector == (ACCESS_ONCE(last->last_sector) && - ((bi_rw & (REQ_WRITE | REQ_DISCARD)) == - (ACCESS_ONCE(last->last_rw) & (REQ_WRITE | REQ_DISCARD))) + ((bi_rw == WRITE) == + (ACCESS_ONCE(last->last_rw) == WRITE)) )); ACCESS_ONCE(last->last_sector) = end_sector; ACCESS_ONCE(last->last_rw) = bi_rw; diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 5432da7..98fea0e 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -723,8 +723,9 @@ static void start_io_acct(struct dm_io *io) atomic_inc_return(&md->pending[rw])); if (unlikely(dm_stats_used(&md->stats))) - dm_stats_account_io(&md->stats, bio->bi_rw, bio->bi_iter.bi_sector, - bio_sectors(bio), false, 0, &io->stats_aux); + dm_stats_account_io(&md->stats, bio_data_dir(bio), + bio->bi_iter.bi_sector, bio_sectors(bio), + false, 0, &io->stats_aux); } static void end_io_acct(struct dm_io *io) @@ -738,8 +739,9 @@ static void end_io_acct(struct dm_io *io) generic_end_io_acct(rw, &dm_disk(md)->part0, io->start_time); if (unlikely(dm_stats_used(&md->stats))) - dm_stats_account_io(&md->stats, bio->bi_rw, bio->bi_iter.bi_sector, - bio_sectors(bio), true, duration, &io->stats_aux); + dm_stats_account_io(&md->stats, bio_data_dir(bio), + bio->bi_iter.bi_sector, bio_sectors(bio), + true, duration, &io->stats_aux); /* * After this is decremented the bio must not be touched if it is @@ -1121,9 +1123,9 @@ static void rq_end_stats(struct mapped_device *md, struct request *orig) if (unlikely(dm_stats_used(&md->stats))) { struct dm_rq_target_io *tio = tio_from_request(orig); tio->duration_jiffies = jiffies - tio->duration_jiffies; - dm_stats_account_io(&md->stats, orig->cmd_flags, blk_rq_pos(orig), - tio->n_sectors, true, tio->duration_jiffies, - &tio->stats_aux); + dm_stats_account_io(&md->stats, rq_data_dir(orig), + blk_rq_pos(orig), tio->n_sectors, true, + tio->duration_jiffies, &tio->stats_aux); } } @@ -2082,8 +2084,9 @@ static void dm_start_request(struct mapped_device *md, struct request *orig) struct dm_rq_target_io *tio = tio_from_request(orig); tio->duration_jiffies = jiffies; tio->n_sectors = blk_rq_sectors(orig); - dm_stats_account_io(&md->stats, orig->cmd_flags, blk_rq_pos(orig), - tio->n_sectors, false, 0, &tio->stats_aux); + dm_stats_account_io(&md->stats, rq_data_dir(orig), + blk_rq_pos(orig), tio->n_sectors, false, 0, + &tio->stats_aux); } /* -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:17:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4D1EE7D10 for ; Fri, 15 Apr 2016 14:17:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1C3B68F8037 for ; Fri, 15 Apr 2016 12:17:12 -0700 (PDT) X-ASG-Debug-ID: 1460747830-04cbb02e1a316480001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 2OOzpyCI6Bzc0Y3r (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:10 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 02C627F09C; Fri, 15 Apr 2016 19:17:10 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhl007872; Fri, 15 Apr 2016 15:17:07 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 21/42] bcache: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 14:15:56 -0500 X-ASG-Orig-Subj: [PATCH 21/42] bcache: set bi_op to REQ_OP Message-Id: <1460747777-8479-22-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747830 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has bcache use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/md/bcache/btree.c | 2 ++ drivers/md/bcache/debug.c | 2 ++ drivers/md/bcache/io.c | 2 +- drivers/md/bcache/journal.c | 7 ++++--- drivers/md/bcache/movinggc.c | 2 +- drivers/md/bcache/request.c | 9 +++++---- drivers/md/bcache/super.c | 26 +++++++++++++++----------- drivers/md/bcache/writeback.c | 4 ++-- 8 files changed, 32 insertions(+), 22 deletions(-) diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c index 22b9e34..752a44f 100644 --- a/drivers/md/bcache/btree.c +++ b/drivers/md/bcache/btree.c @@ -295,6 +295,7 @@ static void bch_btree_node_read(struct btree *b) closure_init_stack(&cl); bio = bch_bbio_alloc(b->c); + bio->bi_op = REQ_OP_READ; bio->bi_rw = REQ_META|READ_SYNC; bio->bi_iter.bi_size = KEY_SIZE(&b->key) << 9; bio->bi_end_io = btree_node_read_endio; @@ -397,6 +398,7 @@ static void do_btree_node_write(struct btree *b) b->bio->bi_end_io = btree_node_write_endio; b->bio->bi_private = cl; + b->bio->bi_op = REQ_OP_WRITE; b->bio->bi_rw = REQ_META|WRITE_SYNC|REQ_FUA; b->bio->bi_iter.bi_size = roundup(set_bytes(i), block_bytes(b->c)); bch_bio_map(b->bio, i); diff --git a/drivers/md/bcache/debug.c b/drivers/md/bcache/debug.c index 52b6bcf..8df9e66 100644 --- a/drivers/md/bcache/debug.c +++ b/drivers/md/bcache/debug.c @@ -52,6 +52,7 @@ void bch_btree_verify(struct btree *b) bio->bi_bdev = PTR_CACHE(b->c, &b->key, 0)->bdev; bio->bi_iter.bi_sector = PTR_OFFSET(&b->key, 0); bio->bi_iter.bi_size = KEY_SIZE(&v->key) << 9; + bio->bi_op = REQ_OP_READ; bio->bi_rw = REQ_META|READ_SYNC; bch_bio_map(bio, sorted); @@ -114,6 +115,7 @@ void bch_data_verify(struct cached_dev *dc, struct bio *bio) check = bio_clone(bio, GFP_NOIO); if (!check) return; + check->bi_op = REQ_OP_READ; check->bi_rw |= READ_SYNC; if (bio_alloc_pages(check, GFP_NOIO)) diff --git a/drivers/md/bcache/io.c b/drivers/md/bcache/io.c index 86a0bb8..f10a9a0 100644 --- a/drivers/md/bcache/io.c +++ b/drivers/md/bcache/io.c @@ -111,7 +111,7 @@ void bch_bbio_count_io_errors(struct cache_set *c, struct bio *bio, struct bbio *b = container_of(bio, struct bbio, bio); struct cache *ca = PTR_CACHE(c, &b->key, 0); - unsigned threshold = bio->bi_rw & REQ_WRITE + unsigned threshold = op_is_write(bio->bi_op) ? c->congested_write_threshold_us : c->congested_read_threshold_us; diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c index af3f9f7..68fa0f0 100644 --- a/drivers/md/bcache/journal.c +++ b/drivers/md/bcache/journal.c @@ -54,7 +54,7 @@ reread: left = ca->sb.bucket_size - offset; bio_reset(bio); bio->bi_iter.bi_sector = bucket + offset; bio->bi_bdev = ca->bdev; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; bio->bi_iter.bi_size = len << 9; bio->bi_end_io = journal_read_endio; @@ -452,7 +452,7 @@ static void do_journal_discard(struct cache *ca) bio->bi_iter.bi_sector = bucket_to_sector(ca->set, ca->sb.d[ja->discard_idx]); bio->bi_bdev = ca->bdev; - bio->bi_rw = REQ_WRITE|REQ_DISCARD; + bio->bi_op = REQ_OP_DISCARD; bio->bi_max_vecs = 1; bio->bi_io_vec = bio->bi_inline_vecs; bio->bi_iter.bi_size = bucket_bytes(ca); @@ -626,7 +626,8 @@ static void journal_write_unlocked(struct closure *cl) bio_reset(bio); bio->bi_iter.bi_sector = PTR_OFFSET(k, i); bio->bi_bdev = ca->bdev; - bio->bi_rw = REQ_WRITE|REQ_SYNC|REQ_META|REQ_FLUSH|REQ_FUA; + bio->bi_op = REQ_OP_WRITE; + bio->bi_rw = REQ_SYNC|REQ_META|REQ_FLUSH|REQ_FUA; bio->bi_iter.bi_size = sectors << 9; bio->bi_end_io = journal_write_endio; diff --git a/drivers/md/bcache/movinggc.c b/drivers/md/bcache/movinggc.c index b929fc9..f33860a 100644 --- a/drivers/md/bcache/movinggc.c +++ b/drivers/md/bcache/movinggc.c @@ -163,7 +163,7 @@ static void read_moving(struct cache_set *c) moving_init(io); bio = &io->bio.bio; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; bio->bi_end_io = read_moving_endio; if (bio_alloc_pages(bio, GFP_KERNEL)) diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c index 25fa844..cd6837c 100644 --- a/drivers/md/bcache/request.c +++ b/drivers/md/bcache/request.c @@ -253,7 +253,7 @@ static void bch_data_insert_start(struct closure *cl) trace_bcache_cache_insert(k); bch_keylist_push(&op->insert_keys); - n->bi_rw |= REQ_WRITE; + n->bi_op = REQ_OP_WRITE; bch_submit_bbio(n, op->c, k, 0); } while (n != bio); @@ -383,7 +383,7 @@ static bool check_should_bypass(struct cached_dev *dc, struct bio *bio) if (mode == CACHE_MODE_NONE || (mode == CACHE_MODE_WRITEAROUND && - (bio->bi_rw & REQ_WRITE))) + op_is_write(bio->bi_op))) goto skip; if (bio->bi_iter.bi_sector & (c->sb.block_size - 1) || @@ -404,7 +404,7 @@ static bool check_should_bypass(struct cached_dev *dc, struct bio *bio) if (!congested && mode == CACHE_MODE_WRITEBACK && - (bio->bi_rw & REQ_WRITE) && + op_is_write(bio->bi_op) && (bio->bi_rw & REQ_SYNC)) goto rescale; @@ -657,7 +657,7 @@ static inline struct search *search_alloc(struct bio *bio, s->cache_miss = NULL; s->d = d; s->recoverable = 1; - s->write = (bio->bi_rw & REQ_WRITE) != 0; + s->write = op_is_write(bio->bi_op); s->read_dirty_data = 0; s->start_time = jiffies; @@ -925,6 +925,7 @@ static void cached_dev_write(struct cached_dev *dc, struct search *s) struct bio *flush = bio_alloc_bioset(GFP_NOIO, 0, dc->disk.bio_split); + flush->bi_op = REQ_OP_WRITE; flush->bi_rw = WRITE_FLUSH; flush->bi_bdev = bio->bi_bdev; flush->bi_end_io = request_endio; diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index 1eb526a7..16e6108 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c @@ -212,7 +212,8 @@ static void __write_super(struct cache_sb *sb, struct bio *bio) unsigned i; bio->bi_iter.bi_sector = SB_SECTOR; - bio->bi_rw = REQ_WRITE|REQ_SYNC|REQ_META; + bio->bi_op = REQ_OP_WRITE; + bio->bi_rw = REQ_SYNC|REQ_META; bio->bi_iter.bi_size = SB_SIZE; bch_bio_map(bio, NULL); @@ -333,7 +334,7 @@ static void uuid_io_unlock(struct closure *cl) up(&c->uuid_write_mutex); } -static void uuid_io(struct cache_set *c, unsigned long rw, +static void uuid_io(struct cache_set *c, int op, unsigned long op_flags, struct bkey *k, struct closure *parent) { struct closure *cl = &c->uuid_write; @@ -348,7 +349,8 @@ static void uuid_io(struct cache_set *c, unsigned long rw, for (i = 0; i < KEY_PTRS(k); i++) { struct bio *bio = bch_bbio_alloc(c); - bio->bi_rw = REQ_SYNC|REQ_META|rw; + bio->bi_op = op; + bio->bi_rw = REQ_SYNC|REQ_META|op_flags; bio->bi_iter.bi_size = KEY_SIZE(k) << 9; bio->bi_end_io = uuid_endio; @@ -357,12 +359,12 @@ static void uuid_io(struct cache_set *c, unsigned long rw, bch_submit_bbio(bio, c, k, i); - if (!(rw & WRITE)) + if (op != REQ_OP_WRITE) break; } bch_extent_to_text(buf, sizeof(buf), k); - pr_debug("%s UUIDs at %s", rw & REQ_WRITE ? "wrote" : "read", buf); + pr_debug("%s UUIDs at %s", op == REQ_OP_WRITE ? "wrote" : "read", buf); for (u = c->uuids; u < c->uuids + c->nr_uuids; u++) if (!bch_is_zero(u->uuid, 16)) @@ -381,7 +383,7 @@ static char *uuid_read(struct cache_set *c, struct jset *j, struct closure *cl) return "bad uuid pointer"; bkey_copy(&c->uuid_bucket, k); - uuid_io(c, READ_SYNC, k, cl); + uuid_io(c, REQ_OP_READ, READ_SYNC, k, cl); if (j->version < BCACHE_JSET_VERSION_UUIDv1) { struct uuid_entry_v0 *u0 = (void *) c->uuids; @@ -426,7 +428,7 @@ static int __uuid_write(struct cache_set *c) return 1; SET_KEY_SIZE(&k.key, c->sb.bucket_size); - uuid_io(c, REQ_WRITE, &k.key, &cl); + uuid_io(c, REQ_OP_WRITE, 0, &k.key, &cl); closure_sync(&cl); bkey_copy(&c->uuid_bucket, &k.key); @@ -498,7 +500,8 @@ static void prio_endio(struct bio *bio) closure_put(&ca->prio); } -static void prio_io(struct cache *ca, uint64_t bucket, unsigned long rw) +static void prio_io(struct cache *ca, uint64_t bucket, int op, + unsigned long op_flags) { struct closure *cl = &ca->prio; struct bio *bio = bch_bbio_alloc(ca->set); @@ -507,7 +510,8 @@ static void prio_io(struct cache *ca, uint64_t bucket, unsigned long rw) bio->bi_iter.bi_sector = bucket * ca->sb.bucket_size; bio->bi_bdev = ca->bdev; - bio->bi_rw = REQ_SYNC|REQ_META|rw; + bio->bi_op = op; + bio->bi_rw = REQ_SYNC|REQ_META|op_flags; bio->bi_iter.bi_size = bucket_bytes(ca); bio->bi_end_io = prio_endio; @@ -557,7 +561,7 @@ void bch_prio_write(struct cache *ca) BUG_ON(bucket == -1); mutex_unlock(&ca->set->bucket_lock); - prio_io(ca, bucket, REQ_WRITE); + prio_io(ca, bucket, REQ_OP_WRITE, 0); mutex_lock(&ca->set->bucket_lock); ca->prio_buckets[i] = bucket; @@ -599,7 +603,7 @@ static void prio_read(struct cache *ca, uint64_t bucket) ca->prio_last_buckets[bucket_nr] = bucket; bucket_nr++; - prio_io(ca, bucket, READ_SYNC); + prio_io(ca, bucket, REQ_OP_READ, READ_SYNC); if (p->csum != bch_crc64(&p->magic, bucket_bytes(ca) - 8)) pr_warn("bad csum reading priorities"); diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c index b9346cd..96ddf28 100644 --- a/drivers/md/bcache/writeback.c +++ b/drivers/md/bcache/writeback.c @@ -183,7 +183,7 @@ static void write_dirty(struct closure *cl) struct keybuf_key *w = io->bio.bi_private; dirty_init(w); - io->bio.bi_rw = WRITE; + io->bio.bi_op = REQ_OP_WRITE; io->bio.bi_iter.bi_sector = KEY_START(&w->key); io->bio.bi_bdev = io->dc->bdev; io->bio.bi_end_io = dirty_endio; @@ -256,7 +256,7 @@ static void read_dirty(struct cached_dev *dc) io->bio.bi_iter.bi_sector = PTR_OFFSET(&w->key, 0); io->bio.bi_bdev = PTR_CACHE(dc->disk.c, &w->key, 0)->bdev; - io->bio.bi_rw = READ; + io->bio.bi_op = REQ_OP_READ; io->bio.bi_end_io = read_dirty_endio; if (bio_alloc_pages(&io->bio, GFP_KERNEL)) -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:17:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id ABF417D14 for ; Fri, 15 Apr 2016 14:17:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 40C91AC002 for ; Fri, 15 Apr 2016 12:17:14 -0700 (PDT) X-ASG-Debug-ID: 1460747832-04bdf01105610700001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 221xZzUMuXbTt9cT (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:12 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4E8A66407D; Fri, 15 Apr 2016 19:17:12 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhm007872; Fri, 15 Apr 2016 15:17:10 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 22/42] drbd: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 14:15:57 -0500 X-ASG-Orig-Subj: [PATCH 22/42] drbd: set bi_op to REQ_OP Message-Id: <1460747777-8479-23-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Fri, 15 Apr 2016 19:17:12 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460747832 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has drbd use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Lars and Philip, I might have split this patch up a little weird. The block layer has compat so you can set either bi_rw or bi_op. This patch handles setting up the bio in drbd. I then converted all the block device drivers and in 0037-block-fs-drivers-do-not-test-bi_rw-for-REQ_OPs.patch I modified the bi_rw checks so they use bi_op. This patch is compile tested only. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/block/drbd/drbd_actlog.c | 29 ++++++++++++++++------------- drivers/block/drbd/drbd_bitmap.c | 6 +++--- drivers/block/drbd/drbd_int.h | 4 ++-- drivers/block/drbd/drbd_main.c | 5 +++-- drivers/block/drbd/drbd_receiver.c | 37 +++++++++++++++++++++++++------------ drivers/block/drbd/drbd_worker.c | 3 ++- 6 files changed, 51 insertions(+), 33 deletions(-) diff --git a/drivers/block/drbd/drbd_actlog.c b/drivers/block/drbd/drbd_actlog.c index 6069e15..2fa8534 100644 --- a/drivers/block/drbd/drbd_actlog.c +++ b/drivers/block/drbd/drbd_actlog.c @@ -137,19 +137,19 @@ void wait_until_done_or_force_detached(struct drbd_device *device, struct drbd_b static int _drbd_md_sync_page_io(struct drbd_device *device, struct drbd_backing_dev *bdev, - sector_t sector, int rw) + sector_t sector, int op) { struct bio *bio; /* we do all our meta data IO in aligned 4k blocks. */ const int size = 4096; - int err; + int err, op_flags = 0; device->md_io.done = 0; device->md_io.error = -ENODEV; - if ((rw & WRITE) && !test_bit(MD_NO_FUA, &device->flags)) - rw |= REQ_FUA | REQ_FLUSH; - rw |= REQ_SYNC | REQ_NOIDLE; + if ((op == REQ_OP_WRITE) && !test_bit(MD_NO_FUA, &device->flags)) + op_flags |= REQ_FUA | REQ_FLUSH; + op_flags |= REQ_SYNC | REQ_NOIDLE; bio = bio_alloc_drbd(GFP_NOIO); bio->bi_bdev = bdev->md_bdev; @@ -159,9 +159,10 @@ static int _drbd_md_sync_page_io(struct drbd_device *device, goto out; bio->bi_private = device; bio->bi_end_io = drbd_md_endio; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; - if (!(rw & WRITE) && device->state.disk == D_DISKLESS && device->ldev == NULL) + if (op != REQ_OP_WRITE && device->state.disk == D_DISKLESS && device->ldev == NULL) /* special case, drbd_md_read() during drbd_adm_attach(): no get_ldev */ ; else if (!get_ldev_if_state(device, D_ATTACHING)) { @@ -174,7 +175,7 @@ static int _drbd_md_sync_page_io(struct drbd_device *device, bio_get(bio); /* one bio_put() is in the completion handler */ atomic_inc(&device->md_io.in_use); /* drbd_md_put_buffer() is in the completion handler */ device->md_io.submit_jif = jiffies; - if (drbd_insert_fault(device, (rw & WRITE) ? DRBD_FAULT_MD_WR : DRBD_FAULT_MD_RD)) + if (drbd_insert_fault(device, (op == REQ_OP_WRITE) ? DRBD_FAULT_MD_WR : DRBD_FAULT_MD_RD)) bio_io_error(bio); else submit_bio(bio); @@ -188,7 +189,7 @@ static int _drbd_md_sync_page_io(struct drbd_device *device, } int drbd_md_sync_page_io(struct drbd_device *device, struct drbd_backing_dev *bdev, - sector_t sector, int rw) + sector_t sector, int op) { int err; D_ASSERT(device, atomic_read(&device->md_io.in_use) == 1); @@ -197,19 +198,21 @@ int drbd_md_sync_page_io(struct drbd_device *device, struct drbd_backing_dev *bd dynamic_drbd_dbg(device, "meta_data io: %s [%d]:%s(,%llus,%s) %pS\n", current->comm, current->pid, __func__, - (unsigned long long)sector, (rw & WRITE) ? "WRITE" : "READ", + (unsigned long long)sector, (op == REQ_OP_WRITE) ? "WRITE" : "READ", (void*)_RET_IP_ ); if (sector < drbd_md_first_sector(bdev) || sector + 7 > drbd_md_last_sector(bdev)) drbd_alert(device, "%s [%d]:%s(,%llus,%s) out of range md access!\n", current->comm, current->pid, __func__, - (unsigned long long)sector, (rw & WRITE) ? "WRITE" : "READ"); + (unsigned long long)sector, + (op == REQ_OP_WRITE) ? "WRITE" : "READ"); - err = _drbd_md_sync_page_io(device, bdev, sector, rw); + err = _drbd_md_sync_page_io(device, bdev, sector, op); if (err) { drbd_err(device, "drbd_md_sync_page_io(,%llus,%s) failed with error %d\n", - (unsigned long long)sector, (rw & WRITE) ? "WRITE" : "READ", err); + (unsigned long long)sector, + (op == REQ_OP_WRITE) ? "WRITE" : "READ", err); } return err; } diff --git a/drivers/block/drbd/drbd_bitmap.c b/drivers/block/drbd/drbd_bitmap.c index e8959fe..126bf4a 100644 --- a/drivers/block/drbd/drbd_bitmap.c +++ b/drivers/block/drbd/drbd_bitmap.c @@ -980,7 +980,7 @@ static void bm_page_io_async(struct drbd_bm_aio_ctx *ctx, int page_nr) __must_ho struct drbd_bitmap *b = device->bitmap; struct page *page; unsigned int len; - unsigned int rw = (ctx->flags & BM_AIO_READ) ? READ : WRITE; + unsigned int op = (ctx->flags & BM_AIO_READ) ? REQ_OP_READ : REQ_OP_WRITE; sector_t on_disk_sector = device->ldev->md.md_offset + device->ldev->md.bm_offset; @@ -1011,9 +1011,9 @@ static void bm_page_io_async(struct drbd_bm_aio_ctx *ctx, int page_nr) __must_ho bio_add_page(bio, page, len, 0); bio->bi_private = ctx; bio->bi_end_io = drbd_bm_endio; - bio->bi_rw = rw; + bio->bi_op = op; - if (drbd_insert_fault(device, (rw & WRITE) ? DRBD_FAULT_MD_WR : DRBD_FAULT_MD_RD)) { + if (drbd_insert_fault(device, (op == REQ_OP_WRITE) ? DRBD_FAULT_MD_WR : DRBD_FAULT_MD_RD)) { bio_io_error(bio); } else { submit_bio(bio); diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index 7a1cf7e..33f0b82 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h @@ -1507,7 +1507,7 @@ extern int drbd_resync_finished(struct drbd_device *device); extern void *drbd_md_get_buffer(struct drbd_device *device, const char *intent); extern void drbd_md_put_buffer(struct drbd_device *device); extern int drbd_md_sync_page_io(struct drbd_device *device, - struct drbd_backing_dev *bdev, sector_t sector, int rw); + struct drbd_backing_dev *bdev, sector_t sector, int op); extern void drbd_ov_out_of_sync_found(struct drbd_device *, sector_t, int); extern void wait_until_done_or_force_detached(struct drbd_device *device, struct drbd_backing_dev *bdev, unsigned int *done); @@ -1557,7 +1557,7 @@ extern bool drbd_rs_should_slow_down(struct drbd_device *device, sector_t sector bool throttle_if_app_is_waiting); extern int drbd_submit_peer_request(struct drbd_device *, struct drbd_peer_request *, const unsigned, - const int); + const unsigned, const int); extern int drbd_free_peer_reqs(struct drbd_device *, struct list_head *); extern struct drbd_peer_request *drbd_alloc_peer_req(struct drbd_peer_device *, u64, sector_t, unsigned int, diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 2ba1494..30c93d6 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c @@ -3061,7 +3061,7 @@ void drbd_md_write(struct drbd_device *device, void *b) D_ASSERT(device, drbd_md_ss(device->ldev) == device->ldev->md.md_offset); sector = device->ldev->md.md_offset; - if (drbd_md_sync_page_io(device, device->ldev, sector, WRITE)) { + if (drbd_md_sync_page_io(device, device->ldev, sector, REQ_OP_WRITE)) { /* this was a try anyways ... */ drbd_err(device, "meta data update failed!\n"); drbd_chk_io_error(device, 1, DRBD_META_IO_ERROR); @@ -3263,7 +3263,8 @@ int drbd_md_read(struct drbd_device *device, struct drbd_backing_dev *bdev) * Affects the paranoia out-of-range access check in drbd_md_sync_page_io(). */ bdev->md.md_size_sect = 8; - if (drbd_md_sync_page_io(device, bdev, bdev->md.md_offset, READ)) { + if (drbd_md_sync_page_io(device, bdev, bdev->md.md_offset, + REQ_OP_READ)) { /* NOTE: can't do normal error processing here as this is called BEFORE disk is attached */ drbd_err(device, "Error while reading metadata.\n"); diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index 050aaa1..a0b95da 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c @@ -1398,7 +1398,8 @@ void drbd_bump_write_ordering(struct drbd_resource *resource, struct drbd_backin /* TODO allocate from our own bio_set. */ int drbd_submit_peer_request(struct drbd_device *device, struct drbd_peer_request *peer_req, - const unsigned rw, const int fault_type) + const unsigned op, const unsigned op_flags, + const int fault_type) { struct bio *bios = NULL; struct bio *bio; @@ -1450,7 +1451,8 @@ next_bio: /* > peer_req->i.sector, unless this is the first bio */ bio->bi_iter.bi_sector = sector; bio->bi_bdev = device->ldev->backing_bdev; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; bio->bi_private = peer_req; bio->bi_end_io = drbd_peer_request_endio; @@ -1458,7 +1460,7 @@ next_bio: bios = bio; ++n_bios; - if (rw & REQ_DISCARD) { + if (op == REQ_OP_DISCARD) { bio->bi_iter.bi_size = data_size; goto submit; } @@ -1830,7 +1832,8 @@ static int recv_resync_read(struct drbd_peer_device *peer_device, sector_t secto spin_unlock_irq(&device->resource->req_lock); atomic_add(pi->size >> 9, &device->rs_sect_ev); - if (drbd_submit_peer_request(device, peer_req, WRITE, DRBD_FAULT_RS_WR) == 0) + if (drbd_submit_peer_request(device, peer_req, REQ_OP_WRITE, 0, + DRBD_FAULT_RS_WR) == 0) return 0; /* don't care for the reason here */ @@ -2152,12 +2155,19 @@ static int wait_for_and_update_peer_seq(struct drbd_peer_device *peer_device, co /* see also bio_flags_to_wire() * DRBD_REQ_*, because we need to semantically map the flags to data packet * flags and back. We may replicate to other kernel versions. */ -static unsigned long wire_flags_to_bio(u32 dpf) +static unsigned long wire_flags_to_bio_flags(u32 dpf) { return (dpf & DP_RW_SYNC ? REQ_SYNC : 0) | (dpf & DP_FUA ? REQ_FUA : 0) | - (dpf & DP_FLUSH ? REQ_FLUSH : 0) | - (dpf & DP_DISCARD ? REQ_DISCARD : 0); + (dpf & DP_FLUSH ? REQ_FLUSH : 0); +} + +static unsigned long wire_flags_to_bio_op(u32 dpf) +{ + if (dpf & DP_DISCARD) + return REQ_OP_DISCARD; + else + return REQ_OP_WRITE; } static void fail_postponed_requests(struct drbd_device *device, sector_t sector, @@ -2303,7 +2313,7 @@ static int receive_Data(struct drbd_connection *connection, struct packet_info * struct drbd_peer_request *peer_req; struct p_data *p = pi->data; u32 peer_seq = be32_to_cpu(p->seq_num); - int rw = WRITE; + int op, op_flags; u32 dp_flags; int err, tp; @@ -2342,14 +2352,15 @@ static int receive_Data(struct drbd_connection *connection, struct packet_info * peer_req->flags |= EE_APPLICATION; dp_flags = be32_to_cpu(p->dp_flags); - rw |= wire_flags_to_bio(dp_flags); + op = wire_flags_to_bio_op(dp_flags); + op_flags = wire_flags_to_bio_flags(dp_flags); if (pi->cmd == P_TRIM) { struct request_queue *q = bdev_get_queue(device->ldev->backing_bdev); peer_req->flags |= EE_IS_TRIM; if (!blk_queue_discard(q)) peer_req->flags |= EE_IS_TRIM_USE_ZEROOUT; D_ASSERT(peer_device, peer_req->i.size > 0); - D_ASSERT(peer_device, rw & REQ_DISCARD); + D_ASSERT(peer_device, op == REQ_OP_DISCARD); D_ASSERT(peer_device, peer_req->pages == NULL); } else if (peer_req->pages == NULL) { D_ASSERT(device, peer_req->i.size == 0); @@ -2433,7 +2444,8 @@ static int receive_Data(struct drbd_connection *connection, struct packet_info * peer_req->flags |= EE_CALL_AL_COMPLETE_IO; } - err = drbd_submit_peer_request(device, peer_req, rw, DRBD_FAULT_DT_WR); + err = drbd_submit_peer_request(device, peer_req, op, op_flags, + DRBD_FAULT_DT_WR); if (!err) return 0; @@ -2723,7 +2735,8 @@ submit_for_resync: submit: update_receiver_timing_details(connection, drbd_submit_peer_request); inc_unacked(device); - if (drbd_submit_peer_request(device, peer_req, READ, fault_type) == 0) + if (drbd_submit_peer_request(device, peer_req, REQ_OP_READ, 0, + fault_type) == 0) return 0; /* don't care for the reason here */ diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_worker.c index 4d87499..2a04b43 100644 --- a/drivers/block/drbd/drbd_worker.c +++ b/drivers/block/drbd/drbd_worker.c @@ -397,7 +397,8 @@ static int read_for_csum(struct drbd_peer_device *peer_device, sector_t sector, spin_unlock_irq(&device->resource->req_lock); atomic_add(size >> 9, &device->rs_sect_ev); - if (drbd_submit_peer_request(device, peer_req, READ, DRBD_FAULT_RS_RD) == 0) + if (drbd_submit_peer_request(device, peer_req, REQ_OP_READ, 0, + DRBD_FAULT_RS_RD) == 0) return 0; /* If it failed because of ENOMEM, retry should help. If it failed -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:17:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5B1357D1C for ; Fri, 15 Apr 2016 14:17:18 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D93AD8F8039 for ; Fri, 15 Apr 2016 12:17:17 -0700 (PDT) X-ASG-Debug-ID: 1460747834-04bdf01104610720001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id n73Z2lV0s840uzIl (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:14 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 999157F0A9; Fri, 15 Apr 2016 19:17:14 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhn007872; Fri, 15 Apr 2016 15:17:12 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 23/42] md/raid: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 14:15:58 -0500 X-ASG-Orig-Subj: [PATCH 23/42] md/raid: set bi_op to REQ_OP Message-Id: <1460747777-8479-24-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747834 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has md use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/md/bitmap.c | 2 +- drivers/md/dm-raid.c | 5 +++-- drivers/md/md.c | 11 +++++++---- drivers/md/md.h | 3 ++- drivers/md/raid1.c | 34 ++++++++++++++++---------------- drivers/md/raid10.c | 50 ++++++++++++++++++++++++++---------------------- drivers/md/raid5-cache.c | 25 +++++++++++++++--------- drivers/md/raid5.c | 48 ++++++++++++++++++++++++++-------------------- 8 files changed, 101 insertions(+), 77 deletions(-) diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index 8b2e16f..9e8019e 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c @@ -159,7 +159,7 @@ static int read_sb_page(struct mddev *mddev, loff_t offset, if (sync_page_io(rdev, target, roundup(size, bdev_logical_block_size(rdev->bdev)), - page, READ, true)) { + page, REQ_OP_READ, 0, true)) { page->index = index; return 0; } diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index a090121..43a749c 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c @@ -792,7 +792,7 @@ static int read_disk_sb(struct md_rdev *rdev, int size) if (rdev->sb_loaded) return 0; - if (!sync_page_io(rdev, 0, size, rdev->sb_page, READ, 1)) { + if (!sync_page_io(rdev, 0, size, rdev->sb_page, REQ_OP_READ, 0, 1)) { DMERR("Failed to read superblock of device at position %d", rdev->raid_disk); md_error(rdev->mddev, rdev); @@ -1646,7 +1646,8 @@ static void attempt_restore_of_faulty_devices(struct raid_set *rs) for (i = 0; i < rs->md.raid_disks; i++) { r = &rs->dev[i].rdev; if (test_bit(Faulty, &r->flags) && r->sb_page && - sync_page_io(r, 0, r->sb_size, r->sb_page, READ, 1)) { + sync_page_io(r, 0, r->sb_size, r->sb_page, REQ_OP_READ, 0, + 1)) { DMINFO("Faulty %s device #%d has readable super block." " Attempting to revive it.", rs->raid_type->name, i); diff --git a/drivers/md/md.c b/drivers/md/md.c index ec3c98d..9c40368 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -392,6 +392,7 @@ static void submit_flushes(struct work_struct *ws) bi->bi_end_io = md_end_flush; bi->bi_private = rdev; bi->bi_bdev = rdev->bdev; + bi->bi_op = REQ_OP_WRITE; bi->bi_rw = WRITE_FLUSH; atomic_inc(&mddev->flush_pending); submit_bio(bi); @@ -741,6 +742,7 @@ void md_super_write(struct mddev *mddev, struct md_rdev *rdev, bio_add_page(bio, page, size, 0); bio->bi_private = rdev; bio->bi_end_io = super_written; + bio->bi_op = REQ_OP_WRITE; bio->bi_rw = WRITE_FLUSH_FUA; atomic_inc(&mddev->pending_writes); @@ -754,14 +756,15 @@ void md_super_wait(struct mddev *mddev) } int sync_page_io(struct md_rdev *rdev, sector_t sector, int size, - struct page *page, int rw, bool metadata_op) + struct page *page, int op, int op_flags, bool metadata_op) { struct bio *bio = bio_alloc_mddev(GFP_NOIO, 1, rdev->mddev); int ret; bio->bi_bdev = (metadata_op && rdev->meta_bdev) ? rdev->meta_bdev : rdev->bdev; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; if (metadata_op) bio->bi_iter.bi_sector = sector + rdev->sb_start; else if (rdev->mddev->reshape_position != MaxSector && @@ -787,7 +790,7 @@ static int read_disk_sb(struct md_rdev *rdev, int size) if (rdev->sb_loaded) return 0; - if (!sync_page_io(rdev, 0, size, rdev->sb_page, READ, true)) + if (!sync_page_io(rdev, 0, size, rdev->sb_page, REQ_OP_READ, 0, true)) goto fail; rdev->sb_loaded = 1; return 0; @@ -1473,7 +1476,7 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_ return -EINVAL; bb_sector = (long long)offset; if (!sync_page_io(rdev, bb_sector, sectors << 9, - rdev->bb_page, READ, true)) + rdev->bb_page, REQ_OP_READ, 0, true)) return -EIO; bbp = (u64 *)page_address(rdev->bb_page); rdev->badblocks.shift = sb->bblog_shift; diff --git a/drivers/md/md.h b/drivers/md/md.h index b5c4be7..2e0918f 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -618,7 +618,8 @@ extern void md_super_write(struct mddev *mddev, struct md_rdev *rdev, sector_t sector, int size, struct page *page); extern void md_super_wait(struct mddev *mddev); extern int sync_page_io(struct md_rdev *rdev, sector_t sector, int size, - struct page *page, int rw, bool metadata_op); + struct page *page, int op, int op_flags, + bool metadata_op); extern void md_do_sync(struct md_thread *thread); extern void md_new_event(struct mddev *mddev); extern int md_allow_write(struct mddev *mddev); diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 424df7e..c7abd2d 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -759,7 +759,7 @@ static void flush_pending_writes(struct r1conf *conf) while (bio) { /* submit pending writes */ struct bio *next = bio->bi_next; bio->bi_next = NULL; - if (unlikely((bio->bi_rw & REQ_DISCARD) && + if (unlikely((bio->bi_op == REQ_OP_DISCARD) && !blk_queue_discard(bdev_get_queue(bio->bi_bdev)))) /* Just ignore it */ bio_endio(bio); @@ -1033,7 +1033,7 @@ static void raid1_unplug(struct blk_plug_cb *cb, bool from_schedule) while (bio) { /* submit pending writes */ struct bio *next = bio->bi_next; bio->bi_next = NULL; - if (unlikely((bio->bi_rw & REQ_DISCARD) && + if (unlikely((bio->bi_op == REQ_OP_DISCARD) && !blk_queue_discard(bdev_get_queue(bio->bi_bdev)))) /* Just ignore it */ bio_endio(bio); @@ -1053,12 +1053,11 @@ static void raid1_make_request(struct mddev *mddev, struct bio * bio) int i, disks; struct bitmap *bitmap; unsigned long flags; + const int op = bio->bi_op; const int rw = bio_data_dir(bio); const unsigned long do_sync = (bio->bi_rw & REQ_SYNC); const unsigned long do_flush_fua = (bio->bi_rw & (REQ_FLUSH | REQ_FUA)); - const unsigned long do_discard = (bio->bi_rw - & (REQ_DISCARD | REQ_SECURE)); - const unsigned long do_same = (bio->bi_rw & REQ_WRITE_SAME); + const unsigned long do_sec = (bio->bi_rw & REQ_SECURE); struct md_rdev *blocked_rdev; struct blk_plug_cb *cb; struct raid1_plug_cb *plug = NULL; @@ -1166,7 +1165,8 @@ read_again: mirror->rdev->data_offset; read_bio->bi_bdev = mirror->rdev->bdev; read_bio->bi_end_io = raid1_end_read_request; - read_bio->bi_rw = READ | do_sync; + read_bio->bi_op = op; + read_bio->bi_rw = do_sync; read_bio->bi_private = r1_bio; if (max_sectors < r1_bio->sectors) { @@ -1376,8 +1376,9 @@ read_again: conf->mirrors[i].rdev->data_offset); mbio->bi_bdev = conf->mirrors[i].rdev->bdev; mbio->bi_end_io = raid1_end_write_request; + mbio->bi_op = op; mbio->bi_rw = - WRITE | do_flush_fua | do_sync | do_discard | do_same; + do_flush_fua | do_sync | do_sec; mbio->bi_private = r1_bio; atomic_inc(&r1_bio->remaining); @@ -1771,7 +1772,7 @@ static void end_sync_write(struct bio *bio) static int r1_sync_page_io(struct md_rdev *rdev, sector_t sector, int sectors, struct page *page, int rw) { - if (sync_page_io(rdev, sector, sectors << 9, page, rw, false)) + if (sync_page_io(rdev, sector, sectors << 9, page, rw, 0, false)) /* success */ return 1; if (rw == WRITE) { @@ -1825,7 +1826,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio) rdev = conf->mirrors[d].rdev; if (sync_page_io(rdev, sect, s<<9, bio->bi_io_vec[idx].bv_page, - READ, false)) { + REQ_OP_READ, 0, false)) { success = 1; break; } @@ -2030,7 +2031,7 @@ static void sync_request_write(struct mddev *mddev, struct r1bio *r1_bio) !test_bit(MD_RECOVERY_SYNC, &mddev->recovery)))) continue; - wbio->bi_rw = WRITE; + wbio->bi_op = REQ_OP_WRITE; wbio->bi_end_io = end_sync_write; atomic_inc(&r1_bio->remaining); md_sync_acct(conf->mirrors[i].rdev->bdev, bio_sectors(wbio)); @@ -2090,7 +2091,7 @@ static void fix_read_error(struct r1conf *conf, int read_disk, is_badblock(rdev, sect, s, &first_bad, &bad_sectors) == 0 && sync_page_io(rdev, sect, s<<9, - conf->tmppage, READ, false)) + conf->tmppage, REQ_OP_READ, 0, false)) success = 1; else { d++; @@ -2201,7 +2202,7 @@ static int narrow_write_error(struct r1bio *r1_bio, int i) wbio = bio_clone_mddev(r1_bio->master_bio, GFP_NOIO, mddev); } - wbio->bi_rw = WRITE; + wbio->bi_op = REQ_OP_WRITE; wbio->bi_iter.bi_sector = r1_bio->sector; wbio->bi_iter.bi_size = r1_bio->sectors << 9; @@ -2344,7 +2345,8 @@ read_more: bio->bi_iter.bi_sector = r1_bio->sector + rdev->data_offset; bio->bi_bdev = rdev->bdev; bio->bi_end_io = raid1_end_read_request; - bio->bi_rw = READ | do_sync; + bio->bi_op = REQ_OP_READ; + bio->bi_rw = do_sync; bio->bi_private = r1_bio; if (max_sectors < r1_bio->sectors) { /* Drat - have to split this up more */ @@ -2572,7 +2574,7 @@ static sector_t raid1_sync_request(struct mddev *mddev, sector_t sector_nr, if (i < conf->raid_disks) still_degraded = 1; } else if (!test_bit(In_sync, &rdev->flags)) { - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; bio->bi_end_io = end_sync_write; write_targets ++; } else { @@ -2599,7 +2601,7 @@ static sector_t raid1_sync_request(struct mddev *mddev, sector_t sector_nr, if (disk < 0) disk = i; } - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; bio->bi_end_io = end_sync_read; read_targets++; } else if (!test_bit(WriteErrorSeen, &rdev->flags) && @@ -2611,7 +2613,7 @@ static sector_t raid1_sync_request(struct mddev *mddev, sector_t sector_nr, * if we are doing resync or repair. Otherwise, leave * this device alone for this sync request. */ - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; bio->bi_end_io = end_sync_write; write_targets++; } diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 4736be8..63cd985 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -865,7 +865,7 @@ static void flush_pending_writes(struct r10conf *conf) while (bio) { /* submit pending writes */ struct bio *next = bio->bi_next; bio->bi_next = NULL; - if (unlikely((bio->bi_rw & REQ_DISCARD) && + if (unlikely((bio->bi_op == REQ_OP_DISCARD) && !blk_queue_discard(bdev_get_queue(bio->bi_bdev)))) /* Just ignore it */ bio_endio(bio); @@ -1041,7 +1041,7 @@ static void raid10_unplug(struct blk_plug_cb *cb, bool from_schedule) while (bio) { /* submit pending writes */ struct bio *next = bio->bi_next; bio->bi_next = NULL; - if (unlikely((bio->bi_rw & REQ_DISCARD) && + if (unlikely((bio->bi_op == REQ_OP_DISCARD) && !blk_queue_discard(bdev_get_queue(bio->bi_bdev)))) /* Just ignore it */ bio_endio(bio); @@ -1058,12 +1058,11 @@ static void __make_request(struct mddev *mddev, struct bio *bio) struct r10bio *r10_bio; struct bio *read_bio; int i; + const int op = bio->bi_op; const int rw = bio_data_dir(bio); const unsigned long do_sync = (bio->bi_rw & REQ_SYNC); const unsigned long do_fua = (bio->bi_rw & REQ_FUA); - const unsigned long do_discard = (bio->bi_rw - & (REQ_DISCARD | REQ_SECURE)); - const unsigned long do_same = (bio->bi_rw & REQ_WRITE_SAME); + const unsigned long do_sec = (bio->bi_rw & REQ_SECURE); unsigned long flags; struct md_rdev *blocked_rdev; struct blk_plug_cb *cb; @@ -1156,7 +1155,8 @@ read_again: choose_data_offset(r10_bio, rdev); read_bio->bi_bdev = rdev->bdev; read_bio->bi_end_io = raid10_end_read_request; - read_bio->bi_rw = READ | do_sync; + read_bio->bi_op = op; + read_bio->bi_rw = do_sync; read_bio->bi_private = r10_bio; if (max_sectors < r10_bio->sectors) { @@ -1363,8 +1363,9 @@ retry_write: rdev)); mbio->bi_bdev = rdev->bdev; mbio->bi_end_io = raid10_end_write_request; + mbio->bi_op = op; mbio->bi_rw = - WRITE | do_sync | do_fua | do_discard | do_same; + do_sync | do_fua | do_sec; mbio->bi_private = r10_bio; atomic_inc(&r10_bio->remaining); @@ -1406,8 +1407,9 @@ retry_write: r10_bio, rdev)); mbio->bi_bdev = rdev->bdev; mbio->bi_end_io = raid10_end_write_request; + mbio->bi_op = op; mbio->bi_rw = - WRITE | do_sync | do_fua | do_discard | do_same; + do_sync | do_fua | do_sec; mbio->bi_private = r10_bio; atomic_inc(&r10_bio->remaining); @@ -1992,7 +1994,7 @@ static void sync_request_write(struct mddev *mddev, struct r10bio *r10_bio) tbio->bi_vcnt = vcnt; tbio->bi_iter.bi_size = fbio->bi_iter.bi_size; - tbio->bi_rw = WRITE; + tbio->bi_op = REQ_OP_WRITE; tbio->bi_private = r10_bio; tbio->bi_iter.bi_sector = r10_bio->devs[i].addr; tbio->bi_end_io = end_sync_write; @@ -2078,7 +2080,7 @@ static void fix_recovery_read_error(struct r10bio *r10_bio) addr, s << 9, bio->bi_io_vec[idx].bv_page, - READ, false); + REQ_OP_READ, 0, false); if (ok) { rdev = conf->mirrors[dw].rdev; addr = r10_bio->devs[1].addr + sect; @@ -2086,7 +2088,7 @@ static void fix_recovery_read_error(struct r10bio *r10_bio) addr, s << 9, bio->bi_io_vec[idx].bv_page, - WRITE, false); + REQ_OP_WRITE, 0, false); if (!ok) { set_bit(WriteErrorSeen, &rdev->flags); if (!test_and_set_bit(WantReplacement, @@ -2213,7 +2215,7 @@ static int r10_sync_page_io(struct md_rdev *rdev, sector_t sector, if (is_badblock(rdev, sector, sectors, &first_bad, &bad_sectors) && (rw == READ || test_bit(WriteErrorSeen, &rdev->flags))) return -1; - if (sync_page_io(rdev, sector, sectors << 9, page, rw, false)) + if (sync_page_io(rdev, sector, sectors << 9, page, rw, 0, false)) /* success */ return 1; if (rw == WRITE) { @@ -2299,7 +2301,8 @@ static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10 r10_bio->devs[sl].addr + sect, s<<9, - conf->tmppage, READ, false); + conf->tmppage, + REQ_OP_READ, 0, false); rdev_dec_pending(rdev, mddev); rcu_read_lock(); if (success) @@ -2474,7 +2477,7 @@ static int narrow_write_error(struct r10bio *r10_bio, int i) choose_data_offset(r10_bio, rdev) + (sector - r10_bio->sector)); wbio->bi_bdev = rdev->bdev; - wbio->bi_rw = WRITE; + wbio->bi_op = REQ_OP_WRITE; if (submit_bio_wait(wbio) < 0) /* Failure! */ @@ -2550,7 +2553,8 @@ read_more: bio->bi_iter.bi_sector = r10_bio->devs[slot].addr + choose_data_offset(r10_bio, rdev); bio->bi_bdev = rdev->bdev; - bio->bi_rw = READ | do_sync; + bio->bi_op = REQ_OP_READ; + bio->bi_rw = do_sync; bio->bi_private = r10_bio; bio->bi_end_io = raid10_end_read_request; if (max_sectors < r10_bio->sectors) { @@ -3040,7 +3044,7 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr, biolist = bio; bio->bi_private = r10_bio; bio->bi_end_io = end_sync_read; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; from_addr = r10_bio->devs[j].addr; bio->bi_iter.bi_sector = from_addr + rdev->data_offset; @@ -3066,7 +3070,7 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr, biolist = bio; bio->bi_private = r10_bio; bio->bi_end_io = end_sync_write; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; bio->bi_iter.bi_sector = to_addr + rdev->data_offset; bio->bi_bdev = rdev->bdev; @@ -3095,7 +3099,7 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr, biolist = bio; bio->bi_private = r10_bio; bio->bi_end_io = end_sync_write; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; bio->bi_iter.bi_sector = to_addr + rdev->data_offset; bio->bi_bdev = rdev->bdev; @@ -3215,7 +3219,7 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr, biolist = bio; bio->bi_private = r10_bio; bio->bi_end_io = end_sync_read; - bio->bi_rw = READ; + bio->bi_op = REQ_OP_READ; bio->bi_iter.bi_sector = sector + conf->mirrors[d].rdev->data_offset; bio->bi_bdev = conf->mirrors[d].rdev->bdev; @@ -3237,7 +3241,7 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr, biolist = bio; bio->bi_private = r10_bio; bio->bi_end_io = end_sync_write; - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; bio->bi_iter.bi_sector = sector + conf->mirrors[d].replacement->data_offset; bio->bi_bdev = conf->mirrors[d].replacement->bdev; @@ -4320,7 +4324,7 @@ read_more: + rdev->data_offset); read_bio->bi_private = r10_bio; read_bio->bi_end_io = end_sync_read; - read_bio->bi_rw = READ; + read_bio->bi_op = REQ_OP_READ; read_bio->bi_flags &= (~0UL << BIO_RESET_BITS); read_bio->bi_error = 0; read_bio->bi_vcnt = 0; @@ -4354,7 +4358,7 @@ read_more: rdev2->new_data_offset; b->bi_private = r10_bio; b->bi_end_io = end_reshape_write; - b->bi_rw = WRITE; + b->bi_op = REQ_OP_WRITE; b->bi_next = blist; blist = b; } @@ -4522,7 +4526,7 @@ static int handle_reshape_read_error(struct mddev *mddev, addr, s << 9, bvec[idx].bv_page, - READ, false); + REQ_OP_READ, 0, false); if (success) break; failed: diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c index 90c2618..56b20c3 100644 --- a/drivers/md/raid5-cache.c +++ b/drivers/md/raid5-cache.c @@ -261,7 +261,7 @@ static struct bio *r5l_bio_alloc(struct r5l_log *log) { struct bio *bio = bio_alloc_bioset(GFP_NOIO, BIO_MAX_PAGES, log->bs); - bio->bi_rw = WRITE; + bio->bi_op = REQ_OP_WRITE; bio->bi_bdev = log->rdev->bdev; bio->bi_iter.bi_sector = log->rdev->data_offset + log->log_start; @@ -686,6 +686,7 @@ void r5l_flush_stripe_to_raid(struct r5l_log *log) bio_reset(&log->flush_bio); log->flush_bio.bi_bdev = log->rdev->bdev; log->flush_bio.bi_end_io = r5l_log_flush_endio; + log->flush_bio.bi_op = REQ_OP_WRITE; log->flush_bio.bi_rw = WRITE_FLUSH; submit_bio(&log->flush_bio); } @@ -882,7 +883,8 @@ static int r5l_read_meta_block(struct r5l_log *log, struct r5l_meta_block *mb; u32 crc, stored_crc; - if (!sync_page_io(log->rdev, ctx->pos, PAGE_SIZE, page, READ, false)) + if (!sync_page_io(log->rdev, ctx->pos, PAGE_SIZE, page, REQ_OP_READ, 0, + false)) return -EIO; mb = page_address(page); @@ -927,7 +929,8 @@ static int r5l_recovery_flush_one_stripe(struct r5l_log *log, &disk_index, sh); sync_page_io(log->rdev, *log_offset, PAGE_SIZE, - sh->dev[disk_index].page, READ, false); + sh->dev[disk_index].page, REQ_OP_READ, 0, + false); sh->dev[disk_index].log_checksum = le32_to_cpu(payload->checksum[0]); set_bit(R5_Wantwrite, &sh->dev[disk_index].flags); @@ -935,7 +938,8 @@ static int r5l_recovery_flush_one_stripe(struct r5l_log *log, } else { disk_index = sh->pd_idx; sync_page_io(log->rdev, *log_offset, PAGE_SIZE, - sh->dev[disk_index].page, READ, false); + sh->dev[disk_index].page, REQ_OP_READ, 0, + false); sh->dev[disk_index].log_checksum = le32_to_cpu(payload->checksum[0]); set_bit(R5_Wantwrite, &sh->dev[disk_index].flags); @@ -945,7 +949,7 @@ static int r5l_recovery_flush_one_stripe(struct r5l_log *log, sync_page_io(log->rdev, r5l_ring_add(log, *log_offset, BLOCK_SECTORS), PAGE_SIZE, sh->dev[disk_index].page, - READ, false); + REQ_OP_READ, 0, false); sh->dev[disk_index].log_checksum = le32_to_cpu(payload->checksum[1]); set_bit(R5_Wantwrite, @@ -987,11 +991,13 @@ static int r5l_recovery_flush_one_stripe(struct r5l_log *log, rdev = rcu_dereference(conf->disks[disk_index].rdev); if (rdev) sync_page_io(rdev, stripe_sect, PAGE_SIZE, - sh->dev[disk_index].page, WRITE, false); + sh->dev[disk_index].page, REQ_OP_WRITE, 0, + false); rrdev = rcu_dereference(conf->disks[disk_index].replacement); if (rrdev) sync_page_io(rrdev, stripe_sect, PAGE_SIZE, - sh->dev[disk_index].page, WRITE, false); + sh->dev[disk_index].page, REQ_OP_WRITE, 0, + false); } raid5_release_stripe(sh); return 0; @@ -1063,7 +1069,8 @@ static int r5l_log_write_empty_meta_block(struct r5l_log *log, sector_t pos, crc = crc32c_le(log->uuid_checksum, mb, PAGE_SIZE); mb->checksum = cpu_to_le32(crc); - if (!sync_page_io(log->rdev, pos, PAGE_SIZE, page, WRITE_FUA, false)) { + if (!sync_page_io(log->rdev, pos, PAGE_SIZE, page, REQ_OP_WRITE, + WRITE_FUA, false)) { __free_page(page); return -EIO; } @@ -1138,7 +1145,7 @@ static int r5l_load_log(struct r5l_log *log) if (!page) return -ENOMEM; - if (!sync_page_io(rdev, cp, PAGE_SIZE, page, READ, false)) { + if (!sync_page_io(rdev, cp, PAGE_SIZE, page, REQ_OP_READ, 0, false)) { ret = -EIO; goto ioerr; } diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 8ab8b65..c36b817 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -806,7 +806,8 @@ static void stripe_add_to_batch_list(struct r5conf *conf, struct stripe_head *sh dd_idx = 0; while (dd_idx == sh->pd_idx || dd_idx == sh->qd_idx) dd_idx++; - if (head->dev[dd_idx].towrite->bi_rw != sh->dev[dd_idx].towrite->bi_rw) + if (head->dev[dd_idx].towrite->bi_rw != sh->dev[dd_idx].towrite->bi_rw || + head->dev[dd_idx].towrite->bi_op != sh->dev[dd_idx].towrite->bi_op) goto unlock_out; if (head->batch_head) { @@ -891,29 +892,32 @@ static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s) if (r5l_write_stripe(conf->log, sh) == 0) return; for (i = disks; i--; ) { - int rw; + int op; + int op_flags = 0; int replace_only = 0; struct bio *bi, *rbi; struct md_rdev *rdev, *rrdev = NULL; sh = head_sh; if (test_and_clear_bit(R5_Wantwrite, &sh->dev[i].flags)) { - if (test_and_clear_bit(R5_WantFUA, &sh->dev[i].flags)) - rw = WRITE_FUA; - else - rw = WRITE; + if (test_and_clear_bit(R5_WantFUA, &sh->dev[i].flags)) { + op = REQ_OP_WRITE; + op_flags = WRITE_FUA; + } else { + op = REQ_OP_WRITE; + } if (test_bit(R5_Discard, &sh->dev[i].flags)) - rw |= REQ_DISCARD; + op = REQ_OP_DISCARD; } else if (test_and_clear_bit(R5_Wantread, &sh->dev[i].flags)) - rw = READ; + op = REQ_OP_READ; else if (test_and_clear_bit(R5_WantReplace, &sh->dev[i].flags)) { - rw = WRITE; + op = REQ_OP_WRITE; replace_only = 1; } else continue; if (test_and_clear_bit(R5_SyncIO, &sh->dev[i].flags)) - rw |= REQ_SYNC; + op_flags |= REQ_SYNC; again: bi = &sh->dev[i].req; @@ -927,7 +931,7 @@ again: rdev = rrdev; rrdev = NULL; } - if (rw & WRITE) { + if (op_is_write(op)) { if (replace_only) rdev = NULL; if (rdev == rrdev) @@ -953,7 +957,7 @@ again: * need to check for writes. We never accept write errors * on the replacement, so we don't to check rrdev. */ - while ((rw & WRITE) && rdev && + while (op_is_write(op) && rdev && test_bit(WriteErrorSeen, &rdev->flags)) { sector_t first_bad; int bad_sectors; @@ -995,8 +999,9 @@ again: bio_reset(bi); bi->bi_bdev = rdev->bdev; - bi->bi_rw = rw; - bi->bi_end_io = (rw & WRITE) + bi->bi_op = op; + bi->bi_rw = op_flags; + bi->bi_end_io = op_is_write(op) ? raid5_end_write_request : raid5_end_read_request; bi->bi_private = sh; @@ -1027,7 +1032,7 @@ again: * If this is discard request, set bi_vcnt 0. We don't * want to confuse SCSI because SCSI will replace payload */ - if (rw & REQ_DISCARD) + if (op == REQ_OP_DISCARD) bi->bi_vcnt = 0; if (rrdev) set_bit(R5_DOUBLE_LOCKED, &sh->dev[i].flags); @@ -1047,8 +1052,9 @@ again: bio_reset(rbi); rbi->bi_bdev = rrdev->bdev; - rbi->bi_rw = rw; - BUG_ON(!(rw & WRITE)); + rbi->bi_op = op; + rbi->bi_rw = op_flags; + BUG_ON(!op_is_write(op)); rbi->bi_end_io = raid5_end_write_request; rbi->bi_private = sh; @@ -1076,7 +1082,7 @@ again: * If this is discard request, set bi_vcnt 0. We don't * want to confuse SCSI because SCSI will replace payload */ - if (rw & REQ_DISCARD) + if (op == REQ_OP_DISCARD) rbi->bi_vcnt = 0; if (conf->mddev->gendisk) trace_block_bio_remap(bdev_get_queue(rbi->bi_bdev), @@ -1085,7 +1091,7 @@ again: generic_make_request(rbi); } if (!rdev && !rrdev) { - if (rw & WRITE) + if (op_is_write(op)) set_bit(STRIPE_DEGRADED, &sh->state); pr_debug("skip op %ld on disc %d for sector %llu\n", bi->bi_rw, i, (unsigned long long)sh->sector); @@ -1623,7 +1629,7 @@ again: set_bit(R5_WantFUA, &dev->flags); if (wbi->bi_rw & REQ_SYNC) set_bit(R5_SyncIO, &dev->flags); - if (wbi->bi_rw & REQ_DISCARD) + if (wbi->bi_op == REQ_OP_DISCARD) set_bit(R5_Discard, &dev->flags); else { tx = async_copy_data(1, wbi, &dev->page, @@ -5178,7 +5184,7 @@ static void raid5_make_request(struct mddev *mddev, struct bio * bi) return; } - if (unlikely(bi->bi_rw & REQ_DISCARD)) { + if (unlikely(bi->bi_op == REQ_OP_DISCARD)) { make_discard_request(mddev, bi); return; } -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:17:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1F7707CB8 for ; Fri, 15 Apr 2016 14:17:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D7CC5304032 for ; Fri, 15 Apr 2016 12:17:18 -0700 (PDT) X-ASG-Debug-ID: 1460747837-04cbb02e1d3164e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id rycijZ8brzJcLk6N (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:17 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E30B8C01AA22; Fri, 15 Apr 2016 19:17:16 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIho007872; Fri, 15 Apr 2016 15:17:14 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 24/42] xen: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 14:15:59 -0500 X-ASG-Orig-Subj: [PATCH 24/42] xen: set bi_op to REQ_OP Message-Id: <1460747777-8479-25-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747837 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has the xen block driver use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/block/xen-blkback/blkback.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c index 79fe493..854ecca 100644 --- a/drivers/block/xen-blkback/blkback.c +++ b/drivers/block/xen-blkback/blkback.c @@ -501,7 +501,7 @@ static int xen_vbd_translate(struct phys_req *req, struct xen_blkif *blkif, struct xen_vbd *vbd = &blkif->vbd; int rc = -EACCES; - if ((operation != READ) && vbd->readonly) + if ((operation != REQ_OP_READ) && vbd->readonly) goto out; if (likely(req->nr_sects)) { @@ -1014,7 +1014,7 @@ static int dispatch_discard_io(struct xen_blkif_ring *ring, preq.sector_number = req->u.discard.sector_number; preq.nr_sects = req->u.discard.nr_sectors; - err = xen_vbd_translate(&preq, blkif, WRITE); + err = xen_vbd_translate(&preq, blkif, REQ_OP_WRITE); if (err) { pr_warn("access denied: DISCARD [%llu->%llu] on dev=%04x\n", preq.sector_number, @@ -1229,6 +1229,7 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, struct bio **biolist = pending_req->biolist; int i, nbio = 0; int operation; + int operation_flags = 0; struct blk_plug plug; bool drain = false; struct grant_page **pages = pending_req->segments; @@ -1247,17 +1248,19 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, switch (req_operation) { case BLKIF_OP_READ: ring->st_rd_req++; - operation = READ; + operation = REQ_OP_READ; break; case BLKIF_OP_WRITE: ring->st_wr_req++; - operation = WRITE_ODIRECT; + operation = REQ_OP_WRITE; + operation_flags = WRITE_ODIRECT; break; case BLKIF_OP_WRITE_BARRIER: drain = true; case BLKIF_OP_FLUSH_DISKCACHE: ring->st_f_req++; - operation = WRITE_FLUSH; + operation = REQ_OP_WRITE; + operation_flags = WRITE_FLUSH; break; default: operation = 0; /* make gcc happy */ @@ -1269,7 +1272,7 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, nseg = req->operation == BLKIF_OP_INDIRECT ? req->u.indirect.nr_segments : req->u.rw.nr_segments; - if (unlikely(nseg == 0 && operation != WRITE_FLUSH) || + if (unlikely(nseg == 0 && operation_flags != WRITE_FLUSH) || unlikely((req->operation != BLKIF_OP_INDIRECT) && (nseg > BLKIF_MAX_SEGMENTS_PER_REQUEST)) || unlikely((req->operation == BLKIF_OP_INDIRECT) && @@ -1310,7 +1313,7 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, if (xen_vbd_translate(&preq, ring->blkif, operation) != 0) { pr_debug("access denied: %s of [%llu,%llu] on dev=%04x\n", - operation == READ ? "read" : "write", + operation == REQ_OP_READ ? "read" : "write", preq.sector_number, preq.sector_number + preq.nr_sects, ring->blkif->vbd.pdevice); @@ -1369,7 +1372,8 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, bio->bi_private = pending_req; bio->bi_end_io = end_block_io_op; bio->bi_iter.bi_sector = preq.sector_number; - bio->bi_rw = operation; + bio->bi_op = operation; + bio->bi_rw = operation_flags; } preq.sector_number += seg[i].nsec; @@ -1377,7 +1381,7 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, /* This will be hit if the operation was a flush or discard. */ if (!bio) { - BUG_ON(operation != WRITE_FLUSH); + BUG_ON(operation_flags != WRITE_FLUSH); bio = bio_alloc(GFP_KERNEL, 0); if (unlikely(bio == NULL)) @@ -1387,7 +1391,8 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, bio->bi_bdev = preq.bdev; bio->bi_private = pending_req; bio->bi_end_io = end_block_io_op; - bio->bi_rw = operation; + bio->bi_op = operation; + bio->bi_rw = operation_flags; } atomic_set(&pending_req->pendcnt, nbio); @@ -1399,9 +1404,9 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, /* Let the I/Os go.. */ blk_finish_plug(&plug); - if (operation == READ) + if (operation == REQ_OP_READ) ring->st_rd_sect += preq.nr_sects; - else if (operation & WRITE) + else if (operation == REQ_OP_WRITE) ring->st_wr_sect += preq.nr_sects; return 0; -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:17:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 737A57CD3 for ; Fri, 15 Apr 2016 14:17:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DAE9BAC002 for ; Fri, 15 Apr 2016 12:17:20 -0700 (PDT) X-ASG-Debug-ID: 1460747839-04cbb02e1a3164e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BWKblN99oPiZavlA (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:19 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 284F281123; Fri, 15 Apr 2016 19:17:19 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhp007872; Fri, 15 Apr 2016 15:17:16 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 25/42] target: set bi_op to REQ_OP Date: Fri, 15 Apr 2016 14:16:00 -0500 X-ASG-Orig-Subj: [PATCH 25/42] target: set bi_op to REQ_OP Message-Id: <1460747777-8479-26-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747839 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has the target modules use bio->bi_op for REQ_OPs and rq_flag_bits to bio->bi_rw. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke Acked-by: Nicholas Bellinger --- drivers/target/target_core_iblock.c | 30 +++++++++++++++--------------- drivers/target/target_core_pscsi.c | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c index c25109c..5e60dbc 100644 --- a/drivers/target/target_core_iblock.c +++ b/drivers/target/target_core_iblock.c @@ -312,7 +312,8 @@ static void iblock_bio_done(struct bio *bio) } static struct bio * -iblock_get_bio(struct se_cmd *cmd, sector_t lba, u32 sg_num, int rw) +iblock_get_bio(struct se_cmd *cmd, sector_t lba, u32 sg_num, int op, + int op_flags) { struct iblock_dev *ib_dev = IBLOCK_DEV(cmd->se_dev); struct bio *bio; @@ -334,7 +335,8 @@ iblock_get_bio(struct se_cmd *cmd, sector_t lba, u32 sg_num, int rw) bio->bi_private = cmd; bio->bi_end_io = &iblock_bio_done; bio->bi_iter.bi_sector = lba; - bio->bi_rw = rw; + bio->bi_op = op; + bio->bi_rw = op_flags; return bio; } @@ -480,7 +482,7 @@ iblock_execute_write_same(struct se_cmd *cmd) goto fail; cmd->priv = ibr; - bio = iblock_get_bio(cmd, block_lba, 1, WRITE); + bio = iblock_get_bio(cmd, block_lba, 1, REQ_OP_WRITE, 0); if (!bio) goto fail_free_ibr; @@ -493,7 +495,8 @@ iblock_execute_write_same(struct se_cmd *cmd) while (bio_add_page(bio, sg_page(sg), sg->length, sg->offset) != sg->length) { - bio = iblock_get_bio(cmd, block_lba, 1, WRITE); + bio = iblock_get_bio(cmd, block_lba, 1, REQ_OP_WRITE, + 0); if (!bio) goto fail_put_bios; @@ -679,8 +682,7 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, struct scatterlist *sg; u32 sg_num = sgl_nents; unsigned bio_cnt; - int rw = 0; - int i; + int i, op, op_flags = 0; if (data_direction == DMA_TO_DEVICE) { struct iblock_dev *ib_dev = IBLOCK_DEV(dev); @@ -689,18 +691,15 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, * Force writethrough using WRITE_FUA if a volatile write cache * is not enabled, or if initiator set the Force Unit Access bit. */ + op = REQ_OP_WRITE; if (test_bit(QUEUE_FLAG_FUA, &q->queue_flags)) { if (cmd->se_cmd_flags & SCF_FUA) - rw = WRITE_FUA; + op_flags = WRITE_FUA; else if (!test_bit(QUEUE_FLAG_WC, &q->queue_flags)) - rw = WRITE_FUA; - else - rw = WRITE; - } else { - rw = WRITE; + op_flags = WRITE_FUA; } } else { - rw = READ; + op = REQ_OP_READ; } ibr = kzalloc(sizeof(struct iblock_req), GFP_KERNEL); @@ -714,7 +713,7 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, return 0; } - bio = iblock_get_bio(cmd, block_lba, sgl_nents, rw); + bio = iblock_get_bio(cmd, block_lba, sgl_nents, op, op_flags); if (!bio) goto fail_free_ibr; @@ -738,7 +737,8 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, bio_cnt = 0; } - bio = iblock_get_bio(cmd, block_lba, sg_num, rw); + bio = iblock_get_bio(cmd, block_lba, sg_num, op, + op_flags); if (!bio) goto fail_put_bios; diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c index de18790..2cf915c 100644 --- a/drivers/target/target_core_pscsi.c +++ b/drivers/target/target_core_pscsi.c @@ -922,7 +922,7 @@ pscsi_map_sg(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, goto fail; if (rw) - bio->bi_rw |= REQ_WRITE; + bio->bi_op = REQ_OP_WRITE; pr_debug("PSCSI: Allocated bio: %p," " dir: %s nr_vecs: %d\n", bio, -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:17:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 205C67D22 for ; Fri, 15 Apr 2016 14:17:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D42AF304032 for ; Fri, 15 Apr 2016 12:17:22 -0700 (PDT) X-ASG-Debug-ID: 1460747841-04bdf01105610770001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xMGPRhAFthweLUno (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:21 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 72AC013A60; Fri, 15 Apr 2016 19:17:21 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhq007872; Fri, 15 Apr 2016 15:17:19 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 26/42] block: copy bio op to request op Date: Fri, 15 Apr 2016 14:16:01 -0500 X-ASG-Orig-Subj: [PATCH 26/42] block: copy bio op to request op Message-Id: <1460747777-8479-27-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747841 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie The bio users should now always be setting up the bio->bi_op. This patch has us copy that to the struct request op field. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- block/blk-core.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/block/blk-core.c b/block/blk-core.c index 3b238ef..94736c3 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -2991,6 +2991,7 @@ void blk_rq_bio_prep(struct request_queue *q, struct request *rq, { /* tmp compat. Allow users to set bi_op or bi_rw */ rq->cmd_flags |= bio_data_dir(bio); + rq->op = bio->bi_op; if (bio_has_data(bio)) rq->nr_phys_segments = bio_phys_segments(q, bio); @@ -3075,6 +3076,7 @@ EXPORT_SYMBOL_GPL(blk_rq_unprep_clone); static void __blk_rq_prep_clone(struct request *dst, struct request *src) { dst->cpu = src->cpu; + dst->op = src->op; dst->cmd_flags |= (src->cmd_flags & REQ_CLONE_MASK) | REQ_NOMERGE; dst->cmd_type = src->cmd_type; dst->__sector = blk_rq_pos(src); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:17:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9A6D27CDD for ; Fri, 15 Apr 2016 14:17:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 00C3EAC004 for ; Fri, 15 Apr 2016 12:17:25 -0700 (PDT) X-ASG-Debug-ID: 1460747843-04cbb02e1d316510001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id WSdd31yt7EcOCi8I (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:24 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B905A8F512; Fri, 15 Apr 2016 19:17:23 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhr007872; Fri, 15 Apr 2016 15:17:21 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 27/42] block: prepare request creation/destruction code to use REQ_OPs Date: Fri, 15 Apr 2016 14:16:02 -0500 X-ASG-Orig-Subj: [PATCH 27/42] block: prepare request creation/destruction code to use REQ_OPs Message-Id: <1460747777-8479-28-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747844 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch prepares *_get_request/*_put_request and freed_request, to use separate variables for the operation and flags. In the next patches the struct request users will be converted like was done for bios. request->op will be used for the REQ_OP and request->cmd_flags for the rq_flag_bits. There is some temporary compat code in __get_request to allow users to read the operation from the cmd_flags. This will be deleted in one of the last patches when all drivers have been converted. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- block/blk-core.c | 56 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index 94736c3..3168962 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -959,10 +959,10 @@ static void __freed_request(struct request_list *rl, int sync) * A request has just been released. Account for it, update the full and * congestion status, wake up any waiters. Called under q->queue_lock. */ -static void freed_request(struct request_list *rl, unsigned int flags) +static void freed_request(struct request_list *rl, int op, unsigned int flags) { struct request_queue *q = rl->q; - int sync = rw_is_sync(flags); + int sync = rw_is_sync(op | flags); q->nr_rqs[sync]--; rl->count[sync]--; @@ -1054,7 +1054,8 @@ static struct io_context *rq_ioc(struct bio *bio) /** * __get_request - get a free request * @rl: request list to allocate from - * @rw_flags: RW and SYNC flags + * @op: REQ_OP_READ/REQ_OP_WRITE + * @op_flags: rq_flag_bits * @bio: bio to allocate request for (can be %NULL) * @gfp_mask: allocation mask * @@ -1065,21 +1066,22 @@ static struct io_context *rq_ioc(struct bio *bio) * Returns ERR_PTR on failure, with @q->queue_lock held. * Returns request pointer on success, with @q->queue_lock *not held*. */ -static struct request *__get_request(struct request_list *rl, int rw_flags, - struct bio *bio, gfp_t gfp_mask) +static struct request *__get_request(struct request_list *rl, int op, + int op_flags, struct bio *bio, + gfp_t gfp_mask) { struct request_queue *q = rl->q; struct request *rq; struct elevator_type *et = q->elevator->type; struct io_context *ioc = rq_ioc(bio); struct io_cq *icq = NULL; - const bool is_sync = rw_is_sync(rw_flags) != 0; + const bool is_sync = rw_is_sync(op | op_flags) != 0; int may_queue; if (unlikely(blk_queue_dying(q))) return ERR_PTR(-ENODEV); - may_queue = elv_may_queue(q, rw_flags); + may_queue = elv_may_queue(q, op | op_flags); if (may_queue == ELV_MQUEUE_NO) goto rq_starved; @@ -1123,7 +1125,7 @@ static struct request *__get_request(struct request_list *rl, int rw_flags, /* * Decide whether the new request will be managed by elevator. If - * so, mark @rw_flags and increment elvpriv. Non-zero elvpriv will + * so, mark @op_flags and increment elvpriv. Non-zero elvpriv will * prevent the current elevator from being destroyed until the new * request is freed. This guarantees icq's won't be destroyed and * makes creating new ones safe. @@ -1132,14 +1134,14 @@ static struct request *__get_request(struct request_list *rl, int rw_flags, * it will be created after releasing queue_lock. */ if (blk_rq_should_init_elevator(bio) && !blk_queue_bypass(q)) { - rw_flags |= REQ_ELVPRIV; + op_flags |= REQ_ELVPRIV; q->nr_rqs_elvpriv++; if (et->icq_cache && ioc) icq = ioc_lookup_icq(ioc, q); } if (blk_queue_io_stat(q)) - rw_flags |= REQ_IO_STAT; + op_flags |= REQ_IO_STAT; spin_unlock_irq(q->queue_lock); /* allocate and init request */ @@ -1149,10 +1151,12 @@ static struct request *__get_request(struct request_list *rl, int rw_flags, blk_rq_init(q, rq); blk_rq_set_rl(rq, rl); - rq->cmd_flags = rw_flags | REQ_ALLOCED; + /* tmp compat - allow users to check either one for the op */ + rq->cmd_flags = op | op_flags | REQ_ALLOCED; + rq->op = op; /* init elvpriv */ - if (rw_flags & REQ_ELVPRIV) { + if (op_flags & REQ_ELVPRIV) { if (unlikely(et->icq_cache && !icq)) { if (ioc) icq = ioc_create_icq(ioc, q, gfp_mask); @@ -1178,7 +1182,7 @@ out: if (ioc_batching(q, ioc)) ioc->nr_batch_requests--; - trace_block_getrq(q, bio, rw_flags & 1); + trace_block_getrq(q, bio, op); return rq; fail_elvpriv: @@ -1208,7 +1212,7 @@ fail_alloc: * queue, but this is pretty rare. */ spin_lock_irq(q->queue_lock); - freed_request(rl, rw_flags); + freed_request(rl, op, op_flags); /* * in the very unlikely event that allocation failed and no @@ -1226,7 +1230,8 @@ rq_starved: /** * get_request - get a free request * @q: request_queue to allocate request from - * @rw_flags: RW and SYNC flags + * @op: REQ_OP_READ/REQ_OP_WRITE + * @op_flags: rq_flag_bits * @bio: bio to allocate request for (can be %NULL) * @gfp_mask: allocation mask * @@ -1237,17 +1242,18 @@ rq_starved: * Returns ERR_PTR on failure, with @q->queue_lock held. * Returns request pointer on success, with @q->queue_lock *not held*. */ -static struct request *get_request(struct request_queue *q, int rw_flags, - struct bio *bio, gfp_t gfp_mask) +static struct request *get_request(struct request_queue *q, int op, + int op_flags, struct bio *bio, + gfp_t gfp_mask) { - const bool is_sync = rw_is_sync(rw_flags) != 0; + const bool is_sync = rw_is_sync(op | op_flags) != 0; DEFINE_WAIT(wait); struct request_list *rl; struct request *rq; rl = blk_get_rl(q, bio); /* transferred to @rq on success */ retry: - rq = __get_request(rl, rw_flags, bio, gfp_mask); + rq = __get_request(rl, op, op_flags, bio, gfp_mask); if (!IS_ERR(rq)) return rq; @@ -1260,7 +1266,7 @@ retry: prepare_to_wait_exclusive(&rl->wait[is_sync], &wait, TASK_UNINTERRUPTIBLE); - trace_block_sleeprq(q, bio, rw_flags & 1); + trace_block_sleeprq(q, bio, op); spin_unlock_irq(q->queue_lock); io_schedule(); @@ -1289,7 +1295,7 @@ static struct request *blk_old_get_request(struct request_queue *q, int rw, create_io_context(gfp_mask, q->node); spin_lock_irq(q->queue_lock); - rq = get_request(q, rw, NULL, gfp_mask); + rq = get_request(q, rw, 0, NULL, gfp_mask); if (IS_ERR(rq)) spin_unlock_irq(q->queue_lock); /* q->queue_lock is unlocked at this point */ @@ -1491,13 +1497,14 @@ void __blk_put_request(struct request_queue *q, struct request *req) */ if (req->cmd_flags & REQ_ALLOCED) { unsigned int flags = req->cmd_flags; + int op = req->op; struct request_list *rl = blk_rq_rl(req); BUG_ON(!list_empty(&req->queuelist)); BUG_ON(ELV_ON_HASH(req)); blk_free_request(rl, req); - freed_request(rl, flags); + freed_request(rl, op, flags); blk_put_rl(rl); } } @@ -1713,7 +1720,7 @@ static blk_qc_t blk_queue_bio(struct request_queue *q, struct bio *bio) { const bool sync = !!(bio->bi_rw & REQ_SYNC); struct blk_plug *plug; - int el_ret, rw_flags, where = ELEVATOR_INSERT_SORT; + int el_ret, rw_flags = 0, where = ELEVATOR_INSERT_SORT; struct request *req; unsigned int request_count = 0; @@ -1773,7 +1780,6 @@ get_rq: * but we need to set it earlier to expose the sync flag to the * rq allocator and io schedulers. */ - rw_flags = bio_data_dir(bio); if (sync) rw_flags |= REQ_SYNC; @@ -1781,7 +1787,7 @@ get_rq: * Grab a free request. This is might sleep but can not fail. * Returns with the queue unlocked. */ - req = get_request(q, rw_flags, bio, GFP_NOIO); + req = get_request(q, bio_data_dir(bio), rw_flags, bio, GFP_NOIO); if (IS_ERR(req)) { bio->bi_error = PTR_ERR(req); bio_endio(bio); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:17:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 405FD7D0F for ; Fri, 15 Apr 2016 14:17:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 12FE38F8037 for ; Fri, 15 Apr 2016 12:17:28 -0700 (PDT) X-ASG-Debug-ID: 1460747846-04cb6c24626412a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ktEa8fY0mf3ehvf7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:26 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1066A8553D; Fri, 15 Apr 2016 19:17:26 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhs007872; Fri, 15 Apr 2016 15:17:23 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 28/42] block: prepare mq request creation to use REQ_OPs Date: Fri, 15 Apr 2016 14:16:03 -0500 X-ASG-Orig-Subj: [PATCH 28/42] block: prepare mq request creation to use REQ_OPs Message-Id: <1460747777-8479-29-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747846 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch modifies the blk mq request creation code to use separate variables for the operation and flags, because in the the next patches the struct request users will be converted like was done for bios. request->op will be used for the REQ_OP and request->cmd_flags for the rq_flag_bits. Like the non mq patch there is some temporary compat code in blk_mq_rq_ctx_init to allow users to read the operation from the cmd_flags. This will be deleted in one of the last patches when all drivers have been converted. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- block/blk-mq.c | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/block/blk-mq.c b/block/blk-mq.c index 1699baf..4843c0b 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -159,16 +159,19 @@ bool blk_mq_can_queue(struct blk_mq_hw_ctx *hctx) EXPORT_SYMBOL(blk_mq_can_queue); static void blk_mq_rq_ctx_init(struct request_queue *q, struct blk_mq_ctx *ctx, - struct request *rq, unsigned int rw_flags) + struct request *rq, int op, + unsigned int op_flags) { if (blk_queue_io_stat(q)) - rw_flags |= REQ_IO_STAT; + op_flags |= REQ_IO_STAT; INIT_LIST_HEAD(&rq->queuelist); /* csd/requeue_work/fifo_time is initialized before use */ rq->q = q; rq->mq_ctx = ctx; - rq->cmd_flags |= rw_flags; + rq->op = op; + /* tmp compat - allow users to check either one for the op */ + rq->cmd_flags |= op | op_flags; /* do not touch atomic flags, it needs atomic ops against the timer */ rq->cpu = -1; INIT_HLIST_NODE(&rq->hash); @@ -203,11 +206,11 @@ static void blk_mq_rq_ctx_init(struct request_queue *q, struct blk_mq_ctx *ctx, rq->end_io_data = NULL; rq->next_rq = NULL; - ctx->rq_dispatched[rw_is_sync(rw_flags)]++; + ctx->rq_dispatched[rw_is_sync(op | op_flags)]++; } static struct request * -__blk_mq_alloc_request(struct blk_mq_alloc_data *data, int rw) +__blk_mq_alloc_request(struct blk_mq_alloc_data *data, int op, int op_flags) { struct request *rq; unsigned int tag; @@ -222,7 +225,7 @@ __blk_mq_alloc_request(struct blk_mq_alloc_data *data, int rw) } rq->tag = tag; - blk_mq_rq_ctx_init(data->q, data->ctx, rq, rw); + blk_mq_rq_ctx_init(data->q, data->ctx, rq, op, op_flags); return rq; } @@ -246,7 +249,7 @@ struct request *blk_mq_alloc_request(struct request_queue *q, int rw, hctx = q->mq_ops->map_queue(q, ctx->cpu); blk_mq_set_alloc_data(&alloc_data, q, flags, ctx, hctx); - rq = __blk_mq_alloc_request(&alloc_data, rw); + rq = __blk_mq_alloc_request(&alloc_data, rw, 0); if (!rq && !(flags & BLK_MQ_REQ_NOWAIT)) { __blk_mq_run_hw_queue(hctx); blk_mq_put_ctx(ctx); @@ -254,7 +257,7 @@ struct request *blk_mq_alloc_request(struct request_queue *q, int rw, ctx = blk_mq_get_ctx(q); hctx = q->mq_ops->map_queue(q, ctx->cpu); blk_mq_set_alloc_data(&alloc_data, q, flags, ctx, hctx); - rq = __blk_mq_alloc_request(&alloc_data, rw); + rq = __blk_mq_alloc_request(&alloc_data, rw, 0); ctx = alloc_data.ctx; } blk_mq_put_ctx(ctx); @@ -1170,28 +1173,29 @@ static struct request *blk_mq_map_request(struct request_queue *q, struct blk_mq_hw_ctx *hctx; struct blk_mq_ctx *ctx; struct request *rq; - int rw = bio_data_dir(bio); + int op = bio_data_dir(bio); + int op_flags = 0; struct blk_mq_alloc_data alloc_data; blk_queue_enter_live(q); ctx = blk_mq_get_ctx(q); hctx = q->mq_ops->map_queue(q, ctx->cpu); - if (rw_is_sync(bio->bi_rw)) - rw |= REQ_SYNC; + if (rw_is_sync(bio->bi_op | bio->bi_rw)) + op_flags |= REQ_SYNC; - trace_block_getrq(q, bio, rw); + trace_block_getrq(q, bio, op); blk_mq_set_alloc_data(&alloc_data, q, BLK_MQ_REQ_NOWAIT, ctx, hctx); - rq = __blk_mq_alloc_request(&alloc_data, rw); + rq = __blk_mq_alloc_request(&alloc_data, op, op_flags); if (unlikely(!rq)) { __blk_mq_run_hw_queue(hctx); blk_mq_put_ctx(ctx); - trace_block_sleeprq(q, bio, rw); + trace_block_sleeprq(q, bio, op); ctx = blk_mq_get_ctx(q); hctx = q->mq_ops->map_queue(q, ctx->cpu); blk_mq_set_alloc_data(&alloc_data, q, 0, ctx, hctx); - rq = __blk_mq_alloc_request(&alloc_data, rw); + rq = __blk_mq_alloc_request(&alloc_data, op, op_flags); ctx = alloc_data.ctx; hctx = alloc_data.hctx; } @@ -1245,7 +1249,7 @@ static int blk_mq_direct_issue_request(struct request *rq, blk_qc_t *cookie) */ static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio) { - const int is_sync = rw_is_sync(bio->bi_rw); + const int is_sync = rw_is_sync(bio->bi_op | bio->bi_rw); const int is_flush_fua = bio->bi_rw & (REQ_FLUSH | REQ_FUA); struct blk_map_ctx data; struct request *rq; @@ -1342,7 +1346,7 @@ done: */ static blk_qc_t blk_sq_make_request(struct request_queue *q, struct bio *bio) { - const int is_sync = rw_is_sync(bio->bi_rw); + const int is_sync = rw_is_sync(bio->bi_op | bio->bi_rw); const int is_flush_fua = bio->bi_rw & (REQ_FLUSH | REQ_FUA); struct blk_plug *plug; unsigned int request_count = 0; -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:17:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 400DD7D30 for ; Fri, 15 Apr 2016 14:17:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E32678F8033 for ; Fri, 15 Apr 2016 12:17:29 -0700 (PDT) X-ASG-Debug-ID: 1460747848-04bdf011036107c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id EvctP9BNJ6yMoT2A (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:28 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5DB573B75A; Fri, 15 Apr 2016 19:17:28 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIht007872; Fri, 15 Apr 2016 15:17:26 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 29/42] block: prepare elevator to use REQ_OPs. Date: Fri, 15 Apr 2016 14:16:04 -0500 X-ASG-Orig-Subj: [PATCH 29/42] block: prepare elevator to use REQ_OPs. Message-Id: <1460747777-8479-30-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747848 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch converts the elevator code to use separate variables for the operation and flags, and to check request->op for the REQ_OP. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- block/blk-core.c | 2 +- block/cfq-iosched.c | 4 ++-- block/elevator.c | 7 +++---- include/linux/elevator.h | 4 ++-- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index 3168962..a796b35 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1081,7 +1081,7 @@ static struct request *__get_request(struct request_list *rl, int op, if (unlikely(blk_queue_dying(q))) return ERR_PTR(-ENODEV); - may_queue = elv_may_queue(q, op | op_flags); + may_queue = elv_may_queue(q, op, op_flags); if (may_queue == ELV_MQUEUE_NO) goto rq_starved; diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 4a34978..3fcc598 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c @@ -4285,7 +4285,7 @@ static inline int __cfq_may_queue(struct cfq_queue *cfqq) return ELV_MQUEUE_MAY; } -static int cfq_may_queue(struct request_queue *q, int rw) +static int cfq_may_queue(struct request_queue *q, int op, int op_flags) { struct cfq_data *cfqd = q->elevator->elevator_data; struct task_struct *tsk = current; @@ -4302,7 +4302,7 @@ static int cfq_may_queue(struct request_queue *q, int rw) if (!cic) return ELV_MQUEUE_MAY; - cfqq = cic_to_cfqq(cic, rw_is_sync(rw)); + cfqq = cic_to_cfqq(cic, rw_is_sync(op | op_flags)); if (cfqq) { cfq_init_prio_data(cfqq, cic); diff --git a/block/elevator.c b/block/elevator.c index c3555c9..6a282bf 100644 --- a/block/elevator.c +++ b/block/elevator.c @@ -366,8 +366,7 @@ void elv_dispatch_sort(struct request_queue *q, struct request *rq) list_for_each_prev(entry, &q->queue_head) { struct request *pos = list_entry_rq(entry); - if ((rq->cmd_flags & REQ_DISCARD) != - (pos->cmd_flags & REQ_DISCARD)) + if ((rq->op == REQ_OP_DISCARD) != (pos->op == REQ_OP_DISCARD)) break; if (rq_data_dir(rq) != rq_data_dir(pos)) break; @@ -717,12 +716,12 @@ void elv_put_request(struct request_queue *q, struct request *rq) e->type->ops.elevator_put_req_fn(rq); } -int elv_may_queue(struct request_queue *q, int rw) +int elv_may_queue(struct request_queue *q, int op, int op_flags) { struct elevator_queue *e = q->elevator; if (e->type->ops.elevator_may_queue_fn) - return e->type->ops.elevator_may_queue_fn(q, rw); + return e->type->ops.elevator_may_queue_fn(q, op, op_flags); return ELV_MQUEUE_MAY; } diff --git a/include/linux/elevator.h b/include/linux/elevator.h index 638b324..953d286 100644 --- a/include/linux/elevator.h +++ b/include/linux/elevator.h @@ -26,7 +26,7 @@ typedef int (elevator_dispatch_fn) (struct request_queue *, int); typedef void (elevator_add_req_fn) (struct request_queue *, struct request *); typedef struct request *(elevator_request_list_fn) (struct request_queue *, struct request *); typedef void (elevator_completed_req_fn) (struct request_queue *, struct request *); -typedef int (elevator_may_queue_fn) (struct request_queue *, int); +typedef int (elevator_may_queue_fn) (struct request_queue *, int, int); typedef void (elevator_init_icq_fn) (struct io_cq *); typedef void (elevator_exit_icq_fn) (struct io_cq *); @@ -134,7 +134,7 @@ extern struct request *elv_former_request(struct request_queue *, struct request extern struct request *elv_latter_request(struct request_queue *, struct request *); extern int elv_register_queue(struct request_queue *q); extern void elv_unregister_queue(struct request_queue *q); -extern int elv_may_queue(struct request_queue *, int); +extern int elv_may_queue(struct request_queue *, int, int); extern void elv_completed_request(struct request_queue *, struct request *); extern int elv_set_request(struct request_queue *q, struct request *rq, struct bio *bio, gfp_t gfp_mask); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:17:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2E0677D2C for ; Fri, 15 Apr 2016 14:17:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 00DDC304032 for ; Fri, 15 Apr 2016 12:17:32 -0700 (PDT) X-ASG-Debug-ID: 1460747850-04cb6c24606412d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id OCpCsUPdN3dULNUf (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:31 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 99C32C049D52; Fri, 15 Apr 2016 19:17:30 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhu007872; Fri, 15 Apr 2016 15:17:28 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 30/42] blkg_rwstat: separate op from flags Date: Fri, 15 Apr 2016 14:16:05 -0500 X-ASG-Orig-Subj: [PATCH 30/42] blkg_rwstat: separate op from flags Message-Id: <1460747777-8479-31-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747851 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie The bio and request operation and flags are going to be separate definitions, so we cannot pass them in as a bitmap. This patch converts the blkg_rwstat code and its caller, cfq, to pass in the values separately. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- block/cfq-iosched.c | 49 +++++++++++++++++++++++++++------------------- include/linux/blk-cgroup.h | 13 ++++++------ 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 3fcc598..0dfa2dd 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c @@ -667,9 +667,10 @@ static inline void cfqg_put(struct cfq_group *cfqg) } while (0) static inline void cfqg_stats_update_io_add(struct cfq_group *cfqg, - struct cfq_group *curr_cfqg, int rw) + struct cfq_group *curr_cfqg, int op, + int op_flags) { - blkg_rwstat_add(&cfqg->stats.queued, rw, 1); + blkg_rwstat_add(&cfqg->stats.queued, op, op_flags, 1); cfqg_stats_end_empty_time(&cfqg->stats); cfqg_stats_set_start_group_wait_time(cfqg, curr_cfqg); } @@ -683,26 +684,30 @@ static inline void cfqg_stats_update_timeslice_used(struct cfq_group *cfqg, #endif } -static inline void cfqg_stats_update_io_remove(struct cfq_group *cfqg, int rw) +static inline void cfqg_stats_update_io_remove(struct cfq_group *cfqg, int op, + int op_flags) { - blkg_rwstat_add(&cfqg->stats.queued, rw, -1); + blkg_rwstat_add(&cfqg->stats.queued, op, op_flags, -1); } -static inline void cfqg_stats_update_io_merged(struct cfq_group *cfqg, int rw) +static inline void cfqg_stats_update_io_merged(struct cfq_group *cfqg, int op, + int op_flags) { - blkg_rwstat_add(&cfqg->stats.merged, rw, 1); + blkg_rwstat_add(&cfqg->stats.merged, op, op_flags, 1); } static inline void cfqg_stats_update_completion(struct cfq_group *cfqg, - uint64_t start_time, uint64_t io_start_time, int rw) + uint64_t start_time, uint64_t io_start_time, int op, + int op_flags) { struct cfqg_stats *stats = &cfqg->stats; unsigned long long now = sched_clock(); if (time_after64(now, io_start_time)) - blkg_rwstat_add(&stats->service_time, rw, now - io_start_time); + blkg_rwstat_add(&stats->service_time, op, op_flags, + now - io_start_time); if (time_after64(io_start_time, start_time)) - blkg_rwstat_add(&stats->wait_time, rw, + blkg_rwstat_add(&stats->wait_time, op, op_flags, io_start_time - start_time); } @@ -781,13 +786,16 @@ static inline void cfqg_put(struct cfq_group *cfqg) { } #define cfq_log_cfqg(cfqd, cfqg, fmt, args...) do {} while (0) static inline void cfqg_stats_update_io_add(struct cfq_group *cfqg, - struct cfq_group *curr_cfqg, int rw) { } + struct cfq_group *curr_cfqg, int op, int op_flags) { } static inline void cfqg_stats_update_timeslice_used(struct cfq_group *cfqg, unsigned long time, unsigned long unaccounted_time) { } -static inline void cfqg_stats_update_io_remove(struct cfq_group *cfqg, int rw) { } -static inline void cfqg_stats_update_io_merged(struct cfq_group *cfqg, int rw) { } +static inline void cfqg_stats_update_io_remove(struct cfq_group *cfqg, int op, + int op_flags) { } +static inline void cfqg_stats_update_io_merged(struct cfq_group *cfqg, int op, + int op_flags) { } static inline void cfqg_stats_update_completion(struct cfq_group *cfqg, - uint64_t start_time, uint64_t io_start_time, int rw) { } + uint64_t start_time, uint64_t io_start_time, int op, + int op_flags) { } #endif /* CONFIG_CFQ_GROUP_IOSCHED */ @@ -2461,10 +2469,10 @@ static void cfq_reposition_rq_rb(struct cfq_queue *cfqq, struct request *rq) { elv_rb_del(&cfqq->sort_list, rq); cfqq->queued[rq_is_sync(rq)]--; - cfqg_stats_update_io_remove(RQ_CFQG(rq), rq->cmd_flags); + cfqg_stats_update_io_remove(RQ_CFQG(rq), rq->op, rq->cmd_flags); cfq_add_rq_rb(rq); cfqg_stats_update_io_add(RQ_CFQG(rq), cfqq->cfqd->serving_group, - rq->cmd_flags); + rq->op, rq->cmd_flags); } static struct request * @@ -2517,7 +2525,7 @@ static void cfq_remove_request(struct request *rq) cfq_del_rq_rb(rq); cfqq->cfqd->rq_queued--; - cfqg_stats_update_io_remove(RQ_CFQG(rq), rq->cmd_flags); + cfqg_stats_update_io_remove(RQ_CFQG(rq), rq->op, rq->cmd_flags); if (rq->cmd_flags & REQ_PRIO) { WARN_ON(!cfqq->prio_pending); cfqq->prio_pending--; @@ -2552,7 +2560,7 @@ static void cfq_merged_request(struct request_queue *q, struct request *req, static void cfq_bio_merged(struct request_queue *q, struct request *req, struct bio *bio) { - cfqg_stats_update_io_merged(RQ_CFQG(req), bio->bi_rw); + cfqg_stats_update_io_merged(RQ_CFQG(req), bio->bi_op, bio->bi_rw); } static void @@ -2575,7 +2583,7 @@ cfq_merged_requests(struct request_queue *q, struct request *rq, if (cfqq->next_rq == next) cfqq->next_rq = rq; cfq_remove_request(next); - cfqg_stats_update_io_merged(RQ_CFQG(rq), next->cmd_flags); + cfqg_stats_update_io_merged(RQ_CFQG(rq), next->op, next->cmd_flags); cfqq = RQ_CFQQ(next); /* @@ -4108,7 +4116,7 @@ static void cfq_insert_request(struct request_queue *q, struct request *rq) rq->fifo_time = jiffies + cfqd->cfq_fifo_expire[rq_is_sync(rq)]; list_add_tail(&rq->queuelist, &cfqq->fifo); cfq_add_rq_rb(rq); - cfqg_stats_update_io_add(RQ_CFQG(rq), cfqd->serving_group, + cfqg_stats_update_io_add(RQ_CFQG(rq), cfqd->serving_group, rq->op, rq->cmd_flags); cfq_rq_enqueued(cfqd, cfqq, rq); } @@ -4206,7 +4214,8 @@ static void cfq_completed_request(struct request_queue *q, struct request *rq) cfqq->dispatched--; (RQ_CFQG(rq))->dispatched--; cfqg_stats_update_completion(cfqq->cfqg, rq_start_time_ns(rq), - rq_io_start_time_ns(rq), rq->cmd_flags); + rq_io_start_time_ns(rq), rq->op, + rq->cmd_flags); cfqd->rq_in_flight[cfq_cfqq_sync(cfqq)]--; diff --git a/include/linux/blk-cgroup.h b/include/linux/blk-cgroup.h index c02e669..9071feb 100644 --- a/include/linux/blk-cgroup.h +++ b/include/linux/blk-cgroup.h @@ -590,25 +590,26 @@ static inline void blkg_rwstat_exit(struct blkg_rwstat *rwstat) /** * blkg_rwstat_add - add a value to a blkg_rwstat * @rwstat: target blkg_rwstat - * @rw: mask of REQ_{WRITE|SYNC} + * @op: REQ_OP + * @op_flags: rq_flag_bits * @val: value to add * * Add @val to @rwstat. The counters are chosen according to @rw. The * caller is responsible for synchronizing calls to this function. */ static inline void blkg_rwstat_add(struct blkg_rwstat *rwstat, - int rw, uint64_t val) + int op, int op_flags, uint64_t val) { struct percpu_counter *cnt; - if (rw & REQ_WRITE) + if (op_is_write(op)) cnt = &rwstat->cpu_cnt[BLKG_RWSTAT_WRITE]; else cnt = &rwstat->cpu_cnt[BLKG_RWSTAT_READ]; __percpu_counter_add(cnt, val, BLKG_STAT_CPU_BATCH); - if (rw & REQ_SYNC) + if (op_flags & REQ_SYNC) cnt = &rwstat->cpu_cnt[BLKG_RWSTAT_SYNC]; else cnt = &rwstat->cpu_cnt[BLKG_RWSTAT_ASYNC]; @@ -713,9 +714,9 @@ static inline bool blkcg_bio_issue_check(struct request_queue *q, if (!throtl) { blkg = blkg ?: q->root_blkg; - blkg_rwstat_add(&blkg->stat_bytes, bio->bi_rw, + blkg_rwstat_add(&blkg->stat_bytes, bio->bi_op, bio->bi_rw, bio->bi_iter.bi_size); - blkg_rwstat_add(&blkg->stat_ios, bio->bi_rw, 1); + blkg_rwstat_add(&blkg->stat_ios, bio->bi_op, bio->bi_rw, 1); } rcu_read_unlock(); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:17:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8777A7D33 for ; Fri, 15 Apr 2016 14:17:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E73F4AC002 for ; Fri, 15 Apr 2016 12:17:34 -0700 (PDT) X-ASG-Debug-ID: 1460747853-04cb6c24626412e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id vCLIVsf5wt3sxjx8 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:33 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E3B53345589; Fri, 15 Apr 2016 19:17:32 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhv007872; Fri, 15 Apr 2016 15:17:30 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 31/42] block: convert merge/insert code to check for REQ_OPs. Date: Fri, 15 Apr 2016 14:16:06 -0500 X-ASG-Orig-Subj: [PATCH 31/42] block: convert merge/insert code to check for REQ_OPs. Message-Id: <1460747777-8479-32-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747853 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch converts the block layer merging code to use separate variables for the operation and flags, and to check request->op for the REQ_OP. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- block/blk-core.c | 2 +- block/blk-merge.c | 10 ++++++---- include/linux/blkdev.h | 20 ++++++++++---------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index a796b35..660aeb8 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -2176,7 +2176,7 @@ EXPORT_SYMBOL(submit_bio); static int blk_cloned_rq_check_limits(struct request_queue *q, struct request *rq) { - if (blk_rq_sectors(rq) > blk_queue_get_max_sectors(q, rq->cmd_flags)) { + if (blk_rq_sectors(rq) > blk_queue_get_max_sectors(q, rq->op)) { printk(KERN_ERR "%s: over max size limit.\n", __func__); return -EIO; } diff --git a/block/blk-merge.c b/block/blk-merge.c index 2613531..c02371f 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -649,7 +649,8 @@ static int attempt_merge(struct request_queue *q, struct request *req, if (!rq_mergeable(req) || !rq_mergeable(next)) return 0; - if (!blk_check_merge_flags(req->cmd_flags, next->cmd_flags)) + if (!blk_check_merge_flags(req->cmd_flags, req->op, next->cmd_flags, + next->op)) return 0; /* @@ -663,7 +664,7 @@ static int attempt_merge(struct request_queue *q, struct request *req, || req_no_special_merge(next)) return 0; - if (req->cmd_flags & REQ_WRITE_SAME && + if (req->op == REQ_OP_WRITE_SAME && !blk_write_same_mergeable(req->bio, next->bio)) return 0; @@ -751,7 +752,8 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio) if (!rq_mergeable(rq) || !bio_mergeable(bio)) return false; - if (!blk_check_merge_flags(rq->cmd_flags, bio->bi_rw)) + if (!blk_check_merge_flags(rq->cmd_flags, rq->op, bio->bi_rw, + bio->bi_op)) return false; /* different data direction or already started, don't merge */ @@ -767,7 +769,7 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio) return false; /* must be using the same buffer */ - if (rq->cmd_flags & REQ_WRITE_SAME && + if (rq->op == REQ_OP_WRITE_SAME && !blk_write_same_mergeable(rq->bio, bio)) return false; diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index bce32e2..4aaa317 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -659,16 +659,16 @@ static inline bool rq_mergeable(struct request *rq) return true; } -static inline bool blk_check_merge_flags(unsigned int flags1, - unsigned int flags2) +static inline bool blk_check_merge_flags(unsigned int flags1, unsigned int op1, + unsigned int flags2, unsigned int op2) { - if ((flags1 & REQ_DISCARD) != (flags2 & REQ_DISCARD)) + if ((op1 == REQ_OP_DISCARD) != (op2 == REQ_OP_DISCARD)) return false; if ((flags1 & REQ_SECURE) != (flags2 & REQ_SECURE)) return false; - if ((flags1 & REQ_WRITE_SAME) != (flags2 & REQ_WRITE_SAME)) + if ((op1 == REQ_OP_WRITE_SAME) != (op2 == REQ_OP_WRITE_SAME)) return false; return true; @@ -869,12 +869,12 @@ static inline unsigned int blk_rq_cur_sectors(const struct request *rq) } static inline unsigned int blk_queue_get_max_sectors(struct request_queue *q, - unsigned int cmd_flags) + int op) { - if (unlikely(cmd_flags & REQ_DISCARD)) + if (unlikely(op == REQ_OP_DISCARD)) return min(q->limits.max_discard_sectors, UINT_MAX >> 9); - if (unlikely(cmd_flags & REQ_WRITE_SAME)) + if (unlikely(op == REQ_OP_WRITE_SAME)) return q->limits.max_write_same_sectors; return q->limits.max_sectors; @@ -901,11 +901,11 @@ static inline unsigned int blk_rq_get_max_sectors(struct request *rq) if (unlikely(rq->cmd_type != REQ_TYPE_FS)) return q->limits.max_hw_sectors; - if (!q->limits.chunk_sectors || (rq->cmd_flags & REQ_DISCARD)) - return blk_queue_get_max_sectors(q, rq->cmd_flags); + if (!q->limits.chunk_sectors || (rq->op == REQ_OP_DISCARD)) + return blk_queue_get_max_sectors(q, rq->op); return min(blk_max_size_offset(q, blk_rq_pos(rq)), - blk_queue_get_max_sectors(q, rq->cmd_flags)); + blk_queue_get_max_sectors(q, rq->op)); } static inline unsigned int blk_rq_count_bios(struct request *rq) -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:17:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 952DA7D37 for ; Fri, 15 Apr 2016 14:17:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0AFB3AC001 for ; Fri, 15 Apr 2016 12:17:36 -0700 (PDT) X-ASG-Debug-ID: 1460747855-04cb6c2464641300001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 4reuMgM06XjyG7bK (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:35 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3AA621112; Fri, 15 Apr 2016 19:17:35 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhw007872; Fri, 15 Apr 2016 15:17:33 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 32/42] block: convert is_sync helpers to use REQ_OPs. Date: Fri, 15 Apr 2016 14:16:07 -0500 X-ASG-Orig-Subj: [PATCH 32/42] block: convert is_sync helpers to use REQ_OPs. Message-Id: <1460747777-8479-33-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747855 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch converts the is_sync helpers to use separate variables for the operation and flags. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- block/blk-core.c | 6 +++--- block/blk-mq.c | 8 ++++---- block/cfq-iosched.c | 2 +- include/linux/blkdev.h | 6 +++--- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index 660aeb8..e2f7b0a 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -962,7 +962,7 @@ static void __freed_request(struct request_list *rl, int sync) static void freed_request(struct request_list *rl, int op, unsigned int flags) { struct request_queue *q = rl->q; - int sync = rw_is_sync(op | flags); + int sync = rw_is_sync(op, flags); q->nr_rqs[sync]--; rl->count[sync]--; @@ -1075,7 +1075,7 @@ static struct request *__get_request(struct request_list *rl, int op, struct elevator_type *et = q->elevator->type; struct io_context *ioc = rq_ioc(bio); struct io_cq *icq = NULL; - const bool is_sync = rw_is_sync(op | op_flags) != 0; + const bool is_sync = rw_is_sync(op, op_flags) != 0; int may_queue; if (unlikely(blk_queue_dying(q))) @@ -1246,7 +1246,7 @@ static struct request *get_request(struct request_queue *q, int op, int op_flags, struct bio *bio, gfp_t gfp_mask) { - const bool is_sync = rw_is_sync(op | op_flags) != 0; + const bool is_sync = rw_is_sync(op, op_flags) != 0; DEFINE_WAIT(wait); struct request_list *rl; struct request *rq; diff --git a/block/blk-mq.c b/block/blk-mq.c index 4843c0b..64d61be 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -206,7 +206,7 @@ static void blk_mq_rq_ctx_init(struct request_queue *q, struct blk_mq_ctx *ctx, rq->end_io_data = NULL; rq->next_rq = NULL; - ctx->rq_dispatched[rw_is_sync(op | op_flags)]++; + ctx->rq_dispatched[rw_is_sync(op, op_flags)]++; } static struct request * @@ -1181,7 +1181,7 @@ static struct request *blk_mq_map_request(struct request_queue *q, ctx = blk_mq_get_ctx(q); hctx = q->mq_ops->map_queue(q, ctx->cpu); - if (rw_is_sync(bio->bi_op | bio->bi_rw)) + if (rw_is_sync(bio->bi_op, bio->bi_rw)) op_flags |= REQ_SYNC; trace_block_getrq(q, bio, op); @@ -1249,7 +1249,7 @@ static int blk_mq_direct_issue_request(struct request *rq, blk_qc_t *cookie) */ static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio) { - const int is_sync = rw_is_sync(bio->bi_op | bio->bi_rw); + const int is_sync = rw_is_sync(bio->bi_op, bio->bi_rw); const int is_flush_fua = bio->bi_rw & (REQ_FLUSH | REQ_FUA); struct blk_map_ctx data; struct request *rq; @@ -1346,7 +1346,7 @@ done: */ static blk_qc_t blk_sq_make_request(struct request_queue *q, struct bio *bio) { - const int is_sync = rw_is_sync(bio->bi_op | bio->bi_rw); + const int is_sync = rw_is_sync(bio->bi_op, bio->bi_rw); const int is_flush_fua = bio->bi_rw & (REQ_FLUSH | REQ_FUA); struct blk_plug *plug; unsigned int request_count = 0; diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 0dfa2dd..2fd5bcf 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c @@ -4311,7 +4311,7 @@ static int cfq_may_queue(struct request_queue *q, int op, int op_flags) if (!cic) return ELV_MQUEUE_MAY; - cfqq = cic_to_cfqq(cic, rw_is_sync(op | op_flags)); + cfqq = cic_to_cfqq(cic, rw_is_sync(op, op_flags)); if (cfqq) { cfq_init_prio_data(cfqq, cic); diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 4aaa317..42711ef 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -617,14 +617,14 @@ static inline unsigned int blk_queue_cluster(struct request_queue *q) /* * We regard a request as sync, if either a read or a sync write */ -static inline bool rw_is_sync(unsigned int rw_flags) +static inline bool rw_is_sync(int op, unsigned int rw_flags) { - return !(rw_flags & REQ_WRITE) || (rw_flags & REQ_SYNC); + return op == REQ_OP_READ || (rw_flags & REQ_SYNC); } static inline bool rq_is_sync(struct request *rq) { - return rw_is_sync(rq->cmd_flags); + return rw_is_sync(rq->op, rq->cmd_flags); } static inline bool blk_rl_full(struct request_list *rl, bool sync) -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:17:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E740F7D3B for ; Fri, 15 Apr 2016 14:17:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B978D8F8039 for ; Fri, 15 Apr 2016 12:17:38 -0700 (PDT) X-ASG-Debug-ID: 1460747857-04cbb02e1b316590001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id o3FYgj0lHpWJyhFa (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:38 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7AA4CC04B313; Fri, 15 Apr 2016 19:17:37 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIhx007872; Fri, 15 Apr 2016 15:17:35 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 33/42] block: convert rq_data_dir helper to use REQ_OPs Date: Fri, 15 Apr 2016 14:16:08 -0500 X-ASG-Orig-Subj: [PATCH 33/42] block: convert rq_data_dir helper to use REQ_OPs Message-Id: <1460747777-8479-34-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747858 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie The request->op field is now always setup up with a REQ_OP. This patch has the rq_data_dir helper convert the operation to a WRITE or READ direction based on that. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- include/linux/blkdev.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 42711ef..5694894 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -598,7 +598,7 @@ static inline void queue_flag_clear(unsigned int flag, struct request_queue *q) #define list_entry_rq(ptr) list_entry((ptr), struct request, queuelist) -#define rq_data_dir(rq) ((int)((rq)->cmd_flags & 1)) +#define rq_data_dir(rq) (op_is_write(rq->op) ? WRITE : READ) /* * Driver can handle struct request, if it either has an old style -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:17:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 647E97CA0 for ; Fri, 15 Apr 2016 14:17:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0E59E304032 for ; Fri, 15 Apr 2016 12:17:42 -0700 (PDT) X-ASG-Debug-ID: 1460747859-04bdf01102610820001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id G5Ad9ZjZmab8XTrl (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:40 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B652C47078; Fri, 15 Apr 2016 19:17:39 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIi0007872; Fri, 15 Apr 2016 15:17:37 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 34/42] drivers: set request op to REQ_OP Date: Fri, 15 Apr 2016 14:16:09 -0500 X-ASG-Orig-Subj: [PATCH 34/42] drivers: set request op to REQ_OP Message-Id: <1460747777-8479-35-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747860 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This patch has the block drivers use the request->op for REQ_OP operations and cmd_flags for rq_flag_bits. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/block/loop.c | 6 +++--- drivers/block/mtip32xx/mtip32xx.c | 2 +- drivers/block/nbd.c | 2 +- drivers/block/rbd.c | 2 +- drivers/block/skd_main.c | 11 ++++------- drivers/block/xen-blkfront.c | 8 +++++--- drivers/md/dm.c | 2 +- drivers/mmc/card/block.c | 7 +++---- drivers/mmc/card/queue.c | 6 ++---- drivers/mmc/card/queue.h | 5 ++++- drivers/mtd/mtd_blkdevs.c | 2 +- drivers/nvme/host/core.c | 2 +- drivers/nvme/host/nvme.h | 2 +- drivers/nvme/host/pci.c | 2 +- drivers/scsi/sd.c | 25 ++++++++++++++++--------- 15 files changed, 45 insertions(+), 39 deletions(-) diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 7e5e27a..0e80c9b 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -538,7 +538,7 @@ static int do_req_filebacked(struct loop_device *lo, struct request *rq) if (rq->cmd_flags & REQ_WRITE) { if (rq->cmd_flags & REQ_FLUSH) ret = lo_req_flush(lo, rq); - else if (rq->cmd_flags & REQ_DISCARD) + else if (rq->op == REQ_OP_DISCARD) ret = lo_discard(lo, rq, pos); else if (lo->transfer) ret = lo_write_transfer(lo, rq, pos); @@ -1653,8 +1653,8 @@ static int loop_queue_rq(struct blk_mq_hw_ctx *hctx, if (lo->lo_state != Lo_bound) return -EIO; - if (lo->use_dio && !(cmd->rq->cmd_flags & (REQ_FLUSH | - REQ_DISCARD))) + if (lo->use_dio && (!(cmd->rq->cmd_flags & REQ_FLUSH) || + cmd->rq->op == REQ_OP_DISCARD)) cmd->use_aio = true; else cmd->use_aio = false; diff --git a/drivers/block/mtip32xx/mtip32xx.c b/drivers/block/mtip32xx/mtip32xx.c index 6053e46..7638273 100644 --- a/drivers/block/mtip32xx/mtip32xx.c +++ b/drivers/block/mtip32xx/mtip32xx.c @@ -3765,7 +3765,7 @@ static int mtip_submit_request(struct blk_mq_hw_ctx *hctx, struct request *rq) return -ENODATA; } - if (rq->cmd_flags & REQ_DISCARD) { + if (rq->op == REQ_OP_DISCARD) { int err; err = mtip_send_trim(dd, blk_rq_pos(rq), blk_rq_sectors(rq)); diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 31e73a7..68a1476 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -282,7 +282,7 @@ static int nbd_send_req(struct nbd_device *nbd, struct request *req) if (req->cmd_type == REQ_TYPE_DRV_PRIV) type = NBD_CMD_DISC; - else if (req->cmd_flags & REQ_DISCARD) + else if (req->op == REQ_OP_DISCARD) type = NBD_CMD_TRIM; else if (req->cmd_flags & REQ_FLUSH) type = NBD_CMD_FLUSH; diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 94a1843..e8935af 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -3371,7 +3371,7 @@ static void rbd_queue_workfn(struct work_struct *work) goto err; } - if (rq->cmd_flags & REQ_DISCARD) + if (rq->op == REQ_OP_DISCARD) op_type = OBJ_OP_DISCARD; else if (rq->cmd_flags & REQ_WRITE) op_type = OBJ_OP_WRITE; diff --git a/drivers/block/skd_main.c b/drivers/block/skd_main.c index 41aaae3..5739223 100644 --- a/drivers/block/skd_main.c +++ b/drivers/block/skd_main.c @@ -576,7 +576,6 @@ static void skd_request_fn(struct request_queue *q) struct request *req = NULL; struct skd_scsi_request *scsi_req; struct page *page; - unsigned long io_flags; int error; u32 lba; u32 count; @@ -624,12 +623,11 @@ static void skd_request_fn(struct request_queue *q) lba = (u32)blk_rq_pos(req); count = blk_rq_sectors(req); data_dir = rq_data_dir(req); - io_flags = req->cmd_flags; - if (io_flags & REQ_FLUSH) + if (req->cmd_flags & REQ_FLUSH) flush++; - if (io_flags & REQ_FUA) + if (req->cmd_flags & REQ_FUA) fua++; pr_debug("%s:%s:%d new req=%p lba=%u(0x%x) " @@ -735,7 +733,7 @@ static void skd_request_fn(struct request_queue *q) else skreq->sg_data_dir = SKD_DATA_DIR_HOST_TO_CARD; - if (io_flags & REQ_DISCARD) { + if (req->op == REQ_OP_DISCARD) { page = alloc_page(GFP_ATOMIC | __GFP_ZERO); if (!page) { pr_err("request_fn:Page allocation failed.\n"); @@ -852,9 +850,8 @@ static void skd_end_request(struct skd_device *skdev, struct skd_request_context *skreq, int error) { struct request *req = skreq->req; - unsigned int io_flags = req->cmd_flags; - if ((io_flags & REQ_DISCARD) && + if ((req->op == REQ_OP_DISCARD) && (skreq->discard_page == 1)) { pr_debug("%s:%s:%d, free the page!", skdev->name, __func__, __LINE__); diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index 52963a2..dc08d4d 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c @@ -844,7 +844,8 @@ static int blkif_queue_request(struct request *req, struct blkfront_ring_info *r if (unlikely(rinfo->dev_info->connected != BLKIF_STATE_CONNECTED)) return 1; - if (unlikely(req->cmd_flags & (REQ_DISCARD | REQ_SECURE))) + if (unlikely(req->op == REQ_OP_DISCARD || + req->cmd_flags & REQ_SECURE)) return blkif_queue_discard_req(req, rinfo); else return blkif_queue_rw_req(req, rinfo); @@ -2054,8 +2055,9 @@ static int blkif_recover(struct blkfront_info *info) /* * Get the bios in the request so we can re-queue them. */ - if (copy[i].request->cmd_flags & - (REQ_FLUSH | REQ_FUA | REQ_DISCARD | REQ_SECURE)) { + if (copy[i].request->cmd_flags & REQ_FLUSH || + copy[i].request->op == REQ_OP_DISCARD || + copy[i].request->cmd_flags & (REQ_FUA | REQ_SECURE)) { /* * Flush operations don't contain bios, so * we need to requeue the whole request diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 98fea0e..13c869c 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -1322,7 +1322,7 @@ static void dm_done(struct request *clone, int error, bool mapped) r = rq_end_io(tio->ti, clone, error, &tio->info); } - if (unlikely(r == -EREMOTEIO && (clone->cmd_flags & REQ_WRITE_SAME) && + if (unlikely(r == -EREMOTEIO && (clone->op == REQ_OP_WRITE_SAME) && !clone->q->limits.max_write_same_sectors)) disable_write_same(tio->md); diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 8db2bf0..8fa3982 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -1696,8 +1696,7 @@ static u8 mmc_blk_prep_packed_list(struct mmc_queue *mq, struct request *req) !IS_ALIGNED(blk_rq_sectors(next), 8)) break; - if (next->cmd_flags & REQ_DISCARD || - next->cmd_flags & REQ_FLUSH) + if (next->op == REQ_OP_DISCARD || next->cmd_flags & REQ_FLUSH) break; if (rq_data_dir(cur) != rq_data_dir(next)) @@ -2138,7 +2137,7 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) } mq->flags &= ~MMC_QUEUE_NEW_REQUEST; - if (cmd_flags & REQ_DISCARD) { + if (req && req->op == REQ_OP_DISCARD) { /* complete ongoing async transfer before issuing discard */ if (card->host->areq) mmc_blk_issue_rw_rq(mq, NULL); @@ -2162,7 +2161,7 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) out: if ((!req && !(mq->flags & MMC_QUEUE_NEW_REQUEST)) || - (cmd_flags & MMC_REQ_SPECIAL_MASK)) + mmc_req_is_special(req)) /* * Release host when there are no more requests * and after special request(discard, flush) is done. diff --git a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c index 6f4323c..9fb8d21 100644 --- a/drivers/mmc/card/queue.c +++ b/drivers/mmc/card/queue.c @@ -33,7 +33,7 @@ static int mmc_prep_request(struct request_queue *q, struct request *req) /* * We only like normal block requests and discards. */ - if (req->cmd_type != REQ_TYPE_FS && !(req->cmd_flags & REQ_DISCARD)) { + if (req->cmd_type != REQ_TYPE_FS && req->op != REQ_OP_DISCARD) { blk_dump_rq_flags(req, "MMC bad request"); return BLKPREP_KILL; } @@ -56,7 +56,6 @@ static int mmc_queue_thread(void *d) down(&mq->thread_sem); do { struct request *req = NULL; - unsigned int cmd_flags = 0; spin_lock_irq(q->queue_lock); set_current_state(TASK_INTERRUPTIBLE); @@ -66,7 +65,6 @@ static int mmc_queue_thread(void *d) if (req || mq->mqrq_prev->req) { set_current_state(TASK_RUNNING); - cmd_flags = req ? req->cmd_flags : 0; mq->issue_fn(mq, req); cond_resched(); if (mq->flags & MMC_QUEUE_NEW_REQUEST) { @@ -81,7 +79,7 @@ static int mmc_queue_thread(void *d) * has been finished. Do not assign it to previous * request. */ - if (cmd_flags & MMC_REQ_SPECIAL_MASK) + if (mmc_req_is_special(req)) mq->mqrq_cur->req = NULL; mq->mqrq_prev->brq.mrq.data = NULL; diff --git a/drivers/mmc/card/queue.h b/drivers/mmc/card/queue.h index 36cddab..f166e5b 100644 --- a/drivers/mmc/card/queue.h +++ b/drivers/mmc/card/queue.h @@ -1,7 +1,10 @@ #ifndef MMC_QUEUE_H #define MMC_QUEUE_H -#define MMC_REQ_SPECIAL_MASK (REQ_DISCARD | REQ_FLUSH) +static inline bool mmc_req_is_special(struct request *req) +{ + return req && (req->cmd_flags & REQ_FLUSH || req->op == REQ_OP_DISCARD); +} struct request; struct task_struct; diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c index 74ae243..e8b0263 100644 --- a/drivers/mtd/mtd_blkdevs.c +++ b/drivers/mtd/mtd_blkdevs.c @@ -94,7 +94,7 @@ static int do_blktrans_request(struct mtd_blktrans_ops *tr, get_capacity(req->rq_disk)) return -EIO; - if (req->cmd_flags & REQ_DISCARD) + if (req->op == REQ_OP_DISCARD) return tr->discard(dev, block, nsect); if (rq_data_dir(req) == READ) { diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 4eb5759..b741aed 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -234,7 +234,7 @@ int nvme_setup_cmd(struct nvme_ns *ns, struct request *req, memcpy(cmd, req->cmd, sizeof(*cmd)); else if (req->cmd_flags & REQ_FLUSH) nvme_setup_flush(ns, cmd); - else if (req->cmd_flags & REQ_DISCARD) + else if (req->op == REQ_OP_DISCARD) ret = nvme_setup_discard(ns, req, cmd); else nvme_setup_rw(ns, req, cmd); diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index 8e8fae8..0f04523 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -175,7 +175,7 @@ static inline u64 nvme_block_nr(struct nvme_ns *ns, sector_t sector) static inline unsigned nvme_map_len(struct request *rq) { - if (rq->cmd_flags & REQ_DISCARD) + if (rq->op == REQ_OP_DISCARD) return sizeof(struct nvme_dsm_range); else return blk_rq_bytes(rq); diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index ff3c8d7..ea5f5eb 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -363,7 +363,7 @@ static void nvme_free_iod(struct nvme_dev *dev, struct request *req) __le64 **list = iod_list(req); dma_addr_t prp_dma = iod->first_dma; - if (req->cmd_flags & REQ_DISCARD) + if (req->op == REQ_OP_DISCARD) kfree(req->completion_data); if (iod->npages == 0) diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 428c03e..2fc7191 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1012,7 +1012,8 @@ static int sd_setup_read_write_cmnd(struct scsi_cmnd *SCpnt) } else if (rq_data_dir(rq) == READ) { SCpnt->cmnd[0] = READ_6; } else { - scmd_printk(KERN_ERR, SCpnt, "Unknown command %llx\n", (unsigned long long) rq->cmd_flags); + scmd_printk(KERN_ERR, SCpnt, "Unknown command %d,%llx\n", + rq->op, (unsigned long long) rq->cmd_flags); goto out; } @@ -1137,21 +1138,27 @@ static int sd_init_command(struct scsi_cmnd *cmd) { struct request *rq = cmd->request; - if (rq->cmd_flags & REQ_DISCARD) + switch (rq->op) { + case REQ_OP_DISCARD: return sd_setup_discard_cmnd(cmd); - else if (rq->cmd_flags & REQ_WRITE_SAME) + case REQ_OP_WRITE_SAME: return sd_setup_write_same_cmnd(cmd); - else if (rq->cmd_flags & REQ_FLUSH) - return sd_setup_flush_cmnd(cmd); - else - return sd_setup_read_write_cmnd(cmd); + case REQ_OP_READ: + case REQ_OP_WRITE: + if (rq->cmd_flags & REQ_FLUSH) + return sd_setup_flush_cmnd(cmd); + else + return sd_setup_read_write_cmnd(cmd); + default: + BUG(); + } } static void sd_uninit_command(struct scsi_cmnd *SCpnt) { struct request *rq = SCpnt->request; - if (rq->cmd_flags & REQ_DISCARD) + if (rq->op == REQ_OP_DISCARD) __free_page(rq->completion_data); if (SCpnt->cmnd != rq->cmd) { @@ -1769,7 +1776,7 @@ static int sd_done(struct scsi_cmnd *SCpnt) unsigned char op = SCpnt->cmnd[0]; unsigned char unmap = SCpnt->cmnd[1] & 8; - if (req->cmd_flags & REQ_DISCARD || req->cmd_flags & REQ_WRITE_SAME) { + if (req->op == REQ_OP_DISCARD || req->op == REQ_OP_WRITE_SAME) { if (!result) { good_bytes = blk_rq_bytes(req); scsi_set_resid(SCpnt, 0); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:17:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 86D1C7D5B for ; Fri, 15 Apr 2016 14:17:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 26A0C304032 for ; Fri, 15 Apr 2016 12:17:44 -0700 (PDT) X-ASG-Debug-ID: 1460747862-04bdf01104610840001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gVnUd0L37dxyewgK (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:42 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0A71EC01AA28; Fri, 15 Apr 2016 19:17:42 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIi1007872; Fri, 15 Apr 2016 15:17:39 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 35/42] blktrace: get op from req->op/bio->bi_op Date: Fri, 15 Apr 2016 14:16:10 -0500 X-ASG-Orig-Subj: [PATCH 35/42] blktrace: get op from req->op/bio->bi_op Message-Id: <1460747777-8479-36-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747862 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie The bio and request structs now store the operation in bio->bi_op/request->op. This patch has blktrace use that field instead of bi_rw/cmd_flags. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- include/linux/blktrace_api.h | 2 +- include/trace/events/bcache.h | 12 ++++++---- include/trace/events/block.h | 31 +++++++++++++++++--------- kernel/trace/blktrace.c | 52 +++++++++++++++++++++++-------------------- 4 files changed, 57 insertions(+), 40 deletions(-) diff --git a/include/linux/blktrace_api.h b/include/linux/blktrace_api.h index afc1343..ee25ba4 100644 --- a/include/linux/blktrace_api.h +++ b/include/linux/blktrace_api.h @@ -109,7 +109,7 @@ static inline int blk_cmd_buf_len(struct request *rq) } extern void blk_dump_cmd(char *buf, struct request *rq); -extern void blk_fill_rwbs(char *rwbs, u32 rw, int bytes); +extern void blk_fill_rwbs(char *rwbs, int op, u32 rw, int bytes); #endif /* CONFIG_EVENT_TRACING && CONFIG_BLOCK */ diff --git a/include/trace/events/bcache.h b/include/trace/events/bcache.h index 981acf7..8abe564 100644 --- a/include/trace/events/bcache.h +++ b/include/trace/events/bcache.h @@ -27,7 +27,8 @@ DECLARE_EVENT_CLASS(bcache_request, __entry->sector = bio->bi_iter.bi_sector; __entry->orig_sector = bio->bi_iter.bi_sector - 16; __entry->nr_sector = bio->bi_iter.bi_size >> 9; - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); ), TP_printk("%d,%d %s %llu + %u (from %d,%d @ %llu)", @@ -101,7 +102,8 @@ DECLARE_EVENT_CLASS(bcache_bio, __entry->dev = bio->bi_bdev->bd_dev; __entry->sector = bio->bi_iter.bi_sector; __entry->nr_sector = bio->bi_iter.bi_size >> 9; - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); ), TP_printk("%d,%d %s %llu + %u", @@ -136,7 +138,8 @@ TRACE_EVENT(bcache_read, __entry->dev = bio->bi_bdev->bd_dev; __entry->sector = bio->bi_iter.bi_sector; __entry->nr_sector = bio->bi_iter.bi_size >> 9; - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); __entry->cache_hit = hit; __entry->bypass = bypass; ), @@ -167,7 +170,8 @@ TRACE_EVENT(bcache_write, __entry->inode = inode; __entry->sector = bio->bi_iter.bi_sector; __entry->nr_sector = bio->bi_iter.bi_size >> 9; - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); __entry->writeback = writeback; __entry->bypass = bypass; ), diff --git a/include/trace/events/block.h b/include/trace/events/block.h index e8a5eca..4416dcd 100644 --- a/include/trace/events/block.h +++ b/include/trace/events/block.h @@ -84,7 +84,8 @@ DECLARE_EVENT_CLASS(block_rq_with_error, 0 : blk_rq_sectors(rq); __entry->errors = rq->errors; - blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq)); + blk_fill_rwbs(__entry->rwbs, rq->op, rq->cmd_flags, + blk_rq_bytes(rq)); blk_dump_cmd(__get_str(cmd), rq); ), @@ -162,7 +163,7 @@ TRACE_EVENT(block_rq_complete, __entry->nr_sector = nr_bytes >> 9; __entry->errors = rq->errors; - blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, nr_bytes); + blk_fill_rwbs(__entry->rwbs, rq->op, rq->cmd_flags, nr_bytes); blk_dump_cmd(__get_str(cmd), rq); ), @@ -198,7 +199,8 @@ DECLARE_EVENT_CLASS(block_rq, __entry->bytes = (rq->cmd_type == REQ_TYPE_BLOCK_PC) ? blk_rq_bytes(rq) : 0; - blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq)); + blk_fill_rwbs(__entry->rwbs, rq->op, rq->cmd_flags, + blk_rq_bytes(rq)); blk_dump_cmd(__get_str(cmd), rq); memcpy(__entry->comm, current->comm, TASK_COMM_LEN); ), @@ -272,7 +274,8 @@ TRACE_EVENT(block_bio_bounce, bio->bi_bdev->bd_dev : 0; __entry->sector = bio->bi_iter.bi_sector; __entry->nr_sector = bio_sectors(bio); - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); memcpy(__entry->comm, current->comm, TASK_COMM_LEN); ), @@ -310,7 +313,8 @@ TRACE_EVENT(block_bio_complete, __entry->sector = bio->bi_iter.bi_sector; __entry->nr_sector = bio_sectors(bio); __entry->error = error; - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); ), TP_printk("%d,%d %s %llu + %u [%d]", @@ -337,7 +341,8 @@ DECLARE_EVENT_CLASS(block_bio_merge, __entry->dev = bio->bi_bdev->bd_dev; __entry->sector = bio->bi_iter.bi_sector; __entry->nr_sector = bio_sectors(bio); - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); memcpy(__entry->comm, current->comm, TASK_COMM_LEN); ), @@ -404,7 +409,8 @@ TRACE_EVENT(block_bio_queue, __entry->dev = bio->bi_bdev->bd_dev; __entry->sector = bio->bi_iter.bi_sector; __entry->nr_sector = bio_sectors(bio); - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); memcpy(__entry->comm, current->comm, TASK_COMM_LEN); ), @@ -432,7 +438,7 @@ DECLARE_EVENT_CLASS(block_get_rq, __entry->dev = bio ? bio->bi_bdev->bd_dev : 0; __entry->sector = bio ? bio->bi_iter.bi_sector : 0; __entry->nr_sector = bio ? bio_sectors(bio) : 0; - blk_fill_rwbs(__entry->rwbs, + blk_fill_rwbs(__entry->rwbs, bio ? bio->bi_op : 0, bio ? bio->bi_rw : 0, __entry->nr_sector); memcpy(__entry->comm, current->comm, TASK_COMM_LEN); ), @@ -567,7 +573,8 @@ TRACE_EVENT(block_split, __entry->dev = bio->bi_bdev->bd_dev; __entry->sector = bio->bi_iter.bi_sector; __entry->new_sector = new_sector; - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); memcpy(__entry->comm, current->comm, TASK_COMM_LEN); ), @@ -610,7 +617,8 @@ TRACE_EVENT(block_bio_remap, __entry->nr_sector = bio_sectors(bio); __entry->old_dev = dev; __entry->old_sector = from; - blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size); + blk_fill_rwbs(__entry->rwbs, bio->bi_op, bio->bi_rw, + bio->bi_iter.bi_size); ), TP_printk("%d,%d %s %llu + %u <- (%d,%d) %llu", @@ -656,7 +664,8 @@ TRACE_EVENT(block_rq_remap, __entry->old_dev = dev; __entry->old_sector = from; __entry->nr_bios = blk_rq_count_bios(rq); - blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq)); + blk_fill_rwbs(__entry->rwbs, rq->op, rq->cmd_flags, + blk_rq_bytes(rq)); ), TP_printk("%d,%d %s %llu + %u <- (%d,%d) %llu %u", diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index f94e7a2..6a381ea 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c @@ -199,7 +199,8 @@ static const u32 ddir_act[2] = { BLK_TC_ACT(BLK_TC_READ), * blk_io_trace structure and places it in a per-cpu subbuffer. */ static void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes, - int rw, u32 what, int error, int pdu_len, void *pdu_data) + int op, int op_flags, u32 what, int error, int pdu_len, + void *pdu_data) { struct task_struct *tsk = current; struct ring_buffer_event *event = NULL; @@ -214,13 +215,14 @@ static void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes, if (unlikely(bt->trace_state != Blktrace_running && !blk_tracer)) return; - what |= ddir_act[rw & WRITE]; - what |= MASK_TC_BIT(rw, SYNC); - what |= MASK_TC_BIT(rw, RAHEAD); - what |= MASK_TC_BIT(rw, META); - what |= MASK_TC_BIT(rw, DISCARD); - what |= MASK_TC_BIT(rw, FLUSH); - what |= MASK_TC_BIT(rw, FUA); + what |= ddir_act[op_is_write(op) ? WRITE : READ]; + what |= MASK_TC_BIT(op_flags, SYNC); + what |= MASK_TC_BIT(op_flags, RAHEAD); + what |= MASK_TC_BIT(op_flags, META); + what |= MASK_TC_BIT(op_flags, FLUSH); + what |= MASK_TC_BIT(op_flags, FUA); + if (op == REQ_OP_DISCARD) + what |= BLK_TC_ACT(BLK_TC_DISCARD); pid = tsk->pid; if (act_log_check(bt, what, sector, pid)) @@ -708,11 +710,11 @@ static void blk_add_trace_rq(struct request_queue *q, struct request *rq, if (rq->cmd_type == REQ_TYPE_BLOCK_PC) { what |= BLK_TC_ACT(BLK_TC_PC); - __blk_add_trace(bt, 0, nr_bytes, rq->cmd_flags, + __blk_add_trace(bt, 0, nr_bytes, rq->op, rq->cmd_flags, what, rq->errors, rq->cmd_len, rq->cmd); } else { what |= BLK_TC_ACT(BLK_TC_FS); - __blk_add_trace(bt, blk_rq_pos(rq), nr_bytes, + __blk_add_trace(bt, blk_rq_pos(rq), nr_bytes, rq->op, rq->cmd_flags, what, rq->errors, 0, NULL); } } @@ -770,7 +772,7 @@ static void blk_add_trace_bio(struct request_queue *q, struct bio *bio, return; __blk_add_trace(bt, bio->bi_iter.bi_sector, bio->bi_iter.bi_size, - bio->bi_rw, what, error, 0, NULL); + bio->bi_op, bio->bi_rw, what, error, 0, NULL); } static void blk_add_trace_bio_bounce(void *ignore, @@ -818,7 +820,8 @@ static void blk_add_trace_getrq(void *ignore, struct blk_trace *bt = q->blk_trace; if (bt) - __blk_add_trace(bt, 0, 0, rw, BLK_TA_GETRQ, 0, 0, NULL); + __blk_add_trace(bt, 0, 0, rw, 0, BLK_TA_GETRQ, 0, 0, + NULL); } } @@ -833,7 +836,7 @@ static void blk_add_trace_sleeprq(void *ignore, struct blk_trace *bt = q->blk_trace; if (bt) - __blk_add_trace(bt, 0, 0, rw, BLK_TA_SLEEPRQ, + __blk_add_trace(bt, 0, 0, rw, 0, BLK_TA_SLEEPRQ, 0, 0, NULL); } } @@ -843,7 +846,7 @@ static void blk_add_trace_plug(void *ignore, struct request_queue *q) struct blk_trace *bt = q->blk_trace; if (bt) - __blk_add_trace(bt, 0, 0, 0, BLK_TA_PLUG, 0, 0, NULL); + __blk_add_trace(bt, 0, 0, 0, 0, BLK_TA_PLUG, 0, 0, NULL); } static void blk_add_trace_unplug(void *ignore, struct request_queue *q, @@ -860,7 +863,7 @@ static void blk_add_trace_unplug(void *ignore, struct request_queue *q, else what = BLK_TA_UNPLUG_TIMER; - __blk_add_trace(bt, 0, 0, 0, what, 0, sizeof(rpdu), &rpdu); + __blk_add_trace(bt, 0, 0, 0, 0, what, 0, sizeof(rpdu), &rpdu); } } @@ -874,8 +877,9 @@ static void blk_add_trace_split(void *ignore, __be64 rpdu = cpu_to_be64(pdu); __blk_add_trace(bt, bio->bi_iter.bi_sector, - bio->bi_iter.bi_size, bio->bi_rw, BLK_TA_SPLIT, - bio->bi_error, sizeof(rpdu), &rpdu); + bio->bi_iter.bi_size, bio->bi_op, bio->bi_rw, + BLK_TA_SPLIT, bio->bi_error, sizeof(rpdu), + &rpdu); } } @@ -907,7 +911,7 @@ static void blk_add_trace_bio_remap(void *ignore, r.sector_from = cpu_to_be64(from); __blk_add_trace(bt, bio->bi_iter.bi_sector, bio->bi_iter.bi_size, - bio->bi_rw, BLK_TA_REMAP, bio->bi_error, + bio->bi_op, bio->bi_rw, BLK_TA_REMAP, bio->bi_error, sizeof(r), &r); } @@ -940,7 +944,7 @@ static void blk_add_trace_rq_remap(void *ignore, r.sector_from = cpu_to_be64(from); __blk_add_trace(bt, blk_rq_pos(rq), blk_rq_bytes(rq), - rq_data_dir(rq), BLK_TA_REMAP, !!rq->errors, + rq_data_dir(rq), 0, BLK_TA_REMAP, !!rq->errors, sizeof(r), &r); } @@ -965,10 +969,10 @@ void blk_add_driver_data(struct request_queue *q, return; if (rq->cmd_type == REQ_TYPE_BLOCK_PC) - __blk_add_trace(bt, 0, blk_rq_bytes(rq), 0, + __blk_add_trace(bt, 0, blk_rq_bytes(rq), 0, 0, BLK_TA_DRV_DATA, rq->errors, len, data); else - __blk_add_trace(bt, blk_rq_pos(rq), blk_rq_bytes(rq), 0, + __blk_add_trace(bt, blk_rq_pos(rq), blk_rq_bytes(rq), 0, 0, BLK_TA_DRV_DATA, rq->errors, len, data); } EXPORT_SYMBOL_GPL(blk_add_driver_data); @@ -1767,16 +1771,16 @@ void blk_dump_cmd(char *buf, struct request *rq) } } -void blk_fill_rwbs(char *rwbs, u32 rw, int bytes) +void blk_fill_rwbs(char *rwbs, int op, u32 rw, int bytes) { int i = 0; if (rw & REQ_FLUSH) rwbs[i++] = 'F'; - if (rw & WRITE) + if (op == REQ_OP_WRITE) rwbs[i++] = 'W'; - else if (rw & REQ_DISCARD) + else if (op == REQ_OP_DISCARD) rwbs[i++] = 'D'; else if (bytes) rwbs[i++] = 'R'; -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:17:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F0C947CB6 for ; Fri, 15 Apr 2016 14:17:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C49088F8037 for ; Fri, 15 Apr 2016 12:17:45 -0700 (PDT) X-ASG-Debug-ID: 1460747864-04cbb02e1d316610001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id lS5jy7WPTfmMHkYm (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:44 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4E844201EA; Fri, 15 Apr 2016 19:17:44 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIi2007872; Fri, 15 Apr 2016 15:17:42 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 36/42] ide cd: do not set REQ_WRITE on requests. Date: Fri, 15 Apr 2016 14:16:11 -0500 X-ASG-Orig-Subj: [PATCH 36/42] ide cd: do not set REQ_WRITE on requests. Message-Id: <1460747777-8479-37-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747864 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie The block layer will set the correct READ/WRITE operation flags/fields when creating a request, so there is not need for drivers to set the REQ_WRITE flag. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/ide/ide-cd_ioctl.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/drivers/ide/ide-cd_ioctl.c b/drivers/ide/ide-cd_ioctl.c index 474173e..5887a7a 100644 --- a/drivers/ide/ide-cd_ioctl.c +++ b/drivers/ide/ide-cd_ioctl.c @@ -459,9 +459,6 @@ int ide_cdrom_packet(struct cdrom_device_info *cdi, layer. the packet must be complete, as we do not touch it at all. */ - if (cgc->data_direction == CGC_DATA_WRITE) - flags |= REQ_WRITE; - if (cgc->sense) memset(cgc->sense, 0, sizeof(struct request_sense)); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:17:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B98437D65 for ; Fri, 15 Apr 2016 14:17:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 799F18F8037 for ; Fri, 15 Apr 2016 12:17:50 -0700 (PDT) X-ASG-Debug-ID: 1460747869-04cbb02e1b316670001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cLZgmKgjOOhgCYIK (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:49 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id DA31F3B731; Fri, 15 Apr 2016 19:17:48 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIi4007872; Fri, 15 Apr 2016 15:17:46 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 38/42] block, fs: remove old REQ definitions. Date: Fri, 15 Apr 2016 14:16:13 -0500 X-ASG-Orig-Subj: [PATCH 38/42] block, fs: remove old REQ definitions. Message-Id: <1460747777-8479-39-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747869 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie We no longer use REQ_WRITE. REQ_WRITE_SAME and REQ_DISCARD, so this patch removes them. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- include/linux/blk_types.h | 21 ++++++--------------- include/linux/fs.h | 21 +++++++++++---------- include/trace/events/f2fs.h | 1 - 3 files changed, 17 insertions(+), 26 deletions(-) diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index 6e49c91..b4251ed 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -151,7 +151,6 @@ struct bio { */ enum rq_flag_bits { /* common flags */ - __REQ_WRITE, /* not set, read. set, write */ __REQ_FAILFAST_DEV, /* no driver retries of device errors */ __REQ_FAILFAST_TRANSPORT, /* no driver retries of transport errors */ __REQ_FAILFAST_DRIVER, /* no driver retries of driver errors */ @@ -159,9 +158,7 @@ enum rq_flag_bits { __REQ_SYNC, /* request is sync (sync write or read) */ __REQ_META, /* metadata io request */ __REQ_PRIO, /* boost priority in cfq */ - __REQ_DISCARD, /* request to discard sectors */ - __REQ_SECURE, /* secure discard (used with __REQ_DISCARD) */ - __REQ_WRITE_SAME, /* write same block many times */ + __REQ_SECURE, /* secure discard (used with REQ_OP_DISCARD) */ __REQ_NOIDLE, /* don't anticipate more IO after this one */ __REQ_INTEGRITY, /* I/O includes block integrity payload */ @@ -197,28 +194,22 @@ enum rq_flag_bits { __REQ_NR_BITS, /* stops here */ }; -#define REQ_WRITE (1ULL << __REQ_WRITE) #define REQ_FAILFAST_DEV (1ULL << __REQ_FAILFAST_DEV) #define REQ_FAILFAST_TRANSPORT (1ULL << __REQ_FAILFAST_TRANSPORT) #define REQ_FAILFAST_DRIVER (1ULL << __REQ_FAILFAST_DRIVER) #define REQ_SYNC (1ULL << __REQ_SYNC) #define REQ_META (1ULL << __REQ_META) #define REQ_PRIO (1ULL << __REQ_PRIO) -#define REQ_DISCARD (1ULL << __REQ_DISCARD) -#define REQ_WRITE_SAME (1ULL << __REQ_WRITE_SAME) #define REQ_NOIDLE (1ULL << __REQ_NOIDLE) #define REQ_INTEGRITY (1ULL << __REQ_INTEGRITY) #define REQ_FAILFAST_MASK \ (REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT | REQ_FAILFAST_DRIVER) #define REQ_COMMON_MASK \ - (REQ_WRITE | REQ_FAILFAST_MASK | REQ_SYNC | REQ_META | REQ_PRIO | \ - REQ_DISCARD | REQ_WRITE_SAME | REQ_NOIDLE | REQ_FLUSH | REQ_FUA | \ - REQ_SECURE | REQ_INTEGRITY) + (REQ_FAILFAST_MASK | REQ_SYNC | REQ_META | REQ_PRIO | REQ_NOIDLE | \ + REQ_FLUSH | REQ_FUA | REQ_SECURE | REQ_INTEGRITY) #define REQ_CLONE_MASK REQ_COMMON_MASK -#define BIO_NO_ADVANCE_ITER_MASK (REQ_DISCARD|REQ_WRITE_SAME) - /* This mask is used for both bio and request merge checking */ #define REQ_NOMERGE_FLAGS \ (REQ_NOMERGE | REQ_STARTED | REQ_SOFTBARRIER | REQ_FLUSH | REQ_FUA | REQ_FLUSH_SEQ) @@ -250,9 +241,9 @@ enum rq_flag_bits { enum req_op { REQ_OP_READ, - REQ_OP_WRITE = REQ_WRITE, - REQ_OP_DISCARD = REQ_DISCARD, - REQ_OP_WRITE_SAME = REQ_WRITE_SAME, + REQ_OP_WRITE, + REQ_OP_DISCARD, /* request to discard sectors */ + REQ_OP_WRITE_SAME, /* write same block many times */ }; typedef unsigned int blk_qc_t; diff --git a/include/linux/fs.h b/include/linux/fs.h index 9becf20..509e21f 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -153,9 +153,10 @@ typedef void (dax_iodone_t)(struct buffer_head *bh_map, int uptodate); #define CHECK_IOVEC_ONLY -1 /* - * The below are the various read and write types that we support. Some of + * The below are the various read and write flags that we support. Some of * them include behavioral modifiers that send information down to the - * block layer and IO scheduler. Terminology: + * block layer and IO scheduler. They should be used along with a req_op. + * Terminology: * * The block layer uses device plugging to defer IO a little bit, in * the hope that we will see more IO very shortly. This increases @@ -194,19 +195,19 @@ typedef void (dax_iodone_t)(struct buffer_head *bh_map, int uptodate); * non-volatile media on completion. * */ -#define RW_MASK REQ_WRITE +#define RW_MASK REQ_OP_WRITE #define RWA_MASK REQ_RAHEAD -#define READ 0 +#define READ REQ_OP_READ #define WRITE RW_MASK #define READA RWA_MASK -#define READ_SYNC (READ | REQ_SYNC) -#define WRITE_SYNC (WRITE | REQ_SYNC | REQ_NOIDLE) -#define WRITE_ODIRECT (WRITE | REQ_SYNC) -#define WRITE_FLUSH (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_FLUSH) -#define WRITE_FUA (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_FUA) -#define WRITE_FLUSH_FUA (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_FLUSH | REQ_FUA) +#define READ_SYNC REQ_SYNC +#define WRITE_SYNC (REQ_SYNC | REQ_NOIDLE) +#define WRITE_ODIRECT REQ_SYNC +#define WRITE_FLUSH (REQ_SYNC | REQ_NOIDLE | REQ_FLUSH) +#define WRITE_FUA (REQ_SYNC | REQ_NOIDLE | REQ_FUA) +#define WRITE_FLUSH_FUA (REQ_SYNC | REQ_NOIDLE | REQ_FLUSH | REQ_FUA) /* * Attribute flags. These should be or-ed together to figure out what diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h index db75d69..20f708e 100644 --- a/include/trace/events/f2fs.h +++ b/include/trace/events/f2fs.h @@ -31,7 +31,6 @@ TRACE_DEFINE_ENUM(BG_GC); TRACE_DEFINE_ENUM(LFS); TRACE_DEFINE_ENUM(SSR); TRACE_DEFINE_ENUM(__REQ_RAHEAD); -TRACE_DEFINE_ENUM(__REQ_WRITE); TRACE_DEFINE_ENUM(__REQ_SYNC); TRACE_DEFINE_ENUM(__REQ_NOIDLE); TRACE_DEFINE_ENUM(__REQ_FLUSH); -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:17:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 97F577D61 for ; Fri, 15 Apr 2016 14:17:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1A05CAC002 for ; Fri, 15 Apr 2016 12:17:49 -0700 (PDT) X-ASG-Debug-ID: 1460747866-04bdf01103610880001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id yiUlFaFALDDZCO5Z (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:46 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 98D75201E9; Fri, 15 Apr 2016 19:17:46 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIi3007872; Fri, 15 Apr 2016 15:17:44 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 37/42] block, fs, drivers: do use bi_rw/cmd_flags for REQ_OPs. Date: Fri, 15 Apr 2016 14:16:12 -0500 X-ASG-Orig-Subj: [PATCH 37/42] block, fs, drivers: do use bi_rw/cmd_flags for REQ_OPs. Message-Id: <1460747777-8479-38-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747866 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie We no longer use the bio->bi_rw and request->cmd_flags field for REQ_OPs: REQ_WRITE, REQ_DISCARD, REQ_WRITE_SAME, so this patch stops checking for them in bi_rw/cmd_flags and also removes the related compat code. v2: 1. Remove compat code in __get_request. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- block/bio.c | 6 ++--- block/blk-core.c | 34 ++++++++--------------------- block/blk-merge.c | 14 ++++++------ block/blk-mq.c | 3 +-- drivers/ata/libata-scsi.c | 2 +- drivers/block/brd.c | 2 +- drivers/block/drbd/drbd_main.c | 15 +++++++------ drivers/block/drbd/drbd_worker.c | 4 ++-- drivers/block/loop.c | 6 ++--- drivers/block/rbd.c | 2 +- drivers/block/rsxx/dma.c | 2 +- drivers/block/umem.c | 2 +- drivers/block/zram/zram_drv.c | 2 +- drivers/ide/ide-floppy.c | 2 +- drivers/lightnvm/rrpc.c | 2 +- drivers/md/bcache/request.c | 10 ++++----- drivers/md/dm-cache-target.c | 10 +++++---- drivers/md/dm-crypt.c | 2 +- drivers/md/dm-log-writes.c | 2 +- drivers/md/dm-raid1.c | 8 +++---- drivers/md/dm-region-hash.c | 4 ++-- drivers/md/dm-stripe.c | 4 ++-- drivers/md/dm-thin.c | 15 ++++++++----- drivers/md/dm.c | 6 ++--- drivers/md/linear.c | 2 +- drivers/md/raid0.c | 2 +- drivers/scsi/osd/osd_initiator.c | 4 ++-- drivers/staging/lustre/lustre/llite/lloop.c | 6 ++--- include/linux/bio.h | 15 ++++++++----- include/linux/fs.h | 25 +++++++-------------- 30 files changed, 99 insertions(+), 114 deletions(-) diff --git a/block/bio.c b/block/bio.c index 921de2e..bec5b54 100644 --- a/block/bio.c +++ b/block/bio.c @@ -675,10 +675,10 @@ struct bio *bio_clone_bioset(struct bio *bio_src, gfp_t gfp_mask, bio->bi_iter.bi_sector = bio_src->bi_iter.bi_sector; bio->bi_iter.bi_size = bio_src->bi_iter.bi_size; - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) goto integrity_clone; - if (bio->bi_rw & REQ_WRITE_SAME) { + if (bio->bi_op == REQ_OP_WRITE_SAME) { bio->bi_io_vec[bio->bi_vcnt++] = bio_src->bi_io_vec[0]; goto integrity_clone; } @@ -1797,7 +1797,7 @@ struct bio *bio_split(struct bio *bio, int sectors, * Discards need a mutable bio_vec to accommodate the payload * required by the DSM TRIM and UNMAP commands. */ - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) split = bio_clone_bioset(bio, gfp, bs); else split = bio_clone_fast(bio, gfp, bs); diff --git a/block/blk-core.c b/block/blk-core.c index e2f7b0a..ccf2056 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1151,8 +1151,7 @@ static struct request *__get_request(struct request_list *rl, int op, blk_rq_init(q, rq); blk_rq_set_rl(rq, rl); - /* tmp compat - allow users to check either one for the op */ - rq->cmd_flags = op | op_flags | REQ_ALLOCED; + rq->cmd_flags = op_flags | REQ_ALLOCED; rq->op = op; /* init elvpriv */ @@ -1705,8 +1704,7 @@ void init_request_from_bio(struct request *req, struct bio *bio) { req->cmd_type = REQ_TYPE_FS; - /* tmp compat. Allow users to set bi_op or bi_rw */ - req->cmd_flags |= (bio->bi_rw | bio->bi_op) & REQ_COMMON_MASK; + req->cmd_flags |= bio->bi_rw & REQ_COMMON_MASK; if (bio->bi_rw & REQ_RAHEAD) req->cmd_flags |= REQ_FAILFAST_MASK; @@ -1856,9 +1854,9 @@ static void handle_bad_sector(struct bio *bio) char b[BDEVNAME_SIZE]; printk(KERN_INFO "attempt to access beyond end of device\n"); - printk(KERN_INFO "%s: rw=%ld, want=%Lu, limit=%Lu\n", + printk(KERN_INFO "%s: rw=%d,%ld, want=%Lu, limit=%Lu\n", bdevname(bio->bi_bdev, b), - bio->bi_rw, + bio->bi_op, bio->bi_rw, (unsigned long long)bio_end_sector(bio), (long long)(i_size_read(bio->bi_bdev->bd_inode) >> 9)); } @@ -1980,14 +1978,14 @@ generic_make_request_checks(struct bio *bio) } } - if ((bio->bi_rw & REQ_DISCARD) && + if ((bio->bi_op == REQ_OP_DISCARD) && (!blk_queue_discard(q) || ((bio->bi_rw & REQ_SECURE) && !blk_queue_secdiscard(q)))) { err = -EOPNOTSUPP; goto end_io; } - if (bio->bi_rw & REQ_WRITE_SAME && !bdev_write_same(bio->bi_bdev)) { + if (bio->bi_op == REQ_OP_WRITE_SAME && !bdev_write_same(bio->bi_bdev)) { err = -EOPNOTSUPP; goto end_io; } @@ -2041,12 +2039,6 @@ blk_qc_t generic_make_request(struct bio *bio) struct bio_list bio_list_on_stack; blk_qc_t ret = BLK_QC_T_NONE; - /* tmp compat. Allow users to set either one or both. - * This will be removed when we have converted - * everyone in the next patches. - */ - bio->bi_rw |= bio->bi_op; - if (!generic_make_request_checks(bio)) goto out; @@ -2116,12 +2108,6 @@ EXPORT_SYMBOL(generic_make_request); */ blk_qc_t submit_bio(struct bio *bio) { - /* tmp compat. Allow users to set either one or both. - * This will be removed when we have converted - * everyone in the next patches. - */ - bio->bi_rw |= bio->bi_op; - /* * If it's a regular read/write or a barrier with data attached, * go through the normal accounting stuff before submission. @@ -2129,12 +2115,12 @@ blk_qc_t submit_bio(struct bio *bio) if (bio_has_data(bio)) { unsigned int count; - if (unlikely(bio->bi_rw & REQ_WRITE_SAME)) + if (unlikely(bio->bi_op == REQ_OP_WRITE_SAME)) count = bdev_logical_block_size(bio->bi_bdev) >> 9; else count = bio_sectors(bio); - if (bio->bi_rw & WRITE) { + if (op_is_write(bio->bi_op)) { count_vm_events(PGPGOUT, count); } else { task_io_account_read(bio->bi_iter.bi_size); @@ -2145,7 +2131,7 @@ blk_qc_t submit_bio(struct bio *bio) char b[BDEVNAME_SIZE]; printk(KERN_DEBUG "%s(%d): %s block %Lu on %s (%u sectors)\n", current->comm, task_pid_nr(current), - (bio->bi_rw & WRITE) ? "WRITE" : "READ", + op_is_write(bio->bi_op) ? "WRITE" : "READ", (unsigned long long)bio->bi_iter.bi_sector, bdevname(bio->bi_bdev, b), count); @@ -2995,8 +2981,6 @@ EXPORT_SYMBOL_GPL(__blk_end_request_err); void blk_rq_bio_prep(struct request_queue *q, struct request *rq, struct bio *bio) { - /* tmp compat. Allow users to set bi_op or bi_rw */ - rq->cmd_flags |= bio_data_dir(bio); rq->op = bio->bi_op; if (bio_has_data(bio)) diff --git a/block/blk-merge.c b/block/blk-merge.c index c02371f..31dc0c0 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -172,9 +172,9 @@ void blk_queue_split(struct request_queue *q, struct bio **bio, struct bio *split, *res; unsigned nsegs; - if ((*bio)->bi_rw & REQ_DISCARD) + if ((*bio)->bi_op == REQ_OP_DISCARD) split = blk_bio_discard_split(q, *bio, bs, &nsegs); - else if ((*bio)->bi_rw & REQ_WRITE_SAME) + else if ((*bio)->bi_op == REQ_OP_WRITE_SAME) split = blk_bio_write_same_split(q, *bio, bs, &nsegs); else split = blk_bio_segment_split(q, *bio, q->bio_split, &nsegs); @@ -213,10 +213,10 @@ static unsigned int __blk_recalc_rq_segments(struct request_queue *q, * This should probably be returning 0, but blk_add_request_payload() * (Christoph!!!!) */ - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) return 1; - if (bio->bi_rw & REQ_WRITE_SAME) + if (bio->bi_op == REQ_OP_WRITE_SAME) return 1; fbio = bio; @@ -385,7 +385,7 @@ static int __blk_bios_map_sg(struct request_queue *q, struct bio *bio, nsegs = 0; cluster = blk_queue_cluster(q); - if (bio->bi_rw & REQ_DISCARD) { + if (bio->bi_op == REQ_OP_DISCARD) { /* * This is a hack - drivers should be neither modifying the * biovec, nor relying on bi_vcnt - but because of @@ -400,7 +400,7 @@ static int __blk_bios_map_sg(struct request_queue *q, struct bio *bio, return 0; } - if (bio->bi_rw & REQ_WRITE_SAME) { + if (bio->bi_op == REQ_OP_WRITE_SAME) { single_segment: *sg = sglist; bvec = bio_iovec(bio); @@ -439,7 +439,7 @@ int blk_rq_map_sg(struct request_queue *q, struct request *rq, } if (q->dma_drain_size && q->dma_drain_needed(rq)) { - if (rq->cmd_flags & REQ_WRITE) + if (op_is_write(rq->op)) memset(q->dma_drain_buffer, 0, q->dma_drain_size); sg_unmark_end(sg); diff --git a/block/blk-mq.c b/block/blk-mq.c index 64d61be..840f57a 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -170,8 +170,7 @@ static void blk_mq_rq_ctx_init(struct request_queue *q, struct blk_mq_ctx *ctx, rq->q = q; rq->mq_ctx = ctx; rq->op = op; - /* tmp compat - allow users to check either one for the op */ - rq->cmd_flags |= op | op_flags; + rq->cmd_flags |= op_flags; /* do not touch atomic flags, it needs atomic ops against the timer */ rq->cpu = -1; INIT_HLIST_NODE(&rq->hash); diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index c7d0fc1..c6086c1 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c @@ -1184,7 +1184,7 @@ static int atapi_drain_needed(struct request *rq) if (likely(rq->cmd_type != REQ_TYPE_BLOCK_PC)) return 0; - if (!blk_rq_bytes(rq) || (rq->cmd_flags & REQ_WRITE)) + if (!blk_rq_bytes(rq) || op_is_write(rq->op)) return 0; return atapi_cmd_type(rq->cmd[0]) == ATAPI_MISC; diff --git a/drivers/block/brd.c b/drivers/block/brd.c index 51a071e..eaefb8c 100644 --- a/drivers/block/brd.c +++ b/drivers/block/brd.c @@ -339,7 +339,7 @@ static blk_qc_t brd_make_request(struct request_queue *q, struct bio *bio) if (bio_end_sector(bio) > get_capacity(bdev->bd_disk)) goto io_error; - if (unlikely(bio->bi_rw & REQ_DISCARD)) { + if (unlikely(bio->bi_op == REQ_OP_DISCARD)) { if (sector & ((PAGE_SIZE >> SECTOR_SHIFT) - 1) || bio->bi_iter.bi_size & ~PAGE_MASK) goto io_error; diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 30c93d6..ace906f 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c @@ -1603,15 +1603,16 @@ static int _drbd_send_zc_ee(struct drbd_peer_device *peer_device, return 0; } -static u32 bio_flags_to_wire(struct drbd_connection *connection, unsigned long bi_rw) +static u32 bio_flags_to_wire(struct drbd_connection *connection, + struct bio *bio) { if (connection->agreed_pro_version >= 95) - return (bi_rw & REQ_SYNC ? DP_RW_SYNC : 0) | - (bi_rw & REQ_FUA ? DP_FUA : 0) | - (bi_rw & REQ_FLUSH ? DP_FLUSH : 0) | - (bi_rw & REQ_DISCARD ? DP_DISCARD : 0); + return (bio->bi_rw & REQ_SYNC ? DP_RW_SYNC : 0) | + (bio->bi_rw & REQ_FUA ? DP_FUA : 0) | + (bio->bi_rw & REQ_FLUSH ? DP_FLUSH : 0) | + (bio->bi_op == REQ_OP_DISCARD ? DP_DISCARD : 0); else - return bi_rw & REQ_SYNC ? DP_RW_SYNC : 0; + return bio->bi_rw & REQ_SYNC ? DP_RW_SYNC : 0; } /* Used to send write or TRIM aka REQ_DISCARD requests @@ -1636,7 +1637,7 @@ int drbd_send_dblock(struct drbd_peer_device *peer_device, struct drbd_request * p->sector = cpu_to_be64(req->i.sector); p->block_id = (unsigned long)req; p->seq_num = cpu_to_be32(atomic_inc_return(&device->packet_seq)); - dp_flags = bio_flags_to_wire(peer_device->connection, req->master_bio->bi_rw); + dp_flags = bio_flags_to_wire(peer_device->connection, req->master_bio); if (device->state.conn >= C_SYNC_SOURCE && device->state.conn <= C_PAUSED_SYNC_T) dp_flags |= DP_MAY_SET_IN_SYNC; diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_worker.c index 2a04b43..0949961 100644 --- a/drivers/block/drbd/drbd_worker.c +++ b/drivers/block/drbd/drbd_worker.c @@ -174,7 +174,7 @@ void drbd_peer_request_endio(struct bio *bio) struct drbd_peer_request *peer_req = bio->bi_private; struct drbd_device *device = peer_req->peer_device->device; int is_write = bio_data_dir(bio) == WRITE; - int is_discard = !!(bio->bi_rw & REQ_DISCARD); + int is_discard = !!(bio->bi_op == REQ_OP_DISCARD); if (bio->bi_error && __ratelimit(&drbd_ratelimit_state)) drbd_warn(device, "%s: error=%d s=%llus\n", @@ -248,7 +248,7 @@ void drbd_request_endio(struct bio *bio) /* to avoid recursion in __req_mod */ if (unlikely(bio->bi_error)) { - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) what = (bio->bi_error == -EOPNOTSUPP) ? DISCARD_COMPLETED_NOTSUPP : DISCARD_COMPLETED_WITH_ERROR; diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 0e80c9b..f1f7a25 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -447,7 +447,7 @@ static int lo_req_flush(struct loop_device *lo, struct request *rq) static inline void handle_partial_read(struct loop_cmd *cmd, long bytes) { - if (bytes < 0 || (cmd->rq->cmd_flags & REQ_WRITE)) + if (bytes < 0 || op_is_write(cmd->rq->op)) return; if (unlikely(bytes < blk_rq_bytes(cmd->rq))) { @@ -535,7 +535,7 @@ static int do_req_filebacked(struct loop_device *lo, struct request *rq) pos = ((loff_t) blk_rq_pos(rq) << 9) + lo->lo_offset; - if (rq->cmd_flags & REQ_WRITE) { + if (op_is_write(rq->op)) { if (rq->cmd_flags & REQ_FLUSH) ret = lo_req_flush(lo, rq); else if (rq->op == REQ_OP_DISCARD) @@ -1666,7 +1666,7 @@ static int loop_queue_rq(struct blk_mq_hw_ctx *hctx, static void loop_handle_cmd(struct loop_cmd *cmd) { - const bool write = cmd->rq->cmd_flags & REQ_WRITE; + const bool write = op_is_write(cmd->rq->op); struct loop_device *lo = cmd->rq->q->queuedata; int ret = 0; diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index e8935af..4c0c057 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -3373,7 +3373,7 @@ static void rbd_queue_workfn(struct work_struct *work) if (rq->op == REQ_OP_DISCARD) op_type = OBJ_OP_DISCARD; - else if (rq->cmd_flags & REQ_WRITE) + else if (rq->op == REQ_OP_WRITE) op_type = OBJ_OP_WRITE; else op_type = OBJ_OP_READ; diff --git a/drivers/block/rsxx/dma.c b/drivers/block/rsxx/dma.c index cf8cd29..dfc189e 100644 --- a/drivers/block/rsxx/dma.c +++ b/drivers/block/rsxx/dma.c @@ -705,7 +705,7 @@ int rsxx_dma_queue_bio(struct rsxx_cardinfo *card, dma_cnt[i] = 0; } - if (bio->bi_rw & REQ_DISCARD) { + if (bio->bi_op == REQ_OP_DISCARD) { bv_len = bio->bi_iter.bi_size; while (bv_len > 0) { diff --git a/drivers/block/umem.c b/drivers/block/umem.c index 7939b9f..a24ccbc 100644 --- a/drivers/block/umem.c +++ b/drivers/block/umem.c @@ -462,7 +462,7 @@ static void process_page(unsigned long data) le32_to_cpu(desc->local_addr)>>9, le32_to_cpu(desc->transfer_size)); dump_dmastat(card, control); - } else if ((bio->bi_rw & REQ_WRITE) && + } else if (op_is_write(bio->bi_op) && le32_to_cpu(desc->local_addr) >> 9 == card->init_size) { card->init_size += le32_to_cpu(desc->transfer_size) >> 9; diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 370c2f7..3c7ef31 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -849,7 +849,7 @@ static void __zram_make_request(struct zram *zram, struct bio *bio) offset = (bio->bi_iter.bi_sector & (SECTORS_PER_PAGE - 1)) << SECTOR_SHIFT; - if (unlikely(bio->bi_rw & REQ_DISCARD)) { + if (unlikely(bio->bi_op == REQ_OP_DISCARD)) { zram_bio_discard(zram, index, offset, bio); bio_endio(bio); return; diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index 2fb5350..f079d8d 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c @@ -206,7 +206,7 @@ static void idefloppy_create_rw_cmd(ide_drive_t *drive, memcpy(rq->cmd, pc->c, 12); pc->rq = rq; - if (rq->cmd_flags & REQ_WRITE) + if (cmd == WRITE) pc->flags |= PC_FLAG_WRITING; pc->flags |= PC_FLAG_DMA_OK; diff --git a/drivers/lightnvm/rrpc.c b/drivers/lightnvm/rrpc.c index fd9b629..9b1a74e 100644 --- a/drivers/lightnvm/rrpc.c +++ b/drivers/lightnvm/rrpc.c @@ -911,7 +911,7 @@ static blk_qc_t rrpc_make_rq(struct request_queue *q, struct bio *bio) struct nvm_rq *rqd; int err; - if (bio->bi_rw & REQ_DISCARD) { + if (bio->bi_op == REQ_OP_DISCARD) { rrpc_discard(rrpc, bio); return BLK_QC_T_NONE; } diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c index cd6837c..be8cd63f 100644 --- a/drivers/md/bcache/request.c +++ b/drivers/md/bcache/request.c @@ -378,7 +378,7 @@ static bool check_should_bypass(struct cached_dev *dc, struct bio *bio) if (test_bit(BCACHE_DEV_DETACHING, &dc->disk.flags) || c->gc_stats.in_use > CUTOFF_CACHE_ADD || - (bio->bi_rw & REQ_DISCARD)) + (bio->bi_op == REQ_OP_DISCARD)) goto skip; if (mode == CACHE_MODE_NONE || @@ -899,7 +899,7 @@ static void cached_dev_write(struct cached_dev *dc, struct search *s) * But check_overlapping drops dirty keys for which io hasn't started, * so we still want to call it. */ - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) s->iop.bypass = true; if (should_writeback(dc, s->orig_bio, @@ -913,7 +913,7 @@ static void cached_dev_write(struct cached_dev *dc, struct search *s) s->iop.bio = s->orig_bio; bio_get(s->iop.bio); - if (!(bio->bi_rw & REQ_DISCARD) || + if (!(bio->bi_op == REQ_OP_DISCARD) || blk_queue_discard(bdev_get_queue(dc->bdev))) closure_bio_submit(bio, cl); } else if (s->iop.writeback) { @@ -993,7 +993,7 @@ static blk_qc_t cached_dev_make_request(struct request_queue *q, cached_dev_read(dc, s); } } else { - if ((bio->bi_rw & REQ_DISCARD) && + if ((bio->bi_op == REQ_OP_DISCARD) && !blk_queue_discard(bdev_get_queue(dc->bdev))) bio_endio(bio); else @@ -1104,7 +1104,7 @@ static blk_qc_t flash_dev_make_request(struct request_queue *q, &KEY(d->id, bio->bi_iter.bi_sector, 0), &KEY(d->id, bio_end_sector(bio), 0)); - s->iop.bypass = (bio->bi_rw & REQ_DISCARD) != 0; + s->iop.bypass = (bio->bi_op == REQ_OP_DISCARD) != 0; s->iop.writeback = true; s->iop.bio = bio; diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c index ee0510f..838f784 100644 --- a/drivers/md/dm-cache-target.c +++ b/drivers/md/dm-cache-target.c @@ -788,7 +788,8 @@ static void check_if_tick_bio_needed(struct cache *cache, struct bio *bio) spin_lock_irqsave(&cache->lock, flags); if (cache->need_tick_bio && - !(bio->bi_rw & (REQ_FUA | REQ_FLUSH | REQ_DISCARD))) { + !(bio->bi_rw & (REQ_FUA | REQ_FLUSH)) && + bio->bi_op != REQ_OP_DISCARD) { pb->tick = true; cache->need_tick_bio = false; } @@ -851,7 +852,7 @@ static void inc_ds(struct cache *cache, struct bio *bio, static bool accountable_bio(struct cache *cache, struct bio *bio) { return ((bio->bi_bdev == cache->origin_dev->bdev) && - !(bio->bi_rw & REQ_DISCARD)); + bio->bi_op != REQ_OP_DISCARD); } static void accounted_begin(struct cache *cache, struct bio *bio) @@ -1067,7 +1068,8 @@ static void dec_io_migrations(struct cache *cache) static bool discard_or_flush(struct bio *bio) { - return bio->bi_rw & (REQ_FLUSH | REQ_FUA | REQ_DISCARD); + return bio->bi_op == REQ_OP_DISCARD || + bio->bi_rw & (REQ_FLUSH | REQ_FUA); } static void __cell_defer(struct cache *cache, struct dm_bio_prison_cell *cell) @@ -1980,7 +1982,7 @@ static void process_deferred_bios(struct cache *cache) if (bio->bi_rw & REQ_FLUSH) process_flush_bio(cache, bio); - else if (bio->bi_rw & REQ_DISCARD) + else if (bio->bi_op == REQ_OP_DISCARD) process_discard_bio(cache, &structs, bio); else process_bio(cache, &structs, bio); diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index 70fbf11..3a4ddad 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c @@ -1916,7 +1916,7 @@ static int crypt_map(struct dm_target *ti, struct bio *bio) * - for REQ_FLUSH device-mapper core ensures that no IO is in-flight * - for REQ_DISCARD caller must use flush if IO ordering matters */ - if (unlikely(bio->bi_rw & (REQ_FLUSH | REQ_DISCARD))) { + if (unlikely(bio->bi_rw & REQ_FLUSH || bio->bi_op == REQ_OP_DISCARD)) { bio->bi_bdev = cc->dev->bdev; if (bio_sectors(bio)) bio->bi_iter.bi_sector = cc->start + diff --git a/drivers/md/dm-log-writes.c b/drivers/md/dm-log-writes.c index 27630c5..e991405 100644 --- a/drivers/md/dm-log-writes.c +++ b/drivers/md/dm-log-writes.c @@ -557,7 +557,7 @@ static int log_writes_map(struct dm_target *ti, struct bio *bio) int i = 0; bool flush_bio = (bio->bi_rw & REQ_FLUSH); bool fua_bio = (bio->bi_rw & REQ_FUA); - bool discard_bio = (bio->bi_rw & REQ_DISCARD); + bool discard_bio = (bio->bi_op == REQ_OP_DISCARD); pb->block = NULL; diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c index 8a86bc3..c4d23da 100644 --- a/drivers/md/dm-raid1.c +++ b/drivers/md/dm-raid1.c @@ -626,7 +626,7 @@ static void write_callback(unsigned long error, void *context) * If the bio is discard, return an error, but do not * degrade the array. */ - if (bio->bi_rw & REQ_DISCARD) { + if (bio->bi_op == REQ_OP_DISCARD) { bio->bi_error = -EOPNOTSUPP; bio_endio(bio); return; @@ -665,7 +665,7 @@ static void do_write(struct mirror_set *ms, struct bio *bio) .client = ms->io_client, }; - if (bio->bi_rw & REQ_DISCARD) { + if (bio->bi_op == REQ_OP_DISCARD) { io_req.bi_op = REQ_OP_DISCARD; io_req.mem.type = DM_IO_KMEM; io_req.mem.ptr.addr = NULL; @@ -705,7 +705,7 @@ static void do_writes(struct mirror_set *ms, struct bio_list *writes) while ((bio = bio_list_pop(writes))) { if ((bio->bi_rw & REQ_FLUSH) || - (bio->bi_rw & REQ_DISCARD)) { + (bio->bi_op == REQ_OP_DISCARD)) { bio_list_add(&sync, bio); continue; } @@ -1253,7 +1253,7 @@ static int mirror_end_io(struct dm_target *ti, struct bio *bio, int error) * We need to dec pending if this was a write. */ if (rw == WRITE) { - if (!(bio->bi_rw & (REQ_FLUSH | REQ_DISCARD))) + if (!(bio->bi_rw & REQ_FLUSH) && bio->bi_op != REQ_OP_DISCARD) dm_rh_dec(ms->rh, bio_record->write_region); return error; } diff --git a/drivers/md/dm-region-hash.c b/drivers/md/dm-region-hash.c index 74cb7b9..ce4af57 100644 --- a/drivers/md/dm-region-hash.c +++ b/drivers/md/dm-region-hash.c @@ -403,7 +403,7 @@ void dm_rh_mark_nosync(struct dm_region_hash *rh, struct bio *bio) return; } - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) return; /* We must inform the log that the sync count has changed. */ @@ -526,7 +526,7 @@ void dm_rh_inc_pending(struct dm_region_hash *rh, struct bio_list *bios) struct bio *bio; for (bio = bios->head; bio; bio = bio->bi_next) { - if (bio->bi_rw & (REQ_FLUSH | REQ_DISCARD)) + if (bio->bi_rw & REQ_FLUSH || bio->bi_op == REQ_OP_DISCARD) continue; rh_inc(rh, dm_rh_bio_to_region(rh, bio)); } diff --git a/drivers/md/dm-stripe.c b/drivers/md/dm-stripe.c index 797ddb9..12b1630 100644 --- a/drivers/md/dm-stripe.c +++ b/drivers/md/dm-stripe.c @@ -292,8 +292,8 @@ static int stripe_map(struct dm_target *ti, struct bio *bio) bio->bi_bdev = sc->stripe[target_bio_nr].dev->bdev; return DM_MAPIO_REMAPPED; } - if (unlikely(bio->bi_rw & REQ_DISCARD) || - unlikely(bio->bi_rw & REQ_WRITE_SAME)) { + if (unlikely(bio->bi_op == REQ_OP_DISCARD) || + unlikely(bio->bi_op == REQ_OP_WRITE_SAME)) { target_bio_nr = dm_bio_get_target_bio_nr(bio); BUG_ON(target_bio_nr >= sc->stripes); return stripe_map_range(sc, bio, target_bio_nr); diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index 6049078..85688b7 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c @@ -715,7 +715,7 @@ static void inc_all_io_entry(struct pool *pool, struct bio *bio) { struct dm_thin_endio_hook *h; - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) return; h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook)); @@ -878,7 +878,8 @@ static void __inc_remap_and_issue_cell(void *context, struct bio *bio; while ((bio = bio_list_pop(&cell->bios))) { - if (bio->bi_rw & (REQ_DISCARD | REQ_FLUSH | REQ_FUA)) + if (bio->bi_rw & (REQ_FLUSH | REQ_FUA) || + bio->bi_op == REQ_OP_DISCARD) bio_list_add(&info->defer_bios, bio); else { inc_all_io_entry(info->tc->pool, bio); @@ -1656,7 +1657,8 @@ static void __remap_and_issue_shared_cell(void *context, while ((bio = bio_list_pop(&cell->bios))) { if ((bio_data_dir(bio) == WRITE) || - (bio->bi_rw & (REQ_DISCARD | REQ_FLUSH | REQ_FUA))) + (bio->bi_rw & (REQ_FLUSH | REQ_FUA) || + bio->bi_op == REQ_OP_DISCARD)) bio_list_add(&info->defer_bios, bio); else { struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook));; @@ -2045,7 +2047,7 @@ static void process_thin_deferred_bios(struct thin_c *tc) break; } - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) pool->process_discard(tc, bio); else pool->process_bio(tc, bio); @@ -2132,7 +2134,7 @@ static void process_thin_deferred_cells(struct thin_c *tc) return; } - if (cell->holder->bi_rw & REQ_DISCARD) + if (cell->holder->bi_op == REQ_OP_DISCARD) pool->process_discard_cell(tc, cell); else pool->process_cell(tc, cell); @@ -2570,7 +2572,8 @@ static int thin_bio_map(struct dm_target *ti, struct bio *bio) return DM_MAPIO_SUBMITTED; } - if (bio->bi_rw & (REQ_DISCARD | REQ_FLUSH | REQ_FUA)) { + if (bio->bi_rw & (REQ_FLUSH | REQ_FUA) || + bio->bi_op == REQ_OP_DISCARD) { thin_defer_bio_with_throttle(tc, bio); return DM_MAPIO_SUBMITTED; } diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 13c869c..4ee7d5c 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -1053,7 +1053,7 @@ static void clone_endio(struct bio *bio) } } - if (unlikely(r == -EREMOTEIO && (bio->bi_rw & REQ_WRITE_SAME) && + if (unlikely(r == -EREMOTEIO && (bio->bi_op == REQ_OP_WRITE_SAME) && !bdev_get_queue(bio->bi_bdev)->limits.max_write_same_sectors)) disable_write_same(md); @@ -1748,9 +1748,9 @@ static int __split_and_process_non_flush(struct clone_info *ci) unsigned len; int r; - if (unlikely(bio->bi_rw & REQ_DISCARD)) + if (unlikely(bio->bi_op == REQ_OP_DISCARD)) return __send_discard(ci); - else if (unlikely(bio->bi_rw & REQ_WRITE_SAME)) + else if (unlikely(bio->bi_op == REQ_OP_WRITE_SAME)) return __send_write_same(ci); ti = dm_table_find_target(ci->map, ci->sector); diff --git a/drivers/md/linear.c b/drivers/md/linear.c index b7fe7e9..aad82c7 100644 --- a/drivers/md/linear.c +++ b/drivers/md/linear.c @@ -252,7 +252,7 @@ static void linear_make_request(struct mddev *mddev, struct bio *bio) split->bi_iter.bi_sector = split->bi_iter.bi_sector - start_sector + data_offset; - if (unlikely((split->bi_rw & REQ_DISCARD) && + if (unlikely((split->bi_op == REQ_OP_DISCARD) && !blk_queue_discard(bdev_get_queue(split->bi_bdev)))) { /* Just ignore it */ bio_endio(split); diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index f63dbb6..58ff1ff 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c @@ -489,7 +489,7 @@ static void raid0_make_request(struct mddev *mddev, struct bio *bio) split->bi_iter.bi_sector = sector + zone->dev_start + tmp_dev->data_offset; - if (unlikely((split->bi_rw & REQ_DISCARD) && + if (unlikely((split->bi_op == REQ_OP_DISCARD) && !blk_queue_discard(bdev_get_queue(split->bi_bdev)))) { /* Just ignore it */ bio_endio(split); diff --git a/drivers/scsi/osd/osd_initiator.c b/drivers/scsi/osd/osd_initiator.c index edcba56..f6572e6 100644 --- a/drivers/scsi/osd/osd_initiator.c +++ b/drivers/scsi/osd/osd_initiator.c @@ -824,7 +824,7 @@ void osd_req_write(struct osd_request *or, { _osd_req_encode_common(or, OSD_ACT_WRITE, obj, offset, len); WARN_ON(or->out.bio || or->out.total_bytes); - WARN_ON(0 == (bio->bi_rw & REQ_WRITE)); + WARN_ON(!op_is_write(bio->bi_op)); or->out.bio = bio; or->out.total_bytes = len; } @@ -875,7 +875,7 @@ void osd_req_read(struct osd_request *or, { _osd_req_encode_common(or, OSD_ACT_READ, obj, offset, len); WARN_ON(or->in.bio || or->in.total_bytes); - WARN_ON(bio->bi_rw & REQ_WRITE); + WARN_ON(op_is_write(bio->bi_op)); or->in.bio = bio; or->in.total_bytes = len; } diff --git a/drivers/staging/lustre/lustre/llite/lloop.c b/drivers/staging/lustre/lustre/llite/lloop.c index f169c0d..e602389 100644 --- a/drivers/staging/lustre/lustre/llite/lloop.c +++ b/drivers/staging/lustre/lustre/llite/lloop.c @@ -211,9 +211,9 @@ static int do_bio_lustrebacked(struct lloop_device *lo, struct bio *head) return io->ci_result; io->ci_lockreq = CILR_NEVER; - rw = head->bi_rw; + rw = bio_data_dir(head); for (bio = head; bio ; bio = bio->bi_next) { - LASSERT(rw == bio->bi_rw); + LASSERT(rw == bio_data_dir(bio)); offset = (pgoff_t)(bio->bi_iter.bi_sector << 9) + lo->lo_offset; bio_for_each_segment(bvec, bio, iter) { @@ -304,7 +304,7 @@ static unsigned int loop_get_bio(struct lloop_device *lo, struct bio **req) /* TODO: need to split the bio, too bad. */ LASSERT(first->bi_vcnt <= LLOOP_MAX_SEGMENTS); - rw = first->bi_rw; + rw = bio_data_dir(first); bio = &lo->lo_bio; while (*bio && (*bio)->bi_rw == rw) { CDEBUG(D_INFO, "bio sector %llu size %u count %u vcnt%u\n", diff --git a/include/linux/bio.h b/include/linux/bio.h index 4724810..9e7b18b 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -106,18 +106,23 @@ static inline bool bio_has_data(struct bio *bio) { if (bio && bio->bi_iter.bi_size && - !(bio->bi_rw & REQ_DISCARD)) + !(bio->bi_op == REQ_OP_DISCARD)) return true; return false; } +static inline bool bio_no_advance_iter(struct bio *bio) +{ + return bio->bi_op == REQ_OP_DISCARD || bio->bi_op == REQ_OP_WRITE_SAME; +} + static inline bool bio_is_rw(struct bio *bio) { if (!bio_has_data(bio)) return false; - if (bio->bi_rw & BIO_NO_ADVANCE_ITER_MASK) + if (bio_no_advance_iter(bio)) return false; return true; @@ -225,7 +230,7 @@ static inline void bio_advance_iter(struct bio *bio, struct bvec_iter *iter, { iter->bi_sector += bytes >> 9; - if (bio->bi_rw & BIO_NO_ADVANCE_ITER_MASK) + if (bio_no_advance_iter(bio)) iter->bi_size -= bytes; else bvec_iter_advance(bio->bi_io_vec, iter, bytes); @@ -253,10 +258,10 @@ static inline unsigned bio_segments(struct bio *bio) * differently: */ - if (bio->bi_rw & REQ_DISCARD) + if (bio->bi_op == REQ_OP_DISCARD) return 1; - if (bio->bi_rw & REQ_WRITE_SAME) + if (bio->bi_op == REQ_OP_WRITE_SAME) return 1; bio_for_each_segment(bv, bio, iter) diff --git a/include/linux/fs.h b/include/linux/fs.h index f3f2f66..9becf20 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2466,33 +2466,24 @@ static inline bool op_is_write(int op) } /* - * return READ, READA, or WRITE + * return data direction, READ or WRITE */ -static inline int bio_rw(struct bio *bio) +static inline int bio_data_dir(struct bio *bio) { - /* - * tmp cpmpat. Allow users to set either op or rw, until - * all code is converted in the next patches. - */ if (op_is_write(bio->bi_op)) return WRITE; - - return bio->bi_rw & (RW_MASK | RWA_MASK); + return READ; } /* - * return data direction, READ or WRITE + * return READ, READA, or WRITE */ -static inline int bio_data_dir(struct bio *bio) +static inline int bio_rw(struct bio *bio) { - /* - * tmp cpmpat. Allow users to set either op or rw, until - * all code is converted in the next patches. - */ - if (op_is_write(bio->bi_op)) - return WRITE; + if (bio->bi_rw & RWA_MASK) + return READA; - return bio->bi_rw & 1; + return bio_data_dir(bio); } extern void check_disk_size_change(struct gendisk *disk, -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:17:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 585197D68 for ; Fri, 15 Apr 2016 14:17:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1BC948F8037 for ; Fri, 15 Apr 2016 12:17:53 -0700 (PDT) X-ASG-Debug-ID: 1460747871-04cb6c24626413d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id AxJoKGazDqFxfWAF (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:51 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 30E0EC062CE6; Fri, 15 Apr 2016 19:17:51 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIi5007872; Fri, 15 Apr 2016 15:17:48 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 39/42] block: shrink bio/request fields Date: Fri, 15 Apr 2016 14:16:14 -0500 X-ASG-Orig-Subj: [PATCH 39/42] block: shrink bio/request fields Message-Id: <1460747777-8479-40-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747871 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie bi_op only needed to be a int for temp compat reasons, so this patch shrinks it to u8. There is no need for bi_rw to be so large now, so that is reduced to a unsigned int and bi_ioprio is just put in its own field. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- block/blk-core.c | 2 +- drivers/md/dm-flakey.c | 2 +- drivers/md/raid5.c | 13 +++++++------ fs/btrfs/check-integrity.c | 4 ++-- fs/btrfs/inode.c | 2 +- include/linux/bio.h | 13 ++----------- include/linux/blk_types.h | 11 +++-------- include/linux/blkdev.h | 2 +- 8 files changed, 18 insertions(+), 31 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index ccf2056..57d21a0 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1854,7 +1854,7 @@ static void handle_bad_sector(struct bio *bio) char b[BDEVNAME_SIZE]; printk(KERN_INFO "attempt to access beyond end of device\n"); - printk(KERN_INFO "%s: rw=%d,%ld, want=%Lu, limit=%Lu\n", + printk(KERN_INFO "%s: rw=%d,%u, want=%Lu, limit=%Lu\n", bdevname(bio->bi_bdev, b), bio->bi_op, bio->bi_rw, (unsigned long long)bio_end_sector(bio), diff --git a/drivers/md/dm-flakey.c b/drivers/md/dm-flakey.c index b7341de..29b99fb 100644 --- a/drivers/md/dm-flakey.c +++ b/drivers/md/dm-flakey.c @@ -266,7 +266,7 @@ static void corrupt_bio_data(struct bio *bio, struct flakey_c *fc) data[fc->corrupt_bio_byte - 1] = fc->corrupt_bio_value; DMDEBUG("Corrupting data bio=%p by writing %u to byte %u " - "(rw=%c bi_rw=%lu bi_sector=%llu cur_bytes=%u)\n", + "(rw=%c bi_rw=%u bi_sector=%llu cur_bytes=%u)\n", bio, fc->corrupt_bio_value, fc->corrupt_bio_byte, (bio_data_dir(bio) == WRITE) ? 'w' : 'r', bio->bi_rw, (unsigned long long)bio->bi_iter.bi_sector, bio_bytes); diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index c36b817..7fb693f 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -1006,9 +1006,9 @@ again: : raid5_end_read_request; bi->bi_private = sh; - pr_debug("%s: for %llu schedule op %ld on disc %d\n", + pr_debug("%s: for %llu schedule op %d,%u on disc %d\n", __func__, (unsigned long long)sh->sector, - bi->bi_rw, i); + bi->bi_op, bi->bi_rw, i); atomic_inc(&sh->count); if (sh != head_sh) atomic_inc(&head_sh->count); @@ -1058,10 +1058,10 @@ again: rbi->bi_end_io = raid5_end_write_request; rbi->bi_private = sh; - pr_debug("%s: for %llu schedule op %ld on " + pr_debug("%s: for %llu schedule op %d,%u on " "replacement disc %d\n", __func__, (unsigned long long)sh->sector, - rbi->bi_rw, i); + rbi->bi_op, rbi->bi_rw, i); atomic_inc(&sh->count); if (sh != head_sh) atomic_inc(&head_sh->count); @@ -1093,8 +1093,9 @@ again: if (!rdev && !rrdev) { if (op_is_write(op)) set_bit(STRIPE_DEGRADED, &sh->state); - pr_debug("skip op %ld on disc %d for sector %llu\n", - bi->bi_rw, i, (unsigned long long)sh->sector); + pr_debug("skip op %d,%u on disc %d for sector %llu\n", + bi->bi_op, bi->bi_rw, i, + (unsigned long long)sh->sector); clear_bit(R5_LOCKED, &sh->dev[i].flags); set_bit(STRIPE_HANDLE, &sh->state); } diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index c4a48e8..921a858 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c @@ -2943,7 +2943,7 @@ static void __btrfsic_submit_bio(struct bio *bio) if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) printk(KERN_INFO - "submit_bio(rw=%d,0x%lx, bi_vcnt=%u," + "submit_bio(rw=%d,0x%x, bi_vcnt=%u," " bi_sector=%llu (bytenr %llu), bi_bdev=%p)\n", bio->bi_op, bio->bi_rw, bio->bi_vcnt, (unsigned long long)bio->bi_iter.bi_sector, @@ -2986,7 +2986,7 @@ static void __btrfsic_submit_bio(struct bio *bio) if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) printk(KERN_INFO - "submit_bio(rw=%d,0x%lx FLUSH, bdev=%p)\n", + "submit_bio(rw=%d,0x%x FLUSH, bdev=%p)\n", bio->bi_op, bio->bi_rw, bio->bi_bdev); if (!dev_state->dummy_block_for_bio_bh_flush.is_iodone) { if ((dev_state->state->print_mask & diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index bd214ab..e2617ba 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -8153,7 +8153,7 @@ static void btrfs_end_dio_bio(struct bio *bio) if (err) btrfs_warn(BTRFS_I(dip->inode)->root->fs_info, - "direct IO failed ino %llu rw %d,%lu sector %#Lx len %u err no %d", + "direct IO failed ino %llu rw %d,0x%x sector %#Lx len %u err no %d", btrfs_ino(dip->inode), bio->bi_op, bio->bi_rw, (unsigned long long)bio->bi_iter.bi_sector, bio->bi_iter.bi_size, err); diff --git a/include/linux/bio.h b/include/linux/bio.h index 9e7b18b..5ece950 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -44,18 +44,9 @@ #define BIO_MAX_SIZE (BIO_MAX_PAGES << PAGE_SHIFT) #define BIO_MAX_SECTORS (BIO_MAX_SIZE >> 9) -/* - * upper 16 bits of bi_rw define the io priority of this bio - */ -#define BIO_PRIO_SHIFT (8 * sizeof(unsigned long) - IOPRIO_BITS) -#define bio_prio(bio) ((bio)->bi_rw >> BIO_PRIO_SHIFT) +#define bio_prio(bio) (bio)->bi_ioprio #define bio_prio_valid(bio) ioprio_valid(bio_prio(bio)) - -#define bio_set_prio(bio, prio) do { \ - WARN_ON(prio >= (1 << IOPRIO_BITS)); \ - (bio)->bi_rw &= ((1UL << BIO_PRIO_SHIFT) - 1); \ - (bio)->bi_rw |= ((unsigned long) (prio) << BIO_PRIO_SHIFT); \ -} while (0) +#define bio_set_prio(bio, prio) ((bio)->bi_ioprio = prio) /* * various member access, note that bio_data should of course not be used diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index b4251ed..498f395 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -48,14 +48,9 @@ struct bio { struct block_device *bi_bdev; unsigned int bi_flags; /* status, command, etc */ int bi_error; - unsigned long bi_rw; /* bottom bits rq_flags_bits - * top bits priority - */ - /* - * this will be a u8 in the next patches and bi_rw can be shrunk to - * a u32. For compat in these transistional patches op is a int here. - */ - int bi_op; /* REQ_OP */ + unsigned int bi_rw; /* rq_flag_bits */ + unsigned short bi_ioprio; + u8 bi_op; /* REQ_OP */ struct bvec_iter bi_iter; diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 5694894..b483a66 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -96,7 +96,7 @@ struct request { struct request_queue *q; struct blk_mq_ctx *mq_ctx; - int op; + u8 op; u64 cmd_flags; unsigned cmd_type; unsigned long atomic_flags; -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:17:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0623C7D25 for ; Fri, 15 Apr 2016 14:17:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 790FBAC005 for ; Fri, 15 Apr 2016 12:17:55 -0700 (PDT) X-ASG-Debug-ID: 1460747873-04bdf011036108a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id q5U3yWYuO6IYxY1e (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:53 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6A8106407F; Fri, 15 Apr 2016 19:17:53 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIi6007872; Fri, 15 Apr 2016 15:17:51 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 40/42] block, drivers: add REQ_OP_FLUSH operation Date: Fri, 15 Apr 2016 14:16:15 -0500 X-ASG-Orig-Subj: [PATCH 40/42] block, drivers: add REQ_OP_FLUSH operation Message-Id: <1460747777-8479-41-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Fri, 15 Apr 2016 19:17:53 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460747873 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie This adds a REQ_OP_FLUSH operation that is sent to request_fn based drivers by the block layer's flush code, instead of sending requests with the request->cmd_flags REQ_FLUSH bit set. For the following 3 flush related patches, I have not tested every driver. I have only tested scsi with xfs and btrfs. v2. 1. Fix kbuild failures. Forgot to update ubd driver. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- Documentation/block/writeback_cache_control.txt | 6 +++--- arch/um/drivers/ubd_kern.c | 2 +- block/blk-flush.c | 3 ++- drivers/block/loop.c | 4 ++-- drivers/block/nbd.c | 2 +- drivers/block/osdblk.c | 2 +- drivers/block/ps3disk.c | 4 ++-- drivers/block/skd_main.c | 2 +- drivers/block/virtio_blk.c | 2 +- drivers/block/xen-blkfront.c | 8 ++++---- drivers/ide/ide-disk.c | 2 +- drivers/md/dm.c | 2 +- drivers/mmc/card/block.c | 5 ++--- drivers/mmc/card/queue.h | 2 +- drivers/mtd/mtd_blkdevs.c | 2 +- drivers/nvme/host/core.c | 2 +- drivers/scsi/sd.c | 7 +++---- include/linux/blk_types.h | 1 + include/linux/blkdev.h | 3 +++ kernel/trace/blktrace.c | 5 ++++- 20 files changed, 36 insertions(+), 30 deletions(-) diff --git a/Documentation/block/writeback_cache_control.txt b/Documentation/block/writeback_cache_control.txt index 59e0516..da70bda 100644 --- a/Documentation/block/writeback_cache_control.txt +++ b/Documentation/block/writeback_cache_control.txt @@ -73,9 +73,9 @@ doing: blk_queue_write_cache(sdkp->disk->queue, true, false); -and handle empty REQ_FLUSH requests in its prep_fn/request_fn. Note that +and handle empty REQ_OP_FLUSH requests in its prep_fn/request_fn. Note that REQ_FLUSH requests with a payload are automatically turned into a sequence -of an empty REQ_FLUSH request followed by the actual write by the block +of an empty REQ_OP_FLUSH request followed by the actual write by the block layer. For devices that also support the FUA bit the block layer needs to be told to pass through the REQ_FUA bit using: @@ -83,4 +83,4 @@ to be told to pass through the REQ_FUA bit using: and the driver must handle write requests that have the REQ_FUA bit set in prep_fn/request_fn. If the FUA bit is not natively supported the block -layer turns it into an empty REQ_FLUSH request after the actual write. +layer turns it into an empty REQ_OP_FLUSH request after the actual write. diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c index 17e96dc..0cb2dab 100644 --- a/arch/um/drivers/ubd_kern.c +++ b/arch/um/drivers/ubd_kern.c @@ -1286,7 +1286,7 @@ static void do_ubd_request(struct request_queue *q) req = dev->request; - if (req->cmd_flags & REQ_FLUSH) { + if (req->op == REQ_OP_FLUSH) { io_req = kmalloc(sizeof(struct io_thread_req), GFP_ATOMIC); if (io_req == NULL) { diff --git a/block/blk-flush.c b/block/blk-flush.c index 6611bcb..a499af7 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c @@ -29,7 +29,7 @@ * The actual execution of flush is double buffered. Whenever a request * needs to execute PRE or POSTFLUSH, it queues at * fq->flush_queue[fq->flush_pending_idx]. Once certain criteria are met, a - * flush is issued and the pending_idx is toggled. When the flush + * REQ_OP_FLUSH is issued and the pending_idx is toggled. When the flush * completes, all the requests which were pending are proceeded to the next * step. This allows arbitrary merging of different types of FLUSH/FUA * requests. @@ -331,6 +331,7 @@ static bool blk_kick_flush(struct request_queue *q, struct blk_flush_queue *fq) flush_rq->cmd_type = REQ_TYPE_FS; flush_rq->cmd_flags = WRITE_FLUSH | REQ_FLUSH_SEQ; + flush_rq->op = REQ_OP_FLUSH; flush_rq->rq_disk = first_rq->rq_disk; flush_rq->end_io = flush_end_io; diff --git a/drivers/block/loop.c b/drivers/block/loop.c index f1f7a25..7d7d7a4f 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -536,7 +536,7 @@ static int do_req_filebacked(struct loop_device *lo, struct request *rq) pos = ((loff_t) blk_rq_pos(rq) << 9) + lo->lo_offset; if (op_is_write(rq->op)) { - if (rq->cmd_flags & REQ_FLUSH) + if (rq->op == REQ_OP_FLUSH) ret = lo_req_flush(lo, rq); else if (rq->op == REQ_OP_DISCARD) ret = lo_discard(lo, rq, pos); @@ -1653,7 +1653,7 @@ static int loop_queue_rq(struct blk_mq_hw_ctx *hctx, if (lo->lo_state != Lo_bound) return -EIO; - if (lo->use_dio && (!(cmd->rq->cmd_flags & REQ_FLUSH) || + if (lo->use_dio && (cmd->rq->op != REQ_OP_FLUSH || cmd->rq->op == REQ_OP_DISCARD)) cmd->use_aio = true; else diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 68a1476..4e9fd5b 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -284,7 +284,7 @@ static int nbd_send_req(struct nbd_device *nbd, struct request *req) type = NBD_CMD_DISC; else if (req->op == REQ_OP_DISCARD) type = NBD_CMD_TRIM; - else if (req->cmd_flags & REQ_FLUSH) + else if (req->op == REQ_OP_FLUSH) type = NBD_CMD_FLUSH; else if (rq_data_dir(req) == WRITE) type = NBD_CMD_WRITE; diff --git a/drivers/block/osdblk.c b/drivers/block/osdblk.c index c2854a2..806e3a3 100644 --- a/drivers/block/osdblk.c +++ b/drivers/block/osdblk.c @@ -321,7 +321,7 @@ static void osdblk_rq_fn(struct request_queue *q) * driver-specific, etc. */ - do_flush = rq->cmd_flags & REQ_FLUSH; + do_flush = (rq->op == REQ_OP_FLUSH); do_write = (rq_data_dir(rq) == WRITE); if (!do_flush) { /* osd_flush does not use a bio */ diff --git a/drivers/block/ps3disk.c b/drivers/block/ps3disk.c index 4b7e405..2e652db 100644 --- a/drivers/block/ps3disk.c +++ b/drivers/block/ps3disk.c @@ -196,7 +196,7 @@ static void ps3disk_do_request(struct ps3_storage_device *dev, dev_dbg(&dev->sbd.core, "%s:%u\n", __func__, __LINE__); while ((req = blk_fetch_request(q))) { - if (req->cmd_flags & REQ_FLUSH) { + if (req->op == REQ_OP_FLUSH) { if (ps3disk_submit_flush_request(dev, req)) break; } else if (req->cmd_type == REQ_TYPE_FS) { @@ -256,7 +256,7 @@ static irqreturn_t ps3disk_interrupt(int irq, void *data) return IRQ_HANDLED; } - if (req->cmd_flags & REQ_FLUSH) { + if (req->op == REQ_OP_FLUSH) { read = 0; op = "flush"; } else { diff --git a/drivers/block/skd_main.c b/drivers/block/skd_main.c index 5739223..01c3cd3 100644 --- a/drivers/block/skd_main.c +++ b/drivers/block/skd_main.c @@ -624,7 +624,7 @@ static void skd_request_fn(struct request_queue *q) count = blk_rq_sectors(req); data_dir = rq_data_dir(req); - if (req->cmd_flags & REQ_FLUSH) + if (req->op == REQ_OP_FLUSH) flush++; if (req->cmd_flags & REQ_FUA) diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index 42758b5..7e1d041 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c @@ -172,7 +172,7 @@ static int virtio_queue_rq(struct blk_mq_hw_ctx *hctx, BUG_ON(req->nr_phys_segments + 2 > vblk->sg_elems); vbr->req = req; - if (req->cmd_flags & REQ_FLUSH) { + if (req->op == REQ_OP_FLUSH) { vbr->out_hdr.type = cpu_to_virtio32(vblk->vdev, VIRTIO_BLK_T_FLUSH); vbr->out_hdr.sector = 0; vbr->out_hdr.ioprio = cpu_to_virtio32(vblk->vdev, req_get_ioprio(vbr->req)); diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index dc08d4d..f01691a 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c @@ -743,7 +743,7 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri * The indirect operation can only be a BLKIF_OP_READ or * BLKIF_OP_WRITE */ - BUG_ON(req->cmd_flags & (REQ_FLUSH | REQ_FUA)); + BUG_ON(req->op == REQ_OP_FLUSH || req->cmd_flags & REQ_FUA); ring_req->operation = BLKIF_OP_INDIRECT; ring_req->u.indirect.indirect_op = rq_data_dir(req) ? BLKIF_OP_WRITE : BLKIF_OP_READ; @@ -755,7 +755,7 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri ring_req->u.rw.handle = info->handle; ring_req->operation = rq_data_dir(req) ? BLKIF_OP_WRITE : BLKIF_OP_READ; - if (req->cmd_flags & (REQ_FLUSH | REQ_FUA)) { + if (req->op == REQ_OP_FLUSH || req->cmd_flags & REQ_FUA) { /* * Ideally we can do an unordered flush-to-disk. * In case the backend onlysupports barriers, use that. @@ -865,7 +865,7 @@ static inline bool blkif_request_flush_invalid(struct request *req, struct blkfront_info *info) { return ((req->cmd_type != REQ_TYPE_FS) || - ((req->cmd_flags & REQ_FLUSH) && + ((req->op == REQ_OP_FLUSH) && !(info->feature_flush & REQ_FLUSH)) || ((req->cmd_flags & REQ_FUA) && !(info->feature_flush & REQ_FUA))); @@ -2055,7 +2055,7 @@ static int blkif_recover(struct blkfront_info *info) /* * Get the bios in the request so we can re-queue them. */ - if (copy[i].request->cmd_flags & REQ_FLUSH || + if (copy[i].request->op == REQ_OP_FLUSH || copy[i].request->op == REQ_OP_DISCARD || copy[i].request->cmd_flags & (REQ_FUA | REQ_SECURE)) { /* diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 05dbcce..538c343 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c @@ -431,7 +431,7 @@ static int idedisk_prep_fn(struct request_queue *q, struct request *rq) ide_drive_t *drive = q->queuedata; struct ide_cmd *cmd; - if (!(rq->cmd_flags & REQ_FLUSH)) + if (rq->op != REQ_OP_FLUSH) return BLKPREP_OK; if (rq->special) { diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 4ee7d5c..bd852bc 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -2171,7 +2171,7 @@ static void dm_request_fn(struct request_queue *q) /* always use block 0 to find the target for flushes for now */ pos = 0; - if (!(rq->cmd_flags & REQ_FLUSH)) + if (rq->op != REQ_OP_FLUSH) pos = blk_rq_pos(rq); if ((dm_request_peeked_before_merge_deadline(md) && diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 8fa3982..25dd331 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -1696,7 +1696,7 @@ static u8 mmc_blk_prep_packed_list(struct mmc_queue *mq, struct request *req) !IS_ALIGNED(blk_rq_sectors(next), 8)) break; - if (next->op == REQ_OP_DISCARD || next->cmd_flags & REQ_FLUSH) + if (next->op == REQ_OP_DISCARD || next->op == REQ_OP_FLUSH) break; if (rq_data_dir(cur) != rq_data_dir(next)) @@ -2121,7 +2121,6 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) struct mmc_card *card = md->queue.card; struct mmc_host *host = card->host; unsigned long flags; - unsigned int cmd_flags = req ? req->cmd_flags : 0; if (req && !mq->mqrq_prev->req) /* claim host only for the first request */ @@ -2145,7 +2144,7 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) ret = mmc_blk_issue_secdiscard_rq(mq, req); else ret = mmc_blk_issue_discard_rq(mq, req); - } else if (cmd_flags & REQ_FLUSH) { + } else if (req && req->op == REQ_OP_FLUSH) { /* complete ongoing async transfer before issuing flush */ if (card->host->areq) mmc_blk_issue_rw_rq(mq, NULL); diff --git a/drivers/mmc/card/queue.h b/drivers/mmc/card/queue.h index f166e5b..6c67e4e 100644 --- a/drivers/mmc/card/queue.h +++ b/drivers/mmc/card/queue.h @@ -3,7 +3,7 @@ static inline bool mmc_req_is_special(struct request *req) { - return req && (req->cmd_flags & REQ_FLUSH || req->op == REQ_OP_DISCARD); + return req && (req->op == REQ_OP_FLUSH || req->op == REQ_OP_DISCARD); } struct request; diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c index e8b0263..688e689 100644 --- a/drivers/mtd/mtd_blkdevs.c +++ b/drivers/mtd/mtd_blkdevs.c @@ -87,7 +87,7 @@ static int do_blktrans_request(struct mtd_blktrans_ops *tr, if (req->cmd_type != REQ_TYPE_FS) return -EIO; - if (req->cmd_flags & REQ_FLUSH) + if (req->op == REQ_OP_FLUSH) return tr->flush(dev); if (blk_rq_pos(req) + blk_rq_cur_sectors(req) > diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index b741aed..7055675 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -232,7 +232,7 @@ int nvme_setup_cmd(struct nvme_ns *ns, struct request *req, if (req->cmd_type == REQ_TYPE_DRV_PRIV) memcpy(cmd, req->cmd, sizeof(*cmd)); - else if (req->cmd_flags & REQ_FLUSH) + else if (req->op == REQ_OP_FLUSH) nvme_setup_flush(ns, cmd); else if (req->op == REQ_OP_DISCARD) ret = nvme_setup_discard(ns, req, cmd); diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 2fc7191..5fe24e6 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1143,12 +1143,11 @@ static int sd_init_command(struct scsi_cmnd *cmd) return sd_setup_discard_cmnd(cmd); case REQ_OP_WRITE_SAME: return sd_setup_write_same_cmnd(cmd); + case REQ_OP_FLUSH: + return sd_setup_flush_cmnd(cmd); case REQ_OP_READ: case REQ_OP_WRITE: - if (rq->cmd_flags & REQ_FLUSH) - return sd_setup_flush_cmnd(cmd); - else - return sd_setup_read_write_cmnd(cmd); + return sd_setup_read_write_cmnd(cmd); default: BUG(); } diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index 498f395..f9e53ca 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -239,6 +239,7 @@ enum req_op { REQ_OP_WRITE, REQ_OP_DISCARD, /* request to discard sectors */ REQ_OP_WRITE_SAME, /* write same block many times */ + REQ_OP_FLUSH, /* request for cache flush */ }; typedef unsigned int blk_qc_t; diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index b483a66..2164e23 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -653,6 +653,9 @@ static inline bool rq_mergeable(struct request *rq) if (rq->cmd_type != REQ_TYPE_FS) return false; + if (rq->op == REQ_OP_FLUSH) + return false; + if (rq->cmd_flags & REQ_NOMERGE_FLAGS) return false; diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index 6a381ea..192d714 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c @@ -223,6 +223,8 @@ static void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes, what |= MASK_TC_BIT(op_flags, FUA); if (op == REQ_OP_DISCARD) what |= BLK_TC_ACT(BLK_TC_DISCARD); + if (op == REQ_OP_FLUSH) + what |= BLK_TC_ACT(BLK_TC_FLUSH); pid = tsk->pid; if (act_log_check(bt, what, sector, pid)) @@ -1775,7 +1777,8 @@ void blk_fill_rwbs(char *rwbs, int op, u32 rw, int bytes) { int i = 0; - if (rw & REQ_FLUSH) + if (rw & REQ_FLUSH || + op == REQ_OP_FLUSH) rwbs[i++] = 'F'; if (op == REQ_OP_WRITE) -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:17:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C201C7D76 for ; Fri, 15 Apr 2016 14:17:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 30865AC002 for ; Fri, 15 Apr 2016 12:17:58 -0700 (PDT) X-ASG-Debug-ID: 1460747876-04cbb02e1d316700001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id qZR3ssSZPDulbbI3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:56 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 32EC71B00; Fri, 15 Apr 2016 19:17:55 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIi7007872; Fri, 15 Apr 2016 15:17:53 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie , Juergen Gross Subject: [PATCH 41/42] block: do not use REQ_FLUSH for tracking flush support Date: Fri, 15 Apr 2016 14:16:16 -0500 X-ASG-Orig-Subj: [PATCH 41/42] block: do not use REQ_FLUSH for tracking flush support Message-Id: <1460747777-8479-42-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747876 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie The last patch added a REQ_OP_FLUSH for request_fn drivers and the next patch renames REQ_FLUSH to REQ_PREFLUSH which will be used by file systems and make_request_fn drivers so they can send a write/flush combo. This patch drops xen's use of REQ_FLUSH to track if it supports REQ_OP_FLUSH requests, so REQ_FLUSH can be deleted. v7: - Fix feature_flush/fua use. v6: - Dropped parts of patch handled by Jens's QUEUE_FLAG_WC/FUA patches and modified patch to check feature_flush/fua bits. Signed-off-by: Mike Christie Reviewed-by: Hannes Reinecke Cc: Juergen Gross --- drivers/block/xen-blkfront.c | 47 ++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index f01691a..d6429e7 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c @@ -196,6 +196,7 @@ struct blkfront_info unsigned int nr_ring_pages; struct request_queue *rq; unsigned int feature_flush; + unsigned int feature_fua; unsigned int feature_discard:1; unsigned int feature_secdiscard:1; unsigned int discard_granularity; @@ -763,19 +764,14 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri * implement it the same way. (It's also a FLUSH+FUA, * since it is guaranteed ordered WRT previous writes.) */ - switch (info->feature_flush & - ((REQ_FLUSH|REQ_FUA))) { - case REQ_FLUSH|REQ_FUA: + if (info->feature_flush && info->feature_fua) ring_req->operation = BLKIF_OP_WRITE_BARRIER; - break; - case REQ_FLUSH: + else if (info->feature_flush) ring_req->operation = BLKIF_OP_FLUSH_DISKCACHE; - break; - default: + else ring_req->operation = 0; - } } ring_req->u.rw.nr_segments = num_grant; if (unlikely(require_extra_req)) { @@ -866,9 +862,9 @@ static inline bool blkif_request_flush_invalid(struct request *req, { return ((req->cmd_type != REQ_TYPE_FS) || ((req->op == REQ_OP_FLUSH) && - !(info->feature_flush & REQ_FLUSH)) || + !info->feature_flush) || ((req->cmd_flags & REQ_FUA) && - !(info->feature_flush & REQ_FUA))); + !info->feature_fua)); } static int blkif_queue_rq(struct blk_mq_hw_ctx *hctx, @@ -985,24 +981,22 @@ static int xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size, return 0; } -static const char *flush_info(unsigned int feature_flush) +static const char *flush_info(struct blkfront_info *info) { - switch (feature_flush & ((REQ_FLUSH | REQ_FUA))) { - case REQ_FLUSH|REQ_FUA: + if (info->feature_flush && info->feature_fua) return "barrier: enabled;"; - case REQ_FLUSH: + else if (info->feature_flush) return "flush diskcache: enabled;"; - default: + else return "barrier or flush: disabled;"; - } } static void xlvbd_flush(struct blkfront_info *info) { - blk_queue_write_cache(info->rq, info->feature_flush & REQ_FLUSH, - info->feature_flush & REQ_FUA); + blk_queue_write_cache(info->rq, info->feature_flush ? true : false, + info->feature_fua ? true : false); pr_info("blkfront: %s: %s %s %s %s %s\n", - info->gd->disk_name, flush_info(info->feature_flush), + info->gd->disk_name, flush_info(info), "persistent grants:", info->feature_persistent ? "enabled;" : "disabled;", "indirect descriptors:", info->max_indirect_segments ? "enabled;" : "disabled;"); @@ -1621,6 +1615,7 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id) if (unlikely(error)) { if (error == -EOPNOTSUPP) error = 0; + info->feature_fua = 0; info->feature_flush = 0; xlvbd_flush(info); } @@ -2315,6 +2310,7 @@ static void blkfront_gather_backend_features(struct blkfront_info *info) unsigned int indirect_segments; info->feature_flush = 0; + info->feature_fua = 0; err = xenbus_gather(XBT_NIL, info->xbdev->otherend, "feature-barrier", "%d", &barrier, @@ -2327,8 +2323,11 @@ static void blkfront_gather_backend_features(struct blkfront_info *info) * * If there are barriers, then we use flush. */ - if (!err && barrier) - info->feature_flush = REQ_FLUSH | REQ_FUA; + if (!err && barrier) { + info->feature_flush = 1; + info->feature_fua = 1; + } + /* * And if there is "feature-flush-cache" use that above * barriers. @@ -2337,8 +2336,10 @@ static void blkfront_gather_backend_features(struct blkfront_info *info) "feature-flush-cache", "%d", &flush, NULL); - if (!err && flush) - info->feature_flush = REQ_FLUSH; + if (!err && flush) { + info->feature_flush = 1; + info->feature_fua = 0; + } err = xenbus_gather(XBT_NIL, info->xbdev->otherend, "feature-discard", "%d", &discard, -- 2.7.2 From mchristi@redhat.com Fri Apr 15 14:18:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 26DB57D81 for ; Fri, 15 Apr 2016 14:18:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 358E6AC002 for ; Fri, 15 Apr 2016 12:18:02 -0700 (PDT) X-ASG-Debug-ID: 1460747878-04cb6c2460641430001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ssWvmSTeqhH9ul1f (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:17:58 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 40254C0467F0; Fri, 15 Apr 2016 19:17:58 +0000 (UTC) Received: from rh2.redhat.com (vpn-53-120.rdu2.redhat.com [10.10.53.120]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJGIi8007872; Fri, 15 Apr 2016 15:17:56 -0400 From: mchristi@redhat.com To: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Cc: Mike Christie Subject: [PATCH 42/42] block, drivers, fs: rename REQ_FLUSH to REQ_PREFLUSH Date: Fri, 15 Apr 2016 14:16:17 -0500 X-ASG-Orig-Subj: [PATCH 42/42] block, drivers, fs: rename REQ_FLUSH to REQ_PREFLUSH Message-Id: <1460747777-8479-43-git-send-email-mchristi@redhat.com> In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@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: 1460747878 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Mike Christie To avoid confusion between REQ_OP_FLUSH, which is handled by request_fn drivers, and upper layers requesting the block layer perform a flush sequence along with possibly a WRITE, this patch renames REQ_FLUSH to REQ_PREFLUSH. Signed-off-by: Mike Christie Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- Documentation/block/writeback_cache_control.txt | 22 +++++++++++----------- Documentation/device-mapper/log-writes.txt | 10 +++++----- block/blk-core.c | 12 ++++++------ block/blk-flush.c | 16 ++++++++-------- block/blk-mq.c | 4 ++-- drivers/block/drbd/drbd_actlog.c | 4 ++-- drivers/block/drbd/drbd_main.c | 2 +- drivers/block/drbd/drbd_protocol.h | 2 +- drivers/block/drbd/drbd_receiver.c | 2 +- drivers/block/drbd/drbd_req.c | 2 +- drivers/md/bcache/journal.c | 2 +- drivers/md/bcache/request.c | 8 ++++---- drivers/md/dm-cache-target.c | 12 ++++++------ drivers/md/dm-crypt.c | 7 ++++--- drivers/md/dm-era-target.c | 4 ++-- drivers/md/dm-io.c | 2 +- drivers/md/dm-log-writes.c | 2 +- drivers/md/dm-raid1.c | 5 +++-- drivers/md/dm-region-hash.c | 4 ++-- drivers/md/dm-snap.c | 6 +++--- drivers/md/dm-stripe.c | 2 +- drivers/md/dm-thin.c | 8 ++++---- drivers/md/dm.c | 12 ++++++------ drivers/md/linear.c | 2 +- drivers/md/md.c | 2 +- drivers/md/md.h | 2 +- drivers/md/multipath.c | 2 +- drivers/md/raid0.c | 2 +- drivers/md/raid1.c | 3 ++- drivers/md/raid10.c | 2 +- drivers/md/raid5-cache.c | 2 +- drivers/md/raid5.c | 2 +- fs/btrfs/check-integrity.c | 8 ++++---- fs/jbd2/journal.c | 2 +- fs/xfs/xfs_buf.c | 2 +- include/linux/blk_types.h | 8 ++++---- include/linux/fs.h | 4 ++-- include/trace/events/f2fs.h | 2 +- kernel/trace/blktrace.c | 5 +++-- 39 files changed, 102 insertions(+), 98 deletions(-) diff --git a/Documentation/block/writeback_cache_control.txt b/Documentation/block/writeback_cache_control.txt index da70bda..8a6bdad 100644 --- a/Documentation/block/writeback_cache_control.txt +++ b/Documentation/block/writeback_cache_control.txt @@ -20,11 +20,11 @@ a forced cache flush, and the Force Unit Access (FUA) flag for requests. Explicit cache flushes ---------------------- -The REQ_FLUSH flag can be OR ed into the r/w flags of a bio submitted from +The REQ_PREFLUSH flag can be OR ed into the r/w flags of a bio submitted from the filesystem and will make sure the volatile cache of the storage device has been flushed before the actual I/O operation is started. This explicitly guarantees that previously completed write requests are on non-volatile -storage before the flagged bio starts. In addition the REQ_FLUSH flag can be +storage before the flagged bio starts. In addition the REQ_PREFLUSH flag can be set on an otherwise empty bio structure, which causes only an explicit cache flush without any dependent I/O. It is recommend to use the blkdev_issue_flush() helper for a pure cache flush. @@ -41,21 +41,21 @@ signaled after the data has been committed to non-volatile storage. Implementation details for filesystems -------------------------------------- -Filesystems can simply set the REQ_FLUSH and REQ_FUA bits and do not have to +Filesystems can simply set the REQ_PREFLUSH and REQ_FUA bits and do not have to worry if the underlying devices need any explicit cache flushing and how -the Forced Unit Access is implemented. The REQ_FLUSH and REQ_FUA flags +the Forced Unit Access is implemented. The REQ_PREFLUSH and REQ_FUA flags may both be set on a single bio. Implementation details for make_request_fn based block drivers -------------------------------------------------------------- -These drivers will always see the REQ_FLUSH and REQ_FUA bits as they sit +These drivers will always see the REQ_PREFLUSH and REQ_FUA bits as they sit directly below the submit_bio interface. For remapping drivers the REQ_FUA bits need to be propagated to underlying devices, and a global flush needs -to be implemented for bios with the REQ_FLUSH bit set. For real device -drivers that do not have a volatile cache the REQ_FLUSH and REQ_FUA bits -on non-empty bios can simply be ignored, and REQ_FLUSH requests without +to be implemented for bios with the REQ_PREFLUSH bit set. For real device +drivers that do not have a volatile cache the REQ_PREFLUSH and REQ_FUA bits +on non-empty bios can simply be ignored, and REQ_PREFLUSH requests without data can be completed successfully without doing any work. Drivers for devices with volatile caches need to implement the support for these flags themselves without any help from the block layer. @@ -65,8 +65,8 @@ Implementation details for request_fn based block drivers -------------------------------------------------------------- For devices that do not support volatile write caches there is no driver -support required, the block layer completes empty REQ_FLUSH requests before -entering the driver and strips off the REQ_FLUSH and REQ_FUA bits from +support required, the block layer completes empty REQ_PREFLUSH requests before +entering the driver and strips off the REQ_PREFLUSH and REQ_FUA bits from requests that have a payload. For devices with volatile write caches the driver needs to tell the block layer that it supports flushing caches by doing: @@ -74,7 +74,7 @@ doing: blk_queue_write_cache(sdkp->disk->queue, true, false); and handle empty REQ_OP_FLUSH requests in its prep_fn/request_fn. Note that -REQ_FLUSH requests with a payload are automatically turned into a sequence +REQ_PREFLUSH requests with a payload are automatically turned into a sequence of an empty REQ_OP_FLUSH request followed by the actual write by the block layer. For devices that also support the FUA bit the block layer needs to be told to pass through the REQ_FUA bit using: diff --git a/Documentation/device-mapper/log-writes.txt b/Documentation/device-mapper/log-writes.txt index c10f30c..f4ebcba 100644 --- a/Documentation/device-mapper/log-writes.txt +++ b/Documentation/device-mapper/log-writes.txt @@ -14,14 +14,14 @@ Log Ordering We log things in order of completion once we are sure the write is no longer in cache. This means that normal WRITE requests are not actually logged until the -next REQ_FLUSH request. This is to make it easier for userspace to replay the -log in a way that correlates to what is on disk and not what is in cache, to -make it easier to detect improper waiting/flushing. +next REQ_PREFLUSH request. This is to make it easier for userspace to replay +the log in a way that correlates to what is on disk and not what is in cache, +to make it easier to detect improper waiting/flushing. This works by attaching all WRITE requests to a list once the write completes. -Once we see a REQ_FLUSH request we splice this list onto the request and once +Once we see a REQ_PREFLUSH request we splice this list onto the request and once the FLUSH request completes we log all of the WRITEs and then the FLUSH. Only -completed WRITEs, at the time the REQ_FLUSH is issued, are added in order to +completed WRITEs, at the time the REQ_PREFLUSH is issued, are added in order to simulate the worst case scenario with regard to power failures. Consider the following example (W means write, C means complete): diff --git a/block/blk-core.c b/block/blk-core.c index 57d21a0..486f805 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1029,7 +1029,7 @@ static bool blk_rq_should_init_elevator(struct bio *bio) * Flush requests do not use the elevator so skip initialization. * This allows a request to share the flush and elevator data. */ - if (bio->bi_rw & (REQ_FLUSH | REQ_FUA)) + if (bio->bi_rw & (REQ_PREFLUSH | REQ_FUA)) return false; return true; @@ -1737,7 +1737,7 @@ static blk_qc_t blk_queue_bio(struct request_queue *q, struct bio *bio) return BLK_QC_T_NONE; } - if (bio->bi_rw & (REQ_FLUSH | REQ_FUA)) { + if (bio->bi_rw & (REQ_PREFLUSH | REQ_FUA)) { spin_lock_irq(q->queue_lock); where = ELEVATOR_INSERT_FLUSH; goto get_rq; @@ -1969,9 +1969,9 @@ generic_make_request_checks(struct bio *bio) * drivers without flush support don't have to worry * about them. */ - if ((bio->bi_rw & (REQ_FLUSH | REQ_FUA)) && + if ((bio->bi_rw & (REQ_PREFLUSH | REQ_FUA)) && !test_bit(QUEUE_FLAG_WC, &q->queue_flags)) { - bio->bi_rw &= ~(REQ_FLUSH | REQ_FUA); + bio->bi_rw &= ~(REQ_PREFLUSH | REQ_FUA); if (!nr_sectors) { err = 0; goto end_io; @@ -2218,7 +2218,7 @@ int blk_insert_cloned_request(struct request_queue *q, struct request *rq) */ BUG_ON(blk_queued_rq(rq)); - if (rq->cmd_flags & (REQ_FLUSH|REQ_FUA)) + if (rq->cmd_flags & (REQ_PREFLUSH | REQ_FUA)) where = ELEVATOR_INSERT_FLUSH; add_acct_request(q, rq, where); @@ -3312,7 +3312,7 @@ void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule) /* * rq is already accounted, so use raw insert */ - if (rq->cmd_flags & (REQ_FLUSH | REQ_FUA)) + if (rq->cmd_flags & (REQ_PREFLUSH | REQ_FUA)) __elv_add_request(q, rq, ELEVATOR_INSERT_FLUSH); else __elv_add_request(q, rq, ELEVATOR_INSERT_SORT_MERGE); diff --git a/block/blk-flush.c b/block/blk-flush.c index a499af7..75a8a58 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c @@ -10,8 +10,8 @@ * optional steps - PREFLUSH, DATA and POSTFLUSH - according to the request * properties and hardware capability. * - * If a request doesn't have data, only REQ_FLUSH makes sense, which - * indicates a simple flush request. If there is data, REQ_FLUSH indicates + * If a request doesn't have data, only REQ_PREFLUSH makes sense, which + * indicates a simple flush request. If there is data, REQ_PREFLUSH indicates * that the device cache should be flushed before the data is executed, and * REQ_FUA means that the data must be on non-volatile media on request * completion. @@ -20,11 +20,11 @@ * difference. The requests are either completed immediately if there's no * data or executed as normal requests otherwise. * - * If the device has writeback cache and supports FUA, REQ_FLUSH is + * If the device has writeback cache and supports FUA, REQ_PREFLUSH is * translated to PREFLUSH but REQ_FUA is passed down directly with DATA. * - * If the device has writeback cache and doesn't support FUA, REQ_FLUSH is - * translated to PREFLUSH and REQ_FUA to POSTFLUSH. + * If the device has writeback cache and doesn't support FUA, REQ_PREFLUSH + * is translated to PREFLUSH and REQ_FUA to POSTFLUSH. * * The actual execution of flush is double buffered. Whenever a request * needs to execute PRE or POSTFLUSH, it queues at @@ -103,7 +103,7 @@ static unsigned int blk_flush_policy(unsigned long fflags, struct request *rq) policy |= REQ_FSEQ_DATA; if (fflags & (1UL << QUEUE_FLAG_WC)) { - if (rq->cmd_flags & REQ_FLUSH) + if (rq->cmd_flags & REQ_PREFLUSH) policy |= REQ_FSEQ_PREFLUSH; if (!(fflags & (1UL << QUEUE_FLAG_FUA)) && (rq->cmd_flags & REQ_FUA)) @@ -392,9 +392,9 @@ void blk_insert_flush(struct request *rq) /* * @policy now records what operations need to be done. Adjust - * REQ_FLUSH and FUA for the driver. + * REQ_PREFLUSH and FUA for the driver. */ - rq->cmd_flags &= ~REQ_FLUSH; + rq->cmd_flags &= ~REQ_PREFLUSH; if (!(fflags & (1UL << QUEUE_FLAG_FUA))) rq->cmd_flags &= ~REQ_FUA; diff --git a/block/blk-mq.c b/block/blk-mq.c index 840f57a..6b0c98d 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -1249,7 +1249,7 @@ static int blk_mq_direct_issue_request(struct request *rq, blk_qc_t *cookie) static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio) { const int is_sync = rw_is_sync(bio->bi_op, bio->bi_rw); - const int is_flush_fua = bio->bi_rw & (REQ_FLUSH | REQ_FUA); + const int is_flush_fua = bio->bi_rw & (REQ_PREFLUSH | REQ_FUA); struct blk_map_ctx data; struct request *rq; unsigned int request_count = 0; @@ -1346,7 +1346,7 @@ done: static blk_qc_t blk_sq_make_request(struct request_queue *q, struct bio *bio) { const int is_sync = rw_is_sync(bio->bi_op, bio->bi_rw); - const int is_flush_fua = bio->bi_rw & (REQ_FLUSH | REQ_FUA); + const int is_flush_fua = bio->bi_rw & (REQ_PREFLUSH | REQ_FUA); struct blk_plug *plug; unsigned int request_count = 0; struct blk_map_ctx data; diff --git a/drivers/block/drbd/drbd_actlog.c b/drivers/block/drbd/drbd_actlog.c index 2fa8534..b12ff76 100644 --- a/drivers/block/drbd/drbd_actlog.c +++ b/drivers/block/drbd/drbd_actlog.c @@ -148,7 +148,7 @@ static int _drbd_md_sync_page_io(struct drbd_device *device, device->md_io.error = -ENODEV; if ((op == REQ_OP_WRITE) && !test_bit(MD_NO_FUA, &device->flags)) - op_flags |= REQ_FUA | REQ_FLUSH; + op_flags |= REQ_FUA | REQ_PREFLUSH; op_flags |= REQ_SYNC | REQ_NOIDLE; bio = bio_alloc_drbd(GFP_NOIO); @@ -848,7 +848,7 @@ int __drbd_change_sync(struct drbd_device *device, sector_t sector, int size, unsigned long count = 0; sector_t esector, nr_sectors; - /* This would be an empty REQ_FLUSH, be silent. */ + /* This would be an empty REQ_PREFLUSH, be silent. */ if ((mode == SET_OUT_OF_SYNC) && size == 0) return 0; diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index ace906f..7936e0e 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c @@ -1609,7 +1609,7 @@ static u32 bio_flags_to_wire(struct drbd_connection *connection, if (connection->agreed_pro_version >= 95) return (bio->bi_rw & REQ_SYNC ? DP_RW_SYNC : 0) | (bio->bi_rw & REQ_FUA ? DP_FUA : 0) | - (bio->bi_rw & REQ_FLUSH ? DP_FLUSH : 0) | + (bio->bi_rw & REQ_PREFLUSH ? DP_FLUSH : 0) | (bio->bi_op == REQ_OP_DISCARD ? DP_DISCARD : 0); else return bio->bi_rw & REQ_SYNC ? DP_RW_SYNC : 0; diff --git a/drivers/block/drbd/drbd_protocol.h b/drivers/block/drbd/drbd_protocol.h index ef92453..129f8c7 100644 --- a/drivers/block/drbd/drbd_protocol.h +++ b/drivers/block/drbd/drbd_protocol.h @@ -112,7 +112,7 @@ struct p_header100 { #define DP_MAY_SET_IN_SYNC 4 #define DP_UNPLUG 8 /* not used anymore */ #define DP_FUA 16 /* equals REQ_FUA */ -#define DP_FLUSH 32 /* equals REQ_FLUSH */ +#define DP_FLUSH 32 /* equals REQ_PREFLUSH */ #define DP_DISCARD 64 /* equals REQ_DISCARD */ #define DP_SEND_RECEIVE_ACK 128 /* This is a proto B write request */ #define DP_SEND_WRITE_ACK 256 /* This is a proto C write request */ diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index a0b95da..4303731 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c @@ -2159,7 +2159,7 @@ static unsigned long wire_flags_to_bio_flags(u32 dpf) { return (dpf & DP_RW_SYNC ? REQ_SYNC : 0) | (dpf & DP_FUA ? REQ_FUA : 0) | - (dpf & DP_FLUSH ? REQ_FLUSH : 0); + (dpf & DP_FLUSH ? REQ_PREFLUSH : 0); } static unsigned long wire_flags_to_bio_op(u32 dpf) diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c index 2255dcf..eef6e95 100644 --- a/drivers/block/drbd/drbd_req.c +++ b/drivers/block/drbd/drbd_req.c @@ -1132,7 +1132,7 @@ static int drbd_process_write_request(struct drbd_request *req) * replicating, in which case there is no point. */ if (unlikely(req->i.size == 0)) { /* The only size==0 bios we expect are empty flushes. */ - D_ASSERT(device, req->master_bio->bi_rw & REQ_FLUSH); + D_ASSERT(device, req->master_bio->bi_rw & REQ_PREFLUSH); if (remote) _req_mod(req, QUEUE_AS_DRBD_BARRIER); return remote; diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c index 68fa0f0..6e0a330 100644 --- a/drivers/md/bcache/journal.c +++ b/drivers/md/bcache/journal.c @@ -627,7 +627,7 @@ static void journal_write_unlocked(struct closure *cl) bio->bi_iter.bi_sector = PTR_OFFSET(k, i); bio->bi_bdev = ca->bdev; bio->bi_op = REQ_OP_WRITE; - bio->bi_rw = REQ_SYNC|REQ_META|REQ_FLUSH|REQ_FUA; + bio->bi_rw = REQ_SYNC|REQ_META|REQ_PREFLUSH|REQ_FUA; bio->bi_iter.bi_size = sectors << 9; bio->bi_end_io = journal_write_endio; diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c index be8cd63f..3947114 100644 --- a/drivers/md/bcache/request.c +++ b/drivers/md/bcache/request.c @@ -205,10 +205,10 @@ static void bch_data_insert_start(struct closure *cl) return bch_data_invalidate(cl); /* - * Journal writes are marked REQ_FLUSH; if the original write was a + * Journal writes are marked REQ_PREFLUSH; if the original write was a * flush, it'll wait on the journal write. */ - bio->bi_rw &= ~(REQ_FLUSH|REQ_FUA); + bio->bi_rw &= ~(REQ_PREFLUSH|REQ_FUA); do { unsigned i; @@ -668,7 +668,7 @@ static inline struct search *search_alloc(struct bio *bio, s->iop.write_prio = 0; s->iop.error = 0; s->iop.flags = 0; - s->iop.flush_journal = (bio->bi_rw & (REQ_FLUSH|REQ_FUA)) != 0; + s->iop.flush_journal = (bio->bi_rw & (REQ_PREFLUSH|REQ_FUA)) != 0; s->iop.wq = bcache_wq; return s; @@ -920,7 +920,7 @@ static void cached_dev_write(struct cached_dev *dc, struct search *s) bch_writeback_add(dc); s->iop.bio = bio; - if (bio->bi_rw & REQ_FLUSH) { + if (bio->bi_rw & REQ_PREFLUSH) { /* Also need to send a flush to the backing device */ struct bio *flush = bio_alloc_bioset(GFP_NOIO, 0, dc->disk.bio_split); diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c index 838f784..af753a6 100644 --- a/drivers/md/dm-cache-target.c +++ b/drivers/md/dm-cache-target.c @@ -788,7 +788,7 @@ static void check_if_tick_bio_needed(struct cache *cache, struct bio *bio) spin_lock_irqsave(&cache->lock, flags); if (cache->need_tick_bio && - !(bio->bi_rw & (REQ_FUA | REQ_FLUSH)) && + !(bio->bi_rw & (REQ_FUA | REQ_PREFLUSH)) && bio->bi_op != REQ_OP_DISCARD) { pb->tick = true; cache->need_tick_bio = false; @@ -830,7 +830,7 @@ static dm_oblock_t get_bio_block(struct cache *cache, struct bio *bio) static int bio_triggers_commit(struct cache *cache, struct bio *bio) { - return bio->bi_rw & (REQ_FLUSH | REQ_FUA); + return bio->bi_rw & (REQ_PREFLUSH | REQ_FUA); } /* @@ -1069,7 +1069,7 @@ static void dec_io_migrations(struct cache *cache) static bool discard_or_flush(struct bio *bio) { return bio->bi_op == REQ_OP_DISCARD || - bio->bi_rw & (REQ_FLUSH | REQ_FUA); + bio->bi_rw & (REQ_PREFLUSH | REQ_FUA); } static void __cell_defer(struct cache *cache, struct dm_bio_prison_cell *cell) @@ -1614,8 +1614,8 @@ static void process_flush_bio(struct cache *cache, struct bio *bio) remap_to_cache(cache, bio, 0); /* - * REQ_FLUSH is not directed at any particular block so we don't - * need to inc_ds(). REQ_FUA's are split into a write + REQ_FLUSH + * REQ_PREFLUSH is not directed at any particular block so we don't + * need to inc_ds(). REQ_FUA's are split into a write + REQ_PREFLUSH * by dm-core. */ issue(cache, bio); @@ -1980,7 +1980,7 @@ static void process_deferred_bios(struct cache *cache) bio = bio_list_pop(&bios); - if (bio->bi_rw & REQ_FLUSH) + if (bio->bi_rw & REQ_PREFLUSH) process_flush_bio(cache, bio); else if (bio->bi_op == REQ_OP_DISCARD) process_discard_bio(cache, &structs, bio); diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index 3a4ddad..9481dbc 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c @@ -1912,11 +1912,12 @@ static int crypt_map(struct dm_target *ti, struct bio *bio) struct crypt_config *cc = ti->private; /* - * If bio is REQ_FLUSH or REQ_DISCARD, just bypass crypt queues. - * - for REQ_FLUSH device-mapper core ensures that no IO is in-flight + * If bio is REQ_PREFLUSH or REQ_DISCARD, just bypass crypt queues. + * - for REQ_PREFLUSH device-mapper core ensures that no IO is in-flight * - for REQ_DISCARD caller must use flush if IO ordering matters */ - if (unlikely(bio->bi_rw & REQ_FLUSH || bio->bi_op == REQ_OP_DISCARD)) { + if (unlikely(bio->bi_rw & REQ_PREFLUSH || + bio->bi_op == REQ_OP_DISCARD)) { bio->bi_bdev = cc->dev->bdev; if (bio_sectors(bio)) bio->bi_iter.bi_sector = cc->start + diff --git a/drivers/md/dm-era-target.c b/drivers/md/dm-era-target.c index 665bf32..2faf49d8 100644 --- a/drivers/md/dm-era-target.c +++ b/drivers/md/dm-era-target.c @@ -1540,9 +1540,9 @@ static int era_map(struct dm_target *ti, struct bio *bio) remap_to_origin(era, bio); /* - * REQ_FLUSH bios carry no data, so we're not interested in them. + * REQ_PREFLUSH bios carry no data, so we're not interested in them. */ - if (!(bio->bi_rw & REQ_FLUSH) && + if (!(bio->bi_rw & REQ_PREFLUSH) && (bio_data_dir(bio) == WRITE) && !metadata_current_marked(era->md, block)) { defer_bio(era, bio); diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c index 0f723ca..f96ba41 100644 --- a/drivers/md/dm-io.c +++ b/drivers/md/dm-io.c @@ -381,7 +381,7 @@ static void dispatch_io(int op, int op_flags, unsigned int num_regions, */ for (i = 0; i < num_regions; i++) { *dp = old_pages; - if (where[i].count || (op_flags & REQ_FLUSH)) + if (where[i].count || (op_flags & REQ_PREFLUSH)) do_region(op, op_flags, i, where + i, dp, io); } diff --git a/drivers/md/dm-log-writes.c b/drivers/md/dm-log-writes.c index e991405..73793bd 100644 --- a/drivers/md/dm-log-writes.c +++ b/drivers/md/dm-log-writes.c @@ -555,7 +555,7 @@ static int log_writes_map(struct dm_target *ti, struct bio *bio) struct bio_vec bv; size_t alloc_size; int i = 0; - bool flush_bio = (bio->bi_rw & REQ_FLUSH); + bool flush_bio = (bio->bi_rw & REQ_PREFLUSH); bool fua_bio = (bio->bi_rw & REQ_FUA); bool discard_bio = (bio->bi_op == REQ_OP_DISCARD); diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c index c4d23da..bd1ba80 100644 --- a/drivers/md/dm-raid1.c +++ b/drivers/md/dm-raid1.c @@ -704,7 +704,7 @@ static void do_writes(struct mirror_set *ms, struct bio_list *writes) bio_list_init(&requeue); while ((bio = bio_list_pop(writes))) { - if ((bio->bi_rw & REQ_FLUSH) || + if ((bio->bi_rw & REQ_PREFLUSH) || (bio->bi_op == REQ_OP_DISCARD)) { bio_list_add(&sync, bio); continue; @@ -1253,7 +1253,8 @@ static int mirror_end_io(struct dm_target *ti, struct bio *bio, int error) * We need to dec pending if this was a write. */ if (rw == WRITE) { - if (!(bio->bi_rw & REQ_FLUSH) && bio->bi_op != REQ_OP_DISCARD) + if (!(bio->bi_rw & REQ_PREFLUSH) && + bio->bi_op != REQ_OP_DISCARD) dm_rh_dec(ms->rh, bio_record->write_region); return error; } diff --git a/drivers/md/dm-region-hash.c b/drivers/md/dm-region-hash.c index ce4af57..d257428 100644 --- a/drivers/md/dm-region-hash.c +++ b/drivers/md/dm-region-hash.c @@ -398,7 +398,7 @@ void dm_rh_mark_nosync(struct dm_region_hash *rh, struct bio *bio) region_t region = dm_rh_bio_to_region(rh, bio); int recovering = 0; - if (bio->bi_rw & REQ_FLUSH) { + if (bio->bi_rw & REQ_PREFLUSH) { rh->flush_failure = 1; return; } @@ -526,7 +526,7 @@ void dm_rh_inc_pending(struct dm_region_hash *rh, struct bio_list *bios) struct bio *bio; for (bio = bios->head; bio; bio = bio->bi_next) { - if (bio->bi_rw & REQ_FLUSH || bio->bi_op == REQ_OP_DISCARD) + if (bio->bi_rw & REQ_PREFLUSH || bio->bi_op == REQ_OP_DISCARD) continue; rh_inc(rh, dm_rh_bio_to_region(rh, bio)); } diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c index 70bb0e8..69ab1ff 100644 --- a/drivers/md/dm-snap.c +++ b/drivers/md/dm-snap.c @@ -1680,7 +1680,7 @@ static int snapshot_map(struct dm_target *ti, struct bio *bio) init_tracked_chunk(bio); - if (bio->bi_rw & REQ_FLUSH) { + if (bio->bi_rw & REQ_PREFLUSH) { bio->bi_bdev = s->cow->bdev; return DM_MAPIO_REMAPPED; } @@ -1799,7 +1799,7 @@ static int snapshot_merge_map(struct dm_target *ti, struct bio *bio) init_tracked_chunk(bio); - if (bio->bi_rw & REQ_FLUSH) { + if (bio->bi_rw & REQ_PREFLUSH) { if (!dm_bio_get_target_bio_nr(bio)) bio->bi_bdev = s->origin->bdev; else @@ -2285,7 +2285,7 @@ static int origin_map(struct dm_target *ti, struct bio *bio) bio->bi_bdev = o->dev->bdev; - if (unlikely(bio->bi_rw & REQ_FLUSH)) + if (unlikely(bio->bi_rw & REQ_PREFLUSH)) return DM_MAPIO_REMAPPED; if (bio_rw(bio) != WRITE) diff --git a/drivers/md/dm-stripe.c b/drivers/md/dm-stripe.c index 12b1630..e6f330c 100644 --- a/drivers/md/dm-stripe.c +++ b/drivers/md/dm-stripe.c @@ -286,7 +286,7 @@ static int stripe_map(struct dm_target *ti, struct bio *bio) uint32_t stripe; unsigned target_bio_nr; - if (bio->bi_rw & REQ_FLUSH) { + if (bio->bi_rw & REQ_PREFLUSH) { target_bio_nr = dm_bio_get_target_bio_nr(bio); BUG_ON(target_bio_nr >= sc->stripes); bio->bi_bdev = sc->stripe[target_bio_nr].dev->bdev; diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index 85688b7..a75815d 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c @@ -707,7 +707,7 @@ static void remap_to_origin(struct thin_c *tc, struct bio *bio) static int bio_triggers_commit(struct thin_c *tc, struct bio *bio) { - return (bio->bi_rw & (REQ_FLUSH | REQ_FUA)) && + return (bio->bi_rw & (REQ_PREFLUSH | REQ_FUA)) && dm_thin_changed_this_transaction(tc->td); } @@ -878,7 +878,7 @@ static void __inc_remap_and_issue_cell(void *context, struct bio *bio; while ((bio = bio_list_pop(&cell->bios))) { - if (bio->bi_rw & (REQ_FLUSH | REQ_FUA) || + if (bio->bi_rw & (REQ_PREFLUSH | REQ_FUA) || bio->bi_op == REQ_OP_DISCARD) bio_list_add(&info->defer_bios, bio); else { @@ -1657,7 +1657,7 @@ static void __remap_and_issue_shared_cell(void *context, while ((bio = bio_list_pop(&cell->bios))) { if ((bio_data_dir(bio) == WRITE) || - (bio->bi_rw & (REQ_FLUSH | REQ_FUA) || + (bio->bi_rw & (REQ_PREFLUSH | REQ_FUA) || bio->bi_op == REQ_OP_DISCARD)) bio_list_add(&info->defer_bios, bio); else { @@ -2572,7 +2572,7 @@ static int thin_bio_map(struct dm_target *ti, struct bio *bio) return DM_MAPIO_SUBMITTED; } - if (bio->bi_rw & (REQ_FLUSH | REQ_FUA) || + if (bio->bi_rw & (REQ_PREFLUSH | REQ_FUA) || bio->bi_op == REQ_OP_DISCARD) { thin_defer_bio_with_throttle(tc, bio); return DM_MAPIO_SUBMITTED; diff --git a/drivers/md/dm.c b/drivers/md/dm.c index bd852bc..f8ec80f 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -1003,12 +1003,12 @@ static void dec_pending(struct dm_io *io, int error) if (io_error == DM_ENDIO_REQUEUE) return; - if ((bio->bi_rw & REQ_FLUSH) && bio->bi_iter.bi_size) { + if ((bio->bi_rw & REQ_PREFLUSH) && bio->bi_iter.bi_size) { /* * Preflush done for flush with data, reissue - * without REQ_FLUSH. + * without REQ_PREFLUSH. */ - bio->bi_rw &= ~REQ_FLUSH; + bio->bi_rw &= ~REQ_PREFLUSH; queue_io(md, bio); } else { /* done with normal IO or empty flush */ @@ -1477,7 +1477,7 @@ EXPORT_SYMBOL_GPL(dm_set_target_max_io_len); /* * A target may call dm_accept_partial_bio only from the map routine. It is - * allowed for all bio types except REQ_FLUSH. + * allowed for all bio types except REQ_PREFLUSH. * * dm_accept_partial_bio informs the dm that the target only wants to process * additional n_sectors sectors of the bio and the rest of the data should be @@ -1507,7 +1507,7 @@ void dm_accept_partial_bio(struct bio *bio, unsigned n_sectors) { struct dm_target_io *tio = container_of(bio, struct dm_target_io, clone); unsigned bi_size = bio->bi_iter.bi_size >> SECTOR_SHIFT; - BUG_ON(bio->bi_rw & REQ_FLUSH); + BUG_ON(bio->bi_rw & REQ_PREFLUSH); BUG_ON(bi_size > *tio->len_ptr); BUG_ON(n_sectors > bi_size); *tio->len_ptr -= bi_size - n_sectors; @@ -1795,7 +1795,7 @@ static void __split_and_process_bio(struct mapped_device *md, start_io_acct(ci.io); - if (bio->bi_rw & REQ_FLUSH) { + if (bio->bi_rw & REQ_PREFLUSH) { ci.bio = &ci.md->flush_bio; ci.sector_count = 0; error = __send_empty_flush(&ci); diff --git a/drivers/md/linear.c b/drivers/md/linear.c index aad82c7..657053e 100644 --- a/drivers/md/linear.c +++ b/drivers/md/linear.c @@ -221,7 +221,7 @@ static void linear_make_request(struct mddev *mddev, struct bio *bio) struct bio *split; sector_t start_sector, end_sector, data_offset; - if (unlikely(bio->bi_rw & REQ_FLUSH)) { + if (unlikely(bio->bi_rw & REQ_PREFLUSH)) { md_flush_request(mddev, bio); return; } diff --git a/drivers/md/md.c b/drivers/md/md.c index 9c40368..3bfdc79 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -413,7 +413,7 @@ static void md_submit_flush_data(struct work_struct *ws) /* an empty barrier - all done */ bio_endio(bio); else { - bio->bi_rw &= ~REQ_FLUSH; + bio->bi_rw &= ~REQ_PREFLUSH; mddev->pers->make_request(mddev, bio); } diff --git a/drivers/md/md.h b/drivers/md/md.h index 2e0918f..b4f3352 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -424,7 +424,7 @@ struct mddev { /* Generic flush handling. * The last to finish preflush schedules a worker to submit - * the rest of the request (without the REQ_FLUSH flag). + * the rest of the request (without the REQ_PREFLUSH flag). */ struct bio *flush_bio; atomic_t flush_pending; diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c index dd483bb..72ea98e 100644 --- a/drivers/md/multipath.c +++ b/drivers/md/multipath.c @@ -111,7 +111,7 @@ static void multipath_make_request(struct mddev *mddev, struct bio * bio) struct multipath_bh * mp_bh; struct multipath_info *multipath; - if (unlikely(bio->bi_rw & REQ_FLUSH)) { + if (unlikely(bio->bi_rw & REQ_PREFLUSH)) { md_flush_request(mddev, bio); return; } diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index 58ff1ff..8cfc5a6 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c @@ -459,7 +459,7 @@ static void raid0_make_request(struct mddev *mddev, struct bio *bio) struct md_rdev *tmp_dev; struct bio *split; - if (unlikely(bio->bi_rw & REQ_FLUSH)) { + if (unlikely(bio->bi_rw & REQ_PREFLUSH)) { md_flush_request(mddev, bio); return; } diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index c7abd2d..2a2c177 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -1056,7 +1056,8 @@ static void raid1_make_request(struct mddev *mddev, struct bio * bio) const int op = bio->bi_op; const int rw = bio_data_dir(bio); const unsigned long do_sync = (bio->bi_rw & REQ_SYNC); - const unsigned long do_flush_fua = (bio->bi_rw & (REQ_FLUSH | REQ_FUA)); + const unsigned long do_flush_fua = (bio->bi_rw & + (REQ_PREFLUSH | REQ_FUA)); const unsigned long do_sec = (bio->bi_rw & REQ_SECURE); struct md_rdev *blocked_rdev; struct blk_plug_cb *cb; diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 63cd985..c5dc4e4 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -1452,7 +1452,7 @@ static void raid10_make_request(struct mddev *mddev, struct bio *bio) struct bio *split; - if (unlikely(bio->bi_rw & REQ_FLUSH)) { + if (unlikely(bio->bi_rw & REQ_PREFLUSH)) { md_flush_request(mddev, bio); return; } diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c index 56b20c3..e7c8b63 100644 --- a/drivers/md/raid5-cache.c +++ b/drivers/md/raid5-cache.c @@ -536,7 +536,7 @@ int r5l_handle_flush_request(struct r5l_log *log, struct bio *bio) bio_endio(bio); return 0; } - bio->bi_rw &= ~REQ_FLUSH; + bio->bi_rw &= ~REQ_PREFLUSH; return -EAGAIN; } diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 7fb693f..ff7cb4e 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -5159,7 +5159,7 @@ static void raid5_make_request(struct mddev *mddev, struct bio * bi) DEFINE_WAIT(w); bool do_prepare; - if (unlikely(bi->bi_rw & REQ_FLUSH)) { + if (unlikely(bi->bi_rw & REQ_PREFLUSH)) { int ret = r5l_handle_flush_request(conf->log, bi); if (ret == 0) diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index 921a858..c1915f8 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c @@ -2207,7 +2207,7 @@ static void btrfsic_bio_end_io(struct bio *bp) block->dev_bytenr, block->mirror_num); next_block = block->next_in_same_bio; block->iodone_w_error = iodone_w_error; - if (block->submit_bio_bh_rw & REQ_FLUSH) { + if (block->submit_bio_bh_rw & REQ_PREFLUSH) { dev_state->last_flush_gen++; if ((dev_state->state->print_mask & BTRFSIC_PRINT_MASK_END_IO_BIO_BH)) @@ -2243,7 +2243,7 @@ static void btrfsic_bh_end_io(struct buffer_head *bh, int uptodate) block->dev_bytenr, block->mirror_num); block->iodone_w_error = iodone_w_error; - if (block->submit_bio_bh_rw & REQ_FLUSH) { + if (block->submit_bio_bh_rw & REQ_PREFLUSH) { dev_state->last_flush_gen++; if ((dev_state->state->print_mask & BTRFSIC_PRINT_MASK_END_IO_BIO_BH)) @@ -2884,7 +2884,7 @@ int btrfsic_submit_bh(int op, int op_flags, struct buffer_head *bh) btrfsic_process_written_block(dev_state, dev_bytenr, &bh->b_data, 1, NULL, NULL, bh, op_flags); - } else if (NULL != dev_state && (op_flags & REQ_FLUSH)) { + } else if (NULL != dev_state && (op_flags & REQ_PREFLUSH)) { if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) printk(KERN_INFO @@ -2982,7 +2982,7 @@ static void __btrfsic_submit_bio(struct bio *bio) kunmap(bio->bi_io_vec[i].bv_page); } kfree(mapped_datav); - } else if (NULL != dev_state && (bio->bi_rw & REQ_FLUSH)) { + } else if (NULL != dev_state && (bio->bi_rw & REQ_PREFLUSH)) { if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) printk(KERN_INFO diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index 3675b8e..b5d568d 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c @@ -1353,7 +1353,7 @@ static int jbd2_write_superblock(journal_t *journal, int write_flags) trace_jbd2_write_superblock(journal, write_flags); if (!(journal->j_flags & JBD2_BARRIER)) - write_flags &= ~(REQ_FUA | REQ_FLUSH); + write_flags &= ~(REQ_FUA | REQ_PREFLUSH); lock_buffer(bh); if (buffer_write_io_error(bh)) { /* diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 917774e..0caffba 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1242,7 +1242,7 @@ _xfs_buf_ioapply( if (bp->b_flags & XBF_FUA) op_flags |= REQ_FUA; if (bp->b_flags & XBF_FLUSH) - op_flags |= REQ_FLUSH; + op_flags |= REQ_PREFLUSH; /* * Run the write verifier callback function if it exists. If diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index f9e53ca..2b6583a 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -158,7 +158,7 @@ enum rq_flag_bits { __REQ_NOIDLE, /* don't anticipate more IO after this one */ __REQ_INTEGRITY, /* I/O includes block integrity payload */ __REQ_FUA, /* forced unit access */ - __REQ_FLUSH, /* request for cache flush */ + __REQ_PREFLUSH, /* request for cache flush */ /* bio only flags */ __REQ_RAHEAD, /* read ahead, can fail anytime */ @@ -202,12 +202,12 @@ enum rq_flag_bits { (REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT | REQ_FAILFAST_DRIVER) #define REQ_COMMON_MASK \ (REQ_FAILFAST_MASK | REQ_SYNC | REQ_META | REQ_PRIO | REQ_NOIDLE | \ - REQ_FLUSH | REQ_FUA | REQ_SECURE | REQ_INTEGRITY) + REQ_PREFLUSH | REQ_FUA | REQ_SECURE | REQ_INTEGRITY) #define REQ_CLONE_MASK REQ_COMMON_MASK /* This mask is used for both bio and request merge checking */ #define REQ_NOMERGE_FLAGS \ - (REQ_NOMERGE | REQ_STARTED | REQ_SOFTBARRIER | REQ_FLUSH | REQ_FUA | REQ_FLUSH_SEQ) + (REQ_NOMERGE | REQ_STARTED | REQ_SOFTBARRIER | REQ_PREFLUSH | REQ_FUA | REQ_FLUSH_SEQ) #define REQ_RAHEAD (1ULL << __REQ_RAHEAD) #define REQ_THROTTLED (1ULL << __REQ_THROTTLED) @@ -225,7 +225,7 @@ enum rq_flag_bits { #define REQ_PREEMPT (1ULL << __REQ_PREEMPT) #define REQ_ALLOCED (1ULL << __REQ_ALLOCED) #define REQ_COPY_USER (1ULL << __REQ_COPY_USER) -#define REQ_FLUSH (1ULL << __REQ_FLUSH) +#define REQ_PREFLUSH (1ULL << __REQ_PREFLUSH) #define REQ_FLUSH_SEQ (1ULL << __REQ_FLUSH_SEQ) #define REQ_IO_STAT (1ULL << __REQ_IO_STAT) #define REQ_MIXED_MERGE (1ULL << __REQ_MIXED_MERGE) diff --git a/include/linux/fs.h b/include/linux/fs.h index 509e21f..e9ed622 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -205,9 +205,9 @@ typedef void (dax_iodone_t)(struct buffer_head *bh_map, int uptodate); #define READ_SYNC REQ_SYNC #define WRITE_SYNC (REQ_SYNC | REQ_NOIDLE) #define WRITE_ODIRECT REQ_SYNC -#define WRITE_FLUSH (REQ_SYNC | REQ_NOIDLE | REQ_FLUSH) +#define WRITE_FLUSH (REQ_SYNC | REQ_NOIDLE | REQ_PREFLUSH) #define WRITE_FUA (REQ_SYNC | REQ_NOIDLE | REQ_FUA) -#define WRITE_FLUSH_FUA (REQ_SYNC | REQ_NOIDLE | REQ_FLUSH | REQ_FUA) +#define WRITE_FLUSH_FUA (REQ_SYNC | REQ_NOIDLE | REQ_PREFLUSH | REQ_FUA) /* * Attribute flags. These should be or-ed together to figure out what diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h index 20f708e..1e5ab0c 100644 --- a/include/trace/events/f2fs.h +++ b/include/trace/events/f2fs.h @@ -33,7 +33,7 @@ TRACE_DEFINE_ENUM(SSR); TRACE_DEFINE_ENUM(__REQ_RAHEAD); TRACE_DEFINE_ENUM(__REQ_SYNC); TRACE_DEFINE_ENUM(__REQ_NOIDLE); -TRACE_DEFINE_ENUM(__REQ_FLUSH); +TRACE_DEFINE_ENUM(__REQ_PREFLUSH); TRACE_DEFINE_ENUM(__REQ_FUA); TRACE_DEFINE_ENUM(__REQ_PRIO); TRACE_DEFINE_ENUM(__REQ_META); diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index 192d714..bcdd3d3 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c @@ -189,6 +189,7 @@ static const u32 ddir_act[2] = { BLK_TC_ACT(BLK_TC_READ), BLK_TC_ACT(BLK_TC_WRITE) }; #define BLK_TC_RAHEAD BLK_TC_AHEAD +#define BLK_TC_PREFLUSH BLK_TC_FLUSH /* The ilog2() calls fall out because they're constant */ #define MASK_TC_BIT(rw, __name) ((rw & REQ_ ## __name) << \ @@ -219,7 +220,7 @@ static void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes, what |= MASK_TC_BIT(op_flags, SYNC); what |= MASK_TC_BIT(op_flags, RAHEAD); what |= MASK_TC_BIT(op_flags, META); - what |= MASK_TC_BIT(op_flags, FLUSH); + what |= MASK_TC_BIT(op_flags, PREFLUSH); what |= MASK_TC_BIT(op_flags, FUA); if (op == REQ_OP_DISCARD) what |= BLK_TC_ACT(BLK_TC_DISCARD); @@ -1777,7 +1778,7 @@ void blk_fill_rwbs(char *rwbs, int op, u32 rw, int bytes) { int i = 0; - if (rw & REQ_FLUSH || + if (rw & REQ_PREFLUSH || op == REQ_OP_FLUSH) rwbs[i++] = 'F'; -- 2.7.2 From darrick.wong@oracle.com Fri Apr 15 14:30:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 3C5DD7D69 for ; Fri, 15 Apr 2016 14:30:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A01DBAC001 for ; Fri, 15 Apr 2016 12:30:46 -0700 (PDT) X-ASG-Debug-ID: 1460748643-04cbb02e1c317780001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id H67FSCQJR615m1Vq (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:30:44 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u3FJTdvl013724 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 15 Apr 2016 19:29:40 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u3FJTdQj015981 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 15 Apr 2016 19:29:39 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u3FJTauG008834; Fri, 15 Apr 2016 19:29:37 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 15 Apr 2016 12:29:36 -0700 Date: Fri, 15 Apr 2016 12:29:35 -0700 From: "Darrick J. Wong" To: david@fromorbit.com Cc: Christoph Hellwig , xfs@oss.sgi.com, linux-ext4 Subject: XFS reverse-mapping, reflink, and online fs scrub update Message-ID: <20160415192935.GF18517@birch.djwong.org> X-ASG-Orig-Subj: XFS reverse-mapping, reflink, and online fs scrub update MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1460748644 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28767 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Since LSF is next week, I've pushed the rmap+reflink patches to github. The kernel patches are against 4.6-rc3, the xfsprogs patches against for-next, and xfstests patches are against master. The djwong-devel branches in the kernel/xfsprogs/xfstests repositories should be fairly stable. The djwong-experimental branches contain all the patches to implement "multiple bmaps become one rmap" and the beginnings of deferring rmaps across transaction rolls via redo intent items to maintain atomicity. Unfortunately I didn't get that part done in time for LSF and there's some bug that (I think) happens when we're deleting records from the rmapbt on reflink filesystems that causes test failures. So, basically, djwong-devel if you want to run code, and djwong-experimental if you don't mind HBD and bugs everywhere. This is basically a code dump. Also, the online scrub patches (kernel and userspace) are tacked on the end of the -devel branches now. Maybe see you all at LSF. I get to fly through Denver in the middle of a snow storm tomorrow! Oh boy! --D Semi-sane: https://github.com/djwong/linux/commits/djwong-devel https://github.com/djwong/xfsprogs/commits/djwong-devel https://github.com/djwong/xfstests/commits/djwong-devel https://github.com/djwong/xfs-documentation/commits/djwong-devel https://github.com/djwong/man-pages/commits/djwong-devel HBD: https://github.com/djwong/linux/commits/djwong-experimental https://github.com/djwong/xfsprogs/commits/djwong-experimental From msnitzer@redhat.com Fri Apr 15 14:44:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 57C0E7D1F for ; Fri, 15 Apr 2016 14:44:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 195518F8033 for ; Fri, 15 Apr 2016 12:44:35 -0700 (PDT) X-ASG-Debug-ID: 1460749474-04cbb02e1a3184e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id J9baw26FBrGNMeiU (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 15 Apr 2016 12:44:35 -0700 (PDT) X-Barracuda-Envelope-From: msnitzer@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 78F55C049D52; Fri, 15 Apr 2016 19:44:33 +0000 (UTC) Received: from localhost (dhcp-25-149.bos.redhat.com [10.18.25.149]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3FJiWgc005018 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA256 bits=256 verify=NO); Fri, 15 Apr 2016 15:44:33 -0400 Date: Fri, 15 Apr 2016 15:44:32 -0400 From: Mike Snitzer To: mchristi@redhat.com Cc: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Subject: Re: [PATCH 00/42] v7: separate operations from flags in the bio/request structs Message-ID: <20160415194432.GA30077@redhat.com> X-ASG-Orig-Subj: Re: [PATCH 00/42] v7: separate operations from flags in the bio/request structs References: <1460747777-8479-1-git-send-email-mchristi@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460747777-8479-1-git-send-email-mchristi@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1460749474 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Apr 15 2016 at 3:15pm -0400, mchristi@redhat.com wrote: > The following patches begin to cleanup the request->cmd_flags and > bio->bi_rw mess. We currently use cmd_flags to specify the operation, > attributes and state of the request. For bi_rw we use it for similar > info and also the priority but then also have another bi_flags field > for state. At some point, we abused them so much we just made cmd_flags > 64 bits, so we could add more. > > The following patches seperate the operation (read, write discard, > flush, etc) from cmd_flags/bi_rw. > > This patchset was made against linux-next from today April 15 > (git tag next-20160415). > > I put a git tree here: > https://github.com/mikechristie/linux-kernel.git > The patches are in the op branch. > > v7: > 1. Fix broken feature_flush/fua use. > > v6 and maybe hopfully the last version: > 1. Adapt patch 41 to Jens's QUEUE_FLAG_WC/FUA patchset. Why are you blasting out the entire patchset for updates to individual patches at the end of the series? Mail is cheap but look at how wide you're repeatedly spamming this series. Also, look at what you've done to the dm-devel patchwork: https://patchwork.kernel.org/project/dm-devel/list/?state=* Just sayin'... ;) From legal@roadgroup.it Sat Apr 16 07:21:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.2 required=5.0 tests=FREEMAIL_FORGED_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 7A5D67CA0 for ; Sat, 16 Apr 2016 07:21:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id EBCCA8F8037 for ; Sat, 16 Apr 2016 05:21:51 -0700 (PDT) X-ASG-Debug-ID: 1460809303-04bdf0110363e850001-NocioJ Received: from n64.mail01.mtsvc.net (mailout100.mail01.mtsvc.net [216.70.64.196]) by cuda.sgi.com with ESMTP id Ycu6ik8sFceLiKTb (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 16 Apr 2016 05:21:44 -0700 (PDT) X-Barracuda-Envelope-From: legal@roadgroup.it X-Barracuda-Apparent-Source-IP: 216.70.64.196 Received: from [188.162.43.115] (port=33451 helo=client.yota.ru) by n64.mail01.mtsvc.net with esmtpsa (TLSv1.2:DHE-RSA-AES256-GCM-SHA384:256) (Exim 4.84_2) (envelope-from ) id 1arPEK-0006IZ-TB; Sat, 16 Apr 2016 08:21:43 -0400 Message-ID: <4643F5A6AD795655898CC578DCE93FC6@roadgroup.it> Reply-To: "sokolenok" From: "sokolenok" Subject: You're the most important person for me. Date: Sat, 16 Apr 2016 15:21:28 +0400 X-ASG-Orig-Subj: You're the most important person for me. MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="acc709e0108822b4feb3c19cebd4" X-Authenticated-User: 1407596 legal@roadgroup.it X-MT-ID: 313AB2B79B4E00D412DFE6E1FC68728EF480EC4D X-Barracuda-Connect: mailout100.mail01.mtsvc.net[216.70.64.196] X-Barracuda-Start-Time: 1460809304 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.21 X-Barracuda-Spam-Status: No, SCORE=1.21 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE, MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28786 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 1.21 MISSING_HEADERS Missing To: header 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; This is a multi-part message in MIME format. --acc709e0108822b4feb3c19cebd4 Content-Type: multipart/alternative; boundary="0f9bbab784a5e7b6406707d83c00" --0f9bbab784a5e7b6406707d83c00 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable Good day. How are you? Sorry for late answer I have recently found your m= essage in spam folder. I hope it is not too late to start our meeting. My= name is Irina. I am 28. I am looking for a relationships and to have my = own family and kids. I would want 2 kids: a boy and a girl. I am very romantic but s= erious and reliable woman and you can see it by yourself soon. Also I lik= e people with good sense of humor. What about you? What do you like? I would want to know everything! You know one man wrote and asked me for = naked photos. I told him directly not to write me more as I have the othe= r aim. I need a family! I hope our views coincide and you agree with my position. Waiting for you= r rely. Talk to you soon. --0f9bbab784a5e7b6406707d83c00 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
    Good day. How are you? Sorr= y for late=20 answer I have recently found your message in spam folder. I hope it is no= t too=20 late to start our meeting. My name is Irina. I am 28. I am looking for a=20 relationships and to have my own family
    and kids. I would want 2 ki= ds: a boy and=20 a girl. I am very romantic but serious and reliable woman and you can see= it by=20 yourself soon. Also I like people with good sense of humor. What about yo= u? What=20 do you like?
    I would want to know everyt= hing! You=20 know one man wrote and asked me for naked photos. I told him directly not= to=20 write me more as I have the other aim. I need a family!
    I hope our views coincide a= nd you agree=20 with my position. Waiting for your rely. Talk to you=20 soon.
    --0f9bbab784a5e7b6406707d83c00-- --acc709e0108822b4feb3c19cebd4 Content-Type: image/jpeg; name="IMG_DSC38927534.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="IMG_DSC38927534.jpg" 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 V9LaB/3lY5//AFLP+VwJQmqVM3pxXs//2Q== --acc709e0108822b4feb3c19cebd4-- From arnd@arndb.de Sat Apr 16 15:31:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1BF8F7CA0 for ; Sat, 16 Apr 2016 15:31:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9375DAC001 for ; Sat, 16 Apr 2016 13:31:31 -0700 (PDT) X-ASG-Debug-ID: 1460838685-04bdf01102650460001-NocioJ Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.17.13]) by cuda.sgi.com with ESMTP id L3TXIeAKcjaKYRdV (version=TLSv1.2 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 16 Apr 2016 13:31:27 -0700 (PDT) X-Barracuda-Envelope-From: arnd@arndb.de X-Barracuda-Apparent-Source-IP: 212.227.17.13 Received: from wuerfel.lan. ([78.42.132.4]) by mrelayeu.kundenserver.de (mreue103) with ESMTPA (Nemesis) id 0LvhpU-1bpx9k2BvI-017YRB; Sat, 16 Apr 2016 22:31:24 +0200 From: Arnd Bergmann To: Dave Chinner Cc: Arnd Bergmann , xfs@oss.sgi.com, linux-kernel@vger.kernel.org Subject: [PATCH] xfs: hide unused variable Date: Sat, 16 Apr 2016 22:30:36 +0200 X-ASG-Orig-Subj: [PATCH] xfs: hide unused variable Message-Id: <1460838665-1249242-1-git-send-email-arnd@arndb.de> X-Mailer: git-send-email 2.7.0 X-Provags-ID: V03:K0:HYRxgYIQfgsBhXmNJH6EyJj55iecg0ofmYxH3J5BuwpST9eIMIw +6v8lm3e0TrMcwuAnxRAKTCyqokt3qVCuNSE4XA3XeuvKaVGC8bwJgxsWDZeVlqPMaMWzL/ ZSSFqJcaAwpe8G1Bk/sxCoibaHKziewpROseSmkdupgV0lhoOziGIxeXsDsxcnNvMXe9m0w yZUmQmElSBXkeoeXuE1IQ== X-UI-Out-Filterresults: notjunk:1;V01:K0:5HtmmwXh+DE=:NTWvZFoNdramUBOy2cUqQ8 U5cxl9Brp37c2AraYQK7No/KuDQ5/xJrOKsKhaq89h+1b2slAC5AZp/lnbJxy9ZhLWaA2c+Uq MoVCbXPIndhOkYNwyj4z4gN6HyyOkE4kgf+sCGr5w8xGyu7ahFnNMQNkXF7o1pFZ0ZgNIcSQl ZZ7R9ebBFfrWkR0wjbMeWIqRZ7y5ntXTi4VMbsrP8xpt0Q/b27kCr+wAXm8QplJaxZeL79tu3 6b/6BZgF2wNaqADhLVqYysPZaTeJ55zKUxRJzCrVnJWUOZwWvfDBB0v6NCHQ8Ipvq1xugCIik sR/7oa8c4Syye/PzQr/SBfnpJjT07EaH4sgOevWwOcaTlK1nSfmpefiHBAto/s5Jyk88KLa9Y 8yY1uryE+Rp3fd3iItdvuI8X/5B65vmQOESOHSf8vEQWkGhvAvR12fejFo+RFNB3xWPnBRwqY XOP41WyjeR+TZUFLb8FY5d+aWimHB02XsWg2QeL8W623fpiNif2M/jDrivCESbL4IOq05ysx1 ARay+uazGJJ7hLBnesquu08vunOe50bRBtPrjyw/AwofBXreNRh6J+enFmEt0nXW7ERzet5By gLlHr7mOae6EVrKrckxxpxe71IL07yyoSrUY/34P/EukMwGjXN9iZrV1fyQnKGO6kVYrUvdf0 Lwyi1B8VD2A2iYqke9ThN0L3CPXICMyzHCBx8pDoZvTnHpHFZdPUr81dfl8IWietC/Z8= X-Barracuda-Connect: mout.kundenserver.de[212.227.17.13] X-Barracuda-Start-Time: 1460838686 X-Barracuda-Encrypted: DHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28794 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header The newly added xfs_finish_page_writeback() function causes a harmless gcc warning when debugging is disabled: fs/xfs/xfs_aops.c: In function 'xfs_finish_page_writeback': fs/xfs/xfs_aops.c:97:16: error: unused variable 'blockmask' [-Werror=unused-variable] unsigned int blockmask = (1 << inode->i_blkbits) - 1; ^~~~~~~~~ This adds an #ifdef around the variable declaration to hide it whenever the ASSERT macro is defined as a stub, following the same style as used elsewhere in xfs. Signed-off-by: Arnd Bergmann Fixes: 37992c18bba3 ("xfs: don't release bios on completion immediately") --- fs/xfs/xfs_aops.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index e5c3a457c191..737d028914a2 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -94,7 +94,9 @@ xfs_finish_page_writeback( struct bio_vec *bvec, int error) { +#if defined(DEBUG) || defined(XFS_WARN) unsigned int blockmask = (1 << inode->i_blkbits) - 1; +#endif unsigned int end = bvec->bv_offset + bvec->bv_len - 1; struct buffer_head *head, *bh; unsigned int off = 0; -- 2.7.0 From akbar.ramaputra12@kalstaronline.com Sun Apr 17 00:51:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.0 required=5.0 tests=HK_RANDOM_REPLYTO, T_DKIM_INVALID,T_FRT_CONTACT 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 054427CA0 for ; Sun, 17 Apr 2016 00:51:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7AD27AC001 for ; Sat, 16 Apr 2016 22:51:19 -0700 (PDT) X-ASG-Debug-ID: 1460872275-04bdf01105662700001-NocioJ Received: from mail2.kalstaronline.com (mail2.kalstaronline.com [202.43.163.170]) by cuda.sgi.com with ESMTP id IOJFO5oSy1WKIVPZ for ; Sat, 16 Apr 2016 22:51:16 -0700 (PDT) X-Barracuda-Envelope-From: akbar.ramaputra12@kalstaronline.com X-Barracuda-Apparent-Source-IP: 202.43.163.170 Received: from localhost (localhost.localdomain [127.0.0.1]) by mail2.kalstaronline.com (Postfix) with ESMTP id C939119CE394; Sun, 17 Apr 2016 12:49:15 +0700 (WIB) Received: from mail2.kalstaronline.com ([127.0.0.1]) by localhost (mail2.kalstaronline.com [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id AzMiFEnQL7jK; Sun, 17 Apr 2016 12:49:15 +0700 (WIB) Received: from localhost (localhost.localdomain [127.0.0.1]) by mail2.kalstaronline.com (Postfix) with ESMTP id CC16E19CE38B; Sun, 17 Apr 2016 12:49:14 +0700 (WIB) DKIM-Filter: OpenDKIM Filter v2.8.4 mail2.kalstaronline.com CC16E19CE38B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kalstaronline.com; s=FDDC90DE-F623-11E5-8040-0DA408C65E0B; t=1460872155; bh=1JqMoVel7BVHU66elovYATnLey4SodCIKDAvd5cx7AQ=; h=Date:From:Reply-To:Message-ID:Subject:MIME-Version:Content-Type: Content-Transfer-Encoding; b=D3x+kqk2LHae7P0K62ihmCpoWqddLYMcxTY3Q68sOZUOQVf7AXVb4RR8trgWnw/p0 ZfBmuvsfJec2zKVOeA48y1huYqITL5Zqwn15AEWJ/crODcwCIKkEGhi3uyLhj7R3ZC Mgcj7lZna6LMnaTkGNrL7wrddlgkaLYuGdNdeFpw= X-Virus-Scanned: amavisd-new at kalstaronline.com Received: from mail2.kalstaronline.com ([127.0.0.1]) by localhost (mail2.kalstaronline.com [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id wt_PqyVfWgCq; Sun, 17 Apr 2016 12:49:14 +0700 (WIB) Received: from mail2.kalstaronline.com (mail2.kalstaronline.com [202.43.163.170]) by mail2.kalstaronline.com (Postfix) with ESMTP id 102DC19CE353; Sun, 17 Apr 2016 12:49:14 +0700 (WIB) Date: Sun, 17 Apr 2016 12:49:13 +0700 (WIT) From: Central Trust Loan Limited Reply-To: "centraltrustlltd@gmail.com" Message-ID: <365660335.9994.1460872153974.JavaMail.zimbra@kalstaronline.com> Subject: =?utf-8?Q?L=C3=A5netilbud_3%?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?utf-8?Q?L=C3=A5netilbud_3%?= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [197.210.16.151] X-Mailer: Zimbra 8.0.6_GA_5922 (zclient/8.0.6_GA_5922) Thread-Topic: =?utf-8?Q?L=C3=A5netilbud?= 3% Thread-Index: MT6L1t3k/pIgeoo3QD7hSPPTkaVEAQ== X-Barracuda-Connect: mail2.kalstaronline.com[202.43.163.170] X-Barracuda-Start-Time: 1460872275 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.23 X-Barracuda-Spam-Status: No, SCORE=1.23 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, FUZZY_CREDIT, MISSING_HEADERS, THREAD_INDEX, THREAD_TOPIC, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28804 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_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 FUZZY_CREDIT BODY: Attempt to obfuscate words in spam 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; God dag, Dette er CENTRAL TRUST l=C3=A5n selskaper tilbyr l=C3=A5n. Central Trust L=C3=85N Selskapet tilbyr fleksible og rimelige l=C3=A5n til = ethvert form=C3=A5l, for =C3=A5 hjelpe deg =C3=A5 n=C3=A5 dine finansielle = m=C3=A5l. vi l=C3=A5n med lav rente p=C3=A5 3%. Her er noen viktige trekk v= ed personlig l=C3=A5n fra sentral stoler p=C3=A5 utl=C3=A5n selskaper tilby= s. Her er de L=C3=A5ne Faktorer vi samarbeider med de ledende britiske megl= ere som har tilgang til toppen l=C3=A5ngivere og v=C3=A6re i stand til =C3= =A5 finne den beste =C3=B8konomiske l=C3=B8sningen til en rimelig price.Ple= ase, hvis du er interessert kan du kontakte oss via denne e-post: centraltr= ust_ltd@webadicta.org Etter reaksjonen vil du motta en s=C3=B8knad om kreditt fyll. Ingen sosial = sikkerhet og ingen kredittsjekk, 100% garantert. Det er en =C3=A6re for oss hvis du tillater oss til tjeneste. informasjon Needed Dine navn: Adresse: telefon: M=C3=A5 Antall: Varighet: Okkupasjon: M=C3=A5nedlig inntekt: Kj=C3=B8nn: F=C3=B8dselsdato: Status: Land: Hensikt: M=C3=B8t dine =C3=B8konomiske behov er v=C3=A5r stolthet. Vennlig hilsen David Donald From kernel@pfupf.net Sun Apr 17 03:47:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0658E7CA0 for ; Sun, 17 Apr 2016 03:47:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B31C98F8033 for ; Sun, 17 Apr 2016 01:47:13 -0700 (PDT) X-ASG-Debug-ID: 1460882825-04bdf01103669480001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id wfB5xUtQcow00EqB (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Sun, 17 Apr 2016 01:47:06 -0700 (PDT) X-Barracuda-Envelope-From: kernel@pfupf.net 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 06CAFAB08; Sun, 17 Apr 2016 08:47:00 +0000 (UTC) Subject: Re: [PATCH 41/42] block: do not use REQ_FLUSH for tracking flush support To: mchristi@redhat.com, linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com X-ASG-Orig-Subj: Re: [PATCH 41/42] block: do not use REQ_FLUSH for tracking flush support References: <1460747777-8479-1-git-send-email-mchristi@redhat.com> <1460747777-8479-42-git-send-email-mchristi@redhat.com> From: Juergen Gross Message-ID: <57134D83.8020309@pfupf.net> Date: Sun, 17 Apr 2016 10:46:59 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.7.0 MIME-Version: 1.0 In-Reply-To: <1460747777-8479-42-git-send-email-mchristi@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1460882826 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28806 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 15/04/16 21:16, mchristi@redhat.com wrote: > From: Mike Christie > > The last patch added a REQ_OP_FLUSH for request_fn drivers > and the next patch renames REQ_FLUSH to REQ_PREFLUSH which > will be used by file systems and make_request_fn drivers so > they can send a write/flush combo. > > This patch drops xen's use of REQ_FLUSH to track if it supports > REQ_OP_FLUSH requests, so REQ_FLUSH can be deleted. > > v7: > - Fix feature_flush/fua use. > > v6: > - Dropped parts of patch handled by Jens's QUEUE_FLAG_WC/FUA > patches and modified patch to check feature_flush/fua bits. > > Signed-off-by: Mike Christie > Reviewed-by: Hannes Reinecke > Cc: Juergen Gross Acked-by: Juergen Gross Juergen From wendtwerks@gmail.com Sun Apr 17 09:33:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 0A1C27CA0 for ; Sun, 17 Apr 2016 09:33:33 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D0C948F8033 for ; Sun, 17 Apr 2016 07:33:29 -0700 (PDT) X-ASG-Debug-ID: 1460903607-04cbb02e1a37d2d0001-NocioJ Received: from mail-qg0-f47.google.com (mail-qg0-f47.google.com [209.85.192.47]) by cuda.sgi.com with ESMTP id 02AHZEIDyTBlDrPy (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 17 Apr 2016 07:33:28 -0700 (PDT) X-Barracuda-Envelope-From: wendtwerks@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.47 Received: by mail-qg0-f47.google.com with SMTP id f105so104371754qge.2 for ; Sun, 17 Apr 2016 07:33:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to; bh=X2o2Q3nXSRsVzpKIzEEOmJHnrpv4JOHRpZeojhnPG8o=; b=p4VGZGUfu/E/fjt6CDhiJLuPfLi8hfZAICEoneDkPdN/UN3vGgIZtIeDThzldKUy5o L6FG+sg2dsyWvD6IzFWWmccrdRqMzcSj0m6xKJOjnNdQ/XrpHb93qJIa1M6b9U4BSrB2 tOxex3LIw+GyxbsvcfngjeLhflkUVfQGqmhoNTMOllitmBlVk6i4ZmfE+I+6BvicsbBo y5LWCylMUSkZCXJK2ZFxzQLYHW20L211v+KB3dIlHGs4k157x3TP0hF6f30MmYRdDJjS JKaS/tLLcjkokyg06lDxhQgLPjX7K5aFIkx6/yqcb2Hv89wJOEZob+pIMgiIURmhbGZz Dz5g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to; bh=X2o2Q3nXSRsVzpKIzEEOmJHnrpv4JOHRpZeojhnPG8o=; b=DnNEPjfHipUuXot0b/AxShXlgehXWv9pKm8rhbFZe2CAsYaRItEbGocvKba3Djt8JD oCjlMZV15njhI+MtFTA35gDrWMgclo5qNXaynOWW6PiFzYUz4REUmtfcY2svMRSIBbBQ 5U6QtXS127sxcovoU0U4H2purlRLC078zM9eE1idEbKyG5/njTuHT1TYPdh6JeGJmE2b DB7DxBBvd5F8gcn9Ib2oc+N10DrvGpJVFxF86ehDbuO2WddiF4P6N1y4RG+7p/Mjmxlz bygK/8w2WfHX+L7hNYPdKfuCM18Bpdaw/9JydnBDF4A/35TwHTNxh7xmWIEJ7dcuKUQS +OrA== X-Gm-Message-State: AOPr4FWhTRabSDkadlCyMppAdyTOgC94HrAGaW75L1UEm1FMC3oSaW/2KNL94NBT9FVKeGqRd+kDqQUMvVdFUQ== MIME-Version: 1.0 X-Received: by 10.140.253.197 with SMTP id y188mr37026215qhc.67.1460903607353; Sun, 17 Apr 2016 07:33:27 -0700 (PDT) Received: by 10.55.201.131 with HTTP; Sun, 17 Apr 2016 07:33:27 -0700 (PDT) Date: Sun, 17 Apr 2016 09:33:27 -0500 Message-ID: Subject: "xfs_log_force: error 5 returned." for drive that was removed. From: Joe Wendt X-ASG-Orig-Subj: "xfs_log_force: error 5 returned." for drive that was removed. To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a11393a909149e00530af2080 X-Barracuda-Connect: mail-qg0-f47.google.com[209.85.192.47] X-Barracuda-Start-Time: 1460903608 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28812 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 --001a11393a909149e00530af2080 Content-Type: text/plain; charset=UTF-8 Hello! This may be a silly question or an interesting one... We had a drive fail in a production server, which spawned this error in the logs: XFS (sde1): xfs_log_force: error 5 returned. The dead array was lazy-unmounted, and the drive was hot-swapped, but when the RAID array was rebuilt, it came online as /dev/sdk instead of /dev/sde. Now /dev/sde1 doesn't exist in the system, but we still see this message every 30 seconds. I'm assuming a reboot will clear out whatever is still trying to access sde1, but I'm trying to avoid that if possible. Could someone point me in the direction of what XFS might still be trying to do with that device? lsof hasn't given me any clues. I can't run xfs_repair on a volume that isn't there. I haven't been able to find anything similar yet online. Any help would be greatly appreciated! Thanks, Joe --001a11393a909149e00530af2080 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
    Hello! This may be a silly question or an interesting one.= ..

    We had a drive fail in a production server, which spa= wned this error in the logs:=C2=A0
    XFS (sde1): xfs_log_force: err= or 5 returned.

    The dead array was lazy-unmounted, = and the drive was hot-swapped, but when the RAID array was rebuilt, it came= online as /dev/sdk instead of /dev/sde.

    Now /dev/= sde1 doesn't exist in the system, but we still see this message every 3= 0 seconds. I'm assuming a reboot will clear out whatever is still tryin= g to access sde1, but I'm trying to avoid that if possible. Could someo= ne point me in the direction of what XFS might still be trying to do with t= hat device?=C2=A0

    lsof hasn't given me any clu= es. I can't run xfs_repair on a volume that isn't there. I haven= 9;t been able to find anything similar yet online. Any help would be greatl= y appreciated!

    Thanks,
    Joe
    --001a11393a909149e00530af2080-- From sapbnouk@hp.com Sun Apr 17 14:18:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.4 required=5.0 tests=HTML_MESSAGE,RCVD_ILLEGAL_IP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9055B7CA0 for ; Sun, 17 Apr 2016 14:18:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 07F4FAC001 for ; Sun, 17 Apr 2016 12:18:08 -0700 (PDT) X-ASG-Debug-ID: 1460920674-04cb6c245f6a8ee0001-NocioJ Received: from hp.com (51.167.195.113.adsl-pool.jx.chinaunicom.com [113.195.167.51]) by cuda.sgi.com with ESMTP id 8JnUD1Rk33LzoNwy for ; Sun, 17 Apr 2016 12:17:58 -0700 (PDT) X-Barracuda-Envelope-From: sapbnouk@hp.com X-Barracuda-Apparent-Source-IP: 113.195.167.51 Received: from vky (unknown [228.116.83.167]) by hp.com with SMTP id R2Cf34uhAI7CQszP.1 for ; Mon, 18 Apr 2016 03:19:26 +0800 Date: Mon, 18 Apr 2016 03:19:12 +0800 From: "qjxhodg" To: xfs Subject: =?gb2312?B?0MKzo5FCz8K1xMbz0rXXg7jvxWPIy7LFsGzVuQ==?= X-Priority: 3 X-ASG-Orig-Subj: =?gb2312?B?0MKzo5FCz8K1xMbz0rXXg7jvxWPIy7LFsGzVuQ==?= X-Mailer: Foxmail 6, 13, 102, 15 [cn] Mime-Version: 1.0 Message-ID: <201604180319265620070@hp.com> Content-Type: multipart/alternative; boundary="----=_000_NextPart674416158125_=----" X-Barracuda-Connect: 51.167.195.113.adsl-pool.jx.chinaunicom.com[113.195.167.51] X-Barracuda-Start-Time: 1460920675 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.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=HTML_MESSAGE, RCVD_ILLEGAL_IP, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28820 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.23 RCVD_ILLEGAL_IP Received: contains illegal IP address 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS This is a multi-part message in MIME format. ------=_000_NextPart674416158125_=---- Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 DQp4ZnMgOiDE+rrDDQoNCiANCg0KIA0KDQogDQoNCiANCg0KIA0KDQogDQoNCiANCg0KcWp4aG9k Zw0KDQoyMDE2LTQtMTgNCg== ------=_000_NextPart674416158125_=---- Content-Type: text/html; charset="gb2312" Content-Transfer-Encoding: base64 PGh0bWw+PGhlYWQ+DQo8bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9Z2IyMzEyIiBo dHRwLWVxdWl2PUNvbnRlbnQtVHlwZT4NCjwvaGVhZD4NCjxib2R5Pg0KPHA+eGZzJm5ic3A7OiDE +rrDPC9wPg0KPHA+Jm5ic3A7PC9wPg0KPHA+Jm5ic3A7PC9wPg0KPHA+Jm5ic3A7PC9wPg0KPHA+ Jm5ic3A7PC9wPg0KPHA+Jm5ic3A7PC9wPg0KPHA+Jm5ic3A7PC9wPg0KPHA+Jm5ic3A7PC9wPg0K PHA+cWp4aG9kZzwvcD4NCjxwPjIwMTYtNC0xODwvcD48L2JvZHk+PC9odG1sPg0K ------=_000_NextPart674416158125_=------ From tom.leiming@gmail.com Sun Apr 17 16:30:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 62A647CA0 for ; Sun, 17 Apr 2016 16:30:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 36AAE304048 for ; Sun, 17 Apr 2016 14:30:53 -0700 (PDT) X-ASG-Debug-ID: 1460928650-04cbb02e1c3857c0001-NocioJ Received: from mail-yw0-f193.google.com (mail-yw0-f193.google.com [209.85.161.193]) by cuda.sgi.com with ESMTP id sKeoOLZekOWMcU7R (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 17 Apr 2016 14:30:51 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.161.193 Received: by mail-yw0-f193.google.com with SMTP id h6so21371806ywc.1 for ; Sun, 17 Apr 2016 14:30:51 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=XuiQXhfyaGrhrs1AxBKzODjwx4fALPvm0IScdWlSVSw=; b=ahj9BEO4tFqV4MQcr7+XeoSg5keJZMQfjzpqopuWxmN2Xc/bIifsaK6x45utNdV0CY A9auWsg3nexy8EdgkRbDptHY/4k2uzDGgYYywdeWyYnb0kbdDI7FrxYQYxNZ2KKN5saF 9B4f480f7Pi5SZedkjKf+HVvnobcSG8ojTIIHv3w4M2jZ/T2uaULw4StTEROLWmIsiNz z/kUn3pAIPrHvzqQUa9aVe5WIi3QHdxGjuv0/45KA/h2JjX9WQZ8nOpbtYZvhzeQ3hoG EOWz0wbLWHD8MsqnweqNabTIbP8v+DiOdfr7yX48IiAws+xK8QY+I0r3yr0knUXK4MHM 5Uww== X-Gm-Message-State: AOPr4FXIj6HQTZmJUke1CNFxqCo4DE3MfvZE1c4Qt3QAF4ugAsFz6wqBmRgsCPop+an/WA== X-Received: by 10.37.214.77 with SMTP id n74mr11771184ybg.0.1460928650332; Sun, 17 Apr 2016 14:30:50 -0700 (PDT) Received: from localhost ([107.13.171.182]) by smtp.gmail.com with ESMTPSA id w185sm34115261ywe.1.2016.04.17.14.30.49 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Sun, 17 Apr 2016 14:30:49 -0700 (PDT) From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Ming Lei , drbd-dev@lists.linbit.com (open list:DRBD DRIVER), Jan Kara , Keith Busch , Kent Overstreet , "Kirill A. Shutemov" , Mike Snitzer , Shaohua Li , Tejun Heo , xfs@oss.sgi.com (open list:XFS FILESYSTEM) Subject: [PATCH v5 0/8] block: prepare for multipage bvecs Date: Mon, 18 Apr 2016 05:29:49 +0800 X-ASG-Orig-Subj: [PATCH v5 0/8] block: prepare for multipage bvecs Message-Id: <1460928615-20894-1-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 X-Barracuda-Connect: mail-yw0-f193.google.com[209.85.161.193] X-Barracuda-Start-Time: 1460928650 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28824 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi, Interests[1] have been shown in multipage bvecs, so this patchset try to prepare for the support and do two things: 1) the 1st 4 patches use bvec iterator to implement iterate_bvec(), then we can drop the non-standard way for iterating bvec, which can be thought as a good cleanup for lib/iov_iter.c 2) remove BIO_MAX_SECTORS & BIO_MAX_SIZE, and now there is only one user for each. Once multipage bvecs is introduced, one bio may hold lots of sectors, and we should always use sort of BIO_MAX_VECS which should be introduced in future and is similiar with current BIO_MAX_PAGES. The only functional change is iterate_bvec():lib/iov_iter.c xfstests(-a auto) over loop aio is run for ext4/xfs to verify the change and no regression found with this patchset. Jens, I am confidant this time, so please give it a go if no one objects. I appreciate someone(AI? or anyone) can give a review on the patch 4/8 about iterate_bvec() change. V5: - use bvec's iterator to figure new base vec address and update 'skip' correctly - run xfstests(-a auto) on loop aio/dio for verifying the change in iterate_bvec(), and no regression reported - use stree-ng to trigger heavy swap over swapfile to verify change in iterate_bvec() too, looks everything is fine V4: - make xfstests cover xfs - rebase on for-next of block tree V3: - include kenrel.h & bug.h in bvec.h for fix comiling failure on arm as reported by 0day ktest - build test on arm & arm64 V2: - rename bvec_iter.h as bvec.h - always include bvec.h into blk_types.h as suggested by Christoph V1: - don't move BIO_MAX_* to bvec_iter.h as pointed out by Christoph - run xfstests against v4.6-rc1-next-20160329 - add Reviewed-by - for 1,4 and 5, Reviewd-by not added, Christoph still expressed 'this looks fine to me.' Ming Lei (8): block: move bvec iterator into include/linux/bvec.h block: move two bvec structure into bvec.h block: mark 1st parameter of bvec_iter_advance as const iov_iter: use bvec iterator to implement iterate_bvec() fs: xfs: replace BIO_MAX_SECTORS with BIO_MAX_PAGES block: bio: remove BIO_MAX_SECTORS block: drbd: avoid to use BIO_MAX_SIZE block: bio: remove BIO_MAX_SIZE drivers/block/drbd/drbd_int.h | 4 +- fs/xfs/xfs_buf.c | 4 +- include/linux/bio.h | 52 ----------------------- include/linux/blk_types.h | 22 +--------- include/linux/bvec.h | 96 +++++++++++++++++++++++++++++++++++++++++++ lib/iov_iter.c | 45 +++++++------------- 6 files changed, 115 insertions(+), 108 deletions(-) create mode 100644 include/linux/bvec.h -- 1.9.1 From tom.leiming@gmail.com Sun Apr 17 16:31:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 E8B097CA0 for ; Sun, 17 Apr 2016 16:31:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id AE7CE8F8035 for ; Sun, 17 Apr 2016 14:31:13 -0700 (PDT) X-ASG-Debug-ID: 1460928671-04bdf0110467ed70001-NocioJ Received: from mail-yw0-f196.google.com (mail-yw0-f196.google.com [209.85.161.196]) by cuda.sgi.com with ESMTP id wfn7Pedma8d7RBCW (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 17 Apr 2016 14:31:11 -0700 (PDT) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.161.196 Received: by mail-yw0-f196.google.com with SMTP id u62so2426291ywe.3 for ; Sun, 17 Apr 2016 14:31:11 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=xXUdvjLtowonlrbju5ek6j4VIGdC6GChTRig76zBevk=; b=lsVhQwzHsjZtZ43xsv3wnDPU7VenyZN+/EdCQfoOtuoVgiyqlHXtnNVHet/8xUCaHH zS4u6VmL4XUM5386D5ZOVLE6GcfhJ2WDe4/hjalBK0nWyhuZN+OqEwZt8MBGb5mOt3XY rCgiNvOcHzeC1pXav6nTVuVwmIn+CSkR7hurh2dVWS3XVkidgLVfAibyjAatEYtAIS43 0UafR8F8naPX9/GGGVmL3nLhV0cA16bVTQeLvkIUw0qo5LCvZjQ3ujGtisVSES0hdRu0 Q3sI72qbrUt6nRfZf+xikDZLnkLBSqWI+zKsZ4Ii12R0+DKFmQ8RAIbr/ZLMlU4NWEEf caqw== X-Gm-Message-State: AOPr4FUQiiazcd7gn+nMzcNKU/Jw0qthR4dJFB0yMUFbJ9oZA/0Wd3EBND+JvvOT4Bo/KQ== X-Received: by 10.37.209.20 with SMTP id i20mr3962901ybg.15.1460928670977; Sun, 17 Apr 2016 14:31:10 -0700 (PDT) Received: from localhost ([107.13.171.182]) by smtp.gmail.com with ESMTPSA id x8sm30593853ywa.9.2016.04.17.14.31.10 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Sun, 17 Apr 2016 14:31:10 -0700 (PDT) From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Al Viro , Ming Lei , Dave Chinner , xfs@oss.sgi.com (supporter:XFS FILESYSTEM) Subject: [PATCH v5 5/8] fs: xfs: replace BIO_MAX_SECTORS with BIO_MAX_PAGES Date: Mon, 18 Apr 2016 05:29:54 +0800 X-ASG-Orig-Subj: [PATCH v5 5/8] fs: xfs: replace BIO_MAX_SECTORS with BIO_MAX_PAGES Message-Id: <1460928615-20894-6-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1460928615-20894-1-git-send-email-ming.lei@canonical.com> References: <1460928615-20894-1-git-send-email-ming.lei@canonical.com> X-Barracuda-Connect: mail-yw0-f196.google.com[209.85.161.196] X-Barracuda-Start-Time: 1460928671 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28825 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header BIO_MAX_PAGES is used as maximum count of bvecs, so replace BIO_MAX_SECTORS with BIO_MAX_PAGES since BIO_MAX_SECTORS is to be removed. Signed-off-by: Ming Lei --- fs/xfs/xfs_buf.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 9a2191b..b9ecb2d 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1161,9 +1161,7 @@ xfs_buf_ioapply_map( next_chunk: atomic_inc(&bp->b_io_remaining); - nr_pages = BIO_MAX_SECTORS >> (PAGE_SHIFT - BBSHIFT); - if (nr_pages > total_nr_pages) - nr_pages = total_nr_pages; + nr_pages = min(total_nr_pages, BIO_MAX_PAGES); bio = bio_alloc(GFP_NOIO, nr_pages); bio->bi_bdev = bp->b_target->bt_bdev; -- 1.9.1 From sent37163@m.fotomagazzino.com Mon Apr 18 04:13:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.6 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY, MPART_ALT_DIFF,NORMAL_HTTP_TO_IP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9436B7CA0 for ; Mon, 18 Apr 2016 04:13:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1ABD7AC001 for ; Mon, 18 Apr 2016 02:13:54 -0700 (PDT) X-ASG-Debug-ID: 1460970829-04bdf0110568f930001-NocioJ Received: from smtp40179.rspmail-apn3.com (smtp40179.rspmail-apn3.com [43.243.164.179]) by cuda.sgi.com with ESMTP id WdU6ZuBs2qgeZ1Zm for ; Mon, 18 Apr 2016 02:13:49 -0700 (PDT) X-Barracuda-Envelope-From: sent37163@m.fotomagazzino.com X-Barracuda-Apparent-Source-IP: 43.243.164.179 Received: from WINDOWS-WI1AP1I (smtp40002.rspmail-apn1.com [43.243.164.2]) by smtp40179.rspmail-apn3.com (Postfix) with ESMTPA id 0062A263AE2 for ; Mon, 18 Apr 2016 18:11:54 +0800 (HKT) From: "sales07@pcbquick.com" To: "xfs@oss.sgi.com" Date: Mon, 18 Apr 2016 17:13:44 +0800 Subject: PCB Partner/KF QUICK PCB MIME-Version: 1.0 X-ASG-Orig-Subj: PCB Partner/KF QUICK PCB Content-Type: multipart/alternative; boundary="_=aspNetEmail=_d30cd4eb440b40cda1c15e58d7434a8e" X-Mailer: aspNetEmail ver 3.7.0.19 X-Spread-CampaignId: 218605 X-Spread-SubscriberId: 382685807 X-Spread-SpreaderId: 37163 X-Spread-Engine-Build: 4.0.5445.21308 List-Unsubscribe: , Message-ID: X-Barracuda-Connect: smtp40179.rspmail-apn3.com[43.243.164.179] X-Barracuda-Start-Time: 1460970829 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.15 X-Barracuda-Spam-Status: No, SCORE=0.15 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MIME_HTML_ONLY, MIME_HTML_ONLY_MULTI, MPART_ALT_DIFF, NORMAL_HTTP_TO_IP X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28838 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NORMAL_HTTP_TO_IP URI: Uses a dotted-decimal IP address in URL 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 0.00 MIME_HTML_ONLY_MULTI Multipart message only has text/html MIME parts --_=aspNetEmail=_d30cd4eb440b40cda1c15e58d7434a8e Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable =0D=0A<=21DOCTYPE HTML PUBLIC =22-//W3C//DTD HTML 4=2E0 Transitional//EN=22= >=0D=0A=0D=0A=0D=0A=0D=0A=0D=0A

    Hi =0D=0AManager,

    =0D=0A

    =26nbsp;

    =0D=0A

    = Good =0D=0Alucky for you=21=26nbsp;I =0D=0Aam lucky from K=2EF PCB international limited=2E<= /SPAN>We =0D=0Aare a professional=26nbsp;PCB=26= nbsp;manufacturer and supplier in China=2E =0D=0AYou =0D=0Acan find high-quality= products in a competitive price=2E Also we supply OEM =0D=0Aservice of p= roducts for you=2EWe =0D=0Ahope have a = chance to deal with you=2EThanks<= /o:p>

    =0D=0A

    =26nbsp;

    =0D=0A

    Best =0D=0A= Regards

    =0D=0A

    <= SPAN =0D=0Astyle=3D=22FONT-FAMILY: Arial; FONT-SIZE: 12pt; mso-spacerun: = =26=2339;yes=26=2339;; mso-fareast-font-family: =E5=AE=8B=E4=BD=93; mso-f= ont-kerning: 1=2E0000pt=22>Lucky<= /o:p>

    =0D=0A

    =26nbsp;

    =0D=0A

    E-mail: =0D= =0Ainfo=40kfquickpcb=2Ecom=

    =0D=0A

    =0D=0A

    Skype: =0D=0Apcb-lucky

    =0D=0A

    Tele:+86-0755-29= 518736=26nbsp; =0D=0A

    =0D=0A

    =26nbsp;=26nbsp;=26nbsp;=26nbsp; =0D=0A/86-13632989860

    <=21--EndFragment-->UNSUBSCRIBE3D=22=22=0D=0A=0D=0A=0D=0A=0D=0A --_=aspNetEmail=_d30cd4eb440b40cda1c15e58d7434a8e-- From konishi.ryusuke@gmail.com Mon Apr 18 11:04:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 114EE7CA0 for ; Mon, 18 Apr 2016 11:04:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7DB04AC001 for ; Mon, 18 Apr 2016 09:04:26 -0700 (PDT) X-ASG-Debug-ID: 1460995463-04cb6c245f6ce4f0001-NocioJ Received: from mail-pf0-f196.google.com (mail-pf0-f196.google.com [209.85.192.196]) by cuda.sgi.com with ESMTP id CLwIaiaX8OJTQuof (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 18 Apr 2016 09:04:23 -0700 (PDT) X-Barracuda-Envelope-From: konishi.ryusuke@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.196 Received: by mail-pf0-f196.google.com with SMTP id r187so17512717pfr.2 for ; Mon, 18 Apr 2016 09:04:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:message-id:to:cc:subject:from:in-reply-to:references :mime-version:content-transfer-encoding; bh=kYlONJNSxKAYlDrKTMk17xRbpf0f7Vta1JlFxwbO7YQ=; b=sBOH3UWg30eypgbS58JYF4u6mJXJcofEToZkv+95Z3EK1sb3yOENiR2XXlsRuQrLqP bYauAzzAaXbJCwJVzJ/RkSZHzIssCpBN7hA1Twz25KoQJ31fA8mDs0wHd0KSd+KKcCrK zGe7e5oesApcRvFTQSM7AZbORdfa3O/T09LbaPXYfw+P3+8eCWRvx7Kg4DArE++5SOyv SwR9kST9Q46dDo2hT1EVc4w+q5mHvqY2bsXAI+NxEJNEilkHbcgRrPKaLCUl0mpP4Zjf SpgfIPrSlm4rQffVljDSYyiUmC6TQB9GS0d5ad2PDBNlSMJg88cxNZKqLqXciHDY8Azf U32Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:date:message-id:to:cc:subject:from :in-reply-to:references:mime-version:content-transfer-encoding; bh=kYlONJNSxKAYlDrKTMk17xRbpf0f7Vta1JlFxwbO7YQ=; b=dZSHLx2CwS8860JJsJIhnHPcNmi4e9c3s+MpeDJA8Zter95ITTh/rloe1mRtzNa6TY 41KH1F2gZfwUUKQMkBXptDZe+/PnjQFVbmWOES6s7/hh2cTSfGRkYh5ckhRXynGJpkNa Vlj275F4s+4OT1C2HUkwIAmUHWgsAAkFV3ADCfUnABPcDxkBxuxN4Ur8cl3Ld+t1gr/C pKoFcM8HStQKFgMjjYERtwflxl30b9l2Ahd725LHBj+4t2deYqr2ZEgw0288Wd/Oj/i1 MuQuQIfYR45Fnyks/osICcoRXt1p4xQwQCIMbfCPLxAeNy8KflRZYnOqMGU/+nI6yvkX DvvA== X-Gm-Message-State: AOPr4FW3RPKc7tGmhsCMCwwf1vJ3rMZtr6Tsi34Ivb/M46lruWX3A43JksivKBHhXuE6ZA== X-Received: by 10.98.1.69 with SMTP id 66mr51727481pfb.10.1460995462737; Mon, 18 Apr 2016 09:04:22 -0700 (PDT) Received: from localhost (i223-218-133-239.s42.a014.ap.plala.or.jp. [223.218.133.239]) by smtp.gmail.com with ESMTPSA id bk8sm84893382pac.3.2016.04.18.09.04.17 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 18 Apr 2016 09:04:21 -0700 (PDT) Sender: Ryusuke Konishi Date: Tue, 19 Apr 2016 01:04:15 +0900 (JST) Message-Id: <20160419.010415.105960685033839882.konishi.ryusuke@lab.ntt.co.jp> To: Mike Christie Cc: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Subject: Re: [PATCH 16/42] nilfs: set bi_op to REQ_OP From: Ryusuke Konishi X-ASG-Orig-Subj: Re: [PATCH 16/42] nilfs: set bi_op to REQ_OP In-Reply-To: <1460747777-8479-17-git-send-email-mchristi@redhat.com> References: <1460747777-8479-1-git-send-email-mchristi@redhat.com> <1460747777-8479-17-git-send-email-mchristi@redhat.com> X-Mailer: Mew version 6.6 on Emacs 24.3 / Mule 6.0 (HANACHIRUSATO) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-pf0-f196.google.com[209.85.192.196] X-Barracuda-Start-Time: 1460995463 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28845 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Fri, 15 Apr 2016 14:15:51 -0500, mchristi@redhat.com wrote: > From: Mike Christie > > This patch has nilfs use bio->bi_op for REQ_OPs and rq_flag_bits > to bio->bi_rw. > > Signed-off-by: Mike Christie > Reviewed-by: Christoph Hellwig > Reviewed-by: Hannes Reinecke > --- > fs/nilfs2/segbuf.c | 18 ++++++++++-------- > 1 file changed, 10 insertions(+), 8 deletions(-) Looks good to me. Acked-by: Ryusuke Konishi Thanks, Ryuske Konishi > > diff --git a/fs/nilfs2/segbuf.c b/fs/nilfs2/segbuf.c > index 7666f1d..7b13e14 100644 > --- a/fs/nilfs2/segbuf.c > +++ b/fs/nilfs2/segbuf.c > @@ -350,7 +350,8 @@ static void nilfs_end_bio_write(struct bio *bio) > } > > static int nilfs_segbuf_submit_bio(struct nilfs_segment_buffer *segbuf, > - struct nilfs_write_info *wi, int mode) > + struct nilfs_write_info *wi, int mode, > + int mode_flags) > { > struct bio *bio = wi->bio; > int err; > @@ -368,7 +369,8 @@ static int nilfs_segbuf_submit_bio(struct nilfs_segment_buffer *segbuf, > > bio->bi_end_io = nilfs_end_bio_write; > bio->bi_private = segbuf; > - bio->bi_rw = mode; > + bio->bi_op = mode; > + bio->bi_rw = mode_flags; > submit_bio(bio); > segbuf->sb_nbio++; > > @@ -442,7 +444,7 @@ static int nilfs_segbuf_submit_bh(struct nilfs_segment_buffer *segbuf, > return 0; > } > /* bio is FULL */ > - err = nilfs_segbuf_submit_bio(segbuf, wi, mode); > + err = nilfs_segbuf_submit_bio(segbuf, wi, mode, 0); > /* never submit current bh */ > if (likely(!err)) > goto repeat; > @@ -466,19 +468,19 @@ static int nilfs_segbuf_write(struct nilfs_segment_buffer *segbuf, > { > struct nilfs_write_info wi; > struct buffer_head *bh; > - int res = 0, rw = WRITE; > + int res = 0; > > wi.nilfs = nilfs; > nilfs_segbuf_prepare_write(segbuf, &wi); > > list_for_each_entry(bh, &segbuf->sb_segsum_buffers, b_assoc_buffers) { > - res = nilfs_segbuf_submit_bh(segbuf, &wi, bh, rw); > + res = nilfs_segbuf_submit_bh(segbuf, &wi, bh, REQ_OP_WRITE); > if (unlikely(res)) > goto failed_bio; > } > > list_for_each_entry(bh, &segbuf->sb_payload_buffers, b_assoc_buffers) { > - res = nilfs_segbuf_submit_bh(segbuf, &wi, bh, rw); > + res = nilfs_segbuf_submit_bh(segbuf, &wi, bh, REQ_OP_WRITE); > if (unlikely(res)) > goto failed_bio; > } > @@ -488,8 +490,8 @@ static int nilfs_segbuf_write(struct nilfs_segment_buffer *segbuf, > * Last BIO is always sent through the following > * submission. > */ > - rw |= REQ_SYNC; > - res = nilfs_segbuf_submit_bio(segbuf, &wi, rw); > + res = nilfs_segbuf_submit_bio(segbuf, &wi, REQ_OP_WRITE, > + REQ_SYNC); > } > > failed_bio: > -- > 2.7.2 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From konishi.ryusuke@gmail.com Mon Apr 18 11:31:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 81A297CA0 for ; Mon, 18 Apr 2016 11:31:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1C9BB8F8035 for ; Mon, 18 Apr 2016 09:31:05 -0700 (PDT) X-ASG-Debug-ID: 1460997056-04bdf011056a3b70001-NocioJ Received: from mail-pf0-f196.google.com (mail-pf0-f196.google.com [209.85.192.196]) by cuda.sgi.com with ESMTP id k0tIEkaDBuInyDKS (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 18 Apr 2016 09:30:56 -0700 (PDT) X-Barracuda-Envelope-From: konishi.ryusuke@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.196 Received: by mail-pf0-f196.google.com with SMTP id d184so17328385pfc.1 for ; Mon, 18 Apr 2016 09:30:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:message-id:to:cc:subject:from:in-reply-to:references :mime-version:content-transfer-encoding; bh=Zj9YiRW/nubu1pPa/GCGg20jh6qLNmZveO7mcM2gWxM=; b=EAI6m9+qQj/QSo6d0xa4OVanfVJgTJHBabEvsCnKujFxme13HHpNwSrMZ4TjQR6jAq p3aQOvH53zO6MMNQUGv+uTRk5zkMEkjvbNHcfZTLWAuOC7h284wYEvZWBXJcfqF8+IWG aL4X/66T4+uw17+b8BvgqgMUvL9v70D4apdVymDhjLhGiG9gPnCIuKJhO4Qen/qIy7ma sj0+nprPj0JA8epK2jQnD/gThkXDafszrVWQ6bsLKt74wzsMgkyL+M61pNXMD3QnaBpT rjvcIrlp5qbqV+P9n359ZGqUWI1/N7KUt2lEKAJHCy+eK7EiOY7mLYQKxSbv+qCvJXyc /ymw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:date:message-id:to:cc:subject:from :in-reply-to:references:mime-version:content-transfer-encoding; bh=Zj9YiRW/nubu1pPa/GCGg20jh6qLNmZveO7mcM2gWxM=; b=Id/Uh0lPp1zt15hu4GR8lTLkwORFc95FhGRgQoIa0rzSt9XO7LWcz5Xi8E+8hbR+Ly OLgNa7HV1CHd+lZehhPAzAPUFWbaSsCQcwtXZOdkyG9R+DJCw+/Dc5wfYxFwFR69M6fp qVzRsn+uKi90q3v/D1cyx8O7iKPazDLH68fOHC1DfOb2nwzBBZrxfrjnaA2rZ7O+5jQC UOURFOWoJ5wJHbVOYUz5WAR2rQA8eV1NOpeaaFcLAuexihe+iGDoG/v5bxncuLyutxXa 8hDEKnTjTPhMe5gz4kfTkwnZE8o1azviUn3A5aAEAeu/XMPrrQjLvELJMblHyEwHMpAn FdAQ== X-Gm-Message-State: AOPr4FVMO0T3lly9h1+j34ONhde0tGNY0e9TVd3eJA80FmieNV7QiIqgDHrz82do5qUVrQ== X-Received: by 10.98.3.133 with SMTP id 127mr707190pfd.93.1460997056371; Mon, 18 Apr 2016 09:30:56 -0700 (PDT) Received: from localhost (i223-218-133-239.s42.a014.ap.plala.or.jp. [223.218.133.239]) by smtp.gmail.com with ESMTPSA id a5sm24787181pat.19.2016.04.18.09.30.50 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 18 Apr 2016 09:30:55 -0700 (PDT) Sender: Ryusuke Konishi Date: Tue, 19 Apr 2016 01:30:49 +0900 (JST) Message-Id: <20160419.013049.606696900629210001.konishi.ryusuke@lab.ntt.co.jp> To: Mike Christie Cc: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Subject: Re: [dm-devel] [PATCH 04/42] fs: have submit_bh users pass in op and flags separately From: Ryusuke Konishi X-ASG-Orig-Subj: Re: [dm-devel] [PATCH 04/42] fs: have submit_bh users pass in op and flags separately In-Reply-To: <1460716802-2294-5-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@redhat.com> <1460716802-2294-5-git-send-email-mchristi@redhat.com> X-Mailer: Mew version 6.6 on Emacs 24.3 / Mule 6.0 (HANACHIRUSATO) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-pf0-f196.google.com[209.85.192.196] X-Barracuda-Start-Time: 1460997056 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28846 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Fri, 15 Apr 2016 05:39:24 -0500, mchristi@redhat.com wrote: > From: Mike Christie > > This has submit_bh users pass in the operation and flags separately, > so submit_bh_wbc can setup bio->bi_op and bio-bi_rw on the bio that > is submitted. > > Signed-off-by: Mike Christie > Reviewed-by: Christoph Hellwig > Reviewed-by: Hannes Reinecke > --- Looks good with regard to nilfs2. Acked-by: Ryusuke Konishi > drivers/md/bitmap.c | 4 ++-- > fs/btrfs/check-integrity.c | 24 ++++++++++---------- > fs/btrfs/check-integrity.h | 2 +- > fs/btrfs/disk-io.c | 4 ++-- > fs/buffer.c | 54 +++++++++++++++++++++++---------------------- > fs/ext4/balloc.c | 2 +- > fs/ext4/ialloc.c | 2 +- > fs/ext4/inode.c | 2 +- > fs/ext4/mmp.c | 4 ++-- > fs/fat/misc.c | 2 +- > fs/gfs2/bmap.c | 2 +- > fs/gfs2/dir.c | 2 +- > fs/gfs2/meta_io.c | 6 ++--- > fs/jbd2/commit.c | 6 ++--- > fs/jbd2/journal.c | 8 +++---- > fs/nilfs2/btnode.c | 6 ++--- > fs/nilfs2/btnode.h | 2 +- > fs/nilfs2/btree.c | 6 +++-- > fs/nilfs2/gcinode.c | 5 +++-- > fs/nilfs2/mdt.c | 11 ++++----- > fs/ntfs/aops.c | 6 ++--- > fs/ntfs/compress.c | 2 +- > fs/ntfs/file.c | 2 +- > fs/ntfs/logfile.c | 2 +- > fs/ntfs/mft.c | 4 ++-- > fs/ocfs2/buffer_head_io.c | 8 +++---- > fs/reiserfs/inode.c | 4 ++-- > fs/reiserfs/journal.c | 6 ++--- > fs/ufs/util.c | 2 +- > include/linux/buffer_head.h | 9 ++++---- > 30 files changed, 103 insertions(+), 96 deletions(-) > > diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c > index 3fe86b5..8b2e16f 100644 > --- a/drivers/md/bitmap.c > +++ b/drivers/md/bitmap.c > @@ -294,7 +294,7 @@ static void write_page(struct bitmap *bitmap, struct page *page, int wait) > atomic_inc(&bitmap->pending_writes); > set_buffer_locked(bh); > set_buffer_mapped(bh); > - submit_bh(WRITE | REQ_SYNC, bh); > + submit_bh(REQ_OP_WRITE, REQ_SYNC, bh); > bh = bh->b_this_page; > } > > @@ -389,7 +389,7 @@ static int read_page(struct file *file, unsigned long index, > atomic_inc(&bitmap->pending_writes); > set_buffer_locked(bh); > set_buffer_mapped(bh); > - submit_bh(READ, bh); > + submit_bh(REQ_OP_READ, 0, bh); > } > block++; > bh = bh->b_this_page; > diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c > index 9400acd..f82190f 100644 > --- a/fs/btrfs/check-integrity.c > +++ b/fs/btrfs/check-integrity.c > @@ -2856,12 +2856,12 @@ static struct btrfsic_dev_state *btrfsic_dev_state_lookup( > return ds; > } > > -int btrfsic_submit_bh(int rw, struct buffer_head *bh) > +int btrfsic_submit_bh(int op, int op_flags, struct buffer_head *bh) > { > struct btrfsic_dev_state *dev_state; > > if (!btrfsic_is_initialized) > - return submit_bh(rw, bh); > + return submit_bh(op, op_flags, bh); > > mutex_lock(&btrfsic_mutex); > /* since btrfsic_submit_bh() might also be called before > @@ -2870,26 +2870,26 @@ int btrfsic_submit_bh(int rw, struct buffer_head *bh) > > /* Only called to write the superblock (incl. FLUSH/FUA) */ > if (NULL != dev_state && > - (rw & WRITE) && bh->b_size > 0) { > + (op == REQ_OP_WRITE) && bh->b_size > 0) { > u64 dev_bytenr; > > dev_bytenr = 4096 * bh->b_blocknr; > if (dev_state->state->print_mask & > BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) > printk(KERN_INFO > - "submit_bh(rw=0x%x, blocknr=%llu (bytenr %llu)," > - " size=%zu, data=%p, bdev=%p)\n", > - rw, (unsigned long long)bh->b_blocknr, > + "submit_bh(op=0x%x,0x%x, blocknr=%llu " > + "(bytenr %llu), size=%zu, data=%p, bdev=%p)\n", > + op, op_flags, (unsigned long long)bh->b_blocknr, > dev_bytenr, bh->b_size, bh->b_data, bh->b_bdev); > btrfsic_process_written_block(dev_state, dev_bytenr, > &bh->b_data, 1, NULL, > - NULL, bh, rw); > - } else if (NULL != dev_state && (rw & REQ_FLUSH)) { > + NULL, bh, op_flags); > + } else if (NULL != dev_state && (op_flags & REQ_FLUSH)) { > if (dev_state->state->print_mask & > BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) > printk(KERN_INFO > - "submit_bh(rw=0x%x FLUSH, bdev=%p)\n", > - rw, bh->b_bdev); > + "submit_bh(op=0x%x,0x%x FLUSH, bdev=%p)\n", > + op, op_flags, bh->b_bdev); > if (!dev_state->dummy_block_for_bio_bh_flush.is_iodone) { > if ((dev_state->state->print_mask & > (BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH | > @@ -2907,7 +2907,7 @@ int btrfsic_submit_bh(int rw, struct buffer_head *bh) > block->never_written = 0; > block->iodone_w_error = 0; > block->flush_gen = dev_state->last_flush_gen + 1; > - block->submit_bio_bh_rw = rw; > + block->submit_bio_bh_rw = op_flags; > block->orig_bio_bh_private = bh->b_private; > block->orig_bio_bh_end_io.bh = bh->b_end_io; > block->next_in_same_bio = NULL; > @@ -2916,7 +2916,7 @@ int btrfsic_submit_bh(int rw, struct buffer_head *bh) > } > } > mutex_unlock(&btrfsic_mutex); > - return submit_bh(rw, bh); > + return submit_bh(op, op_flags, bh); > } > > static void __btrfsic_submit_bio(struct bio *bio) > diff --git a/fs/btrfs/check-integrity.h b/fs/btrfs/check-integrity.h > index c04e249..f78dff1 100644 > --- a/fs/btrfs/check-integrity.h > +++ b/fs/btrfs/check-integrity.h > @@ -20,7 +20,7 @@ > #define __BTRFS_CHECK_INTEGRITY__ > > #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY > -int btrfsic_submit_bh(int rw, struct buffer_head *bh); > +int btrfsic_submit_bh(int op, int op_flags, struct buffer_head *bh); > void btrfsic_submit_bio(struct bio *bio); > int btrfsic_submit_bio_wait(struct bio *bio); > #else > diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c > index 0bd25e4..9a13c85 100644 > --- a/fs/btrfs/disk-io.c > +++ b/fs/btrfs/disk-io.c > @@ -3410,9 +3410,9 @@ static int write_dev_supers(struct btrfs_device *device, > * to go down lazy. > */ > if (i == 0) > - ret = btrfsic_submit_bh(WRITE_FUA, bh); > + ret = btrfsic_submit_bh(REQ_OP_WRITE, WRITE_FUA, bh); > else > - ret = btrfsic_submit_bh(WRITE_SYNC, bh); > + ret = btrfsic_submit_bh(REQ_OP_WRITE, WRITE_SYNC, bh); > if (ret) > errors++; > } > diff --git a/fs/buffer.c b/fs/buffer.c > index 7ed7869..1e1a474 100644 > --- a/fs/buffer.c > +++ b/fs/buffer.c > @@ -45,7 +45,7 @@ > #include > > static int fsync_buffers_list(spinlock_t *lock, struct list_head *list); > -static int submit_bh_wbc(int rw, struct buffer_head *bh, > +static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh, > unsigned long bio_flags, > struct writeback_control *wbc); > > @@ -1225,7 +1225,7 @@ static struct buffer_head *__bread_slow(struct buffer_head *bh) > } else { > get_bh(bh); > bh->b_end_io = end_buffer_read_sync; > - submit_bh(READ, bh); > + submit_bh(REQ_OP_READ, 0, bh); > wait_on_buffer(bh); > if (buffer_uptodate(bh)) > return bh; > @@ -1697,7 +1697,7 @@ static int __block_write_full_page(struct inode *inode, struct page *page, > struct buffer_head *bh, *head; > unsigned int blocksize, bbits; > int nr_underway = 0; > - int write_op = (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE); > + int write_flags = (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : 0); > > head = create_page_buffers(page, inode, > (1 << BH_Dirty)|(1 << BH_Uptodate)); > @@ -1786,7 +1786,7 @@ static int __block_write_full_page(struct inode *inode, struct page *page, > do { > struct buffer_head *next = bh->b_this_page; > if (buffer_async_write(bh)) { > - submit_bh_wbc(write_op, bh, 0, wbc); > + submit_bh_wbc(REQ_OP_WRITE, write_flags, bh, 0, wbc); > nr_underway++; > } > bh = next; > @@ -1840,7 +1840,7 @@ recover: > struct buffer_head *next = bh->b_this_page; > if (buffer_async_write(bh)) { > clear_buffer_dirty(bh); > - submit_bh_wbc(write_op, bh, 0, wbc); > + submit_bh_wbc(REQ_OP_WRITE, write_flags, bh, 0, wbc); > nr_underway++; > } > bh = next; > @@ -2248,7 +2248,7 @@ int block_read_full_page(struct page *page, get_block_t *get_block) > if (buffer_uptodate(bh)) > end_buffer_async_read(bh, 1); > else > - submit_bh(READ, bh); > + submit_bh(REQ_OP_READ, 0, bh); > } > return 0; > } > @@ -2582,7 +2582,7 @@ int nobh_write_begin(struct address_space *mapping, > if (block_start < from || block_end > to) { > lock_buffer(bh); > bh->b_end_io = end_buffer_read_nobh; > - submit_bh(READ, bh); > + submit_bh(REQ_OP_READ, 0, bh); > nr_reads++; > } > } > @@ -2949,7 +2949,7 @@ static void end_bio_bh_io_sync(struct bio *bio) > * errors, this only handles the "we need to be able to > * do IO at the final sector" case. > */ > -void guard_bio_eod(int rw, struct bio *bio) > +void guard_bio_eod(int op, struct bio *bio) > { > sector_t maxsector; > struct bio_vec *bvec = &bio->bi_io_vec[bio->bi_vcnt - 1]; > @@ -2979,13 +2979,13 @@ void guard_bio_eod(int rw, struct bio *bio) > bvec->bv_len -= truncated_bytes; > > /* ..and clear the end of the buffer for reads */ > - if ((rw & RW_MASK) == READ) { > + if (op == REQ_OP_READ) { > zero_user(bvec->bv_page, bvec->bv_offset + bvec->bv_len, > truncated_bytes); > } > } > > -static int submit_bh_wbc(int rw, struct buffer_head *bh, > +static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh, > unsigned long bio_flags, struct writeback_control *wbc) > { > struct bio *bio; > @@ -2999,7 +2999,7 @@ static int submit_bh_wbc(int rw, struct buffer_head *bh, > /* > * Only clear out a write error when rewriting > */ > - if (test_set_buffer_req(bh) && (rw & WRITE)) > + if (test_set_buffer_req(bh) && (op == REQ_OP_WRITE)) > clear_buffer_write_io_error(bh); > > /* > @@ -3022,29 +3022,31 @@ static int submit_bh_wbc(int rw, struct buffer_head *bh, > bio->bi_end_io = end_bio_bh_io_sync; > bio->bi_private = bh; > bio->bi_flags |= bio_flags; > + bio->bi_op = op; > > /* Take care of bh's that straddle the end of the device */ > - guard_bio_eod(rw, bio); > + guard_bio_eod(op, bio); > > if (buffer_meta(bh)) > - rw |= REQ_META; > + op_flags |= REQ_META; > if (buffer_prio(bh)) > - rw |= REQ_PRIO; > - bio->bi_rw = rw; > + op_flags |= REQ_PRIO; > + bio->bi_rw = op_flags; > > submit_bio(bio); > return 0; > } > > -int _submit_bh(int rw, struct buffer_head *bh, unsigned long bio_flags) > +int _submit_bh(int op, int op_flags, struct buffer_head *bh, > + unsigned long bio_flags) > { > - return submit_bh_wbc(rw, bh, bio_flags, NULL); > + return submit_bh_wbc(op, op_flags, bh, bio_flags, NULL); > } > EXPORT_SYMBOL_GPL(_submit_bh); > > -int submit_bh(int rw, struct buffer_head *bh) > +int submit_bh(int op, int op_flags, struct buffer_head *bh) > { > - return submit_bh_wbc(rw, bh, 0, NULL); > + return submit_bh_wbc(op, op_flags, bh, 0, NULL); > } > EXPORT_SYMBOL(submit_bh); > > @@ -3086,14 +3088,14 @@ void ll_rw_block(int rw, int nr, struct buffer_head *bhs[]) > if (test_clear_buffer_dirty(bh)) { > bh->b_end_io = end_buffer_write_sync; > get_bh(bh); > - submit_bh(WRITE, bh); > + submit_bh(rw, 0, bh); > continue; > } > } else { > if (!buffer_uptodate(bh)) { > bh->b_end_io = end_buffer_read_sync; > get_bh(bh); > - submit_bh(rw, bh); > + submit_bh(rw, 0, bh); > continue; > } > } > @@ -3102,7 +3104,7 @@ void ll_rw_block(int rw, int nr, struct buffer_head *bhs[]) > } > EXPORT_SYMBOL(ll_rw_block); > > -void write_dirty_buffer(struct buffer_head *bh, int rw) > +void write_dirty_buffer(struct buffer_head *bh, int op_flags) > { > lock_buffer(bh); > if (!test_clear_buffer_dirty(bh)) { > @@ -3111,7 +3113,7 @@ void write_dirty_buffer(struct buffer_head *bh, int rw) > } > bh->b_end_io = end_buffer_write_sync; > get_bh(bh); > - submit_bh(rw, bh); > + submit_bh(REQ_OP_WRITE, op_flags, bh); > } > EXPORT_SYMBOL(write_dirty_buffer); > > @@ -3120,7 +3122,7 @@ EXPORT_SYMBOL(write_dirty_buffer); > * and then start new I/O and then wait upon it. The caller must have a ref on > * the buffer_head. > */ > -int __sync_dirty_buffer(struct buffer_head *bh, int rw) > +int __sync_dirty_buffer(struct buffer_head *bh, int op_flags) > { > int ret = 0; > > @@ -3129,7 +3131,7 @@ int __sync_dirty_buffer(struct buffer_head *bh, int rw) > if (test_clear_buffer_dirty(bh)) { > get_bh(bh); > bh->b_end_io = end_buffer_write_sync; > - ret = submit_bh(rw, bh); > + ret = submit_bh(REQ_OP_WRITE, op_flags, bh); > wait_on_buffer(bh); > if (!ret && !buffer_uptodate(bh)) > ret = -EIO; > @@ -3392,7 +3394,7 @@ int bh_submit_read(struct buffer_head *bh) > > get_bh(bh); > bh->b_end_io = end_buffer_read_sync; > - submit_bh(READ, bh); > + submit_bh(REQ_OP_READ, 0, bh); > wait_on_buffer(bh); > if (buffer_uptodate(bh)) > return 0; > diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c > index fe1f50f..d06823b 100644 > --- a/fs/ext4/balloc.c > +++ b/fs/ext4/balloc.c > @@ -470,7 +470,7 @@ ext4_read_block_bitmap_nowait(struct super_block *sb, ext4_group_t block_group) > trace_ext4_read_block_bitmap_load(sb, block_group); > bh->b_end_io = ext4_end_bitmap_read; > get_bh(bh); > - submit_bh(READ | REQ_META | REQ_PRIO, bh); > + submit_bh(REQ_OP_READ, REQ_META | REQ_PRIO, bh); > return bh; > verify: > err = ext4_validate_block_bitmap(sb, desc, block_group, bh); > diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c > index 237b877..0b08abc 100644 > --- a/fs/ext4/ialloc.c > +++ b/fs/ext4/ialloc.c > @@ -214,7 +214,7 @@ ext4_read_inode_bitmap(struct super_block *sb, ext4_group_t block_group) > trace_ext4_load_inode_bitmap(sb, block_group); > bh->b_end_io = ext4_end_bitmap_read; > get_bh(bh); > - submit_bh(READ | REQ_META | REQ_PRIO, bh); > + submit_bh(REQ_OP_READ, REQ_META | REQ_PRIO, bh); > wait_on_buffer(bh); > if (!buffer_uptodate(bh)) { > put_bh(bh); > diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c > index 981a1fc..f19220b 100644 > --- a/fs/ext4/inode.c > +++ b/fs/ext4/inode.c > @@ -4186,7 +4186,7 @@ make_io: > trace_ext4_load_inode(inode); > get_bh(bh); > bh->b_end_io = end_buffer_read_sync; > - submit_bh(READ | REQ_META | REQ_PRIO, bh); > + submit_bh(REQ_OP_READ, REQ_META | REQ_PRIO, bh); > wait_on_buffer(bh); > if (!buffer_uptodate(bh)) { > EXT4_ERROR_INODE_BLOCK(inode, block, > diff --git a/fs/ext4/mmp.c b/fs/ext4/mmp.c > index 2444527..cef1db4 100644 > --- a/fs/ext4/mmp.c > +++ b/fs/ext4/mmp.c > @@ -52,7 +52,7 @@ static int write_mmp_block(struct super_block *sb, struct buffer_head *bh) > lock_buffer(bh); > bh->b_end_io = end_buffer_write_sync; > get_bh(bh); > - submit_bh(WRITE_SYNC | REQ_META | REQ_PRIO, bh); > + submit_bh(REQ_OP_WRITE, WRITE_SYNC | REQ_META | REQ_PRIO, bh); > wait_on_buffer(bh); > sb_end_write(sb); > if (unlikely(!buffer_uptodate(bh))) > @@ -88,7 +88,7 @@ static int read_mmp_block(struct super_block *sb, struct buffer_head **bh, > get_bh(*bh); > lock_buffer(*bh); > (*bh)->b_end_io = end_buffer_read_sync; > - submit_bh(READ_SYNC | REQ_META | REQ_PRIO, *bh); > + submit_bh(REQ_OP_READ, READ_SYNC | REQ_META | REQ_PRIO, *bh); > wait_on_buffer(*bh); > if (!buffer_uptodate(*bh)) { > ret = -EIO; > diff --git a/fs/fat/misc.c b/fs/fat/misc.c > index c4589e9..8a86981 100644 > --- a/fs/fat/misc.c > +++ b/fs/fat/misc.c > @@ -267,7 +267,7 @@ int fat_sync_bhs(struct buffer_head **bhs, int nr_bhs) > int i, err = 0; > > for (i = 0; i < nr_bhs; i++) > - write_dirty_buffer(bhs[i], WRITE); > + write_dirty_buffer(bhs[i], 0); > > for (i = 0; i < nr_bhs; i++) { > wait_on_buffer(bhs[i]); > diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c > index 24ce1cd..06d79aa 100644 > --- a/fs/gfs2/bmap.c > +++ b/fs/gfs2/bmap.c > @@ -285,7 +285,7 @@ static void gfs2_metapath_ra(struct gfs2_glock *gl, > if (trylock_buffer(rabh)) { > if (!buffer_uptodate(rabh)) { > rabh->b_end_io = end_buffer_read_sync; > - submit_bh(READA | REQ_META, rabh); > + submit_bh(REQ_OP_READ, READA | REQ_META, rabh); > continue; > } > unlock_buffer(rabh); > diff --git a/fs/gfs2/dir.c b/fs/gfs2/dir.c > index 4a01f30..97a7d47 100644 > --- a/fs/gfs2/dir.c > +++ b/fs/gfs2/dir.c > @@ -1510,7 +1510,7 @@ static void gfs2_dir_readahead(struct inode *inode, unsigned hsize, u32 index, > continue; > } > bh->b_end_io = end_buffer_read_sync; > - submit_bh(READA | REQ_META, bh); > + submit_bh(REQ_OP_READ, READA | REQ_META, bh); > continue; > } > brelse(bh); > diff --git a/fs/gfs2/meta_io.c b/fs/gfs2/meta_io.c > index f8d33e8..3c63087 100644 > --- a/fs/gfs2/meta_io.c > +++ b/fs/gfs2/meta_io.c > @@ -37,8 +37,8 @@ static int gfs2_aspace_writepage(struct page *page, struct writeback_control *wb > { > struct buffer_head *bh, *head; > int nr_underway = 0; > - int write_op = REQ_META | REQ_PRIO | > - (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE); > + int write_flags = REQ_META | REQ_PRIO | > + (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : 0); > > BUG_ON(!PageLocked(page)); > BUG_ON(!page_has_buffers(page)); > @@ -79,7 +79,7 @@ static int gfs2_aspace_writepage(struct page *page, struct writeback_control *wb > do { > struct buffer_head *next = bh->b_this_page; > if (buffer_async_write(bh)) { > - submit_bh(write_op, bh); > + submit_bh(REQ_OP_WRITE, write_flags, bh); > nr_underway++; > } > bh = next; > diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c > index 2ad98d6..956bcf0 100644 > --- a/fs/jbd2/commit.c > +++ b/fs/jbd2/commit.c > @@ -155,9 +155,9 @@ static int journal_submit_commit_record(journal_t *journal, > > if (journal->j_flags & JBD2_BARRIER && > !jbd2_has_feature_async_commit(journal)) > - ret = submit_bh(WRITE_SYNC | WRITE_FLUSH_FUA, bh); > + ret = submit_bh(REQ_OP_WRITE, WRITE_SYNC | WRITE_FLUSH_FUA, bh); > else > - ret = submit_bh(WRITE_SYNC, bh); > + ret = submit_bh(REQ_OP_WRITE, WRITE_SYNC, bh); > > *cbh = bh; > return ret; > @@ -714,7 +714,7 @@ start_journal_io: > clear_buffer_dirty(bh); > set_buffer_uptodate(bh); > bh->b_end_io = journal_end_buffer_io_sync; > - submit_bh(WRITE_SYNC, bh); > + submit_bh(REQ_OP_WRITE, WRITE_SYNC, bh); > } > cond_resched(); > stats.run.rs_blocks_logged += bufs; > diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c > index 435f0b2..6d7e33a 100644 > --- a/fs/jbd2/journal.c > +++ b/fs/jbd2/journal.c > @@ -1345,15 +1345,15 @@ static int journal_reset(journal_t *journal) > return jbd2_journal_start_thread(journal); > } > > -static int jbd2_write_superblock(journal_t *journal, int write_op) > +static int jbd2_write_superblock(journal_t *journal, int write_flags) > { > struct buffer_head *bh = journal->j_sb_buffer; > journal_superblock_t *sb = journal->j_superblock; > int ret; > > - trace_jbd2_write_superblock(journal, write_op); > + trace_jbd2_write_superblock(journal, write_flags); > if (!(journal->j_flags & JBD2_BARRIER)) > - write_op &= ~(REQ_FUA | REQ_FLUSH); > + write_flags &= ~(REQ_FUA | REQ_FLUSH); > lock_buffer(bh); > if (buffer_write_io_error(bh)) { > /* > @@ -1373,7 +1373,7 @@ static int jbd2_write_superblock(journal_t *journal, int write_op) > jbd2_superblock_csum_set(journal, sb); > get_bh(bh); > bh->b_end_io = end_buffer_write_sync; > - ret = submit_bh(write_op, bh); > + ret = submit_bh(REQ_OP_WRITE, write_flags, bh); > wait_on_buffer(bh); > if (buffer_write_io_error(bh)) { > clear_buffer_write_io_error(bh); > diff --git a/fs/nilfs2/btnode.c b/fs/nilfs2/btnode.c > index e0c9daf..87baf87 100644 > --- a/fs/nilfs2/btnode.c > +++ b/fs/nilfs2/btnode.c > @@ -67,7 +67,7 @@ nilfs_btnode_create_block(struct address_space *btnc, __u64 blocknr) > } > > int nilfs_btnode_submit_block(struct address_space *btnc, __u64 blocknr, > - sector_t pblocknr, int mode, > + sector_t pblocknr, int mode, int mode_flags, > struct buffer_head **pbh, sector_t *submit_ptr) > { > struct buffer_head *bh; > @@ -100,7 +100,7 @@ int nilfs_btnode_submit_block(struct address_space *btnc, __u64 blocknr, > } > } > > - if (mode == READA) { > + if (mode_flags & REQ_RAHEAD) { > if (pblocknr != *submit_ptr + 1 || !trylock_buffer(bh)) { > err = -EBUSY; /* internal code */ > brelse(bh); > @@ -119,7 +119,7 @@ int nilfs_btnode_submit_block(struct address_space *btnc, __u64 blocknr, > bh->b_blocknr = pblocknr; /* set block address for read */ > bh->b_end_io = end_buffer_read_sync; > get_bh(bh); > - submit_bh(mode, bh); > + submit_bh(mode, mode_flags, bh); > bh->b_blocknr = blocknr; /* set back to the given block address */ > *submit_ptr = pblocknr; > err = 0; > diff --git a/fs/nilfs2/btnode.h b/fs/nilfs2/btnode.h > index d876b56..3f93197 100644 > --- a/fs/nilfs2/btnode.h > +++ b/fs/nilfs2/btnode.h > @@ -47,7 +47,7 @@ void nilfs_btnode_cache_clear(struct address_space *); > struct buffer_head *nilfs_btnode_create_block(struct address_space *btnc, > __u64 blocknr); > int nilfs_btnode_submit_block(struct address_space *, __u64, sector_t, int, > - struct buffer_head **, sector_t *); > + int, struct buffer_head **, sector_t *); > void nilfs_btnode_delete(struct buffer_head *); > int nilfs_btnode_prepare_change_key(struct address_space *, > struct nilfs_btnode_chkey_ctxt *); > diff --git a/fs/nilfs2/btree.c b/fs/nilfs2/btree.c > index 3a3821b..5d6a2c6 100644 > --- a/fs/nilfs2/btree.c > +++ b/fs/nilfs2/btree.c > @@ -480,7 +480,8 @@ static int __nilfs_btree_get_block(const struct nilfs_bmap *btree, __u64 ptr, > sector_t submit_ptr = 0; > int ret; > > - ret = nilfs_btnode_submit_block(btnc, ptr, 0, READ, &bh, &submit_ptr); > + ret = nilfs_btnode_submit_block(btnc, ptr, 0, REQ_OP_READ, 0, &bh, > + &submit_ptr); > if (ret) { > if (ret != -EEXIST) > return ret; > @@ -496,7 +497,8 @@ static int __nilfs_btree_get_block(const struct nilfs_bmap *btree, __u64 ptr, > n > 0 && i < ra->ncmax; n--, i++) { > ptr2 = nilfs_btree_node_get_ptr(ra->node, i, ra->ncmax); > > - ret = nilfs_btnode_submit_block(btnc, ptr2, 0, READA, > + ret = nilfs_btnode_submit_block(btnc, ptr2, 0, > + REQ_OP_READ, REQ_RAHEAD, > &ra_bh, &submit_ptr); > if (likely(!ret || ret == -EEXIST)) > brelse(ra_bh); > diff --git a/fs/nilfs2/gcinode.c b/fs/nilfs2/gcinode.c > index 0224b78..90be270 100644 > --- a/fs/nilfs2/gcinode.c > +++ b/fs/nilfs2/gcinode.c > @@ -106,7 +106,7 @@ int nilfs_gccache_submit_read_data(struct inode *inode, sector_t blkoff, > bh->b_blocknr = pbn; > bh->b_end_io = end_buffer_read_sync; > get_bh(bh); > - submit_bh(READ, bh); > + submit_bh(REQ_OP_READ, 0, bh); > if (vbn) > bh->b_blocknr = vbn; > out: > @@ -143,7 +143,8 @@ int nilfs_gccache_submit_read_node(struct inode *inode, sector_t pbn, > int ret; > > ret = nilfs_btnode_submit_block(&NILFS_I(inode)->i_btnode_cache, > - vbn ? : pbn, pbn, READ, out_bh, &pbn); > + vbn ? : pbn, pbn, REQ_OP_READ, 0, > + out_bh, &pbn); > if (ret == -EEXIST) /* internal code (cache hit) */ > ret = 0; > return ret; > diff --git a/fs/nilfs2/mdt.c b/fs/nilfs2/mdt.c > index f6982b9..27aee74 100644 > --- a/fs/nilfs2/mdt.c > +++ b/fs/nilfs2/mdt.c > @@ -124,7 +124,7 @@ static int nilfs_mdt_create_block(struct inode *inode, unsigned long block, > > static int > nilfs_mdt_submit_block(struct inode *inode, unsigned long blkoff, > - int mode, struct buffer_head **out_bh) > + int mode, int mode_flags, struct buffer_head **out_bh) > { > struct buffer_head *bh; > __u64 blknum = 0; > @@ -138,7 +138,7 @@ nilfs_mdt_submit_block(struct inode *inode, unsigned long blkoff, > if (buffer_uptodate(bh)) > goto out; > > - if (mode == READA) { > + if (mode_flags & REQ_RAHEAD) { > if (!trylock_buffer(bh)) { > ret = -EBUSY; > goto failed_bh; > @@ -160,7 +160,7 @@ nilfs_mdt_submit_block(struct inode *inode, unsigned long blkoff, > > bh->b_end_io = end_buffer_read_sync; > get_bh(bh); > - submit_bh(mode, bh); > + submit_bh(mode, mode_flags, bh); > ret = 0; > > trace_nilfs2_mdt_submit_block(inode, inode->i_ino, blkoff, mode); > @@ -184,7 +184,7 @@ static int nilfs_mdt_read_block(struct inode *inode, unsigned long block, > int i, nr_ra_blocks = NILFS_MDT_MAX_RA_BLOCKS; > int err; > > - err = nilfs_mdt_submit_block(inode, block, READ, &first_bh); > + err = nilfs_mdt_submit_block(inode, block, REQ_OP_READ, 0, &first_bh); > if (err == -EEXIST) /* internal code */ > goto out; > > @@ -194,7 +194,8 @@ static int nilfs_mdt_read_block(struct inode *inode, unsigned long block, > if (readahead) { > blkoff = block + 1; > for (i = 0; i < nr_ra_blocks; i++, blkoff++) { > - err = nilfs_mdt_submit_block(inode, blkoff, READA, &bh); > + err = nilfs_mdt_submit_block(inode, blkoff, REQ_OP_READ, > + REQ_RAHEAD, &bh); > if (likely(!err || err == -EEXIST)) > brelse(bh); > else if (err != -EBUSY) > diff --git a/fs/ntfs/aops.c b/fs/ntfs/aops.c > index 97768a1..fe251f1 100644 > --- a/fs/ntfs/aops.c > +++ b/fs/ntfs/aops.c > @@ -362,7 +362,7 @@ handle_zblock: > for (i = 0; i < nr; i++) { > tbh = arr[i]; > if (likely(!buffer_uptodate(tbh))) > - submit_bh(READ, tbh); > + submit_bh(REQ_OP_READ, 0, tbh); > else > ntfs_end_buffer_async_read(tbh, 1); > } > @@ -877,7 +877,7 @@ lock_retry_remap: > do { > struct buffer_head *next = bh->b_this_page; > if (buffer_async_write(bh)) { > - submit_bh(WRITE, bh); > + submit_bh(REQ_OP_WRITE, 0, bh); > need_end_writeback = false; > } > bh = next; > @@ -1202,7 +1202,7 @@ lock_retry_remap: > BUG_ON(!buffer_mapped(tbh)); > get_bh(tbh); > tbh->b_end_io = end_buffer_write_sync; > - submit_bh(WRITE, tbh); > + submit_bh(REQ_OP_WRITE, 0, tbh); > } > /* Synchronize the mft mirror now if not @sync. */ > if (is_mft && !sync) > diff --git a/fs/ntfs/compress.c b/fs/ntfs/compress.c > index f2b5e74..f8eb043 100644 > --- a/fs/ntfs/compress.c > +++ b/fs/ntfs/compress.c > @@ -670,7 +670,7 @@ lock_retry_remap: > } > get_bh(tbh); > tbh->b_end_io = end_buffer_read_sync; > - submit_bh(READ, tbh); > + submit_bh(REQ_OP_READ, 0, tbh); > } > > /* Wait for io completion on all buffer heads. */ > diff --git a/fs/ntfs/file.c b/fs/ntfs/file.c > index 91117ad..d96f0c1 100644 > --- a/fs/ntfs/file.c > +++ b/fs/ntfs/file.c > @@ -553,7 +553,7 @@ static inline int ntfs_submit_bh_for_read(struct buffer_head *bh) > lock_buffer(bh); > get_bh(bh); > bh->b_end_io = end_buffer_read_sync; > - return submit_bh(READ, bh); > + return submit_bh(REQ_OP_READ, 0, bh); > } > > /** > diff --git a/fs/ntfs/logfile.c b/fs/ntfs/logfile.c > index 9d71213..761f12f 100644 > --- a/fs/ntfs/logfile.c > +++ b/fs/ntfs/logfile.c > @@ -821,7 +821,7 @@ map_vcn: > * completed ignore errors afterwards as we can assume > * that if one buffer worked all of them will work. > */ > - submit_bh(WRITE, bh); > + submit_bh(REQ_OP_WRITE, 0, bh); > if (should_wait) { > should_wait = false; > wait_on_buffer(bh); > diff --git a/fs/ntfs/mft.c b/fs/ntfs/mft.c > index 37b2501..d15d492 100644 > --- a/fs/ntfs/mft.c > +++ b/fs/ntfs/mft.c > @@ -592,7 +592,7 @@ int ntfs_sync_mft_mirror(ntfs_volume *vol, const unsigned long mft_no, > clear_buffer_dirty(tbh); > get_bh(tbh); > tbh->b_end_io = end_buffer_write_sync; > - submit_bh(WRITE, tbh); > + submit_bh(REQ_OP_WRITE, 0, tbh); > } > /* Wait on i/o completion of buffers. */ > for (i_bhs = 0; i_bhs < nr_bhs; i_bhs++) { > @@ -785,7 +785,7 @@ int write_mft_record_nolock(ntfs_inode *ni, MFT_RECORD *m, int sync) > clear_buffer_dirty(tbh); > get_bh(tbh); > tbh->b_end_io = end_buffer_write_sync; > - submit_bh(WRITE, tbh); > + submit_bh(REQ_OP_WRITE, 0, tbh); > } > /* Synchronize the mft mirror now if not @sync. */ > if (!sync && ni->mft_no < vol->mftmirr_size) > diff --git a/fs/ocfs2/buffer_head_io.c b/fs/ocfs2/buffer_head_io.c > index fe50ded..fb775c9 100644 > --- a/fs/ocfs2/buffer_head_io.c > +++ b/fs/ocfs2/buffer_head_io.c > @@ -79,7 +79,7 @@ int ocfs2_write_block(struct ocfs2_super *osb, struct buffer_head *bh, > > get_bh(bh); /* for end_buffer_write_sync() */ > bh->b_end_io = end_buffer_write_sync; > - submit_bh(WRITE, bh); > + submit_bh(REQ_OP_WRITE, 0, bh); > > wait_on_buffer(bh); > > @@ -149,7 +149,7 @@ int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block, > clear_buffer_uptodate(bh); > get_bh(bh); /* for end_buffer_read_sync() */ > bh->b_end_io = end_buffer_read_sync; > - submit_bh(READ, bh); > + submit_bh(REQ_OP_READ, 0, bh); > } > > for (i = nr; i > 0; i--) { > @@ -305,7 +305,7 @@ int ocfs2_read_blocks(struct ocfs2_caching_info *ci, u64 block, int nr, > if (validate) > set_buffer_needs_validate(bh); > bh->b_end_io = end_buffer_read_sync; > - submit_bh(READ, bh); > + submit_bh(REQ_OP_READ, 0, bh); > continue; > } > } > @@ -419,7 +419,7 @@ int ocfs2_write_super_or_backup(struct ocfs2_super *osb, > get_bh(bh); /* for end_buffer_write_sync() */ > bh->b_end_io = end_buffer_write_sync; > ocfs2_compute_meta_ecc(osb->sb, bh->b_data, &di->i_check); > - submit_bh(WRITE, bh); > + submit_bh(REQ_OP_WRITE, 0, bh); > > wait_on_buffer(bh); > > diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c > index d5c2e9c..b72c23a 100644 > --- a/fs/reiserfs/inode.c > +++ b/fs/reiserfs/inode.c > @@ -2668,7 +2668,7 @@ static int reiserfs_write_full_page(struct page *page, > do { > struct buffer_head *next = bh->b_this_page; > if (buffer_async_write(bh)) { > - submit_bh(WRITE, bh); > + submit_bh(REQ_OP_WRITE, 0, bh); > nr++; > } > put_bh(bh); > @@ -2728,7 +2728,7 @@ fail: > struct buffer_head *next = bh->b_this_page; > if (buffer_async_write(bh)) { > clear_buffer_dirty(bh); > - submit_bh(WRITE, bh); > + submit_bh(REQ_OP_WRITE, 0, bh); > nr++; > } > put_bh(bh); > diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c > index 2ace90e..6945e71 100644 > --- a/fs/reiserfs/journal.c > +++ b/fs/reiserfs/journal.c > @@ -652,7 +652,7 @@ static void submit_logged_buffer(struct buffer_head *bh) > BUG(); > if (!buffer_uptodate(bh)) > BUG(); > - submit_bh(WRITE, bh); > + submit_bh(REQ_OP_WRITE, 0, bh); > } > > static void submit_ordered_buffer(struct buffer_head *bh) > @@ -662,7 +662,7 @@ static void submit_ordered_buffer(struct buffer_head *bh) > clear_buffer_dirty(bh); > if (!buffer_uptodate(bh)) > BUG(); > - submit_bh(WRITE, bh); > + submit_bh(REQ_OP_WRITE, 0, bh); > } > > #define CHUNK_SIZE 32 > @@ -2269,7 +2269,7 @@ abort_replay: > /* flush out the real blocks */ > for (i = 0; i < get_desc_trans_len(desc); i++) { > set_buffer_dirty(real_blocks[i]); > - write_dirty_buffer(real_blocks[i], WRITE); > + write_dirty_buffer(real_blocks[i], 0); > } > for (i = 0; i < get_desc_trans_len(desc); i++) { > wait_on_buffer(real_blocks[i]); > diff --git a/fs/ufs/util.c b/fs/ufs/util.c > index a409e3e7..f41ad0a 100644 > --- a/fs/ufs/util.c > +++ b/fs/ufs/util.c > @@ -118,7 +118,7 @@ void ubh_sync_block(struct ufs_buffer_head *ubh) > unsigned i; > > for (i = 0; i < ubh->count; i++) > - write_dirty_buffer(ubh->bh[i], WRITE); > + write_dirty_buffer(ubh->bh[i], 0); > > for (i = 0; i < ubh->count; i++) > wait_on_buffer(ubh->bh[i]); > diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h > index d48daa3..bc9a45d 100644 > --- a/include/linux/buffer_head.h > +++ b/include/linux/buffer_head.h > @@ -189,10 +189,11 @@ void unlock_buffer(struct buffer_head *bh); > void __lock_buffer(struct buffer_head *bh); > void ll_rw_block(int, int, struct buffer_head * bh[]); > int sync_dirty_buffer(struct buffer_head *bh); > -int __sync_dirty_buffer(struct buffer_head *bh, int rw); > -void write_dirty_buffer(struct buffer_head *bh, int rw); > -int _submit_bh(int rw, struct buffer_head *bh, unsigned long bio_flags); > -int submit_bh(int, struct buffer_head *); > +int __sync_dirty_buffer(struct buffer_head *bh, int op_flags); > +void write_dirty_buffer(struct buffer_head *bh, int op_flags); > +int _submit_bh(int op, int op_flags, struct buffer_head *bh, > + unsigned long bio_flags); > +int submit_bh(int, int, struct buffer_head *); > void write_boundary_block(struct block_device *bdev, > sector_t bblock, unsigned blocksize); > int bh_uptodate_or_lock(struct buffer_head *bh); > -- > 2.7.2 > > -- > dm-devel mailing list > dm-devel@redhat.com > https://www.redhat.com/mailman/listinfo/dm-devel From cmaiolino@redhat.com Mon Apr 18 13:54:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 92D287CA0 for ; Mon, 18 Apr 2016 13:54:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 662598F8033 for ; Mon, 18 Apr 2016 11:54:38 -0700 (PDT) X-ASG-Debug-ID: 1461005676-04cbb02e1b3b5a30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id LPMTcY86LH0eXY43 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 18 Apr 2016 11:54:37 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id BE08780F6B for ; Mon, 18 Apr 2016 18:54:36 +0000 (UTC) Received: from redhat.com (vpn-55-87.rdu2.redhat.com [10.10.55.87]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3IIsZiC005954 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 18 Apr 2016 14:54:36 -0400 Date: Mon, 18 Apr 2016 20:54:29 +0200 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: "xfs_log_force: error 5 returned." for drive that was removed. Message-ID: <20160418185429.GA6730@redhat.com> X-ASG-Orig-Subj: Re: "xfs_log_force: error 5 returned." for drive that was removed. Mail-Followup-To: xfs@oss.sgi.com References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461005677 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sun, Apr 17, 2016 at 09:33:27AM -0500, Joe Wendt wrote: > Hello! This may be a silly question or an interesting one... > We had a drive fail in a production server, which spawned this error in > the logs: > XFS (sde1): xfs_log_force: error 5 returned. > The dead array was lazy-unmounted, and the drive was hot-swapped, but > when the RAID array was rebuilt, it came online as /dev/sdk instead of > /dev/sde. > Now /dev/sde1 doesn't exist in the system, but we still see this > message every 30 seconds. I'm assuming a reboot will clear out whatever > is still trying to access sde1, but I'm trying to avoid that if > possible. Could someone point me in the direction of what XFS might > still be trying to do with that device? > lsof hasn't given me any clues. I can't run xfs_repair on a volume that > isn't there. I haven't been able to find anything similar yet online. > Any help would be greatly appreciated! > Thanks, > Joe I believe this is the same problem being discussed in this thread: XFS hung task in xfs_ail_push_all_sync() when unmounting FS after disk failure/recovery. Can you get a stack dump of the system (sysrq-t) and post it in some pastebin? > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From fetifutbol@ftf.es Mon Apr 18 22:45:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.4 required=5.0 tests=FREEMAIL_FORGED_REPLYTO, FREEMAIL_REPLYTO_END_DIGIT,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0A28D7CA0 for ; Mon, 18 Apr 2016 22:45:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D16EE304032 for ; Mon, 18 Apr 2016 20:45:33 -0700 (PDT) X-ASG-Debug-ID: 1461037527-04cbb02e1a3d7d90001-NocioJ Received: from karonte.nerion.com (karonte.nerion.com [62.97.92.152]) by cuda.sgi.com with ESMTP id oHUO6xOHBsLZnMXL for ; Mon, 18 Apr 2016 20:45:27 -0700 (PDT) X-Barracuda-Envelope-From: fetifutbol@ftf.es X-Barracuda-Apparent-Source-IP: 62.97.92.152 Received: from localhost (client.yota.ru [188.162.43.238]) by karonte.nerion.com with SMTP; Tue, 19 Apr 2016 04:44:48 +0100 Message-ID: <8D883E6D66B29DBE62672E9064A846C3@localhost> Reply-To: "pupka" From: "pupka" Subject: Are you still waiting for my letters? How are you? Date: Tue, 19 Apr 2016 07:44:51 +0400 X-ASG-Orig-Subj: Are you still waiting for my letters? How are you? MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0BC0_01D19A0F.5B657DE0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Live Mail 14.0.8117.416 X-MimeOLE: Produced By Microsoft MimeOLE V14.0.8117.416 X-Barracuda-Connect: karonte.nerion.com[62.97.92.152] X-Barracuda-Start-Time: 1461037527 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.21 X-Barracuda-Spam-Status: No, SCORE=1.21 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_TG035a, HTML_MESSAGE, MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28863 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 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.00 BSF_SC0_TG035a Message contains invalid style definition To: undisclosed-recipients:; This is a multi-part message in MIME format. ------=_NextPart_000_0BC0_01D19A0F.5B657DE0 Content-Type: multipart/alternative; boundary="----=_NextPart_001_0BC1_01D19A0F.5B657DE0" ------=_NextPart_001_0BC1_01D19A0F.5B657DE0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable Good afternoon. Very beautiful, absolutely serious and intriguing lady lo= oking only one man and absolutely honesty for real=20 because so tired to be lonely and so wait to meet her second half. You mu= st to be family oriented and also with good life=20 position. You must have a same dreams as I have and be ready to start new= life. All that I need at this life it's love. If=20 you tired to be alone, if you was faced with pain and ready to know me, s= o I will be so happy to know you. Not for games=20 please. If you like me Just write me some more about you. I will be so gl= ad to see your letter. Don't forget to send me=20 your picturesand tell me some more about your life there. I will be waiti= ng your letter, with all my best wishes, sincerely=20 yours Ulyana. ------=_NextPart_001_0BC1_01D19A0F.5B657DE0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
    Good afternoon. Very beauti= ful,=20 absolutely serious and intriguing lady looking only one man and absolutel= y=20 honesty for real
     
    because so tired to be lone= ly and so=20 wait to meet her second half. You must to be family oriented and also wit= h good=20 life
     
    position. You must have a s= ame dreams as=20 I have and be ready to start new life. All that I need at this life it's = love.=20 If
     
    you tired to be alone, if y= ou was faced=20 with pain and ready to know me, so I will be so happy to know you. Not fo= r games=20
     
    please. If you like me Just= write me=20 some more about you. I will be so glad to see your letter. Don't forget t= o send=20 me
     
    your picturesand tell me so= me more about=20 your life there. I will be waiting your letter, with all my best wishes,=20 sincerely
     
    yours Ulyana.
    <= /BODY> ------=_NextPart_001_0BC1_01D19A0F.5B657DE0-- ------=_NextPart_000_0BC0_01D19A0F.5B657DE0 Content-Type: image/jpeg; name="foto.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="foto.jpg" /9j/4AAQSkZJRgABAgEASABIAAD/4TC8RXhpZgAATU0AKgAAAAgADAEPAAIAAAAGAAAAngEQAAIA AAAPAAAApAESAAMAAAABAAEAAAEaAAUAAAABAAAAswEbAAUAAAABAAAAuwEoAAMAAAABAAIAAAEx AAIAAAAcAAAAwwEyAAIAAAAUAAAA3wITAAMAAAABAAIAAOocAAcAAAgMAAAA84dpAAQAAAABAAAJ AIglAAQAAAABAAAUzAAAFOBDYW5vbgBDYW5vbiBFT1MgNjUwRAAACvyAAAAnEAAK/IAAACcQQWRv YmUgUGhvdG9zaG9wIENTMyBXaW5kb3dzADIwMTU6MDY6MjkgMjA6MDE6MTIAHOoAAAAIAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACeC mgAFAAAAAQAACtqCnQAFAAAAAQAACuKIIgADAAAAAQACAACIJwADAAAAAQZAAACIMAADAAAAAQAC AACIMgAEAAAAAQAABkCQAAAHAAAABDAyMzCQAwACAAAAFAAACuqQBAACAAAAFAAACv6RAQAHAAAA BAECAwCSAQAKAAAAAQAACxKSAgAFAAAAAQAACxqSBAAKAAAAAQAACyKSBwADAAAAAQAFAACSCQAD AAAAAQAJAACSCgAFAAAAAQAACyqShgAHAAABCAAACzKSkAACAAAAAzY5AACSkQACAAAAAzY5AACS kgACAAAAAzY5AACgAAAHAAAABDAxMDCgAQADAAAAAQABAACgAgAEAAAAAQAAATegAwAEAAAAAQAA AdOgBQAEAAAAAQAAFKyiDgAFAAAAAQAADDqiDwAFAAAAAQAADEKiEAADAAAAAQACAACkAQADAAAA AQAAAACkAgADAAAAAQAAAACkAwADAAAAAQAAAACkBgADAAAAAQAAAACkMAACAAAAAQAAAACkMQAC AAAADQAADEqkMgAFAAAABAAADFekNAACAAAAHAAADHekNQACAAAACwAADJPqHAAHAAAIDAAADJ7q HQAJAAAAAQAAD+YAAAAAAAAAAQAAADwAAAAFAAAAATIwMTU6MDU6MTEgMjA6NTM6NDYAMjAxNTow NToxMSAyMDo1Mzo0NgAABgAAAAEAAAAEoAAAAQAAAAAAAAAAAAEAAAAsAAAAAQAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPGgAAAAN+ADS8AAAAAlUwOTMwMjIwMDAyODMAAAAA EgAAAAEAAAA3AAAAAQAAAAAAAAABAAAAAAAAAAFFRi1TMTgtNTVtbSBmLzMuNS01LjYgSVMgSUkA MDAwMDQ2NDZjOAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAQACAAAABFI5OAAAAgAHAAAABDAxMDAAAAAAAAAAAQAA AAEAAAAEAgMAAAAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAABUuARsABQAAAAEAABU2ASgA AwAAAAEAAgAAAgEABAAAAAEAABU+AgIABAAAAAEAABt2AAAAAAAAAEgAAAABAAAASAAAAAH/2P/g ABBKRklGAAECAABIAEgAAP/tAAxBZG9iZV9DTQAB/+4ADkFkb2JlAGSAAAAAAf/bAIQADAgICAkI DAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAwM/8AAEQgAoABrAwEiAAIRAQMRAf/dAAQAB//EAT8AAAEFAQEBAQEBAAAAAAAAAAMA AQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMB AAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKj dDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cR AAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M0 8SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW 5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8Az6C3IbXmNFrr9gbuu2W0ud76si7Ifke5/qO/mff+ jsZ7FUrsO1zS4NIYBa7wAcD6jXn+r+erdPpWYz6KHD0Gia6GNBeHbfZTtJY91W7fuf8Amfzmz1FT v+zva1ljbm2CBZ6YJaTudue/2+2lrPzVXgbkPNSDLDDSLKw0ta+WQZ1Bc/1P5XKMMp1LWW7j6lcP a4z2Psd6f/BuVXLvprx8rBpAFTC7YGfRAeG7Pcf3drv5tL1BFb9stqDH2t0h2o2MsefYz3e9IjX6 qb/TZxaG3PJZkFxttloL22NPsc0v/Mb9DZuW39UPrFR06jLN4dlW5mU+8saYebIa5jnUj2Mqq9PZ 6lbN7/8Arda54YtrRdY6wUYzA+xkNcbLIDt3oWOY6plTXtWj9VqLzhsqrxm32+3ILoDTXPvstdkP dXsb+9V/pf5lO1BJvrop9P6fnHPxAb2OoyLKdzqX+10Rte703Of6X6T83f8A8avLvq47HfeG5ljb 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 AAEAADhCSU0nEAAAAAAACgABAAAAAAAAAAI4QklNA/UAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEA L2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklN A/gAAAAAAHAAAP////////////////////////////8D6AAAAAD///////////////////////// ////A+gAAAAA/////////////////////////////wPoAAAAAP////////////////////////// //8D6AAAOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoA AAAAAz0AAAAGAAAAAAAAAAAAAAHTAAABNwAAAAQAZgBvAHQAbwAAAAEAAAAAAAAAAAAAAAAAAAAA AAAAAQAAAAAAAAAAAAABNwAAAdMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQ AAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9w IGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAdMAAAAAUmdodGxvbmcAAAE3 AAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcA AAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1h dXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNP YmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAA QnRvbWxvbmcAAAHTAAAAAFJnaHRsb25nAAABNwAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhU AAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJ c0hUTUxib29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xp Y2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGln bgAAAAdkZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAAAABO b25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21P dXRzZXRsb25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAAADhCSU0EKAAAAAAADAAAAAE/8AAA AAAAADhCSU0EFAAAAAAABAAAAAE4QklNBAwAAAAAG5IAAAABAAAAawAAAKAAAAFEAADKgAAAG3YA GAAB/9j/4AAQSkZJRgABAgAASABIAAD/7QAMQWRvYmVfQ00AAf/uAA5BZG9iZQBkgAAAAAH/2wCE AAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAwBDQsLDQ4NEA4OEBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwMDAwM DAwMDAwMDAwMDAwMDAwMDP/AABEIAKAAawMBIgACEQEDEQH/3QAEAAf/xAE/AAABBQEBAQEBAQAA AAAAAAADAAECBAUGBwgJCgsBAAEFAQEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAQQBAwIEAgUH BggFAwwzAQACEQMEIRIxBUFRYRMicYEyBhSRobFCIyQVUsFiMzRygtFDByWSU/Dh8WNzNRaisoMm RJNUZEXCo3Q2F9JV4mXys4TD03Xj80YnlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vY3R1dnd4eX p7fH1+f3EQACAgECBAQDBAUGBwcGBTUBAAIRAyExEgRBUWFxIhMFMoGRFKGxQiPBUtHwMyRi4XKC kkNTFWNzNPElBhaisoMHJjXC0kSTVKMXZEVVNnRl4vKzhMPTdePzRpSkhbSVxNTk9KW1xdXl9VZm doaWprbG1ub2JzdHV2d3h5ent8f/2gAMAwEAAhEDEQA/AM+gtyG15jRa6/YG7rtltLne+rIuyH5H uf6jv5n3/o7GexVK7Dtc0uDSGAWu8AHA+o15/q/nq3T6VmM+ihw9BomuhjQXh232U7SWPdVu37n/ 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 4x/wjfilup42CYnv/wCSTa6qrR//2ThCSU0EIQAAAAAAVQAAAAEBAAAADwBBAGQAbwBiAGUAIABQ AGgAbwB0AG8AcwBoAG8AcAAAABMAQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAIABDAFMA MwAAAAEAOEJJTQQGAAAAAAAHAAQAAAABAQD/4RLtaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4w LwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8 eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29y ZSA0LjEtYzAzNiA0Ni4yNzY3MjAsIE1vbiBGZWIgMTkgMjAwNyAyMjo0MDowOCAgICAgICAgIj4g PHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50 YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eGFwPSJodHRwOi8v bnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3Rp ZmYvMS4wLyIgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iIHhtbG5z OmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJo dHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4YXBNTT0iaHR0cDovL25z LmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeGFwOlJhdGluZz0iMCIgeGFwOkNyZWF0b3JUb29sPSJB ZG9iZSBQaG90b3Nob3AgQ1MzIFdpbmRvd3MiIHhhcDpNb2RpZnlEYXRlPSIyMDE1LTA2LTI5VDIw OjAxOjEyKzAzOjAwIiB4YXA6Q3JlYXRlRGF0ZT0iMjAxNS0wNS0xMVQyMDo1Mzo0NiswMzowMCIg eGFwOk1ldGFkYXRhRGF0ZT0iMjAxNS0wNi0yOVQyMDowMToxMiswMzowMCIgdGlmZjpPcmllbnRh dGlvbj0iMSIgdGlmZjpZQ2JDclBvc2l0aW9uaW5nPSIyIiB0aWZmOlhSZXNvbHV0aW9uPSI3MjAw MDAvMTAwMDAiIHRpZmY6WVJlc29sdXRpb249IjcyMDAwMC8xMDAwMCIgdGlmZjpSZXNvbHV0aW9u VW5pdD0iMiIgdGlmZjpNYWtlPSJDYW5vbiIgdGlmZjpNb2RlbD0iQ2Fub24gRU9TIDY1MEQiIHRp ZmY6TmF0aXZlRGlnZXN0PSIyNTYsMjU3LDI1OCwyNTksMjYyLDI3NCwyNzcsMjg0LDUzMCw1MzEs MjgyLDI4MywyOTYsMzAxLDMxOCwzMTksNTI5LDUzMiwzMDYsMjcwLDI3MSwyNzIsMzA1LDMxNSwz MzQzMjtBMTJFNTg3NzREN0M1QjgxRUMzNzg5N0ZDNjhGQ0U3MSIgZXhpZjpFeGlmVmVyc2lvbj0i MDIzMCIgZXhpZjpGbGFzaHBpeFZlcnNpb249IjAxMDAiIGV4aWY6Q29sb3JTcGFjZT0iMSIgZXhp ZjpQaXhlbFhEaW1lbnNpb249IjMxMSIgZXhpZjpQaXhlbFlEaW1lbnNpb249IjQ2NyIgZXhpZjpE YXRlVGltZU9yaWdpbmFsPSIyMDE1LTA1LTExVDIwOjUzOjQ2KzAzOjAwIiBleGlmOkRhdGVUaW1l RGlnaXRpemVkPSIyMDE1LTA1LTExVDIwOjUzOjQ2KzAzOjAwIiBleGlmOkV4cG9zdXJlVGltZT0i MS82MCIgZXhpZjpGTnVtYmVyPSI1LzEiIGV4aWY6RXhwb3N1cmVQcm9ncmFtPSIyIiBleGlmOlNo dXR0ZXJTcGVlZFZhbHVlPSIzOTMyMTYvNjU1MzYiIGV4aWY6QXBlcnR1cmVWYWx1ZT0iMzAzMTA0 LzY1NTM2IiBleGlmOkV4cG9zdXJlQmlhc1ZhbHVlPSIwLzEiIGV4aWY6TWV0ZXJpbmdNb2RlPSI1 IiBleGlmOkZvY2FsTGVuZ3RoPSI0NC8xIiBleGlmOkZvY2FsUGxhbmVYUmVzb2x1dGlvbj0iNTE4 NDAwMC84OTQiIGV4aWY6Rm9jYWxQbGFuZVlSZXNvbHV0aW9uPSIzNDU2MDAwLzU5NyIgZXhpZjpG b2NhbFBsYW5lUmVzb2x1dGlvblVuaXQ9IjIiIGV4aWY6Q3VzdG9tUmVuZGVyZWQ9IjAiIGV4aWY6 RXhwb3N1cmVNb2RlPSIwIiBleGlmOldoaXRlQmFsYW5jZT0iMCIgZXhpZjpTY2VuZUNhcHR1cmVU eXBlPSIwIiBleGlmOkdQU1ZlcnNpb25JRD0iMi4zLjAuMCIgZXhpZjpOYXRpdmVEaWdlc3Q9IjM2 ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3 LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3 Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgz LDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQx NzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkz LDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwx NSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDs0NjMwNUJFRkY3QjE1NTI4NDkx RTM3RkVGQzhBMkMzMiIgZGM6Zm9ybWF0PSJpbWFnZS9qcGVnIiBwaG90b3Nob3A6Q29sb3JNb2Rl PSIzIiBwaG90b3Nob3A6SUNDUHJvZmlsZT0ic1JHQiBJRUM2MTk2Ni0yLjEiIHBob3Rvc2hvcDpI aXN0b3J5PSIiIHhhcE1NOkluc3RhbmNlSUQ9InV1aWQ6NEYzODI5MjY4MDFFRTUxMTg1QTM5QkMz NUQ2RkE1QjAiPiA8ZXhpZjpDb21wb25lbnRzQ29uZmlndXJhdGlvbj4gPHJkZjpTZXE+IDxyZGY6 bGk+MTwvcmRmOmxpPiA8cmRmOmxpPjI8L3JkZjpsaT4gPHJkZjpsaT4zPC9yZGY6bGk+IDxyZGY6 bGk+MDwvcmRmOmxpPiA8L3JkZjpTZXE+IDwvZXhpZjpDb21wb25lbnRzQ29uZmlndXJhdGlvbj4g PGV4aWY6SVNPU3BlZWRSYXRpbmdzPiA8cmRmOlNlcT4gPHJkZjpsaT4xNjAwPC9yZGY6bGk+IDwv cmRmOlNlcT4gPC9leGlmOklTT1NwZWVkUmF0aW5ncz4gPGV4aWY6Rmxhc2ggZXhpZjpGaXJlZD0i VHJ1ZSIgZXhpZjpSZXR1cm49IjAiIGV4aWY6TW9kZT0iMSIgZXhpZjpGdW5jdGlvbj0iRmFsc2Ui IGV4aWY6UmVkRXllTW9kZT0iRmFsc2UiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4g PC94OnhtcG1ldGE+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg 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 ICAgICAgICAgPD94cGFja2V0IGVuZD0idyI/Pv/iDFhJQ0NfUFJPRklMRQABAQAADEhMaW5vAhAA AG1udHJSR0IgWFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAA AAD21gABAAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJY WVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAA iHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRlY2gAAAQw AAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0 IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYx OTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAA AAAAAAAAAAAAAAAAWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAA AAAAAAAkoAAAD4QAALbPZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAA AAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3Vy IHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3Vy IHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2Ug Vmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJlbmNlIFZp ZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA dmlldwAAAAAAE6T+ABRfLgAQzxQAA+3MAAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dt ZWFzAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAA BAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEA hgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZ AR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB 6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1 AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgE VQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2 BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH +AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9 ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM 8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/s EAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MT YxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcd F0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsb YxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/q IBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNol CSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpo KpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUw bDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjau Nuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9 oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTO RRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJM uk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1Tb VShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhd yV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmbo Zz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw 4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsE e2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauG DoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/ kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPed ZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mp qhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm2 8Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRR xM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/S wdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE 4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw 5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23////u AA5BZG9iZQBkAAAAAAH/2wCEAAYEBAQFBAYFBQYJBgUGCQsIBgYICwwKCgsKCgwQDAwMDAwMEAwM DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBBwcHDQwNGBAQGBQODg4UFA4ODg4UEQwMDAwMEREM DAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAdMBNwMBEQACEQEDEQH/3QAE ACf/xAGiAAAABwEBAQEBAAAAAAAAAAAEBQMCBgEABwgJCgsBAAICAwEBAQEBAAAAAAAAAAEAAgME BQYHCAkKCxAAAgEDAwIEAgYHAwQCBgJzAQIDEQQABSESMUFRBhNhInGBFDKRoQcVsUIjwVLR4TMW YvAkcoLxJUM0U5KismNzwjVEJ5OjszYXVGR0w9LiCCaDCQoYGYSURUaktFbTVSga8uPzxNTk9GV1 hZWltcXV5fVmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9zhIWGh4iJiouMjY6PgpOUlZaXmJmam5ydnp +So6SlpqeoqaqrrK2ur6EQACAgECAwUFBAUGBAgDA20BAAIRAwQhEjFBBVETYSIGcYGRMqGx8BTB 0eEjQhVSYnLxMyQ0Q4IWklMlomOywgdz0jXiRIMXVJMICQoYGSY2RRonZHRVN/Kjs8MoKdPj84SU pLTE1OT0ZXWFlaW1xdXl9UZWZnaGlqa2xtbm9kdXZ3eHl6e3x9fn9zhIWGh4iJiouMjY6Pg5SVlp eYmZqbnJ2en5KjpKWmp6ipqqusra6vr/2gAMAwEAAhEDEQA/ACk+Z/MXmC3uLq4jEVhtG5gqOYSv WnjXNfnJACCL3LFL65gFx6cYPpoOTqOw8Mqxi91ZSth5Vn8p/pGB6XkR3jpud/fLZwqPPdKUQubh V4SBUHY7GmREDwklaRGjrEL+WEMCOFQD1y7TSJShri4Y6k9rDQOgrXoRXMuQ2Qg7CwAFzJeSOZAT xIGavPMjklLdWt2ubRATXcqteuXYsiHaQFtIfTLkld+Xtksg4lT6C9ku4eFuKU/bc0zHGKjulT/0 m4V4GWIhd+XeuWGgkI3Udagj8px6f6ape+pWSataqK7AfdmVilYRbC9GRdS1IzToFjgb7R75HKeE Itnslhp8kFulseTAlmo3TKzuNlZLP5r0m10IW8iNDPBER6tu1OW1Ox75GOYbA82NMQ/Ir9Nz+cpL zSWiaSMGS4ec9mfoO5bMqj3pI7n1VfTy6ppcYnhBXmpkKioBB38csO4YlkVuIUiSOIBEUAKgFKD5 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 p+3yr+HbJJRE3H0YvsdO/LFm/wD/2Q== ------=_NextPart_000_0BC0_01D19A0F.5B657DE0-- From aioverd@zoho.com Tue Apr 19 01:15:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9FE777CA2 for ; Tue, 19 Apr 2016 01:15:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 15BFBAC001 for ; Mon, 18 Apr 2016 23:15:49 -0700 (PDT) X-ASG-Debug-ID: 1461046547-04cb6c24646eeca0001-NocioJ Received: from mingcaipu.com ([198.15.107.209]) by cuda.sgi.com with ESMTP id lS6jUXrYWq6F3Eu8 for ; Mon, 18 Apr 2016 23:15:47 -0700 (PDT) X-Barracuda-Envelope-From: aioverd@zoho.com X-Barracuda-Apparent-Source-IP: 198.15.107.209 To: xfs@oss.sgi.com Subject: Get Up to 50% Off on Web Hosting Message-ID: <02f6f54aff5e1d8d0b6c20addc9976c5@hobbylobby.com> X-ASG-Orig-Subj: Get Up to 50% Off on Web Hosting Date: Tue, 19 Apr 2016 08:14:25 +0200 From: "Sachin Agarwal" Reply-To: vandrluming@aliyun.com MIME-Version: 1.0 X-Mailer-LID: 8 X-Mailer-RecptId: 10449103 X-Mailer-SID: 1373 X-Mailer-Sent-By: 1 Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: UNKNOWN[198.15.107.209] X-Barracuda-Start-Time: 1461046547 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28867 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 Hello, Greetings of the Day !!! We believe that you deals with online products and web based services and every online service need web hosting server and hosting service to showcase themselves over the internet. We like to introduce ourselves as one of the best web hosting company in India. We have 100% satisfaction assured on all of our hosting services and price is really competitive. Hosting over 6500+ clients, and ranked among top 10 web hosting companies in India. Successfully hosted over 85000 websites and counting. We have recently added new range of servers and running offers on all the hosting servers you may need. Our USP • High configuration Servers • USA Datacenter • Customized Configuration Server • 100% network uptime • 24/7 technical support • Fully Managed Service • IPV4/IPV6 and RDNS availability • 30 days money back If you are interested kindly let us know your requirement and we will get back to you with the detailed quotation and inclusions. Warm Regards Sachin Agarwal (Business Manager) Contact: cheneyioy@sina.com From hugo@swiftstack.com Tue Apr 19 04:56:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.1 required=5.0 tests=HTML_IMAGE_ONLY_20, HTML_IMAGE_RATIO_06,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C67637CA0 for ; Tue, 19 Apr 2016 04:56:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 84AB830404E for ; Tue, 19 Apr 2016 02:56:44 -0700 (PDT) X-ASG-Debug-ID: 1461059799-04cbb02e1d3e1530001-NocioJ Received: from mail-ig0-f175.google.com (mail-ig0-f175.google.com [209.85.213.175]) by cuda.sgi.com with ESMTP id 2WvxcJyBTj0SiLVB (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 19 Apr 2016 02:56:39 -0700 (PDT) X-Barracuda-Envelope-From: hugo@swiftstack.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.175 Received: by mail-ig0-f175.google.com with SMTP id f1so95621529igr.1 for ; Tue, 19 Apr 2016 02:56:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=swiftstack-com.20150623.gappssmtp.com; s=20150623; h=mime-version:from:date:message-id:subject:to:cc; bh=8ZYYACu8c6Q0wIZQiuYy4jqsdCRiVLpbzWuwOdpgsjk=; b=oO61jW58sy2cVNyZ0KukFfdP+67dyYylKplYKDAu7fHjuuOStVd+LIgJvJLmBLedyE 0lewTet4Ia0bPweVjdRJsPExqnkqwzW1kvzKs3enH7zt87tg1NI+jRa4ZR4uqmrMQZ6k qcyMMjApD4BCqzqzfuJ2gFgxEQfbrbILtGlMtSsxsAf50SwZxCbBxhWdpsaaMMUder1k jiojrULDtxZWFtABnNcE2Xl+mmpTzGzww71pRS5XI5i/TKyHlxOuduyQLBlCHpdp1h7H fxnqAiF7jSwFa6c/9Y3Po5PuxDiK2laajWyPk7QO8DjwfLDyXywBlsNH22biZtVe23DM EaUQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:from:date:message-id:subject:to:cc; bh=8ZYYACu8c6Q0wIZQiuYy4jqsdCRiVLpbzWuwOdpgsjk=; b=icvkE2YbXxxlfvd4ENypCdoN1eHlxUL9jVs6I0LIGhn+rxhqA0ESLgHjZL2VX2yBA6 hlEyUB7Mm09gm/qultkckqBKp6kuQehEl4LijZzompHvMhYhbAbxa5u6xReIhoJvNy8P QP0YI983SJE0Ue/Un5DtIhEaq+FyJUBtrL//0zbo192MSE7OnZga0WbEPJ0i3YGG2pa9 4+lldGiDAmQJzWinJijFI3oGG5l7S0BGXw8zFmQX7E4sXDADL0U16lbBnnNfgurk0N+g QgyKUsMzG/kFVM976SPWr2uHw/9EllwSw9O1CrfcXpW2s8NDm9pu2EEn2e25+kZBj176 HSWQ== X-Gm-Message-State: AOPr4FX72JbqQAL+/8uz7ZJRTykGpgtQ7/eI6U2vDVODGpk1269IvgyfZse9r39MyKU0aw+59JV1C+K80FESC6A9 X-Received: by 10.50.70.102 with SMTP id l6mr2747309igu.18.1461059798897; Tue, 19 Apr 2016 02:56:38 -0700 (PDT) MIME-Version: 1.0 Received: by 10.107.47.99 with HTTP; Tue, 19 Apr 2016 02:56:19 -0700 (PDT) From: Hugo Kuo Date: Tue, 19 Apr 2016 17:56:19 +0800 Message-ID: Subject: [XFS] Any process to a particular XFS device hung in D state forever. To: xfs@oss.sgi.com X-ASG-Orig-Subj: [XFS] Any process to a particular XFS device hung in D state forever. Cc: Darrell Bishop Content-Type: multipart/related; boundary=047d7b3a953e4f7b360530d37ea0 X-Barracuda-Connect: mail-ig0-f175.google.com[209.85.213.175] X-Barracuda-Start-Time: 1461059799 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.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=DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_ONLY_20, HTML_IMAGE_ONLY_20_2, HTML_IMAGE_RATIO_06, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28871 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_IMAGE_RATIO_06 BODY: HTML has a low ratio of text to image area 0.00 HTML_IMAGE_ONLY_20 BODY: HTML: images with 1600-2000 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message 0.70 HTML_IMAGE_ONLY_20_2 HTML: images with 1600-2000 bytes of words --047d7b3a953e4f7b360530d37ea0 Content-Type: multipart/alternative; boundary=047d7b3a953e4f7b320530d37e9f --047d7b3a953e4f7b320530d37e9f Content-Type: text/plain; charset=UTF-8 Hi XFS team, We encountered a problem frequently in past three weeks. Our daemons store data to XFS partition associate with xattr. Disk seems not responding since all processes to this disk in D state and can't be killed at all. - It happens on several disks. I feel it's randomly. - Reboot seems solve the problem temporarily. - All disks are multipath devices. I suspected that's an issue from disk corrupted at beginning. But smartctl doesn't show any clue about disk bad. And reboot makes the problem gone away. - Any process to this disk is blocked. Even a simple $ls . Kernel log - I tested the disk by read bytes on block via $dd . It works fine without any error in dmesg. - The `xfs_repair -n` output of a problematic mount point [xfs_repair -n] . It is still processing. - Kernel : Linux node9 2.6.32-573.8.1.el6.x86_64 #1 SMP Tue Nov 10 18:01:38 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux - OS : CentOS release 6.5 (Final) - XFS : xfsprogs.x86_64 3.1.1-14.el6 There's an interesting behaviour of $ls command. * This is completed in 1sec. Very quick and give me the result in the test.d864 file $ls /srv/node/d864/tmp > test.d864 * This is hanging $ls /srv/node/d864/tmp [image: Inline image 1] I suspect there's something wrong with imap. Is there a known bug ? Thanks // Hugo --047d7b3a953e4f7b320530d37e9f Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
    Hi XFS team,=C2=A0

    We encountered a pro= blem frequently in past three weeks. Our daemons store data to XFS partitio= n associate with xattr. =C2=A0

    Disk seems not resp= onding since all processes to this disk in D state and can't be killed = at all.=C2=A0
    • It happens on several disks. I feel it'= s randomly.=C2=A0
    • Reboot seems solve the problem temporarily.= =C2=A0
    • All disks are multipath devices.=C2=A0

    I suspected that's an issue from disk corrupted a= t beginning. But smartctl doesn't show any clue about disk bad. And reb= oot makes the problem gone away.=C2=A0

    • Any= process to this disk is blocked. Even a simple $ls .=C2=A0Kernel log
    • I tested the disk by read bytes on block via= $dd . It works fine without any error in dmesg.=C2=A0
    • The `xfs= _repair -n` output of a problematic mount point=C2=A0[xfs_repair -n]= =C2=A0. It is still processing.=C2=A0
    • Kernel :=C2=A0Linux node9 2.6= .32-573.8.1.el6.x86_64 #1 SMP Tue Nov 10 18:01:38 UTC 2015 x86_64 x86_64 x8= 6_64 GNU/Linux
    • OS :=C2=A0CentOS release 6.5 (Final)
    • XFS :=C2=A0xfsprogs.x86_64 =C2=A0 =C2=A0 =C2=A0 =C2=A0 3.1.1-14.el6

    There's an interesting behaviour of $l= s command.

    * This is completed in 1sec. Very quick and = give me the result in the test.d864 file $ls /srv/node/d864/tmp > test.d= 864
    * This is hanging $ls /srv/node/d864/tmp

    3D"Inline

    I suspect there's something wrong w= ith imap. Is there a known bug ?

    Thanks // Hugo = =C2=A0

    --047d7b3a953e4f7b320530d37e9f-- --047d7b3a953e4f7b360530d37ea0 Content-Type: image/png; name="dd.png" Content-Disposition: inline; filename="dd.png" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: ii_1542cfd022950495 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 lWVVYXXJGrV2teZZb7XuHksY6zGWP7Zy7A0bqo2/TaFNjc0DW4ZtpG2xbYPtSzsTu1S71Xbtdl/t Xexz7Xfb33FQcxjvUOzQ5PDa0cqR7VjheNWJ5hTiNN+p0emVs7Uz13mb800XussElyUurS5fXN1c ha61rr1uJm5pblvcbriru8e4L3c/50HwCPCY79Hs8dHT1bPA85DnX142Xjle+7yejTMfxx23e9wj byNvlvdOb4kP0yfNZ4ePxNfQl+Vb6fvQz9iP47fH76m/pX+2/37/lwH2AcKAowHvAz0D5wa2BGFB oUGlQZ3BasEJwZuD74cYhWSG1IT0h7qEzg5tCSOERYStDrsRrhfODq8O7x/vNn7u+LYIakRcxOaI h5FWkcLIpgnohPET1k64G2UaxY9qiAbR4dFro+/FmMfkx/w2kTgxZmLFxCexDrFzYtvj6HHT4vbF vYsPiF8ZfyfBIkGc0JqonDg5sTrxfVJQ0pokSbJd8tzkiyk6KbyUxlRSamLqntSBScGT1k/qmewy uWTy9SnmU2ZOOT9VZ2ru1OPTlKexph1OI6Qlpe1L+8yKZlWyBtLD07ek97MD2RvYLzh+nHWcXq43 dw33aYZ3xpqMZ5nemWsze7N8s8qz+niBvM28V9lh2duz3+dE5+zNGcpNyq3LI+el5R3jq/Fz+G3T 9afPnN4tsBaUCCT5nvnr8/uFEcI9IkQ0RdRYoA6POh1iC/FP4geFPoUVhR9mJM44PFN1Jn9mxyyr WctmPS0KKfplNj6bPbt1juGchXMezPWfu3MeMi99Xut84/mL5/csCF1QtZCyMGfh78X2xWuK3y5K WtS0WG/xgsWPfgr9qaZEqURYcmOJ15LtS/GlvKWdy5yWbVr2tZRTeqHMvqy87PNy9vILPzv8vPHn oRUZKzpXuq7ctoq4ir/q+mrf1VVrVNcUrXm0dsLa+nXMdaXr3q6ftv58uXP59g2UDeINko2RGxs3 mWxatenz5qzN1yoCKuq26G5ZtuX9Vs7Wy9v8ttVu19tetv3TDt6OmztDd9ZXmlWW7yLuKtz1ZHfi 7vZf3H+p3qOzp2zPl738vZKq2Kq2arfq6n26+1bWoDXimt79k/d3HQg60FhrU7uzjlFXdhAcFB98 /mvar9cPRRxqPex+uPaI6ZEtR+lHS+uR+ln1/Q1ZDZLGlMbuY+OPtTZ5NR39zfa3vc2GzRXHNY6v PEE5sfjE0MmikwMtgpa+U5mnHrVOa71zOvn01baJbZ1nIs6cOxty9nS7f/vJc97nms97nj92wf1C w0XXi/UdLh1Hf3f5/Wina2f9JbdLjV0eXU3d47pPXPa9fOpK0JWzV8OvXrwWda37esL1mzcm35Dc 5Nx8div31qvbhbcH7yy4S7hbek/lXvl93fuVf1j+USdxlRx/EPSg42HcwzuP2I9ePBY9/tyz+Ant SflTg6fVzxyfNfeG9HY9n/S854XgxWBfyZ+qf255afHyyF9+f3X0J/f3vBK+Gnq9/I32m71vnd+2 DsQM3H+X927wfekH7Q9VH90/tn9K+vR0cMZn0ueNXyy/NH2N+Hp3KG9oSMASsmRHAQw2NCMDgNd7 AaClwLMDvMdRlOT3L5kg8jujDIH/hOV3NJnAk8tePwASFgAQCc8o22AzhZgKe+nxO94PoE5Oo21Y RBlOjvJYVHiLIXwYGnqjBwCpCYAvwqGhwa1DQ192Q7K3AGjJl9/7pEKEZ/wddlLU1fMS/Cj/AjEw bWz53+yyAAAACXBIWXMAABYlAAAWJQFJUiTwAAACBmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAA PHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40 LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjIt cmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAg ICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgICAg ICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAg ICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MTI4NjwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAg ICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4yMDcyPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAg ICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgPC9yZGY6 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 ASWgBJTAayFQnBOd242il8Tcnef5LI5khfO4s9LuCmfqrrMQuCDnksECub5pt4wGK+07S9+v8thK XCrtMwGSch07webLnZb5/p1lfYLcV7L7BBt8L1lXsutK+67Q5q9E9297oyfY7tsunvZfCSgBJaAE lIASeHMJSEEC3ZSAElACSkAJKAEloASUgBJQAkpACSgBJZBHQAMGeTj0DyWgBJSAElACSkAJKAEl oASUgBJQAkpACGjAQO1ACSgBJaAElIASUAJKQAkoASWgBJSAEigioAGDIiT6hRJQAkpACSgBJaAE lIASUAJKQAkoASWgAQO1ASWgBJSAElACSkAJKAEloASUgBJQAkqgiIAGDIqQ6BdKQAkoASWgBJSA ElACSkAJKAEloASUgAYM1AaUgBJQAkpACSgBJaAElIASUAJKQAkogSICGjAoQqJfKAEloASUgBJQ AkpACSgBJaAElIASUAIaMFAbUAJKQAkoASWgBJSAElACSkAJKAEloASKCGjAoAiJfqEElIASUAJK QAkoASWgBJSAElACSkAJaMBAbUAJKAEloASUgBJQAkpACSgBJaAElIASKCKgAYMiJPqFElACSkAJ KAEloASUgBJQAkpACSgBJaABA7UBJaAElIASUAJKQAkoASWgBJSAElACSqCIgAYMipDoF0pACSgB JaAElIASUAJKQAkoASWgBJSABgzUBpSAElACSkAJKAEloASUgBJQAkpACSiBIgIaMChCol8oASWg BJSAElACSkAJKAEloASUgBJQAhowUBtQAkpACSgBJaAElIASUAJKQAkoASWgBIoIaMCgCIl+oQSU gBJQAkpACSgBJaAElIASUAJKQAlowOBMNmCDzW6HzWbLOYvf5f2ds+ut+3hx+dLp9DVIffF+XkMn L3CJ08l3PayPxbie651O9uNevUufTif79ejhXeKqsigBJaAElIASUAJKQAmcl4AGDE5NjkGCdBKx 8AHih4fWWRIoSCf4dxRv/0v8ReVLQ0IFdgZU0qmrDBpctJ+nVnjRgUbHVymaueLp5Lse1lkElXV7 eVxOJ3u2V6V+X15feGunUkglEkjxt3y+2u10sp9W79JfYXG9MlwtIW1dCSgBJaAElIASUAJK4PoJ OH7z8P7vr/+yb9sVbXzxTsDuCaB1ZBzVNT6Ed3YYP0jC4W9C//0HSEd3EA4dwuHgi/9btxXIF6R8 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 AkpACSgBJaAElIASUAJKYHwQGNJgMD6ar61UAkpACSgBJaAElIASUAJKQAkoASWgBMIRUINBOCp6 TQkoASWgBJSAElACSkAJKAEloASUwDgnoAaDcS4A2nwloASUgBJQAkpACSgBJaAElIASUALhCKjB IBwVvaYElIASUAJKQAkoASWgBJSAElACSmCcE1CDwTgXAG2+ElACSkAJKAEloASUgBJQAkpACSiB cATUYBCOil5TAkpACSgBJaAElIASUAJKQAkoASUwzgmowWCcC4A2XwkoASWgBJSAElACSkAJKAEl oASUQDgCajAIR0WvKQEloASUgBJQAkpACSgBJaAElIASGOcEhjQYmMD/TCF/PNdDCSgBJaAElIAS UAJKQAkoASWgBJSAEhgfBKxDNdPtdsHV0wVaDYxPOddDCSgBJaAElIASUAJKQAkoASWgBJSAEhgf BMIaDMxmM+KTUwwCNrsDHlcP4ngu1wOHf3zQ0VYqASWgBJSAElACSkAJKAEloASUgBIYpwT6GQxM ZhO8bjd8Ph8+e+PN/PQSiyxF8NNYYDGuS7rJFDQcjFNq2mwloASUgBJQAkpACSgBJaAElIASUAKn OQHTrTd+oZ+7gMQtiIqJhcVmG9R0r9uDzrYW+P39Hhl0n15QAkpACSgBJaAElIASUAJKQAkoASWg BE5tAv08DKQpYgxobayH3zfYKCAeCBbrYEPCqY1Aa68ElIASUAJKQAkoASWgBJSAElACSkAJDCQw yGAgN1ht9oH39Z2rd0EfCv2iBJSAElACSkAJKAEloASUgBJQAkrgtCUQ1mCgRoHTtr+1YUpACSgB JaAElIASUAJKQAkoASWgBEZEQKMXjgiT3qQElIASUAJKQAkoASWgBJSAElACSmB8EVCDwfjqb22t ElACSkAJKAEloASUgBJQAkpACSiBERFQg8GIMOlNSkAJKAEloASUgBJQAkpACSgBJaAExhcBNRiM r/7W1ioBJaAElIASUAJKQAkoASWgBJSAEhgRATUYjAiT3qQElIASUAJKQAkoASWgBJSAElACSmB8 EbCaLWE3ShhfFLS1SkAJKAEloASUgBJQAkpACSgBJaAElEA/AtbWuup+F/RECSgBJaAElIASUAJK QAkoASWgBJSAElAC1nM+9mmloASUgBJQAkpACSgBJaAElIASUAJKQAkogX4ErIkTM/td0BMloASU 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 --047d7b3a953e4f7b360530d37ea0-- From bfoster@redhat.com Tue Apr 19 06:30:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 539CD7CA0 for ; Tue, 19 Apr 2016 06:30:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 28E3E304039 for ; Tue, 19 Apr 2016 04:30:42 -0700 (PDT) X-ASG-Debug-ID: 1461065440-04cbb02e1d3e7cf0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id MCD3vOl71pWdOHay (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 19 Apr 2016 04:30:41 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3E4CC81F03; Tue, 19 Apr 2016 11:30:40 +0000 (UTC) Received: from laptop.bfoster (unused [10.10.50.176] (may be forged)) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3JBUcjY027084 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Tue, 19 Apr 2016 07:30:39 -0400 Date: Tue, 19 Apr 2016 07:30:38 -0400 From: Brian Foster To: Hugo Kuo Cc: xfs@oss.sgi.com, Darrell Bishop Subject: Re: [XFS] Any process to a particular XFS device hung in D state forever. Message-ID: <20160419113038.GA2649@laptop.bfoster> X-ASG-Orig-Subj: Re: [XFS] Any process to a particular XFS device hung in D state forever. 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: 1461065440 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Apr 19, 2016 at 05:56:19PM +0800, Hugo Kuo wrote: > Hi XFS team, > > We encountered a problem frequently in past three weeks. Our daemons store > data to XFS partition associate with xattr. > > Disk seems not responding since all processes to this disk in D state and > can't be killed at all. > > - It happens on several disks. I feel it's randomly. > - Reboot seems solve the problem temporarily. > - All disks are multipath devices. > > > I suspected that's an issue from disk corrupted at beginning. But smartctl > doesn't show any clue about disk bad. And reboot makes the problem gone > away. > > > - Any process to this disk is blocked. Even a simple $ls . Kernel log > Looks like it's waiting on an AGF buffer. The buffer could be held by something else, but we don't have enough information from that one trace. Could you get all of the blocked tasks when in this state (e.g., "echo w > /proc/sysrq-trigger")? > - I tested the disk by read bytes on block via $dd . It works fine > without any error in dmesg. > - The `xfs_repair -n` output of a problematic mount point [xfs_repair -n] > . It > is still processing. I presume this was run after a forced reboot..? If so, was the filesystem remounted first to replay the log (xfs_repair -n doesn't detect/warn about a dirty log, iirc). If the log was dirty, then repair is a bit less interesting simply because some corruption is to be expected in that scenario. > - Kernel : Linux node9 2.6.32-573.8.1.el6.x86_64 #1 SMP Tue Nov 10 > 18:01:38 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux > - OS : CentOS release 6.5 (Final) > - XFS : xfsprogs.x86_64 3.1.1-14.el6 > > > There's an interesting behaviour of $ls command. > > * This is completed in 1sec. Very quick and give me the result in the > test.d864 file $ls /srv/node/d864/tmp > test.d864 > * This is hanging $ls /srv/node/d864/tmp > I'm not following you here. Are you missing an attachment (test.d864)? Brian > [image: Inline image 1] > > I suspect there's something wrong with imap. Is there a known bug ? > > Thanks // Hugo > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From aioverd@zoho.com Tue Apr 19 07:09:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E9B107CA0 for ; Tue, 19 Apr 2016 07:09:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id BDAD630404E for ; Tue, 19 Apr 2016 05:09:40 -0700 (PDT) X-ASG-Debug-ID: 1461067778-04cb6c2462707f80001-NocioJ Received: from chafangjia.com (chafangjia.com [64.110.131.15]) by cuda.sgi.com with ESMTP id 5Tx3I9YLxN7ClB8n for ; Tue, 19 Apr 2016 05:09:38 -0700 (PDT) X-Barracuda-Envelope-From: aioverd@zoho.com X-Barracuda-Apparent-Source-IP: 64.110.131.15 To: xfs@oss.sgi.com Subject: 100% natural products made by mother nature. Message-ID: <46335fdcb67dd9851b0ed0d2f0f21900@hobbylobby.com> X-ASG-Orig-Subj: 100% natural products made by mother nature. Date: Tue, 19 Apr 2016 14:12:53 +0200 From: "Jenny Scott" Reply-To: vandrluming@aliyun.com MIME-Version: 1.0 X-Mailer-LID: 8 X-Mailer-RecptId: 10449103 X-Mailer-SID: 1375 X-Mailer-Sent-By: 1 Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: chafangjia.com[64.110.131.15] X-Barracuda-Start-Time: 1461067778 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=ALL_NATURAL, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28873 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 ALL_NATURAL BODY: Spam is 100% natural?! 0.60 MARKETING_SUBJECT Subject contains popular marketing words Dear followers, This week we will inform you about aromatherapy with essential oils. Not only will your house smell beautiful like °∞Mother Nature°±, aromatherapy has also some great moot benefits. Aromatherapy is the practice of using volatile plant oils, including essential oils, for psychological and physical well-being. Essential oils, the pure essence of a plant, have been found to provide both psychological and physical benefits when used correctly and safely. The Essential Oil Profiles area details over 90 essential oils. Absolutes, CO2s and Hydrosols are also commonly utilized in aromatherapy. Although essential oils, CO2 extracts and absolutes are distilled by different methods, the term essential oil is sometimes used as a blanket term to include all natural, aromatic, volatile, plant oils including CO2s and absolutes. In addition to essential oils, aromatherapy encourages the use of other complementary natural ingredients including cold pressed vegetable oils, jojoba (a liquid wax), hydrosols, herbs, milk powders, sea salts, sugars (an exfoliant), clays and muds. Products that include synthetic ingredients are frowned upon in holistic aromatherapy. It is important to note that perfume oils also known as fragrance oils (and usually listed as "fragrance" on an ingredient label) are not the same as essential oils. Fragrance oils and perfume oils contain synthetic chemicals and do not provide the therapeutic benefits of essential oils. We have found for you a website with great 100% natural essential oils for home aromatherapy and they also give you for each essential oil a short description about their health benefits and properties. Have a great read at their blog and get yourself one of those essential oils, to get yourself in the perfect spring moot. Are you interested send us a replay and we send you an discount voucher for your shopping. Visit our website for more details: Thanks Jenny Scott From hugo@swiftstack.com Tue Apr 19 08:25:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 C046A7CA0 for ; Tue, 19 Apr 2016 08:25:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 923C78F8040 for ; Tue, 19 Apr 2016 06:25:20 -0700 (PDT) X-ASG-Debug-ID: 1461072315-04cb6c246270b2a0001-NocioJ Received: from mail-ig0-f171.google.com (mail-ig0-f171.google.com [209.85.213.171]) by cuda.sgi.com with ESMTP id 87jQaRnmAtRRlVu0 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 19 Apr 2016 06:25:15 -0700 (PDT) X-Barracuda-Envelope-From: hugo@swiftstack.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.171 Received: by mail-ig0-f171.google.com with SMTP id gy3so99163226igb.0 for ; Tue, 19 Apr 2016 06:25:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=swiftstack-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=MP7R78iz0OAUol4vKz4nSP9LsdS+LeImhugtmnXosOQ=; b=gT0QD+kDlrHX3j9fIwm/vEoDPdPHA9ZUyG4S9Ju9bped0IdHwpkTNt5ZUWgsfHBz4d ehPLPGX8r00V61FQmkCdhXmVIf4r2nj3eTunXGSY8qKiQVOoX4z02nuyr1pu7OdQNljV 6PeN9pm/oqLdEE4mJfW3VbqgYfDYKKQM6xdBy6PKh0zvsfEyz9d6I1kuSPfcEoSrByGT SStaE9fSrPQf2CbHih3x/7Pq911RUO6pAIOqD85Hb3HRUIVdIA4xi3e1D9N3UAe/DDuu Gh/M+87MMCry6J/EVudkaq7Q2ba0ajdT5BsNGID08TCYiw3+9tbTJ5N9Xbv8LO94+YtL rJEg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=MP7R78iz0OAUol4vKz4nSP9LsdS+LeImhugtmnXosOQ=; b=E2Vyps5x2VcropjOCTzPTk4hgb3Bmce3CXVnx/rFfHLHAikJ6rkjzPShDDXW0JRP3m ejgYPRWqv+Zpaqr/D3DdY3jlpQfzyD3CSzh6NUbvGF01OUN0/FSHNYbe2HodBQ/pEr5d z3YEHElViUhezAB6BJ0AXKrgrFrH5HDjEEtgaxDxXLsLJXkygtbeYDZxujBkpr/26PKA nXbY6hMA4ff1LcDpCsbVEl3lQWC08XvNcldOwrIkN2G6ZdDOhqyhOmuWavp5cQS0blxK uodNXq7Zn1XMAl5xDgCHYeaqZwDVbUZdRW9RAP9/6sMZL5dhTeajriERTUFcFDpvUyPq iwbg== X-Gm-Message-State: AOPr4FWwd/unnCTspjFErdL6YFHQdNqRn8TqUtnhUDClf5tMeuXDRLUP0aRJEz6ZaW38/+YLXfL5HwHzMtarIAs0 X-Received: by 10.50.118.225 with SMTP id kp1mr26690469igb.9.1461072314683; Tue, 19 Apr 2016 06:25:14 -0700 (PDT) MIME-Version: 1.0 Received: by 10.107.47.99 with HTTP; Tue, 19 Apr 2016 06:24:55 -0700 (PDT) In-Reply-To: <20160419113038.GA2649@laptop.bfoster> References: <20160419113038.GA2649@laptop.bfoster> From: Hugo Kuo Date: Tue, 19 Apr 2016 21:24:55 +0800 Message-ID: Subject: Re: [XFS] Any process to a particular XFS device hung in D state forever. To: Brian Foster X-ASG-Orig-Subj: Re: [XFS] Any process to a particular XFS device hung in D state forever. Cc: xfs@oss.sgi.com, Darrell Bishop Content-Type: multipart/alternative; boundary=001a1135fa684efb050530d668f5 X-Barracuda-Connect: mail-ig0-f171.google.com[209.85.213.171] X-Barracuda-Start-Time: 1461072315 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28874 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --001a1135fa684efb050530d668f5 Content-Type: text/plain; charset=UTF-8 Hi Brain, Here's the a gist include sysrq-trigger and strace of one of the hanging $ls result. This is from another problematic disk (d817) on the same server. https://gist.github.com/HugoKuo/8eb8208bbb7a7f562a6c9a3eafa8f37f It looks like the hanging $ls is stuck on getting extend attribute of a file on this disk. The full output can be found in the link above. lstat("/srv/node/d864/tmp/tmpIRYFaW", {st_mode=S_IFREG|0600, st_size=0, ...}) = 0 capget(0x20080522, 0, NULL) = -1 EFAULT (Bad address) getxattr("/srv/node/d864/tmp/tmpIRYFaW", "security.capability" As for the xfs_repair output in link https://gist.github.com/HugoKuo/76f65bdc0b860ca6ed5e786f8c43da0e . Your question is if the node been force rebooted. The answer is NO. I* didn't reboot* this server yet. I force unmounted it via *$umount -l * . Then run the xfs_repair. $ls /srv/node/d864/tmp > test.d864 $ls /srv/node/d864/tmp Here's the contents of test.d864 https://gist.github.com/HugoKuo/25f93cd6daf5b0666a2ab85defd63a56 Thanks // Hugo On Tue, Apr 19, 2016 at 7:30 PM, Brian Foster wrote: > On Tue, Apr 19, 2016 at 05:56:19PM +0800, Hugo Kuo wrote: > > Hi XFS team, > > > > We encountered a problem frequently in past three weeks. Our daemons > store > > data to XFS partition associate with xattr. > > > > Disk seems not responding since all processes to this disk in D state and > > can't be killed at all. > > > > - It happens on several disks. I feel it's randomly. > > - Reboot seems solve the problem temporarily. > > - All disks are multipath devices. > > > > > > I suspected that's an issue from disk corrupted at beginning. But > smartctl > > doesn't show any clue about disk bad. And reboot makes the problem gone > > away. > > > > > > - Any process to this disk is blocked. Even a simple $ls . Kernel log > > > > Looks like it's waiting on an AGF buffer. The buffer could be held by > something else, but we don't have enough information from that one > trace. Could you get all of the blocked tasks when in this state (e.g., > "echo w > /proc/sysrq-trigger")? > > > > - I tested the disk by read bytes on block via $dd . It works fine > > without any error in dmesg. > > - The `xfs_repair -n` output of a problematic mount point [xfs_repair > -n] > > . > It > > is still processing. > > I presume this was run after a forced reboot..? If so, was the > filesystem remounted first to replay the log (xfs_repair -n doesn't > detect/warn about a dirty log, iirc). If the log was dirty, then repair > is a bit less interesting simply because some corruption is to be > expected in that scenario. > > > - Kernel : Linux node9 2.6.32-573.8.1.el6.x86_64 #1 SMP Tue Nov 10 > > 18:01:38 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux > > - OS : CentOS release 6.5 (Final) > > - XFS : xfsprogs.x86_64 3.1.1-14.el6 > > > > > > There's an interesting behaviour of $ls command. > > > > * This is completed in 1sec. Very quick and give me the result in the > > test.d864 file $ls /srv/node/d864/tmp > test.d864 > > * This is hanging $ls /srv/node/d864/tmp > > > > I'm not following you here. Are you missing an attachment (test.d864)? > > Brian > > > [image: Inline image 1] > > > > I suspect there's something wrong with imap. Is there a known bug ? > > > > Thanks // Hugo > > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > --001a1135fa684efb050530d668f5 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
    Hi Brain,=C2=A0

    Here's the a gist i= nclude sysrq-trigger and strace of one of the hanging $ls result. This is f= rom another problematic disk (d817) on the same server.

    https://gist.github.com/HugoKuo/8eb8208bbb7a7f562a6c9a3eafa8f37f

    It looks like the hanging $ls is stuck o= n getting extend attribute of a file on this disk. The full output can be f= ound in the link above.=C2=A0

    <= td id=3D"file-hanging-L143" class=3D"" style=3D"padding:0px 10px;width:50px= ;min-width:50px;font-family:Consolas,'Liberation Mono',Menlo,Courie= r,monospace;font-size:12px;line-height:18px;color:rgba(0,0,0,0.298039);text= -align:right;white-space:nowrap;vertical-align:top;border-style:solid;borde= r-color:rgb(238,238,238);border-width:0px 1px 0px 0px">
    lstat("/srv/= node/d864/tmp/tmpIRYFaW", {st_mode=3DS_IFREG|0600, st_size=3D0, ...}) = =3D 0
    capget(0x20080522, 0, NULL) =3D -1 EFAULT (Bad ad= dress)
    getxattr("/srv/node/d864/tmp/tmpIRYFaW", "sec= urity.capability"

    <= br>
    As for the xfs_repair output in link=C2=A0https://gist.github.com/HugoKuo/76f65bdc0b860ca6ed5e786= f8c43da0e=C2=A0. Your question is if the node been force rebooted. The = answer is NO. =C2=A0 I didn't reboot this server yet. I force un= mounted it via $umount -l <dev>=C2=A0. Then run the xfs_repair= .=C2=A0

    $ls /srv/node/d864/tmp = > test.d864
    $ls /srv/node/d864/= tmp

    Thanks // Hugo
    =

    On Tue, Apr 19, 2016 at 7:30 PM, Brian Foster <= bfoster@redhat.com<= /a>> wrote:
    On Tue, Apr 19, 2016 at 05:56:19PM +0800, Hugo Kuo wrote: > Hi XFS team,
    >
    > We encountered a problem frequently in past three weeks. Our daemons s= tore
    > data to XFS partition associate with xattr.
    >
    > Disk seems not responding since all processes to this disk in D state = and
    > can't be killed at all.
    >
    >=C2=A0 =C2=A0 - It happens on several disks. I feel it's ran= domly.
    >=C2=A0 =C2=A0 - Reboot seems solve the problem temporarily.
    >=C2=A0 =C2=A0 - All disks are multipath devices.
    >
    >
    > I suspected that's an issue from disk corrupted at beginning. But = smartctl
    > doesn't show any clue about disk bad. And reboot makes the problem= gone
    > away.
    >
    >
    >=C2=A0 =C2=A0 - Any process to this disk is blocked. Even a simp= le $ls . Kernel log
    >=C2=A0 =C2=A0 <
    https://gist.g= ithub.com/HugoKuo/f87748786b26ea04fd9e1d86d9538293>

    Looks like it's waiting on an AGF buffer. The buffer could be held by something else, but we don't have enough information from that one
    trace. Could you get all of the blocked tasks when in this state (e.g.,
    "echo w > /proc/sysrq-trigger")?
    <= font color=3D"#cccccc">

    =C2=A0

    >=C2=A0 =C2=A0 - I tested the disk by read bytes on block via $dd . It w= orks fine
    >=C2=A0 =C2=A0 without any error in dmesg.
    >=C2=A0 =C2=A0 - The `xfs_repair -n` output of a problematic moun= t point [xfs_repair -n]
    >=C2=A0 =C2=A0 <https://gist.g= ithub.com/HugoKuo/76f65bdc0b860ca6ed5e786f8c43da0e> . It
    >=C2=A0 =C2=A0 is still processing.

    I presume this was run after a forced reboot..? If so, was the
    filesystem remounted first to replay the log (xfs_repair -n doesn't
    detect/warn about a dirty log, iirc). If the log was dirty, then repair
    is a bit less interesting simply because some corruption is to be
    expected in that scenario.

    >=C2=A0 =C2=A0 - Kernel : Linux node9 2.6.32-573.8.1.el6.x86_64 #1 SMP T= ue Nov 10
    >=C2=A0 =C2=A0 18:01:38 UTC 2015 x86_64 x86_64 x86_64 G= NU/Linux
    >=C2=A0 =C2=A0 - OS : CentOS release 6.5 (Final)
    >=C2=A0 =C2=A0 - XFS : xfsprogs.x86_64=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= 3.1.1-14.el6
    >
    >
    > There's an interesting behaviour of $ls command.
    >
    > * This is completed in 1sec. Very quick and give me the result in the<= br> > test.d864 file $ls /srv/node/d864/tmp > test.d864
    > * This is hanging $ls /srv/node/d864/tmp
    >

    I'm not following you here. Are you missing an attachment (test.= d864)?

    Brian

    > [image: Inline image 1]
    >
    > I suspect there's something wrong with imap. Is there a known bug = ?
    >
    > Thanks // Hugo



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


    --001a1135fa684efb050530d668f5-- From bfoster@redhat.com Tue Apr 19 14:34:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E30217CA0 for ; Tue, 19 Apr 2016 14:34:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4CFB4AC002 for ; Tue, 19 Apr 2016 12:34:42 -0700 (PDT) X-ASG-Debug-ID: 1461094479-04cb6c246071ede0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id fANCNWMcAoXevMRu (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 19 Apr 2016 12:34:40 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A80BB8AE73; Tue, 19 Apr 2016 19:34:39 +0000 (UTC) Received: from laptop.bfoster (vpn-55-154.rdu2.redhat.com [10.10.55.154]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3JJYZvU012828 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Tue, 19 Apr 2016 15:34:36 -0400 Date: Tue, 19 Apr 2016 15:34:35 -0400 From: Brian Foster To: Hugo Kuo Cc: xfs@oss.sgi.com, Darrell Bishop Subject: Re: [XFS] Any process to a particular XFS device hung in D state forever. Message-ID: <20160419193435.GA2667@laptop.bfoster> X-ASG-Orig-Subj: Re: [XFS] Any process to a particular XFS device hung in D state forever. References: <20160419113038.GA2649@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461094480 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Apr 19, 2016 at 09:24:55PM +0800, Hugo Kuo wrote: > Hi Brain, > > Here's the a gist include sysrq-trigger and strace of one of the hanging > $ls result. This is from another problematic disk (d817) on the same server. > > https://gist.github.com/HugoKuo/8eb8208bbb7a7f562a6c9a3eafa8f37f > > It looks like the hanging $ls is stuck on getting extend attribute of a > file on this disk. The full output can be found in the link above. > > lstat("/srv/node/d864/tmp/tmpIRYFaW", {st_mode=S_IFREG|0600, st_size=0, > ...}) = 0 > capget(0x20080522, 0, NULL) = -1 EFAULT (Bad address) > getxattr("/srv/node/d864/tmp/tmpIRYFaW", "security.capability" > So there's definitely some traces waiting on AGF locks and whatnot, but also many traces that appear to be waiting on I/O. For example: kernel: swift-object- D 0000000000000008 0 2096 1605 0x00000000 kernel: ffff8877cc2378b8 0000000000000082 ffff8877cc237818 ffff887ff016eb68 kernel: ffff883fd4ab6b28 0000000000000046 ffff883fd4bd9400 00000001e7ea49d0 kernel: ffff8877cc237848 ffffffff812735d1 ffff885fa2e4a5f8 ffff8877cc237fd8 kernel: Call Trace: kernel: [] ? __blk_run_queue+0x31/0x40 kernel: [] schedule_timeout+0x215/0x2e0 kernel: [] ? blk_peek_request+0x189/0x210 kernel: [] ? elv_queue_empty+0x33/0x40 kernel: [] ? dm_request_fn+0x240/0x340 [dm_mod] kernel: [] wait_for_common+0x123/0x180 kernel: [] ? default_wake_function+0x0/0x20 kernel: [] ? dm_unplug_all+0x36/0x50 [dm_mod] kernel: [] ? _xfs_buf_read+0x46/0x60 [xfs] kernel: [] ? xfs_trans_read_buf+0x197/0x410 [xfs] kernel: [] wait_for_completion+0x1d/0x20 kernel: [] xfs_buf_iowait+0x9b/0x100 [xfs] kernel: [] ? xfs_trans_read_buf+0x197/0x410 [xfs] kernel: [] _xfs_buf_read+0x46/0x60 [xfs] kernel: [] xfs_buf_read+0xab/0x100 [xfs] ... Are all of these swift processes running against independent storage, or one big array? Also, can you tell (e.g., with iotop) whether progress is being made here, albiet very slowly, or if the storage is indeed locked up..? In any event, given the I/O hangs, the fact that you're on an old distro kernel and you have things like multipath enabled, it might be worthwhile to see if you can rule out any multipath issues. > > As for the xfs_repair output in link > https://gist.github.com/HugoKuo/76f65bdc0b860ca6ed5e786f8c43da0e . Your > question is if the node been force rebooted. The answer is NO. I* didn't > reboot* this server yet. I force unmounted it via *$umount -l * . Then > run the xfs_repair. > 'umount -l' doesn't necessarily force anything. It just lazily unmounts the fs from the namespace and cleans up the mount once all references are dropped. I suspect the fs is still mounted internally. Brian > $ls /srv/node/d864/tmp > test.d864 > $ls /srv/node/d864/tmp > > > Here's the contents of test.d864 > https://gist.github.com/HugoKuo/25f93cd6daf5b0666a2ab85defd63a56 > > Thanks // Hugo > > On Tue, Apr 19, 2016 at 7:30 PM, Brian Foster wrote: > > > On Tue, Apr 19, 2016 at 05:56:19PM +0800, Hugo Kuo wrote: > > > Hi XFS team, > > > > > > We encountered a problem frequently in past three weeks. Our daemons > > store > > > data to XFS partition associate with xattr. > > > > > > Disk seems not responding since all processes to this disk in D state and > > > can't be killed at all. > > > > > > - It happens on several disks. I feel it's randomly. > > > - Reboot seems solve the problem temporarily. > > > - All disks are multipath devices. > > > > > > > > > I suspected that's an issue from disk corrupted at beginning. But > > smartctl > > > doesn't show any clue about disk bad. And reboot makes the problem gone > > > away. > > > > > > > > > - Any process to this disk is blocked. Even a simple $ls . Kernel log > > > > > > > Looks like it's waiting on an AGF buffer. The buffer could be held by > > something else, but we don't have enough information from that one > > trace. Could you get all of the blocked tasks when in this state (e.g., > > "echo w > /proc/sysrq-trigger")? > > > > > > > > > > > - I tested the disk by read bytes on block via $dd . It works fine > > > without any error in dmesg. > > > - The `xfs_repair -n` output of a problematic mount point [xfs_repair > > -n] > > > . > > It > > > is still processing. > > > > I presume this was run after a forced reboot..? If so, was the > > filesystem remounted first to replay the log (xfs_repair -n doesn't > > detect/warn about a dirty log, iirc). If the log was dirty, then repair > > is a bit less interesting simply because some corruption is to be > > expected in that scenario. > > > > > - Kernel : Linux node9 2.6.32-573.8.1.el6.x86_64 #1 SMP Tue Nov 10 > > > 18:01:38 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux > > > - OS : CentOS release 6.5 (Final) > > > - XFS : xfsprogs.x86_64 3.1.1-14.el6 > > > > > > > > > There's an interesting behaviour of $ls command. > > > > > > * This is completed in 1sec. Very quick and give me the result in the > > > test.d864 file $ls /srv/node/d864/tmp > test.d864 > > > * This is hanging $ls /srv/node/d864/tmp > > > > > > > I'm not following you here. Are you missing an attachment (test.d864)? > > > > Brian > > > > > [image: Inline image 1] > > > > > > I suspect there's something wrong with imap. Is there a known bug ? > > > > > > Thanks // Hugo > > > > > > > > > _______________________________________________ > > > xfs mailing list > > > xfs@oss.sgi.com > > > http://oss.sgi.com/mailman/listinfo/xfs > > > > From sandeen@sandeen.net Tue Apr 19 15:13:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7E7A17CA0 for ; Tue, 19 Apr 2016 15:13:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DE0B3AC003 for ; Tue, 19 Apr 2016 13:13:30 -0700 (PDT) X-ASG-Debug-ID: 1461096807-04cbb02e1d417680001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id n37b4ocevn7Gpemd for ; Tue, 19 Apr 2016 13:13:27 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (unknown [74.203.127.200]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id BB11B9E for ; Tue, 19 Apr 2016 15:13:26 -0500 (CDT) Subject: Re: [PATCH 1/4] xfs: Don't wrap growfs AGFL indexes To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: Don't wrap growfs AGFL indexes References: <1459836310-12619-1-git-send-email-david@fromorbit.com> <1459836310-12619-2-git-send-email-david@fromorbit.com> <20160407235043.GB1439@infradead.org> From: Eric Sandeen Message-ID: <57169165.8020005@sandeen.net> Date: Tue, 19 Apr 2016 16:13:25 -0400 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: <20160407235043.GB1439@infradead.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1461096807 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28882 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/7/16 7:50 PM, Christoph Hellwig wrote: > On Tue, Apr 05, 2016 at 04:05:07PM +1000, Dave Chinner wrote: >> From: Dave Chinner >> >> Commit 96f859d ("libxfs: pack the agfl header structure so >> XFS_AGFL_SIZE is correct") allowed the freelist to use the empty >> slot at the end of the freelist on 64 bit systems that was not >> being used due to sizeof() rounding up the structure size. >> >> This has caused versions of xfs_repair prior to 4.5.0 (which also >> has the fix) to report this as a corruption once the filesystem has >> been grown. Older kernels can also have problems (seen from a whacky >> container/vm management environment) mounting filesystems grown on a >> system with a newer kernel than the vm/container it is deployed on. >> >> To avoid this problem, change the initial free list indexes not to >> wrap across the end of the AGFL, hence avoiding the initialisation >> of agf_fllast to the last index in the AGFL. > > I have to admit that it's been a while that I looked at the AGFL > code, but I simply don't understand what's happening in this patch. > Diff slightly reorder: > >> - agf->agf_flfirst = 0; >> + agf->agf_flfirst = cpu_to_be32(1); > > So flfirst moves from 0 to 1. > >> - agf->agf_fllast = cpu_to_be32(XFS_AGFL_SIZE(mp) - 1); >> + agf->agf_fllast = 0; > > And last from size - 1 to 0. In my naive reading this introduces > wrapping and doesn't remove it. What do I miss? I'm confused by this too. I think this fixes it because regardless of XFS_AGFL_SIZE under any kernel, when we follow the circular list we'll wrap around at the "right" limit, if we start out wrapped as above, rather than potentially filling in a number for last which doesn't match the running code? Anyway, it does fix the testcase of "mkfs with old xfsprogs; grow under new kernel; repair with old progs" which used to complain about i.e. "fllast 118 in agf 94 too large (max = 118)" A growfs under a new kernel, and a mount under an old kernel showed the same problems; this should fix that as well. We seem to have a few problems introduced by the AGFL header packing; we have checks (in xfs_agf_verify(), for example, and xfs_repair's verify_set_agf()) which depend on the size of this structure. If the size moves in the "wrong" way the checks fire off as corruption. It seems to me that now, mismatches between userspace/kernelspace versions will cause these size checks to fail; that seems much more common (and worse) than the original problem of migrating a filesystem between 32 and 64 bit machines. I'm trying to convince myself that we don't have a lot more of these lurking with all the combinations of old/new kernels & old/new userspace, or filesystems migrated between old/new kernels, etc. This patch is ok for initialization but isn't it still quite possible to end up with an fllast set at runtime which is outside the valid range for older userspace or kernel code? -Eric From sandeen@redhat.com Tue Apr 19 15:29:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 333E77CA0 for ; Tue, 19 Apr 2016 15:29:28 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A6485AC002 for ; Tue, 19 Apr 2016 13:29:27 -0700 (PDT) X-ASG-Debug-ID: 1461097765-04cbb02e1d4190e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 6WNL00FMBocWs0jD (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 19 Apr 2016 13:29:26 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9C6BB7F359 for ; Tue, 19 Apr 2016 20:29:25 +0000 (UTC) Received: from Liberator.local (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3JKTOae011824 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 19 Apr 2016 16:29:25 -0400 To: xfs-oss From: Eric Sandeen Subject: [PATCH] xfs_repair: fix agf limit error messages Message-ID: <57169524.30307@redhat.com> X-ASG-Orig-Subj: [PATCH] xfs_repair: fix agf limit error messages Date: Tue, 19 Apr 2016 16:29:24 -0400 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461097766 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Today we see errors like "fllast 118 in agf 94 too large (max = 118)" which makes no sense. If we are erroring on X >= Y, Y is clearly not the maximum allowable value. Signed-off-by: Eric Sandeen --- diff --git a/repair/agheader.c b/repair/agheader.c index bd11ac2..b95cedd 100644 --- a/repair/agheader.c +++ b/repair/agheader.c @@ -94,7 +94,7 @@ verify_set_agf(xfs_mount_t *mp, xfs_agf_t *agf, xfs_agnumber_t i) if (be32_to_cpu(agf->agf_flfirst) >= XFS_AGFL_SIZE(mp)) { do_warn(_("flfirst %d in agf %d too large (max = %zu)\n"), be32_to_cpu(agf->agf_flfirst), - i, XFS_AGFL_SIZE(mp)); + i, XFS_AGFL_SIZE(mp) - 1); if (!no_modify) agf->agf_flfirst = cpu_to_be32(0); } @@ -102,7 +102,7 @@ verify_set_agf(xfs_mount_t *mp, xfs_agf_t *agf, xfs_agnumber_t i) if (be32_to_cpu(agf->agf_fllast) >= XFS_AGFL_SIZE(mp)) { do_warn(_("fllast %d in agf %d too large (max = %zu)\n"), be32_to_cpu(agf->agf_fllast), - i, XFS_AGFL_SIZE(mp)); + i, XFS_AGFL_SIZE(mp) - 1); if (!no_modify) agf->agf_fllast = cpu_to_be32(0); } From darrick.wong@oracle.com Tue Apr 19 16:06:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 82DC97CA0 for ; Tue, 19 Apr 2016 16:06:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 52E0730405F for ; Tue, 19 Apr 2016 14:06:06 -0700 (PDT) X-ASG-Debug-ID: 1461099964-04cbb02e1c41bd20001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id CI86D2ZUOhDgDmFS (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 19 Apr 2016 14:06:04 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u3JL62M3027650 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 19 Apr 2016 21:06:03 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u3JL62QA015798 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 19 Apr 2016 21:06:02 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u3JL60Ed025919; Tue, 19 Apr 2016 21:06:02 GMT Received: from localhost (/74.203.127.200) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 19 Apr 2016 13:51:32 -0700 USER-AGENT: Mutt/1.5.21 (2010-09-15) MIME-Version: 1.0 Message-ID: <20160419205130.GG18517@birch.djwong.org> Date: Tue, 19 Apr 2016 13:51:30 -0700 (PDT) From: "Darrick J. Wong" To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfs: Don't wrap growfs AGFL indexes References: <1459836310-12619-1-git-send-email-david@fromorbit.com> <1459836310-12619-2-git-send-email-david@fromorbit.com> <20160407235043.GB1439@infradead.org> <57169165.8020005@sandeen.net> X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: Don't wrap growfs AGFL indexes In-Reply-To: <57169165.8020005@sandeen.net> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1461099964 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28884 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Apr 19, 2016 at 04:13:25PM -0400, Eric Sandeen wrote: > > > On 4/7/16 7:50 PM, Christoph Hellwig wrote: > > On Tue, Apr 05, 2016 at 04:05:07PM +1000, Dave Chinner wrote: > >> From: Dave Chinner > >> > >> Commit 96f859d ("libxfs: pack the agfl header structure so > >> XFS_AGFL_SIZE is correct") allowed the freelist to use the empty > >> slot at the end of the freelist on 64 bit systems that was not > >> being used due to sizeof() rounding up the structure size. > >> > >> This has caused versions of xfs_repair prior to 4.5.0 (which also > >> has the fix) to report this as a corruption once the filesystem has > >> been grown. Older kernels can also have problems (seen from a whacky > >> container/vm management environment) mounting filesystems grown on a > >> system with a newer kernel than the vm/container it is deployed on. > >> > >> To avoid this problem, change the initial free list indexes not to > >> wrap across the end of the AGFL, hence avoiding the initialisation > >> of agf_fllast to the last index in the AGFL. > > > > I have to admit that it's been a while that I looked at the AGFL > > code, but I simply don't understand what's happening in this patch. > > Diff slightly reorder: > > > >> - agf->agf_flfirst = 0; > >> + agf->agf_flfirst = cpu_to_be32(1); > > > > So flfirst moves from 0 to 1. > > > >> - agf->agf_fllast = cpu_to_be32(XFS_AGFL_SIZE(mp) - 1); > >> + agf->agf_fllast = 0; > > > > And last from size - 1 to 0. In my naive reading this introduces > > wrapping and doesn't remove it. What do I miss? > > I'm confused by this too. I think this fixes it because regardless > of XFS_AGFL_SIZE under any kernel, when we follow the circular list > we'll wrap around at the "right" limit, if we start out wrapped > as above, rather than potentially filling in a number for last which > doesn't match the running code? > > Anyway, it does fix the testcase of "mkfs with > old xfsprogs; grow under new kernel; repair with old progs" which > used to complain about i.e. "fllast 118 in agf 94 too large (max = 118)" > A growfs under a new kernel, and a mount under an old kernel > showed the same problems; this should fix that as well. > > We seem to have a few problems introduced > by the AGFL header packing; we have checks (in xfs_agf_verify(), for example, > and xfs_repair's verify_set_agf()) which depend on the size of this structure. > If the size moves in the "wrong" way the checks fire off as corruption. We could also pad struct xfs_agfl so that the size is always 40 bytes, like it used to be on 64-bit; then always write NULLAGBLOCK to the slot at the end of the sector, which should be past XFS_AGFL_SIZE(). This means 32-bit will be broken if you run a new xfsprogs with an old kernel, but all the complaints from the (hopefully larger?) numbers of 64-bit xfs users will go away. (OFC now there's all the people who already pulled in the first agfl fix...) Hurghahgrhrghmfh. Messy. --D > > It seems to me that now, mismatches between userspace/kernelspace versions > will cause these size checks to fail; that seems much more common (and worse) > than the original problem of migrating a filesystem between 32 and 64 bit > machines. > > I'm trying to convince myself that we don't have a lot more of these lurking > with all the combinations of old/new kernels & old/new userspace, or filesystems > migrated between old/new kernels, etc. This patch is ok for initialization but > isn't it still quite possible to end up with an fllast set at runtime > which is outside the valid range for older userspace or kernel code? > > -Eric > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Tue Apr 19 17:32:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2F38E7CA0 for ; Tue, 19 Apr 2016 17:32:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id F363A304032 for ; Tue, 19 Apr 2016 15:32:18 -0700 (PDT) X-ASG-Debug-ID: 1461105134-04cbb02e1d4227c0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id fwAGeezR9lYYIPUE for ; Tue, 19 Apr 2016 15:32:16 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2A3CQBhsRZXPLGFLHlegziBUIJzg3medwEBBowThWmEDoYIAgIBAQKBS00BAQEBAQEHAQEBAUJAhEEBAQEEJxMcIxAIAw4HAwklDwUlAwcaE4govW4BAQEBBgIBHRmFQIUTh2qCKwWYDo4IjxqPK4RcKjCJEwEBAQ Received: from ppp121-44-133-177.lns20.syd7.internode.on.net (HELO dastard) ([121.44.133.177]) by ipmail06.adl6.internode.on.net with ESMTP; 20 Apr 2016 08:01:00 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aseAc-0001wG-G6; Wed, 20 Apr 2016 08:30:58 +1000 Date: Wed, 20 Apr 2016 08:30:58 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfs: Don't wrap growfs AGFL indexes Message-ID: <20160419223058.GC18517@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: Don't wrap growfs AGFL indexes References: <1459836310-12619-1-git-send-email-david@fromorbit.com> <1459836310-12619-2-git-send-email-david@fromorbit.com> <20160407235043.GB1439@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160407235043.GB1439@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: 1461105135 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28885 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Apr 07, 2016 at 04:50:43PM -0700, Christoph Hellwig wrote: > On Tue, Apr 05, 2016 at 04:05:07PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > Commit 96f859d ("libxfs: pack the agfl header structure so > > XFS_AGFL_SIZE is correct") allowed the freelist to use the empty > > slot at the end of the freelist on 64 bit systems that was not > > being used due to sizeof() rounding up the structure size. > > > > This has caused versions of xfs_repair prior to 4.5.0 (which also > > has the fix) to report this as a corruption once the filesystem has > > been grown. Older kernels can also have problems (seen from a whacky > > container/vm management environment) mounting filesystems grown on a > > system with a newer kernel than the vm/container it is deployed on. > > > > To avoid this problem, change the initial free list indexes not to > > wrap across the end of the AGFL, hence avoiding the initialisation > > of agf_fllast to the last index in the AGFL. > > I have to admit that it's been a while that I looked at the AGFL > code, but I simply don't understand what's happening in this patch. > Diff slightly reorder: > > > - agf->agf_flfirst = 0; > > + agf->agf_flfirst = cpu_to_be32(1); > > So flfirst moves from 0 to 1. > > > - agf->agf_fllast = cpu_to_be32(XFS_AGFL_SIZE(mp) - 1); > > + agf->agf_fllast = 0; > > And last from size - 1 to 0. In my naive reading this introduces > wrapping and doesn't remove it. What do I miss? Nothing, my mistake. In doing a driveby fix, I mistook the list to be ordered like: fllast | +--------oooooo--------+ | flfirst When in fact the active entries are the other way around: flfirst | +--------oooooo--------+ | fllast IOWs, I got confused by the fact the list grows from the "last" pointer and shrinks at the "first" pointer. i.e the "last" index is always ahead of the "first" index, which is directly contradictory to their names. These are head and tail indexes, not first and last. tail | +--------oooooo--------+ | head Get from tail, put to head. I think we need to rework this whole agfl size fix (as djwong mentioned after we discussed it on IRC) so this needs reworking, anyway. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@m2507.chinafivestar.net Tue Apr 19 21:33:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_FONT_FACE_BAD, HTML_MESSAGE,MIME_HTML_ONLY,SPOOFED_URL_HOST 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 A945B7CA0 for ; Tue, 19 Apr 2016 21:33:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 48F208F8035 for ; Tue, 19 Apr 2016 19:33:47 -0700 (PDT) X-ASG-Debug-ID: 1461119624-04bdf011036edc80001-NocioJ Received: from mail163-133.dm.aliyun.com (mail163-133.dm.aliyun.com [42.120.163.133]) by cuda.sgi.com with ESMTP id 82WAIxtYdDQWedgB for ; Tue, 19 Apr 2016 19:33:44 -0700 (PDT) X-Barracuda-Envelope-From: david@m2507.chinafivestar.net X-Barracuda-Apparent-Source-IP: 42.120.163.133 X-EnvId:71140011743 Received: from JIANSHE-PC(219.148.52.6) by smtpdm.aliyun.com(127.0.0.1); Wed, 20 Apr 2016 10:33:31 +0800 From: "david@chinafivestar.net" Subject: RE: Galvanized wire factory Price To: xfs@oss.sgi.com X-ASG-Orig-Subj: RE: Galvanized wire factory Price MIME-Version: 1.0 Sender: david@m2507.chinafivestar.net Reply-To: david@chinafivestar.net Date: Wed, 20 Apr 2016 10:33:31 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: mail163-133.dm.aliyun.com[42.120.163.133] X-Barracuda-Start-Time: 1461119624 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.95 X-Barracuda-Spam-Status: No, SCORE=0.95 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA038b, HTML_FONT_FACE_BAD, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28889 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.61 HTML_FONT_FACE_BAD BODY: HTML font face is not a word 0.20 BSF_SC0_SA038b Custom Rule SA038b Message-Id: <20160420023346.F4014A420A4@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVU Ri04IiBodHRwLWVxdWl2PWNvbnRlbnQtdHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCAxMS4wMC45NjAwLjE4MjgzIj48L0hFQUQ+DQo8Qk9EWT4NCjxESVYgDQpzdHls ZT0iV0hJVEUtU1BBQ0U6IG5vcm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IFRFWFQtVFJBTlNGT1JN OiBub25lOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVDogMTBwdCBWZXJkYW5hOyBXSURPV1M6IDE7 IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1 NSk7IFRFWFQtSU5ERU5UOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+RGVh ciANCk1hbmFnZXI8U1BBTiBjbGFzcz1BcHBsZS1jb252ZXJ0ZWQtc3BhY2U+Jm5ic3A7PC9TUEFO PjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1GQU1JTFk6IFZlcmRhbmEiPjxGT05UIHN0 eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpIiANCnNpemU9MSBmYWNl PSIiPiw8L0ZPTlQ+PC9TUEFOPjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1GQU1JTFk6 IFZlcmRhbmEiPjw/eG1sOm5hbWVzcGFjZSBwcmVmaXggPSAibyIgLz48bzpwPjxGT05UIA0Kc3R5 bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IENhbGlicmkiIHNpemU9MSANCmZhY2U9 IiI+Jm5ic3A7PC9GT05UPjwvbzpwPjwvU1BBTj48L0RJVj4NCjxESVYgDQpzdHlsZT0iV0hJVEUt U1BBQ0U6IG5vcm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBD T0xPUjogcmdiKDAsMCwwKTsgRk9OVDogMTRweCAmIzM5O2x1Y2lkYSBHcmFuZGUmIzM5OywgVmVy ZGFuYTsgV0lET1dTOiAxOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBCQUNLR1JPVU5ELUNPTE9S OiByZ2IoMjU1LDI1NSwyNTUpOyBURVhULUlOREVOVDogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tl LXdpZHRoOiAwcHgiPg0KPERJVj4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJGT05ULVNJ WkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBNQVJHSU46IDBjbSAwY20gMHB0Ij48U1BB TiANCmxhbmc9RU4tVVMgc3R5bGU9IkZPTlQtRkFNSUxZOiBWZXJkYW5hIj48bzpwPjxGT05UIA0K c3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IENhbGlicmkiIHNpemU9MSANCmZh Y2U9IiI+PC9GT05UPjwvbzpwPjwvU1BBTj4mbmJzcDs8L1A+PFNQQU4gbGFuZz1FTi1VUyANCnN0 eWxlPSJGT05ULUZBTUlMWTogVmVyZGFuYSI+PEZPTlQgc2l6ZT0zPjxTUEFOIA0Kc3R5bGU9IkZP TlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IENhbGlicmk7IEZPTlQtV0VJR0hUOiBub3JtYWwi Pg0KPFAgY2xhc3M9cDAgc3R5bGU9Ik1BUkdJTi1CT1RUT006IDBwdDsgTUFSR0lOLVRPUDogMHB0 Ij48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpIj5H bGFkIHRvIGtub3cgeW91IGFyZSBpbiB0aGUgbWFya2V0IA0Kb2Y8U1BBTiBjbGFzcz1BcHBsZS1j b252ZXJ0ZWQtc3BhY2U+Jm5ic3A7PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkNPTE9SOiByZ2IoMCww LDI1NSkiPldpcmUsIEdhbHZhbml6ZWQgV2lyZSwgQmxhY2sgV2lyZSwgV2lyZSBNZXNoIA0KUHJv dWRjdHMuPC9TUEFOPjwvU1BBTj48L1A+DQo8UCBjbGFzcz1wMCBzdHlsZT0iTUFSR0lOLUJPVFRP TTogMHB0OyBNQVJHSU4tVE9QOiAwcHQiPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTJwdDsg Rk9OVC1GQU1JTFk6IENhbGlicmkiPjwvU1BBTj4mbmJzcDs8L1A+DQo8UCBjbGFzcz1wMCBzdHls ZT0iTUFSR0lOLUJPVFRPTTogMHB0OyBNQVJHSU4tVE9QOiAwcHQiPjxTUEFOIA0Kc3R5bGU9IkZP TlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IENhbGlicmkiPldlIGFyZTxTUEFOIA0KY2xhc3M9 QXBwbGUtY29udmVydGVkLXNwYWNlPiZuYnNwOzwvU1BBTj48U1BBTiANCnN0eWxlPSJDT0xPUjog cmdiKDAsMCwyNTUpIj5kaXJlY3QgZmFjdG9yeTxTUEFOIA0KY2xhc3M9QXBwbGUtY29udmVydGVk LXNwYWNlPiZuYnNwOzwvU1BBTj48L1NQQU4+bG9jYXRlZCBpbiBBbnBpbmcsQ2hpbmEsIGNvdWxk IA0Kb2ZmZXIgeW91PFNQQU4gc3R5bGU9IkNPTE9SOiByZ2IoMCwwLDI1NSkiPjxTUEFOIA0KY2xh c3M9QXBwbGUtY29udmVydGVkLXNwYWNlPiZuYnNwOzwvU1BBTj5iZXR0ZXIgcHJpY2UgYW5kIA0K c2VydmljZTwvU1BBTj48L1NQQU4+PC9QPg0KPFAgY2xhc3M9cDAgc3R5bGU9Ik1BUkdJTi1CT1RU T006IDBwdDsgTUFSR0lOLVRPUDogMHB0Ij48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDEycHQ7 IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBDT0xPUjogcmdiKDAsMCwyNTUpIj50aGFuIHRoZSANCnRy YWRlcnMuPC9TUEFOPjwvUD4NCjxQIGNsYXNzPXAwIHN0eWxlPSJNQVJHSU4tQk9UVE9NOiAwcHQ7 IE1BUkdJTi1UT1A6IDBwdCI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZB TUlMWTogQ2FsaWJyaSI+PC9TUEFOPiZuYnNwOzwvUD4NCjxQIGNsYXNzPXAwIHN0eWxlPSJNQVJH SU4tQk9UVE9NOiAwcHQ7IE1BUkdJTi1UT1A6IDBwdCI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpF OiAxMnB0OyBGT05ULUZBTUlMWTogQ2FsaWJyaSI+Q29udGFjdCBtZSBpZiB5b3UgbmVlZCBvdXIg DQpwcmljZS48L1NQQU4+PC9QPg0KPFAgY2xhc3M9cDAgc3R5bGU9Ik1BUkdJTi1CT1RUT006IDBw dDsgTUFSR0lOLVRPUDogMHB0Ij48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQt RkFNSUxZOiBDYWxpYnJpIj48L1NQQU4+Jm5ic3A7PC9QPg0KPFAgY2xhc3M9cDAgc3R5bGU9Ik1B UkdJTi1CT1RUT006IDBwdDsgTUFSR0lOLVRPUDogMHB0Ij48U1BBTiANCnN0eWxlPSJGT05ULVNJ WkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpIj5XYWl0aW5nIGZvciB5b3VyIA0KcmVwbHku PC9TUEFOPjwvU1BBTj48L0ZPTlQ+PC9QPg0KPFA+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIHN0 eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0Ij48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQt RkFNSUxZOiBWZXJkYW5hIj48Rk9OVCBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0IiBzaXplPTE+PC9G T05UPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBDYWxpYnJpIj48U1BBTiBzdHlsZT0iRk9O VC1TSVpFOiAxMXB0Ij48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDEycHQiPkJlc3QgDQpSZWdh cmRzPC9TUEFOPjwvU1BBTj48L1NQQU4+PC9TUEFOPjxTUEFOPjwvU1BBTj48U1BBTj48L1NQQU4+ PEZPTlQgDQpzaXplPSswPjwvRk9OVD48U1BBTj48L1NQQU4+PC9QPjxTUEFOPjwvU1BBTj48U1BB Tj48L1NQQU4+PFNQQU4+PC9TUEFOPjxGT05UIA0Kc2l6ZT0rMD48L0ZPTlQ+PFNQQU4+PC9TUEFO PjxTUEFOPjwvU1BBTj48U1BBTj48L1NQQU4+PFNQQU4+PC9TUEFOPjxTUEFOPjwvU1BBTj4NCjxQ IGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdCI+PFNQQU4+PC9TUEFO PjxTUEFOPjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjogMGNt IDBjbSAwcHQiPjxGT05UIA0Kc2l6ZT0rMD48L0ZPTlQ+PFNQQU4+PC9TUEFOPjwvUD4NCjxQIGNs YXNzPU1zb05vcm1hbCANCnN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0Ij48U1BBTj48L1NQQU4+ PFNQQU4+PC9TUEFOPjxTUEFOPjwvU1BBTj48U1BBTj48L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNv Tm9ybWFsIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0Ij48U1BBTj48L1NQQU4+PFNQQU4+PC9T UEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdCI+ PEZPTlQgDQpzaXplPSswPjwvRk9OVD48U1BBTj48L1NQQU4+PC9QPg0KPEhSIHN0eWxlPSJIRUlH SFQ6IDFweDsgV0lEVEg6IDIxMHB4IiBhbGlnbj1sZWZ0IGNvbG9yPSNiNWM0ZGYgU0laRT0xPg0K DQo8UD48L1A+DQo8UD48L1A+DQo8UD48L1A+PC9TUEFOPjwvRElWPjwvRElWPg0KPERJViANCnN0 eWxlPSJXSElURS1TUEFDRTogbm9ybWFsOyBXT1JELVNQQUNJTkc6IDBweDsgVEVYVC1UUkFOU0ZP Uk06IG5vbmU7IENPTE9SOiByZ2IoMCwwLDApOyBGT05UOiAxMnB0IENhbGlicmk7IFdJRE9XUzog MTsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI1NSwyNTUs MjU1KTsgVEVYVC1JTkRFTlQ6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij48 U1BBTj4NCjxESVY+PC9ESVY+DQo8RElWPjwvRElWPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5 bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQiPjxTUEFOPjwvU1BBTj48U1BBTj48L1NQQU4+PFNQQU4+ PC9TUEFOPjxTUEFOPjwvU1BBTj48U1BBTj48L1NQQU4+PFNQQU4+PC9TUEFOPjxTUEFOPjwvU1BB Tj48U1BBTj48L1NQQU4+PFNQQU4+PC9TUEFOPjxTUEFOPjwvU1BBTj48U1BBTj48L1NQQU4+PFNQ QU4+PC9TUEFOPjxTUEFOPjwvU1BBTj48U1BBTj48L1NQQU4+PFNQQU4gDQpsYW5nPUVOLVVTIHN0 eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBWZXJkYW5hIj48U1BBTiANCnN0eWxl PSJGT05ULVNJWkU6IDExcHQiPjwvU1BBTj48L1NQQU4+PC9QPg0KPFRBQkxFIGNsYXNzPW1jZUl0 ZW1UYWJsZSANCnN0eWxlPSJURVhULURFQ09SQVRJT046IG5vbmU7IFdJRFRIOiBhdXRvOyBXSElU RS1TUEFDRTogbm9ybWFsOyBXT1JELVNQQUNJTkc6IDBweDsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7 IENPTE9SOiByZ2IoMCwwLDApOyBGT05UOiAxMXB4IHZlcmRhbmEsIGdlbmV2YSwgc2Fucy1zZXJp ZjsgV0lET1dTOiAxOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBCQUNLR1JPVU5ELUNPTE9SOiBy Z2IoMjU1LDI1NSwyNTUpOyBURVhULUlOREVOVDogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdp ZHRoOiAwcHg7IGZvbnQtc3RyZXRjaDogbm9ybWFsIiANCmNlbGxTcGFjaW5nPTAgY2VsbFBhZGRp bmc9MyANCmRhdGEtbWNlLXN0eWxlPSJ3aWR0aDogYXV0bzsgZm9udC1mYW1pbHk6IHZlcmRhbmEg LCBnZW5ldmEgLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDExLjBweDsgdGV4dC1kZWNvcmF0aW9u OiBub25lOyI+DQogIDxUQk9EWT48L1RCT0RZPjwvVEFCTEU+PFNQQU4gc3R5bGU9IkZPTlQtU0la RTogMThweCIgDQpkYXRhLW1jZS1zdHlsZT0iZm9udC1zaXplOiAxOC4wcHg7Ij4NCjxESVY+PFNQ QU4gc3R5bGU9IkZPTlQtRkFNSUxZOiBDYWxpYnJpIj48U1BBTiBzdHlsZT0iRk9OVC1TSVpFOiAx OHB4IiANCmRhdGEtbWNlLXN0eWxlPSJmb250LXNpemU6IDE4LjBweDsiPjxTUEFOIHN0eWxlPSJG T05ULUZBTUlMWTogQ2FsaWJyaSI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMXB0OyBGT05U LVdFSUdIVDogbm9ybWFsOyBGT05ULVNUWUxFOiBub3JtYWwiPkRhdmlkJm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7PC9TUEFOPjwvU1BBTj48L1NQQU4+PC9TUEFOPjwvRElWPg0KPERJVj48U1BBTiBz dHlsZT0iRk9OVC1GQU1JTFk6IENhbGlicmkiPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDE4cHgi IA0KZGF0YS1tY2Utc3R5bGU9ImZvbnQtc2l6ZTogMTguMHB4OyI+PFNQQU4gc3R5bGU9IkZPTlQt RkFNSUxZOiBDYWxpYnJpIj48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDExcHQ7IEZPTlQtV0VJ R0hUOiBub3JtYWw7IEZPTlQtU1RZTEU6IG5vcm1hbCI+PC9TUEFOPjwvU1BBTj48L1NQQU4+PC9T UEFOPiZuYnNwOzwvRElWPg0KPERJVj48U1BBTiBzdHlsZT0iRk9OVC1GQU1JTFk6IENhbGlicmki PjwvU1BBTj48U1BBTiBzdHlsZT0iRk9OVC1TSVpFOiAxOHB4IiANCmRhdGEtbWNlLXN0eWxlPSJm b250LXNpemU6IDE4LjBweDsiPjwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQ2Fs aWJyaSI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMXB0OyBGT05ULVdFSUdIVDogbm9ybWFs OyBGT05ULVNUWUxFOiBub3JtYWwiPjxJTUcgDQpzdHlsZT0iQk9SREVSLVRPUDogbWVkaXVtIG5v bmU7IEhFSUdIVDogMzRweDsgQk9SREVSLVJJR0hUOiBtZWRpdW0gbm9uZTsgV0lEVEg6IDE4OXB4 OyBWRVJUSUNBTC1BTElHTjogbWlkZGxlOyBCT1JERVItQk9UVE9NOiBtZWRpdW0gbm9uZTsgQk9S REVSLUxFRlQ6IG1lZGl1bSBub25lIiANCnNyYz0iY2lkOmltZzAuanBnIiB3aWR0aD0zNjQgaGVp Z2h0PTc2PjwvU1BBTj48L1NQQU4+PC9ESVY+PC9TUEFOPjwvU1BBTj48U1RST05HPjxFTT48Rk9O VCANCnNpemU9NT48Rk9OVCBmYWNlPUFyaWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTFw dDsgQk9SREVSLVRPUDogMHB4OyBGT05ULUZBTUlMWTogQ2FsaWJyaTsgQk9SREVSLVJJR0hUOiAw cHg7IEJPUkRFUi1CT1RUT006IDBweDsgQ09MT1I6IHJnYigwLDAsMTI4KTsgT1VUTElORS1XSURU SDogMHB4OyBQQURESU5HLUJPVFRPTTogMHB4OyBQQURESU5HLVRPUDogMHB4OyBPVVRMSU5FLVNU WUxFOiBub25lOyBQQURESU5HLUxFRlQ6IDBweDsgTUFSR0lOOiAwcHg7IEJPUkRFUi1MRUZUOiAw cHg7IE9VVExJTkUtQ09MT1I6IGludmVydDsgTElORS1IRUlHSFQ6IDEuNTsgUEFERElORy1SSUdI VDogMHB4Ij5GSVZFIA0KU1Q8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMXB0OyBC T1JERVItVE9QOiAwcHg7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBCT1JERVItUklHSFQ6IDBweDsg Qk9SREVSLUJPVFRPTTogMHB4OyBDT0xPUjogcmdiKDI1NSwwLDApOyBPVVRMSU5FLVdJRFRIOiAw cHg7IFBBRERJTkctQk9UVE9NOiAwcHg7IFBBRERJTkctVE9QOiAwcHg7IE9VVExJTkUtU1RZTEU6 IG5vbmU7IFBBRERJTkctTEVGVDogMHB4OyBNQVJHSU46IDBweDsgQk9SREVSLUxFRlQ6IDBweDsg T1VUTElORS1DT0xPUjogaW52ZXJ0OyBMSU5FLUhFSUdIVDogMS41OyBQQURESU5HLVJJR0hUOiAw cHgiPkE8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMXB0OyBCT1JERVItVE9QOiAw cHg7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBCT1JERVItUklHSFQ6IDBweDsgQk9SREVSLUJPVFRP TTogMHB4OyBDT0xPUjogcmdiKDAsMCwxMjgpOyBPVVRMSU5FLVdJRFRIOiAwcHg7IFBBRERJTkct Qk9UVE9NOiAwcHg7IFBBRERJTkctVE9QOiAwcHg7IE9VVExJTkUtU1RZTEU6IG5vbmU7IFBBRERJ TkctTEVGVDogMHB4OyBNQVJHSU46IDBweDsgQk9SREVSLUxFRlQ6IDBweDsgT1VUTElORS1DT0xP UjogaW52ZXJ0OyBMSU5FLUhFSUdIVDogMS41OyBQQURESU5HLVJJR0hUOiAwcHgiPlIgDQpHUk9V UCAvPFNQQU4gY2xhc3M9QXBwbGUtY29udmVydGVkLXNwYWNlIA0Kc3R5bGU9IkZPTlQtU0laRTog MTFwdDsgRk9OVC1GQU1JTFk6IENhbGlicmkiPiZuYnNwOzwvU1BBTj48L1NQQU4+PC9GT05UPjwv Rk9OVD48L0VNPjwvU1RST05HPjxBIA0Kc3R5bGU9IkZPTlQtU0laRTogMTFwdDsgVEVYVC1ERUNP UkFUSU9OOiBub25lOyBGT05ULUZBTUlMWTogQ2FsaWJyaTsgQ09MT1I6IHJnYig0MCw1Myw3NSk7 IE9VVExJTkUtV0lEVEg6IG1lZGl1bTsgT1VUTElORS1TVFlMRTogbm9uZTsgT1VUTElORS1DT0xP UjogaW52ZXJ0IiANCmhyZWY9Imh0dHA6Ly9mc3dpcmVtZXNoLmVuLmFsaWJhYmEuY29tLyIgdGFy Z2V0PV9ibGFuayANCmRhdGEtbWNlLXN0eWxlPSJ0ZXh0LWRlY29yYXRpb246IG5vbmU7IiANCmRh dGEtbWNlLWhyZWY9Imh0dHA6Ly9mc3dpcmVtZXNoLmVuLmFsaWJhYmEuY29tLyI+QW5waW5nIEZp dmUgU3RhciBXaXJlIE1lc2ggDQpDby4sIEx0ZC48L0E+PFNQQU4gY2xhc3M9QXBwbGUtY29udmVy dGVkLXNwYWNlPiZuYnNwOzwvU1BBTj48Rk9OVCBzaXplPTI+IA0KPERJViANCnN0eWxlPSJGT05U LVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpIj5NOis4Ni0xNTkzMzk2MzgyMDxTVFJP Tkc+PEVNPjxGT05UIA0Kc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IENhbGli cmkiIHNpemU9MSANCmZhY2U9IiI+KHdoYXRzYXBwKTwvRk9OVD48L0VNPjwvU1RST05HPjxTUEFO IGNsYXNzPUFwcGxlLWNvbnZlcnRlZC1zcGFjZSANCnN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZP TlQtRkFNSUxZOiBDYWxpYnJpIj4mbmJzcDs8L1NQQU4+RjorODYtMzExLTg5MTgwNDMyPC9ESVY+ PC9GT05UPiZuYnNwO0U6PFNQQU4gDQpjbGFzcz1BcHBsZS1jb252ZXJ0ZWQtc3BhY2UgDQpzdHls ZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTogQ2FsaWJyaSI+Jm5ic3A7PEEgDQpocmVm PSJtYWlsdG86ZGF2aWRAY2hpbmFmaXZlc3Rhci5uZXQiPmRhdmlkQGNoaW5hZml2ZXN0YXIubmV0 PC9BPiA8L1NQQU4+Jm5ic3A7IA0KPERJViBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZB TUlMWTogQ2FsaWJyaTsgQ09MT1I6IHJnYigwLDAsMCkiPlc6PFNQQU4gDQpjbGFzcz1BcHBsZS1j b252ZXJ0ZWQtc3BhY2UgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTogQ2Fs aWJyaTsgQ09MT1I6IHJnYigwLDAsMCkiPiZuYnNwOzwvU1BBTj48QSANCnN0eWxlPSJURVhULURF Q09SQVRJT046IHVuZGVybGluZTsgQ09MT1I6IHJnYig0MCw1Myw3NSk7IE9VVExJTkUtV0lEVEg6 IG1lZGl1bTsgT1VUTElORS1TVFlMRTogbm9uZTsgT1VUTElORS1DT0xPUjogaW52ZXJ0IiANCmhy ZWY9Imh0dHA6Ly93d3cuY2hpbmFmaXZlc3Rhci5uZXQvI2RhdmlkIiB0YXJnZXQ9X2JsYW5rIA0K ZGF0YS1tY2UtaHJlZj0iaHR0cDovL3d3dy5jaGluYWZpdmVzdGFyLm5ldC8jZGF2aWQiPjxTUEFO IA0Kc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IENhbGlicmk7IENPTE9SOiBy Z2IoMCwwLDApIiANCmRhdGEtbWNlLXN0eWxlPSJmb250LXNpemU6IDExcHQ7Ij5odHRwOi8vd3d3 LmNoaW5hZml2ZXN0YXIubmV0LyNkYXZpZDwvU1BBTj48L0E+PC9ESVY+DQo8RElWPjxTUEFOPjxT UEFOIHN0eWxlPSJDT0xPUjogcmdiKDAsMCwwKSI+PFNQQU4gc3R5bGU9IkZPTlQtU0laRTogMTBw dCI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTogQ2FsaWJyaSI+ Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOzxTUEFOIA0KY2xhc3M9QXBwbGUtY29udmVydGVkLXNw YWNlPiZuYnNwOzwvU1BBTj48QSANCnN0eWxlPSJURVhULURFQ09SQVRJT046IHVuZGVybGluZTsg Q09MT1I6IHJnYig0MCw1Myw3NSk7IE9VVExJTkUtV0lEVEg6IG1lZGl1bTsgT1VUTElORS1TVFlM RTogbm9uZTsgT1VUTElORS1DT0xPUjogaW52ZXJ0IiANCmhyZWY9Imh0dHA6Ly9jaGluYXdlbGRl ZG1lc2gubmV0LyNkYXZpZCIgdGFyZ2V0PV9ibGFuaz48L0E+PFNQQU4+PFNQQU4gDQpzdHlsZT0i Q09MT1I6IHJnYigwLDAsMCkiPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQiPjxTUEFOIA0K c3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IENhbGlicmkiPjxGT05UIA0Kc3R5 bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZBTUlMWTogQ2FsaWJyaSIgY29sb3I9IzAwNjZj YyBzaXplPTEgZmFjZT0iIj48QSANCnN0eWxlPSJURVhULURFQ09SQVRJT046IHVuZGVybGluZTsg Q09MT1I6IHJnYig0MCw1Myw3NSk7IE9VVExJTkUtV0lEVEg6IG1lZGl1bTsgT1VUTElORS1TVFlM RTogbm9uZTsgT1VUTElORS1DT0xPUjogaW52ZXJ0IiANCmhyZWY9Imh0dHA6Ly9jaGluYXdlbGRl ZG1lc2gubmV0LyNkYXZpZCIgDQp0YXJnZXQ9X2JsYW5rPmh0dHA6Ly9jaGluYTxXQlI+d2VsZGVk bWVzaC5uPFdCUj5ldC8jZGF2aWQ8L0E+PC9GT05UPjwvU1BBTj48L1NQQU4+PC9TUEFOPjwvU1BB Tj48L1NQQU4+PC9TUEFOPjwvU1BBTj48L1NQQU4+PEEgDQpzdHlsZT0iVEVYVC1ERUNPUkFUSU9O OiB1bmRlcmxpbmU7IENPTE9SOiByZ2IoNDAsNTMsNzUpOyBPVVRMSU5FLVdJRFRIOiBtZWRpdW07 IE9VVExJTkUtU1RZTEU6IG5vbmU7IE9VVExJTkUtQ09MT1I6IGludmVydCI+PC9BPjwvRElWPiZu YnNwOyZuYnNwOyZuYnNwOzxTUEFOIA0KY2xhc3M9QXBwbGUtY29udmVydGVkLXNwYWNlPiZuYnNw OzwvU1BBTj48QSANCnN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IFRFWFQtREVDT1JBVElPTjogbm9u ZTsgRk9OVC1GQU1JTFk6IENhbGlicmk7IENPTE9SOiByZ2IoNDAsNTMsNzUpOyBPVVRMSU5FLVdJ RFRIOiBtZWRpdW07IE9VVExJTkUtU1RZTEU6IG5vbmU7IE9VVExJTkUtQ09MT1I6IGludmVydCIg DQpocmVmPSJodHRwOi8vZnN3aXJlbWVzaC5lbi5hbGliYWJhLmNvbS8iIHRhcmdldD1fYmxhbmsg DQpkYXRhLW1jZS1zdHlsZT0idGV4dC1kZWNvcmF0aW9uOiBub25lOyIgDQpkYXRhLW1jZS1ocmVm PSJodHRwOi8vZnN3aXJlbWVzaC5lbi5hbGliYWJhLmNvbS8iPlByb2R1Y3RzIFNob3dyb29tIG9u IA0KQWxpYmFiYS5jb208L0E+PC9ESVY+DQo8UD48QSBocmVmPSJtYWlsdG86I1Vuc3Vic2NyaWJl TWFpbCMiPklmIHlvdSB3aXNoIHRvIHVuc3Vic2NyaWJlIHRvIHRoaXMgYW5kIGFsbCANCmZ1dHVy ZSBlbWFpbHMgLHBsZWFzZSBjbGljayBoZXJlPC9BPiA8L1A+PC9CT0RZPjwvSFRNTD4NCg0K From hugo@swiftstack.com Wed Apr 20 00:50:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 2D6587CA0 for ; Wed, 20 Apr 2016 00:50:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 885A9AC001 for ; Tue, 19 Apr 2016 22:50:14 -0700 (PDT) X-ASG-Debug-ID: 1461131409-04cb6c24647465d0001-NocioJ Received: from mail-io0-f171.google.com (mail-io0-f171.google.com [209.85.223.171]) by cuda.sgi.com with ESMTP id ytu3rXL9AfFv3lF2 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 19 Apr 2016 22:50:09 -0700 (PDT) X-Barracuda-Envelope-From: hugo@swiftstack.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.171 Received: by mail-io0-f171.google.com with SMTP id 2so42057212ioy.1 for ; Tue, 19 Apr 2016 22:50:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=swiftstack-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=BBEcnAjuKhYP1fRDbGn5FMCtX2BFiMIBJPAgz1Vovp4=; b=0ECPtK7bEl3CsyZC8w1CppkmUbcw7MJwp7Yg1/4Zj/WkcZRMhBn6M7BlQPgFzhammp kV2FhAmeXUc6QAMamCplJDRhMLIJT6nd23c3caoZUPEjStYVUn8OWn9FJbG704Db3GUl vAML3hdi/tGrodhVDG8TnYDP1sJnOioJubzBQi1kOsfEU2+7eHrwafqyr8CAAXUibBe8 Us2tQCjjSPp907p7LkX4XmMDPamJD44QYa7w0cOJ/HUaQ1zzyz8VrbnGXaKEEPZrHlhZ RKzPHehYUtcA2I7E4e80bSjjT890bqOLXI1ReLY9mcXVBJp/AiAaW/FUNouVhn9WWrNf +XZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=BBEcnAjuKhYP1fRDbGn5FMCtX2BFiMIBJPAgz1Vovp4=; b=A4IRFLIp+eO3bBhTLm+rpOIc0q7FTyU4x6EqUyEJRAxT38lGkOdgb096u9rYqycqCm Xk5F4UrjSTdBB2TzF08Aqjqhej0iAyjJs2QbB2xFd5eNx5w+tfAELLX61rkTzZjyD9zp oUv1g8rD/yuu090182DMmla6+1gGG8br+K2uwmiWPX12iTtF7Bocu61UzXSWBM3HBFiU +YMHNrhe6HFr1IpGwhnqwb9x0W9xzYbRUw+kIp/WHnh95pudG5Pg23yX0g2xALT0D5ur 3PQKNOjR1+rFHyqfBETHiRIG/LKnFj31oYd2/eiy6mkFy1Jr4hqsHA8JQ0Y1jrzR9TAj MwLA== X-Gm-Message-State: AOPr4FWs2DyO+FiWwnICORt0c143vBy9J2erOE46XEvcf5YpCHl1XCJDfr1fWeeru5EDaJNlJjP2BMEwIfM+RPA8 X-Received: by 10.107.166.72 with SMTP id p69mr8095963ioe.100.1461131409058; Tue, 19 Apr 2016 22:50:09 -0700 (PDT) MIME-Version: 1.0 Received: by 10.107.47.99 with HTTP; Tue, 19 Apr 2016 22:49:49 -0700 (PDT) In-Reply-To: <20160419193435.GA2667@laptop.bfoster> References: <20160419113038.GA2649@laptop.bfoster> <20160419193435.GA2667@laptop.bfoster> From: Hugo Kuo Date: Wed, 20 Apr 2016 13:49:49 +0800 Message-ID: Subject: Re: [XFS] Any process to a particular XFS device hung in D state forever. To: Brian Foster X-ASG-Orig-Subj: Re: [XFS] Any process to a particular XFS device hung in D state forever. Cc: xfs@oss.sgi.com, Darrell Bishop Content-Type: multipart/alternative; boundary=001a1141f3e09b81470530e42a03 X-Barracuda-Connect: mail-io0-f171.google.com[209.85.223.171] X-Barracuda-Start-Time: 1461131409 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28893 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --001a1141f3e09b81470530e42a03 Content-Type: text/plain; charset=UTF-8 Hi XFS team, Here's the lsof output of the grouped result of any openfile happens on problematic disks. The full log of xfs_repair -n is included in this gist as well. The xfs_repair recommend to contact xfs mailing list in the end of the command. https://gist.github.com/HugoKuo/95613d7864aa0a1343615642b3309451 Perhaps I should go ahead to reboot the machine and run the xfs_repair again. Please find my answers inlines. On Wed, Apr 20, 2016 at 3:34 AM, Brian Foster wrote: > > So there's definitely some traces waiting on AGF locks and whatnot, but > also many traces that appear to be waiting on I/O. For example: > Yes, those I/O waiting is the original problem of this thread. It looks like the disk was locked. All these I/O waiting for same disk (a multipath entry). > > kernel: swift-object- D 0000000000000008 0 2096 1605 0x00000000 > kernel: ffff8877cc2378b8 0000000000000082 ffff8877cc237818 ffff887ff016eb68 > kernel: ffff883fd4ab6b28 0000000000000046 ffff883fd4bd9400 00000001e7ea49d0 > kernel: ffff8877cc237848 ffffffff812735d1 ffff885fa2e4a5f8 ffff8877cc237fd8 > kernel: Call Trace: > kernel: [] ? __blk_run_queue+0x31/0x40 > kernel: [] schedule_timeout+0x215/0x2e0 > kernel: [] ? blk_peek_request+0x189/0x210 > kernel: [] ? elv_queue_empty+0x33/0x40 > kernel: [] ? dm_request_fn+0x240/0x340 [dm_mod] > kernel: [] wait_for_common+0x123/0x180 > kernel: [] ? default_wake_function+0x0/0x20 > kernel: [] ? dm_unplug_all+0x36/0x50 [dm_mod] > kernel: [] ? _xfs_buf_read+0x46/0x60 [xfs] > kernel: [] ? xfs_trans_read_buf+0x197/0x410 [xfs] > kernel: [] wait_for_completion+0x1d/0x20 > kernel: [] xfs_buf_iowait+0x9b/0x100 [xfs] > kernel: [] ? xfs_trans_read_buf+0x197/0x410 [xfs] > kernel: [] _xfs_buf_read+0x46/0x60 [xfs] > kernel: [] xfs_buf_read+0xab/0x100 [xfs] > > > Are all of these swift processes running against independent storage, or > one big array? Also, can you tell (e.g., with iotop) whether progress is > being made here, albiet very slowly, or if the storage is indeed locked > up..? > > There're 240+ swift processes in running. All stuck swift processes were attempting to access same disk. I can confirm it's indeed locked rather than slowly. By monitoring io via iotop. There's 0 activity one the problematic mount point. > In any event, given the I/O hangs, the fact that you're on an old distro > kernel and you have things like multipath enabled, it might be > worthwhile to see if you can rule out any multipath issues. > > To upgrade the kernel for CentOS6.5 may not the option for the time being but it definitely worth to give it try by picking up one of nodes for testing later. As for the multipath, yes I did suspect some mystery problem with multipath + XFS under a certain loading. But it's more like a XFS and inode related hence I start to investigate from XFS. If there's no chance to move forward in XFS, I might break the multipath and observe the result for awhile. > > 'umount -l' doesn't necessarily force anything. It just lazily unmounts > the fs from the namespace and cleans up the mount once all references > are dropped. I suspect the fs is still mounted internally. > > Brian > > Thanks // Hugo --001a1141f3e09b81470530e42a03 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
    Hi XFS team,=C2=A0


    Here's the lsof output of the grouped result of any openfile happ= ens on problematic disks. The full log of xfs_repair -n is included in this= gist as well. The xfs_repair recommend to contact xfs mailing list in the = end of the command.=C2=A0


    Perhaps I should go ahead to reboot the machine and run the xfs_repair aga= in.=C2=A0 Please find my answers inlines.=C2=A0


    On Wed, Apr= 20, 2016 at 3:34 AM, Brian Foster <bfoster@redhat.com> wro= te:
    So there's definitely some traces waiting on AGF locks and whatn= ot, but
    also many traces that appear to be waiting on I/O. For example:
    <= /blockquote>

    Yes, those I/O waiting is the original prob= lem of this thread. It looks like the disk was locked. All these I/O waitin= g for same disk (a multipath entry).
    =C2=A0

    kernel: swift-object- D 0000000000000008=C2=A0 =C2=A0 =C2=A00=C2=A0 2096=C2= =A0 =C2=A01605 0x00000000
    kernel: ffff8877cc2378b8 0000000000000082 ffff8877cc237818 ffff887ff016eb68=
    kernel: ffff883fd4ab6b28 0000000000000046 ffff883fd4bd9400 00000001e7ea49d0=
    kernel: ffff8877cc237848 ffffffff812735d1 ffff885fa2e4a5f8 ffff8877cc237fd8=
    kernel: Call Trace:
    kernel: [<ffffffff812735d1>] ? __blk_run_queue+0x31/0x40
    kernel: [<ffffffff81539455>] schedule_timeout+0x215/0x2e0
    kernel: [<ffffffff812757c9>] ? blk_peek_request+0x189/0x210
    kernel: [<ffffffff8126d9b3>] ? elv_queue_empty+0x33/0x40
    kernel: [<ffffffffa00040a0>] ? dm_request_fn+0x240/0x340 [dm_mod]
    kernel: [<ffffffff815390d3>] wait_for_common+0x123/0x180
    kernel: [<ffffffff810672b0>] ? default_wake_function+0x0/0x20
    kernel: [<ffffffffa0001036>] ? dm_unplug_all+0x36/0x50 [dm_mod]
    kernel: [<ffffffffa0415b56>] ? _xfs_buf_read+0x46/0x60 [xfs]
    kernel: [<ffffffffa040b417>] ? xfs_trans_read_buf+0x197/0x410 [xfs] kernel: [<ffffffff815391ed>] wait_for_completion+0x1d/0x20
    kernel: [<ffffffffa041503b>] xfs_buf_iowait+0x9b/0x100 [xfs]
    kernel: [<ffffffffa040b417>] ? xfs_trans_read_buf+0x197/0x410 [xfs] kernel: [<ffffffffa0415b56>] _xfs_buf_read+0x46/0x60 [xfs]
    kernel: [<ffffffffa0415c1b>] xfs_buf_read+0xab/0x100 [xfs]


    Are all of these swift processes running against independent storage, or one big array? Also, can you tell (e.g., with iotop) whether progress is being made here, albiet very slowly, or if the storage is indeed locked
    up..?

    There're 240+ swift processes in running.= =C2=A0
    All stuck swift processes were attempting to access same d= isk.=C2=A0 I can confirm it's indeed locked rather than slowly. By moni= toring io via iotop. There's 0 activity one the problematic mount point= .=C2=A0
    =C2=A0
    In any event, given the I/O hangs, the fact that you're on an old distr= o
    kernel and you have things like multipath enabled, it might be
    worthwhile to see if you can rule out any multipath issues.

    <= /blockquote>

    To upgrade the kernel for CentOS6.5 may not= the option for the time being but it definitely worth to give it try by pi= cking up one of nodes for testing later. As for the multipath, yes I did su= spect some mystery problem with multipath + XFS under a certain loading. Bu= t it's more like a XFS and inode related hence I start to investigate f= rom XFS. If there's no chance to move forward in XFS, I might break the= multipath and observe the result for awhile. =C2=A0
    =C2=A0
    =

    'umount -l' doesn't necessarily force anything. It just lazily = unmounts
    the fs from the namespace and cleans up the mount once all references
    are dropped. I suspect the fs is still mounted internally.

    Brian

    Thanks // Hugo=C2=A0
    --001a1141f3e09b81470530e42a03-- From jtulak@redhat.com Wed Apr 20 04:51:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 229487CA0 for ; Wed, 20 Apr 2016 04:51:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A7D4AAC003 for ; Wed, 20 Apr 2016 02:51:28 -0700 (PDT) X-ASG-Debug-ID: 1461145886-04bdf01105707ad0001-NocioJ Received: from mail-ig0-f176.google.com (mail-ig0-f176.google.com [209.85.213.176]) by cuda.sgi.com with ESMTP id HJVF1wTu2jFr4DgY (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 20 Apr 2016 02:51:27 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.176 Received: by mail-ig0-f176.google.com with SMTP id f1so123590657igr.1 for ; Wed, 20 Apr 2016 02:51:27 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=MA8fRlXrxGjW1LZwDU8ummqf/ZIRU2hadwm14zpl020=; b=F7ysVbAOBKuixh6esBjimkTbSnnmmEuALEpw4CksCTTw8WUwstu1t0kU9NZyTBZJBu tJlssQnSrdY//rLpimPlDPIdGyj7cUAfZ9+IM5kJJyplK99Itq2DitEcx7MLkhcKxyvx ebOd0negd8EA1/AVu5n0i+r49RdDejEzZc7L6hdWGPUPtir7/xenTT6VGaxEBjCebbsZ gjbndedTMaj3Ympp61w3YfCDow2nu0ycYyv+FEHcJ/3b4sNRMoyWsf0WKH/r9ABJltX5 M4Ja3CxITk/hSitRvp2UAEGjpsvhkd90BKDO9365uDfkYZEeSgrolT1V/Fc6doV07vN2 9zIA== X-Gm-Message-State: AOPr4FUL+5zM/9tLI7ZHoKFI5O1Z1Q9g5x+IB9f6TjrXjBzskk1/NecLktVvzfv09nDzEbRUE8XpPOAbdNXvmpaA X-Received: by 10.50.28.19 with SMTP id x19mr2359458igg.19.1461145886190; Wed, 20 Apr 2016 02:51:26 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.79 with HTTP; Wed, 20 Apr 2016 02:51:06 -0700 (PDT) In-Reply-To: References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-16-git-send-email-jtulak@redhat.com> <5706FA7C.7020103@sandeen.net> From: Jan Tulak Date: Wed, 20 Apr 2016 11:51:06 +0200 Message-ID: Subject: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices Cc: xfs-oss Content-Type: multipart/alternative; boundary=089e01538da0833bcd0530e789d4 X-Barracuda-Connect: mail-ig0-f176.google.com[209.85.213.176] X-Barracuda-Start-Time: 1461145886 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28897 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 --089e01538da0833bcd0530e789d4 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Thu, Apr 14, 2016 at 11:49 AM, Jan Tulak wrote: > On Fri, Apr 8, 2016 at 4:58 PM, Jan Tulak wrote: > >> On Fri, Apr 8, 2016 at 2:25 AM, Eric Sandeen wrote= : >> >> > [ >>> =E2=80=8Bsnip]=E2=80=8B >>> >>> I still think this patch might need a reset though :) >>> >>> Thanks, >>> -Eric >>> >>> >> =E2=80=8BOn few places, the original patch looked as if files had direct= IO still >> enabled=E2=80=8B (using platform_findsize...), and I think it was causin= g some >> failures - fixing issues is why I did most of the changes. >> >> I will revert to the original version and see what exactly fails. But >> with being Friday late afternoon, the results will be available the next >> week (Wednesday and further, all my courses at university are stuffed in >> Mon/Tue). >> >> > =E2=80=8BAll right. So I run the tests on the set with both this and the = original > version of this patch and there is no change in results. Here and there > some tests failed on one run, but on other runs they are ok and I can't g= et > them to fail again (namely, xfs/033, 073 and 085 did this). > > It looks like whatever the issues were to start the changes, they are > already resolved. Thus, I will send the original patch in the next batch. > > > =E2=80=8BI'm taking it back, one tests fails, most likely it happened whe= n I removed patch 17 - xfsprogs: disable truncating of files. If I do "mkfs.xfs $file", it doesn't know the old size to recreate it. I'm working on a change for this patch to fix this issue, but I'm not entirely certain how to proceed. The right place to get the size seems to be get_topology(). I could save it into xi.dsize, but then libxfs_init() zeroes it. So I think that I might rather convert the measured size do char *dsize and pretend that it is an user-given value. But this looks to me more like a hack. On the other side, any other way would require further changes in the code to convert the char* to int as soon as possible - which does not belong to this patch... Diff of the change: @@ -999,7 +999,7 @@ static void get_topology( fd =3D open(dfile, flags, 0666); if (fd >=3D 0) { - platform_findsizes(dfile, fd, &dummy, &ft->lsectorsize); + platform_findsizes(dfile, fd, &xi->dsize, &ft->lsectorsize); close(fd); ft->psectorsize =3D ft->lsectorsize; } else @@ -2273,6 +2273,18 @@ _("Minimum block size for CRC enabled filesystems is %d bytes.\n"), memset(&ft, 0, sizeof(ft)); get_topology(&xi, &ft, force_overwrite); + /* + * If it is an existing file and we have no info about it + * like in case of "mkfs.xfs some-file", we need to save the size + * of the file to somewhere where it can be read later. + */ + if (xi.disfile && !xi.dcreat && xi.dsize) { + long long num =3D xi.dsize * ft.lsectorsize; + int length =3D snprintf(NULL, 0,"%lld", num); + dsize =3D calloc( length + 1 ,sizeof(char)); + sprintf(dsize, "%lld", num); + } + if (!ssflag) { /* * Unless specified manually on the command line use the So, what do you think about this? Thanks, Jan --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --089e01538da0833bcd0530e789d4 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
    On Thu, Ap= r 14, 2016 at 11:49 AM, Jan Tulak <jtulak@redhat.com> wrote:
    On Fri, Apr 8, 2016 at 4:58 PM, Jan Tulak <jtulak@redhat.com> wrote:
    =
    On Fri, Apr 8, 2016 at 2:25 AM, Eric Sandeen <= /span><sandeen@sandeen.net&g= t; wrote:=C2=A0=C2=A0<= /div>
    =
    [
    =E2=80=8Bsnip]=E2=80=8B

    I still think this patch might nee= d a reset though :)

    Thanks,
    -Eric


    <= span>
    =E2=80=8BOn few = places, the original patch looked as if files had direct IO still enabled= =E2=80=8B (using platform_findsize...), and I think it was causing some fai= lures - fixing issues is why I did most of the changes.

    I will revert to the original version and see = what exactly fails. But with being Friday late afternoon, the results will = be available the next week (Wednesday and further, all my courses at univer= sity are stuffed in Mon/Tue).


    =E2=80=8BAll right. So I run the tests on the set with both this and the o= riginal version of this patch and there is no change in results. Here and t= here some tests failed on one run, but on other runs they are ok and I can&= #39;t get them to fail again (namely, xfs/033, 073 and 085 did this).
    =

    It looks like whatever the issues were to start the cha= nges, they are already resolved. Thus, I will send the original patch in th= e next batch.


    =
    =E2=80=8BI'm taking it back, one tests fails, most likely it happene= d when I removed patch 17 - xfsprogs: disable truncating of files.
    = If I do "mkfs.xfs $file", it doesn't know the old size to rec= reate it. I'm working on a change for this patch to fix this issue, but= I'm not entirely certain how to proceed. The right place to get the si= ze seems to be get_topology(). I could save it into xi.dsize, but then=C2= =A0libxfs_init() zeroes it.

    So I think that I might ra= ther convert the measured size do char *dsize and pretend that it is an use= r-given value. But this looks to me more like a hack. On the other side, an= y other way would require further changes in the code to convert the char* = to int as soon as possible - which does not belong to this patch...

    Diff of the change:

    @@ -999,7 +999,7 @= @ static void get_topology(

    =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 fd =3D open(dfile, flags, 0666);<= /div>
    =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (fd >=3D 0= ) {
    - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 platform_findsizes(dfile, fd, &dummy, &ft->lse= ctorsize);
    + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 platform_findsizes(dfile, fd, &xi->dsize, &= amp;ft->lsectorsize);
    =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 close(fd);
    =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 ft->psectorsize =3D ft->lsectorsize;
    =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 } else
    @@ -2273,6 +2273,18= @@ _("Minimum block size for CRC enabled filesystems is %d bytes.\n&q= uot;),
    =C2=A0 =C2=A0 =C2=A0 =C2=A0 memset(&ft, 0, sizeof(ft))= ;
    =C2=A0 =C2=A0 =C2=A0 =C2=A0 get_topology(&xi, &ft, forc= e_overwrite);

    + =C2=A0 =C2=A0 =C2=A0 /*
    = + =C2=A0 =C2=A0 =C2=A0 =C2=A0* If it is an existing file and we have no inf= o about it
    + =C2=A0 =C2=A0 =C2=A0 =C2=A0* like in case of "m= kfs.xfs some-file", we need to save the size
    + =C2=A0 =C2=A0= =C2=A0 =C2=A0* of the file to somewhere where it can be read later.=
    + =C2=A0 =C2=A0 =C2=A0 =C2=A0*/
    + =C2=A0 =C2=A0 =C2=A0 if (xi= .disfile && !xi.dcreat && xi.dsize) {
    + =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 long long num =3D xi.dsize * ft.l= sectorsize;
    + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 in= t length =3D snprintf(NULL, 0,"%lld", num);
    + =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 dsize =3D calloc( length + 1 ,siz= eof(char));
    + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 sp= rintf(dsize, "%lld", num);
    + =C2=A0 =C2=A0 =C2=A0 }
    +
    =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!ssflag) {
    <= div class=3D"gmail_default">=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*
    =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0* Unless specified m= anually on the command line use the

    So, what do = you think about this?

    Thanks,
    Jan

    --
    --089e01538da0833bcd0530e789d4-- From bfoster@redhat.com Wed Apr 20 06:24:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 54B487CA0 for ; Wed, 20 Apr 2016 06:24:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F16968F8039 for ; Wed, 20 Apr 2016 04:24:49 -0700 (PDT) X-ASG-Debug-ID: 1461151487-04cb6c2462755dc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id fau9Jjkar65TPAVb (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 20 Apr 2016 04:24:48 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B0D047F342; Wed, 20 Apr 2016 11:24:47 +0000 (UTC) Received: from laptop.bfoster (unused [10.10.52.73] (may be forged)) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3KBOj0V022677 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 20 Apr 2016 07:24:47 -0400 Date: Wed, 20 Apr 2016 07:24:45 -0400 From: Brian Foster To: Hugo Kuo Cc: xfs@oss.sgi.com, Darrell Bishop Subject: Re: [XFS] Any process to a particular XFS device hung in D state forever. Message-ID: <20160420112445.GA2773@laptop.bfoster> X-ASG-Orig-Subj: Re: [XFS] Any process to a particular XFS device hung in D state forever. References: <20160419113038.GA2649@laptop.bfoster> <20160419193435.GA2667@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461151488 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Apr 20, 2016 at 01:49:49PM +0800, Hugo Kuo wrote: > Hi XFS team, > > > Here's the lsof output of the grouped result of any openfile happens on > problematic disks. The full log of xfs_repair -n is included in this gist > as well. The xfs_repair recommend to contact xfs mailing list in the end of > the command. > > https://gist.github.com/HugoKuo/95613d7864aa0a1343615642b3309451 > > Perhaps I should go ahead to reboot the machine and run the xfs_repair > again. Please find my answers inlines. > Yes, repair is crashing in this case. Best to try xfs_repair after you've rebooted and mounted/umounted the fs to replay the log. If it's still crashing at that point, we'll probably want a metadata image of the fs, if possible (though there's a good chance a newer xfsprogs has the problem fixed). > > On Wed, Apr 20, 2016 at 3:34 AM, Brian Foster wrote: > > > > > So there's definitely some traces waiting on AGF locks and whatnot, but > > also many traces that appear to be waiting on I/O. For example: > > > > Yes, those I/O waiting is the original problem of this thread. It looks > like the disk was locked. All these I/O waiting for same disk (a multipath > entry). > > > > > > kernel: swift-object- D 0000000000000008 0 2096 1605 0x00000000 > > kernel: ffff8877cc2378b8 0000000000000082 ffff8877cc237818 ffff887ff016eb68 > > kernel: ffff883fd4ab6b28 0000000000000046 ffff883fd4bd9400 00000001e7ea49d0 > > kernel: ffff8877cc237848 ffffffff812735d1 ffff885fa2e4a5f8 ffff8877cc237fd8 > > kernel: Call Trace: > > kernel: [] ? __blk_run_queue+0x31/0x40 > > kernel: [] schedule_timeout+0x215/0x2e0 > > kernel: [] ? blk_peek_request+0x189/0x210 > > kernel: [] ? elv_queue_empty+0x33/0x40 > > kernel: [] ? dm_request_fn+0x240/0x340 [dm_mod] > > kernel: [] wait_for_common+0x123/0x180 > > kernel: [] ? default_wake_function+0x0/0x20 > > kernel: [] ? dm_unplug_all+0x36/0x50 [dm_mod] > > kernel: [] ? _xfs_buf_read+0x46/0x60 [xfs] > > kernel: [] ? xfs_trans_read_buf+0x197/0x410 [xfs] > > kernel: [] wait_for_completion+0x1d/0x20 > > kernel: [] xfs_buf_iowait+0x9b/0x100 [xfs] > > kernel: [] ? xfs_trans_read_buf+0x197/0x410 [xfs] > > kernel: [] _xfs_buf_read+0x46/0x60 [xfs] > > kernel: [] xfs_buf_read+0xab/0x100 [xfs] > > > > > > Are all of these swift processes running against independent storage, or > > one big array? Also, can you tell (e.g., with iotop) whether progress is > > being made here, albiet very slowly, or if the storage is indeed locked > > up..? > > > > There're 240+ swift processes in running. > All stuck swift processes were attempting to access same disk. I can > confirm it's indeed locked rather than slowly. By monitoring io via iotop. > There's 0 activity one the problematic mount point. > > > > In any event, given the I/O hangs, the fact that you're on an old distro > > kernel and you have things like multipath enabled, it might be > > worthwhile to see if you can rule out any multipath issues. > > > > > To upgrade the kernel for CentOS6.5 may not the option for the time being > but it definitely worth to give it try by picking up one of nodes for > testing later. As for the multipath, yes I did suspect some mystery problem > with multipath + XFS under a certain loading. But it's more like a XFS and > inode related hence I start to investigate from XFS. If there's no chance > to move forward in XFS, I might break the multipath and observe the result > for awhile. > It's hard to pinpoint something to the fs when there's a bunch of hung I/Os. You probably want to track down the source of those problems first. Brian > > > > > 'umount -l' doesn't necessarily force anything. It just lazily unmounts > > the fs from the namespace and cleans up the mount once all references > > are dropped. I suspect the fs is still mounted internally. > > > > Brian > > > > > Thanks // Hugo From jtulak@redhat.com Wed Apr 20 08:17:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 119A77CA1 for ; Wed, 20 Apr 2016 08:17:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id AFB798F8039 for ; Wed, 20 Apr 2016 06:17:47 -0700 (PDT) X-ASG-Debug-ID: 1461158265-04bdf0110470ce70001-NocioJ Received: from mail-ig0-f180.google.com (mail-ig0-f180.google.com [209.85.213.180]) by cuda.sgi.com with ESMTP id s0HbNjhArodqGCQu (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 20 Apr 2016 06:17:45 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.180 Received: by mail-ig0-f180.google.com with SMTP id g8so48138389igr.0 for ; Wed, 20 Apr 2016 06:17:45 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=ntNW0KQ2bRj4x/f2VXLUHfUxNY6mT5elQfne4diWhPQ=; b=RWNrkdjSMqbdsw9AxVsKhKj1Viu35R+isTycm7XA9wTlT0Ab/ibFCMvyPz4kfCFj8b lzaQWhwiog27uvHCo4JxdJ/r9YkW4kZAdQhCXiRA8AuejdOrGOApBfzvlDBIYySf9ui+ gBpE916HlebG2VuCBjQWWd2ekifvStJzUdzE14jJdKgBKEGnMzYMF3rORrHmRy/tVXw9 /UoKT7i9ijfRB4FCGWuM6A5oasRCuPadwkFmdfmI/mzAoSFvQByJQF6y8o6dUxTEdras fnKn7xDMgA5UehVdiSJd726p6oCYlCJvBAXi+aSaz2k2bGtWHiWDPVxk8EL7Bzx0McVS Nuag== X-Gm-Message-State: AOPr4FXZHaE+N9r32F464IQUdyjqwT/o9GhugR4pF1gbRwbKUyOZmXC/JFukruAzwacDWaPGZ+8Ygpxg/zrgV9J7 X-Received: by 10.50.57.50 with SMTP id f18mr3589318igq.93.1461158264717; Wed, 20 Apr 2016 06:17:44 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.79 with HTTP; Wed, 20 Apr 2016 06:17:25 -0700 (PDT) In-Reply-To: References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-16-git-send-email-jtulak@redhat.com> <5706FA7C.7020103@sandeen.net> From: Jan Tulak Date: Wed, 20 Apr 2016 15:17:25 +0200 Message-ID: Subject: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices Cc: xfs-oss Content-Type: multipart/alternative; boundary=047d7b451282545f700530ea6b1a X-Barracuda-Connect: mail-ig0-f180.google.com[209.85.213.180] X-Barracuda-Start-Time: 1461158265 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28900 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 --047d7b451282545f700530ea6b1a Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Wed, Apr 20, 2016 at 11:51 AM, Jan Tulak wrote: > On Thu, Apr 14, 2016 at 11:49 AM, Jan Tulak wrote: > >> On Fri, Apr 8, 2016 at 4:58 PM, Jan Tulak wrote: >> >>> On Fri, Apr 8, 2016 at 2:25 AM, Eric Sandeen >>> wrote: >>> >> [ >>>> =E2=80=8Bsnip]=E2=80=8B >>>> >>>> I still think this patch might need a reset though :) >>>> >>>> Thanks, >>>> -Eric >>>> >>>> >>> =E2=80=8BOn few places, the original patch looked as if files had direc= t IO >>> still enabled=E2=80=8B (using platform_findsize...), and I think it was= causing >>> some failures - fixing issues is why I did most of the changes. >>> >>> I will revert to the original version and see what exactly fails. But >>> with being Friday late afternoon, the results will be available the nex= t >>> week (Wednesday and further, all my courses at university are stuffed i= n >>> Mon/Tue). >>> >>> >> =E2=80=8BAll right. So I run the tests on the set with both this and the= original >> version of this patch and there is no change in results. Here and there >> some tests failed on one run, but on other runs they are ok and I can't = get >> them to fail again (namely, xfs/033, 073 and 085 did this). >> >> It looks like whatever the issues were to start the changes, they are >> already resolved. Thus, I will send the original patch in the next batch= . >> >> >> =E2=80=8BI'm taking it back, one tests fails, most likely it happened wh= en I > removed patch 17 - xfsprogs: disable truncating of files. > If I do "mkfs.xfs $file", it doesn't know the old size to recreate it. I'= m > working on a change for this patch to fix this issue, but I'm not entirel= y > certain how to proceed. The right place to get the size seems to be > get_topology(). I could save it into xi.dsize, but then libxfs_init() > zeroes it. > > So I think that I might rather convert the measured size do char *dsize > and pretend that it is an user-given value. But this looks to me more lik= e > a hack. On the other side, any other way would require further changes in > the code to convert the char* to int as soon as possible - which does not > belong to this patch... > > Diff of the change: > > @@ -999,7 +999,7 @@ static void get_topology( > > fd =3D open(dfile, flags, 0666); > if (fd >=3D 0) { > - platform_findsizes(dfile, fd, &dummy, > &ft->lsectorsize); > + platform_findsizes(dfile, fd, &xi->dsize, > &ft->lsectorsize); > close(fd); > ft->psectorsize =3D ft->lsectorsize; > } else > @@ -2273,6 +2273,18 @@ _("Minimum block size for CRC enabled filesystems > is %d bytes.\n"), > memset(&ft, 0, sizeof(ft)); > get_topology(&xi, &ft, force_overwrite); > > + /* > + * If it is an existing file and we have no info about it > + * like in case of "mkfs.xfs some-file", we need to save the size > + * of the file to somewhere where it can be read later. > + */ > + if (xi.disfile && !xi.dcreat && xi.dsize) { > + long long num =3D xi.dsize * ft.lsectorsize; > + int length =3D snprintf(NULL, 0,"%lld", num); > + dsize =3D calloc( length + 1 ,sizeof(char)); > + sprintf(dsize, "%lld", num); > + } > + > if (!ssflag) { > /* > * Unless specified manually on the command line use the > > So, what do you think about this? > > =E2=80=8B And before anyone will reply, I found that putting a platform_findsizes=E2= =80=8B into libxfs_init will fix it too. Which is nice, especially because for block devices, the findsizes is already used there. So ignore the previous hack. :-) Cheers, Jan --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --047d7b451282545f700530ea6b1a Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
    On Wed, Ap= r 20, 2016 at 11:51 AM, Jan Tulak <jtulak@redhat.com> wrote:
    On Thu, Apr 14, 2016 at 11:49 AM, Jan Tulak <jtulak@redhat.com>= wrote:
    On Fri, Apr 8,= 2016 at 4:58 PM, Jan Tulak <jtulak@redhat.com> wrote:
    On Fri, Apr 8, 2016 at 2:25 AM, Eric Sandeen <sandeen@sandeen.net> wrote:=C2=A0=C2=A0
    [<= div style=3D"font-family:arial,helvetica,sans-serif;display:inline">=E2=80= =8Bsnip]=E2=80=8B

    I still think this patch might need a reset though= :)

    Thanks,
    -Eric
    =

    =E2=80=8BOn few places, the ori= ginal patch looked as if files had direct IO still enabled=E2=80=8B (using = platform_findsize...), and I think it was causing some failures - fixing is= sues is why I did most of the changes.

    I will revert to the original version and see what exactly fail= s. But with being Friday late afternoon, the results will be available the = next week (Wednesday and further, all my courses at university are stuffed = in Mon/Tue).

    =E2=80=8BAll rig= ht. So I run the tests on the set with both this and the original version o= f this patch and there is no change in results. Here and there some tests f= ailed on one run, but on other runs they are ok and I can't get them to= fail again (namely, xfs/033, 073 and 085 did this).

    It looks like whatever the issues were to start the changes, they are al= ready resolved. Thus, I will send the original patch in the next batch.

    =E2=80=8BI'm taking it back= , one tests fails, most likely it happened when I removed patch 17 - xfspro= gs: disable truncating of files.
    If I do "mkfs.xfs $file", it doesn't know th= e old size to recreate it. I'm working on a change for this patch to fi= x this issue, but I'm not entirely certain how to proceed. The right pl= ace to get the size seems to be get_topology(). I could save it into xi.dsi= ze, but then=C2=A0libxfs_init() zeroes it.

    So I think that I might rather convert the measured size do= char *dsize and pretend that it is an user-given value. But this looks to = me more like a hack. On the other side, any other way would require further= changes in the code to convert the char* to int as soon as possible - whic= h does not belong to this patch...

    Diff of the change:

    @@ -999,7 +999,7 @@ static void get_topology(

    =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 fd =3D open(dfile, flags, 0666);
    =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (fd >=3D 0) {
    - =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 platform_fin= dsizes(dfile, fd, &dummy, &ft->lsectorsize);
    =
    + =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 platform_findsizes(dfi= le, fd, &xi->dsize, &ft->lsectorsize);
    =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 close(fd);
    =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 f= t->psectorsize =3D ft->lsectorsize;
    =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 } else
    @@ -2273,6 +2273,18 @@ _("Minimum block size for CRC enable= d filesystems is %d bytes.\n"),
    =C2=A0 =C2=A0 =C2=A0 =C2=A0 memset(= &ft, 0, sizeof(ft));
    =C2=A0 =C2=A0 =C2=A0 =C2=A0 get_topology(&xi, &ft, force= _overwrite);
    <= br>
    + = =C2=A0 =C2=A0 =C2=A0 /*
    + =C2=A0 =C2=A0 =C2=A0 =C2=A0* If it is an existing file and we h= ave no info about it
    + =C2=A0 =C2=A0 =C2=A0 =C2=A0* like in case of "mkfs.xfs some-f= ile", we need to save the size
    + =C2=A0 =C2=A0 =C2=A0 =C2=A0* of the file to somewhe= re where it can be read later.
    + =C2=A0 =C2=A0 =C2=A0 =C2=A0*/
    + =C2=A0 =C2=A0 =C2=A0 if (xi.disfile &a= mp;& !xi.dcreat && xi.dsize) {
    + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 long long num =3D xi.dsize * ft.lsectorsize;
    + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 int length =3D snprintf(NULL, 0,"%lld", num);
    + =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 dsize =3D calloc( length + 1 ,sizeof(char))= ;
    + =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 sprintf(dsize, "%lld", num= );
    + =C2=A0 = =C2=A0 =C2=A0 }
    =C2=A0 =C2= =A0 =C2=A0 =C2=A0 if (!ssflag) {
    =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = /*
    =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0* Unless specified manu= ally on the command line use the

    So, what do you think about this?

    =E2=80=8B
    And bef= ore anyone will reply, I found that putting a platform_findsizes=E2=80=8B i= nto libxfs_init will fix it too. Which is nice, especially because for bloc= k devices, the findsizes is already used there. So ignore the previous hack= . :-)

    Cheers,
    Jan


    --
    --047d7b451282545f700530ea6b1a-- From bill-sharpe-xfs=oss.sgi.com@aldomedicinaestetica.com Wed Apr 20 10:13:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_IMAGE_RATIO_06, HTML_MESSAGE,MIME_QP_LONG_LINE,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 AD07F7CA0 for ; Wed, 20 Apr 2016 10:13:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 69D81304039 for ; Wed, 20 Apr 2016 08:13:34 -0700 (PDT) X-ASG-Debug-ID: 1461165211-04cbb00fea037c0001-NocioJ Received: from mail.aldomedicinaestetica.com (til10.members.turizm.com [94.156.132.10]) by cuda.sgi.com with ESMTP id BEgNELYNBBlcAONT for ; Wed, 20 Apr 2016 08:13:31 -0700 (PDT) X-Barracuda-Envelope-From: bill-sharpe-xfs=oss.sgi.com@aldomedicinaestetica.com X-Barracuda-Effective-Source-IP: til10.members.turizm.com[94.156.132.10] X-Barracuda-Apparent-Source-IP: 94.156.132.10 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=dkim; d=aldomedicinaestetica.com; h=Date:From:To:Subject:MIME-Version:Content-Type:Message-ID; i=bill-sharpe@aldomedicinaestetica.com; bh=WuxhuCDLdZzzejv8xX3ZDFzcGNQ=; b=bThMMYlLuPfmvI16pQF0UCaOb0214SQCGv9yZxSc/QYLsU2SQbeJ2nwuq8Fr4d+4fdSuKIKpmc98 J/KMrcVq0ZOzfi0UrMtYK8dLA/Et3StoANDKVgZltRUOcp3uz3KgUhU+oqgvomknYgVnpHTNByaj LofOSuroBZdWbdkiDr8= DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=dkim; d=aldomedicinaestetica.com; b=a9SjOJ7ONcF8WlpXsec5FcC75dkm1f8MBkHUoKj30QN7aFmOyeBXpF304nqR87HR+Zz/+S6lrEMP RrSN3M6APK4kzV77wnTgDlzfUQT0sg1c7B225zZ3yBOXjOpVyxbBGeGskLsPQQfP+fSdoxPzAWlk ceajnkFuHiU1tKxSA1s=; Received: by mail.aldomedicinaestetica.com id h2ue9q0001g1 for ; Wed, 20 Apr 2016 10:06:41 -0500 (envelope-from ) Date: Wed, 20 Apr 2016 10:06:41 -0500 From: "Bill Sharpe" To: Subject: Harvard scientist conquers death? MIME-Version: 1.0 X-ASG-Orig-Subj: Harvard scientist conquers death? Content-Type: multipart/alternative; boundary="----=_Part_79_1694674513.1461164595715" Message-ID: <0.0.0.E.1D19B163EB59236.57BBCA@mail.aldomedicinaestetica.com> X-Barracuda-Connect: til10.members.turizm.com[94.156.132.10] X-Barracuda-Start-Time: 1461165211 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5790 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.12 X-Barracuda-Spam-Status: No, SCORE=2.12 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA074b, BSF_SC0_SA085, BSF_SC5_SA210e, DKIM_SIGNED, DKIM_VERIFIED, FR_3TAG_3TAG, HTML_IMAGE_RATIO_06, HTML_MESSAGE, MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28902 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_IMAGE_RATIO_06 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 1.00 FR_3TAG_3TAG RAW: Looks like 3 small tags. 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.82 MIME_QP_LONG_LINE_2 RAW: Quoted-printable line longer than 76 chars 0.20 BSF_SC0_SA074b Custom Rule SA074b 0.10 BSF_SC0_SA085 Custom Rule SA085 0.00 BSF_SC5_SA210e Custom Rule SA210e ------=_Part_79_1694674513.1461164595715 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Harvard scientist conquers death? http://www.aldomedicinaestetica.com/cb9hD8651bbZsnFjnn0ntv0Mjh86e/yellow Update Preferences- http://www.aldomedicinaestetica.com/blue/place/40foW8651rc0ZsnFjnn0ntv0Mjh653 ------=_Part_79_1694674513.1461164595715 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: quoted-printable =20 =20 Is There A CURE For Aging?=20 =20 =20
    =20

    Harvard scientist conquers death?

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

    Is There A CURE For Aging?

    xfs,

    Is THIS t= he single most important healthcare breakthrough in the past 30 years?

    I = recently stumbled upon a video, which could completely tr= ansform the way you think about aging.

    This video descr= ibes radical new research done at Harvard and Cornell Universities into wha= t actually causes the biological process of aging.

    3D""

    Scientists have discovered a new molecule that may hold the = key to significantly slowing down or even reversing the main symptoms of ag= ing:

    -Chronic Fatigue
    -Weight Gain
    -Joint Pain & = Inflammation
    -Muscle Decay
    -Weak Libido
    -Poor Immune Func= tion
    -Anxiety/Stress/Depression
    -Bad Complexion / Saggy Skin -Brain Fog

    The cutting-edge research revealed in this vid= eo shows that these symptoms all stem from a problem at the cellular level.= .a condition which starts in your 30' s and worsens as you get older.

    =

    If you= ' ve suffered from the physical deterioration and loss of energy once thoug= ht to be a ? natural? part of getting older, you' ll benefit from the infor= mation contained in this remarkable free presentation.

     

    <= p>Click here to watch the video... it might be the most impor= tant thing you do all year for your health.

    Stay Healthy,


    Bill Sharpe
    Live Cell Research Staff

    P.S. This research is pote= ntially life-changing for almost every American over the age of 30...so I' = d encourage you to share the the link to thi= s video with any friends or loved ones who could benefi= t from this free information.




     

    Update Preferences

    Live Cell Research
    8391 Beverly Blvd #271 Los Angeles, CA. 90048

     

     

     

     

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

    =20

    =20
    =20
    =20 ------=_Part_79_1694674513.1461164595715-- From sandeen@sandeen.net Wed Apr 20 11:53:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 862F97CA0 for ; Wed, 20 Apr 2016 11:53:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3E1B8304032 for ; Wed, 20 Apr 2016 09:53:21 -0700 (PDT) X-ASG-Debug-ID: 1461171197-04bdf0359605e70001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id VJ3voyt23tmafQ8D for ; Wed, 20 Apr 2016 09:53:17 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (unknown [74.203.127.200]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 57E5D2A80 for ; Wed, 20 Apr 2016 11:53:15 -0500 (CDT) Subject: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-16-git-send-email-jtulak@redhat.com> <5706FA7C.7020103@sandeen.net> From: Eric Sandeen Message-ID: <5717B3F7.2030904@sandeen.net> Date: Wed, 20 Apr 2016 12:53:11 -0400 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1461171197 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1332 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28905 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/20/16 9:17 AM, Jan Tulak wrote: > ​I'm taking it back, one tests fails, most likely it happened when I > removed patch 17 - xfsprogs: disable truncating of files. If I do > "mkfs.xfs $file", it doesn't know the old size to recreate it. I'm > working on a change for this patch to fix this issue, but I'm not > entirely certain how to proceed. The right place to get the size > seems to be get_topology(). I could save it into xi.dsize, but then > libxfs_init() zeroes it. > > So I think that I might rather convert the measured size do char > *dsize and pretend that it is an user-given value. But this looks to > me more like a hack. On the other side, any other way would require > further changes in the code to convert the char* to int as soon as > possible - which does not belong to this patch... ... > So, what do you think about this? > > ​ And before anyone will reply, I found that putting a > platform_findsizes​ into libxfs_init will fix it too. Which is nice, > especially because for block devices, the findsizes is already used > there. So ignore the previous hack. :-) Huh - if I take your original patchset and simply remove patch 17, I don't get any problems with "mkfs.xfs file" for an existing file, it seems to work fine here. So it might be something else... -Eric From prvs=9116f87bd=Stephane.Larose@ibis.ulaval.ca Wed Apr 20 12:51:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.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 6636F7CA0 for ; Wed, 20 Apr 2016 12:51:10 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E81088F8033 for ; Wed, 20 Apr 2016 10:51:06 -0700 (PDT) X-ASG-Debug-ID: 1461174660-04bdf0358f07670001-NocioJ Received: from exch-spam02.ulaval.ca (exch-spam02.ulaval.ca [132.203.244.24]) by cuda.sgi.com with ESMTP id PT2Dm78dxEKuZWXF (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 20 Apr 2016 10:51:01 -0700 (PDT) X-Barracuda-Envelope-From: prvs=9116f87bd=Stephane.Larose@ibis.ulaval.ca X-Barracuda-Effective-Source-IP: exch-spam02.ulaval.ca[132.203.244.24] X-Barracuda-Apparent-Source-IP: 132.203.244.24 Received: from exch-edge02.ulaval.ca ([132.203.244.22]) by exch-spam02.ulaval.ca with ESMTP/TLS/AES128-SHA; 20 Apr 2016 13:51:01 -0400 Received: from UL-EXC-PR-MBX11.ulaval.ca (10.40.67.111) by EXCH-EDGE02.ulaval.ca (132.203.244.22) with Microsoft SMTP Server (TLS) id 8.3.342.0; Wed, 20 Apr 2016 13:50:59 -0400 Received: from UL-EXC-PR-MBX11.ulaval.ca (10.40.67.111) by ul-exc-pr-mbx11.ulaval.ca (10.40.67.111) with Microsoft SMTP Server (TLS) id 15.0.1044.25; Wed, 20 Apr 2016 13:50:59 -0400 Received: from UL-EXC-PR-MBX11.ulaval.ca ([fe80::a088:6c2b:99d1:cec0]) by ul-exc-pr-mbx11.ulaval.ca ([fe80::a088:6c2b:99d1:cec0%25]) with mapi id 15.00.1044.021; Wed, 20 Apr 2016 13:50:59 -0400 From: =?iso-8859-1?Q?St=E9phane_Larose?= To: "xfs@oss.sgi.com" Subject: xfs_repair couldn't verify primary superblock Thread-Topic: xfs_repair couldn't verify primary superblock X-ASG-Orig-Subj: xfs_repair couldn't verify primary superblock Thread-Index: AdGbK6ay8c20JfnqTlycBWFFEgycSw== Date: Wed, 20 Apr 2016 17:50:59 +0000 Message-ID: Accept-Language: fr-CA, en-US Content-Language: fr-FR X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-exchange-transport-fromentityheader: Hosted x-originating-ip: [132.203.160.225] Content-Type: multipart/alternative; boundary="_000_d738a94784a0426e97752f92f38325a0ulexcprmbx11ulavalca_" MIME-Version: 1.0 X-Barracuda-Connect: exch-spam02.ulaval.ca[132.203.244.24] X-Barracuda-Start-Time: 1461174661 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 24156 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=HTML_MESSAGE, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28907 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 HTML_MESSAGE BODY: HTML included in message --_000_d738a94784a0426e97752f92f38325a0ulexcprmbx11ulavalca_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hello, When I try to mount a cleany unmounted XFS filesystem, I get those errors i= n the log : [1650856.121229] XFS (dm-24): Mounting V4 Filesystem [1650856.135455] XFS (dm-24): Log inconsistent or not a log (last=3D=3D0, f= irst!=3D1) [1650856.135461] XFS (dm-24): empty log check failed [1650856.135463] XFS (dm-24): log mount/recovery failed: error 22 [1650856.135495] XFS (dm-24): log mount failed I have tried xfs_repair but... manitou:~ # xfs_repair /dev/dm-24 Phase 1 - find and verify superblock... couldn't verify primary superblock - not enough secondary superblocks with = matching geometry !!! attempting to find secondary superblock... ........................................ After a lot of dots, xfs_repair can't find secondary superblocks. This is where my knowledge of XFS filesystem stops. Looking at the superblo= ck information, I have a feeling that the primary superblock is fine but no= t the secondary superblocks (strange blocksize and dblocks numbers). Is the= re any way to copy the primary superblock to the secondary superblocks? May= be this is not a good idea? Thank you for any help! manitou:~ # xfs_db /dev/dm-24 xfs_db> sb 0 xfs_db> p magicnum =3D 0x58465342 blocksize =3D 4096 dblocks =3D 805306368 rblocks =3D 0 rextents =3D 0 uuid =3D 1da22ae2-a572-4db7-b177-b90021a20863 logstart =3D 536870916 rootino =3D 128 rbmino =3D 129 rsumino =3D 130 rextsize =3D 1 agblocks =3D 201326592 agcount =3D 4 rbmblocks =3D 0 logblocks =3D 393216 versionnum =3D 0xb4a4 sectsize =3D 512 inodesize =3D 256 inopblock =3D 16 fname =3D "\000\000\000\000\000\000\000\000\000\000\000\000" blocklog =3D 12 sectlog =3D 9 inodelog =3D 8 inopblog =3D 4 agblklog =3D 28 rextslog =3D 0 inprogress =3D 0 imax_pct =3D 5 icount =3D 15424 ifree =3D 147 fdblocks =3D 269387727 frextents =3D 0 uquotino =3D 0 gquotino =3D null qflags =3D 0 flags =3D 0 shared_vn =3D 0 inoalignmt =3D 2 unit =3D 0 width =3D 0 dirblklog =3D 0 logsectlog =3D 0 logsectsize =3D 0 logsunit =3D 1 features2 =3D 0x8a bad_features2 =3D 0x8a features_compat =3D 0 features_ro_compat =3D 0 features_incompat =3D 0 features_log_incompat =3D 0 crc =3D 0 (unchecked) pquotino =3D 0 lsn =3D 0 xfs_db> sb 1 xfs_db> p magicnum =3D 0xf6b89fbf blocksize =3D 1483932129 dblocks =3D 15694009933101722137 rblocks =3D 11068626756016902811 rextents =3D 1593063622148300128 uuid =3D 6d1ec280-7f96-c817-0f72-d68433061de8 logstart =3D 17414611744493230066 rootino =3D 9197560587205818314 rbmino =3D 1554642860151675405 rsumino =3D 377387355824336886 rextsize =3D 1433889823 agblocks =3D 3940333176 agcount =3D 2930968516 rbmblocks =3D 422920841 logblocks =3D 4017127169 versionnum =3D 0xd520 sectsize =3D 19409 inodesize =3D 16393 inopblock =3D 2470 fname =3D "\323R|\0066\274\271\252\240\370-\231" blocklog =3D 164 sectlog =3D 42 inodelog =3D 53 inopblog =3D 10 agblklog =3D 72 rextslog =3D 24 inprogress =3D 224 imax_pct =3D 46 icount =3D 11911544493988237103 ifree =3D 3385761089021187134 fdblocks =3D 9395999607433847230 frextents =3D 7946546560364525221 uquotino =3D 15084273978162174417 gquotino =3D 478665847475212977 qflags =3D 0x1301 flags =3D 0x37 shared_vn =3D 3 inoalignmt =3D 3222551805 unit =3D 3368784749 width =3D 3167603851 dirblklog =3D 130 logsectlog =3D 143 logsectsize =3D 2101 logsunit =3D 2030308911 features2 =3D 0x5d5cbbfe bad_features2 =3D 0x2afcd122 features_compat =3D 0x2a3d35d5 features_ro_compat =3D 0xa4e58ba9 features_incompat =3D 0x13dccb60 features_log_incompat =3D 0xe79d437a crc =3D 0xbd38d745 (unchecked) pquotino =3D 7778233919291903441 lsn =3D 0xa8ffb559acd96aea xfs_db> sb 2 xfs_db> p magicnum =3D 0x41474341 blocksize =3D 1195590471 dblocks =3D 4847921951085253716 rblocks =3D 4846789398308864835 rextents =3D 4702132125296707412 uuid =3D 41544354-5441-4141-4754-544743544743 logstart =3D 4703821056660554049 rootino =3D 4703802364996815473 rbmino =3D 7814906735281653061 rsumino =3D 4991471925827290437 rextsize =3D 1162167621 agblocks =3D 1162167621 agcount =3D 1162167621 rbmblocks =3D 1162167621 logblocks =3D 1162167621 versionnum =3D 0x4545 sectsize =3D 17733 inodesize =3D 17733 inopblock =3D 17733 fname =3D "EEEEEEEEEEEE" blocklog =3D 69 sectlog =3D 69 inodelog =3D 69 inopblog =3D 69 agblklog =3D 69 rextslog =3D 69 inprogress =3D 69 imax_pct =3D 69 icount =3D 4991471925827290437 ifree =3D 4991471925827290437 fdblocks =3D 4991471925827290437 frextents =3D 4991471925827290437 uquotino =3D 4991471925827290437 gquotino =3D 4991471925827290437 qflags =3D 0x4545 flags =3D 0x45 shared_vn =3D 69 inoalignmt =3D 1162167621 unit =3D 1162167621 width =3D 1162167621 dirblklog =3D 69 logsectlog =3D 69 logsectsize =3D 17733 logsunit =3D 1162167621 features2 =3D 0x45454545 bad_features2 =3D 0x45454545 features_compat =3D 0x45454545 features_ro_compat =3D 0x45454545 features_incompat =3D 0x450a6461 features_log_incompat =3D 0x74612e75 crc =3D 0x6e697469 (unchecked) pquotino =3D 8531350831795363699 lsn =3D 0x74617420302e3032 xfs_db> --- St=E9phane Larose Analyste de l'informatique Institut de Biologie Int=E9grative et des Syst=E8mes (IBIS) Pavillon Charles-Eug=E8ne-Marchand Universit=E9 Laval --_000_d738a94784a0426e97752f92f38325a0ulexcprmbx11ulavalca_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable

    Hello,

     

    When I try to mount a cleany un= mounted XFS filesystem, I get those errors in the log :

     

    [1650856.121229] XFS (dm-24): M= ounting V4 Filesystem

    [1650856.135455] XFS (dm-24): L= og inconsistent or not a log (last=3D=3D0, first!=3D1)

    [1650856.135461] XFS (dm-24): e= mpty log check failed

    [1650856.135463] XFS (dm-24): l= og mount/recovery failed: error 22

    [1650856.135495] XFS (dm-24): log mount failed<= /o:p>

     

    I have tried xfs_repair butR= 30;

     

    manitou:~ # xfs_repair /dev/dm-= 24

    Phase 1 - find and verify super= block...

    couldn't verify primary superbl= ock - not enough secondary superblocks with matching geometry !!!

     

    attempting to find secondary su= perblock...

    ...............................= .........

     

    After a lot of dots, xfs_repair= can’t find secondary superblocks.

     

    This is where my knowledge of X= FS filesystem stops. Looking at the superblock information, I have a feelin= g that the primary superblock is fine but not the secondary superblocks (st= range blocksize and dblocks numbers). Is there any way to copy the primary superblock to the secondary superbloc= ks? Maybe this is not a good idea?

     

    Thank you for any help!

     

    manitou:~ # xfs_db /dev/dm-24

    xfs_db> sb 0

    xfs_db> p<= /p>

    magicnum =3D 0x58465342

    blocksize =3D 4096

    dblocks =3D 805306368

    rblocks =3D 0=

    rextents =3D 0

    uuid =3D 1da22ae2-a572-4db7-b17= 7-b90021a20863

    logstart =3D 536870916

    rootino =3D 128

    rbmino =3D 129

    rsumino =3D 130

    rextsize =3D 1

    agblocks =3D 201326592

    agcount =3D 4=

    rbmblocks =3D 0

    logblocks =3D 393216=

    versionnum =3D 0xb4a4

    sectsize =3D 512

    inodesize =3D 256

    inopblock =3D 16

    fname =3D "\000\000\000\00= 0\000\000\000\000\000\000\000\000"

    blocklog =3D 12

    sectlog =3D 9=

    inodelog =3D 8

    inopblog =3D 4

    agblklog =3D 28

    rextslog =3D 0

    inprogress =3D 0

    imax_pct =3D 5

    icount =3D 15424

    ifree =3D 147=

    fdblocks =3D 269387727

    frextents =3D 0

    uquotino =3D 0

    gquotino =3D null

    qflags =3D 0<= /p>

    flags =3D 0

    shared_vn =3D 0

    inoalignmt =3D 2

    unit =3D 0

    width =3D 0

    dirblklog =3D 0

    logsectlog =3D 0

    logsectsize =3D 0

    logsunit =3D 1

    features2 =3D 0x8a

    bad_features2 =3D 0x8a

    features_compat =3D 0

    features_ro_compat =3D 0

    features_incompat =3D 0

    features_log_incompat =3D 0

    crc =3D 0 (unchecked)

    pquotino =3D 0

    lsn =3D 0

    xfs_db> sb 1

    xfs_db> p<= /p>

    magicnum =3D 0xf6b89fbf

    blocksize =3D 1483932129

    dblocks =3D 1569400993310172213= 7

    rblocks =3D 1106862675601690281= 1

    rextents =3D 159306362214830012= 8

    uuid =3D 6d1ec280-7f96-c817-0f7= 2-d68433061de8

    logstart =3D 174146117444932300= 66

    rootino =3D 9197560587205818314=

    rbmino =3D 1554642860151675405<= o:p>

    rsumino =3D 377387355824336886<= o:p>

    rextsize =3D 1433889823

    agblocks =3D 3940333176

    agcount =3D 2930968516

    rbmblocks =3D 422920841

    logblocks =3D 4017127169

    versionnum =3D 0xd520

    sectsize =3D 19409

    inodesize =3D 16393<= /span>

    inopblock =3D 2470

    fname =3D "\323R|\0066\274= \271\252\240\370-\231"

    blocklog =3D 164

    sectlog =3D 42

    inodelog =3D 53

    inopblog =3D 10

    agblklog =3D 72

    rextslog =3D 24

    inprogress =3D 224

    imax_pct =3D 46

    icount =3D 11911544493988237103=

    ifree =3D 3385761089021187134

    fdblocks =3D 939599960743384723= 0

    frextents =3D 79465465603645252= 21

    uquotino =3D 150842739781621744= 17

    gquotino =3D 478665847475212977=

    qflags =3D 0x1301

    flags =3D 0x37

    shared_vn =3D 3

    inoalignmt =3D 3222551805<= /o:p>

    unit =3D 3368784749<= /span>

    width =3D 3167603851=

    dirblklog =3D 130

    logsectlog =3D 143

    logsectsize =3D 2101=

    logsunit =3D 2030308911

    features2 =3D 0x5d5cbbfe

    bad_features2 =3D 0x2afcd122

    features_compat =3D 0x2a3d35d5<= o:p>

    features_ro_compat =3D 0xa4e58b= a9

    features_incompat =3D 0x13dccb6= 0

    features_log_incompat =3D 0xe79= d437a

    crc =3D 0xbd38d745 (unchecked)<= o:p>

    pquotino =3D 777823391929190344= 1

    lsn =3D 0xa8ffb559acd96aea=

    xfs_db> sb 2

    xfs_db> p<= /p>

    magicnum =3D 0x41474341

    blocksize =3D 1195590471

    dblocks =3D 4847921951085253716=

    rblocks =3D 4846789398308864835=

    rextents =3D 470213212529670741= 2

    uuid =3D 41544354-5441-4141-475= 4-544743544743

    logstart =3D 470382105666055404= 9

    rootino =3D 4703802364996815473=

    rbmino =3D 7814906735281653061<= o:p>

    rsumino =3D 4991471925827290437=

    rextsize =3D 1162167621

    agblocks =3D 1162167621

    agcount =3D 1162167621

    rbmblocks =3D 1162167621

    logblocks =3D 1162167621

    versionnum =3D 0x4545

    sectsize =3D 17733

    inodesize =3D 17733<= /span>

    inopblock =3D 17733<= /span>

    fname =3D "EEEEEEEEEEEE&qu= ot;

    blocklog =3D 69

    sectlog =3D 69

    inodelog =3D 69

    inopblog =3D 69

    agblklog =3D 69

    rextslog =3D 69

    inprogress =3D 69

    imax_pct =3D 69

    icount =3D 4991471925827290437<= o:p>

    ifree =3D 4991471925827290437

    fdblocks =3D 499147192582729043= 7

    frextents =3D 49914719258272904= 37

    uquotino =3D 499147192582729043= 7

    gquotino =3D 499147192582729043= 7

    qflags =3D 0x4545

    flags =3D 0x45

    shared_vn =3D 69

    inoalignmt =3D 1162167621<= /o:p>

    unit =3D 1162167621<= /span>

    width =3D 1162167621=

    dirblklog =3D 69

    logsectlog =3D 69

    logsectsize =3D 17733

    logsunit =3D 1162167621

    features2 =3D 0x45454545

    bad_features2 =3D 0x45454545

    features_compat =3D 0x45454545<= o:p>

    features_ro_compat =3D 0x454545= 45

    features_incompat =3D 0x450a646= 1

    features_log_incompat =3D 0x746= 12e75

    crc =3D 0x6e697469 (unchecked)<= o:p>

    pquotino =3D 853135083179536369= 9

    lsn =3D 0x74617420302e3032=

    xfs_db>

     

    ---<= /o:p>

    St=E9phan= e Larose

    Analyste = de l'informatique

    Institut = de Biologie Int=E9grative et des Syst=E8mes (IBIS)

    Pavillon = Charles-Eug=E8ne-Marchand

    Universit= =E9 Laval

     

    --_000_d738a94784a0426e97752f92f38325a0ulexcprmbx11ulavalca_-- From sandeen@sandeen.net Wed Apr 20 15:13:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C51F77CA0 for ; Wed, 20 Apr 2016 15:13:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 700758F8035 for ; Wed, 20 Apr 2016 13:13:40 -0700 (PDT) X-ASG-Debug-ID: 1461183217-04bdf035960b510001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id ggSFFdVQ29AkzyY4 for ; Wed, 20 Apr 2016 13:13:37 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (unknown [74.203.127.200]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 55FC92A60 for ; Wed, 20 Apr 2016 15:13:37 -0500 (CDT) Subject: Re: xfs_repair couldn't verify primary superblock To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair couldn't verify primary superblock References: From: Eric Sandeen Message-ID: <5717E2EF.1080902@sandeen.net> Date: Wed, 20 Apr 2016 16:13:35 -0400 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1461183217 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2148 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28911 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/20/16 1:50 PM, Stéphane Larose wrote: > Hello, > > > > When I try to mount a cleany unmounted XFS filesystem, I get those errors in the log : > > > [1650856.121229] XFS (dm-24): Mounting V4 Filesystem > [1650856.135455] XFS (dm-24): Log inconsistent or not a log (last==0, first!=1) > [1650856.135461] XFS (dm-24): empty log check failed > [1650856.135463] XFS (dm-24): log mount/recovery failed: error 22 > [1650856.135495] XFS (dm-24): log mount failed You could maybe use xfs_logdump to see what's there, but... > I have tried xfs_repair but… > > manitou:~ # xfs_repair /dev/dm-24 > > Phase 1 - find and verify superblock... > couldn't verify primary superblock - not enough secondary superblocks with matching geometry !!! > > attempting to find secondary superblock... > ........................................ > After a lot of dots, xfs_repair can’t find secondary superblocks. > > This is where my knowledge of XFS filesystem stops. Looking at the superblock information, I have a feeling that the primary superblock is fine but not the secondary superblocks (strange blocksize and dblocks numbers). Is there any way to copy the primary superblock to the secondary superblocks? Maybe this is not a good idea? > > Thank you for any help! > ... the stated locations of the backup supers certainly don't contain good data: > xfs_db> sb 1 > xfs_db> p > magicnum = 0xf6b89fbf > blocksize = 1483932129 > dblocks = 15694009933101722137 > rblocks = 11068626756016902811 > rextents = 1593063622148300128 ... > xfs_db> sb 2 > xfs_db> p > magicnum = 0x41474341 > blocksize = 1195590471 > dblocks = 4847921951085253716 > rblocks = 4846789398308864835 > rextents = 4702132125296707412 ... which is why it couldn't find any valid/matching backups. The stated AG size does look correct, though, for the overall size of the filesystem as stated in SB 0. Is there more to this story? Did something "interesting" happen with the underlying storage? Or with the filesystem prior to this problem? does "blkid /dev/dm-24" say anything other than "xfs filesystem?" -Eric From BATV+fbbb9e69d6ab055ffe6e+4623+infradead.org+hch@bombadil.srs.infradead.org Wed Apr 20 15:59:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C0D287CA0 for ; Wed, 20 Apr 2016 15:59:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 79A2930404E for ; Wed, 20 Apr 2016 13:59:29 -0700 (PDT) X-ASG-Debug-ID: 1461185966-04cbb00fea0d2d0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id FoGp5S9SJa8u5jVU (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 20 Apr 2016 13:59:27 -0700 (PDT) X-Barracuda-Envelope-From: BATV+fbbb9e69d6ab055ffe6e+4623+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1aszDX-0006Vk-Gi; Wed, 20 Apr 2016 20:59:23 +0000 Date: Wed, 20 Apr 2016 13:59:23 -0700 From: Christoph Hellwig To: Jeff Moyer Cc: Vishal Verma , Christoph Hellwig , Jan Kara , linux-nvdimm@ml01.01.org, Dave Chinner , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Jens Axboe , linux-mm@kvack.org, linux-block@vger.kernel.org, Matthew Wilcox , linux-fsdevel@vger.kernel.org, Andrew Morton , linux-ext4@vger.kernel.org, Al Viro Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Message-ID: <20160420205923.GA24797@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1461185966 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 994 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28912 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Apr 15, 2016 at 12:11:36PM -0400, Jeff Moyer wrote: > > + if (IS_DAX(inode)) { > > + ret = dax_do_io(iocb, inode, iter, offset, blkdev_get_block, > > NULL, DIO_SKIP_DIO_COUNT); > > + if (ret == -EIO && (iov_iter_rw(iter) == WRITE)) > > + ret_saved = ret; > > + else > > + return ret; > > + } > > + > > + ret = __blockdev_direct_IO(iocb, inode, I_BDEV(inode), iter, offset, > > blkdev_get_block, NULL, NULL, > > DIO_SKIP_DIO_COUNT); > > + if (ret < 0 && ret_saved) > > + return ret_saved; > > + > > Hmm, did you just break async DIO? I think you did! :) > __blockdev_direct_IO can return -EIOCBQUEUED, and you've now turned that > into -EIO. Really, I don't see a reason to save that first -EIO. The > same applies to all instances in this patch. Yes, there is no point in saving the earlier error - just return the second error all the time. E.g. ret = dax_io(); if (dax_need_dio_retry(ret)) ret = direct_IO(); From hugo@swiftstack.com Thu Apr 21 00:55:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 00D037CA0 for ; Thu, 21 Apr 2016 00:55:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A5CF6304051 for ; Wed, 20 Apr 2016 22:55:07 -0700 (PDT) X-ASG-Debug-ID: 1461218104-04cb6c09a337770001-NocioJ Received: from mail-io0-f182.google.com (mail-io0-f182.google.com [209.85.223.182]) by cuda.sgi.com with ESMTP id REOlHhmrgc8Es6OR (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 20 Apr 2016 22:55:04 -0700 (PDT) X-Barracuda-Envelope-From: hugo@swiftstack.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.182 Received: by mail-io0-f182.google.com with SMTP id u185so75720411iod.3 for ; Wed, 20 Apr 2016 22:55:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=swiftstack-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=Y8agaFaVZ1KRTxrW7G5LBxsn0eAe5dJAu6nf0uBhTyM=; b=t+5R7dYGzVPUshszitkJ5hUfoTpzFaksY5UEQJR6VZckO4W64SqgFET0GWX15IGpQv SeHJmTreem3Q/m5bX2nz39gnEyQpsTaY7W4ceAI7eWQxAYLtvEjo7cMKK1oKlYg2G/C8 /igGBjX9uGq/smImQqkV9g0HOc57rcFN0+iUsi08sEjdh/aTh6Wh8AjRX2a/wo4KceKu ShfNtfikeu1cLiOwkR5MTL8TsK3mxxEU2LwdaiVYrhD4O+fUXlB4pIy4ymsJH+d1wL9J cezU2hFQunlwHvE44+XhA8kaADZz7jtlSHg6muKfUNspcNkQHJ5r/MK4PIaYnwZgxrhF V/WA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=Y8agaFaVZ1KRTxrW7G5LBxsn0eAe5dJAu6nf0uBhTyM=; b=L1ul3d2qdtq7QsVgAtV3cbKPDSn4SCSFIiI1wtCJcNMf4iYXua/Tm1JpntjRBLejyI XzdzTXmUxqczsTnLSN1a94sj1aC9z8DYpsNUI/W6RPlZGq4SprLVhlSRIz94+7w03H91 7YQ1w3u1Tc0Qrv5O+2fRieEuQzDpuo32MGciQ8/Pflim+5G8GAHW3a+uPxbaRuX6xTnG 276PPxw+UYlM6WGeFpoO3zfcpa561r3SRtFX043IHp6A8giswyT0ZxbkUg+iaCkbWbTJ kW5kxH6CnZdJQ7Vn66pCnMmYAVIcmzPVSwpMagRVB3/HVeov67hM96x+FHcqgwip/54q Jw+g== X-Gm-Message-State: AOPr4FX6NsVV56jjWzPCkivEVxHVKozZ43YfkLd/jFnS6EAbuXDZ+2TXZuuTbvzMjr8Nye8Jgh0qEk4pQWPmFsWY X-Received: by 10.107.10.16 with SMTP id u16mr15727837ioi.167.1461218104312; Wed, 20 Apr 2016 22:55:04 -0700 (PDT) MIME-Version: 1.0 Received: by 10.107.47.99 with HTTP; Wed, 20 Apr 2016 22:54:44 -0700 (PDT) In-Reply-To: <20160420112445.GA2773@laptop.bfoster> References: <20160419113038.GA2649@laptop.bfoster> <20160419193435.GA2667@laptop.bfoster> <20160420112445.GA2773@laptop.bfoster> From: Hugo Kuo Date: Thu, 21 Apr 2016 13:54:44 +0800 Message-ID: Subject: Re: [XFS] Any process to a particular XFS device hung in D state forever. To: Brian Foster X-ASG-Orig-Subj: Re: [XFS] Any process to a particular XFS device hung in D state forever. Cc: xfs@oss.sgi.com, Darrell Bishop Content-Type: multipart/alternative; boundary=001a113edfda0c1e340530f85aef X-Barracuda-Connect: mail-io0-f182.google.com[209.85.223.182] X-Barracuda-Start-Time: 1461218104 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 12168 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28924 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --001a113edfda0c1e340530f85aef Content-Type: text/plain; charset=UTF-8 Hi Brian, Here's the result of xfs_repair on the same disk after rebooting. https://gist.github.com/HugoKuo/e1d683d9653e66a80dfcfcbee4294fe8 It's looks normal. We rebooted the server and no hanging process in past 12hrs. I'll keep eyes on the server. I know it's helpful to to trace-cmd for xfs. But there's too may xfs operations are happening in the server. It's crazy like 100MB data per second. I stopped the trace-cmd. As you said, we need to find out the source of the problem. trace-cmd would be a nice option. Is there a way to flush recored data if nothing happens in the past hours ? trace-cmd record -e xfs\* Regards // Hugo On Wed, Apr 20, 2016 at 7:24 PM, Brian Foster wrote: > On Wed, Apr 20, 2016 at 01:49:49PM +0800, Hugo Kuo wrote: > > Hi XFS team, > > > > > > Here's the lsof output of the grouped result of any openfile happens on > > problematic disks. The full log of xfs_repair -n is included in this gist > > as well. The xfs_repair recommend to contact xfs mailing list in the end > of > > the command. > > > > https://gist.github.com/HugoKuo/95613d7864aa0a1343615642b3309451 > > > > Perhaps I should go ahead to reboot the machine and run the xfs_repair > > again. Please find my answers inlines. > > > > Yes, repair is crashing in this case. Best to try xfs_repair after > you've rebooted and mounted/umounted the fs to replay the log. If it's > still crashing at that point, we'll probably want a metadata image of > the fs, if possible (though there's a good chance a newer xfsprogs has > the problem fixed). > > > > > On Wed, Apr 20, 2016 at 3:34 AM, Brian Foster > wrote: > > > > > > > > So there's definitely some traces waiting on AGF locks and whatnot, but > > > also many traces that appear to be waiting on I/O. For example: > > > > > > > Yes, those I/O waiting is the original problem of this thread. It looks > > like the disk was locked. All these I/O waiting for same disk (a > multipath > > entry). > > > > > > > > > > kernel: swift-object- D 0000000000000008 0 2096 1605 0x00000000 > > > kernel: ffff8877cc2378b8 0000000000000082 ffff8877cc237818 > ffff887ff016eb68 > > > kernel: ffff883fd4ab6b28 0000000000000046 ffff883fd4bd9400 > 00000001e7ea49d0 > > > kernel: ffff8877cc237848 ffffffff812735d1 ffff885fa2e4a5f8 > ffff8877cc237fd8 > > > kernel: Call Trace: > > > kernel: [] ? __blk_run_queue+0x31/0x40 > > > kernel: [] schedule_timeout+0x215/0x2e0 > > > kernel: [] ? blk_peek_request+0x189/0x210 > > > kernel: [] ? elv_queue_empty+0x33/0x40 > > > kernel: [] ? dm_request_fn+0x240/0x340 [dm_mod] > > > kernel: [] wait_for_common+0x123/0x180 > > > kernel: [] ? default_wake_function+0x0/0x20 > > > kernel: [] ? dm_unplug_all+0x36/0x50 [dm_mod] > > > kernel: [] ? _xfs_buf_read+0x46/0x60 [xfs] > > > kernel: [] ? xfs_trans_read_buf+0x197/0x410 [xfs] > > > kernel: [] wait_for_completion+0x1d/0x20 > > > kernel: [] xfs_buf_iowait+0x9b/0x100 [xfs] > > > kernel: [] ? xfs_trans_read_buf+0x197/0x410 [xfs] > > > kernel: [] _xfs_buf_read+0x46/0x60 [xfs] > > > kernel: [] xfs_buf_read+0xab/0x100 [xfs] > > > > > > > > > Are all of these swift processes running against independent storage, > or > > > one big array? Also, can you tell (e.g., with iotop) whether progress > is > > > being made here, albiet very slowly, or if the storage is indeed locked > > > up..? > > > > > > There're 240+ swift processes in running. > > All stuck swift processes were attempting to access same disk. I can > > confirm it's indeed locked rather than slowly. By monitoring io via > iotop. > > There's 0 activity one the problematic mount point. > > > > > > > In any event, given the I/O hangs, the fact that you're on an old > distro > > > kernel and you have things like multipath enabled, it might be > > > worthwhile to see if you can rule out any multipath issues. > > > > > > > > To upgrade the kernel for CentOS6.5 may not the option for the time being > > but it definitely worth to give it try by picking up one of nodes for > > testing later. As for the multipath, yes I did suspect some mystery > problem > > with multipath + XFS under a certain loading. But it's more like a XFS > and > > inode related hence I start to investigate from XFS. If there's no chance > > to move forward in XFS, I might break the multipath and observe the > result > > for awhile. > > > > It's hard to pinpoint something to the fs when there's a bunch of hung > I/Os. You probably want to track down the source of those problems > first. > > Brian > > > > > > > > > 'umount -l' doesn't necessarily force anything. It just lazily unmounts > > > the fs from the namespace and cleans up the mount once all references > > > are dropped. I suspect the fs is still mounted internally. > > > > > > Brian > > > > > > > > Thanks // Hugo > --001a113edfda0c1e340530f85aef Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
    Hi Brian,

    Here's the result of xfs_= repair on the same disk after rebooting. https://gist.github.com/HugoKuo/= e1d683d9653e66a80dfcfcbee4294fe8=C2=A0
    It's looks normal.= =C2=A0

    We rebooted the server and no hanging proce= ss in past 12hrs. I'll keep eyes on the server.=C2=A0
    I know = it's helpful to to trace-cmd for xfs. But there's too may xfs opera= tions are happening in the server. It's crazy like 100MB data per secon= d. I stopped the trace-cmd. As you said, we need to find out the source of = the problem. trace-cmd would be a nice option. Is there a way to flush reco= red data if nothing happens in the past hours ?

    trace-cmd record -e xfs\*

    =
    Regards // Hugo

    =C2=A0


    On = Wed, Apr 20, 2016 at 7:24 PM, Brian Foster <bfoster@redhat.com> wrote:
    On Wed, Apr = 20, 2016 at 01:49:49PM +0800, Hugo Kuo wrote:
    > Hi XFS team,
    >
    >
    > Here's the lsof output of the grouped result of any openfile happe= ns on
    > problematic disks. The full log of xfs_repair -n is included in this g= ist
    > as well. The xfs_repair recommend to contact xfs mailing list in the e= nd of
    > the command.
    >
    > https://gist.github.com/HugoKuo= /95613d7864aa0a1343615642b3309451
    >
    > Perhaps I should go ahead to reboot the machine and run the xfs_repair=
    > again.=C2=A0 Please find my answers inlines.
    >

    Yes, repair is crashing in this case. Best to try xfs_repair after you've rebooted and mounted/umounted the fs to replay the log. If it= 9;s
    still crashing at that point, we'll probably want a metadata image of the fs, if possible (though there's a good chance a newer xfsprogs has<= br> the problem fixed).

    >
    > On Wed, Apr 20, 2016 at 3:34 AM, Brian Foster <bfoster@redhat.com> wrote:
    >
    > >
    > > So there's definitely some traces waiting on AGF locks and wh= atnot, but
    > > also many traces that appear to be waiting on I/O. For example: > >
    >
    > Yes, those I/O waiting is the original problem of this thread. It look= s
    > like the disk was locked. All these I/O waiting for same disk (a multi= path
    > entry).
    >
    >
    > >
    > > kernel: swift-object- D 0000000000000008=C2=A0 =C2=A0 =C2=A00=C2= =A0 2096=C2=A0 =C2=A01605 0x00000000
    > > kernel: ffff8877cc2378b8 0000000000000082 ffff8877cc237818 ffff88= 7ff016eb68
    > > kernel: ffff883fd4ab6b28 0000000000000046 ffff883fd4bd9400 000000= 01e7ea49d0
    > > kernel: ffff8877cc237848 ffffffff812735d1 ffff885fa2e4a5f8 ffff88= 77cc237fd8
    > > kernel: Call Trace:
    > > kernel: [<ffffffff812735d1>] ? __blk_run_queue+0x31/0x40 > > kernel: [<ffffffff81539455>] schedule_timeout+0x215/0x2e0 > > kernel: [<ffffffff812757c9>] ? blk_peek_request+0x189/0x210=
    > > kernel: [<ffffffff8126d9b3>] ? elv_queue_empty+0x33/0x40 > > kernel: [<ffffffffa00040a0>] ? dm_request_fn+0x240/0x340 [d= m_mod]
    > > kernel: [<ffffffff815390d3>] wait_for_common+0x123/0x180 > > kernel: [<ffffffff810672b0>] ? default_wake_function+0x0/0x= 20
    > > kernel: [<ffffffffa0001036>] ? dm_unplug_all+0x36/0x50 [dm_= mod]
    > > kernel: [<ffffffffa0415b56>] ? _xfs_buf_read+0x46/0x60 [xfs= ]
    > > kernel: [<ffffffffa040b417>] ? xfs_trans_read_buf+0x197/0x4= 10 [xfs]
    > > kernel: [<ffffffff815391ed>] wait_for_completion+0x1d/0x20<= br> > > kernel: [<ffffffffa041503b>] xfs_buf_iowait+0x9b/0x100 [xfs= ]
    > > kernel: [<ffffffffa040b417>] ? xfs_trans_read_buf+0x197/0x4= 10 [xfs]
    > > kernel: [<ffffffffa0415b56>] _xfs_buf_read+0x46/0x60 [xfs]<= br> > > kernel: [<ffffffffa0415c1b>] xfs_buf_read+0xab/0x100 [xfs]<= br> > >
    > >
    > > Are all of these swift processes running against independent stor= age, or
    > > one big array? Also, can you tell (e.g., with iotop) whether prog= ress is
    > > being made here, albiet very slowly, or if the storage is indeed = locked
    > > up..?
    > >
    > > There're 240+ swift processes in running.
    > All stuck swift processes were attempting to access same disk.=C2=A0 I= can
    > confirm it's indeed locked rather than slowly. By monitoring io vi= a iotop.
    > There's 0 activity one the problematic mount point.
    >
    >
    > > In any event, given the I/O hangs, the fact that you're on an= old distro
    > > kernel and you have things like multipath enabled, it might be > > worthwhile to see if you can rule out any multipath issues.
    > >
    > >
    > To upgrade the kernel for CentOS6.5 may not the option for the time be= ing
    > but it definitely worth to give it try by picking up one of nodes for<= br> > testing later. As for the multipath, yes I did suspect some mystery pr= oblem
    > with multipath + XFS under a certain loading. But it's more like a= XFS and
    > inode related hence I start to investigate from XFS. If there's no= chance
    > to move forward in XFS, I might break the multipath and observe the re= sult
    > for awhile.
    >

    It's hard to pinpoint something to the fs when there's = a bunch of hung
    I/Os. You probably want to track down the source of those problems
    first.

    Brian

    >
    > >
    > > 'umount -l' doesn't necessarily force anything. It ju= st lazily unmounts
    > > the fs from the namespace and cleans up the mount once all refere= nces
    > > are dropped. I suspect the fs is still mounted internally.
    > >
    > > Brian
    > >
    > >
    > Thanks // Hugo

    --001a113edfda0c1e340530f85aef-- From gfedakov@list.ru Thu Apr 21 02:20:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 902267CA0 for ; Thu, 21 Apr 2016 02:20:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 53C278F804C for ; Thu, 21 Apr 2016 00:20:41 -0700 (PDT) X-ASG-Debug-ID: 1461223236-04cbb00fe9247d0001-NocioJ Received: from mxs.list.ru (vmi55257.contabo.host [193.164.131.157]) by cuda.sgi.com with ESMTP id QDG3wuvFe7AXJj48 for ; Thu, 21 Apr 2016 00:20:36 -0700 (PDT) X-Barracuda-Envelope-From: gfedakov@list.ru X-Barracuda-Effective-Source-IP: vmi55257.contabo.host[193.164.131.157] X-Barracuda-Apparent-Source-IP: 193.164.131.157 Message-ID: From: "=?utf-8?B?0J7RgNCz0LDQvdC40LfQsNGG0LjRjyDRgtC+0LLQsNGA0L7QtNCy0LjQttC10L3QuNGP?=" To: Subject: =?utf-8?B?0JzQtdC20LTRg9C90LDRgNC+0LTQvdGL0LUg0L/QtdGA0LXQstC+0LfQutC4INGA0L7RgdGB0LjQudGB0LrQuNGFINC/0LXRgNC10LLQvtC30YfQuNC60L7Qsi4=?= Date: Thu, 21 Apr 2016 10:20:35 +0300 X-ASG-Orig-Subj: =?utf-8?B?0JzQtdC20LTRg9C90LDRgNC+0LTQvdGL0LUg0L/QtdGA0LXQstC+0LfQutC4INGA0L7RgdGB0LjQudGB0LrQuNGFINC/0LXRgNC10LLQvtC30YfQuNC60L7Qsi4=?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_00D8_01D19BB7.7167BF00" X-Priority: 3 X-MSMail-Priority: Normal Importance: Normal X-Mailer: Microsoft Windows Live Mail 15.4.3555.308 X-MimeOLE: Produced By Microsoft MimeOLE V15.4.3555.308 X-Barracuda-Connect: vmi55257.contabo.host[193.164.131.157] X-Barracuda-Start-Time: 1461223236 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 31770 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28925 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message Ýòî — ñîîáùåíèå èç íåñêîëüêèõ ÷àñòåé â ôîðìàòå MIME. ------=_NextPart_000_00D8_01D19BB7.7167BF00 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable =20 =20 25 =D0=B0=D0=BF=D1=80=D0=B5=D0=BB=D1=8F =20 =D0=90=D1=80=D1=82=D0=B8=D0=BA=D1=83=D0=BB : 373 = =D0=A2=D0=A0=D0=90=D0=9D=D0=A1=D0=9F=D0=9E=D0=A0=D0=A2=D0=9D=D0=9E-=D0=AD= =D0=9A=D0=A1=D0=9F=D0=95=D0=94=D0=98=D0=A6=D0=98=D0=9E=D0=9D=D0=9D=D0=90=D0= =AF = =D0=94=D0=95=D0=AF=D0=A2=D0=95=D0=9B=D0=AC=D0=9D=D0=9E=D0=A1=D0=A2=D0=AC = =D0=98 =D0=9F=D0=95=D0=A0=D0=95=D0=92=D0=9E=D0=97=D0=9A=D0=98 =D0=92=20 = =D0=A1=D0=9E=D0=92=D0=A0=D0=95=D0=9C=D0=95=D0=9D=D0=9D=D0=9E=D0=99 = =D0=A0=D0=9E=D0=A1=D0=A1=D0=98=D0=98 =D0=92 2016 = =D0=93=D0=9E=D0=94=D0=A3. =D0=9D=D0=9E=D0=92=D0=AB=D0=95 = =D0=9F=D0=A0=D0=98=D0=9D=D0=A6=D0=98=D0=9F=D0=AB = =D0=9D=D0=90=D0=9B=D0=9E=D0=93=D0=9E=D0=92=D0=9E=D0=93=D0=9E =D0=98=20 =D0=92=D0=90=D0=9B=D0=AE=D0=A2=D0=9D=D0=9E=D0=93=D0=9E = =D0=97=D0=90=D0=9A=D0=9E=D0=9D=D0=9E=D0=94=D0=90=D0=A2=D0=95=D0=9B=D0=AC=D0= =A1=D0=A2=D0=92=D0=90. = =D0=93=D0=9E=D0=A1=D0=9A=D0=9E=D0=9D=D0=A2=D0=A0=D0=9E=D0=9B=D0=AC. =D0=94=D0=BB=D1=8F: = =D0=B3=D0=BB=D0=B0=D0=B2=D0=BD=D1=8B=D1=85 = =D0=B1=D1=83=D1=85=D0=B3=D0=B0=D0=BB=D1=82=D0=B5=D1=80=D0=BE=D0=B2, = =D0=B1=D1=83=D1=85=D0=B3=D0=B0=D0=BB=D1=82=D0=B5=D1=80=D0=BE=D0=B2, = =D0=B0=D1=83=D0=B4=D0=B8=D1=82=D0=BE=D1=80=D0=BE=D0=B2, = =D1=81=D0=BE=D1=82=D1=80=D1=83=D0=B4=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2 = =D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D0=BE=D0=B2 =D0=BF=D0=BE=20 = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0= =BD=D0=B8=D1=8E, = =D1=84=D0=B8=D0=BD=D0=B0=D0=BD=D1=81=D0=BE=D0=B2=D1=8B=D1=85 = =D0=B4=D0=B8=D1=80=D0=B5=D0=BA=D1=82=D0=BE=D1=80=D0=BE=D0=B2, = =D1=8E=D1=80=D0=B8=D1=81=D1=82=D0=BE=D0=B2, = =D1=80=D1=83=D0=BA=D0=BE=D0=B2=D0=BE=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D0=B5=D0= =B9 =D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B9 = =D0=B8 =D0=B4=D1=80=D1=83=D0=B3=D0=B8=D1=85=20 = =D0=B7=D0=B0=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D0=B5=D1=81=D0=BE=D0=B2=D0=B0=D0= =BD=D0=BD=D1=8B=D1=85 =D0=BB=D0=B8=D1=86. =20 =D0=97=D0=B0=D0=BD=D1=8F=D1=82=D0=B8=D1=8F = =D0=B1=D1=83=D0=B4=D1=83=D1=82 = =D0=BF=D1=80=D0=BE=D0=B2=D0=BE=D0=B4=D0=B8=D1=82=D1=81=D1=8F: =D1=81 = 10.00 =D0=B4=D0=BE 17.30 = =D0=9C=D0=B5=D1=80=D0=BE=D0=BF=D1=80=D0=B8=D1=8F=D1=82=D0=B8=D0=B5 = =D1=81=D0=BE=D1=81=D1=82=D0=BE=D0=B8=D1=82=D1=81=D1=8F =D0=BF=D0=BE = =D0=B0=D0=B4=D1=80=D0=B5=D1=81=D1=83: =D0=B3. = =D0=9C=D0=BE=D1=81=D0=BA=D0=B2=D0=B0, =D1=83=D0=BB. = =D0=91=D0=B0=D1=83=D0=BC=D0=B0=D0=BD=D1=81=D0=BA=D0=B0=D1=8F, =D0=B4.6, = =D0=91.=D0=A6. "=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D1=8F = =D0=9F=D0=BB=D0=B0=D0=B7=D0=B0". =D0=A3=D0=B7=D0=BD=D0=B0=D1=82=D1=8C = =D0=BF=D0=BE=D0=B4=D1=80=D0=BE=D0=B1=D0=BD=D1=83=D1=8E = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D1=8E = =D0=BF=D0=BE =D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D0=B5 = =D0=B8 = =D0=B7=D0=B0=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B8=D1=80=D0=BE=D0= =B2=D0=B0=D1=82=D1=8C=D1=81=D1=8F =D0=92=D1=8B = =D0=BC=D0=BE=D0=B6=D0=B5=D1=82=D0=B5 =D0=BF=D0=BE = =D0=BD=D0=BE=D0=BC=D0=B5=D1=80=D1=83:=20 8 =D0=BA=D0=BE=D0=B4 = =D0=B3=D0=BE=D1=80=D0=BE=D0=B4=D0=B0 / 4 9 5 / = =D1=82=D0=B5=D0=BB=D0=B5=D1=84=D0=BE=D0=BD 961-00-38 = (=D0=BC=D0=BD=D0=BE=D0=B3=D0=BE=D0=BA=D0=B0=D0=BD=D0=B0=D0=BB=D1=8C=D0=BD= =D1=8B=D0=B9) =20 =20 =20 =20 =D0=9A=D1=80=D0=B0=D1=82=D0=BA=D0=BE=D0=B5 = =D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5 = =D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D1=8B: 1. = =D0=A2=D1=80=D0=B0=D0=BD=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=BD=D0=B0=D1=8F = =D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=86=D0=B8=D1=8F: = =D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D0=BB=D1=8C=D0=BD=D0= =BE=D0=B5 =D0=BE=D1=84=D0=BE=D1=80=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5, = =D0=B1=D1=83=D1=85=D1=83=D1=87=D0=B5=D1=82 =D0=B8 = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0= =BD=D0=B8=D0=B5 =D0=B2 2016=20 =D0=B3=D0=BE=D0=B4=D1=83. =D0=9D=D0=BE=D0=B2=D1=8B=D0=B9 = =D0=BF=D0=BE=D0=B4=D1=85=D0=BE=D0=B4 =D0=BA = =D0=B2=D0=BE=D0=BF=D1=80=D0=BE=D1=81=D1=83 = =D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F = =D0=9D=D0=94=D0=A1 =D1=83=D1=81=D0=BB=D1=83=D0=B3 = =D1=82=D1=80=D0=B0=D0=BD=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=BD=D0=BE=D0=B9 = =D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=86=D0=B8=D0=B8 = (=D0=9F=D0=BE=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8= =D0=B5=20 =D0=9F=D0=BB=D0=B5=D0=BD=D1=83=D0=BC=D0=B0 = =D0=92=D0=90=D0=A1 =D0=A0=D0=A4 =D0=BE=D1=82 30.05.2014 N 33.). = =D0=9D=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=D1=8B=D0=B5 = =D0=BF=D0=BE=D1=81=D0=BB=D0=B5=D0=B4=D1=81=D1=82=D0=B2=D0=B8=D1=8F = =D0=B8 = =D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=BE=D0=B1=D0=BE=D1= =80=D0=BE=D1=82 =D0=B4=D0=BB=D1=8F = =D0=97=D0=B0=D0=BA=D0=B0=D0=B7=D1=87=D0=B8=D0=BA=D0=B0 =D0=B8=20 = =D0=AD=D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=82=D0=BE=D1=80=D0=B0 = =D0=BF=D1=80=D0=B8 = =D1=81=D1=82=D1=80=D0=B0=D1=85=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B8 = =D0=B3=D1=80=D1=83=D0=B7=D0=B0 = =D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=82=D0=BE=D1=80=D0=BE=D0=BC = (=D0=B2=D1=8B=D0=B3=D0=BE=D0=B4=D0=BE=D0=BF=D1=80=D0=B8=D0=BE=D0=B1=D1=80= =D0=B5=D1=82=D0=B0=D1=82=D0=B5=D0=BB=D1=8C-=D0=97=D0=B0=D0=BA=D0=B0=D0=B7= =D1=87=D0=B8=D0=BA). 2. =D0=9D=D0=BE=D0=B2=D1=8B=D0=B5 = =D0=BE=D0=B1=D1=8F=D0=B7=D0=B0=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=82=D0=BE=D1=80=D0=B0-=D0=BF= =D0=BE=D1=81=D1=80=D0=B5=D0=B4=D0=BD=D0=B8=D0=BA=D0=B0 =D1=81 2016 = =D0=B3=D0=BE=D0=B4=D0=B0 = (=D1=81=D0=BF=D0=B5=D1=86=D0=B8=D1=84=D0=B8=D0=BA=D0=B0 = =D0=BE=D1=84=D0=BE=D1=80=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F = =D1=81=D1=87=D0=B5=D1=82=D0=BE=D0=B2- =D1=84=D0=B0=D0=BA=D1=82=D1=83=D1=80 (=D0=B2 = =D1=82=D0=BE=D0=BC =D1=87=D0=B8=D1=81=D0=BB=D0=B5 = =D1=81=D0=B2=D0=BE=D0=B4=D0=BD=D1=8B=D1=85), = =D0=B6=D1=83=D1=80=D0=BD=D0=B0=D0=BB=D1=8B = =D0=B2=D1=8B=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BD=D1=8B=D1=85 = =D0=B8 =D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=BD=D1=8B=D1=85 = =D1=81=D1=87=D0=B5=D1=82=D0=BE=D0=B2-=D1=84=D0=B0=D0=BA=D1=82=D1=83=D1=80= , =D0=BA=D0=BD=D0=B8=D0=B3=D0=B8 = =D0=BF=D0=BE=D0=BA=D1=83=D0=BF=D0=BE=D0=BA=20 =D0=B8 =D0=BF=D1=80=D0=BE=D0=B4=D0=B0=D0=B6). 3. =D0=9E = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0= =BD=D0=B8=D0=B8 = =D0=B2=D0=BE=D0=B7=D0=BD=D0=B0=D0=B3=D1=80=D0=B0=D0=B6=D0=B4=D0=B5=D0=BD=D0= =B8=D1=8F = =D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=82=D0=BE=D1=80=D0=B0 = (=D0=9D=D0=94=D0=A1, = =D1=81=D1=87=D0=B5=D1=82=D0=B0-=D1=84=D0=B0=D0=BA=D1=82=D1=83=D1=80=D1=8B= , =D0=BA=D0=BD=D0=B8=D0=B3=D0=B8 =D0=BF=D1=80=D0=BE=D0=B4=D0=B0=D0=B6). 4. =D0=9E =D0=BF=D0=BE=D1=80=D1=8F=D0=B4=D0=BA=D0=B5 = =D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F = =D0=BC=D0=B5=D1=81=D1=82=D0=B0 = =D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8 =D0=B2 = =D0=BE=D1=82=D0=BD=D0=BE=D1=88=D0=B5=D0=BD=D0=B8=D0=B8 = =D1=83=D1=81=D0=BB=D1=83=D0=B3, = =D1=81=D0=B2=D1=8F=D0=B7=D0=B0=D0=BD=D0=BD=D1=8B=D1=85 =D1=81 = =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BA=D0=BE=D0=B9 =D0=B8 = (=D0=B8=D0=BB=D0=B8)=20 = =D1=82=D1=80=D0=B0=D0=BD=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=B8=D1=80=D0=BE=D0= =B2=D0=BA=D0=BE=D0=B9, = =D0=BE=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0=D0=B5=D0=BC=D1=8B=D1=85 = =D1=80=D0=BE=D1=81=D1=81=D0=B8=D0=B9=D1=81=D0=BA=D0=B8=D0=BC=D0=B8 = =D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=D0=BC=D0= =B8. 5. =D0=9A=D0=BE=D0=B3=D0=B4=D0=B0 = =D1=80=D0=BE=D1=81=D1=81=D0=B8=D0=B9=D1=81=D0=BA=D0=B8=D0=B9 = =D0=B7=D0=B0=D0=BA=D0=B0=D0=B7=D1=87=D0=B8=D0=BA = =D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=B8=D1=82=D1=81=D1=8F = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=D1=8B=D0=BC = =D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=BE=D0=BC =D0=BF=D0=BE = =D0=9D=D0=94=D0=A1. = =D0=91=D1=83=D1=85=D0=B3=D0=B0=D0=BB=D1=82=D0=B5=D1=80=D1=81=D0=BA=D0=B8=D0= =B5 =D0=BF=D1=80=D0=BE=D0=B2=D0=BE=D0=B4=D0=BA=D0=B8 =D0=BF=D0=BE=20 =D0=9D=D0=94=D0=A1 =D0=B4=D0=BB=D1=8F = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=D1=8B=D1=85 = =D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=BE=D0=B2. = =D0=A1=D1=87=D0=B5=D1=82=D0=B0-=D1=84=D0=B0=D0=BA=D1=82=D1=83=D1=80=D1=8B= =D0=9A=D0=BD=D0=B8=D0=B3=D0=B8 = =D0=BF=D0=BE=D0=BA=D1=83=D0=BF=D0=BE=D0=BA =D0=B8 = =D0=BF=D1=80=D0=BE=D0=B4=D0=B0=D0=B6. = =D0=9F=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D1=8B. =D0=9A=D0=B0=D0=BA = =D1=81=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=B8=D1=82=D1=8C =D0=B8=20 =D1=81=D0=B4=D0=B0=D1=82=D1=8C = =D0=B4=D0=B5=D0=BA=D0=BB=D0=B0=D1=80=D0=B0=D1=86=D0=B8=D1=8E = =D0=BF=D0=BE =D0=9D=D0=94=D0=A1 = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=D0=BE=D0=BC=D1=83 = =D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D1=83, = =D1=8F=D0=B2=D0=BB=D1=8F=D1=8E=D1=89=D0=B5=D0=BC=D1=83=D1=81=D1=8F = =D0=B8 =D0=BD=D0=B5 = =D1=8F=D0=B2=D0=BB=D1=8F=D1=8E=D1=89=D0=B5=D0=BC=D1=83=D1=81=D1=8F = =D0=BF=D0=BB=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D1=89=D0=B8=D0=BA=D0=BE=D0=BC = =D0=9D=D0=94=D0=A1 =D0=B2 2015 =D0=B3=D0=BE=D0=B4=D1=83. 6. = =D0=9E=D1=81=D0=BE=D0=B1=D0=B5=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0= =BD=D0=B8=D1=8F =D0=BF=D1=80=D0=B8 = =D0=BE=D0=BA=D0=B0=D0=B7=D0=B0=D0=BD=D0=B8=D0=B8 = =D1=82=D1=80=D0=B0=D0=BD=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=BD=D0=BE-=D1=8D= =D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1=8B=D1= =85 =D1=83=D1=81=D0=BB=D1=83=D0=B3 =D0=BF=D1=80=D0=B8=20 = =D0=BC=D0=B5=D0=B6=D0=B4=D1=83=D0=BD=D0=B0=D1=80=D0=BE=D0=B4=D0=BD=D0=BE=D0= =B9 =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BA=D0=B5 =D0=B8 = =D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D0=BB=D1=8C=D0=BD=D0= =BE=D0=B5 = =D0=BF=D0=BE=D0=B4=D1=82=D0=B2=D0=B5=D1=80=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D0= =B5 =D0=BD=D1=83=D0=BB=D0=B5=D0=B2=D0=BE=D0=B9 = =D1=81=D1=82=D0=B0=D0=B2=D0=BA=D0=B8 =D0=9D=D0=94=D0=A1. 7. = =D0=9D=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0= =BD=D0=B8=D0=B5 = =D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=82=D0=BE=D1=80=D1=81=D0=BA=D0= =B8=D1=85 =D1=83=D1=81=D0=BB=D1=83=D0=B3 =D0=B8 = =D0=BF=D1=80=D0=B5=D0=B4=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0= =B8=D0=B5 = =D0=B6=D0=B5=D0=BB=D0=B5=D0=B7=D0=BD=D0=BE=D0=B4=D0=BE=D1=80=D0=BE=D0=B6=D0= =BD=D0=BE=D0=B3=D0=BE = =D0=BF=D0=BE=D0=B4=D0=B2=D0=B8=D0=B6=D0=BD=D0=BE=D0=B3=D0=BE=20 =D1=81=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=B0 = =D0=B4=D0=BB=D1=8F = =D0=BE=D1=81=D1=83=D1=89=D0=B5=D1=81=D1=82=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1= =8F =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BE=D0=BA = =D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82=D0=BD=D0=BE=D0=B3=D0=BE =D0=B8 = =D1=8D=D0=BA=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=BD=D0=BE=D0=B3=D0=BE = =D1=82=D0=BE=D0=B2=D0=B0=D1=80=D0=B0 =D0=BF=D0=BE = =D1=82=D0=B5=D1=80=D1=80=D0=B8=D1=82=D0=BE=D1=80=D0=B8=D0=B8 = =D0=A0=D0=A4. 8. =D0=9D=D0=94=D0=A1 =D0=B2 = =D0=BE=D1=82=D0=BD=D0=BE=D1=88=D0=B5=D0=BD=D0=B8=D0=B8 = =D1=82=D1=80=D0=B0=D0=BD=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=BD=D0=BE-=D1=8D= =D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1=8B=D1= =85 =D1=83=D1=81=D0=BB=D1=83=D0=B3 =D0=B8 = =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BE=D0=BA =D0=B2 = =D0=9A=D1=80=D1=8B=D0=BC, = =D0=BE=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0=D0=B5=D0=BC=D1=8B=D1=85=20 = =D1=80=D0=BE=D1=81=D1=81=D0=B8=D0=B9=D1=81=D0=BA=D0=B8=D0=BC=D0=B8 = =D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=D0=BC=D0= =B8. 9. = =D0=AD=D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=82=D0=BE=D1=80 - = =C2=AB=D1=83=D0=BF=D1=80=D0=BE=D1=89=D0=B5=D0=BD=D0=B5=D1=86=C2=BB. = =D0=9E=D1=81=D0=BE=D0=B1=D0=B5=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0= =BD=D0=B8=D1=8F. 10. =D0=92=D0=BE=D0=BF=D1=80=D0=BE=D1=81=D1=8B = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0= =BD=D0=B8=D1=8F =D0=B8 = =D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=BE=D0=B1=D0=BE=D1= =80=D0=BE=D1=82=D0=B0 =D0=BF=D1=80=D0=B8 = =D0=B7=D0=B0=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B8 = =D0=B4=D0=BE=D0=B3=D0=BE=D0=B2=D0=BE=D1=80=D0=B0 = =D1=82=D1=80=D0=B0=D0=BD=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=BD=D0=BE=D0=B9 = = =D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=86=D0=B8=D0=B8 =D1=81 = =D0=B8=D0=BD=D1=82=D0=B5=D1=80=D0=BD=D0=B5=D1=82-=D0=BC=D0=B0=D0=B3=D0=B0= =D0=B7=D0=B8=D0=BD=D0=BE=D0=BC. 11. = =D0=9E=D1=81=D0=BE=D0=B1=D0=B5=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D1=81=D0=BA=D0=B8=D1=85 = =D0=B4=D0=BE=D0=B3=D0=BE=D0=B2=D0=BE=D1=80=D0=BE=D0=B2 =D1=81 = =D0=B8=D0=BD=D0=BE=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=BD=D1=8B=D0=BC=D0=B8 = =D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=82=D0=BE=D1=80=D1=81=D0=BA=D0= =B8=D0=BC=D0=B8 = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D1=8F=D0=BC=D0=B8. 12. =D0=9E=D1=81=D0=BD=D0=BE=D0=B2=D0=BD=D1=8B=D0=B5 = =D0=BF=D0=BE=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F = =D0=B4=D0=BE=D0=B3=D0=BE=D0=B2=D0=BE=D1=80=D0=B0 = =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BA=D0=B8. 13. =D0=9E = =D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D0=BB=D1=8C=D0=BD=D0= =BE=D0=BC = =D0=BF=D0=BE=D0=B4=D1=82=D0=B2=D0=B5=D1=80=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D0= =B8 =D0=B7=D0=B0=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F = =D0=B4=D0=BE=D0=B3=D0=BE=D0=B2=D0=BE=D1=80=D0=B0 = =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BA=D0=B8 = =D0=B3=D1=80=D1=83=D0=B7=D0=B0 =D0=B2 =D1=86=D0=B5=D0=BB=D1=8F=D1=85 = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=B0 =D0=BD=D0=B0=20 =D0=BF=D1=80=D0=B8=D0=B1=D1=8B=D0=BB=D1=8C. 14. =D0=9F=D1=80=D0=B5=D1=82=D0=B5=D0=BD=D0=B7=D0=B8=D0=B8 = =D0=B2 = =D0=BC=D0=B5=D0=B6=D0=B4=D1=83=D0=BD=D0=B0=D1=80=D0=BE=D0=B4=D0=BD=D0=BE=D0= =BC =D0=BC=D0=B0=D1=81=D1=88=D1=82=D0=B0=D0=B1=D0=B5 =D0=BA = =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D1=87=D0=B8=D0=BA=D0=B0=D0=BC = =D0=B8 = =D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=82=D0=BE=D1=80=D0=B0=D0=BC.= 15. = =D0=94=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D0=BB=D1=8C=D0=BD=D0= =BE=D0=B5 =D0=BE=D1=84=D0=BE=D1=80=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BE=D0=BA: CMP, = =D0=BA=D0=BE=D1=80=D0=BD=D0=B5=D1=82 TIR, = =D1=82=D0=B0=D0=BC=D0=BE=D0=B6=D0=B5=D0=BD=D0=BD=D0=B0=D1=8F = =D0=B4=D0=B5=D0=BA=D0=BB=D0=B0=D1=80=D0=B0=D1=86=D0=B8=D1=8F, = =D0=A2=D0=A2=D0=9D, =D1=81=D1=87=D0=B5=D1=82,=20 =D0=B0=D0=BA=D1=82 =D0=BE=D0=B1 = =D0=BE=D0=BA=D0=B0=D0=B7=D0=B0=D0=BD=D0=B8=D0=B8 = =D1=83=D1=81=D0=BB=D1=83=D0=B3, = =D1=81=D1=87=D0=B5=D1=82-=D1=84=D0=B0=D0=BA=D1=82=D1=83=D1=80=D0=B0 = =D0=B8 =D0=B4=D1=80. 16. = =D0=93=D0=BE=D1=81=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D1=8C = =D0=B7=D0=B0 = =D0=BC=D0=B5=D0=B6=D0=B4=D1=83=D0=BD=D0=B0=D1=80=D0=BE=D0=B4=D0=BD=D1=8B=D0= =BC=D0=B8 = =D0=B0=D0=B2=D1=82=D0=BE=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BA=D0= =B0=D0=BC=D0=B8: =D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8 =D0=BA = =D0=B7=D0=B0=D0=BA=D0=BE=D0=BD=D0=BE=D0=B4=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D1= =81=D1=82=D0=B2=D1=83. = =D0=A4=D0=B5=D0=B4=D0=B5=D1=80=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9 = =D0=B7=D0=B0=D0=BA=D0=BE=D0=BD =D0=BE=D1=82 24.11.2014 N = 362-=D0=A4=D0=97. 17. = =D0=9D=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0= =BD=D0=B8=D0=B5 = =D0=BC=D0=B5=D0=B6=D0=B4=D1=83=D0=BD=D0=B0=D1=80=D0=BE=D0=B4=D0=BD=D1=8B=D1= =85 =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BE=D0=BA = =D1=80=D0=BE=D1=81=D1=81=D0=B8=D0=B9=D1=81=D0=BA=D0=B8=D1=85 = =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D1=87=D0=B8=D0=BA=D0=BE=D0=B2.= 18. =D0=9E = =D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B8 = =D0=9D=D0=94=D0=A1 =D0=B2 = =D0=BE=D1=82=D0=BD=D0=BE=D1=88=D0=B5=D0=BD=D0=B8=D0=B8 = =D0=BF=D0=B5=D1=80=D0=B5=D1=81=D1=8B=D0=BB=D0=B0=D0=B5=D0=BC=D1=8B=D1=85 = =D0=B2 = =D0=BC=D0=B5=D0=B6=D0=B4=D1=83=D0=BD=D0=B0=D1=80=D0=BE=D0=B4=D0=BD=D0=BE=D0= =BC =D0=BF=D0=BE=D1=87=D1=82=D0=BE=D0=B2=D0=BE=D0=BC = =D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B8=20 =D1=82=D0=BE=D0=B2=D0=B0=D1=80=D0=BE=D0=B2, = =D0=BF=D0=BE=D0=BC=D0=B5=D1=89=D0=B5=D0=BD=D0=BD=D1=8B=D1=85 = =D0=BF=D0=BE=D0=B4 = =D1=82=D0=B0=D0=BC=D0=BE=D0=B6=D0=B5=D0=BD=D0=BD=D1=83=D1=8E = =D0=BF=D1=80=D0=BE=D1=86=D0=B5=D0=B4=D1=83=D1=80=D1=83 = =D1=8D=D0=BA=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=B0. 19. = =D0=9D=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0= =BD=D0=B8=D0=B5 =D1=83=D1=81=D0=BB=D1=83=D0=B3 =D0=BF=D0=BE = =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BA=D0=B5 = =D1=82=D0=BE=D0=B2=D0=B0=D1=80=D0=BE=D0=B2, = =D0=BF=D0=BE=D0=BC=D0=B5=D1=89=D0=B5=D0=BD=D0=BD=D1=8B=D1=85 = =D0=BF=D0=BE=D0=B4 = =D1=82=D0=B0=D0=BC=D0=BE=D0=B6=D0=B5=D0=BD=D0=BD=D1=83=D1=8E = =D0=BF=D1=80=D0=BE=D1=86=D0=B5=D0=B4=D1=83=D1=80=D1=83=20 = =D1=82=D0=B0=D0=BC=D0=BE=D0=B6=D0=B5=D0=BD=D0=BD=D0=BE=D0=B3=D0=BE = =D1=82=D1=80=D0=B0=D0=BD=D0=B7=D0=B8=D1=82=D0=B0. = =D0=9F=D1=80=D0=BE=D1=81=D1=82=D0=BE=D0=B9 = =D1=82=D1=80=D0=B0=D0=BD=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=BD=D1=8B=D1=85 = =D1=81=D1=80=D0=B5=D0=B4=D1=81=D1=82=D0=B2 =D0=B8 = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=D1=8B=D0=B9 = =D0=BF=D1=80=D0=BE=D0=B1=D0=BB=D0=B5=D0=BC=D1=8B. 20. =D0=94=D0=B5=D0=BC=D0=B5=D1=80=D0=B5=D0=B4=D0=B6, = =D1=83=D1=81=D0=BB=D1=83=D0=B3=D0=B8 =D0=BF=D0=BE = =D0=BF=D1=80=D0=B5=D0=B4=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0= =B8=D1=8E =D0=BA=D0=BE=D0=BD=D0=B2=D0=BE=D1=8F. = =D0=9D=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0= =BD=D0=B8=D0=B5. 21. =D0=9E =D1=80=D0=B0=D0=B7=D0=BC=D0=B5=D1=80=D0=B5 = =D1=81=D1=82=D0=B0=D0=B2=D0=BA=D0=B8 =D0=9D=D0=94=D0=A1 =D0=B2 = =D0=BE=D1=82=D0=BD=D0=BE=D1=88=D0=B5=D0=BD=D0=B8=D0=B8 = =D1=81=D1=83=D0=BC=D0=BC =D0=B4=D0=B8=D1=81=D0=BF=D0=B0=D1=87=D0=B0.=20 22. = =D0=9E=D1=81=D0=BE=D0=B1=D0=B5=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0= =BD=D0=B8=D1=8F =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BE=D0=BA = =D0=B2=D1=81=D0=B5=D0=BC=D0=B8 =D0=B2=D0=B8=D0=B4=D0=B0=D0=BC=D0=B8 = =D1=82=D1=80=D0=B0=D0=BD=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=B0 =D0=B8 = =D1=82=D1=80=D0=B0=D0=BD=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=BD=D0=BE- = =D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1= =8B=D0=B5 =D1=83=D1=81=D0=BB=D1=83=D0=B3=D0=B8 =D0=B2 = =D1=80=D0=B0=D0=BC=D0=BA=D0=B0=D1=85 = =D0=95=D0=B2=D1=80=D0=B0=D0=B7=D0=B8=D0=B9=D1=81=D0=BA=D0=BE=D0=B3=D0=BE = =D1=81=D0=BE=D1=8E=D0=B7=D0=B0 =D0=B2 2016 =D0=B3., =D0=B0 = =D1=82=D0=B0=D0=BA=D0=B6=D0=B5 =D0=BF=D1=80=D0=B8 = =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BA=D0=B0=D1=85 = =D1=87=D0=B5=D1=80=D0=B5=D0=B7=20 = =D1=82=D0=B5=D1=80=D1=80=D0=B8=D1=82=D0=BE=D1=80=D0=B8=D1=8E = =D0=A0=D0=A4. 23. =D0=9F=D0=BE=D0=B7=D0=B8=D1=86=D0=B8=D1=8F = =D0=9C=D0=B8=D0=BD=D1=84=D0=B8=D0=BD=D0=B0 =D0=BF=D0=BE = =D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=BC = =D0=B2=D0=BE=D0=BF=D1=80=D0=BE=D1=81=D0=B0=D0=BC, = =D1=81=D0=B2=D1=8F=D0=B7=D0=B0=D0=BD=D0=BD=D1=8B=D0=BC =D1=81 = =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BA=D0=B0=D0=BC=D0=B8 = =D0=B2=D0=BD=D1=83=D1=82=D1=80=D0=B8 = =D1=82=D0=B0=D0=BC=D0=BE=D0=B6=D0=B5=D0=BD=D0=BD=D0=BE=D0=B3=D0=BE=20 =D1=81=D0=BE=D1=8E=D0=B7=D0=B0. 24. =D0=9A=D0=B0=D0=BA = =D0=BF=D0=BB=D0=B0=D1=82=D0=B8=D1=82=D1=8C =D0=9D=D0=94=D0=A1, = =D0=B5=D1=81=D0=BB=D0=B8 = =D1=80=D0=BE=D1=81=D1=81=D0=B8=D0=B9=D1=81=D0=BA=D0=B0=D1=8F = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D1=8F = =D0=BE=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0=D0=B5=D1=82 = =D1=83=D1=81=D0=BB=D1=83=D0=B3=D0=B8 = =D0=B0=D0=B2=D1=82=D0=BE=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BA=D0= =B8 =D0=B8=D0=B7 =D0=91=D0=B5=D0=BB=D0=B0=D1=80=D1=83=D1=81=D0=B8=D0=B8 = =D0=B2=20 =D0=95=D0=B2=D1=80=D0=BE=D1=81=D0=BE=D1=8E=D0=B7. 25. =D0=9E = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0= =BD=D0=B8=D0=B8 =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=BC =D0=BD=D0=B0 = =D0=BF=D1=80=D0=B8=D0=B1=D1=8B=D0=BB=D1=8C = =D0=B4=D0=BE=D1=85=D0=BE=D0=B4=D0=BE=D0=B2 = =D0=B8=D0=BD=D0=BE=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=BD=D0=BE=D0=B9 = =D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8 = =D0=BE=D1=82 = =D0=BC=D0=B5=D0=B6=D0=B4=D1=83=D0=BD=D0=B0=D1=80=D0=BE=D0=B4=D0=BD=D1=8B=D1= =85=20 =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BE=D0=BA = =D0=B8 = =D1=81=D0=BE=D0=BF=D1=80=D0=BE=D0=B2=D0=BE=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D1= =8F =D0=B3=D1=80=D1=83=D0=B7=D0=BE=D0=B2. 26. =D0=9E=D0=B1 = =D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D0=B8 = =D1=80=D0=BE=D1=81=D1=81=D0=B8=D0=B9=D1=81=D0=BA=D0=BE=D0=B9 = =D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B5=D0=B9 = =D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B9 = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE = =D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=B0 =D0=BF=D1=80=D0=B8 = =D0=B2=D1=8B=D0=BF=D0=BB=D0=B0=D1=82=D0=B5 = =D0=B4=D0=BE=D1=85=D0=BE=D0=B4=D0=B0 =D0=BE=D1=82=20 =D0=BE=D0=BA=D0=B0=D0=B7=D0=B0=D0=BD=D0=B8=D1=8F = =D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=82=D0=BE=D1=80=D1=81=D0=BA=D0= =B8=D1=85 =D1=83=D1=81=D0=BB=D1=83=D0=B3 = =D0=B8=D0=BD=D0=BE=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=BD=D0=BE=D0=B9 = =D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8. =D0=A1=D1=82=D0=BE=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D1=8C = =D1=83=D1=87=D0=B0=D1=81=D1=82=D0=B8=D1=8F: 11 800 =D1=80=D1=83=D0=B1. =D0=92 = =D1=81=D1=82=D0=BE=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D1=8C = =D0=B2=D1=85=D0=BE=D0=B4=D0=B8=D1=82 = =D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B9 = =D0=BC=D0=B0=D1=82=D0=B5=D1=80=D0=B8=D0=B0=D0=BB, = =D0=BE=D0=B1=D0=B5=D0=B4=D1=8B, = =D0=BA=D0=BE=D1=84=D0=B5-=D0=BF=D0=B0=D1=83=D0=B7=D1=8B, = =D1=81=D0=B5=D1=80=D1=82=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=82. =20 =20 =20 =20 ------=_NextPart_000_00D8_01D19BB7.7167BF00 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable
           
     


    25 =D0=B0=D0=BF=D1=80=D0=B5=D0=BB=D1=8F  
    =D0=90=D1=80=D1= =82=D0=B8=D0=BA=D1=83=D0=BB=20 : 373


    =D0=A2=D0=A0=D0=90=D0=9D=D0=A1=D0=9F=D0=9E=D0=A0=D0=A2=D0=9D=D0=9E= -=D0=AD=D0=9A=D0=A1=D0=9F=D0=95=D0=94=D0=98=D0=A6=D0=98=D0=9E=D0=9D=D0=9D= =D0=90=D0=AF=20 = =D0=94=D0=95=D0=AF=D0=A2=D0=95=D0=9B=D0=AC=D0=9D=D0=9E=D0=A1=D0=A2=D0=AC = =D0=98 =D0=9F=D0=95=D0=A0=D0=95=D0=92=D0=9E=D0=97=D0=9A=D0=98 = =D0=92 
    =D0=A1=D0=9E=D0=92=D0=A0=D0= =95=D0=9C=D0=95=D0=9D=D0=9D=D0=9E=D0=99=20 =D0=A0=D0=9E=D0=A1=D0=A1=D0=98=D0=98 =D0=92 2016 = =D0=93=D0=9E=D0=94=D0=A3. =D0=9D=D0=9E=D0=92=D0=AB=D0=95 = =D0=9F=D0=A0=D0=98=D0=9D=D0=A6=D0=98=D0=9F=D0=AB = =D0=9D=D0=90=D0=9B=D0=9E=D0=93=D0=9E=D0=92=D0=9E=D0=93=D0=9E =D0=98 
    =D0=92=D0=90=D0=9B=D0=AE=D0= =A2=D0=9D=D0=9E=D0=93=D0=9E=20 = =D0=97=D0=90=D0=9A=D0=9E=D0=9D=D0=9E=D0=94=D0=90=D0=A2=D0=95=D0=9B=D0=AC=D0= =A1=D0=A2=D0=92=D0=90. = =D0=93=D0=9E=D0=A1=D0=9A=D0=9E=D0=9D=D0=A2=D0=A0=D0=9E=D0=9B=D0=AC.

    =D0=94=D0=BB=D1=8F: =D0=B3=D0=BB=D0=B0=D0=B2=D0=BD= =D1=8B=D1=85 = =D0=B1=D1=83=D1=85=D0=B3=D0=B0=D0=BB=D1=82=D0=B5=D1=80=D0=BE=D0=B2,=20 = =D0=B1=D1=83=D1=85=D0=B3=D0=B0=D0=BB=D1=82=D0=B5=D1=80=D0=BE=D0=B2, = =D0=B0=D1=83=D0=B4=D0=B8=D1=82=D0=BE=D1=80=D0=BE=D0=B2, = =D1=81=D0=BE=D1=82=D1=80=D1=83=D0=B4=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2 = =D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D0=BE=D0=B2 =D0=BF=D0=BE 
    =D0=BD=D0=B0=D0=BB=D0=BE=D0= =B3=D0=BE=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D1=8E,=20 = =D1=84=D0=B8=D0=BD=D0=B0=D0=BD=D1=81=D0=BE=D0=B2=D1=8B=D1=85 = =D0=B4=D0=B8=D1=80=D0=B5=D0=BA=D1=82=D0=BE=D1=80=D0=BE=D0=B2, = =D1=8E=D1=80=D0=B8=D1=81=D1=82=D0=BE=D0=B2, = =D1=80=D1=83=D0=BA=D0=BE=D0=B2=D0=BE=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D0=B5=D0= =B9 =D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B9 = =D0=B8=20 =D0=B4=D1=80=D1=83=D0=B3=D0=B8=D1=85 
    =D0=B7=D0=B0=D0=B8=D0=BD=D1= =82=D0=B5=D1=80=D0=B5=D1=81=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20 =D0=BB=D0=B8=D1=86.
     


    =D0=97=D0=B0=D0=BD=D1=8F=D1=82=D0=B8=D1=8F=20 =D0=B1=D1=83=D0=B4=D1=83=D1=82 = =D0=BF=D1=80=D0=BE=D0=B2=D0=BE=D0=B4=D0=B8=D1=82=D1=81=D1=8F: =D1=81 10.00=20 =D0=B4=D0=BE = 17.30

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

    =D0=A3=D0=B7=D0=BD=D0=B0=D1=82=D1=8C = =D0=BF=D0=BE=D0=B4=D1=80=D0=BE=D0=B1=D0=BD=D1=83=D1=8E=20 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D1=8E = =D0=BF=D0=BE =D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D0=B5 = =D0=B8 = =D0=B7=D0=B0=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B8=D1=80=D0=BE=D0= =B2=D0=B0=D1=82=D1=8C=D1=81=D1=8F =D0=92=D1=8B = =D0=BC=D0=BE=D0=B6=D0=B5=D1=82=D0=B5=20 =D0=BF=D0=BE = =D0=BD=D0=BE=D0=BC=D0=B5=D1=80=D1=83: 

    8
     =D0=BA=D0=BE=D0=B4 = =D0=B3=D0=BE=D1=80=D0=BE=D0=B4=D0=B0=20  / 4 9=20 5
     / =20 =D1=82=D0=B5=D0=BB=D0=B5=D1=84=D0=BE=D0=BD  961-00-38 (=D0=BC=D0=BD=D0=BE=D0=B3= =D0=BE=D0=BA=D0=B0=D0=BD=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9)
     

      
       
    =D0=9A=D1=80=D0=B0=D1=82=D0=BA=D0=BE=D0=B5 = =D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5=20 = =D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D1=8B:
    =
    1. =D0=A2=D1=80=D0=B0=D0=BD=D1=81= =D0=BF=D0=BE=D1=80=D1=82=D0=BD=D0=B0=D1=8F = =D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=86=D0=B8=D1=8F:=20 = =D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D0=BB=D1=8C=D0=BD=D0= =BE=D0=B5 =D0=BE=D1=84=D0=BE=D1=80=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5, = =D0=B1=D1=83=D1=85=D1=83=D1=87=D0=B5=D1=82 =D0=B8 = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0= =BD=D0=B8=D0=B5 =D0=B2 2016 
        =D0=B3=D0=BE=D0=B4=D1=83= =D0=9D=D0=BE=D0=B2=D1=8B=D0=B9 =D0=BF=D0=BE=D0=B4=D1=85=D0=BE=D0=B4 = =D0=BA=20 =D0=B2=D0=BE=D0=BF=D1=80=D0=BE=D1=81=D1=83 = =D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F = =D0=9D=D0=94=D0=A1 =D1=83=D1=81=D0=BB=D1=83=D0=B3 = =D1=82=D1=80=D0=B0=D0=BD=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=BD=D0=BE=D0=B9 = =D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=86=D0=B8=D0=B8=20 = (=D0=9F=D0=BE=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8= =D0=B5 
        =D0=9F=D0=BB=D0=B5=D0=BD= =D1=83=D0=BC=D0=B0 =D0=92=D0=90=D0=A1 =D0=A0=D0=A4 =D0=BE=D1=82=20 30.05.2014 N 33.). = =D0=9D=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=D1=8B=D0=B5 = =D0=BF=D0=BE=D1=81=D0=BB=D0=B5=D0=B4=D1=81=D1=82=D0=B2=D0=B8=D1=8F = =D0=B8 = =D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=BE=D0=B1=D0=BE=D1= =80=D0=BE=D1=82 =D0=B4=D0=BB=D1=8F=20 =D0=97=D0=B0=D0=BA=D0=B0=D0=B7=D1=87=D0=B8=D0=BA=D0=B0 = =D0=B8 
        =D0=AD=D0=BA=D1=81=D0=BF= =D0=B5=D0=B4=D0=B8=D1=82=D0=BE=D1=80=D0=B0 =D0=BF=D1=80=D0=B8=20 = =D1=81=D1=82=D1=80=D0=B0=D1=85=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B8 = =D0=B3=D1=80=D1=83=D0=B7=D0=B0 = =D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=82=D0=BE=D1=80=D0=BE=D0=BC = = (=D0=B2=D1=8B=D0=B3=D0=BE=D0=B4=D0=BE=D0=BF=D1=80=D0=B8=D0=BE=D0=B1=D1=80= =D0=B5=D1=82=D0=B0=D1=82=D0=B5=D0=BB=D1=8C-=D0=97=D0=B0=D0=BA=D0=B0=D0=B7= =D1=87=D0=B8=D0=BA).
    2. =D0=9D=D0=BE=D0=B2=D1=8B=D0=B5= =D0=BE=D0=B1=D1=8F=D0=B7=D0=B0=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20 = =D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=82=D0=BE=D1=80=D0=B0-=D0=BF= =D0=BE=D1=81=D1=80=D0=B5=D0=B4=D0=BD=D0=B8=D0=BA=D0=B0 =D1=81 2016 = =D0=B3=D0=BE=D0=B4=D0=B0 = (=D1=81=D0=BF=D0=B5=D1=86=D0=B8=D1=84=D0=B8=D0=BA=D0=B0 = =D0=BE=D1=84=D0=BE=D1=80=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20 =D1=81=D1=87=D0=B5=D1=82=D0=BE=D0=B2-
        =D1=84=D0=B0=D0=BA=D1=82= =D1=83=D1=80 (=D0=B2 =D1=82=D0=BE=D0=BC =D1=87=D0=B8=D1=81=D0=BB=D0=B5=20 =D1=81=D0=B2=D0=BE=D0=B4=D0=BD=D1=8B=D1=85), = =D0=B6=D1=83=D1=80=D0=BD=D0=B0=D0=BB=D1=8B = =D0=B2=D1=8B=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BD=D1=8B=D1=85 = =D0=B8 =D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=BD=D1=8B=D1=85 = =D1=81=D1=87=D0=B5=D1=82=D0=BE=D0=B2-=D1=84=D0=B0=D0=BA=D1=82=D1=83=D1=80= , =D0=BA=D0=BD=D0=B8=D0=B3=D0=B8=20 =D0=BF=D0=BE=D0=BA=D1=83=D0=BF=D0=BE=D0=BA 
        =D0=B8=20 =D0=BF=D1=80=D0=BE=D0=B4=D0=B0=D0=B6).
    3. =D0=9E = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0= =BD=D0=B8=D0=B8=20 = =D0=B2=D0=BE=D0=B7=D0=BD=D0=B0=D0=B3=D1=80=D0=B0=D0=B6=D0=B4=D0=B5=D0=BD=D0= =B8=D1=8F = =D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=82=D0=BE=D1=80=D0=B0 = (=D0=9D=D0=94=D0=A1, = =D1=81=D1=87=D0=B5=D1=82=D0=B0-=D1=84=D0=B0=D0=BA=D1=82=D1=83=D1=80=D1=8B= , =D0=BA=D0=BD=D0=B8=D0=B3=D0=B8=20 =D0=BF=D1=80=D0=BE=D0=B4=D0=B0=D0=B6).
    4. =D0=9E = =D0=BF=D0=BE=D1=80=D1=8F=D0=B4=D0=BA=D0=B5 = =D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F = =D0=BC=D0=B5=D1=81=D1=82=D0=B0=20 =D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8 = =D0=B2 =D0=BE=D1=82=D0=BD=D0=BE=D1=88=D0=B5=D0=BD=D0=B8=D0=B8 = =D1=83=D1=81=D0=BB=D1=83=D0=B3, = =D1=81=D0=B2=D1=8F=D0=B7=D0=B0=D0=BD=D0=BD=D1=8B=D1=85 =D1=81 = =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BA=D0=BE=D0=B9 =D0=B8 = (=D0=B8=D0=BB=D0=B8) 
        =D1=82=D1=80=D0=B0=D0=BD= =D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=BE=D0=B9,= =20 = =D0=BE=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0=D0=B5=D0=BC=D1=8B=D1=85 = =D1=80=D0=BE=D1=81=D1=81=D0=B8=D0=B9=D1=81=D0=BA=D0=B8=D0=BC=D0=B8 = =D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=D0=BC=D0= =B8.
    5. =D0=9A=D0=BE=D0=B3=D0=B4=D0=B0= =D1=80=D0=BE=D1=81=D1=81=D0=B8=D0=B9=D1=81=D0=BA=D0=B8=D0=B9 = =D0=B7=D0=B0=D0=BA=D0=B0=D0=B7=D1=87=D0=B8=D0=BA=20 =D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=B8=D1=82=D1=81=D1=8F = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=D1=8B=D0=BC = =D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=BE=D0=BC =D0=BF=D0=BE = =D0=9D=D0=94=D0=A1. = =D0=91=D1=83=D1=85=D0=B3=D0=B0=D0=BB=D1=82=D0=B5=D1=80=D1=81=D0=BA=D0=B8=D0= =B5 =D0=BF=D1=80=D0=BE=D0=B2=D0=BE=D0=B4=D0=BA=D0=B8 =D0=BF=D0=BE 
        =D0=9D=D0=94=D0=A1 = =D0=B4=D0=BB=D1=8F = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=D1=8B=D1=85=20 =D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=BE=D0=B2. = =D0=A1=D1=87=D0=B5=D1=82=D0=B0-=D1=84=D0=B0=D0=BA=D1=82=D1=83=D1=80=D1=8B= =D0=9A=D0=BD=D0=B8=D0=B3=D0=B8 = =D0=BF=D0=BE=D0=BA=D1=83=D0=BF=D0=BE=D0=BA =D0=B8 = =D0=BF=D1=80=D0=BE=D0=B4=D0=B0=D0=B6. = =D0=9F=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D1=8B. =D0=9A=D0=B0=D0=BA=20 =D1=81=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=B8=D1=82=D1=8C = =D0=B8 
        =D1=81=D0=B4=D0=B0=D1=82= =D1=8C =D0=B4=D0=B5=D0=BA=D0=BB=D0=B0=D1=80=D0=B0=D1=86=D0=B8=D1=8E = =D0=BF=D0=BE=20 =D0=9D=D0=94=D0=A1 = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=D0=BE=D0=BC=D1=83 = =D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D1=83, = =D1=8F=D0=B2=D0=BB=D1=8F=D1=8E=D1=89=D0=B5=D0=BC=D1=83=D1=81=D1=8F = =D0=B8 =D0=BD=D0=B5 = =D1=8F=D0=B2=D0=BB=D1=8F=D1=8E=D1=89=D0=B5=D0=BC=D1=83=D1=81=D1=8F=20 = =D0=BF=D0=BB=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D1=89=D0=B8=D0=BA=D0=BE=D0=BC<= SPAN class=3DApple-converted-space> 
        =D0=9D=D0=94=D0=A1 = =D0=B2 2015=20 =D0=B3=D0=BE=D0=B4=D1=83.
    6. =D0=9E=D1=81=D0=BE=D0=B1=D0=B5= =D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0= =BD=D0=B8=D1=8F=20 =D0=BF=D1=80=D0=B8 = =D0=BE=D0=BA=D0=B0=D0=B7=D0=B0=D0=BD=D0=B8=D0=B8 = =D1=82=D1=80=D0=B0=D0=BD=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=BD=D0=BE-=D1=8D= =D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1=8B=D1= =85 =D1=83=D1=81=D0=BB=D1=83=D0=B3 =D0=BF=D1=80=D0=B8 
        =D0=BC=D0=B5=D0=B6=D0=B4= =D1=83=D0=BD=D0=B0=D1=80=D0=BE=D0=B4=D0=BD=D0=BE=D0=B9=20 =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BA=D0=B5 = =D0=B8 = =D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D0=BB=D1=8C=D0=BD=D0= =BE=D0=B5 = =D0=BF=D0=BE=D0=B4=D1=82=D0=B2=D0=B5=D1=80=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D0= =B5 =D0=BD=D1=83=D0=BB=D0=B5=D0=B2=D0=BE=D0=B9 = =D1=81=D1=82=D0=B0=D0=B2=D0=BA=D0=B8=20 =D0=9D=D0=94=D0=A1.
    7. =D0=9D=D0=B0=D0=BB=D0=BE=D0=B3= =D0=BE=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20 = =D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=82=D0=BE=D1=80=D1=81=D0=BA=D0= =B8=D1=85 =D1=83=D1=81=D0=BB=D1=83=D0=B3 =D0=B8 = =D0=BF=D1=80=D0=B5=D0=B4=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0= =B8=D0=B5 = =D0=B6=D0=B5=D0=BB=D0=B5=D0=B7=D0=BD=D0=BE=D0=B4=D0=BE=D1=80=D0=BE=D0=B6=D0= =BD=D0=BE=D0=B3=D0=BE=20 = =D0=BF=D0=BE=D0=B4=D0=B2=D0=B8=D0=B6=D0=BD=D0=BE=D0=B3=D0=BE 
        =D1=81=D0=BE=D1=81=D1=82= =D0=B0=D0=B2=D0=B0 =D0=B4=D0=BB=D1=8F=20 = =D0=BE=D1=81=D1=83=D1=89=D0=B5=D1=81=D1=82=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1= =8F =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BE=D0=BA = =D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82=D0=BD=D0=BE=D0=B3=D0=BE =D0=B8 = =D1=8D=D0=BA=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=BD=D0=BE=D0=B3=D0=BE = =D1=82=D0=BE=D0=B2=D0=B0=D1=80=D0=B0 =D0=BF=D0=BE=20 =D1=82=D0=B5=D1=80=D1=80=D0=B8=D1=82=D0=BE=D1=80=D0=B8=D0=B8 = =D0=A0=D0=A4.
    8. =D0=9D=D0=94=D0=A1 =D0=B2 = =D0=BE=D1=82=D0=BD=D0=BE=D1=88=D0=B5=D0=BD=D0=B8=D0=B8=20 = =D1=82=D1=80=D0=B0=D0=BD=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=BD=D0=BE-=D1=8D= =D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1=8B=D1= =85 =D1=83=D1=81=D0=BB=D1=83=D0=B3 =D0=B8 = =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BE=D0=BA =D0=B2 = =D0=9A=D1=80=D1=8B=D0=BC,=20 = =D0=BE=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0=D0=B5=D0=BC=D1=8B=D1=85 
        =D1=80=D0=BE=D1=81=D1=81= =D0=B8=D0=B9=D1=81=D0=BA=D0=B8=D0=BC=D0=B8=20 = =D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=D0=BC=D0= =B8.
    9. =D0=AD=D0=BA=D1=81=D0=BF=D0=B5= =D0=B4=D0=B8=D1=82=D0=BE=D1=80 - = =C2=AB=D1=83=D0=BF=D1=80=D0=BE=D1=89=D0=B5=D0=BD=D0=B5=D1=86=C2=BB.=20 = =D0=9E=D1=81=D0=BE=D0=B1=D0=B5=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0= =BD=D0=B8=D1=8F.
    10. =D0=92=D0=BE=D0=BF=D1=80=D0=BE= =D1=81=D1=8B = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0= =BD=D0=B8=D1=8F =D0=B8=20 = =D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=BE=D0=B1=D0=BE=D1= =80=D0=BE=D1=82=D0=B0 =D0=BF=D1=80=D0=B8 = =D0=B7=D0=B0=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B8 = =D0=B4=D0=BE=D0=B3=D0=BE=D0=B2=D0=BE=D1=80=D0=B0 = =D1=82=D1=80=D0=B0=D0=BD=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=BD=D0=BE=D0=B9<= SPAN=20 class=3DApple-converted-space> 
          =D1=8D=D0=BA=D1=81=D0=BF= =D0=B5=D0=B4=D0=B8=D1=86=D0=B8=D0=B8 =D1=81=20 = =D0=B8=D0=BD=D1=82=D0=B5=D1=80=D0=BD=D0=B5=D1=82-=D0=BC=D0=B0=D0=B3=D0=B0= =D0=B7=D0=B8=D0=BD=D0=BE=D0=BC.
    11. =D0=9E=D1=81=D0=BE=D0=B1=D0=B5= =D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D1=81=D0=BA=D0=B8=D1=85=20 =D0=B4=D0=BE=D0=B3=D0=BE=D0=B2=D0=BE=D1=80=D0=BE=D0=B2 = =D1=81 = =D0=B8=D0=BD=D0=BE=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=BD=D1=8B=D0=BC=D0=B8 = =D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=82=D0=BE=D1=80=D1=81=D0=BA=D0= =B8=D0=BC=D0=B8 = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D1=8F=D0=BC=D0=B8.
    12. =D0=9E=D1=81=D0=BD=D0=BE=D0=B2= =D0=BD=D1=8B=D0=B5 = =D0=BF=D0=BE=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F = =D0=B4=D0=BE=D0=B3=D0=BE=D0=B2=D0=BE=D1=80=D0=B0=20 = =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BA=D0=B8.
    13. =D0=9E = =D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D0=BB=D1=8C=D0=BD=D0= =BE=D0=BC=20 = =D0=BF=D0=BE=D0=B4=D1=82=D0=B2=D0=B5=D1=80=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D0= =B8 =D0=B7=D0=B0=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F = =D0=B4=D0=BE=D0=B3=D0=BE=D0=B2=D0=BE=D1=80=D0=B0 = =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BA=D0=B8 = =D0=B3=D1=80=D1=83=D0=B7=D0=B0 =D0=B2 =D1=86=D0=B5=D0=BB=D1=8F=D1=85 = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=B0=20 =D0=BD=D0=B0 
          =D0=BF=D1=80=D0=B8=D0=B1= =D1=8B=D0=BB=D1=8C.
    14. =D0=9F=D1=80=D0=B5=D1=82=D0=B5= =D0=BD=D0=B7=D0=B8=D0=B8 =D0=B2 = =D0=BC=D0=B5=D0=B6=D0=B4=D1=83=D0=BD=D0=B0=D1=80=D0=BE=D0=B4=D0=BD=D0=BE=D0= =BC=20 =D0=BC=D0=B0=D1=81=D1=88=D1=82=D0=B0=D0=B1=D0=B5 =D0=BA = =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D1=87=D0=B8=D0=BA=D0=B0=D0=BC = =D0=B8 = =D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=82=D0=BE=D1=80=D0=B0=D0=BC.=
    15. =D0=94=D0=BE=D0=BA=D1=83=D0=BC= =D0=B5=D0=BD=D1=82=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B5 = =D0=BE=D1=84=D0=BE=D1=80=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20 =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BE=D0=BA: CMP, = =D0=BA=D0=BE=D1=80=D0=BD=D0=B5=D1=82 TIR, = =D1=82=D0=B0=D0=BC=D0=BE=D0=B6=D0=B5=D0=BD=D0=BD=D0=B0=D1=8F = =D0=B4=D0=B5=D0=BA=D0=BB=D0=B0=D1=80=D0=B0=D1=86=D0=B8=D1=8F, = =D0=A2=D0=A2=D0=9D, =D1=81=D1=87=D0=B5=D1=82, 
          =D0=B0=D0=BA=D1=82 = =D0=BE=D0=B1 =D0=BE=D0=BA=D0=B0=D0=B7=D0=B0=D0=BD=D0=B8=D0=B8=20 =D1=83=D1=81=D0=BB=D1=83=D0=B3, = =D1=81=D1=87=D0=B5=D1=82-=D1=84=D0=B0=D0=BA=D1=82=D1=83=D1=80=D0=B0 = =D0=B8 =D0=B4=D1=80.
    16. =D0=93=D0=BE=D1=81=D0=BA=D0=BE= =D0=BD=D1=82=D1=80=D0=BE=D0=BB=D1=8C =D0=B7=D0=B0=20 = =D0=BC=D0=B5=D0=B6=D0=B4=D1=83=D0=BD=D0=B0=D1=80=D0=BE=D0=B4=D0=BD=D1=8B=D0= =BC=D0=B8 = =D0=B0=D0=B2=D1=82=D0=BE=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BA=D0= =B0=D0=BC=D0=B8: =D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8 =D0=BA = = =D0=B7=D0=B0=D0=BA=D0=BE=D0=BD=D0=BE=D0=B4=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D1= =81=D1=82=D0=B2=D1=83.
         =  =D0=A4=D0=B5=D0=B4=D0=B5= =D1=80=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9 = =D0=B7=D0=B0=D0=BA=D0=BE=D0=BD =D0=BE=D1=82=20 24.11.2014 N 362-=D0=A4=D0=97.
    17. =D0=9D=D0=B0=D0=BB=D0=BE=D0=B3= =D0=BE=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20 = =D0=BC=D0=B5=D0=B6=D0=B4=D1=83=D0=BD=D0=B0=D1=80=D0=BE=D0=B4=D0=BD=D1=8B=D1= =85 =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BE=D0=BA = =D1=80=D0=BE=D1=81=D1=81=D0=B8=D0=B9=D1=81=D0=BA=D0=B8=D1=85 = =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D1=87=D0=B8=D0=BA=D0=BE=D0=B2.=
    18. =D0=9E = =D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B8 = =D0=9D=D0=94=D0=A1 =D0=B2=20 =D0=BE=D1=82=D0=BD=D0=BE=D1=88=D0=B5=D0=BD=D0=B8=D0=B8 = =D0=BF=D0=B5=D1=80=D0=B5=D1=81=D1=8B=D0=BB=D0=B0=D0=B5=D0=BC=D1=8B=D1=85 = =D0=B2 = =D0=BC=D0=B5=D0=B6=D0=B4=D1=83=D0=BD=D0=B0=D1=80=D0=BE=D0=B4=D0=BD=D0=BE=D0= =BC =D0=BF=D0=BE=D1=87=D1=82=D0=BE=D0=B2=D0=BE=D0=BC = =D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B8 
          =D1=82=D0=BE=D0=B2=D0=B0= =D1=80=D0=BE=D0=B2, = =D0=BF=D0=BE=D0=BC=D0=B5=D1=89=D0=B5=D0=BD=D0=BD=D1=8B=D1=85=20 =D0=BF=D0=BE=D0=B4 = =D1=82=D0=B0=D0=BC=D0=BE=D0=B6=D0=B5=D0=BD=D0=BD=D1=83=D1=8E = =D0=BF=D1=80=D0=BE=D1=86=D0=B5=D0=B4=D1=83=D1=80=D1=83 = =D1=8D=D0=BA=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=B0.
    19. =D0=9D=D0=B0=D0=BB=D0=BE=D0=B3= =D0=BE=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5 = =D1=83=D1=81=D0=BB=D1=83=D0=B3 =D0=BF=D0=BE=20 =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BA=D0=B5 = =D1=82=D0=BE=D0=B2=D0=B0=D1=80=D0=BE=D0=B2, = =D0=BF=D0=BE=D0=BC=D0=B5=D1=89=D0=B5=D0=BD=D0=BD=D1=8B=D1=85 = =D0=BF=D0=BE=D0=B4 = =D1=82=D0=B0=D0=BC=D0=BE=D0=B6=D0=B5=D0=BD=D0=BD=D1=83=D1=8E = =D0=BF=D1=80=D0=BE=D1=86=D0=B5=D0=B4=D1=83=D1=80=D1=83 
          =D1=82=D0=B0=D0=BC=D0=BE= =D0=B6=D0=B5=D0=BD=D0=BD=D0=BE=D0=B3=D0=BE=20 =D1=82=D1=80=D0=B0=D0=BD=D0=B7=D0=B8=D1=82=D0=B0. = =D0=9F=D1=80=D0=BE=D1=81=D1=82=D0=BE=D0=B9 = =D1=82=D1=80=D0=B0=D0=BD=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=BD=D1=8B=D1=85 = =D1=81=D1=80=D0=B5=D0=B4=D1=81=D1=82=D0=B2 =D0=B8 = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=D1=8B=D0=B9=20 = =D0=BF=D1=80=D0=BE=D0=B1=D0=BB=D0=B5=D0=BC=D1=8B.
    20. =D0=94=D0=B5=D0=BC=D0=B5=D1=80= =D0=B5=D0=B4=D0=B6, =D1=83=D1=81=D0=BB=D1=83=D0=B3=D0=B8 =D0=BF=D0=BE=20 = =D0=BF=D1=80=D0=B5=D0=B4=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0= =B8=D1=8E =D0=BA=D0=BE=D0=BD=D0=B2=D0=BE=D1=8F. = =D0=9D=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0= =BD=D0=B8=D0=B5.
    21. =D0=9E = =D1=80=D0=B0=D0=B7=D0=BC=D0=B5=D1=80=D0=B5 = =D1=81=D1=82=D0=B0=D0=B2=D0=BA=D0=B8 =D0=9D=D0=94=D0=A1 =D0=B2=20 =D0=BE=D1=82=D0=BD=D0=BE=D1=88=D0=B5=D0=BD=D0=B8=D0=B8 = =D1=81=D1=83=D0=BC=D0=BC = =D0=B4=D0=B8=D1=81=D0=BF=D0=B0=D1=87=D0=B0. 
    22. =D0=9E=D1=81=D0=BE=D0=B1=D0=B5= =D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0= =BD=D0=B8=D1=8F=20 =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BE=D0=BA = =D0=B2=D1=81=D0=B5=D0=BC=D0=B8 =D0=B2=D0=B8=D0=B4=D0=B0=D0=BC=D0=B8 = =D1=82=D1=80=D0=B0=D0=BD=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=B0 =D0=B8 = =D1=82=D1=80=D0=B0=D0=BD=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=BD=D0=BE-
          =D1=8D=D0=BA=D1=81=D0=BF= =D0=B5=D0=B4=D0=B8=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1=8B=D0=B5=20 =D1=83=D1=81=D0=BB=D1=83=D0=B3=D0=B8 =D0=B2 = =D1=80=D0=B0=D0=BC=D0=BA=D0=B0=D1=85 = =D0=95=D0=B2=D1=80=D0=B0=D0=B7=D0=B8=D0=B9=D1=81=D0=BA=D0=BE=D0=B3=D0=BE = =D1=81=D0=BE=D1=8E=D0=B7=D0=B0 =D0=B2 2016 =D0=B3., =D0=B0 = =D1=82=D0=B0=D0=BA=D0=B6=D0=B5 =D0=BF=D1=80=D0=B8 = =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BA=D0=B0=D1=85=20 =D1=87=D0=B5=D1=80=D0=B5=D0=B7 
          =D1=82=D0=B5=D1=80=D1=80= =D0=B8=D1=82=D0=BE=D1=80=D0=B8=D1=8E=20 =D0=A0=D0=A4.
    23. =D0=9F=D0=BE=D0=B7=D0=B8=D1=86= =D0=B8=D1=8F =D0=9C=D0=B8=D0=BD=D1=84=D0=B8=D0=BD=D0=B0 =D0=BF=D0=BE=20 =D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=BC = =D0=B2=D0=BE=D0=BF=D1=80=D0=BE=D1=81=D0=B0=D0=BC, = =D1=81=D0=B2=D1=8F=D0=B7=D0=B0=D0=BD=D0=BD=D1=8B=D0=BC =D1=81 = =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BA=D0=B0=D0=BC=D0=B8 = =D0=B2=D0=BD=D1=83=D1=82=D1=80=D0=B8 = =D1=82=D0=B0=D0=BC=D0=BE=D0=B6=D0=B5=D0=BD=D0=BD=D0=BE=D0=B3=D0=BE 
          =D1=81=D0=BE=D1=8E=D0=B7= =D0=B0.
    24. =D0=9A=D0=B0=D0=BA = =D0=BF=D0=BB=D0=B0=D1=82=D0=B8=D1=82=D1=8C =D0=9D=D0=94=D0=A1, = =D0=B5=D1=81=D0=BB=D0=B8=20 =D1=80=D0=BE=D1=81=D1=81=D0=B8=D0=B9=D1=81=D0=BA=D0=B0=D1=8F = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D1=8F = =D0=BE=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0=D0=B5=D1=82 = =D1=83=D1=81=D0=BB=D1=83=D0=B3=D0=B8 = =D0=B0=D0=B2=D1=82=D0=BE=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B7=D0=BA=D0= =B8 =D0=B8=D0=B7 =D0=91=D0=B5=D0=BB=D0=B0=D1=80=D1=83=D1=81=D0=B8=D0=B8=20 =D0=B2 
          =D0=95=D0=B2=D1=80=D0=BE= =D1=81=D0=BE=D1=8E=D0=B7.
    25. =D0=9E = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=B5=D0= =BD=D0=B8=D0=B8 =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=BC=20 =D0=BD=D0=B0 =D0=BF=D1=80=D0=B8=D0=B1=D1=8B=D0=BB=D1=8C = =D0=B4=D0=BE=D1=85=D0=BE=D0=B4=D0=BE=D0=B2 = =D0=B8=D0=BD=D0=BE=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=BD=D0=BE=D0=B9 = =D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8 = =D0=BE=D1=82 = =D0=BC=D0=B5=D0=B6=D0=B4=D1=83=D0=BD=D0=B0=D1=80=D0=BE=D0=B4=D0=BD=D1=8B=D1= =85 
          =D0=BF=D0=B5=D1=80=D0=B5= =D0=B2=D0=BE=D0=B7=D0=BE=D0=BA =D0=B8=20 = =D1=81=D0=BE=D0=BF=D1=80=D0=BE=D0=B2=D0=BE=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D1= =8F =D0=B3=D1=80=D1=83=D0=B7=D0=BE=D0=B2.
    26. =D0=9E=D0=B1 = =D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D0=B8 = =D1=80=D0=BE=D1=81=D1=81=D0=B8=D0=B9=D1=81=D0=BA=D0=BE=D0=B9=20 = =D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B5=D0=B9 = =D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B9 = =D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE = =D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=B0 =D0=BF=D1=80=D0=B8 = =D0=B2=D1=8B=D0=BF=D0=BB=D0=B0=D1=82=D0=B5 = =D0=B4=D0=BE=D1=85=D0=BE=D0=B4=D0=B0 =D0=BE=D1=82 
          =D0=BE=D0=BA=D0=B0=D0=B7= =D0=B0=D0=BD=D0=B8=D1=8F=20 = =D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D0=B4=D0=B8=D1=82=D0=BE=D1=80=D1=81=D0=BA=D0= =B8=D1=85 =D1=83=D1=81=D0=BB=D1=83=D0=B3 = =D0=B8=D0=BD=D0=BE=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=BD=D0=BE=D0=B9 = =D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8.

      =D0=A1=D1=82=D0=BE=D0=B8=D0= =BC=D0=BE=D1=81=D1=82=D1=8C = =D1=83=D1=87=D0=B0=D1=81=D1=82=D0=B8=D1=8F: 11 800=20 =D1=80=D1=83=D0=B1.
      =D0=92 = =D1=81=D1=82=D0=BE=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D1=8C = =D0=B2=D1=85=D0=BE=D0=B4=D0=B8=D1=82=20 = =D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B9 = =D0=BC=D0=B0=D1=82=D0=B5=D1=80=D0=B8=D0=B0=D0=BB, = =D0=BE=D0=B1=D0=B5=D0=B4=D1=8B, = =D0=BA=D0=BE=D1=84=D0=B5-=D0=BF=D0=B0=D1=83=D0=B7=D1=8B,=20 = =D1=81=D0=B5=D1=80=D1=82=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=82.

    <= /TD>  
           
    ------=_NextPart_000_00D8_01D19BB7.7167BF00-- From jtulak@redhat.com Thu Apr 21 04:22:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 9D9057CA0 for ; Thu, 21 Apr 2016 04:22:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 402BD304039 for ; Thu, 21 Apr 2016 02:22:28 -0700 (PDT) X-ASG-Debug-ID: 1461230542-04bdf03596338f0001-NocioJ Received: from mail-io0-f181.google.com (mail-io0-f181.google.com [209.85.223.181]) by cuda.sgi.com with ESMTP id nJ1whpoWXamI2eJh (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 21 Apr 2016 02:22:22 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.181 Received: by mail-io0-f181.google.com with SMTP id u185so79835395iod.3 for ; Thu, 21 Apr 2016 02:22:22 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=OPRnAUx5A5W3ifVQ7d2Xu2zoyHWex58W0/qdUbgJTgE=; b=HSNCOvBzuUyMP+6m0pK4/CjeLM0o3Vazi663K+McbidhAmcpBOTs38a911SoZG4H7n lLb6LZqV51bIZrWLOC5ZbbFrPkBSPx6t8y5DhL+8Fn6Nljqsx+bLmWLXErFsYYss9San zWzZR04px3SRiy7mlHlTNgugHcuoy0XkSKMqSuqAZEcnW12iVumCG2AczuecbThj7KWF TR14TzE4923/OuQvFdIDY1bPQz2W2ZxwpPwyje1W3BdiBaOFml5IthLBr4aaqYwe+Clw CsYrjlBMWlqyVY/CG1EV3vUD7cgExzPD9ToZ4bfai7jauJsnaDBl4qH/YHQH0IKL+/ar tydQ== X-Gm-Message-State: AOPr4FWskymCVgTOn0zHmAHdq8e6E90tpYQL4KVnqZdTgwDA+ukUNZdkYEwcbuLtYW+mdVROGjmUMANVMOx7POgj X-Received: by 10.107.9.232 with SMTP id 101mr7241914ioj.52.1461230541961; Thu, 21 Apr 2016 02:22:21 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.79 with HTTP; Thu, 21 Apr 2016 02:22:02 -0700 (PDT) In-Reply-To: <5717B3F7.2030904@sandeen.net> References: <1458818136-56043-1-git-send-email-jtulak@redhat.com> <1458818136-56043-16-git-send-email-jtulak@redhat.com> <5706FA7C.7020103@sandeen.net> <5717B3F7.2030904@sandeen.net> From: Jan Tulak Date: Thu, 21 Apr 2016 11:22:02 +0200 Message-ID: Subject: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices Cc: xfs-oss Content-Type: multipart/alternative; boundary=001a113ecdbe6396270530fb3ff4 X-Barracuda-Connect: mail-io0-f181.google.com[209.85.223.181] X-Barracuda-Start-Time: 1461230542 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8963 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28927 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 --001a113ecdbe6396270530fb3ff4 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Wed, Apr 20, 2016 at 6:53 PM, Eric Sandeen wrote: > On 4/20/16 9:17 AM, Jan Tulak wrote: > > =E2=80=8BI'm taking it back, one tests fails, most likely it happened w= hen I > > removed patch 17 - xfsprogs: disable truncating of files. If I do > > "mkfs.xfs $file", it doesn't know the old size to recreate it. I'm > > working on a change for this patch to fix this issue, but I'm not > > entirely certain how to proceed. The right place to get the size > > seems to be get_topology(). I could save it into xi.dsize, but then > > libxfs_init() zeroes it. > > > > So I think that I might rather convert the measured size do char > > *dsize and pretend that it is an user-given value. But this looks to > > me more like a hack. On the other side, any other way would require > > further changes in the code to convert the char* to int as soon as > > possible - which does not belong to this patch... > ... > > > So, what do you think about this? > > > > =E2=80=8B And before anyone will reply, I found that putting a > > platform_findsizes=E2=80=8B into libxfs_init will fix it too. Which is = nice, > > especially because for block devices, the findsizes is already used > > there. So ignore the previous hack. :-) > > Huh - if I take your original patchset and simply remove patch 17, > =E2=80=8Band revert this patch to the Dave's version. =E2=80=8B > I don't get any problems with "mkfs.xfs file" for an existing file, > it seems to work fine here. So it might be something else... > =E2=80=8BI bisected it and the issue was really caused by this patch in Dav= e's version. But luckily, the fix is as simple as: @@ -278,6 +278,8 @@ libxfs_init(libxfs_init_t *a) a->ddev=3D libxfs_device_open(dname, a->dcreat, fla= gs, a->setblksize); a->dfd =3D libxfs_device_to_fd(a->ddev); + platform_findsizes(dname, a->dfd, &a->dsize, + &a->dbsize); } else { if (!check_open(dname, flags, &rawfile, &blockfile)= ) goto done;=E2=80=8B =E2=80=8B(and dtto for log/rt variants).=E2=80=8B I'm going to send for review what I have, and work on the remaining issues in the meantime. Unless I find something else, the last thing to fix is that it changes the size of the file on -d size=3Dxxx, even when O_TRUNCATE is not used (that i= s, no -d file is specified). Old behaviour was to keep the file size and just don't use the entire file. This affects xfs/206 and xfs/216. Jan > > -Eric > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --001a113ecdbe6396270530fb3ff4 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
    On Wed, Ap= r 20, 2016 at 6:53 PM, Eric Sandeen <sandeen@sandeen.net> wrote:
    On 4/20/16 9:17 AM, Jan Tulak wro= te:
    > =E2=80=8BI'm taking it back, one tests fails, most likely it happe= ned when I
    > removed patch 17 - xfsprogs: disable truncating of files. If I do
    > "mkfs.xfs $file", it doesn't know the old size to recrea= te it. I'm
    > working on a change for this patch to fix this issue, but I'm not<= br> > entirely certain how to proceed. The right place to get the size
    > seems to be get_topology(). I could save it into xi.dsize, but then > libxfs_init() zeroes it.
    >
    > So I think that I might rather convert the measured size do char
    > *dsize and pretend that it is an user-given value. But this looks to > me more like a hack. On the other side, any other way would require > further changes in the code to convert the char* to int as soon as
    > possible - which does not belong to this patch...
    ...

    > So, what do you think about this?
    >
    > =E2=80=8B And before anyone will reply, I found that putting a
    > platform_findsizes=E2=80=8B into libxfs_init will fix it too. Which is= nice,
    > especially because for block devices, the findsizes is already used > there. So ignore the previous hack. :-)

    Huh - if I take your original patchset and simply remove patch 17,
    =E2=80=8Band revert this patch to the= Dave's version.
    =E2=80=8B
    =C2= =A0
    I don't get any problems with "mkfs.xfs file" for an existing= file,
    it seems to work fine here.=C2=A0 So it might be something else...

    =E2=80=8BI bisected it and the issue was rea= lly caused by this patch in Dave's version. But luckily, the fix is as = simple as:

    @@ -278,6 +278,8 @@ libxfs_init(libxfs_init= _t *a)
    =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 a->ddev=3D libxfs_device_open(dname, a->dcre= at, flags,
    =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 a->setblksize);
    =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 a->dfd =3D libxfs_device_to_fd(a->ddev);
    + =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 p= latform_findsizes(dname, a->dfd, &a->dsize,
    + =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 &a->dbsize);
    =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 } else {
    =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!check_open(dname, flags, &am= p;rawfile, &blockfile))
    =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 g= oto done;=E2=80=8B

    =E2=80=8B(and dtto for log/rt v= ariants).=E2=80=8B

    I'm going to send for review wh= at I have, and work on the remaining issues in the meantime.=C2=A0

    Unless I find something else, the last thing to fix is t= hat it changes the size of the file on -d size=3Dxxx, even when O_TRUNCATE = is not used (that is, no -d file is specified). Old behaviour was to keep t= he file size and just don't use the entire file. This affects xfs/206 a= nd xfs/216.

    Jan
    =C2=A0

    -Eric

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



    --
    =
    <= /div>
    --001a113ecdbe6396270530fb3ff4-- From jtulak@redhat.com Thu Apr 21 04:39:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A51D97CA1 for ; Thu, 21 Apr 2016 04:39:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7532630404E for ; Thu, 21 Apr 2016 02:39:57 -0700 (PDT) X-ASG-Debug-ID: 1461231595-04cbb00fe72d380001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DFLtEWqpKK9OGY5N (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 21 Apr 2016 02:39:56 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D517664075 for ; Thu, 21 Apr 2016 09:39:55 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3L9ds0D007155 for ; Thu, 21 Apr 2016 05:39:55 -0400 From: Jan Tulak To: xfs@oss.sgi.com Subject: [PATCH 00/19 v2] mkfs cleaning Date: Thu, 21 Apr 2016 11:39:34 +0200 X-ASG-Orig-Subj: [PATCH 00/19 v2] mkfs cleaning Message-Id: <1461231593-31294-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Thu, 21 Apr 2016 09:39:55 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461231596 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1776 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Updated version. Most notable changes are dropping of "xfsprogs: disable truncating of files", reverting "don't treat files as though they are block devices" back to Dave's version, and adding a new patch "mkfs: conflicting values with disabled crc should fail." Dave Chinner (15): xfsprogs: use common code for multi-disk detection mkfs: sanitise ftype parameter values. mkfs: Sanitise the superblock feature macros mkfs: validate all input values mkfs: factor boolean option parsing mkfs: validate logarithmic parameters sanely mkfs: structify input parameter passing mkfs: getbool is redundant mkfs: use getnum_checked for all ranged parameters mkfs: add respecification detection to generic parsing mkfs: table based parsing for converted parameters mkfs: merge getnum mkfs: encode conflicts into parsing table mkfs: add string options to generic parsing mkfs: don't treat files as though they are block devices Jan Tulak (4): mkfs: move spinodes crc check mkfs: unit conversions are case insensitive mkfs: add optional 'reason' for illegal_option mkfs: conflicting values with disabled crc should fail include/Makefile | 5 +- include/xfs_multidisk.h | 73 ++ libxfs/init.c | 6 + libxfs/linux.c | 11 +- man/man8/mkfs.xfs.8 | 45 +- mkfs/Makefile | 2 +- mkfs/maxtrres.c | 2 +- mkfs/proto.c | 58 +- mkfs/xfs_mkfs.c | 1983 +++++++++++++++++++++++++++++------------------ mkfs/xfs_mkfs.h | 89 --- repair/xfs_repair.c | 44 +- 11 files changed, 1417 insertions(+), 901 deletions(-) create mode 100644 include/xfs_multidisk.h delete mode 100644 mkfs/xfs_mkfs.h -- 2.5.0 From jtulak@redhat.com Thu Apr 21 04:40:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 133407CA6 for ; Thu, 21 Apr 2016 04:40:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5812DAC006 for ; Thu, 21 Apr 2016 02:39:59 -0700 (PDT) X-ASG-Debug-ID: 1461231597-04cb6c09a1438c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id dYoOB010S6OPbnR9 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 21 Apr 2016 02:39:58 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 82DC162646 for ; Thu, 21 Apr 2016 09:39:57 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3L9ds0F007155 for ; Thu, 21 Apr 2016 05:39:57 -0400 From: Jan Tulak To: xfs@oss.sgi.com Subject: [PATCH 02/19] mkfs: sanitise ftype parameter values. Date: Thu, 21 Apr 2016 11:39:36 +0200 X-ASG-Orig-Subj: [PATCH 02/19] mkfs: sanitise ftype parameter values. Message-Id: <1461231593-31294-3-git-send-email-jtulak@redhat.com> In-Reply-To: <1461231593-31294-1-git-send-email-jtulak@redhat.com> References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 21 Apr 2016 09:39:57 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461231597 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 887 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner Because passing "-n ftype=2" should fail. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak --- UPDATE: * Remove a check for crc enabled with ftype - there is another one later on. As it was in the ftype handling, it failed if -m crc=0 was after ftype. --- mkfs/xfs_mkfs.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 5527b87..4be14da 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -1597,7 +1597,10 @@ main( reqval('n', nopts, N_FTYPE); if (nftype) respec('n', nopts, N_FTYPE); - dirftype = atoi(value); + c = atoi(value); + if (c < 0 || c > 1) + illegal(value, "n ftype"); + dirftype = c; nftype = 1; break; default: -- 2.5.0 From jtulak@redhat.com Thu Apr 21 04:40:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 56E4B7CAE for ; Thu, 21 Apr 2016 04:40:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 78BF4AC008 for ; Thu, 21 Apr 2016 02:39:59 -0700 (PDT) X-ASG-Debug-ID: 1461231596-04cb6c09a2438c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id yTPY2FijrTmZMht8 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 21 Apr 2016 02:39:57 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AB97D64064 for ; Thu, 21 Apr 2016 09:39:56 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3L9ds0E007155 for ; Thu, 21 Apr 2016 05:39:56 -0400 From: Jan Tulak To: xfs@oss.sgi.com Subject: [PATCH 01/19] xfsprogs: use common code for multi-disk detection Date: Thu, 21 Apr 2016 11:39:35 +0200 X-ASG-Orig-Subj: [PATCH 01/19] xfsprogs: use common code for multi-disk detection Message-Id: <1461231593-31294-2-git-send-email-jtulak@redhat.com> In-Reply-To: <1461231593-31294-1-git-send-email-jtulak@redhat.com> References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Thu, 21 Apr 2016 09:39:56 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461231597 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 15956 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner Both xfs_repair and mkfs.xfs need to agree on what is a "multidisk: configuration - mkfs for determining the AG count of the filesystem, repair for determining how to automatically parallelise it's execution. This requires a bunch of common defines that both mkfs and reapir need to share. In fact, most of the defines in xfs_mkfs.h could be shared with other programs (i.e. all the defaults mkfs uses) and so it is simplest to move xfs_mkfs.h to the shared include directory and add the new defines to it directly. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak Reviewed-by: Eric Sandeen --- CHANGELOG: * Some comments made clear --- include/Makefile | 5 ++- include/xfs_multidisk.h | 98 +++++++++++++++++++++++++++++++++++++++++++++++++ mkfs/Makefile | 2 +- mkfs/maxtrres.c | 2 +- mkfs/proto.c | 2 +- mkfs/xfs_mkfs.c | 57 ++++++++++++++-------------- mkfs/xfs_mkfs.h | 89 -------------------------------------------- repair/xfs_repair.c | 44 +++++++++++++++++++++- 8 files changed, 177 insertions(+), 122 deletions(-) create mode 100644 include/xfs_multidisk.h delete mode 100644 mkfs/xfs_mkfs.h diff --git a/include/Makefile b/include/Makefile index 6148756..5fb443a 100644 --- a/include/Makefile +++ b/include/Makefile @@ -33,13 +33,16 @@ LIBHFILES = libxfs.h \ xfs_log_recover.h \ xfs_metadump.h \ xfs_mount.h \ + xfs_quota_defs.h \ + xfs_sb.h \ + xfs_shared.h \ xfs_trace.h \ xfs_trans.h \ command.h \ input.h \ path.h \ project.h \ - platform_defs.h \ + platform_defs.h HFILES = handle.h \ jdm.h \ diff --git a/include/xfs_multidisk.h b/include/xfs_multidisk.h new file mode 100644 index 0000000..4b99992 --- /dev/null +++ b/include/xfs_multidisk.h @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2000-2001,2004-2005 Silicon Graphics, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __XFS_MULTIDISK_H__ +#define __XFS_MULTIDISK_H__ + +#define XFS_DFL_SB_VERSION_BITS \ + (XFS_SB_VERSION_NLINKBIT | \ + XFS_SB_VERSION_EXTFLGBIT | \ + XFS_SB_VERSION_DIRV2BIT) + +#define XFS_SB_VERSION_MKFS(crc,ia,dia,log2,attr1,sflag,ci,more) (\ + ((crc)||(ia)||(dia)||(log2)||(attr1)||(sflag)||(ci)||(more)) ? \ + (((crc) ? XFS_SB_VERSION_5 : XFS_SB_VERSION_4) | \ + ((ia) ? XFS_SB_VERSION_ALIGNBIT : 0) | \ + ((dia) ? XFS_SB_VERSION_DALIGNBIT : 0) | \ + ((log2) ? XFS_SB_VERSION_LOGV2BIT : 0) | \ + ((attr1) ? XFS_SB_VERSION_ATTRBIT : 0) | \ + ((sflag) ? XFS_SB_VERSION_SECTORBIT : 0) | \ + ((ci) ? XFS_SB_VERSION_BORGBIT : 0) | \ + ((more) ? XFS_SB_VERSION_MOREBITSBIT : 0) | \ + XFS_DFL_SB_VERSION_BITS | \ + 0 ) : XFS_SB_VERSION_1 ) + +#define XFS_SB_VERSION2_MKFS(crc, lazycount, attr2, projid32bit, parent, \ + ftype) (\ + ((lazycount) ? XFS_SB_VERSION2_LAZYSBCOUNTBIT : 0) | \ + ((attr2) ? XFS_SB_VERSION2_ATTR2BIT : 0) | \ + ((projid32bit) ? XFS_SB_VERSION2_PROJID32BIT : 0) | \ + ((parent) ? XFS_SB_VERSION2_PARENTBIT : 0) | \ + ((crc) ? XFS_SB_VERSION2_CRCBIT : 0) | \ + ((ftype) ? XFS_SB_VERSION2_FTYPE : 0) | \ + 0 ) + +#define XFS_DFL_BLOCKSIZE_LOG 12 /* 4096 byte blocks */ +#define XFS_DINODE_DFL_LOG 8 /* 256 byte inodes */ +#define XFS_DINODE_DFL_CRC_LOG 9 /* 512 byte inodes for CRCs */ +#define XFS_MIN_DATA_BLOCKS 100 +#define XFS_MIN_INODE_PERBLOCK 2 /* min inodes per block */ +#define XFS_DFL_IMAXIMUM_PCT 25 /* max % of space for inodes */ +#define XFS_IFLAG_ALIGN 1 /* -i align defaults on */ +#define XFS_MIN_REC_DIRSIZE 12 /* 4096 byte dirblocks (V2) */ +#define XFS_DFL_DIR_VERSION 2 /* default directory version */ +#define XFS_DFL_LOG_SIZE 1000 /* default log size, blocks */ +#define XFS_DFL_LOG_FACTOR 5 /* default log size, factor */ + /* with max trans reservation */ +#define XFS_MAX_INODE_SIG_BITS 32 /* most significant bits in an + * inode number that we'll + * accept w/o warnings + */ + +#define XFS_AG_BYTES(bblog) ((long long)BBSIZE << (bblog)) +#define XFS_AG_MIN_BYTES ((XFS_AG_BYTES(15))) /* 16 MB */ +#define XFS_AG_MIN_BLOCKS(blog) ((XFS_AG_BYTES(15)) >> (blog)) +#define XFS_AG_MAX_BLOCKS(blog) ((XFS_AG_BYTES(31) - 1) >> (blog)) + +#define XFS_MAX_AGNUMBER ((xfs_agnumber_t)(NULLAGNUMBER - 1)) + +/* + * These values define what we consider a "multi-disk" filesystem. That is, a + * filesystem that is likely to be made up of multiple devices, and hence have + * some level of parallelism available to it at the IO level. + */ +#define XFS_MULTIDISK_AGLOG 5 /* 32 AGs */ +#define XFS_NOMULTIDISK_AGLOG 2 /* 4 AGs */ +#define XFS_MULTIDISK_AGCOUNT (1 << XFS_MULTIDISK_AGLOG) + + +/* xfs_mkfs.c */ +extern int isdigits (char *str); +extern long long cvtnum (unsigned int blocksize, + unsigned int sectorsize, char *s); + +/* proto.c */ +extern char *setup_proto (char *fname); +extern void parse_proto (xfs_mount_t *mp, struct fsxattr *fsx, char **pp); +extern void res_failed (int err); + +/* maxtrres.c */ +extern int max_trans_res (int crcs_enabled, int dirversion, + int sectorlog, int blocklog, int inodelog, int dirblocklog, + int logversion, int log_sunit, int finobt); + +#endif /* __XFS_MULTIDISK_H__ */ diff --git a/mkfs/Makefile b/mkfs/Makefile index 570ab07..63ba4ec 100644 --- a/mkfs/Makefile +++ b/mkfs/Makefile @@ -7,7 +7,7 @@ include $(TOPDIR)/include/builddefs LTCOMMAND = mkfs.xfs -HFILES = xfs_mkfs.h +HFILES = CFILES = maxtrres.c proto.c xfs_mkfs.c LLDLIBS += $(LIBBLKID) $(LIBXFS) $(LIBUUID) $(LIBRT) $(LIBPTHREAD) diff --git a/mkfs/maxtrres.c b/mkfs/maxtrres.c index b97d020..f48a0f7 100644 --- a/mkfs/maxtrres.c +++ b/mkfs/maxtrres.c @@ -25,7 +25,7 @@ */ #include "libxfs.h" -#include "xfs_mkfs.h" +#include "xfs_multidisk.h" int max_trans_res( diff --git a/mkfs/proto.c b/mkfs/proto.c index d99e965..f3327d1 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -18,7 +18,7 @@ #include "libxfs.h" #include -#include "xfs_mkfs.h" +#include "xfs_multidisk.h" /* * Prototypes for internal functions. diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 4c3a802..5527b87 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -21,7 +21,7 @@ #ifdef ENABLE_BLKID # include #endif /* ENABLE_BLKID */ -#include "xfs_mkfs.h" +#include "xfs_multidisk.h" /* * Device topology information. @@ -664,43 +664,46 @@ calc_default_ag_geometry( } /* - * For the remainder we choose an AG size based on the - * number of data blocks available, trying to keep the - * number of AGs relatively small (especially compared - * to the original algorithm). AG count is calculated - * based on the preferred AG size, not vice-versa - the - * count can be increased by growfs, so prefer to use - * smaller counts at mkfs time. - * - * For a single underlying storage device between 128MB - * and 4TB in size, just use 4 AGs, otherwise scale up - * smoothly between min/max AG sizes. + * For a single underlying storage device over 4TB in size + * use the maximum AG size. Between 128MB and 4TB, just use + * 4 AGs and scale up smoothly between min/max AG sizes. */ - - if (!multidisk && dblocks >= MEGABYTES(128, blocklog)) { + if (!multidisk) { if (dblocks >= TERABYTES(4, blocklog)) { blocks = XFS_AG_MAX_BLOCKS(blocklog); goto done; + } else if (dblocks >= MEGABYTES(128, blocklog)) { + shift = XFS_NOMULTIDISK_AGLOG; + goto calc_blocks; } - shift = 2; - } else if (dblocks > GIGABYTES(512, blocklog)) - shift = 5; - else if (dblocks > GIGABYTES(8, blocklog)) - shift = 4; - else if (dblocks >= MEGABYTES(128, blocklog)) - shift = 3; - else if (dblocks >= MEGABYTES(64, blocklog)) - shift = 2; - else if (dblocks >= MEGABYTES(32, blocklog)) - shift = 1; - else - shift = 0; + } + + /* + * For the multidisk configs we choose an AG count based on the number + * of data blocks available, trying to keep the number of AGs higher + * than the single disk configurations. This makes the assumption that + * larger filesystems have more parallelism available to them. + */ + shift = XFS_MULTIDISK_AGLOG; + if (dblocks <= GIGABYTES(512, blocklog)) + shift--; + if (dblocks <= GIGABYTES(8, blocklog)) + shift--; + if (dblocks < MEGABYTES(128, blocklog)) + shift--; + if (dblocks < MEGABYTES(64, blocklog)) + shift--; + if (dblocks < MEGABYTES(32, blocklog)) + shift--; + /* * If dblocks is not evenly divisible by the number of * desired AGs, round "blocks" up so we don't lose the * last bit of the filesystem. The same principle applies * to the AG count, so we don't lose the last AG! */ +calc_blocks: + ASSERT(shift >= 0 && shift <= XFS_MULTIDISK_AGLOG); blocks = dblocks >> shift; if (dblocks & xfs_mask32lo(shift)) { if (blocks < XFS_AG_MAX_BLOCKS(blocklog)) diff --git a/mkfs/xfs_mkfs.h b/mkfs/xfs_mkfs.h deleted file mode 100644 index 128068e..0000000 --- a/mkfs/xfs_mkfs.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2000-2001,2004-2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_MKFS_H__ -#define __XFS_MKFS_H__ - -#define XFS_DFL_SB_VERSION_BITS \ - (XFS_SB_VERSION_NLINKBIT | \ - XFS_SB_VERSION_EXTFLGBIT | \ - XFS_SB_VERSION_DIRV2BIT) - -#define XFS_SB_VERSION_MKFS(crc,ia,dia,log2,attr1,sflag,ci,more) (\ - ((crc)||(ia)||(dia)||(log2)||(attr1)||(sflag)||(ci)||(more)) ? \ - (((crc) ? XFS_SB_VERSION_5 : XFS_SB_VERSION_4) | \ - ((ia) ? XFS_SB_VERSION_ALIGNBIT : 0) | \ - ((dia) ? XFS_SB_VERSION_DALIGNBIT : 0) | \ - ((log2) ? XFS_SB_VERSION_LOGV2BIT : 0) | \ - ((attr1) ? XFS_SB_VERSION_ATTRBIT : 0) | \ - ((sflag) ? XFS_SB_VERSION_SECTORBIT : 0) | \ - ((ci) ? XFS_SB_VERSION_BORGBIT : 0) | \ - ((more) ? XFS_SB_VERSION_MOREBITSBIT : 0) | \ - XFS_DFL_SB_VERSION_BITS | \ - 0 ) : XFS_SB_VERSION_1 ) - -#define XFS_SB_VERSION2_MKFS(crc, lazycount, attr2, projid32bit, parent, \ - ftype) (\ - ((lazycount) ? XFS_SB_VERSION2_LAZYSBCOUNTBIT : 0) | \ - ((attr2) ? XFS_SB_VERSION2_ATTR2BIT : 0) | \ - ((projid32bit) ? XFS_SB_VERSION2_PROJID32BIT : 0) | \ - ((parent) ? XFS_SB_VERSION2_PARENTBIT : 0) | \ - ((crc) ? XFS_SB_VERSION2_CRCBIT : 0) | \ - ((ftype) ? XFS_SB_VERSION2_FTYPE : 0) | \ - 0 ) - -#define XFS_DFL_BLOCKSIZE_LOG 12 /* 4096 byte blocks */ -#define XFS_DINODE_DFL_LOG 8 /* 256 byte inodes */ -#define XFS_DINODE_DFL_CRC_LOG 9 /* 512 byte inodes for CRCs */ -#define XFS_MIN_DATA_BLOCKS 100 -#define XFS_MIN_INODE_PERBLOCK 2 /* min inodes per block */ -#define XFS_DFL_IMAXIMUM_PCT 25 /* max % of space for inodes */ -#define XFS_IFLAG_ALIGN 1 /* -i align defaults on */ -#define XFS_MIN_REC_DIRSIZE 12 /* 4096 byte dirblocks (V2) */ -#define XFS_DFL_DIR_VERSION 2 /* default directory version */ -#define XFS_DFL_LOG_SIZE 1000 /* default log size, blocks */ -#define XFS_DFL_LOG_FACTOR 5 /* default log size, factor */ - /* with max trans reservation */ -#define XFS_MAX_INODE_SIG_BITS 32 /* most significant bits in an - * inode number that we'll - * accept w/o warnings - */ - -#define XFS_AG_BYTES(bblog) ((long long)BBSIZE << (bblog)) -#define XFS_AG_MIN_BYTES ((XFS_AG_BYTES(15))) /* 16 MB */ -#define XFS_AG_MIN_BLOCKS(blog) ((XFS_AG_BYTES(15)) >> (blog)) -#define XFS_AG_MAX_BLOCKS(blog) ((XFS_AG_BYTES(31) - 1) >> (blog)) - -#define XFS_MAX_AGNUMBER ((xfs_agnumber_t)(NULLAGNUMBER - 1)) - - -/* xfs_mkfs.c */ -extern int isdigits (char *str); -extern long long cvtnum (unsigned int blocksize, - unsigned int sectorsize, char *s); - -/* proto.c */ -extern char *setup_proto (char *fname); -extern void parse_proto (xfs_mount_t *mp, struct fsxattr *fsx, char **pp); -extern void res_failed (int err); - -/* maxtrres.c */ -extern int max_trans_res (int crcs_enabled, int dirversion, - int sectorlog, int blocklog, int inodelog, int dirblocklog, - int logversion, int log_sunit, int finobt); - -#endif /* __XFS_MKFS_H__ */ diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 5d5f3aa..9d91f2d 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -19,6 +19,7 @@ #include "libxfs.h" #include "libxlog.h" #include +#include "xfs_multidisk.h" #include "avl.h" #include "avl64.h" #include "globals.h" @@ -589,6 +590,33 @@ format_log_max_lsn( XLOG_FMT, new_cycle, true); } +/* + * mkfs increases the AG count for "multidisk" configurations, we want + * to target these for an increase in thread count. Hence check the superlock + * geometry information to determine if mkfs considered this a multidisk + * configuration. + */ +static bool +is_multidisk_filesystem( + struct xfs_mount *mp) +{ + struct xfs_sb *sbp = &mp->m_sb; + + /* High agcount filesystems are always considered "multidisk" */ + if (sbp->sb_agcount >= XFS_MULTIDISK_AGCOUNT) + return true; + + /* + * If it doesn't have a sunit/swidth, mkfs didn't consider it a + * multi-disk array, so we don't either. + */ + if (!sbp->sb_unit) + return false; + + ASSERT(sbp->sb_width); + return true; +} + int main(int argc, char **argv) { @@ -729,9 +757,21 @@ main(int argc, char **argv) * threads/CPU as this is enough threads to saturate a CPU on fast * devices, yet few enough that it will saturate but won't overload slow * devices. + * + * Multidisk filesystems can handle more IO parallelism so we should try + * to process multiple AGs at a time in such a configuration to try to + * saturate the underlying storage and speed the repair process. Only do + * this if prefetching is enabled. */ - if (!ag_stride && glob_agcount >= 16 && do_prefetch) - ag_stride = 15; + if (!ag_stride && do_prefetch && is_multidisk_filesystem(mp)) { + /* + * For small agcount multidisk systems, just double the + * parallelism. For larger AG count filesystems (32 and above) + * use more parallelism, and linearly increase the parallelism + * with the number of AGs. + */ + ag_stride = min(glob_agcount, XFS_MULTIDISK_AGCOUNT / 2) - 1; + } if (ag_stride) { int max_threads = platform_nproc() * 8; -- 2.5.0 From jtulak@redhat.com Thu Apr 21 04:40:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 018E47CB2 for ; Thu, 21 Apr 2016 04:40:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 760C88F8040 for ; Thu, 21 Apr 2016 02:40:01 -0700 (PDT) X-ASG-Debug-ID: 1461231598-04bdf03596348c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 3y0srM5EtbL0vuZb (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 21 Apr 2016 02:39:58 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7DB2D3E70A3 for ; Thu, 21 Apr 2016 09:39:58 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3L9ds0G007155 for ; Thu, 21 Apr 2016 05:39:57 -0400 From: Jan Tulak To: xfs@oss.sgi.com Subject: [PATCH 03/19] mkfs: Sanitise the superblock feature macros Date: Thu, 21 Apr 2016 11:39:37 +0200 X-ASG-Orig-Subj: [PATCH 03/19] mkfs: Sanitise the superblock feature macros Message-Id: <1461231593-31294-4-git-send-email-jtulak@redhat.com> In-Reply-To: <1461231593-31294-1-git-send-email-jtulak@redhat.com> References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461231598 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 23044 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner They are horrible macros that simply obfuscate the code, so let's factor the code and make them nice functions. To do this, add a sb_feat_args structure that carries around the variables rather than a strange assortment of variables. This means all the default can be clearly defined in a structure initialisation, and dependent feature bits are easy to check. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak --- UPDATE * if -m crc=0,finobt=1, simplify the condition * remove a check for -m crc, -n ftype conflict causing a bug * -i align should default to 1 is no value given --- include/xfs_multidisk.h | 25 +--- mkfs/xfs_mkfs.c | 295 +++++++++++++++++++++++++++++------------------- 2 files changed, 183 insertions(+), 137 deletions(-) diff --git a/include/xfs_multidisk.h b/include/xfs_multidisk.h index 4b99992..11d6233 100644 --- a/include/xfs_multidisk.h +++ b/include/xfs_multidisk.h @@ -23,36 +23,13 @@ XFS_SB_VERSION_EXTFLGBIT | \ XFS_SB_VERSION_DIRV2BIT) -#define XFS_SB_VERSION_MKFS(crc,ia,dia,log2,attr1,sflag,ci,more) (\ - ((crc)||(ia)||(dia)||(log2)||(attr1)||(sflag)||(ci)||(more)) ? \ - (((crc) ? XFS_SB_VERSION_5 : XFS_SB_VERSION_4) | \ - ((ia) ? XFS_SB_VERSION_ALIGNBIT : 0) | \ - ((dia) ? XFS_SB_VERSION_DALIGNBIT : 0) | \ - ((log2) ? XFS_SB_VERSION_LOGV2BIT : 0) | \ - ((attr1) ? XFS_SB_VERSION_ATTRBIT : 0) | \ - ((sflag) ? XFS_SB_VERSION_SECTORBIT : 0) | \ - ((ci) ? XFS_SB_VERSION_BORGBIT : 0) | \ - ((more) ? XFS_SB_VERSION_MOREBITSBIT : 0) | \ - XFS_DFL_SB_VERSION_BITS | \ - 0 ) : XFS_SB_VERSION_1 ) - -#define XFS_SB_VERSION2_MKFS(crc, lazycount, attr2, projid32bit, parent, \ - ftype) (\ - ((lazycount) ? XFS_SB_VERSION2_LAZYSBCOUNTBIT : 0) | \ - ((attr2) ? XFS_SB_VERSION2_ATTR2BIT : 0) | \ - ((projid32bit) ? XFS_SB_VERSION2_PROJID32BIT : 0) | \ - ((parent) ? XFS_SB_VERSION2_PARENTBIT : 0) | \ - ((crc) ? XFS_SB_VERSION2_CRCBIT : 0) | \ - ((ftype) ? XFS_SB_VERSION2_FTYPE : 0) | \ - 0 ) - #define XFS_DFL_BLOCKSIZE_LOG 12 /* 4096 byte blocks */ #define XFS_DINODE_DFL_LOG 8 /* 256 byte inodes */ #define XFS_DINODE_DFL_CRC_LOG 9 /* 512 byte inodes for CRCs */ #define XFS_MIN_DATA_BLOCKS 100 #define XFS_MIN_INODE_PERBLOCK 2 /* min inodes per block */ #define XFS_DFL_IMAXIMUM_PCT 25 /* max % of space for inodes */ -#define XFS_IFLAG_ALIGN 1 /* -i align defaults on */ +#define XFS_IFLAG_ALIGN true /* -i align defaults on */ #define XFS_MIN_REC_DIRSIZE 12 /* 4096 byte dirblocks (V2) */ #define XFS_DFL_DIR_VERSION 2 /* default directory version */ #define XFS_DFL_LOG_SIZE 1000 /* default log size, blocks */ diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 4be14da..963545b 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -880,6 +880,109 @@ discard_blocks(dev_t dev, __uint64_t nsectors) platform_discard_blocks(fd, 0, nsectors << 9); } +struct sb_feat_args { + int log_version; + int attr_version; + int dir_version; + int spinodes; + int finobt; + bool finobtflag; + bool inode_align; + bool nci; + bool lazy_sb_counters; + bool projid16bit; + bool crcs_enabled; + bool dirftype; + bool parent_pointers; +}; + +static void +sb_set_features( + struct xfs_sb *sbp, + struct sb_feat_args *fp, + int sectsize, + int lsectsize, + int dsunit) +{ + + sbp->sb_versionnum = XFS_DFL_SB_VERSION_BITS; + if (fp->crcs_enabled) + sbp->sb_versionnum |= XFS_SB_VERSION_5; + else + sbp->sb_versionnum |= XFS_SB_VERSION_4; + + if (fp->inode_align) + sbp->sb_versionnum |= XFS_SB_VERSION_ALIGNBIT; + if (dsunit) + sbp->sb_versionnum |= XFS_SB_VERSION_DALIGNBIT; + if (fp->log_version == 2) + sbp->sb_versionnum |= XFS_SB_VERSION_LOGV2BIT; + if (fp->attr_version == 1) + sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT; + if (sectsize > BBSIZE || lsectsize > BBSIZE) + sbp->sb_versionnum |= XFS_SB_VERSION_SECTORBIT; + if (fp->nci) + sbp->sb_versionnum |= XFS_SB_VERSION_BORGBIT; + + + sbp->sb_features2 = 0; + if (fp->lazy_sb_counters) + sbp->sb_features2 |= XFS_SB_VERSION2_LAZYSBCOUNTBIT; + if (!fp->projid16bit) + sbp->sb_features2 |= XFS_SB_VERSION2_PROJID32BIT; + if (fp->parent_pointers) + sbp->sb_features2 |= XFS_SB_VERSION2_PARENTBIT; + if (fp->crcs_enabled) + sbp->sb_features2 |= XFS_SB_VERSION2_CRCBIT; + if (fp->attr_version == 2) + sbp->sb_features2 |= XFS_SB_VERSION2_ATTR2BIT; + + /* v5 superblocks have their own feature bit for dirftype */ + if (fp->dirftype && !fp->crcs_enabled) + sbp->sb_features2 |= XFS_SB_VERSION2_FTYPE; + + /* update whether extended features are in use */ + if (sbp->sb_features2 != 0) + sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT; + + /* + * Due to a structure alignment issue, sb_features2 ended up in one + * of two locations, the second "incorrect" location represented by + * the sb_bad_features2 field. To avoid older kernels mounting + * filesystems they shouldn't, set both field to the same value. + */ + sbp->sb_bad_features2 = sbp->sb_features2; + + if (!fp->crcs_enabled) + return; + + /* default features for v5 filesystems */ + sbp->sb_features_compat = 0; + sbp->sb_features_ro_compat = 0; + sbp->sb_features_incompat = XFS_SB_FEAT_INCOMPAT_FTYPE; + sbp->sb_features_log_incompat = 0; + + if (fp->finobt) + sbp->sb_features_ro_compat = XFS_SB_FEAT_RO_COMPAT_FINOBT; + + /* + * Sparse inode chunk support has two main inode alignment requirements. + * First, sparse chunk alignment must match the cluster size. Second, + * full chunk alignment must match the inode chunk size. + * + * Copy the already calculated/scaled inoalignmt to spino_align and + * update the former to the full inode chunk size. + */ + if (fp->spinodes) { + sbp->sb_spino_align = sbp->sb_inoalignmt; + sbp->sb_inoalignmt = \ + XFS_INODES_PER_CHUNK * \ + sbp->sb_inodesize >> sbp->sb_blocklog; + sbp->sb_features_incompat |= XFS_SB_FEAT_INCOMPAT_SPINODES; + } + +} + int main( int argc, @@ -891,8 +994,6 @@ main( xfs_agnumber_t agno; __uint64_t agsize; xfs_alloc_rec_t *arec; - int attrversion; - int projid16bit; struct xfs_btree_block *block; int blflag; int blocklog; @@ -907,8 +1008,6 @@ main( char *dfile; int dirblocklog; int dirblocksize; - int dirftype; - int dirversion; char *dsize; int dsu; int dsw; @@ -916,7 +1015,6 @@ main( int dswidth; int force_overwrite; struct fsxattr fsx; - int iaflag; int ilflag; int imaxpct; int imflag; @@ -936,7 +1034,6 @@ main( int loginternal; char *logsize; xfs_fsblock_t logstart; - int logversion; int lvflag; int lsflag; int lsuflag; @@ -958,7 +1055,6 @@ main( int nftype; int nsflag; int nvflag; - int nci; int Nflag; int discard = 1; char *p; @@ -982,11 +1078,21 @@ main( int worst_freelist; libxfs_init_t xi; struct fs_topology ft; - int lazy_sb_counters; - int crcs_enabled; - int finobt; - bool finobtflag; - int spinodes; + struct sb_feat_args sb_feat = { + .finobt = 1, + .finobtflag = false, + .spinodes = 0, + .log_version = 2, + .attr_version = 2, + .dir_version = XFS_DFL_DIR_VERSION, + .inode_align = XFS_IFLAG_ALIGN, + .nci = false, + .lazy_sb_counters = true, + .projid16bit = false, + .crcs_enabled = true, + .dirftype = false, + .parent_pointers = false, + }; platform_uuid_generate(&uuid); progname = basename(argv[0]); @@ -994,8 +1100,6 @@ main( bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); - attrversion = 2; - projid16bit = 0; blflag = bsflag = slflag = ssflag = lslflag = lssflag = 0; blocklog = blocksize = 0; sectorlog = lsectorlog = XFS_MIN_SECTORSIZE_LOG; @@ -1004,27 +1108,19 @@ main( ilflag = imflag = ipflag = isflag = 0; liflag = laflag = lsflag = lsuflag = lsunitflag = ldflag = lvflag = 0; loginternal = 1; - logversion = 2; logagno = logblocks = rtblocks = rtextblocks = 0; - Nflag = nlflag = nsflag = nvflag = nci = 0; - dirftype = 1; /* inode type information in the dir */ + sb_feat.dirftype = 1; /* inode type information in the dir */ + Nflag = nlflag = nsflag = nvflag = 0; nftype = 0; dirblocklog = dirblocksize = 0; - dirversion = XFS_DFL_DIR_VERSION; qflag = 0; imaxpct = inodelog = inopblock = isize = 0; - iaflag = XFS_IFLAG_ALIGN; dfile = logfile = rtfile = NULL; dsize = logsize = rtsize = rtextsize = protofile = NULL; dsu = dsw = dsunit = dswidth = lalign = lsu = lsunit = 0; nodsflag = norsflag = 0; force_overwrite = 0; worst_freelist = 0; - lazy_sb_counters = 1; - crcs_enabled = 1; - finobt = 1; - finobtflag = false; - spinodes = 0; memset(&fsx, 0, sizeof(fsx)); memset(&xi, 0, sizeof(xi)); @@ -1264,9 +1360,10 @@ main( case I_ALIGN: if (!value || *value == '\0') value = "1"; - iaflag = atoi(value); - if (iaflag < 0 || iaflag > 1) + c = atoi(value); + if (c < 0 || c > 1) illegal(value, "i align"); + sb_feat.inode_align = c ? true : false; break; case I_LOG: if (!value || *value == '\0') @@ -1336,7 +1433,7 @@ main( c = atoi(value); if (c < 0 || c > 2) illegal(value, "i attr"); - attrversion = c; + sb_feat.attr_version = c; break; case I_PROJID32BIT: if (!value || *value == '\0') @@ -1344,14 +1441,15 @@ main( c = atoi(value); if (c < 0 || c > 1) illegal(value, "i projid32bit"); - projid16bit = c ? 0 : 1; + sb_feat.projid16bit = c ? false : true; break; case I_SPINODES: if (!value || *value == '\0') value = "1"; - spinodes = atoi(value); - if (spinodes < 0 || spinodes > 1) + c = atoi(value); + if (c < 0 || c > 1) illegal(value, "i spinodes"); + sb_feat.spinodes = c; break; default: unknown('i', value); @@ -1443,9 +1541,10 @@ main( reqval('l', lopts, L_VERSION); if (lvflag) respec('l', lopts, L_VERSION); - logversion = atoi(value); - if (logversion < 1 || logversion > 2) + c = atoi(value); + if (c < 1 || c > 2) illegal(value, "l version"); + sb_feat.log_version = c; lvflag = 1; break; case L_SIZE: @@ -1494,7 +1593,8 @@ main( c = atoi(value); if (c < 0 || c > 1) illegal(value, "l lazy-count"); - lazy_sb_counters = c; + sb_feat.lazy_sb_counters = c ? true + : false; break; default: unknown('l', value); @@ -1518,7 +1618,9 @@ main( c = atoi(value); if (c < 0 || c > 1) illegal(value, "m crc"); - crcs_enabled = c; + sb_feat.crcs_enabled = c ? true : false; + if (c) + sb_feat.dirftype = true; break; case M_FINOBT: if (!value || *value == '\0') @@ -1526,8 +1628,8 @@ main( c = atoi(value); if (c < 0 || c > 1) illegal(value, "m finobt"); - finobt = c; - finobtflag = true; + sb_feat.finobtflag = true; + sb_feat.finobt = c; break; case M_UUID: if (!value || *value == '\0') @@ -1583,12 +1685,14 @@ main( if (nvflag) respec('n', nopts, N_VERSION); if (!strcasecmp(value, "ci")) { - nci = 1; /* ASCII CI mode */ + /* ASCII CI mode */ + sb_feat.nci = true; } else { - dirversion = atoi(value); - if (dirversion != 2) + c = atoi(value); + if (c != 2) illegal(value, "n version"); + sb_feat.dir_version = c; } nvflag = 1; break; @@ -1600,7 +1704,7 @@ main( c = atoi(value); if (c < 0 || c > 1) illegal(value, "n ftype"); - dirftype = c; + sb_feat.dirftype = c ? true : false; nftype = 1; break; default: @@ -1749,13 +1853,13 @@ main( fprintf(stderr, _("illegal block size %d\n"), blocksize); usage(); } - if (crcs_enabled && blocksize < XFS_MIN_CRC_BLOCKSIZE) { + if (sb_feat.crcs_enabled && blocksize < XFS_MIN_CRC_BLOCKSIZE) { fprintf(stderr, _("Minimum block size for CRC enabled filesystems is %d bytes.\n"), XFS_MIN_CRC_BLOCKSIZE); usage(); } - if (crcs_enabled && !dirftype) { + if (sb_feat.crcs_enabled && !sb_feat.dirftype) { fprintf(stderr, _("cannot disable ftype with crcs enabled\n")); usage(); } @@ -1820,7 +1924,7 @@ _("block size %d cannot be smaller than logical sector size %d\n"), usage(); } else if (lsectorsize > XFS_MIN_SECTORSIZE && !lsu && !lsunit) { lsu = blocksize; - logversion = 2; + sb_feat.log_version = 2; } /* @@ -1828,7 +1932,7 @@ _("block size %d cannot be smaller than logical sector size %d\n"), * no longer optional for CRC enabled filesystems. Catch them up front * here before doing anything else. */ - if (crcs_enabled) { + if (sb_feat.crcs_enabled) { /* minimum inode size is 512 bytes, ipflag checked later */ if ((isflag || ilflag) && inodelog < XFS_DINODE_DFL_CRC_LOG) { fprintf(stderr, @@ -1838,28 +1942,28 @@ _("Minimum inode size for CRCs is %d bytes\n"), } /* inodes always aligned */ - if (iaflag != 1) { + if (!sb_feat.inode_align) { fprintf(stderr, _("Inodes always aligned for CRC enabled filesytems\n")); usage(); } /* lazy sb counters always on */ - if (lazy_sb_counters != 1) { + if (!sb_feat.lazy_sb_counters) { fprintf(stderr, _("Lazy superblock counted always enabled for CRC enabled filesytems\n")); usage(); } /* version 2 logs always on */ - if (logversion != 2) { + if (sb_feat.log_version != 2) { fprintf(stderr, _("V2 logs always enabled for CRC enabled filesytems\n")); usage(); } /* attr2 always on */ - if (attrversion != 2) { + if (sb_feat.attr_version != 2) { fprintf(stderr, _("V2 attribute format always enabled on CRC enabled filesytems\n")); usage(); @@ -1867,7 +1971,7 @@ _("V2 attribute format always enabled on CRC enabled filesytems\n")); /* 32 bit project quota always on */ /* attr2 always on */ - if (projid16bit == 1) { + if (sb_feat.projid16bit) { fprintf(stderr, _("32 bit Project IDs always enabled on CRC enabled filesytems\n")); usage(); @@ -1881,17 +1985,17 @@ _("32 bit Project IDs always enabled on CRC enabled filesytems\n")); * tried to use crc=0,finobt=1, then issue a warning before * turning them off. */ - if (finobt && finobtflag) { + if (sb_feat.finobt && sb_feat.finobtflag) { fprintf(stderr, _("warning: finobt not supported without CRC support, disabled.\n")); } - finobt = 0; + sb_feat.finobt = 0; } - if (spinodes && !crcs_enabled) { + if (sb_feat.spinodes && !sb_feat.crcs_enabled) { fprintf(stderr, _("warning: sparse inodes not supported without CRC support, disabled.\n")); - spinodes = 0; + sb_feat.spinodes = 0; } if (nsflag || nlflag) { @@ -1941,11 +2045,11 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); inodelog = blocklog - libxfs_highbit32(inopblock); isize = 1 << inodelog; } else if (!ilflag && !isflag) { - inodelog = crcs_enabled ? XFS_DINODE_DFL_CRC_LOG - : XFS_DINODE_DFL_LOG; + inodelog = sb_feat.crcs_enabled ? XFS_DINODE_DFL_CRC_LOG + : XFS_DINODE_DFL_LOG; isize = 1 << inodelog; } - if (crcs_enabled && inodelog < XFS_DINODE_DFL_CRC_LOG) { + if (sb_feat.crcs_enabled && inodelog < XFS_DINODE_DFL_CRC_LOG) { fprintf(stderr, _("Minimum inode size for CRCs is %d bytes\n"), 1 << XFS_DINODE_DFL_CRC_LOG); @@ -2075,10 +2179,10 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); } /* if lsu or lsunit was specified, automatically use v2 logs */ - if ((lsu || lsunit) && logversion == 1) { + if ((lsu || lsunit) && sb_feat.log_version == 1) { fprintf(stderr, _("log stripe unit specified, using v2 logs\n")); - logversion = 2; + sb_feat.log_version = 2; } calc_stripe_factors(dsu, dsw, sectorsize, lsu, lsectorsize, @@ -2393,12 +2497,12 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), } /* convert from 512 byte blocks to fs blocks */ lsunit = DTOBT(lsunit); - } else if (logversion == 2 && loginternal && dsunit) { + } else if (sb_feat.log_version == 2 && loginternal && dsunit) { /* lsunit and dsunit now in fs blocks */ lsunit = dsunit; } - if (logversion == 2 && (lsunit * blocksize) > 256 * 1024) { + if (sb_feat.log_version == 2 && (lsunit * blocksize) > 256 * 1024) { /* Warn only if specified on commandline */ if (lsuflag || lsunitflag) { fprintf(stderr, @@ -2410,9 +2514,9 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), lsunit = (32 * 1024) >> blocklog; } - min_logblocks = max_trans_res(crcs_enabled, dirversion, + min_logblocks = max_trans_res(sb_feat.crcs_enabled, sb_feat.dir_version, sectorlog, blocklog, inodelog, dirblocklog, - logversion, lsunit, finobt); + sb_feat.log_version, lsunit, sb_feat.finobt); ASSERT(min_logblocks); min_logblocks = MAX(XFS_MIN_LOG_BLOCKS, min_logblocks); if (!logsize && dblocks >= (1024*1024*1024) >> blocklog) @@ -2490,25 +2594,8 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), * sb_versionnum and finobt flags must be set before we use * XFS_PREALLOC_BLOCKS(). */ - sbp->sb_features2 = XFS_SB_VERSION2_MKFS(crcs_enabled, lazy_sb_counters, - attrversion == 2, !projid16bit, 0, - (!crcs_enabled && dirftype)); - sbp->sb_versionnum = XFS_SB_VERSION_MKFS(crcs_enabled, iaflag, - dsunit != 0, - logversion == 2, attrversion == 1, - (sectorsize != BBSIZE || - lsectorsize != BBSIZE), - nci, sbp->sb_features2 != 0); - /* - * Due to a structure alignment issue, sb_features2 ended up in one - * of two locations, the second "incorrect" location represented by - * the sb_bad_features2 field. To avoid older kernels mounting - * filesystems they shouldn't, set both field to the same value. - */ - sbp->sb_bad_features2 = sbp->sb_features2; + sb_set_features(&mp->m_sb, &sb_feat, sectorsize, lsectorsize, dsunit); - if (finobt) - sbp->sb_features_ro_compat = XFS_SB_FEAT_RO_COMPAT_FINOBT; if (loginternal) { /* @@ -2560,14 +2647,6 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), } validate_log_size(logblocks, blocklog, min_logblocks); - /* - * dirent filetype field always enabled on v5 superblocks - */ - if (crcs_enabled) { - sbp->sb_features_incompat = XFS_SB_FEAT_INCOMPAT_FTYPE; - dirftype = 1; - } - if (!qflag || Nflag) { printf(_( "meta-data=%-22s isize=%-6d agcount=%lld, agsize=%lld blks\n" @@ -2580,13 +2659,16 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), " =%-22s sectsz=%-5u sunit=%d blks, lazy-count=%d\n" "realtime =%-22s extsz=%-6d blocks=%lld, rtextents=%lld\n"), dfile, isize, (long long)agcount, (long long)agsize, - "", sectorsize, attrversion, !projid16bit, - "", crcs_enabled, finobt, spinodes, + "", sectorsize, sb_feat.attr_version, + !sb_feat.projid16bit, + "", sb_feat.crcs_enabled, sb_feat.finobt, sb_feat.spinodes, "", blocksize, (long long)dblocks, imaxpct, "", dsunit, dswidth, - dirversion, dirblocksize, nci, dirftype, + sb_feat.dir_version, dirblocksize, sb_feat.nci, + sb_feat.dirftype, logfile, 1 << blocklog, (long long)logblocks, - logversion, "", lsectorsize, lsunit, lazy_sb_counters, + sb_feat.log_version, "", lsectorsize, lsunit, + sb_feat.lazy_sb_counters, rtfile, rtextblocks << blocklog, (long long)rtblocks, (long long)rtextents); if (Nflag) @@ -2630,17 +2712,17 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), sbp->sb_unit = dsunit; sbp->sb_width = dswidth; sbp->sb_dirblklog = dirblocklog - blocklog; - if (logversion == 2) { /* This is stored in bytes */ + if (sb_feat.log_version == 2) { /* This is stored in bytes */ lsunit = (lsunit == 0) ? 1 : XFS_FSB_TO_B(mp, lsunit); sbp->sb_logsunit = lsunit; } else sbp->sb_logsunit = 0; - if (iaflag) { + if (sb_feat.inode_align) { int cluster_size = XFS_INODE_BIG_CLUSTER_SIZE; - if (crcs_enabled) + if (sb_feat.crcs_enabled) cluster_size *= isize / XFS_DINODE_MIN_SIZE; sbp->sb_inoalignmt = cluster_size >> blocklog; - iaflag = sbp->sb_inoalignmt != 0; + sb_feat.inode_align = sbp->sb_inoalignmt != 0; } else sbp->sb_inoalignmt = 0; if (lsectorsize != BBSIZE || sectorsize != BBSIZE) { @@ -2651,19 +2733,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), sbp->sb_logsectsize = 0; } - /* - * Sparse inode chunk support has two main inode alignment requirements. - * First, sparse chunk alignment must match the cluster size. Second, - * full chunk alignment must match the inode chunk size. - * - * Copy the already calculated/scaled inoalignmt to spino_align and - * update the former to the full inode chunk size. - */ - if (spinodes) { - sbp->sb_spino_align = sbp->sb_inoalignmt; - sbp->sb_inoalignmt = XFS_INODES_PER_CHUNK * isize >> blocklog; - sbp->sb_features_incompat |= XFS_SB_FEAT_INCOMPAT_SPINODES; - } + sb_set_features(&mp->m_sb, &sb_feat, sectorsize, lsectorsize, dsunit); if (force_overwrite) zero_old_xfs_structures(&xi, sbp); @@ -2719,8 +2789,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), libxfs_log_clear(mp->m_logdev_targp, NULL, XFS_FSB_TO_DADDR(mp, logstart), (xfs_extlen_t)XFS_FSB_TO_BB(mp, logblocks), - &sbp->sb_uuid, logversion, lsunit, XLOG_FMT, XLOG_INIT_CYCLE, - false); + &sbp->sb_uuid, sb_feat.log_version, lsunit, XLOG_FMT, XLOG_INIT_CYCLE, false); mp = libxfs_mount(mp, sbp, xi.ddev, xi.logdev, xi.rtdev, 0); if (mp == NULL) { @@ -2825,7 +2894,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), agi->agi_count = 0; agi->agi_root = cpu_to_be32(XFS_IBT_BLOCK(mp)); agi->agi_level = cpu_to_be32(1); - if (finobt) { + if (sb_feat.finobt) { agi->agi_free_root = cpu_to_be32(XFS_FIBT_BLOCK(mp)); agi->agi_free_level = cpu_to_be32(1); } @@ -2958,7 +3027,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), /* * Free INO btree root block */ - if (!finobt) { + if (!sb_feat.finobt) { xfs_perag_put(pag); continue; } -- 2.5.0 From jtulak@redhat.com Thu Apr 21 04:40:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 75C2F7CAE for ; Thu, 21 Apr 2016 04:40:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 28B118F8040 for ; Thu, 21 Apr 2016 02:40:02 -0700 (PDT) X-ASG-Debug-ID: 1461231600-04cb6c09a0438c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id mtruWQva9l7sXerj (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 21 Apr 2016 02:40:00 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 285522FD for ; Thu, 21 Apr 2016 09:40:00 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3L9ds0I007155 for ; Thu, 21 Apr 2016 05:39:59 -0400 From: Jan Tulak To: xfs@oss.sgi.com Subject: [PATCH 05/19] mkfs: factor boolean option parsing Date: Thu, 21 Apr 2016 11:39:39 +0200 X-ASG-Orig-Subj: [PATCH 05/19] mkfs: factor boolean option parsing Message-Id: <1461231593-31294-6-git-send-email-jtulak@redhat.com> In-Reply-To: <1461231593-31294-1-git-send-email-jtulak@redhat.com> References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461231600 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6710 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner Many of the options passed to mkfs have boolean options (0 or 1) and all hand roll the same code and validity checks. Factor these out into a common function. Note that the lazy-count option is now changed to match other booleans in that if you don't specify a value, it reverts to the default value (on) rather than throwing an error. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak --- CHANGES * add getbool treatment to I_SPINODES --- mkfs/xfs_mkfs.c | 111 ++++++++++++++++++++++---------------------------------- 1 file changed, 43 insertions(+), 68 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 53a0ef3..94ae7e2 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -38,7 +38,7 @@ struct fs_topology { * Prototypes for internal functions. */ static void conflict(char opt, char *tab[], int oldidx, int newidx); -static void illegal(char *value, char *opt); +static void illegal(const char *value, const char *opt); static __attribute__((noreturn)) void usage (void); static __attribute__((noreturn)) void reqval(char opt, char *tab[], int idx); static void respec(char opt, char *tab[], int idx); @@ -1007,6 +1007,21 @@ getnum( return i; } +static bool +getbool( + const char *str, + const char *illegal_str, + bool default_val) +{ + long long c; + + if (!str || *str == '\0') + return default_val; + c = getnum(str, 0, 0, false); + if (c < 0 || c > 1) + illegal(str, illegal_str); + return c ? true : false; +} int main( @@ -1227,11 +1242,8 @@ main( dasize = 1; break; case D_FILE: - if (!value || *value == '\0') - value = "1"; - xi.disfile = getnum(value, 0, 0, false); - if (xi.disfile < 0 || xi.disfile > 1) - illegal(value, "d file"); + xi.disfile = getbool(value, "d file", + true); if (xi.disfile && !Nflag) xi.dcreat = 1; break; @@ -1374,12 +1386,8 @@ main( switch (getsubopt(&p, (constpp)iopts, &value)) { case I_ALIGN: - if (!value || *value == '\0') - value = "1"; - c = getnum(value, 0, 0, false); - if (c < 0 || c > 1) - illegal(value, "i align"); - sb_feat.inode_align = c ? true : false; + sb_feat.inode_align = getbool( + value, "i align", true); break; case I_LOG: if (!value || *value == '\0') @@ -1452,20 +1460,12 @@ main( sb_feat.attr_version = c; break; case I_PROJID32BIT: - if (!value || *value == '\0') - value = "0"; - c = getnum(value, 0, 0, false); - if (c < 0 || c > 1) - illegal(value, "i projid32bit"); - sb_feat.projid16bit = c ? false : true; + sb_feat.projid16bit = !getbool(value, + "i projid32bit", false); break; case I_SPINODES: - if (!value || *value == '\0') - value = "1"; - c = atoi(value); - if (c < 0 || c > 1) - illegal(value, "i spinodes"); - sb_feat.spinodes = c; + sb_feat.spinodes = getbool(value, + "i spinodes", true); break; default: unknown('i', value); @@ -1491,20 +1491,15 @@ main( laflag = 1; break; case L_FILE: - if (!value || *value == '\0') - value = "1"; if (loginternal) conflict('l', lopts, L_INTERNAL, L_FILE); - xi.lisfile = getnum(value, 0, 0, false); - if (xi.lisfile < 0 || xi.lisfile > 1) - illegal(value, "l file"); + xi.lisfile = getbool(value, "l file", + true); if (xi.lisfile) xi.lcreat = 1; break; case L_INTERNAL: - if (!value || *value == '\0') - value = "1"; if (ldflag) conflict('l', lopts, L_INTERNAL, L_DEV); if (xi.lisfile) @@ -1512,9 +1507,9 @@ main( L_INTERNAL); if (liflag) respec('l', lopts, L_INTERNAL); - loginternal = getnum(value, 0, 0, false); - if (loginternal < 0 || loginternal > 1) - illegal(value, "l internal"); + + loginternal = getbool(value, + "l internal", true); liflag = 1; break; case L_SU: @@ -1604,14 +1599,9 @@ main( lssflag = 1; break; case L_LAZYSBCNTR: - if (!value || *value == '\0') - reqval('l', lopts, - L_LAZYSBCNTR); - c = getnum(value, 0, 0, false); - if (c < 0 || c > 1) - illegal(value, "l lazy-count"); - sb_feat.lazy_sb_counters = c ? true - : false; + sb_feat.lazy_sb_counters = getbool( + value, "l lazy-count", + true); break; default: unknown('l', value); @@ -1630,23 +1620,15 @@ main( switch (getsubopt(&p, (constpp)mopts, &value)) { case M_CRC: - if (!value || *value == '\0') - reqval('m', mopts, M_CRC); - c = getnum(value, 0, 0, false); - if (c < 0 || c > 1) - illegal(value, "m crc"); - sb_feat.crcs_enabled = c ? true : false; - if (c) + sb_feat.crcs_enabled = getbool( + value, "m crc", true); + if (sb_feat.crcs_enabled) sb_feat.dirftype = true; break; case M_FINOBT: - if (!value || *value == '\0') - reqval('m', mopts, M_CRC); - c = atoi(value); - if (c < 0 || c > 1) - illegal(value, "m finobt"); sb_feat.finobtflag = true; - sb_feat.finobt = c; + sb_feat.finobt = getbool( + value, "m finobt", true); break; case M_UUID: if (!value || *value == '\0') @@ -1714,14 +1696,10 @@ main( nvflag = 1; break; case N_FTYPE: - if (!value || *value == '\0') - reqval('n', nopts, N_FTYPE); if (nftype) respec('n', nopts, N_FTYPE); - c = getnum(value, 0, 0, false); - if (c < 0 || c > 1) - illegal(value, "n ftype"); - sb_feat.dirftype = c ? true : false; + sb_feat.dirftype = getbool(value, + "n ftype", true); nftype = 1; break; default: @@ -1757,11 +1735,8 @@ main( rtextsize = value; break; case R_FILE: - if (!value || *value == '\0') - value = "1"; - xi.risfile = getnum(value, 0, 0, false); - if (xi.risfile < 0 || xi.risfile > 1) - illegal(value, "r file"); + xi.risfile = getbool(value, + "r file", true); if (xi.risfile) xi.rcreat = 1; break; @@ -3207,8 +3182,8 @@ conflict( static void illegal( - char *value, - char *opt) + const char *value, + const char *opt) { fprintf(stderr, _("Illegal value %s for -%s option\n"), value, opt); usage(); -- 2.5.0 From jtulak@redhat.com Thu Apr 21 04:40:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 21BD87CB4 for ; Thu, 21 Apr 2016 04:40:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C69578F8050 for ; Thu, 21 Apr 2016 02:40:02 -0700 (PDT) X-ASG-Debug-ID: 1461231600-04bdf0358e348c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ji787N8AoqAdbksf (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 21 Apr 2016 02:40:01 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id EB60A72D24 for ; Thu, 21 Apr 2016 09:40:00 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3L9ds0J007155 for ; Thu, 21 Apr 2016 05:40:00 -0400 From: Jan Tulak To: xfs@oss.sgi.com Subject: [PATCH 06/19] mkfs: validate logarithmic parameters sanely Date: Thu, 21 Apr 2016 11:39:40 +0200 X-ASG-Orig-Subj: [PATCH 06/19] mkfs: validate logarithmic parameters sanely Message-Id: <1461231593-31294-7-git-send-email-jtulak@redhat.com> In-Reply-To: <1461231593-31294-1-git-send-email-jtulak@redhat.com> References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461231601 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5475 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner Testing logarithmic paramters like "-n log=" shows that we do a terrible job of validating such input. e.g.: ..... naming =version 2 bsize=65536 ascii-ci=0 ftype=0 .... Yeah, I just asked for a block size of 2^456858480, and it didn't get rejected. Great, isn't it? So, factor out the parsing of logarithmic parameters, and pass in the maximum valid value that they can take. These maximum values might not be completely accurate (e.g. block/sector sizes will affect the eventual valid maximum) but we can get rid of all the overflows and stupidities before we get to fine-grained validity checking later in mkfs once things like block and sector sizes have been finalised. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak Reviewed-by: Brian Foster Reviewed-by: Eric Sandeen --- mkfs/xfs_mkfs.c | 79 +++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 51 insertions(+), 28 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 94ae7e2..09370d8 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -1023,6 +1023,27 @@ getbool( return c ? true : false; } +static int +getnum_checked( + const char *str, + long long min_val, + long long max_val, + const char *illegal_str, + char reqval_char, + char *reqval_opts[], + int reqval_optind) +{ + long long c; + + if (!str || *str == '\0') + reqval(reqval_char, reqval_opts, reqval_optind); + + c = getnum(str, 0, 0, false); + if (c < min_val || c > max_val) + illegal(str, illegal_str); + return c; +} + int main( int argc, @@ -1180,16 +1201,16 @@ main( switch (getsubopt(&p, (constpp)bopts, &value)) { case B_LOG: - if (!value || *value == '\0') - reqval('b', bopts, B_LOG); if (blflag) respec('b', bopts, B_LOG); if (bsflag) conflict('b', bopts, B_SIZE, B_LOG); - blocklog = getnum(value, 0, 0, false); - if (blocklog <= 0) - illegal(value, "b log"); + blocklog = getnum_checked(value, + XFS_MIN_BLOCKSIZE_LOG, + XFS_MAX_BLOCKSIZE_LOG, + "b log", 'b', bopts, + B_LOG); blocksize = 1 << blocklog; blflag = 1; break; @@ -1326,16 +1347,16 @@ main( nodsflag = 1; break; case D_SECTLOG: - if (!value || *value == '\0') - reqval('d', dopts, D_SECTLOG); if (slflag) respec('d', dopts, D_SECTLOG); if (ssflag) conflict('d', dopts, D_SECTSIZE, D_SECTLOG); - sectorlog = getnum(value, 0, 0, false); - if (sectorlog <= 0) - illegal(value, "d sectlog"); + sectorlog = getnum_checked(value, + XFS_MIN_SECTORSIZE_LOG, + XFS_MAX_SECTORSIZE_LOG, + "d sectlog", 'd', dopts, + D_SECTLOG); sectorsize = 1 << sectorlog; slflag = 1; break; @@ -1400,9 +1421,11 @@ main( if (isflag) conflict('i', iopts, I_SIZE, I_LOG); - inodelog = getnum(value, 0, 0, false); - if (inodelog <= 0) - illegal(value, "i log"); + inodelog = getnum_checked(value, + XFS_DINODE_MIN_LOG, + XFS_DINODE_MAX_LOG, + "i log", 'i', iopts, + I_LOG); isize = 1 << inodelog; ilflag = 1; break; @@ -1568,16 +1591,16 @@ main( lsflag = 1; break; case L_SECTLOG: - if (!value || *value == '\0') - reqval('l', lopts, L_SECTLOG); if (lslflag) respec('l', lopts, L_SECTLOG); if (lssflag) conflict('l', lopts, L_SECTSIZE, L_SECTLOG); - lsectorlog = getnum(value, 0, 0, false); - if (lsectorlog <= 0) - illegal(value, "l sectlog"); + lsectorlog = getnum_checked(value, + XFS_MIN_SECTORSIZE_LOG, + XFS_MAX_SECTORSIZE_LOG, + "l sectlog", 'l', lopts, + L_SECTLOG); lsectorsize = 1 << lsectorlog; lslflag = 1; break; @@ -1648,16 +1671,16 @@ main( switch (getsubopt(&p, (constpp)nopts, &value)) { case N_LOG: - if (!value || *value == '\0') - reqval('n', nopts, N_LOG); if (nlflag) respec('n', nopts, N_LOG); if (nsflag) conflict('n', nopts, N_SIZE, N_LOG); - dirblocklog = getnum(value, 0, 0, false); - if (dirblocklog <= 0) - illegal(value, "n log"); + dirblocklog = getnum_checked(value, + XFS_MIN_REC_DIRSIZE, + XFS_MAX_BLOCKSIZE_LOG, + "n log", 'n', nopts, + N_LOG); dirblocksize = 1 << dirblocklog; nlflag = 1; break; @@ -1771,16 +1794,16 @@ main( switch (getsubopt(&p, (constpp)sopts, &value)) { case S_LOG: case S_SECTLOG: - if (!value || *value == '\0') - reqval('s', sopts, S_SECTLOG); if (slflag || lslflag) respec('s', sopts, S_SECTLOG); if (ssflag || lssflag) conflict('s', sopts, S_SECTSIZE, S_SECTLOG); - sectorlog = getnum(value, 0, 0, false); - if (sectorlog <= 0) - illegal(value, "s sectlog"); + sectorlog = getnum_checked(value, + XFS_MIN_SECTORSIZE_LOG, + XFS_MAX_SECTORSIZE_LOG, + "s sectlog", 's', sopts, + S_SECTLOG); lsectorlog = sectorlog; sectorsize = 1 << sectorlog; lsectorsize = sectorsize; -- 2.5.0 From jtulak@redhat.com Thu Apr 21 04:40:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 062B57CB3 for ; Thu, 21 Apr 2016 04:40:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CB09B304066 for ; Thu, 21 Apr 2016 02:40:02 -0700 (PDT) X-ASG-Debug-ID: 1461231599-04cbb00fea2d3a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id uRXyf1koMK9MXNw2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 21 Apr 2016 02:39:59 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5119E3B70D for ; Thu, 21 Apr 2016 09:39:59 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3L9ds0H007155 for ; Thu, 21 Apr 2016 05:39:58 -0400 From: Jan Tulak To: xfs@oss.sgi.com Subject: [PATCH 04/19] mkfs: validate all input values Date: Thu, 21 Apr 2016 11:39:38 +0200 X-ASG-Orig-Subj: [PATCH 04/19] mkfs: validate all input values Message-Id: <1461231593-31294-5-git-send-email-jtulak@redhat.com> In-Reply-To: <1461231593-31294-1-git-send-email-jtulak@redhat.com> References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461231599 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 23865 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner Right now, mkfs does a poor job of input validation of values. Many parameters do not check for trailing garbage and so will pass obviously invalid values as OK. Some don't even detect completely invalid values, leaving it for other checks later on to fail due to a bad value conversion - these tend to rely on atoi() implicitly returning a sane value when it is passed garbage, and atoi gives no guarantee of the return value when passed garbage. Clean all this up by passing all strings that need to be converted into values into a common function that is called regardless of whether unit conversion is needed or not. Further, make sure every conversion is checked for a valid result, and abort the moment an invalid value is detected. Get rid of the silly "isdigits(), cvtnum()" calls which don't use any of the conversion capabilities of cvtnum() because we've already ensured that there are no conversion units in the string via the isdigits() call. These can simply be replaced by a standard strtoll() call followed by checking for no trailing bytes. Finally, the block size of the filesystem is not known until all the options have been parsed and we can determine if the default is to be used. This means any parameter that relies on using conversion from filesystem block size (the "NNNb" format) requires the block size to first be specified on the command line so it is known. Similarly, we make the same rule for specifying counts in sectors. This is a change from the existing behaviour that assumes sectors are 512 bytes unless otherwise changed on the command line. This, unfortunately, leads to complete silliness where you can specify the sector size as a count of sectors. It also means that you can do some conversions with 512 byte sector sizes, and others with whatever was specified on the command line, meaning the mkfs behaviour changes depending in where in the command line the sector size is changed.... Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak --- CHANGES: * cast logagno to __int64_t for test, instead of long long --- include/xfs_multidisk.h | 7 +- man/man8/mkfs.xfs.8 | 26 +++++- mkfs/proto.c | 36 ++++---- mkfs/xfs_mkfs.c | 215 +++++++++++++++++++++++++----------------------- 4 files changed, 153 insertions(+), 131 deletions(-) diff --git a/include/xfs_multidisk.h b/include/xfs_multidisk.h index 11d6233..3e892d5 100644 --- a/include/xfs_multidisk.h +++ b/include/xfs_multidisk.h @@ -56,11 +56,8 @@ #define XFS_NOMULTIDISK_AGLOG 2 /* 4 AGs */ #define XFS_MULTIDISK_AGCOUNT (1 << XFS_MULTIDISK_AGLOG) - -/* xfs_mkfs.c */ -extern int isdigits (char *str); -extern long long cvtnum (unsigned int blocksize, - unsigned int sectorsize, char *s); +extern long long getnum(const char *str, unsigned int blocksize, + unsigned int sectorsize, bool convert); /* proto.c */ extern char *setup_proto (char *fname); diff --git a/man/man8/mkfs.xfs.8 b/man/man8/mkfs.xfs.8 index 980c7bc..8b068ef 100644 --- a/man/man8/mkfs.xfs.8 +++ b/man/man8/mkfs.xfs.8 @@ -64,11 +64,11 @@ SCSI disk, use: .PP The metadata log can be placed on another device to reduce the number of disk seeks. To create a filesystem on the first partition on the -first SCSI disk with a 10000 block log located on the first partition +first SCSI disk with a 10MiB log located on the first partition on the second SCSI disk, use: .RS .HP -.B mkfs.xfs\ \-l\ logdev=/dev/sdb1,size=10000b /dev/sda1 +.B mkfs.xfs\ \-l\ logdev=/dev/sdb1,size=10m /dev/sda1 .RE .PP Each of the @@ -78,9 +78,9 @@ suboptions if multiple suboptions apply to the same option. Equivalently, each main option can be given multiple times with different suboptions. For example, -.B \-l internal,size=10000b +.B \-l internal,size=10m and -.B \-l internal \-l size=10000b +.B \-l internal \-l size=10m are equivalent. .PP In the descriptions below, sizes are given in sectors, bytes, blocks, @@ -109,6 +109,15 @@ option below). .HP .BR e "\ \-\ multiply by one exabyte (1,048,576 terabytes)." .PD +.RE +.PP +When specifying parameters in units of sectors or filesystem blocks, the +.B \-s +option or the +.B \-b +option first needs to be added to the command line. +Failure to specify the size of the units will result in illegal value errors +when parameters are quantified in those units. .SH OPTIONS .TP .BI \-b " block_size_options" @@ -126,6 +135,11 @@ or in bytes with .BR size= . The default value is 4096 bytes (4 KiB), the minimum is 512, and the maximum is 65536 (64 KiB). +.IP +To specify any options on the command line in units of filesystem blocks, this +option must be specified first so that the filesystem block size is +applied consistently to all options. +.IP Although .B mkfs.xfs will accept any of these values and create a valid filesystem, @@ -811,6 +825,10 @@ is 512 bytes. The minimum value for sector size is .I sector_size must be a power of 2 size and cannot be made larger than the filesystem block size. +.IP +To specify any options on the command line in units of sectors, this +option must be specified first so that the sector size is +applied consistently to all options. .TP .BI \-L " label" Set the filesystem diff --git a/mkfs/proto.c b/mkfs/proto.c index f3327d1..19943cb 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -23,7 +23,6 @@ /* * Prototypes for internal functions. */ -static long getnum(char **pp); static char *getstr(char **pp); static void fail(char *msg, int i); static void getres(xfs_trans_t *tp, uint blocks); @@ -78,8 +77,8 @@ setup_proto( * Skip past the stuff there for compatibility, a string and 2 numbers. */ (void)getstr(&buf); /* boot image name */ - (void)getnum(&buf); /* block count */ - (void)getnum(&buf); /* inode count */ + (void)getnum(getstr(&buf), 0, 0, false); /* block count */ + (void)getnum(getstr(&buf), 0, 0, false); /* inode count */ close(fd); return buf; @@ -90,16 +89,6 @@ out_fail: exit(1); } -static long -getnum( - char **pp) -{ - char *s; - - s = getstr(pp); - return atol(s); -} - static void fail( char *msg, @@ -440,8 +429,8 @@ parseproto( val = val * 8 + mstr[i] - '0'; } mode |= val; - creds.cr_uid = (int)getnum(pp); - creds.cr_gid = (int)getnum(pp); + creds.cr_uid = (int)getnum(getstr(pp), 0, 0, false); + creds.cr_gid = (int)getnum(getstr(pp), 0, 0, false); xname.name = (unsigned char *)name; xname.len = name ? strlen(name) : 0; xname.type = 0; @@ -466,7 +455,14 @@ parseproto( case IF_RESERVED: /* pre-allocated space only */ value = getstr(pp); - llen = cvtnum(mp->m_sb.sb_blocksize, mp->m_sb.sb_sectsize, value); + llen = getnum(value, mp->m_sb.sb_blocksize, + mp->m_sb.sb_sectsize, true); + if (llen < 0) { + fprintf(stderr, + _("%s: Bad value %s for proto file %s\n"), + progname, value, name); + exit(1); + } getres(tp, XFS_B_TO_FSB(mp, llen)); error = -libxfs_inode_alloc(&tp, pip, mode|S_IFREG, 1, 0, @@ -490,8 +486,8 @@ parseproto( case IF_BLOCK: getres(tp, 0); - majdev = (int)getnum(pp); - mindev = (int)getnum(pp); + majdev = getnum(getstr(pp), 0, 0, false); + mindev = getnum(getstr(pp), 0, 0, false); error = -libxfs_inode_alloc(&tp, pip, mode|S_IFBLK, 1, IRIX_MKDEV(majdev, mindev), &creds, fsxp, &ip); if (error) { @@ -505,8 +501,8 @@ parseproto( case IF_CHAR: getres(tp, 0); - majdev = (int)getnum(pp); - mindev = (int)getnum(pp); + majdev = getnum(getstr(pp), 0, 0, false); + mindev = getnum(getstr(pp), 0, 0, false); error = -libxfs_inode_alloc(&tp, pip, mode|S_IFCHR, 1, IRIX_MKDEV(majdev, mindev), &creds, fsxp, &ip); if (error) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 963545b..53a0ef3 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -45,6 +45,9 @@ static void respec(char opt, char *tab[], int idx); static void unknown(char opt, char *s); static int ispow2(unsigned int i); +static long long cvtnum(unsigned int blocksize, + unsigned int sectorsize, const char *s); + /* * option tables for getsubopt calls */ @@ -983,6 +986,28 @@ sb_set_features( } +long long +getnum( + const char *str, + unsigned int blocksize, + unsigned int sectorsize, + bool convert) +{ + long long i; + char *sp; + + if (convert) + return cvtnum(blocksize, sectorsize, str); + + i = strtoll(str, &sp, 0); + if (i == 0 && sp == str) + return -1LL; + if (*sp != '\0') + return -1LL; /* trailing garbage */ + return i; +} + + int main( int argc, @@ -1102,8 +1127,8 @@ main( blflag = bsflag = slflag = ssflag = lslflag = lssflag = 0; blocklog = blocksize = 0; - sectorlog = lsectorlog = XFS_MIN_SECTORSIZE_LOG; - sectorsize = lsectorsize = XFS_MIN_SECTORSIZE; + sectorlog = lsectorlog = 0; + sectorsize = lsectorsize = 0; agsize = daflag = dasize = dblocks = 0; ilflag = imflag = ipflag = isflag = 0; liflag = laflag = lsflag = lsuflag = lsunitflag = ldflag = lvflag = 0; @@ -1147,7 +1172,7 @@ main( if (bsflag) conflict('b', bopts, B_SIZE, B_LOG); - blocklog = atoi(value); + blocklog = getnum(value, 0, 0, false); if (blocklog <= 0) illegal(value, "b log"); blocksize = 1 << blocklog; @@ -1161,8 +1186,8 @@ main( if (blflag) conflict('b', bopts, B_LOG, B_SIZE); - blocksize = cvtnum( - blocksize, sectorsize, value); + blocksize = getnum(value, blocksize, + sectorsize, true); if (blocksize <= 0 || !ispow2(blocksize)) illegal(value, "b size"); @@ -1185,8 +1210,7 @@ main( reqval('d', dopts, D_AGCOUNT); if (daflag) respec('d', dopts, D_AGCOUNT); - agcount = (__uint64_t) - strtoul(value, NULL, 10); + agcount = getnum(value, 0, 0, false); if ((__int64_t)agcount <= 0) illegal(value, "d agcount"); daflag = 1; @@ -1196,14 +1220,16 @@ main( reqval('d', dopts, D_AGSIZE); if (dasize) respec('d', dopts, D_AGSIZE); - agsize = cvtnum( - blocksize, sectorsize, value); + agsize = getnum(value, blocksize, + sectorsize, true); + if ((__int64_t)agsize <= 0) + illegal(value, "d agsize"); dasize = 1; break; case D_FILE: if (!value || *value == '\0') value = "1"; - xi.disfile = atoi(value); + xi.disfile = getnum(value, 0, 0, false); if (xi.disfile < 0 || xi.disfile > 1) illegal(value, "d file"); if (xi.disfile && !Nflag) @@ -1231,13 +1257,9 @@ main( if (nodsflag) conflict('d', dopts, D_NOALIGN, D_SUNIT); - if (!isdigits(value)) { - fprintf(stderr, - _("%s: Specify data sunit in 512-byte blocks, no unit suffix\n"), - progname); - exit(1); - } - dsunit = cvtnum(0, 0, value); + dsunit = getnum(value, 0, 0, false); + if (dsunit < 0) + illegal(value, "d sunit"); break; case D_SWIDTH: if (!value || *value == '\0') @@ -1247,13 +1269,9 @@ main( if (nodsflag) conflict('d', dopts, D_NOALIGN, D_SWIDTH); - if (!isdigits(value)) { - fprintf(stderr, - _("%s: Specify data swidth in 512-byte blocks, no unit suffix\n"), - progname); - exit(1); - } - dswidth = cvtnum(0, 0, value); + dswidth = getnum(value, 0, 0, false); + if (dswidth < 0) + illegal(value, "d swidth"); break; case D_SU: if (!value || *value == '\0') @@ -1263,8 +1281,10 @@ main( if (nodsflag) conflict('d', dopts, D_NOALIGN, D_SU); - dsu = cvtnum( - blocksize, sectorsize, value); + dsu = getnum(value, blocksize, + sectorsize, true); + if (dsu < 0) + illegal(value, "d su"); break; case D_SW: if (!value || *value == '\0') @@ -1274,13 +1294,9 @@ main( if (nodsflag) conflict('d', dopts, D_NOALIGN, D_SW); - if (!isdigits(value)) { - fprintf(stderr, - _("%s: Specify data sw as multiple of su, no unit suffix\n"), - progname); - exit(1); - } - dsw = cvtnum(0, 0, value); + dsw = getnum(value, 0, 0, false); + if (dsw < 0) + illegal(value, "d sw"); break; case D_NOALIGN: if (dsu) @@ -1305,7 +1321,7 @@ main( if (ssflag) conflict('d', dopts, D_SECTSIZE, D_SECTLOG); - sectorlog = atoi(value); + sectorlog = getnum(value, 0, 0, false); if (sectorlog <= 0) illegal(value, "d sectlog"); sectorsize = 1 << sectorlog; @@ -1319,8 +1335,8 @@ main( if (slflag) conflict('d', dopts, D_SECTLOG, D_SECTSIZE); - sectorsize = cvtnum( - blocksize, sectorsize, value); + sectorsize = getnum(value, blocksize, + sectorsize, true); if (sectorsize <= 0 || !ispow2(sectorsize)) illegal(value, "d sectsize"); @@ -1360,7 +1376,7 @@ main( case I_ALIGN: if (!value || *value == '\0') value = "1"; - c = atoi(value); + c = getnum(value, 0, 0, false); if (c < 0 || c > 1) illegal(value, "i align"); sb_feat.inode_align = c ? true : false; @@ -1376,7 +1392,7 @@ main( if (isflag) conflict('i', iopts, I_SIZE, I_LOG); - inodelog = atoi(value); + inodelog = getnum(value, 0, 0, false); if (inodelog <= 0) illegal(value, "i log"); isize = 1 << inodelog; @@ -1387,7 +1403,7 @@ main( reqval('i', iopts, I_MAXPCT); if (imflag) respec('i', iopts, I_MAXPCT); - imaxpct = atoi(value); + imaxpct = getnum(value, 0, 0, false); if (imaxpct < 0 || imaxpct > 100) illegal(value, "i maxpct"); imflag = 1; @@ -1403,7 +1419,7 @@ main( if (isflag) conflict('i', iopts, I_SIZE, I_PERBLOCK); - inopblock = atoi(value); + inopblock = getnum(value, 0, 0, false); if (inopblock < XFS_MIN_INODE_PERBLOCK || !ispow2(inopblock)) @@ -1421,7 +1437,7 @@ main( I_SIZE); if (isflag) respec('i', iopts, I_SIZE); - isize = cvtnum(0, 0, value); + isize = getnum(value, 0, 0, true); if (isize <= 0 || !ispow2(isize)) illegal(value, "i size"); inodelog = libxfs_highbit32(isize); @@ -1430,7 +1446,7 @@ main( case I_ATTR: if (!value || *value == '\0') reqval('i', iopts, I_ATTR); - c = atoi(value); + c = getnum(value, 0, 0, false); if (c < 0 || c > 2) illegal(value, "i attr"); sb_feat.attr_version = c; @@ -1438,7 +1454,7 @@ main( case I_PROJID32BIT: if (!value || *value == '\0') value = "0"; - c = atoi(value); + c = getnum(value, 0, 0, false); if (c < 0 || c > 1) illegal(value, "i projid32bit"); sb_feat.projid16bit = c ? false : true; @@ -1469,7 +1485,9 @@ main( respec('l', lopts, L_AGNUM); if (ldflag) conflict('l', lopts, L_AGNUM, L_DEV); - logagno = atoi(value); + logagno = getnum(value, 0, 0, false); + if ((__int64_t)logagno < 0) + illegal(value, "l agno"); laflag = 1; break; case L_FILE: @@ -1478,7 +1496,7 @@ main( if (loginternal) conflict('l', lopts, L_INTERNAL, L_FILE); - xi.lisfile = atoi(value); + xi.lisfile = getnum(value, 0, 0, false); if (xi.lisfile < 0 || xi.lisfile > 1) illegal(value, "l file"); if (xi.lisfile) @@ -1494,7 +1512,7 @@ main( L_INTERNAL); if (liflag) respec('l', lopts, L_INTERNAL); - loginternal = atoi(value); + loginternal = getnum(value, 0, 0, false); if (loginternal < 0 || loginternal > 1) illegal(value, "l internal"); liflag = 1; @@ -1504,8 +1522,10 @@ main( reqval('l', lopts, L_SU); if (lsu) respec('l', lopts, L_SU); - lsu = cvtnum( - blocksize, sectorsize, value); + lsu = getnum(value, blocksize, + sectorsize, true); + if (lsu < 0) + illegal(value, "l su"); lsuflag = 1; break; case L_SUNIT: @@ -1513,12 +1533,9 @@ main( reqval('l', lopts, L_SUNIT); if (lsunit) respec('l', lopts, L_SUNIT); - if (!isdigits(value)) { - fprintf(stderr, - _("Specify log sunit in 512-byte blocks, no size suffix\n")); - usage(); - } - lsunit = cvtnum(0, 0, value); + lsunit = getnum(value, 0, 0, false); + if (lsunit < 0) + illegal(value, "l sunit"); lsunitflag = 1; break; case L_NAME: @@ -1541,7 +1558,7 @@ main( reqval('l', lopts, L_VERSION); if (lvflag) respec('l', lopts, L_VERSION); - c = atoi(value); + c = getnum(value, 0, 0, false); if (c < 1 || c > 2) illegal(value, "l version"); sb_feat.log_version = c; @@ -1563,7 +1580,7 @@ main( if (lssflag) conflict('l', lopts, L_SECTSIZE, L_SECTLOG); - lsectorlog = atoi(value); + lsectorlog = getnum(value, 0, 0, false); if (lsectorlog <= 0) illegal(value, "l sectlog"); lsectorsize = 1 << lsectorlog; @@ -1577,8 +1594,8 @@ main( if (lslflag) conflict('l', lopts, L_SECTLOG, L_SECTSIZE); - lsectorsize = cvtnum( - blocksize, sectorsize, value); + lsectorsize = getnum(value, blocksize, + sectorsize, true); if (lsectorsize <= 0 || !ispow2(lsectorsize)) illegal(value, "l sectsize"); @@ -1590,7 +1607,7 @@ main( if (!value || *value == '\0') reqval('l', lopts, L_LAZYSBCNTR); - c = atoi(value); + c = getnum(value, 0, 0, false); if (c < 0 || c > 1) illegal(value, "l lazy-count"); sb_feat.lazy_sb_counters = c ? true @@ -1615,7 +1632,7 @@ main( case M_CRC: if (!value || *value == '\0') reqval('m', mopts, M_CRC); - c = atoi(value); + c = getnum(value, 0, 0, false); if (c < 0 || c > 1) illegal(value, "m crc"); sb_feat.crcs_enabled = c ? true : false; @@ -1656,7 +1673,7 @@ main( if (nsflag) conflict('n', nopts, N_SIZE, N_LOG); - dirblocklog = atoi(value); + dirblocklog = getnum(value, 0, 0, false); if (dirblocklog <= 0) illegal(value, "n log"); dirblocksize = 1 << dirblocklog; @@ -1670,8 +1687,8 @@ main( if (nlflag) conflict('n', nopts, N_LOG, N_SIZE); - dirblocksize = cvtnum( - blocksize, sectorsize, value); + dirblocksize = getnum(value, blocksize, + sectorsize, true); if (dirblocksize <= 0 || !ispow2(dirblocksize)) illegal(value, "n size"); @@ -1688,7 +1705,7 @@ main( /* ASCII CI mode */ sb_feat.nci = true; } else { - c = atoi(value); + c = getnum(value, 0, 0, false); if (c != 2) illegal(value, "n version"); @@ -1701,7 +1718,7 @@ main( reqval('n', nopts, N_FTYPE); if (nftype) respec('n', nopts, N_FTYPE); - c = atoi(value); + c = getnum(value, 0, 0, false); if (c < 0 || c > 1) illegal(value, "n ftype"); sb_feat.dirftype = c ? true : false; @@ -1742,7 +1759,7 @@ main( case R_FILE: if (!value || *value == '\0') value = "1"; - xi.risfile = atoi(value); + xi.risfile = getnum(value, 0, 0, false); if (xi.risfile < 0 || xi.risfile > 1) illegal(value, "r file"); if (xi.risfile) @@ -1786,7 +1803,7 @@ main( if (ssflag || lssflag) conflict('s', sopts, S_SECTSIZE, S_SECTLOG); - sectorlog = atoi(value); + sectorlog = getnum(value, 0, 0, false); if (sectorlog <= 0) illegal(value, "s sectlog"); lsectorlog = sectorlog; @@ -1803,8 +1820,8 @@ main( if (slflag || lslflag) conflict('s', sopts, S_SECTLOG, S_SECTSIZE); - sectorsize = cvtnum( - blocksize, sectorsize, value); + sectorsize = getnum(value, blocksize, + sectorsize, true); if (sectorsize <= 0 || !ispow2(sectorsize)) illegal(value, "s sectsize"); @@ -1864,6 +1881,15 @@ _("Minimum block size for CRC enabled filesystems is %d bytes.\n"), usage(); } + if (!slflag && !ssflag) { + sectorlog = XFS_MIN_SECTORSIZE_LOG; + sectorsize = XFS_MIN_SECTORSIZE; + } + if (!lslflag && !lssflag) { + lsectorlog = sectorlog; + lsectorsize = sectorsize; + } + memset(&ft, 0, sizeof(ft)); get_topology(&xi, &ft, force_overwrite); @@ -2027,7 +2053,9 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); if (dsize) { __uint64_t dbytes; - dbytes = cvtnum(blocksize, sectorsize, dsize); + dbytes = getnum(dsize, blocksize, sectorsize, true); + if ((__int64_t)dbytes < 0) + illegal(dsize, "d size"); if (dbytes % XFS_MIN_BLOCKSIZE) { fprintf(stderr, _("illegal data length %lld, not a multiple of %d\n"), @@ -2064,7 +2092,9 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); if (logsize) { __uint64_t logbytes; - logbytes = cvtnum(blocksize, sectorsize, logsize); + logbytes = getnum(logsize, blocksize, sectorsize, true); + if ((__int64_t)logbytes < 0) + illegal(logsize, "l size"); if (logbytes % XFS_MIN_BLOCKSIZE) { fprintf(stderr, _("illegal log length %lld, not a multiple of %d\n"), @@ -2086,7 +2116,9 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); if (rtsize) { __uint64_t rtbytes; - rtbytes = cvtnum(blocksize, sectorsize, rtsize); + rtbytes = getnum(rtsize, blocksize, sectorsize, true); + if ((__int64_t)rtbytes < 0) + illegal(rtsize, "r size"); if (rtbytes % XFS_MIN_BLOCKSIZE) { fprintf(stderr, _("illegal rt length %lld, not a multiple of %d\n"), @@ -2106,7 +2138,9 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); if (rtextsize) { __uint64_t rtextbytes; - rtextbytes = cvtnum(blocksize, sectorsize, rtextsize); + rtextbytes = getnum(rtextsize, blocksize, sectorsize, true); + if ((__int64_t)rtextbytes < 0) + illegal(rtsize, "r extsize"); if (rtextbytes % blocksize) { fprintf(stderr, _("illegal rt extent size %lld, not a multiple of %d\n"), @@ -3219,28 +3253,11 @@ unknown( usage(); } -/* - * isdigits -- returns 1 if string contains nothing but [0-9], 0 otherwise - */ -int -isdigits( - char *str) -{ - int i; - int n = strlen(str); - - for (i = 0; i < n; i++) { - if (!isdigit((int)str[i])) - return 0; - } - return 1; -} - long long cvtnum( unsigned int blocksize, unsigned int sectorsize, - char *s) + const char *s) { long long i; char *sp; @@ -3251,17 +3268,11 @@ cvtnum( if (*sp == '\0') return i; - if (*sp == 'b' && sp[1] == '\0') { - if (blocksize) - return i * blocksize; - fprintf(stderr, _("blocksize not available yet.\n")); - usage(); - } - if (*sp == 's' && sp[1] == '\0') { - if (sectorsize) - return i * sectorsize; - return i * BBSIZE; - } + if (*sp == 'b' && sp[1] == '\0') + return i * blocksize; + if (*sp == 's' && sp[1] == '\0') + return i * sectorsize; + if (*sp == 'k' && sp[1] == '\0') return 1024LL * i; if (*sp == 'm' && sp[1] == '\0') -- 2.5.0 From jtulak@redhat.com Thu Apr 21 04:40:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E9A247CB7 for ; Thu, 21 Apr 2016 04:40:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id AF08130404E for ; Thu, 21 Apr 2016 02:40:05 -0700 (PDT) X-ASG-Debug-ID: 1461231602-04cb6c09a1438d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xsxLhW985mAlVL78 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 21 Apr 2016 02:40:03 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id BF0AC3E70A7 for ; Thu, 21 Apr 2016 09:40:02 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3L9ds0L007155 for ; Thu, 21 Apr 2016 05:40:02 -0400 From: Jan Tulak To: xfs@oss.sgi.com Subject: [PATCH 08/19] mkfs: getbool is redundant Date: Thu, 21 Apr 2016 11:39:42 +0200 X-ASG-Orig-Subj: [PATCH 08/19] mkfs: getbool is redundant Message-Id: <1461231593-31294-9-git-send-email-jtulak@redhat.com> In-Reply-To: <1461231593-31294-1-git-send-email-jtulak@redhat.com> References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461231603 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 15205 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner getbool() can be replaced with getnum_checked with appropriate min/max values set for the boolean variables. Make boolean arguments consistent - all accept 0 or 1 value now. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak --- CHANGES: * man page fixes --- man/man8/mkfs.xfs.8 | 19 +++-- mkfs/xfs_mkfs.c | 219 +++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 169 insertions(+), 69 deletions(-) diff --git a/man/man8/mkfs.xfs.8 b/man/man8/mkfs.xfs.8 index 8b068ef..be3d1a0 100644 --- a/man/man8/mkfs.xfs.8 +++ b/man/man8/mkfs.xfs.8 @@ -118,6 +118,9 @@ option or the option first needs to be added to the command line. Failure to specify the size of the units will result in illegal value errors when parameters are quantified in those units. +.PP +Many options allows for optional argument of value 0 or 1, to explicitly +disable or enable the functionality. .SH OPTIONS .TP .BI \-b " block_size_options" @@ -312,10 +315,12 @@ and .B swidth values. .TP -.BI noalign -This option disables automatic geometry detection and creates the filesystem +.BI noalign[= value ] +If the +.I value +is 1, this option disables automatic geometry detection and creates the filesystem without stripe geometry alignment even if the underlying storage device provides -this information. +this information. 0 disables this option, that is, enables automatic detection. .RE .TP .B \-f @@ -805,9 +810,11 @@ This suboption is only needed if the real-time section of the filesystem should occupy less space than the size of the partition or logical volume containing the section. .TP -.BI noalign -This option disables stripe size detection, enforcing a realtime device with no -stripe geometry. +.BI noalign[= value ] +If the +.I value +is 1, then the option disables stripe size detection, enforcing a realtime +device with no stripe geometry. 0 will enable stripe size detection. .RE .TP .BI \-s " sector_size" diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 86cfb7b..2f76b67 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -49,6 +49,7 @@ static long long cvtnum(unsigned int blocksize, unsigned int sectorsize, const char *s); #define MAX_SUBOPTS 16 +#define SUBOPT_NEEDS_VAL (-1LL) /* * Table for parsing mkfs parameters. * @@ -83,6 +84,13 @@ static long long cvtnum(unsigned int blocksize, * (Said in another way, you can't have minval and maxval both equal * to zero. But if one value is different: minval=0 and maxval=1, * then it is OK.) + * + * defaultval MANDATORY + * The value used if user specifies the subopt, but no value. + * If the subopt accepts some values (-d file=[1|0]), then this + * sets what is used with simple specifying the subopt (-d file). + * A special SUBOPT_NEEDS_VAL can be used to require a user-given + * value in any case. */ struct opt_params { const char name; @@ -91,6 +99,7 @@ struct opt_params { int index; long long minval; long long maxval; + long long defaultval; } subopt_params[MAX_SUBOPTS]; }; @@ -107,10 +116,12 @@ struct opt_params bopts = { { .index = B_LOG, .minval = XFS_MIN_BLOCKSIZE_LOG, .maxval = XFS_MAX_BLOCKSIZE_LOG, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = B_SIZE, .minval = XFS_MIN_BLOCKSIZE, .maxval = XFS_MAX_BLOCKSIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, }, }; @@ -152,38 +163,57 @@ struct opt_params dopts = { }, .subopt_params = { { .index = D_AGCOUNT, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_FILE, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, { .index = D_NAME, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SUNIT, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SWIDTH, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_AGSIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SU, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SW, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SECTLOG, .minval = XFS_MIN_SECTORSIZE_LOG, .maxval = XFS_MAX_SECTORSIZE_LOG, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SECTSIZE, .minval = XFS_MIN_SECTORSIZE, .maxval = XFS_MAX_SECTORSIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_NOALIGN, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, { .index = D_RTINHERIT, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_PROJINHERIT, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_EXTSZINHERIT, + .defaultval = SUBOPT_NEEDS_VAL, }, }, }; @@ -212,22 +242,36 @@ struct opt_params iopts = { }, .subopt_params = { { .index = I_ALIGN, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, { .index = I_LOG, .minval = XFS_DINODE_MIN_LOG, .maxval = XFS_DINODE_MAX_LOG, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_MAXPCT, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_PERBLOCK, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_SIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_ATTR, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_PROJID32BIT, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, { .index = I_SPINODES, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, }, }; @@ -263,32 +307,50 @@ struct opt_params lopts = { }, .subopt_params = { { .index = L_AGNUM, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_INTERNAL, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, { .index = L_SIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_VERSION, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SUNIT, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SU, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_DEV, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SECTLOG, .minval = XFS_MIN_SECTORSIZE_LOG, .maxval = XFS_MAX_SECTORSIZE_LOG, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SECTSIZE, .minval = XFS_MIN_SECTORSIZE, .maxval = XFS_MAX_SECTORSIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_FILE, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, { .index = L_NAME, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_LAZYSBCNTR, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, }, }; @@ -310,14 +372,20 @@ struct opt_params nopts = { { .index = N_LOG, .minval = XFS_MIN_REC_DIRSIZE, .maxval = XFS_MAX_BLOCKSIZE_LOG, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = N_SIZE, .minval = 1 << XFS_MIN_REC_DIRSIZE, .maxval = XFS_MAX_BLOCKSIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = N_VERSION, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = N_FTYPE, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, }, }; @@ -341,16 +409,26 @@ struct opt_params ropts = { }, .subopt_params = { { .index = R_EXTSIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_SIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_DEV, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_FILE, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, { .index = R_NAME, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_NOALIGN, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, }, }; @@ -372,18 +450,22 @@ struct opt_params sopts = { { .index = S_LOG, .minval = XFS_MIN_SECTORSIZE_LOG, .maxval = XFS_MAX_SECTORSIZE_LOG, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = S_SECTLOG, .minval = XFS_MIN_SECTORSIZE_LOG, .maxval = XFS_MAX_SECTORSIZE_LOG, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = S_SIZE, .minval = XFS_MIN_SECTORSIZE, .maxval = XFS_MAX_SECTORSIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = S_SECTSIZE, .minval = XFS_MIN_SECTORSIZE, .maxval = XFS_MAX_SECTORSIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, }, }; @@ -394,13 +476,24 @@ struct opt_params mopts = { #define M_CRC 0 "crc", #define M_FINOBT 1 - "finobt", + "finobt", #define M_UUID 2 "uuid", NULL }, .subopt_params = { { .index = M_CRC, + .minval = 0, + .maxval = 1, + .defaultval = 1, + }, + { .index = M_FINOBT, + .minval = 0, + .maxval = 1, + .defaultval = 1, + }, + { .index = M_UUID, + .defaultval = SUBOPT_NEEDS_VAL, }, }, }; @@ -1221,22 +1314,6 @@ getnum( return i; } -static bool -getbool( - const char *str, - const char *illegal_str, - bool default_val) -{ - long long c; - - if (!str || *str == '\0') - return default_val; - c = getnum(str, 0, 0, false); - if (c < 0 || c > 1) - illegal(str, illegal_str); - return c ? true : false; -} - static __attribute__((noreturn)) void illegal_option( const char *value, @@ -1251,17 +1328,27 @@ illegal_option( static int getnum_checked( - const char *str, + const char *str, struct opt_params *opts, - int index) + int index) { - long long c; + const struct subopt_param *sp = &opts->subopt_params[index]; + long long c; - if (!str || *str == '\0') + if (sp->index != index) { + fprintf(stderr, + ("Developer screwed up option parsing (%d/%d)! Please report!\n"), + sp->index, index); reqval(opts->name, (char **)opts->subopts, index); + } + + if (!str || *str == '\0') { + if (sp->defaultval == SUBOPT_NEEDS_VAL) + reqval(opts->name, (char **)opts->subopts, index); + return sp->defaultval; + } - if (opts->subopt_params[index].minval == 0 && - opts->subopt_params[index].maxval == 0) { + if (sp->minval == 0 && sp->maxval == 0) { fprintf(stderr, _("Option -%c %s has undefined minval/maxval." "Can't verify value range. This is a bug.\n"), @@ -1270,8 +1357,7 @@ getnum_checked( } c = getnum(str, 0, 0, false); - if (c < opts->subopt_params[index].minval || - c > opts->subopt_params[index].maxval) + if (c < sp->minval || c > sp->maxval) illegal_option(str, opts, index); return c; } @@ -1496,8 +1582,8 @@ main( dasize = 1; break; case D_FILE: - xi.disfile = getbool(value, "d file", - true); + xi.disfile = getnum_checked(value, + &dopts, D_FILE); if (xi.disfile && !Nflag) xi.dcreat = 1; break; @@ -1565,19 +1651,22 @@ main( illegal(value, "d sw"); break; case D_NOALIGN: - if (dsu) - conflict('d', subopts, D_SU, - D_NOALIGN); - if (dsunit) - conflict('d', subopts, D_SUNIT, - D_NOALIGN); - if (dsw) - conflict('d', subopts, D_SW, - D_NOALIGN); - if (dswidth) - conflict('d', subopts, D_SWIDTH, - D_NOALIGN); - nodsflag = 1; + nodsflag = getnum_checked(value, + &dopts, D_NOALIGN); + if (nodsflag) { + if (dsu) + conflict('d', subopts, D_SU, + D_NOALIGN); + if (dsunit) + conflict('d', subopts, D_SUNIT, + D_NOALIGN); + if (dsw) + conflict('d', subopts, D_SW, + D_NOALIGN); + if (dswidth) + conflict('d', subopts, D_SWIDTH, + D_NOALIGN); + } break; case D_SECTLOG: if (slflag) @@ -1639,8 +1728,8 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case I_ALIGN: - sb_feat.inode_align = getbool( - value, "i align", true); + sb_feat.inode_align = getnum_checked( + value, &iopts, I_ALIGN); break; case I_LOG: if (ilflag) @@ -1710,12 +1799,14 @@ main( sb_feat.attr_version = c; break; case I_PROJID32BIT: - sb_feat.projid16bit = !getbool(value, - "i projid32bit", false); + sb_feat.projid16bit = + !getnum_checked(value, &iopts, + I_PROJID32BIT); break; case I_SPINODES: - sb_feat.spinodes = getbool(value, - "i spinodes", true); + sb_feat.spinodes = + getnum_checked(value, &iopts, + I_SPINODES); break; default: unknown('i', value); @@ -1743,11 +1834,11 @@ main( laflag = 1; break; case L_FILE: - if (loginternal) + xi.lisfile = getnum_checked(value, + &lopts, L_FILE); + if (xi.lisfile && loginternal) conflict('l', subopts, L_INTERNAL, L_FILE); - xi.lisfile = getbool(value, "l file", - true); if (xi.lisfile) xi.lcreat = 1; break; @@ -1760,8 +1851,8 @@ main( if (liflag) respec('l', subopts, L_INTERNAL); - loginternal = getbool(value, - "l internal", true); + loginternal = getnum_checked(value, + &lopts, L_INTERNAL); liflag = 1; break; case L_SU: @@ -1848,9 +1939,9 @@ main( lssflag = 1; break; case L_LAZYSBCNTR: - sb_feat.lazy_sb_counters = getbool( - value, "l lazy-count", - true); + sb_feat.lazy_sb_counters = + getnum_checked(value, &lopts, + L_LAZYSBCNTR); break; default: unknown('l', value); @@ -1871,15 +1962,16 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case M_CRC: - sb_feat.crcs_enabled = getbool( - value, "m crc", true); + sb_feat.crcs_enabled = + getnum_checked(value, &mopts, + M_CRC); if (sb_feat.crcs_enabled) sb_feat.dirftype = true; break; case M_FINOBT: sb_feat.finobtflag = true; - sb_feat.finobt = getbool( - value, "m finobt", true); + sb_feat.finobt = getnum_checked( + value, &mopts, M_FINOBT); break; case M_UUID: if (!value || *value == '\0') @@ -1948,8 +2040,8 @@ main( case N_FTYPE: if (nftype) respec('n', subopts, N_FTYPE); - sb_feat.dirftype = getbool(value, - "n ftype", true); + sb_feat.dirftype = getnum_checked(value, + &nopts, N_FTYPE); nftype = 1; break; default: @@ -1987,8 +2079,8 @@ main( rtextsize = value; break; case R_FILE: - xi.risfile = getbool(value, - "r file", true); + xi.risfile = getnum_checked(value, + &ropts, R_FILE); if (xi.risfile) xi.rcreat = 1; break; @@ -2008,7 +2100,8 @@ main( rtsize = value; break; case R_NOALIGN: - norsflag = 1; + norsflag = getnum_checked(value, + &ropts, R_NOALIGN); break; default: unknown('r', value); -- 2.5.0 From jtulak@redhat.com Thu Apr 21 04:40:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0BA827CB9 for ; Thu, 21 Apr 2016 04:40:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D2B3A30405F for ; Thu, 21 Apr 2016 02:40:05 -0700 (PDT) X-ASG-Debug-ID: 1461231603-04cbb00fe92d3b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id pvg3MTXCVgba7nYr (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 21 Apr 2016 02:40:04 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 95C7BBDD2 for ; Thu, 21 Apr 2016 09:40:03 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3L9ds0M007155 for ; Thu, 21 Apr 2016 05:40:03 -0400 From: Jan Tulak To: xfs@oss.sgi.com Subject: [PATCH 09/19] mkfs: use getnum_checked for all ranged parameters Date: Thu, 21 Apr 2016 11:39:43 +0200 X-ASG-Orig-Subj: [PATCH 09/19] mkfs: use getnum_checked for all ranged parameters Message-Id: <1461231593-31294-10-git-send-email-jtulak@redhat.com> In-Reply-To: <1461231593-31294-1-git-send-email-jtulak@redhat.com> References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461231604 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11024 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner Now that getnum_checked can handle min/max checking, use this for all parameters that take straight numbers and don't require unit conversions. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak Reviewed-by: Eric Sandeen --- include/xfs_multidisk.h | 5 +- mkfs/xfs_mkfs.c | 146 ++++++++++++++++++++++++------------------------ 2 files changed, 76 insertions(+), 75 deletions(-) diff --git a/include/xfs_multidisk.h b/include/xfs_multidisk.h index 3e892d5..ecc8f0a 100644 --- a/include/xfs_multidisk.h +++ b/include/xfs_multidisk.h @@ -42,8 +42,9 @@ #define XFS_AG_BYTES(bblog) ((long long)BBSIZE << (bblog)) #define XFS_AG_MIN_BYTES ((XFS_AG_BYTES(15))) /* 16 MB */ -#define XFS_AG_MIN_BLOCKS(blog) ((XFS_AG_BYTES(15)) >> (blog)) -#define XFS_AG_MAX_BLOCKS(blog) ((XFS_AG_BYTES(31) - 1) >> (blog)) +#define XFS_AG_MAX_BYTES ((XFS_AG_BYTES(31))) /* 1 TB */ +#define XFS_AG_MIN_BLOCKS(blog) (XFS_AG_MIN_BYTES >> (blog)) +#define XFS_AG_MAX_BLOCKS(blog) ((XFS_AG_MAX_BYTES - 1) >> (blog)) #define XFS_MAX_AGNUMBER ((xfs_agnumber_t)(NULLAGNUMBER - 1)) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 2f76b67..f3d0165 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -163,6 +163,8 @@ struct opt_params dopts = { }, .subopt_params = { { .index = D_AGCOUNT, + .minval = 1, + .maxval = XFS_MAX_AGNUMBER, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_FILE, @@ -177,18 +179,26 @@ struct opt_params dopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SUNIT, + .minval = 0, + .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SWIDTH, + .minval = 0, + .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_AGSIZE, + .minval = XFS_AG_MIN_BYTES, + .maxval = XFS_AG_MAX_BYTES, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SU, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SW, + .minval = 0, + .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SECTLOG, @@ -207,12 +217,18 @@ struct opt_params dopts = { .defaultval = 1, }, { .index = D_RTINHERIT, - .defaultval = SUBOPT_NEEDS_VAL, + .minval = 1, + .maxval = 1, + .defaultval = 1, }, { .index = D_PROJINHERIT, + .minval = 0, + .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_EXTSZINHERIT, + .minval = 0, + .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, }, @@ -252,15 +268,23 @@ struct opt_params iopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_MAXPCT, + .minval = 0, + .maxval = 100, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_PERBLOCK, + .minval = XFS_MIN_INODE_PERBLOCK, + .maxval = XFS_MAX_BLOCKSIZE / XFS_DINODE_MIN_SIZE, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_SIZE, + .minval = XFS_DINODE_MIN_SIZE, + .maxval = XFS_DINODE_MAX_SIZE, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_ATTR, + .minval = 0, + .maxval = 2, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_PROJID32BIT, @@ -307,6 +331,8 @@ struct opt_params lopts = { }, .subopt_params = { { .index = L_AGNUM, + .minval = 0, + .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_INTERNAL, @@ -318,9 +344,13 @@ struct opt_params lopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_VERSION, + .minval = 1, + .maxval = 2, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SUNIT, + .minval = BTOBB(XLOG_MIN_RECORD_BSIZE), + .maxval = BTOBB(XLOG_MAX_RECORD_BSIZE), .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SU, @@ -380,6 +410,8 @@ struct opt_params nopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = N_VERSION, + .minval = 2, + .maxval = 2, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = N_FTYPE, @@ -1561,13 +1593,11 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case D_AGCOUNT: - if (!value || *value == '\0') - reqval('d', subopts, D_AGCOUNT); if (daflag) respec('d', subopts, D_AGCOUNT); - agcount = getnum(value, 0, 0, false); - if ((__int64_t)agcount <= 0) - illegal(value, "d agcount"); + + agcount = getnum_checked(value, &dopts, + D_AGCOUNT); daflag = 1; break; case D_AGSIZE: @@ -1602,28 +1632,22 @@ main( dsize = value; break; case D_SUNIT: - if (!value || *value == '\0') - reqval('d', subopts, D_SUNIT); if (dsunit) respec('d', subopts, D_SUNIT); if (nodsflag) conflict('d', subopts, D_NOALIGN, D_SUNIT); - dsunit = getnum(value, 0, 0, false); - if (dsunit < 0) - illegal(value, "d sunit"); + dsunit = getnum_checked(value, &dopts, + D_SUNIT); break; case D_SWIDTH: - if (!value || *value == '\0') - reqval('d', subopts, D_SWIDTH); if (dswidth) respec('d', subopts, D_SWIDTH); if (nodsflag) conflict('d', subopts, D_NOALIGN, D_SWIDTH); - dswidth = getnum(value, 0, 0, false); - if (dswidth < 0) - illegal(value, "d swidth"); + dswidth = getnum_checked(value, &dopts, + D_SWIDTH); break; case D_SU: if (!value || *value == '\0') @@ -1639,16 +1663,13 @@ main( illegal(value, "d su"); break; case D_SW: - if (!value || *value == '\0') - reqval('d', subopts, D_SW); if (dsw) respec('d', subopts, D_SW); if (nodsflag) conflict('d', subopts, D_NOALIGN, D_SW); - dsw = getnum(value, 0, 0, false); - if (dsw < 0) - illegal(value, "d sw"); + dsw = getnum_checked(value, &dopts, + D_SW); break; case D_NOALIGN: nodsflag = getnum_checked(value, @@ -1697,21 +1718,22 @@ main( ssflag = 1; break; case D_RTINHERIT: - fsx.fsx_xflags |= \ - XFS_DIFLAG_RTINHERIT; + c = getnum_checked(value, &dopts, + D_RTINHERIT); + if (c) + fsx.fsx_xflags |= + XFS_DIFLAG_RTINHERIT; break; case D_PROJINHERIT: - if (!value || *value == '\0') - reqval('d', subopts, D_PROJINHERIT); - fsx.fsx_projid = atoi(value); - fsx.fsx_xflags |= \ + fsx.fsx_projid = getnum_checked(value, + &dopts, D_PROJINHERIT); + fsx.fsx_xflags |= XFS_DIFLAG_PROJINHERIT; break; case D_EXTSZINHERIT: - if (!value || *value == '\0') - reqval('d', subopts, D_EXTSZINHERIT); - fsx.fsx_extsize = atoi(value); - fsx.fsx_xflags |= \ + fsx.fsx_extsize = getnum_checked(value, + &dopts, D_EXTSZINHERIT); + fsx.fsx_xflags |= XFS_DIFLAG_EXTSZINHERIT; break; default: @@ -1746,18 +1768,13 @@ main( ilflag = 1; break; case I_MAXPCT: - if (!value || *value == '\0') - reqval('i', subopts, I_MAXPCT); if (imflag) respec('i', subopts, I_MAXPCT); - imaxpct = getnum(value, 0, 0, false); - if (imaxpct < 0 || imaxpct > 100) - illegal(value, "i maxpct"); + imaxpct = getnum_checked( + value, &iopts, I_MAXPCT); imflag = 1; break; case I_PERBLOCK: - if (!value || *value == '\0') - reqval('i', subopts, I_PERBLOCK); if (ilflag) conflict('i', subopts, I_LOG, I_PERBLOCK); @@ -1766,16 +1783,13 @@ main( if (isflag) conflict('i', subopts, I_SIZE, I_PERBLOCK); - inopblock = getnum(value, 0, 0, false); - if (inopblock < - XFS_MIN_INODE_PERBLOCK || - !ispow2(inopblock)) + inopblock = getnum_checked(value, &iopts, + I_PERBLOCK); + if (!ispow2(inopblock)) illegal(value, "i perblock"); ipflag = 1; break; case I_SIZE: - if (!value || *value == '\0') - reqval('i', subopts, I_SIZE); if (ilflag) conflict('i', subopts, I_LOG, I_SIZE); @@ -1784,19 +1798,16 @@ main( I_SIZE); if (isflag) respec('i', subopts, I_SIZE); - isize = getnum(value, 0, 0, true); - if (isize <= 0 || !ispow2(isize)) + isize = getnum_checked(value, &iopts, + I_SIZE); + if (!ispow2(isize)) illegal(value, "i size"); inodelog = libxfs_highbit32(isize); isflag = 1; break; case I_ATTR: - if (!value || *value == '\0') - reqval('i', subopts, I_ATTR); - c = getnum(value, 0, 0, false); - if (c < 0 || c > 2) - illegal(value, "i attr"); - sb_feat.attr_version = c; + sb_feat.attr_version = getnum_checked( + value, &iopts, I_ATTR); break; case I_PROJID32BIT: sb_feat.projid16bit = @@ -1822,15 +1833,12 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case L_AGNUM: - if (!value || *value == '\0') - reqval('l', subopts, L_AGNUM); if (laflag) respec('l', subopts, L_AGNUM); if (ldflag) conflict('l', subopts, L_AGNUM, L_DEV); - logagno = getnum(value, 0, 0, false); - if ((__int64_t)logagno < 0) - illegal(value, "l agno"); + logagno = getnum_checked(value, &lopts, + L_AGNUM); laflag = 1; break; case L_FILE: @@ -1867,13 +1875,10 @@ main( lsuflag = 1; break; case L_SUNIT: - if (!value || *value == '\0') - reqval('l', subopts, L_SUNIT); if (lsunit) respec('l', subopts, L_SUNIT); - lsunit = getnum(value, 0, 0, false); - if (lsunit < 0) - illegal(value, "l sunit"); + lsunit = getnum_checked(value, &lopts, + L_SUNIT); lsunitflag = 1; break; case L_NAME: @@ -1892,14 +1897,10 @@ main( xi.logname = value; break; case L_VERSION: - if (!value || *value == '\0') - reqval('l', subopts, L_VERSION); if (lvflag) respec('l', subopts, L_VERSION); - c = getnum(value, 0, 0, false); - if (c < 1 || c > 2) - illegal(value, "l version"); - sb_feat.log_version = c; + sb_feat.log_version = getnum_checked( + value, &lopts, L_VERSION); lvflag = 1; break; case L_SIZE: @@ -2029,11 +2030,10 @@ main( /* ASCII CI mode */ sb_feat.nci = true; } else { - c = getnum(value, 0, 0, false); - if (c != 2) - illegal(value, - "n version"); - sb_feat.dir_version = c; + sb_feat.dir_version = + getnum_checked(value, + &nopts, + N_VERSION); } nvflag = 1; break; -- 2.5.0 From jtulak@redhat.com Thu Apr 21 04:40:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B21B87CCC for ; Thu, 21 Apr 2016 04:40:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 02E0BAC001 for ; Thu, 21 Apr 2016 02:40:06 -0700 (PDT) X-ASG-Debug-ID: 1461231604-04cb6c09a0438d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id q5ynLCpu2mzHqvtm (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 21 Apr 2016 02:40:05 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6CBCCA8A6 for ; Thu, 21 Apr 2016 09:40:04 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3L9ds0N007155 for ; Thu, 21 Apr 2016 05:40:03 -0400 From: Jan Tulak To: xfs@oss.sgi.com Subject: [PATCH 10/19] mkfs: add respecification detection to generic parsing Date: Thu, 21 Apr 2016 11:39:44 +0200 X-ASG-Orig-Subj: [PATCH 10/19] mkfs: add respecification detection to generic parsing Message-Id: <1461231593-31294-11-git-send-email-jtulak@redhat.com> In-Reply-To: <1461231593-31294-1-git-send-email-jtulak@redhat.com> References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461231604 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8357 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner Add flags to the generic input parameter tables so that respecification can be detected in a generic manner. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak Reviewed-by: Eric Sandeen --- CHANGES: * remove unused variable nftype (appeared after a change in some previous patch removed a line using it and then this patch removed the last usage). --- mkfs/xfs_mkfs.c | 67 ++++++++++++++++----------------------------------------- 1 file changed, 18 insertions(+), 49 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index f3d0165..e45b72b 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -72,6 +72,10 @@ static long long cvtnum(unsigned int blocksize, * it is. The index has to be the same as is the order in subopts list, * so we can access the right item both in subopt_param and subopts. * + * seen INTERNAL + * Do not set this flag when definning a subopt. It is used to remeber that + * this subopt was already seen, for example for conflicts detection. + * * minval, maxval OPTIONAL * These options are used for automatic range check and they have to be * always used together in pair. If you don't want to limit the max value, @@ -95,8 +99,10 @@ static long long cvtnum(unsigned int blocksize, struct opt_params { const char name; const char *subopts[MAX_SUBOPTS]; + struct subopt_param { int index; + bool seen; long long minval; long long maxval; long long defaultval; @@ -1228,7 +1234,6 @@ struct sb_feat_args { int dir_version; int spinodes; int finobt; - bool finobtflag; bool inode_align; bool nci; bool lazy_sb_counters; @@ -1364,7 +1369,7 @@ getnum_checked( struct opt_params *opts, int index) { - const struct subopt_param *sp = &opts->subopt_params[index]; + struct subopt_param *sp = &opts->subopt_params[index]; long long c; if (sp->index != index) { @@ -1374,6 +1379,11 @@ getnum_checked( reqval(opts->name, (char **)opts->subopts, index); } + /* check for respecification of the option */ + if (sp->seen) + respec(opts->name, (char **)opts->subopts, index); + sp->seen = true; + if (!str || *str == '\0') { if (sp->defaultval == SUBOPT_NEEDS_VAL) reqval(opts->name, (char **)opts->subopts, index); @@ -1463,7 +1473,6 @@ main( int nodsflag; int norsflag; xfs_alloc_rec_t *nrec; - int nftype; int nsflag; int nvflag; int Nflag; @@ -1491,7 +1500,6 @@ main( struct fs_topology ft; struct sb_feat_args sb_feat = { .finobt = 1, - .finobtflag = false, .spinodes = 0, .log_version = 2, .attr_version = 2, @@ -1522,7 +1530,6 @@ main( logagno = logblocks = rtblocks = rtextblocks = 0; sb_feat.dirftype = 1; /* inode type information in the dir */ Nflag = nlflag = nsflag = nvflag = 0; - nftype = 0; dirblocklog = dirblocksize = 0; qflag = 0; imaxpct = inodelog = inopblock = isize = 0; @@ -1553,8 +1560,6 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case B_LOG: - if (blflag) - respec('b', subopts, B_LOG); if (bsflag) conflict('b', subopts, B_SIZE, B_LOG); @@ -1593,9 +1598,6 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case D_AGCOUNT: - if (daflag) - respec('d', subopts, D_AGCOUNT); - agcount = getnum_checked(value, &dopts, D_AGCOUNT); daflag = 1; @@ -1632,8 +1634,6 @@ main( dsize = value; break; case D_SUNIT: - if (dsunit) - respec('d', subopts, D_SUNIT); if (nodsflag) conflict('d', subopts, D_NOALIGN, D_SUNIT); @@ -1641,8 +1641,6 @@ main( D_SUNIT); break; case D_SWIDTH: - if (dswidth) - respec('d', subopts, D_SWIDTH); if (nodsflag) conflict('d', subopts, D_NOALIGN, D_SWIDTH); @@ -1663,8 +1661,6 @@ main( illegal(value, "d su"); break; case D_SW: - if (dsw) - respec('d', subopts, D_SW); if (nodsflag) conflict('d', subopts, D_NOALIGN, D_SW); @@ -1690,8 +1686,6 @@ main( } break; case D_SECTLOG: - if (slflag) - respec('d', subopts, D_SECTLOG); if (ssflag) conflict('d', subopts, D_SECTSIZE, D_SECTLOG); @@ -1754,8 +1748,6 @@ main( value, &iopts, I_ALIGN); break; case I_LOG: - if (ilflag) - respec('i', subopts, I_LOG); if (ipflag) conflict('i', subopts, I_PERBLOCK, I_LOG); @@ -1768,18 +1760,14 @@ main( ilflag = 1; break; case I_MAXPCT: - if (imflag) - respec('i', subopts, I_MAXPCT); - imaxpct = getnum_checked( - value, &iopts, I_MAXPCT); + imaxpct = getnum_checked(value, &iopts, + I_MAXPCT); imflag = 1; break; case I_PERBLOCK: if (ilflag) conflict('i', subopts, I_LOG, I_PERBLOCK); - if (ipflag) - respec('i', subopts, I_PERBLOCK); if (isflag) conflict('i', subopts, I_SIZE, I_PERBLOCK); @@ -1796,8 +1784,6 @@ main( if (ipflag) conflict('i', subopts, I_PERBLOCK, I_SIZE); - if (isflag) - respec('i', subopts, I_SIZE); isize = getnum_checked(value, &iopts, I_SIZE); if (!ispow2(isize)) @@ -1833,8 +1819,6 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case L_AGNUM: - if (laflag) - respec('l', subopts, L_AGNUM); if (ldflag) conflict('l', subopts, L_AGNUM, L_DEV); logagno = getnum_checked(value, &lopts, @@ -1856,8 +1840,6 @@ main( if (xi.lisfile) conflict('l', subopts, L_FILE, L_INTERNAL); - if (liflag) - respec('l', subopts, L_INTERNAL); loginternal = getnum_checked(value, &lopts, L_INTERNAL); @@ -1875,8 +1857,6 @@ main( lsuflag = 1; break; case L_SUNIT: - if (lsunit) - respec('l', subopts, L_SUNIT); lsunit = getnum_checked(value, &lopts, L_SUNIT); lsunitflag = 1; @@ -1897,10 +1877,9 @@ main( xi.logname = value; break; case L_VERSION: - if (lvflag) - respec('l', subopts, L_VERSION); - sb_feat.log_version = getnum_checked( - value, &lopts, L_VERSION); + sb_feat.log_version = + getnum_checked(value, &lopts, + L_VERSION); lvflag = 1; break; case L_SIZE: @@ -1912,8 +1891,6 @@ main( lsflag = 1; break; case L_SECTLOG: - if (lslflag) - respec('l', subopts, L_SECTLOG); if (lssflag) conflict('l', subopts, L_SECTSIZE, L_SECTLOG); @@ -1970,7 +1947,6 @@ main( sb_feat.dirftype = true; break; case M_FINOBT: - sb_feat.finobtflag = true; sb_feat.finobt = getnum_checked( value, &mopts, M_FINOBT); break; @@ -1994,8 +1970,6 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case N_LOG: - if (nlflag) - respec('n', subopts, N_LOG); if (nsflag) conflict('n', subopts, N_SIZE, N_LOG); @@ -2038,11 +2012,8 @@ main( nvflag = 1; break; case N_FTYPE: - if (nftype) - respec('n', subopts, N_FTYPE); sb_feat.dirftype = getnum_checked(value, &nopts, N_FTYPE); - nftype = 1; break; default: unknown('n', value); @@ -2118,8 +2089,6 @@ main( &value)) { case S_LOG: case S_SECTLOG: - if (slflag || lslflag) - respec('s', subopts, S_SECTLOG); if (ssflag || lssflag) conflict('s', subopts, S_SECTSIZE, S_SECTLOG); @@ -2330,7 +2299,7 @@ _("32 bit Project IDs always enabled on CRC enabled filesytems\n")); * tried to use crc=0,finobt=1, then issue a warning before * turning them off. */ - if (sb_feat.finobt && sb_feat.finobtflag) { + if (sb_feat.finobt && mopts.subopt_params[M_FINOBT].seen) { fprintf(stderr, _("warning: finobt not supported without CRC support, disabled.\n")); } -- 2.5.0 From jtulak@redhat.com Thu Apr 21 04:40:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 174DA7CC7 for ; Thu, 21 Apr 2016 04:40:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6A03BAC002 for ; Thu, 21 Apr 2016 02:40:06 -0700 (PDT) X-ASG-Debug-ID: 1461231602-04bdf03590348d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id UogKsWilvX5BYqWn (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 21 Apr 2016 02:40:02 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id F1FC97F6B0 for ; Thu, 21 Apr 2016 09:40:01 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3L9ds0K007155 for ; Thu, 21 Apr 2016 05:40:01 -0400 From: Jan Tulak To: xfs@oss.sgi.com Subject: [PATCH 07/19] mkfs: structify input parameter passing Date: Thu, 21 Apr 2016 11:39:41 +0200 X-ASG-Orig-Subj: [PATCH 07/19] mkfs: structify input parameter passing Message-Id: <1461231593-31294-8-git-send-email-jtulak@redhat.com> In-Reply-To: <1461231593-31294-1-git-send-email-jtulak@redhat.com> References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461231602 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 29389 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner Passing large number of parameters around to number conversion functions is painful. Add a structure to encapsulate the constant parameters that are passed, and convert getnum_checked to use it. This is the first real step towards a table driven option parser. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak --- CHANGES * comments --- mkfs/xfs_mkfs.c | 650 ++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 439 insertions(+), 211 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 09370d8..86cfb7b 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -48,147 +48,361 @@ static int ispow2(unsigned int i); static long long cvtnum(unsigned int blocksize, unsigned int sectorsize, const char *s); +#define MAX_SUBOPTS 16 /* - * option tables for getsubopt calls + * Table for parsing mkfs parameters. + * + * Description of the structure members follows: + * + * name MANDATORY + * Name is a single char, e.g., for '-d file', name is 'd'. + * + * subopts MANDATORY + * Subopts is a list of strings naming suboptions. In the example above, + * it would contain "file". The last entry of this list has to be NULL. + * + * subopt_params MANDATORY + * This is a list of structs tied with subopts. For each entry in subopts, + * a corresponding entry has to be defined: + * + * subopt_params struct: + * index MANDATORY + * This number, starting from zero, denotes which item in subopt_params + * it is. The index has to be the same as is the order in subopts list, + * so we can access the right item both in subopt_param and subopts. + * + * minval, maxval OPTIONAL + * These options are used for automatic range check and they have to be + * always used together in pair. If you don't want to limit the max value, + * use something like UINT_MAX. If no value is given, then you must either + * supply your own validation, or refuse any value in the 'case + * X_SOMETHING' block. If you forget to define the min and max value, but + * call a standard function for validating user's value, it will cause an + * error message notifying you about this issue. + * + * (Said in another way, you can't have minval and maxval both equal + * to zero. But if one value is different: minval=0 and maxval=1, + * then it is OK.) */ -char *bopts[] = { +struct opt_params { + const char name; + const char *subopts[MAX_SUBOPTS]; + struct subopt_param { + int index; + long long minval; + long long maxval; + } subopt_params[MAX_SUBOPTS]; +}; + +struct opt_params bopts = { + .name = 'b', + .subopts = { #define B_LOG 0 - "log", + "log", #define B_SIZE 1 - "size", - NULL + "size", + NULL + }, + .subopt_params = { + { .index = B_LOG, + .minval = XFS_MIN_BLOCKSIZE_LOG, + .maxval = XFS_MAX_BLOCKSIZE_LOG, + }, + { .index = B_SIZE, + .minval = XFS_MIN_BLOCKSIZE, + .maxval = XFS_MAX_BLOCKSIZE, + }, + }, }; -char *dopts[] = { +struct opt_params dopts = { + .name = 'd', + .subopts = { #define D_AGCOUNT 0 - "agcount", + "agcount", #define D_FILE 1 - "file", + "file", #define D_NAME 2 - "name", + "name", #define D_SIZE 3 - "size", + "size", #define D_SUNIT 4 - "sunit", + "sunit", #define D_SWIDTH 5 - "swidth", + "swidth", #define D_AGSIZE 6 - "agsize", + "agsize", #define D_SU 7 - "su", + "su", #define D_SW 8 - "sw", + "sw", #define D_SECTLOG 9 - "sectlog", + "sectlog", #define D_SECTSIZE 10 - "sectsize", + "sectsize", #define D_NOALIGN 11 - "noalign", + "noalign", #define D_RTINHERIT 12 - "rtinherit", + "rtinherit", #define D_PROJINHERIT 13 - "projinherit", + "projinherit", #define D_EXTSZINHERIT 14 - "extszinherit", - NULL + "extszinherit", + NULL + }, + .subopt_params = { + { .index = D_AGCOUNT, + }, + { .index = D_FILE, + }, + { .index = D_NAME, + }, + { .index = D_SIZE, + }, + { .index = D_SUNIT, + }, + { .index = D_SWIDTH, + }, + { .index = D_AGSIZE, + }, + { .index = D_SU, + }, + { .index = D_SW, + }, + { .index = D_SECTLOG, + .minval = XFS_MIN_SECTORSIZE_LOG, + .maxval = XFS_MAX_SECTORSIZE_LOG, + }, + { .index = D_SECTSIZE, + .minval = XFS_MIN_SECTORSIZE, + .maxval = XFS_MAX_SECTORSIZE, + }, + { .index = D_NOALIGN, + }, + { .index = D_RTINHERIT, + }, + { .index = D_PROJINHERIT, + }, + { .index = D_EXTSZINHERIT, + }, + }, }; -char *iopts[] = { + +struct opt_params iopts = { + .name = 'i', + .subopts = { #define I_ALIGN 0 - "align", + "align", #define I_LOG 1 - "log", + "log", #define I_MAXPCT 2 - "maxpct", + "maxpct", #define I_PERBLOCK 3 - "perblock", + "perblock", #define I_SIZE 4 - "size", + "size", #define I_ATTR 5 - "attr", + "attr", #define I_PROJID32BIT 6 - "projid32bit", + "projid32bit", #define I_SPINODES 7 - "sparse", - NULL + "sparse", + NULL + }, + .subopt_params = { + { .index = I_ALIGN, + }, + { .index = I_LOG, + .minval = XFS_DINODE_MIN_LOG, + .maxval = XFS_DINODE_MAX_LOG, + }, + { .index = I_MAXPCT, + }, + { .index = I_PERBLOCK, + }, + { .index = I_SIZE, + }, + { .index = I_ATTR, + }, + { .index = I_PROJID32BIT, + }, + { .index = I_SPINODES, + }, + }, }; -char *lopts[] = { +struct opt_params lopts = { + .name = 'l', + .subopts = { #define L_AGNUM 0 - "agnum", + "agnum", #define L_INTERNAL 1 - "internal", + "internal", #define L_SIZE 2 - "size", + "size", #define L_VERSION 3 - "version", + "version", #define L_SUNIT 4 - "sunit", + "sunit", #define L_SU 5 - "su", + "su", #define L_DEV 6 - "logdev", + "logdev", #define L_SECTLOG 7 - "sectlog", + "sectlog", #define L_SECTSIZE 8 - "sectsize", + "sectsize", #define L_FILE 9 - "file", + "file", #define L_NAME 10 - "name", + "name", #define L_LAZYSBCNTR 11 - "lazy-count", - NULL + "lazy-count", + NULL + }, + .subopt_params = { + { .index = L_AGNUM, + }, + { .index = L_INTERNAL, + }, + { .index = L_SIZE, + }, + { .index = L_VERSION, + }, + { .index = L_SUNIT, + }, + { .index = L_SU, + }, + { .index = L_DEV, + }, + { .index = L_SECTLOG, + .minval = XFS_MIN_SECTORSIZE_LOG, + .maxval = XFS_MAX_SECTORSIZE_LOG, + }, + { .index = L_SECTSIZE, + .minval = XFS_MIN_SECTORSIZE, + .maxval = XFS_MAX_SECTORSIZE, + }, + { .index = L_FILE, + }, + { .index = L_NAME, + }, + { .index = L_LAZYSBCNTR, + }, + }, }; -char *nopts[] = { +struct opt_params nopts = { + .name = 'n', + .subopts = { #define N_LOG 0 - "log", + "log", #define N_SIZE 1 - "size", + "size", #define N_VERSION 2 - "version", + "version", #define N_FTYPE 3 - "ftype", + "ftype", NULL, + }, + .subopt_params = { + { .index = N_LOG, + .minval = XFS_MIN_REC_DIRSIZE, + .maxval = XFS_MAX_BLOCKSIZE_LOG, + }, + { .index = N_SIZE, + .minval = 1 << XFS_MIN_REC_DIRSIZE, + .maxval = XFS_MAX_BLOCKSIZE, + }, + { .index = N_VERSION, + }, + { .index = N_FTYPE, + }, + }, }; -char *ropts[] = { +struct opt_params ropts = { + .name = 'r', + .subopts = { #define R_EXTSIZE 0 - "extsize", + "extsize", #define R_SIZE 1 - "size", + "size", #define R_DEV 2 - "rtdev", + "rtdev", #define R_FILE 3 - "file", + "file", #define R_NAME 4 - "name", + "name", #define R_NOALIGN 5 - "noalign", - NULL + "noalign", + NULL + }, + .subopt_params = { + { .index = R_EXTSIZE, + }, + { .index = R_SIZE, + }, + { .index = R_DEV, + }, + { .index = R_FILE, + }, + { .index = R_NAME, + }, + { .index = R_NOALIGN, + }, + }, }; -char *sopts[] = { +struct opt_params sopts = { + .name = 's', + .subopts = { #define S_LOG 0 - "log", + "log", #define S_SECTLOG 1 - "sectlog", + "sectlog", #define S_SIZE 2 - "size", + "size", #define S_SECTSIZE 3 - "sectsize", - NULL + "sectsize", + NULL + }, + .subopt_params = { + { .index = S_LOG, + .minval = XFS_MIN_SECTORSIZE_LOG, + .maxval = XFS_MAX_SECTORSIZE_LOG, + }, + { .index = S_SECTLOG, + .minval = XFS_MIN_SECTORSIZE_LOG, + .maxval = XFS_MAX_SECTORSIZE_LOG, + }, + { .index = S_SIZE, + .minval = XFS_MIN_SECTORSIZE, + .maxval = XFS_MAX_SECTORSIZE, + }, + { .index = S_SECTSIZE, + .minval = XFS_MIN_SECTORSIZE, + .maxval = XFS_MAX_SECTORSIZE, + }, + }, }; -char *mopts[] = { +struct opt_params mopts = { + .name = 'm', + .subopts = { #define M_CRC 0 - "crc", + "crc", #define M_FINOBT 1 "finobt", #define M_UUID 2 - "uuid", - NULL + "uuid", + NULL + }, + .subopt_params = { + { .index = M_CRC, + }, + }, }; #define TERABYTES(count, blog) ((__uint64_t)(count) << (40 - (blog))) @@ -1023,24 +1237,42 @@ getbool( return c ? true : false; } +static __attribute__((noreturn)) void +illegal_option( + const char *value, + struct opt_params *opts, + int index) +{ + fprintf(stderr, + _("Illegal value %s for -%c %s option\n"), + value, opts->name, opts->subopts[index]); + usage(); +} + static int getnum_checked( const char *str, - long long min_val, - long long max_val, - const char *illegal_str, - char reqval_char, - char *reqval_opts[], - int reqval_optind) + struct opt_params *opts, + int index) { long long c; if (!str || *str == '\0') - reqval(reqval_char, reqval_opts, reqval_optind); + reqval(opts->name, (char **)opts->subopts, index); + + if (opts->subopt_params[index].minval == 0 && + opts->subopt_params[index].maxval == 0) { + fprintf(stderr, + _("Option -%c %s has undefined minval/maxval." + "Can't verify value range. This is a bug.\n"), + opts->name, opts->subopts[index]); + exit(1); + } c = getnum(str, 0, 0, false); - if (c < min_val || c > max_val) - illegal(str, illegal_str); + if (c < opts->subopt_params[index].minval || + c > opts->subopt_params[index].maxval) + illegal_option(str, opts, index); return c; } @@ -1197,30 +1429,29 @@ main( case 'b': p = optarg; while (*p != '\0') { + char **subopts = (char **)bopts.subopts; char *value; - switch (getsubopt(&p, (constpp)bopts, &value)) { + switch (getsubopt(&p, (constpp)subopts, + &value)) { case B_LOG: if (blflag) - respec('b', bopts, B_LOG); + respec('b', subopts, B_LOG); if (bsflag) - conflict('b', bopts, B_SIZE, + conflict('b', subopts, B_SIZE, B_LOG); - blocklog = getnum_checked(value, - XFS_MIN_BLOCKSIZE_LOG, - XFS_MAX_BLOCKSIZE_LOG, - "b log", 'b', bopts, - B_LOG); + blocklog = getnum_checked(value, &bopts, + B_LOG); blocksize = 1 << blocklog; blflag = 1; break; case B_SIZE: if (!value || *value == '\0') - reqval('b', bopts, B_SIZE); + reqval('b', subopts, B_SIZE); if (bsflag) - respec('b', bopts, B_SIZE); + respec('b', subopts, B_SIZE); if (blflag) - conflict('b', bopts, B_LOG, + conflict('b', subopts, B_LOG, B_SIZE); blocksize = getnum(value, blocksize, sectorsize, true); @@ -1238,14 +1469,16 @@ main( case 'd': p = optarg; while (*p != '\0') { + char **subopts = (char **)dopts.subopts; char *value; - switch (getsubopt(&p, (constpp)dopts, &value)) { + switch (getsubopt(&p, (constpp)subopts, + &value)) { case D_AGCOUNT: if (!value || *value == '\0') - reqval('d', dopts, D_AGCOUNT); + reqval('d', subopts, D_AGCOUNT); if (daflag) - respec('d', dopts, D_AGCOUNT); + respec('d', subopts, D_AGCOUNT); agcount = getnum(value, 0, 0, false); if ((__int64_t)agcount <= 0) illegal(value, "d agcount"); @@ -1253,9 +1486,9 @@ main( break; case D_AGSIZE: if (!value || *value == '\0') - reqval('d', dopts, D_AGSIZE); + reqval('d', subopts, D_AGSIZE); if (dasize) - respec('d', dopts, D_AGSIZE); + respec('d', subopts, D_AGSIZE); agsize = getnum(value, blocksize, sectorsize, true); if ((__int64_t)agsize <= 0) @@ -1270,25 +1503,25 @@ main( break; case D_NAME: if (!value || *value == '\0') - reqval('d', dopts, D_NAME); + reqval('d', subopts, D_NAME); if (xi.dname) - respec('d', dopts, D_NAME); + respec('d', subopts, D_NAME); xi.dname = value; break; case D_SIZE: if (!value || *value == '\0') - reqval('d', dopts, D_SIZE); + reqval('d', subopts, D_SIZE); if (dsize) - respec('d', dopts, D_SIZE); + respec('d', subopts, D_SIZE); dsize = value; break; case D_SUNIT: if (!value || *value == '\0') - reqval('d', dopts, D_SUNIT); + reqval('d', subopts, D_SUNIT); if (dsunit) - respec('d', dopts, D_SUNIT); + respec('d', subopts, D_SUNIT); if (nodsflag) - conflict('d', dopts, D_NOALIGN, + conflict('d', subopts, D_NOALIGN, D_SUNIT); dsunit = getnum(value, 0, 0, false); if (dsunit < 0) @@ -1296,11 +1529,11 @@ main( break; case D_SWIDTH: if (!value || *value == '\0') - reqval('d', dopts, D_SWIDTH); + reqval('d', subopts, D_SWIDTH); if (dswidth) - respec('d', dopts, D_SWIDTH); + respec('d', subopts, D_SWIDTH); if (nodsflag) - conflict('d', dopts, D_NOALIGN, + conflict('d', subopts, D_NOALIGN, D_SWIDTH); dswidth = getnum(value, 0, 0, false); if (dswidth < 0) @@ -1308,11 +1541,11 @@ main( break; case D_SU: if (!value || *value == '\0') - reqval('d', dopts, D_SU); + reqval('d', subopts, D_SU); if (dsu) - respec('d', dopts, D_SU); + respec('d', subopts, D_SU); if (nodsflag) - conflict('d', dopts, D_NOALIGN, + conflict('d', subopts, D_NOALIGN, D_SU); dsu = getnum(value, blocksize, sectorsize, true); @@ -1321,11 +1554,11 @@ main( break; case D_SW: if (!value || *value == '\0') - reqval('d', dopts, D_SW); + reqval('d', subopts, D_SW); if (dsw) - respec('d', dopts, D_SW); + respec('d', subopts, D_SW); if (nodsflag) - conflict('d', dopts, D_NOALIGN, + conflict('d', subopts, D_NOALIGN, D_SW); dsw = getnum(value, 0, 0, false); if (dsw < 0) @@ -1333,40 +1566,37 @@ main( break; case D_NOALIGN: if (dsu) - conflict('d', dopts, D_SU, + conflict('d', subopts, D_SU, D_NOALIGN); if (dsunit) - conflict('d', dopts, D_SUNIT, + conflict('d', subopts, D_SUNIT, D_NOALIGN); if (dsw) - conflict('d', dopts, D_SW, + conflict('d', subopts, D_SW, D_NOALIGN); if (dswidth) - conflict('d', dopts, D_SWIDTH, + conflict('d', subopts, D_SWIDTH, D_NOALIGN); nodsflag = 1; break; case D_SECTLOG: if (slflag) - respec('d', dopts, D_SECTLOG); + respec('d', subopts, D_SECTLOG); if (ssflag) - conflict('d', dopts, D_SECTSIZE, + conflict('d', subopts, D_SECTSIZE, D_SECTLOG); - sectorlog = getnum_checked(value, - XFS_MIN_SECTORSIZE_LOG, - XFS_MAX_SECTORSIZE_LOG, - "d sectlog", 'd', dopts, - D_SECTLOG); + sectorlog = getnum_checked(value, &dopts, + D_SECTLOG); sectorsize = 1 << sectorlog; slflag = 1; break; case D_SECTSIZE: if (!value || *value == '\0') - reqval('d', dopts, D_SECTSIZE); + reqval('d', subopts, D_SECTSIZE); if (ssflag) - respec('d', dopts, D_SECTSIZE); + respec('d', subopts, D_SECTSIZE); if (slflag) - conflict('d', dopts, D_SECTLOG, + conflict('d', subopts, D_SECTLOG, D_SECTSIZE); sectorsize = getnum(value, blocksize, sectorsize, true); @@ -1383,14 +1613,14 @@ main( break; case D_PROJINHERIT: if (!value || *value == '\0') - reqval('d', dopts, D_PROJINHERIT); + reqval('d', subopts, D_PROJINHERIT); fsx.fsx_projid = atoi(value); fsx.fsx_xflags |= \ XFS_DIFLAG_PROJINHERIT; break; case D_EXTSZINHERIT: if (!value || *value == '\0') - reqval('d', dopts, D_EXTSZINHERIT); + reqval('d', subopts, D_EXTSZINHERIT); fsx.fsx_extsize = atoi(value); fsx.fsx_xflags |= \ XFS_DIFLAG_EXTSZINHERIT; @@ -1403,37 +1633,34 @@ main( case 'i': p = optarg; while (*p != '\0') { + char **subopts = (char **)iopts.subopts; char *value; - switch (getsubopt(&p, (constpp)iopts, &value)) { + switch (getsubopt(&p, (constpp)subopts, + &value)) { case I_ALIGN: sb_feat.inode_align = getbool( value, "i align", true); break; case I_LOG: - if (!value || *value == '\0') - reqval('i', iopts, I_LOG); if (ilflag) - respec('i', iopts, I_LOG); + respec('i', subopts, I_LOG); if (ipflag) - conflict('i', iopts, I_PERBLOCK, + conflict('i', subopts, I_PERBLOCK, I_LOG); if (isflag) - conflict('i', iopts, I_SIZE, + conflict('i', subopts, I_SIZE, I_LOG); - inodelog = getnum_checked(value, - XFS_DINODE_MIN_LOG, - XFS_DINODE_MAX_LOG, - "i log", 'i', iopts, - I_LOG); + inodelog = getnum_checked(value, &iopts, + I_LOG); isize = 1 << inodelog; ilflag = 1; break; case I_MAXPCT: if (!value || *value == '\0') - reqval('i', iopts, I_MAXPCT); + reqval('i', subopts, I_MAXPCT); if (imflag) - respec('i', iopts, I_MAXPCT); + respec('i', subopts, I_MAXPCT); imaxpct = getnum(value, 0, 0, false); if (imaxpct < 0 || imaxpct > 100) illegal(value, "i maxpct"); @@ -1441,14 +1668,14 @@ main( break; case I_PERBLOCK: if (!value || *value == '\0') - reqval('i', iopts, I_PERBLOCK); + reqval('i', subopts, I_PERBLOCK); if (ilflag) - conflict('i', iopts, I_LOG, + conflict('i', subopts, I_LOG, I_PERBLOCK); if (ipflag) - respec('i', iopts, I_PERBLOCK); + respec('i', subopts, I_PERBLOCK); if (isflag) - conflict('i', iopts, I_SIZE, + conflict('i', subopts, I_SIZE, I_PERBLOCK); inopblock = getnum(value, 0, 0, false); if (inopblock < @@ -1459,15 +1686,15 @@ main( break; case I_SIZE: if (!value || *value == '\0') - reqval('i', iopts, I_SIZE); + reqval('i', subopts, I_SIZE); if (ilflag) - conflict('i', iopts, I_LOG, + conflict('i', subopts, I_LOG, I_SIZE); if (ipflag) - conflict('i', iopts, I_PERBLOCK, + conflict('i', subopts, I_PERBLOCK, I_SIZE); if (isflag) - respec('i', iopts, I_SIZE); + respec('i', subopts, I_SIZE); isize = getnum(value, 0, 0, true); if (isize <= 0 || !ispow2(isize)) illegal(value, "i size"); @@ -1476,7 +1703,7 @@ main( break; case I_ATTR: if (!value || *value == '\0') - reqval('i', iopts, I_ATTR); + reqval('i', subopts, I_ATTR); c = getnum(value, 0, 0, false); if (c < 0 || c > 2) illegal(value, "i attr"); @@ -1498,16 +1725,18 @@ main( case 'l': p = optarg; while (*p != '\0') { + char **subopts = (char **)lopts.subopts; char *value; - switch (getsubopt(&p, (constpp)lopts, &value)) { + switch (getsubopt(&p, (constpp)subopts, + &value)) { case L_AGNUM: if (!value || *value == '\0') - reqval('l', lopts, L_AGNUM); + reqval('l', subopts, L_AGNUM); if (laflag) - respec('l', lopts, L_AGNUM); + respec('l', subopts, L_AGNUM); if (ldflag) - conflict('l', lopts, L_AGNUM, L_DEV); + conflict('l', subopts, L_AGNUM, L_DEV); logagno = getnum(value, 0, 0, false); if ((__int64_t)logagno < 0) illegal(value, "l agno"); @@ -1515,7 +1744,7 @@ main( break; case L_FILE: if (loginternal) - conflict('l', lopts, L_INTERNAL, + conflict('l', subopts, L_INTERNAL, L_FILE); xi.lisfile = getbool(value, "l file", true); @@ -1524,12 +1753,12 @@ main( break; case L_INTERNAL: if (ldflag) - conflict('l', lopts, L_INTERNAL, L_DEV); + conflict('l', subopts, L_INTERNAL, L_DEV); if (xi.lisfile) - conflict('l', lopts, L_FILE, + conflict('l', subopts, L_FILE, L_INTERNAL); if (liflag) - respec('l', lopts, L_INTERNAL); + respec('l', subopts, L_INTERNAL); loginternal = getbool(value, "l internal", true); @@ -1537,9 +1766,9 @@ main( break; case L_SU: if (!value || *value == '\0') - reqval('l', lopts, L_SU); + reqval('l', subopts, L_SU); if (lsu) - respec('l', lopts, L_SU); + respec('l', subopts, L_SU); lsu = getnum(value, blocksize, sectorsize, true); if (lsu < 0) @@ -1548,9 +1777,9 @@ main( break; case L_SUNIT: if (!value || *value == '\0') - reqval('l', lopts, L_SUNIT); + reqval('l', subopts, L_SUNIT); if (lsunit) - respec('l', lopts, L_SUNIT); + respec('l', subopts, L_SUNIT); lsunit = getnum(value, 0, 0, false); if (lsunit < 0) illegal(value, "l sunit"); @@ -1559,13 +1788,13 @@ main( case L_NAME: case L_DEV: if (laflag) - conflict('l', lopts, L_AGNUM, L_DEV); + conflict('l', subopts, L_AGNUM, L_DEV); if (liflag) - conflict('l', lopts, L_INTERNAL, L_DEV); + conflict('l', subopts, L_INTERNAL, L_DEV); if (!value || *value == '\0') - reqval('l', lopts, L_NAME); + reqval('l', subopts, L_NAME); if (xi.logname) - respec('l', lopts, L_NAME); + respec('l', subopts, L_NAME); ldflag = 1; loginternal = 0; logfile = value; @@ -1573,9 +1802,9 @@ main( break; case L_VERSION: if (!value || *value == '\0') - reqval('l', lopts, L_VERSION); + reqval('l', subopts, L_VERSION); if (lvflag) - respec('l', lopts, L_VERSION); + respec('l', subopts, L_VERSION); c = getnum(value, 0, 0, false); if (c < 1 || c > 2) illegal(value, "l version"); @@ -1584,33 +1813,30 @@ main( break; case L_SIZE: if (!value || *value == '\0') - reqval('l', lopts, L_SIZE); + reqval('l', subopts, L_SIZE); if (logsize) - respec('l', lopts, L_SIZE); + respec('l', subopts, L_SIZE); logsize = value; lsflag = 1; break; case L_SECTLOG: if (lslflag) - respec('l', lopts, L_SECTLOG); + respec('l', subopts, L_SECTLOG); if (lssflag) - conflict('l', lopts, L_SECTSIZE, + conflict('l', subopts, L_SECTSIZE, L_SECTLOG); lsectorlog = getnum_checked(value, - XFS_MIN_SECTORSIZE_LOG, - XFS_MAX_SECTORSIZE_LOG, - "l sectlog", 'l', lopts, - L_SECTLOG); + &lopts, L_SECTLOG); lsectorsize = 1 << lsectorlog; lslflag = 1; break; case L_SECTSIZE: if (!value || *value == '\0') - reqval('l', lopts, L_SECTSIZE); + reqval('l', subopts, L_SECTSIZE); if (lssflag) - respec('l', lopts, L_SECTSIZE); + respec('l', subopts, L_SECTSIZE); if (lslflag) - conflict('l', lopts, L_SECTLOG, + conflict('l', subopts, L_SECTLOG, L_SECTSIZE); lsectorsize = getnum(value, blocksize, sectorsize, true); @@ -1639,9 +1865,11 @@ main( case 'm': p = optarg; while (*p != '\0') { + char **subopts = (char **)mopts.subopts; char *value; - switch (getsubopt(&p, (constpp)mopts, &value)) { + switch (getsubopt(&p, (constpp)subopts, + &value)) { case M_CRC: sb_feat.crcs_enabled = getbool( value, "m crc", true); @@ -1655,7 +1883,7 @@ main( break; case M_UUID: if (!value || *value == '\0') - reqval('m', mopts, M_UUID); + reqval('m', subopts, M_UUID); if (platform_uuid_parse(value, &uuid)) illegal(optarg, "m uuid"); break; @@ -1667,30 +1895,29 @@ main( case 'n': p = optarg; while (*p != '\0') { + char **subopts = (char **)nopts.subopts; char *value; - switch (getsubopt(&p, (constpp)nopts, &value)) { + switch (getsubopt(&p, (constpp)subopts, + &value)) { case N_LOG: if (nlflag) - respec('n', nopts, N_LOG); + respec('n', subopts, N_LOG); if (nsflag) - conflict('n', nopts, N_SIZE, + conflict('n', subopts, N_SIZE, N_LOG); dirblocklog = getnum_checked(value, - XFS_MIN_REC_DIRSIZE, - XFS_MAX_BLOCKSIZE_LOG, - "n log", 'n', nopts, - N_LOG); + &nopts, N_LOG); dirblocksize = 1 << dirblocklog; nlflag = 1; break; case N_SIZE: if (!value || *value == '\0') - reqval('n', nopts, N_SIZE); + reqval('n', subopts, N_SIZE); if (nsflag) - respec('n', nopts, N_SIZE); + respec('n', subopts, N_SIZE); if (nlflag) - conflict('n', nopts, N_LOG, + conflict('n', subopts, N_LOG, N_SIZE); dirblocksize = getnum(value, blocksize, sectorsize, true); @@ -1703,9 +1930,9 @@ main( break; case N_VERSION: if (!value || *value == '\0') - reqval('n', nopts, N_VERSION); + reqval('n', subopts, N_VERSION); if (nvflag) - respec('n', nopts, N_VERSION); + respec('n', subopts, N_VERSION); if (!strcasecmp(value, "ci")) { /* ASCII CI mode */ sb_feat.nci = true; @@ -1720,7 +1947,7 @@ main( break; case N_FTYPE: if (nftype) - respec('n', nopts, N_FTYPE); + respec('n', subopts, N_FTYPE); sb_feat.dirftype = getbool(value, "n ftype", true); nftype = 1; @@ -1747,14 +1974,16 @@ main( case 'r': p = optarg; while (*p != '\0') { + char **subopts = (char **)ropts.subopts; char *value; - switch (getsubopt(&p, (constpp)ropts, &value)) { + switch (getsubopt(&p, (constpp)subopts, + &value)) { case R_EXTSIZE: if (!value || *value == '\0') - reqval('r', ropts, R_EXTSIZE); + reqval('r', subopts, R_EXTSIZE); if (rtextsize) - respec('r', ropts, R_EXTSIZE); + respec('r', subopts, R_EXTSIZE); rtextsize = value; break; case R_FILE: @@ -1766,16 +1995,16 @@ main( case R_NAME: case R_DEV: if (!value || *value == '\0') - reqval('r', ropts, R_NAME); + reqval('r', subopts, R_NAME); if (xi.rtname) - respec('r', ropts, R_NAME); + respec('r', subopts, R_NAME); xi.rtname = value; break; case R_SIZE: if (!value || *value == '\0') - reqval('r', ropts, R_SIZE); + reqval('r', subopts, R_SIZE); if (rtsize) - respec('r', ropts, R_SIZE); + respec('r', subopts, R_SIZE); rtsize = value; break; case R_NOALIGN: @@ -1789,21 +2018,20 @@ main( case 's': p = optarg; while (*p != '\0') { + char **subopts = (char **)sopts.subopts; char *value; - switch (getsubopt(&p, (constpp)sopts, &value)) { + switch (getsubopt(&p, (constpp)subopts, + &value)) { case S_LOG: case S_SECTLOG: if (slflag || lslflag) - respec('s', sopts, S_SECTLOG); + respec('s', subopts, S_SECTLOG); if (ssflag || lssflag) - conflict('s', sopts, S_SECTSIZE, - S_SECTLOG); - sectorlog = getnum_checked(value, - XFS_MIN_SECTORSIZE_LOG, - XFS_MAX_SECTORSIZE_LOG, - "s sectlog", 's', sopts, - S_SECTLOG); + conflict('s', subopts, + S_SECTSIZE, S_SECTLOG); + sectorlog = getnum_checked(value, &sopts, + S_SECTLOG); lsectorlog = sectorlog; sectorsize = 1 << sectorlog; lsectorsize = sectorsize; @@ -1812,11 +2040,11 @@ main( case S_SIZE: case S_SECTSIZE: if (!value || *value == '\0') - reqval('s', sopts, S_SECTSIZE); + reqval('s', subopts, S_SECTSIZE); if (ssflag || lssflag) - respec('s', sopts, S_SECTSIZE); + respec('s', subopts, S_SECTSIZE); if (slflag || lslflag) - conflict('s', sopts, S_SECTLOG, + conflict('s', subopts, S_SECTLOG, S_SECTSIZE); sectorsize = getnum(value, blocksize, sectorsize, true); -- 2.5.0 From jtulak@redhat.com Thu Apr 21 04:40:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 393CF7CB9 for ; Thu, 21 Apr 2016 04:40:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E99E230404E for ; Thu, 21 Apr 2016 02:40:07 -0700 (PDT) X-ASG-Debug-ID: 1461231605-04cbb00fea2d3c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id mCZF73mgHm7o64Mm (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 21 Apr 2016 02:40:05 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 40FF6C08E29C for ; Thu, 21 Apr 2016 09:40:05 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3L9ds0O007155 for ; Thu, 21 Apr 2016 05:40:04 -0400 From: Jan Tulak To: xfs@oss.sgi.com Subject: [PATCH 11/19] mkfs: table based parsing for converted parameters Date: Thu, 21 Apr 2016 11:39:45 +0200 X-ASG-Orig-Subj: [PATCH 11/19] mkfs: table based parsing for converted parameters Message-Id: <1461231593-31294-12-git-send-email-jtulak@redhat.com> In-Reply-To: <1461231593-31294-1-git-send-email-jtulak@redhat.com> References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461231605 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 15013 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner All the parameters that can be passed as block or sector sizes need to be passed the block and sector sizes that they should be using for conversion. For parameter parsing, it is always the same two variables, so to make things easy just declare them as global variables so we can avoid needing to pass them to getnum_checked(). We also need to mark these parameters are requiring conversion so that we don't need to pass this information manually to getnum_checked(). Further, some of these options are required to have a power of 2 value, so add optional checking for that as well. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak Was reviewed, but one small change added... Reviewed-by: Eric Sandeen --- CHANGES: * L_SU minval changed from XLOG_MIN_RECORD_BSIZE to 0 to comply with tests generic/054 and 055 - is this a valid solution, or the tests should be fixed? --- mkfs/xfs_mkfs.c | 182 ++++++++++++++++++++++++-------------------------------- 1 file changed, 78 insertions(+), 104 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index e45b72b..8551b09 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -48,6 +48,13 @@ static int ispow2(unsigned int i); static long long cvtnum(unsigned int blocksize, unsigned int sectorsize, const char *s); +/* + * The configured block and sector sizes are defined as global variables so + * that they don't need to be passed to functions that require them. + */ +unsigned int blocksize; +unsigned int sectorsize; + #define MAX_SUBOPTS 16 #define SUBOPT_NEEDS_VAL (-1LL) /* @@ -76,6 +83,15 @@ static long long cvtnum(unsigned int blocksize, * Do not set this flag when definning a subopt. It is used to remeber that * this subopt was already seen, for example for conflicts detection. * + * convert OPTIONAL + * A flag signalling whether the user-given value can use suffixes. + * If you want to allow the use of user-friendly values like 13k, 42G, + * set it to true. + * + * is_power_2 OPTIONAL + * An optional flag for subopts where the given value has to be a power + * of two. + * * minval, maxval OPTIONAL * These options are used for automatic range check and they have to be * always used together in pair. If you don't want to limit the max value, @@ -103,6 +119,8 @@ struct opt_params { struct subopt_param { int index; bool seen; + bool convert; + bool is_power_2; long long minval; long long maxval; long long defaultval; @@ -125,6 +143,8 @@ struct opt_params bopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = B_SIZE, + .convert = true, + .is_power_2 = true, .minval = XFS_MIN_BLOCKSIZE, .maxval = XFS_MAX_BLOCKSIZE, .defaultval = SUBOPT_NEEDS_VAL, @@ -182,6 +202,9 @@ struct opt_params dopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SIZE, + .convert = true, + .minval = XFS_AG_MIN_BYTES, + .maxval = LLONG_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SUNIT, @@ -195,11 +218,15 @@ struct opt_params dopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_AGSIZE, + .convert = true, .minval = XFS_AG_MIN_BYTES, .maxval = XFS_AG_MAX_BYTES, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SU, + .convert = true, + .minval = 0, + .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SW, @@ -213,6 +240,8 @@ struct opt_params dopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SECTSIZE, + .convert = true, + .is_power_2 = true, .minval = XFS_MIN_SECTORSIZE, .maxval = XFS_MAX_SECTORSIZE, .defaultval = SUBOPT_NEEDS_VAL, @@ -279,11 +308,13 @@ struct opt_params iopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_PERBLOCK, + .is_power_2 = true, .minval = XFS_MIN_INODE_PERBLOCK, .maxval = XFS_MAX_BLOCKSIZE / XFS_DINODE_MIN_SIZE, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_SIZE, + .is_power_2 = true, .minval = XFS_DINODE_MIN_SIZE, .maxval = XFS_DINODE_MAX_SIZE, .defaultval = SUBOPT_NEEDS_VAL, @@ -347,6 +378,9 @@ struct opt_params lopts = { .defaultval = 1, }, { .index = L_SIZE, + .convert = true, + .minval = 2 * 1024 * 1024LL, /* XXX: XFS_MIN_LOG_BYTES */ + .maxval = XFS_MAX_LOG_BYTES, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_VERSION, @@ -360,6 +394,9 @@ struct opt_params lopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SU, + .convert = true, + .minval = 0, + .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_DEV, @@ -371,6 +408,8 @@ struct opt_params lopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SECTSIZE, + .convert = true, + .is_power_2 = true, .minval = XFS_MIN_SECTORSIZE, .maxval = XFS_MAX_SECTORSIZE, .defaultval = SUBOPT_NEEDS_VAL, @@ -411,6 +450,8 @@ struct opt_params nopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = N_SIZE, + .convert = true, + .is_power_2 = true, .minval = 1 << XFS_MIN_REC_DIRSIZE, .maxval = XFS_MAX_BLOCKSIZE, .defaultval = SUBOPT_NEEDS_VAL, @@ -447,9 +488,15 @@ struct opt_params ropts = { }, .subopt_params = { { .index = R_EXTSIZE, + .convert = true, + .minval = XFS_MIN_RTEXTSIZE, + .maxval = XFS_MAX_RTEXTSIZE, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_SIZE, + .convert = true, + .minval = 0, + .maxval = LLONG_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_DEV, @@ -496,11 +543,15 @@ struct opt_params sopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = S_SIZE, + .convert = true, + .is_power_2 = true, .minval = XFS_MIN_SECTORSIZE, .maxval = XFS_MAX_SECTORSIZE, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = S_SECTSIZE, + .convert = true, + .is_power_2 = true, .minval = XFS_MIN_SECTORSIZE, .maxval = XFS_MAX_SECTORSIZE, .defaultval = SUBOPT_NEEDS_VAL, @@ -1333,15 +1384,15 @@ sb_set_features( long long getnum( const char *str, - unsigned int blocksize, - unsigned int sectorsize, + unsigned int blksize, + unsigned int sectsize, bool convert) { long long i; char *sp; if (convert) - return cvtnum(blocksize, sectorsize, str); + return cvtnum(blksize, sectsize, str); i = strtoll(str, &sp, 0); if (i == 0 && sp == str) @@ -1363,7 +1414,7 @@ illegal_option( usage(); } -static int +static long long getnum_checked( const char *str, struct opt_params *opts, @@ -1398,9 +1449,11 @@ getnum_checked( exit(1); } - c = getnum(str, 0, 0, false); + c = getnum(str, blocksize, sectorsize, sp->convert); if (c < sp->minval || c > sp->maxval) illegal_option(str, opts, index); + if (sp->is_power_2 && !ispow2(c)) + illegal_option(str, opts, index); return c; } @@ -1418,7 +1471,6 @@ main( struct xfs_btree_block *block; int blflag; int blocklog; - unsigned int blocksize; int bsflag; int bsize; xfs_buf_t *buf; @@ -1489,7 +1541,6 @@ main( char *rtsize; xfs_sb_t *sbp; int sectorlog; - unsigned int sectorsize; __uint64_t sector_mask; int slflag; int ssflag; @@ -1569,18 +1620,11 @@ main( blflag = 1; break; case B_SIZE: - if (!value || *value == '\0') - reqval('b', subopts, B_SIZE); - if (bsflag) - respec('b', subopts, B_SIZE); if (blflag) conflict('b', subopts, B_LOG, B_SIZE); - blocksize = getnum(value, blocksize, - sectorsize, true); - if (blocksize <= 0 || - !ispow2(blocksize)) - illegal(value, "b size"); + blocksize = getnum_checked(value, &bopts, + B_SIZE); blocklog = libxfs_highbit32(blocksize); bsflag = 1; break; @@ -1603,14 +1647,8 @@ main( daflag = 1; break; case D_AGSIZE: - if (!value || *value == '\0') - reqval('d', subopts, D_AGSIZE); - if (dasize) - respec('d', subopts, D_AGSIZE); - agsize = getnum(value, blocksize, - sectorsize, true); - if ((__int64_t)agsize <= 0) - illegal(value, "d agsize"); + agsize = getnum_checked(value, &dopts, + D_AGSIZE); dasize = 1; break; case D_FILE: @@ -1648,17 +1686,11 @@ main( D_SWIDTH); break; case D_SU: - if (!value || *value == '\0') - reqval('d', subopts, D_SU); - if (dsu) - respec('d', subopts, D_SU); if (nodsflag) conflict('d', subopts, D_NOALIGN, D_SU); - dsu = getnum(value, blocksize, - sectorsize, true); - if (dsu < 0) - illegal(value, "d su"); + dsu = getnum_checked(value, &dopts, + D_SU); break; case D_SW: if (nodsflag) @@ -1695,18 +1727,11 @@ main( slflag = 1; break; case D_SECTSIZE: - if (!value || *value == '\0') - reqval('d', subopts, D_SECTSIZE); - if (ssflag) - respec('d', subopts, D_SECTSIZE); if (slflag) conflict('d', subopts, D_SECTLOG, D_SECTSIZE); - sectorsize = getnum(value, blocksize, - sectorsize, true); - if (sectorsize <= 0 || - !ispow2(sectorsize)) - illegal(value, "d sectsize"); + sectorsize = getnum_checked(value, + &dopts, D_SECTSIZE); sectorlog = libxfs_highbit32(sectorsize); ssflag = 1; @@ -1773,8 +1798,6 @@ main( I_PERBLOCK); inopblock = getnum_checked(value, &iopts, I_PERBLOCK); - if (!ispow2(inopblock)) - illegal(value, "i perblock"); ipflag = 1; break; case I_SIZE: @@ -1786,8 +1809,6 @@ main( I_SIZE); isize = getnum_checked(value, &iopts, I_SIZE); - if (!ispow2(isize)) - illegal(value, "i size"); inodelog = libxfs_highbit32(isize); isflag = 1; break; @@ -1846,14 +1867,8 @@ main( liflag = 1; break; case L_SU: - if (!value || *value == '\0') - reqval('l', subopts, L_SU); - if (lsu) - respec('l', subopts, L_SU); - lsu = getnum(value, blocksize, - sectorsize, true); - if (lsu < 0) - illegal(value, "l su"); + lsu = getnum_checked(value, &lopts, + L_SU); lsuflag = 1; break; case L_SUNIT: @@ -1900,18 +1915,11 @@ main( lslflag = 1; break; case L_SECTSIZE: - if (!value || *value == '\0') - reqval('l', subopts, L_SECTSIZE); - if (lssflag) - respec('l', subopts, L_SECTSIZE); if (lslflag) conflict('l', subopts, L_SECTLOG, L_SECTSIZE); - lsectorsize = getnum(value, blocksize, - sectorsize, true); - if (lsectorsize <= 0 || - !ispow2(lsectorsize)) - illegal(value, "l sectsize"); + lsectorsize = getnum_checked(value, + &lopts, L_SECTSIZE); lsectorlog = libxfs_highbit32(lsectorsize); lssflag = 1; @@ -1979,18 +1987,11 @@ main( nlflag = 1; break; case N_SIZE: - if (!value || *value == '\0') - reqval('n', subopts, N_SIZE); - if (nsflag) - respec('n', subopts, N_SIZE); if (nlflag) conflict('n', subopts, N_LOG, N_SIZE); - dirblocksize = getnum(value, blocksize, - sectorsize, true); - if (dirblocksize <= 0 || - !ispow2(dirblocksize)) - illegal(value, "n size"); + dirblocksize = getnum_checked(value, + &nopts, N_SIZE); dirblocklog = libxfs_highbit32(dirblocksize); nsflag = 1; @@ -2101,18 +2102,11 @@ main( break; case S_SIZE: case S_SECTSIZE: - if (!value || *value == '\0') - reqval('s', subopts, S_SECTSIZE); - if (ssflag || lssflag) - respec('s', subopts, S_SECTSIZE); if (slflag || lslflag) conflict('s', subopts, S_SECTLOG, S_SECTSIZE); - sectorsize = getnum(value, blocksize, - sectorsize, true); - if (sectorsize <= 0 || - !ispow2(sectorsize)) - illegal(value, "s sectsize"); + sectorsize = getnum_checked(value, + &sopts, S_SECTSIZE); lsectorsize = sectorsize; sectorlog = libxfs_highbit32(sectorsize); @@ -2341,9 +2335,7 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); if (dsize) { __uint64_t dbytes; - dbytes = getnum(dsize, blocksize, sectorsize, true); - if ((__int64_t)dbytes < 0) - illegal(dsize, "d size"); + dbytes = getnum_checked(dsize, &dopts, D_SIZE); if (dbytes % XFS_MIN_BLOCKSIZE) { fprintf(stderr, _("illegal data length %lld, not a multiple of %d\n"), @@ -2380,9 +2372,7 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); if (logsize) { __uint64_t logbytes; - logbytes = getnum(logsize, blocksize, sectorsize, true); - if ((__int64_t)logbytes < 0) - illegal(logsize, "l size"); + logbytes = getnum_checked(logsize, &lopts, L_SIZE); if (logbytes % XFS_MIN_BLOCKSIZE) { fprintf(stderr, _("illegal log length %lld, not a multiple of %d\n"), @@ -2404,9 +2394,7 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); if (rtsize) { __uint64_t rtbytes; - rtbytes = getnum(rtsize, blocksize, sectorsize, true); - if ((__int64_t)rtbytes < 0) - illegal(rtsize, "r size"); + rtbytes = getnum_checked(rtsize, &ropts, R_SIZE); if (rtbytes % XFS_MIN_BLOCKSIZE) { fprintf(stderr, _("illegal rt length %lld, not a multiple of %d\n"), @@ -2426,27 +2414,13 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); if (rtextsize) { __uint64_t rtextbytes; - rtextbytes = getnum(rtextsize, blocksize, sectorsize, true); - if ((__int64_t)rtextbytes < 0) - illegal(rtsize, "r extsize"); + rtextbytes = getnum_checked(rtextsize, &ropts, R_EXTSIZE); if (rtextbytes % blocksize) { fprintf(stderr, _("illegal rt extent size %lld, not a multiple of %d\n"), (long long)rtextbytes, blocksize); usage(); } - if (rtextbytes > XFS_MAX_RTEXTSIZE) { - fprintf(stderr, - _("rt extent size %s too large, maximum %d\n"), - rtextsize, XFS_MAX_RTEXTSIZE); - usage(); - } - if (rtextbytes < XFS_MIN_RTEXTSIZE) { - fprintf(stderr, - _("rt extent size %s too small, minimum %d\n"), - rtextsize, XFS_MIN_RTEXTSIZE); - usage(); - } rtextblocks = (xfs_extlen_t)(rtextbytes >> blocklog); } else { /* -- 2.5.0 From jtulak@redhat.com Thu Apr 21 04:40:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 41BA57CAE for ; Thu, 21 Apr 2016 04:40:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A8EC0AC002 for ; Thu, 21 Apr 2016 02:40:08 -0700 (PDT) X-ASG-Debug-ID: 1461231606-04bdf0358e348e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id L3WyR3CODu8OAWzH (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 21 Apr 2016 02:40:06 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 14F4B64067 for ; Thu, 21 Apr 2016 09:40:06 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3L9ds0P007155 for ; Thu, 21 Apr 2016 05:40:05 -0400 From: Jan Tulak To: xfs@oss.sgi.com Subject: [PATCH 12/19] mkfs: merge getnum Date: Thu, 21 Apr 2016 11:39:46 +0200 X-ASG-Orig-Subj: [PATCH 12/19] mkfs: merge getnum Message-Id: <1461231593-31294-13-git-send-email-jtulak@redhat.com> In-Reply-To: <1461231593-31294-1-git-send-email-jtulak@redhat.com> References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Thu, 21 Apr 2016 09:40:06 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461231606 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 16932 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner getnum() is now only called by getnum_checked(). Move the two together into a single getnum() function and change all the callers back to getnum(). Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak Reviewed-by: Eric Sandeen --- include/xfs_multidisk.h | 4 +- mkfs/proto.c | 20 +++++ mkfs/xfs_mkfs.c | 213 ++++++++++++++++++++++-------------------------- 3 files changed, 119 insertions(+), 118 deletions(-) diff --git a/include/xfs_multidisk.h b/include/xfs_multidisk.h index ecc8f0a..fe3e98f 100644 --- a/include/xfs_multidisk.h +++ b/include/xfs_multidisk.h @@ -57,8 +57,8 @@ #define XFS_NOMULTIDISK_AGLOG 2 /* 4 AGs */ #define XFS_MULTIDISK_AGCOUNT (1 << XFS_MULTIDISK_AGLOG) -extern long long getnum(const char *str, unsigned int blocksize, - unsigned int sectorsize, bool convert); +extern long long cvtnum(unsigned int blksize, unsigned int sectsize, + const char *str); /* proto.c */ extern char *setup_proto (char *fname); diff --git a/mkfs/proto.c b/mkfs/proto.c index 19943cb..09a9439 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -43,6 +43,26 @@ static long filesize(int fd); ((uint)(MKFS_BLOCKRES_INODE + XFS_DA_NODE_MAXDEPTH + \ (XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) - 1) + (rb))) +static long long +getnum( + const char *str, + unsigned int blksize, + unsigned int sectsize, + bool convert) +{ + long long i; + char *sp; + + if (convert) + return cvtnum(blksize, sectsize, str); + + i = strtoll(str, &sp, 0); + if (i == 0 && sp == str) + return -1LL; + if (*sp != '\0') + return -1LL; /* trailing garbage */ + return i; +} char * setup_proto( diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 8551b09..a45dc7f 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -45,9 +45,6 @@ static void respec(char opt, char *tab[], int idx); static void unknown(char opt, char *s); static int ispow2(unsigned int i); -static long long cvtnum(unsigned int blocksize, - unsigned int sectorsize, const char *s); - /* * The configured block and sector sizes are defined as global variables so * that they don't need to be passed to functions that require them. @@ -1381,27 +1378,6 @@ sb_set_features( } -long long -getnum( - const char *str, - unsigned int blksize, - unsigned int sectsize, - bool convert) -{ - long long i; - char *sp; - - if (convert) - return cvtnum(blksize, sectsize, str); - - i = strtoll(str, &sp, 0); - if (i == 0 && sp == str) - return -1LL; - if (*sp != '\0') - return -1LL; /* trailing garbage */ - return i; -} - static __attribute__((noreturn)) void illegal_option( const char *value, @@ -1415,7 +1391,7 @@ illegal_option( } static long long -getnum_checked( +getnum( const char *str, struct opt_params *opts, int index) @@ -1435,6 +1411,7 @@ getnum_checked( respec(opts->name, (char **)opts->subopts, index); sp->seen = true; + /* empty strings might just return a default value */ if (!str || *str == '\0') { if (sp->defaultval == SUBOPT_NEEDS_VAL) reqval(opts->name, (char **)opts->subopts, index); @@ -1449,7 +1426,25 @@ getnum_checked( exit(1); } - c = getnum(str, blocksize, sectorsize, sp->convert); + /* + * Some values are pure numbers, others can have suffixes that define + * the units of the number. Those get passed to cvtnum(), otherwise we + * convert it ourselves to guarantee there is no trailing garbage in the + * number. + */ + if (sp->convert) + c = cvtnum(blocksize, sectorsize, str); + else { + char *str_end; + + c = strtoll(str, &str_end, 0); + if (c == 0 && str_end == str) + illegal_option(str, opts, index); + if (*str_end != '\0') + illegal_option(str, opts, index); + } + + /* Validity check the result. */ if (c < sp->minval || c > sp->maxval) illegal_option(str, opts, index); if (sp->is_power_2 && !ispow2(c)) @@ -1614,8 +1609,7 @@ main( if (bsflag) conflict('b', subopts, B_SIZE, B_LOG); - blocklog = getnum_checked(value, &bopts, - B_LOG); + blocklog = getnum(value, &bopts, B_LOG); blocksize = 1 << blocklog; blflag = 1; break; @@ -1623,8 +1617,8 @@ main( if (blflag) conflict('b', subopts, B_LOG, B_SIZE); - blocksize = getnum_checked(value, &bopts, - B_SIZE); + blocksize = getnum(value, &bopts, + B_SIZE); blocklog = libxfs_highbit32(blocksize); bsflag = 1; break; @@ -1642,18 +1636,17 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case D_AGCOUNT: - agcount = getnum_checked(value, &dopts, - D_AGCOUNT); + agcount = getnum(value, &dopts, + D_AGCOUNT); daflag = 1; break; case D_AGSIZE: - agsize = getnum_checked(value, &dopts, - D_AGSIZE); + agsize = getnum(value, &dopts, D_AGSIZE); dasize = 1; break; case D_FILE: - xi.disfile = getnum_checked(value, - &dopts, D_FILE); + xi.disfile = getnum(value, &dopts, + D_FILE); if (xi.disfile && !Nflag) xi.dcreat = 1; break; @@ -1675,33 +1668,30 @@ main( if (nodsflag) conflict('d', subopts, D_NOALIGN, D_SUNIT); - dsunit = getnum_checked(value, &dopts, - D_SUNIT); + dsunit = getnum(value, &dopts, D_SUNIT); break; case D_SWIDTH: if (nodsflag) conflict('d', subopts, D_NOALIGN, D_SWIDTH); - dswidth = getnum_checked(value, &dopts, - D_SWIDTH); + dswidth = getnum(value, &dopts, + D_SWIDTH); break; case D_SU: if (nodsflag) conflict('d', subopts, D_NOALIGN, D_SU); - dsu = getnum_checked(value, &dopts, - D_SU); + dsu = getnum(value, &dopts, D_SU); break; case D_SW: if (nodsflag) conflict('d', subopts, D_NOALIGN, D_SW); - dsw = getnum_checked(value, &dopts, - D_SW); + dsw = getnum(value, &dopts, D_SW); break; case D_NOALIGN: - nodsflag = getnum_checked(value, - &dopts, D_NOALIGN); + nodsflag = getnum(value, &dopts, + D_NOALIGN); if (nodsflag) { if (dsu) conflict('d', subopts, D_SU, @@ -1721,8 +1711,8 @@ main( if (ssflag) conflict('d', subopts, D_SECTSIZE, D_SECTLOG); - sectorlog = getnum_checked(value, &dopts, - D_SECTLOG); + sectorlog = getnum(value, &dopts, + D_SECTLOG); sectorsize = 1 << sectorlog; slflag = 1; break; @@ -1730,28 +1720,27 @@ main( if (slflag) conflict('d', subopts, D_SECTLOG, D_SECTSIZE); - sectorsize = getnum_checked(value, - &dopts, D_SECTSIZE); + sectorsize = getnum(value, &dopts, + D_SECTSIZE); sectorlog = libxfs_highbit32(sectorsize); ssflag = 1; break; case D_RTINHERIT: - c = getnum_checked(value, &dopts, - D_RTINHERIT); + c = getnum(value, &dopts, D_RTINHERIT); if (c) fsx.fsx_xflags |= XFS_DIFLAG_RTINHERIT; break; case D_PROJINHERIT: - fsx.fsx_projid = getnum_checked(value, - &dopts, D_PROJINHERIT); + fsx.fsx_projid = getnum(value, &dopts, + D_PROJINHERIT); fsx.fsx_xflags |= XFS_DIFLAG_PROJINHERIT; break; case D_EXTSZINHERIT: - fsx.fsx_extsize = getnum_checked(value, - &dopts, D_EXTSZINHERIT); + fsx.fsx_extsize = getnum(value, &dopts, + D_EXTSZINHERIT); fsx.fsx_xflags |= XFS_DIFLAG_EXTSZINHERIT; break; @@ -1769,8 +1758,8 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case I_ALIGN: - sb_feat.inode_align = getnum_checked( - value, &iopts, I_ALIGN); + sb_feat.inode_align = getnum(value, + &iopts, I_ALIGN); break; case I_LOG: if (ipflag) @@ -1779,14 +1768,13 @@ main( if (isflag) conflict('i', subopts, I_SIZE, I_LOG); - inodelog = getnum_checked(value, &iopts, - I_LOG); + inodelog = getnum(value, &iopts, I_LOG); isize = 1 << inodelog; ilflag = 1; break; case I_MAXPCT: - imaxpct = getnum_checked(value, &iopts, - I_MAXPCT); + imaxpct = getnum(value, &iopts, + I_MAXPCT); imflag = 1; break; case I_PERBLOCK: @@ -1796,8 +1784,8 @@ main( if (isflag) conflict('i', subopts, I_SIZE, I_PERBLOCK); - inopblock = getnum_checked(value, &iopts, - I_PERBLOCK); + inopblock = getnum(value, &iopts, + I_PERBLOCK); ipflag = 1; break; case I_SIZE: @@ -1807,23 +1795,22 @@ main( if (ipflag) conflict('i', subopts, I_PERBLOCK, I_SIZE); - isize = getnum_checked(value, &iopts, - I_SIZE); + isize = getnum(value, &iopts, I_SIZE); inodelog = libxfs_highbit32(isize); isflag = 1; break; case I_ATTR: - sb_feat.attr_version = getnum_checked( - value, &iopts, I_ATTR); + sb_feat.attr_version = + getnum(value, &iopts, I_ATTR); break; case I_PROJID32BIT: sb_feat.projid16bit = - !getnum_checked(value, &iopts, - I_PROJID32BIT); + !getnum(value, &iopts, + I_PROJID32BIT); break; case I_SPINODES: sb_feat.spinodes = - getnum_checked(value, &iopts, + getnum(value, &iopts, I_SPINODES); break; default: @@ -1842,13 +1829,12 @@ main( case L_AGNUM: if (ldflag) conflict('l', subopts, L_AGNUM, L_DEV); - logagno = getnum_checked(value, &lopts, - L_AGNUM); + logagno = getnum(value, &lopts, L_AGNUM); laflag = 1; break; case L_FILE: - xi.lisfile = getnum_checked(value, - &lopts, L_FILE); + xi.lisfile = getnum(value, &lopts, + L_FILE); if (xi.lisfile && loginternal) conflict('l', subopts, L_INTERNAL, L_FILE); @@ -1862,18 +1848,16 @@ main( conflict('l', subopts, L_FILE, L_INTERNAL); - loginternal = getnum_checked(value, - &lopts, L_INTERNAL); + loginternal = getnum(value, &lopts, + L_INTERNAL); liflag = 1; break; case L_SU: - lsu = getnum_checked(value, &lopts, - L_SU); + lsu = getnum(value, &lopts, L_SU); lsuflag = 1; break; case L_SUNIT: - lsunit = getnum_checked(value, &lopts, - L_SUNIT); + lsunit = getnum(value, &lopts, L_SUNIT); lsunitflag = 1; break; case L_NAME: @@ -1893,8 +1877,7 @@ main( break; case L_VERSION: sb_feat.log_version = - getnum_checked(value, &lopts, - L_VERSION); + getnum(value, &lopts, L_VERSION); lvflag = 1; break; case L_SIZE: @@ -1909,8 +1892,8 @@ main( if (lssflag) conflict('l', subopts, L_SECTSIZE, L_SECTLOG); - lsectorlog = getnum_checked(value, - &lopts, L_SECTLOG); + lsectorlog = getnum(value, &lopts, + L_SECTLOG); lsectorsize = 1 << lsectorlog; lslflag = 1; break; @@ -1918,15 +1901,15 @@ main( if (lslflag) conflict('l', subopts, L_SECTLOG, L_SECTSIZE); - lsectorsize = getnum_checked(value, - &lopts, L_SECTSIZE); + lsectorsize = getnum(value, &lopts, + L_SECTSIZE); lsectorlog = libxfs_highbit32(lsectorsize); lssflag = 1; break; case L_LAZYSBCNTR: sb_feat.lazy_sb_counters = - getnum_checked(value, &lopts, + getnum(value, &lopts, L_LAZYSBCNTR); break; default: @@ -1949,13 +1932,12 @@ main( &value)) { case M_CRC: sb_feat.crcs_enabled = - getnum_checked(value, &mopts, - M_CRC); + getnum(value, &mopts, M_CRC); if (sb_feat.crcs_enabled) sb_feat.dirftype = true; break; case M_FINOBT: - sb_feat.finobt = getnum_checked( + sb_feat.finobt = getnum( value, &mopts, M_FINOBT); break; case M_UUID: @@ -1981,8 +1963,8 @@ main( if (nsflag) conflict('n', subopts, N_SIZE, N_LOG); - dirblocklog = getnum_checked(value, - &nopts, N_LOG); + dirblocklog = getnum(value, &nopts, + N_LOG); dirblocksize = 1 << dirblocklog; nlflag = 1; break; @@ -1990,8 +1972,8 @@ main( if (nlflag) conflict('n', subopts, N_LOG, N_SIZE); - dirblocksize = getnum_checked(value, - &nopts, N_SIZE); + dirblocksize = getnum(value, &nopts, + N_SIZE); dirblocklog = libxfs_highbit32(dirblocksize); nsflag = 1; @@ -2006,15 +1988,14 @@ main( sb_feat.nci = true; } else { sb_feat.dir_version = - getnum_checked(value, - &nopts, - N_VERSION); + getnum(value, &nopts, + N_VERSION); } nvflag = 1; break; case N_FTYPE: - sb_feat.dirftype = getnum_checked(value, - &nopts, N_FTYPE); + sb_feat.dirftype = getnum(value, &nopts, + N_FTYPE); break; default: unknown('n', value); @@ -2051,8 +2032,8 @@ main( rtextsize = value; break; case R_FILE: - xi.risfile = getnum_checked(value, - &ropts, R_FILE); + xi.risfile = getnum(value, &ropts, + R_FILE); if (xi.risfile) xi.rcreat = 1; break; @@ -2072,8 +2053,8 @@ main( rtsize = value; break; case R_NOALIGN: - norsflag = getnum_checked(value, - &ropts, R_NOALIGN); + norsflag = getnum(value, &ropts, + R_NOALIGN); break; default: unknown('r', value); @@ -2093,8 +2074,8 @@ main( if (ssflag || lssflag) conflict('s', subopts, S_SECTSIZE, S_SECTLOG); - sectorlog = getnum_checked(value, &sopts, - S_SECTLOG); + sectorlog = getnum(value, &sopts, + S_SECTLOG); lsectorlog = sectorlog; sectorsize = 1 << sectorlog; lsectorsize = sectorsize; @@ -2105,8 +2086,8 @@ main( if (slflag || lslflag) conflict('s', subopts, S_SECTLOG, S_SECTSIZE); - sectorsize = getnum_checked(value, - &sopts, S_SECTSIZE); + sectorsize = getnum(value, &sopts, + S_SECTSIZE); lsectorsize = sectorsize; sectorlog = libxfs_highbit32(sectorsize); @@ -2335,7 +2316,7 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); if (dsize) { __uint64_t dbytes; - dbytes = getnum_checked(dsize, &dopts, D_SIZE); + dbytes = getnum(dsize, &dopts, D_SIZE); if (dbytes % XFS_MIN_BLOCKSIZE) { fprintf(stderr, _("illegal data length %lld, not a multiple of %d\n"), @@ -2372,7 +2353,7 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); if (logsize) { __uint64_t logbytes; - logbytes = getnum_checked(logsize, &lopts, L_SIZE); + logbytes = getnum(logsize, &lopts, L_SIZE); if (logbytes % XFS_MIN_BLOCKSIZE) { fprintf(stderr, _("illegal log length %lld, not a multiple of %d\n"), @@ -2394,7 +2375,7 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); if (rtsize) { __uint64_t rtbytes; - rtbytes = getnum_checked(rtsize, &ropts, R_SIZE); + rtbytes = getnum(rtsize, &ropts, R_SIZE); if (rtbytes % XFS_MIN_BLOCKSIZE) { fprintf(stderr, _("illegal rt length %lld, not a multiple of %d\n"), @@ -2414,7 +2395,7 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); if (rtextsize) { __uint64_t rtextbytes; - rtextbytes = getnum_checked(rtextsize, &ropts, R_EXTSIZE); + rtextbytes = getnum(rtextsize, &ropts, R_EXTSIZE); if (rtextbytes % blocksize) { fprintf(stderr, _("illegal rt extent size %lld, not a multiple of %d\n"), @@ -3517,8 +3498,8 @@ unknown( long long cvtnum( - unsigned int blocksize, - unsigned int sectorsize, + unsigned int blksize, + unsigned int sectsize, const char *s) { long long i; @@ -3531,9 +3512,9 @@ cvtnum( return i; if (*sp == 'b' && sp[1] == '\0') - return i * blocksize; + return i * blksize; if (*sp == 's' && sp[1] == '\0') - return i * sectorsize; + return i * sectsize; if (*sp == 'k' && sp[1] == '\0') return 1024LL * i; -- 2.5.0 From jtulak@redhat.com Thu Apr 21 04:40:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0059D7CB9 for ; Thu, 21 Apr 2016 04:40:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B2B17304066 for ; Thu, 21 Apr 2016 02:40:09 -0700 (PDT) X-ASG-Debug-ID: 1461231607-04cbb00fea2d3d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id EeYoVmY4qZEOYTIo (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 21 Apr 2016 02:40:08 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id BB22A81104 for ; Thu, 21 Apr 2016 09:40:07 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3L9ds0R007155 for ; Thu, 21 Apr 2016 05:40:07 -0400 From: Jan Tulak To: xfs@oss.sgi.com Subject: [PATCH 14/19] mkfs: add string options to generic parsing Date: Thu, 21 Apr 2016 11:39:48 +0200 X-ASG-Orig-Subj: [PATCH 14/19] mkfs: add string options to generic parsing Message-Id: <1461231593-31294-15-git-send-email-jtulak@redhat.com> In-Reply-To: <1461231593-31294-1-git-send-email-jtulak@redhat.com> References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461231608 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7638 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner So that string options are correctly detected for conflicts and respecification, add a getstr() function that modifies the option tables appropriately. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak Reviewed-by: Eric Sandeen --- mkfs/xfs_mkfs.c | 143 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 78 insertions(+), 65 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 83ccab5..b1043fb 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -83,6 +83,10 @@ unsigned int sectorsize; * Do not set this flag when definning a subopt. It is used to remeber that * this subopt was already seen, for example for conflicts detection. * + * str_seen INTERNAL + * Do not set. It is used internally for respecification, when some options + * has to be parsed twice - at first as a string, then later as a number. + * * convert OPTIONAL * A flag signalling whether the user-given value can use suffixes. * If you want to allow the use of user-friendly values like 13k, 42G, @@ -124,6 +128,7 @@ struct opt_params { struct subopt_param { int index; bool seen; + bool str_seen; bool convert; bool is_power_2; int conflicts[MAX_CONFLICTS]; @@ -1471,14 +1476,17 @@ illegal_option( usage(); } -static long long -getnum( - const char *str, +/* + * Check for conflicts and option respecification. + */ +static void +check_opt( struct opt_params *opts, - int index) + int index, + bool str_seen) { - struct subopt_param *sp = &opts->subopt_params[index]; - long long c; + struct subopt_param *sp = &opts->subopt_params[index]; + int i; if (sp->index != index) { fprintf(stderr, @@ -1487,22 +1495,47 @@ getnum( reqval(opts->name, (char **)opts->subopts, index); } - /* check for respecification of the option */ - if (sp->seen) - respec(opts->name, (char **)opts->subopts, index); - sp->seen = true; + /* + * Check for respecification of the option. This is more complex than it + * seems because some options are parsed twice - once as a string during + * input parsing, then later the string is passed to getnum for + * conversion into a number and bounds checking. Hence the two variables + * used to track the different uses based on the @str parameter passed + * to us. + */ + if (!str_seen) { + if (sp->seen) + respec(opts->name, (char **)opts->subopts, index); + sp->seen = true; + } else { + if (sp->str_seen) + respec(opts->name, (char **)opts->subopts, index); + sp->str_seen = true; + } /* check for conflicts with the option */ - for (c = 0; c < MAX_CONFLICTS; c++) { - int conflict_opt = sp->conflicts[c]; + for (i = 0; i < MAX_CONFLICTS; i++) { + int conflict_opt = sp->conflicts[i]; if (conflict_opt == LAST_CONFLICT) break; - if (opts->subopt_params[conflict_opt].seen) + if (opts->subopt_params[conflict_opt].seen || + opts->subopt_params[conflict_opt].str_seen) conflict(opts->name, (char **)opts->subopts, conflict_opt, index); } +} +static long long +getnum( + const char *str, + struct opt_params *opts, + int index) +{ + struct subopt_param *sp = &opts->subopt_params[index]; + long long c; + + check_opt(opts, index, false); /* empty strings might just return a default value */ if (!str || *str == '\0') { if (sp->defaultval == SUBOPT_NEEDS_VAL) @@ -1544,6 +1577,26 @@ getnum( return c; } +/* + * Option is a string - do all the option table work, and check there + * is actually an option string. Otherwise we don't do anything with the string + * here - validation will be done later when the string is converted to a value + * or used as a file/device path. + */ +static char * +getstr( + char *str, + struct opt_params *opts, + int index) +{ + check_opt(opts, index, true); + + /* empty strings for string options are not valid */ + if (!str || *str == '\0') + reqval(opts->name, (char **)opts->subopts, index); + return str; +} + int main( int argc, @@ -1737,18 +1790,10 @@ main( xi.dcreat = 1; break; case D_NAME: - if (!value || *value == '\0') - reqval('d', subopts, D_NAME); - if (xi.dname) - respec('d', subopts, D_NAME); - xi.dname = value; + xi.dname = getstr(value, &dopts, D_NAME); break; case D_SIZE: - if (!value || *value == '\0') - reqval('d', subopts, D_SIZE); - if (dsize) - respec('d', subopts, D_SIZE); - dsize = value; + dsize = getstr(value, &dopts, D_SIZE); break; case D_SUNIT: dsunit = getnum(value, &dopts, D_SUNIT); @@ -1889,18 +1934,10 @@ main( break; case L_NAME: case L_DEV: - if (laflag) - conflict('l', subopts, L_AGNUM, L_DEV); - if (liflag) - conflict('l', subopts, L_INTERNAL, L_DEV); - if (!value || *value == '\0') - reqval('l', subopts, L_NAME); - if (xi.logname) - respec('l', subopts, L_NAME); + logfile = getstr(value, &lopts, L_NAME); + xi.logname = logfile; ldflag = 1; loginternal = 0; - logfile = value; - xi.logname = value; break; case L_VERSION: sb_feat.log_version = @@ -1908,12 +1945,7 @@ main( lvflag = 1; break; case L_SIZE: - if (!value || *value == '\0') - reqval('l', subopts, L_SIZE); - if (logsize) - respec('l', subopts, L_SIZE); - logsize = value; - lsflag = 1; + logsize = getstr(value, &lopts, L_SIZE); break; case L_SECTLOG: lsectorlog = getnum(value, &lopts, @@ -1994,10 +2026,7 @@ main( nsflag = 1; break; case N_VERSION: - if (!value || *value == '\0') - reqval('n', subopts, N_VERSION); - if (nvflag) - respec('n', subopts, N_VERSION); + value = getstr(value, &nopts, N_VERSION); if (!strcasecmp(value, "ci")) { /* ASCII CI mode */ sb_feat.nci = true; @@ -2040,11 +2069,8 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case R_EXTSIZE: - if (!value || *value == '\0') - reqval('r', subopts, R_EXTSIZE); - if (rtextsize) - respec('r', subopts, R_EXTSIZE); - rtextsize = value; + rtextsize = getstr(value, &ropts, + R_EXTSIZE); break; case R_FILE: xi.risfile = getnum(value, &ropts, @@ -2054,18 +2080,11 @@ main( break; case R_NAME: case R_DEV: - if (!value || *value == '\0') - reqval('r', subopts, R_NAME); - if (xi.rtname) - respec('r', subopts, R_NAME); - xi.rtname = value; + xi.rtname = getstr(value, &ropts, + R_NAME); break; case R_SIZE: - if (!value || *value == '\0') - reqval('r', subopts, R_SIZE); - if (rtsize) - respec('r', subopts, R_SIZE); - rtsize = value; + rtsize = getstr(value, &ropts, R_SIZE); break; case R_NOALIGN: norsflag = getnum(value, &ropts, @@ -2125,13 +2144,7 @@ main( fprintf(stderr, _("extra arguments\n")); usage(); } else if (argc - optind == 1) { - dfile = xi.volname = argv[optind]; - if (xi.dname) { - fprintf(stderr, - _("cannot specify both %s and -d name=%s\n"), - xi.volname, xi.dname); - usage(); - } + dfile = xi.volname = getstr(argv[optind], &dopts, D_NAME); } else dfile = xi.dname; -- 2.5.0 From jtulak@redhat.com Thu Apr 21 04:40:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 93B4E7CD5 for ; Thu, 21 Apr 2016 04:40:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 58EE630406A for ; Thu, 21 Apr 2016 02:40:11 -0700 (PDT) X-ASG-Debug-ID: 1461231610-04bdf0358f34900001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cd9a1FIy7Adch8Ye (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 21 Apr 2016 02:40:10 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3ED93C056819 for ; Thu, 21 Apr 2016 09:40:10 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3L9ds0U007155 for ; Thu, 21 Apr 2016 05:40:09 -0400 From: Jan Tulak To: xfs@oss.sgi.com Subject: [PATCH 17/19] mkfs: unit conversions are case insensitive Date: Thu, 21 Apr 2016 11:39:51 +0200 X-ASG-Orig-Subj: [PATCH 17/19] mkfs: unit conversions are case insensitive Message-Id: <1461231593-31294-18-git-send-email-jtulak@redhat.com> In-Reply-To: <1461231593-31294-1-git-send-email-jtulak@redhat.com> References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461231610 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1391 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Solves the question "Should I use 10g or 10G?" Signed-off-by: Jan Tulak --- CHANGES: * use tolower instead of == 'p' || == 'P' --- mkfs/xfs_mkfs.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index a6334bc..a35c4a5 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -3594,8 +3594,10 @@ cvtnum( { long long i; char *sp; + int c; i = strtoll(s, &sp, 0); + c = tolower(*sp); if (i == 0 && sp == s) return -1LL; if (*sp == '\0') @@ -3606,17 +3608,17 @@ cvtnum( if (*sp == 's' && sp[1] == '\0') return i * sectsize; - if (*sp == 'k' && sp[1] == '\0') + if (c == 'k' && sp[1] == '\0') return 1024LL * i; - if (*sp == 'm' && sp[1] == '\0') + if (c == 'm' && sp[1] == '\0') return 1024LL * 1024LL * i; - if (*sp == 'g' && sp[1] == '\0') + if (c == 'g' && sp[1] == '\0') return 1024LL * 1024LL * 1024LL * i; - if (*sp == 't' && sp[1] == '\0') + if (c == 't' && sp[1] == '\0') return 1024LL * 1024LL * 1024LL * 1024LL * i; - if (*sp == 'p' && sp[1] == '\0') + if (c == 'p' && sp[1] == '\0') return 1024LL * 1024LL * 1024LL * 1024LL * 1024LL * i; - if (*sp == 'e' && sp[1] == '\0') + if (c == 'e' && sp[1] == '\0') return 1024LL * 1024LL * 1024LL * 1024LL * 1024LL * 1024LL * i; return -1LL; } -- 2.5.0 From jtulak@redhat.com Thu Apr 21 04:40:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4AF647CC7 for ; Thu, 21 Apr 2016 04:40:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C846B8F8064 for ; Thu, 21 Apr 2016 02:40:10 -0700 (PDT) X-ASG-Debug-ID: 1461231608-04bdf0358e348f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id UFCN7AxRjpJEOZjy (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 21 Apr 2016 02:40:08 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8E58381123 for ; Thu, 21 Apr 2016 09:40:08 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3L9ds0S007155 for ; Thu, 21 Apr 2016 05:40:08 -0400 From: Jan Tulak To: xfs@oss.sgi.com Subject: [PATCH 15/19] mkfs: don't treat files as though they are block devices Date: Thu, 21 Apr 2016 11:39:49 +0200 X-ASG-Orig-Subj: [PATCH 15/19] mkfs: don't treat files as though they are block devices Message-Id: <1461231593-31294-16-git-send-email-jtulak@redhat.com> In-Reply-To: <1461231593-31294-1-git-send-email-jtulak@redhat.com> References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461231608 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11283 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner THIS PATCH HAS KNOWN ISSUES - it fails xfs/206 and xfs/216 tests, as it shrinks a file instead just not using it entirely, when -d size is used. If the device is actually a file, and "-d file" is not specified, mkfs will try to treat it as a block device and get stuff wrong. Image files don't necessarily have the same sector sizes as the block device or filesystem underlying the image file, nor should we be issuing discard ioctls on image files. To fix this sanely, only require "-d file" if the device name is invalid to trigger creation of the file. Otherwise, use stat() to determine if the device is a file or block device and deal with that appropriately by setting the "isfile" variables and turning off direct IO. Then ensure that we check the "isfile" options before doing things that are specific to block devices. Other file/blockdev issues fixed: - use getstr to detect specifying the data device name twice. - check file/size/name parameters before anything else. - overwrite checks need to be done before the image file is opened and potentially truncated. - blkid_get_topology() should not be called for image files, so warn when it is called that way. - zero_old_xfs_structures() emits a spurious error: "existing superblock read failed: Success" when it is run on a truncated image file. Don't warn if we see this problem on an image file. - Don't issue discards on image files. - Use fsync() for image files, not BLKFLSBUF in platform_flush_device() for Linux. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak --- * revert to Dave's original patch * add missing platform_findsizes to libxfs init --- libxfs/init.c | 6 ++ libxfs/linux.c | 11 +++- mkfs/xfs_mkfs.c | 168 +++++++++++++++++++++++++++++++++++++++----------------- 3 files changed, 133 insertions(+), 52 deletions(-) diff --git a/libxfs/init.c b/libxfs/init.c index 8d747e8..da3485b 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -278,6 +278,8 @@ libxfs_init(libxfs_init_t *a) a->ddev= libxfs_device_open(dname, a->dcreat, flags, a->setblksize); a->dfd = libxfs_device_to_fd(a->ddev); + platform_findsizes(dname, a->dfd, &a->dsize, + &a->dbsize); } else { if (!check_open(dname, flags, &rawfile, &blockfile)) goto done; @@ -297,6 +299,8 @@ libxfs_init(libxfs_init_t *a) a->logdev = libxfs_device_open(logname, a->lcreat, flags, a->setblksize); a->logfd = libxfs_device_to_fd(a->logdev); + platform_findsizes(dname, a->logfd, &a->logBBsize, + &a->lbsize); } else { if (!check_open(logname, flags, &rawfile, &blockfile)) goto done; @@ -316,6 +320,8 @@ libxfs_init(libxfs_init_t *a) a->rtdev = libxfs_device_open(rtname, a->rcreat, flags, a->setblksize); a->rtfd = libxfs_device_to_fd(a->rtdev); + platform_findsizes(dname, a->rtfd, &a->rtsize, + &a->rtbsize); } else { if (!check_open(rtname, flags, &rawfile, &blockfile)) goto done; diff --git a/libxfs/linux.c b/libxfs/linux.c index f6ea1b2..c9f2baf 100644 --- a/libxfs/linux.c +++ b/libxfs/linux.c @@ -125,7 +125,16 @@ platform_set_blocksize(int fd, char *path, dev_t device, int blocksize, int fata void platform_flush_device(int fd, dev_t device) { - if (major(device) != RAMDISK_MAJOR) + struct stat64 st; + if (major(device) == RAMDISK_MAJOR) + return; + + if (fstat64(fd, &st) < 0) + return; + + if (S_ISREG(st.st_mode)) + fsync(fd); + else ioctl(fd, BLKFLSBUF, 0); } diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index b1043fb..be82ec5 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -787,7 +787,7 @@ calc_stripe_factors( #ifdef ENABLE_BLKID static int check_overwrite( - char *device) + const char *device) { const char *type; blkid_probe pr = NULL; @@ -804,7 +804,7 @@ check_overwrite( fd = open(device, O_RDONLY); if (fd < 0) goto out; - platform_findsizes(device, fd, &size, &bsz); + platform_findsizes((char *)device, fd, &size, &bsz); close(fd); /* nothing to overwrite on a 0-length device */ @@ -851,7 +851,6 @@ check_overwrite( "according to blkid\n"), progname, device); } ret = 1; - out: if (pr) blkid_free_probe(pr); @@ -877,8 +876,12 @@ static void blkid_get_topology( struct stat statbuf; /* can't get topology info from a file */ - if (!stat(device, &statbuf) && S_ISREG(statbuf.st_mode)) + if (!stat(device, &statbuf) && S_ISREG(statbuf.st_mode)) { + fprintf(stderr, + _("%s: Warning: trying to probe topology of a file %s!\n"), + progname, device); return; + } pr = blkid_new_probe_from_filename(device); if (!pr) @@ -1016,6 +1019,79 @@ static void get_topology( } static void +check_device_type( + const char *name, + int *isfile, + bool no_size, + bool no_name, + int *create, + bool force_overwrite, + const char *optname) +{ + struct stat64 statbuf; + + if (*isfile && (no_size || no_name)) { + fprintf(stderr, + _("if -%s file then -%s name and -%s size are required\n"), + optname, optname, optname); + usage(); + } + + if (name == NULL) { + usage(); + } + + if (stat64(name, &statbuf)) { + if (errno == ENOENT && *isfile) { + if (create) + *create = 1; + return; + } + + fprintf(stderr, + _("Error accessing specified device %s: %s\n"), + name, strerror(errno)); + usage(); + return; + } + + if (!force_overwrite && check_overwrite(name)) { + fprintf(stderr, + _("%s: Use the -f option to force overwrite.\n"), + progname); + exit(1); + } + + /* + * We only want to completely truncate and recreate an existing file if + * we were specifically told it was a file. Set the create flag only in + * this case to trigger that behaviour. + */ + if (S_ISREG(statbuf.st_mode)) { + if (!*isfile) + *isfile = 1; + else if (create) + *create = 1; + return; + } + + if (S_ISBLK(statbuf.st_mode)) { + if (*isfile) { + fprintf(stderr, + _("specified \"-%s file\" on a block device %s\n"), + optname, name); + usage(); + } + return; + } + + fprintf(stderr, + _("specified device %s not a file or block device\n"), + name); + usage(); +} + +static void fixup_log_stripe_unit( int lsflag, int sunit, @@ -1280,7 +1356,6 @@ zero_old_xfs_structures( __uint32_t bsize; int i; xfs_off_t off; - int tmp; /* * We open regular files with O_TRUNC|O_CREAT. Nothing to do here... @@ -1300,15 +1375,18 @@ zero_old_xfs_structures( } memset(buf, 0, new_sb->sb_sectsize); - tmp = pread(xi->dfd, buf, new_sb->sb_sectsize, 0); - if (tmp < 0) { - fprintf(stderr, _("existing superblock read failed: %s\n"), - strerror(errno)); - goto done; - } - if (tmp != new_sb->sb_sectsize) { - fprintf(stderr, - _("warning: could not read existing superblock, skip zeroing\n")); + /* + * If we are creating an image file, it might be of zero length at this + * point in time. Hence reading the existing superblock is going to + * return zero bytes. It's not a failure we need to warn about in this + * case. + */ + off = pread(xi->dfd, buf, new_sb->sb_sectsize, 0); + if (off != new_sb->sb_sectsize) { + if (!xi->disfile) + fprintf(stderr, + _("error reading existing superblock: %s\n"), + strerror(errno)); goto done; } libxfs_sb_from_disk(&sb, buf); @@ -1786,8 +1864,6 @@ main( case D_FILE: xi.disfile = getnum(value, &dopts, D_FILE); - if (xi.disfile && !Nflag) - xi.dcreat = 1; break; case D_NAME: xi.dname = getstr(value, &dopts, D_NAME); @@ -1913,11 +1989,6 @@ main( case L_FILE: xi.lisfile = getnum(value, &lopts, L_FILE); - if (xi.lisfile && loginternal) - conflict('l', subopts, L_INTERNAL, - L_FILE); - if (xi.lisfile) - xi.lcreat = 1; break; case L_INTERNAL: loginternal = getnum(value, &lopts, @@ -2075,8 +2146,6 @@ main( case R_FILE: xi.risfile = getnum(value, &ropts, R_FILE); - if (xi.risfile) - xi.rcreat = 1; break; case R_NAME: case R_DEV: @@ -2181,6 +2250,26 @@ _("Minimum block size for CRC enabled filesystems is %d bytes.\n"), lsectorsize = sectorsize; } + /* + * Before anything else, verify that we are correctly operating on + * files or block devices and set the control parameters correctly. + * Explicitly disable direct IO for image files so we don't error out on + * sector size mismatches between the new filesystem and the underlying + * host filesystem. + */ + check_device_type(dfile, &xi.disfile, !dsize, !dfile, + Nflag ? NULL : &xi.dcreat, force_overwrite, "d"); + if (!loginternal) + check_device_type(xi.logname, &xi.lisfile, !logsize, !xi.logname, + Nflag ? NULL : &xi.lcreat, + force_overwrite, "l"); + if (xi.rtname) + check_device_type(xi.rtname, &xi.risfile, !rtsize, !xi.rtname, + Nflag ? NULL : &xi.rcreat, + force_overwrite, "r"); + if (xi.disfile || xi.lisfile || xi.risfile) + xi.isdirect = 0; + memset(&ft, 0, sizeof(ft)); get_topology(&xi, &ft, force_overwrite); @@ -2331,11 +2420,6 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); } - if (xi.disfile && (!dsize || !xi.dname)) { - fprintf(stderr, - _("if -d file then -d name and -d size are required\n")); - usage(); - } if (dsize) { __uint64_t dbytes; @@ -2368,11 +2452,6 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); usage(); } - if (xi.lisfile && (!logsize || !xi.logname)) { - fprintf(stderr, - _("if -l file then -l name and -l size are required\n")); - usage(); - } if (logsize) { __uint64_t logbytes; @@ -2390,11 +2469,6 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); (long long)logbytes, blocksize, (long long)(logblocks << blocklog)); } - if (xi.risfile && (!rtsize || !xi.rtname)) { - fprintf(stderr, - _("if -r file then -r name and -r size are required\n")); - usage(); - } if (rtsize) { __uint64_t rtbytes; @@ -2516,22 +2590,14 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); xi.rtsize &= sector_mask; xi.logBBsize &= (__uint64_t)-1 << (MAX(lsectorlog, 10) - BBSHIFT); - if (!force_overwrite) { - if (check_overwrite(dfile) || - check_overwrite(logfile) || - check_overwrite(xi.rtname)) { - fprintf(stderr, - _("%s: Use the -f option to force overwrite.\n"), - progname); - exit(1); - } - } + /* don't do discards on print-only runs or on files */ if (discard && !Nflag) { - discard_blocks(xi.ddev, xi.dsize); - if (xi.rtdev) + if (!xi.disfile) + discard_blocks(xi.ddev, xi.dsize); + if (xi.rtdev && !xi.risfile) discard_blocks(xi.rtdev, xi.rtsize); - if (xi.logdev && xi.logdev != xi.ddev) + if (xi.logdev && xi.logdev != xi.ddev && !xi.lisfile) discard_blocks(xi.logdev, xi.logBBsize); } -- 2.5.0 From jtulak@redhat.com Thu Apr 21 04:40:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 957D47CD6 for ; Thu, 21 Apr 2016 04:40:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0B135AC005 for ; Thu, 21 Apr 2016 02:40:10 -0700 (PDT) X-ASG-Debug-ID: 1461231609-04cb6c09a243900001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id feCB4ueH8DBAOap2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 21 Apr 2016 02:40:09 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6064F62646 for ; Thu, 21 Apr 2016 09:40:09 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3L9ds0T007155 for ; Thu, 21 Apr 2016 05:40:08 -0400 From: Jan Tulak To: xfs@oss.sgi.com Subject: [PATCH 16/19] mkfs: move spinodes crc check Date: Thu, 21 Apr 2016 11:39:50 +0200 X-ASG-Orig-Subj: [PATCH 16/19] mkfs: move spinodes crc check Message-Id: <1461231593-31294-17-git-send-email-jtulak@redhat.com> In-Reply-To: <1461231593-31294-1-git-send-email-jtulak@redhat.com> References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 21 Apr 2016 09:40:09 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461231609 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1315 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Spinodes crc check is now moved to be in the same way as finobt. Signed-off-by: Jan Tulak Reviewed-by: Brian Foster --- mkfs/xfs_mkfs.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index be82ec5..a6334bc 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -2389,19 +2389,20 @@ _("32 bit Project IDs always enabled on CRC enabled filesytems\n")); * explicitly turned them off then silently turn them off * to avoid an unnecessary warning. If the user explicitly * tried to use crc=0,finobt=1, then issue a warning before - * turning them off. + * turning them off. The same is also for sparse inodes. */ if (sb_feat.finobt && mopts.subopt_params[M_FINOBT].seen) { fprintf(stderr, _("warning: finobt not supported without CRC support, disabled.\n")); } sb_feat.finobt = 0; - } - if (sb_feat.spinodes && !sb_feat.crcs_enabled) { - fprintf(stderr, -_("warning: sparse inodes not supported without CRC support, disabled.\n")); + if (sb_feat.spinodes) { + fprintf(stderr, + _("warning: sparse inodes not supported without CRC support, disabled.\n")); + } sb_feat.spinodes = 0; + } if (nsflag || nlflag) { -- 2.5.0 From jtulak@redhat.com Thu Apr 21 04:40:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 67A6B7CD4 for ; Thu, 21 Apr 2016 04:40:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8D4DEAC002 for ; Thu, 21 Apr 2016 02:40:10 -0700 (PDT) X-ASG-Debug-ID: 1461231607-04cbb00fe72d3c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GtCDBYwnAPM4KqTq (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 21 Apr 2016 02:40:07 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E797C78230 for ; Thu, 21 Apr 2016 09:40:06 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3L9ds0Q007155 for ; Thu, 21 Apr 2016 05:40:06 -0400 From: Jan Tulak To: xfs@oss.sgi.com Subject: [PATCH 13/19] mkfs: encode conflicts into parsing table Date: Thu, 21 Apr 2016 11:39:47 +0200 X-ASG-Orig-Subj: [PATCH 13/19] mkfs: encode conflicts into parsing table Message-Id: <1461231593-31294-14-git-send-email-jtulak@redhat.com> In-Reply-To: <1461231593-31294-1-git-send-email-jtulak@redhat.com> References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461231607 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 19811 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner Many options conflict, so we need to specify which options conflict with each other in a generic manner. We already have a "seen" variable used for respecification detection, so we can also use this code conflict detection. Hence add a "conflicts" array to the sub options parameter definition. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak Reviewed-by: Eric Sandeen --- mkfs/xfs_mkfs.c | 258 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 134 insertions(+), 124 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index a45dc7f..83ccab5 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -54,6 +54,9 @@ unsigned int sectorsize; #define MAX_SUBOPTS 16 #define SUBOPT_NEEDS_VAL (-1LL) +#define MAX_CONFLICTS 8 +#define LAST_CONFLICT (-1) + /* * Table for parsing mkfs parameters. * @@ -89,6 +92,11 @@ unsigned int sectorsize; * An optional flag for subopts where the given value has to be a power * of two. * + * conflicts MANDATORY + * If your subopt is in a conflict with some other option, specify it. + * Accepts the .index values of the conflicting subopts and the last + * member of this list has to be LAST_CONFLICT. + * * minval, maxval OPTIONAL * These options are used for automatic range check and they have to be * always used together in pair. If you don't want to limit the max value, @@ -118,6 +126,7 @@ struct opt_params { bool seen; bool convert; bool is_power_2; + int conflicts[MAX_CONFLICTS]; long long minval; long long maxval; long long defaultval; @@ -135,6 +144,8 @@ struct opt_params bopts = { }, .subopt_params = { { .index = B_LOG, + .conflicts = { B_SIZE, + LAST_CONFLICT }, .minval = XFS_MIN_BLOCKSIZE_LOG, .maxval = XFS_MAX_BLOCKSIZE_LOG, .defaultval = SUBOPT_NEEDS_VAL, @@ -142,6 +153,8 @@ struct opt_params bopts = { { .index = B_SIZE, .convert = true, .is_power_2 = true, + .conflicts = { B_LOG, + LAST_CONFLICT }, .minval = XFS_MIN_BLOCKSIZE, .maxval = XFS_MAX_BLOCKSIZE, .defaultval = SUBOPT_NEEDS_VAL, @@ -186,57 +199,84 @@ struct opt_params dopts = { }, .subopt_params = { { .index = D_AGCOUNT, + .conflicts = { D_AGSIZE, + LAST_CONFLICT }, .minval = 1, .maxval = XFS_MAX_AGNUMBER, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_FILE, + .conflicts = { LAST_CONFLICT }, .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = D_NAME, + .conflicts = { LAST_CONFLICT }, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SIZE, + .conflicts = { LAST_CONFLICT }, .convert = true, .minval = XFS_AG_MIN_BYTES, .maxval = LLONG_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SUNIT, + .conflicts = { D_NOALIGN, + D_SU, + D_SW, + LAST_CONFLICT }, .minval = 0, .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SWIDTH, + .conflicts = { D_NOALIGN, + D_SU, + D_SW, + LAST_CONFLICT }, .minval = 0, .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_AGSIZE, + .conflicts = { D_AGCOUNT, + LAST_CONFLICT }, .convert = true, .minval = XFS_AG_MIN_BYTES, .maxval = XFS_AG_MAX_BYTES, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SU, + .conflicts = { D_NOALIGN, + D_SUNIT, + D_SWIDTH, + LAST_CONFLICT }, .convert = true, .minval = 0, .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SW, + .conflicts = { D_NOALIGN, + D_SUNIT, + D_SWIDTH, + LAST_CONFLICT }, .minval = 0, .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SECTLOG, + .conflicts = { D_SECTSIZE, + LAST_CONFLICT }, .minval = XFS_MIN_SECTORSIZE_LOG, .maxval = XFS_MAX_SECTORSIZE_LOG, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SECTSIZE, + .conflicts = { D_SECTLOG, + LAST_CONFLICT }, .convert = true, .is_power_2 = true, .minval = XFS_MIN_SECTORSIZE, @@ -244,21 +284,29 @@ struct opt_params dopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_NOALIGN, + .conflicts = { D_SU, + D_SW, + D_SUNIT, + D_SWIDTH, + LAST_CONFLICT }, .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = D_RTINHERIT, + .conflicts = { LAST_CONFLICT }, .minval = 1, .maxval = 1, .defaultval = 1, }, { .index = D_PROJINHERIT, + .conflicts = { LAST_CONFLICT }, .minval = 0, .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_EXTSZINHERIT, + .conflicts = { LAST_CONFLICT }, .minval = 0, .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, @@ -290,43 +338,57 @@ struct opt_params iopts = { }, .subopt_params = { { .index = I_ALIGN, + .conflicts = { LAST_CONFLICT }, .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = I_LOG, + .conflicts = { I_PERBLOCK, + I_SIZE, + LAST_CONFLICT }, .minval = XFS_DINODE_MIN_LOG, .maxval = XFS_DINODE_MAX_LOG, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_MAXPCT, + .conflicts = { LAST_CONFLICT }, .minval = 0, .maxval = 100, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_PERBLOCK, + .conflicts = { I_LOG, + I_SIZE, + LAST_CONFLICT }, .is_power_2 = true, .minval = XFS_MIN_INODE_PERBLOCK, .maxval = XFS_MAX_BLOCKSIZE / XFS_DINODE_MIN_SIZE, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_SIZE, + .conflicts = { I_PERBLOCK, + I_LOG, + LAST_CONFLICT }, .is_power_2 = true, .minval = XFS_DINODE_MIN_SIZE, .maxval = XFS_DINODE_MAX_SIZE, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_ATTR, + .conflicts = { LAST_CONFLICT }, .minval = 0, .maxval = 2, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_PROJID32BIT, + .conflicts = { LAST_CONFLICT }, .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = I_SPINODES, + .conflicts = { LAST_CONFLICT }, .minval = 0, .maxval = 1, .defaultval = 1, @@ -365,46 +427,64 @@ struct opt_params lopts = { }, .subopt_params = { { .index = L_AGNUM, + .conflicts = { L_DEV, + LAST_CONFLICT }, .minval = 0, .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_INTERNAL, + .conflicts = { L_FILE, + L_DEV, + LAST_CONFLICT }, .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = L_SIZE, + .conflicts = { LAST_CONFLICT }, .convert = true, .minval = 2 * 1024 * 1024LL, /* XXX: XFS_MIN_LOG_BYTES */ .maxval = XFS_MAX_LOG_BYTES, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_VERSION, + .conflicts = { LAST_CONFLICT }, .minval = 1, .maxval = 2, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SUNIT, + .conflicts = { L_SU, + LAST_CONFLICT }, .minval = BTOBB(XLOG_MIN_RECORD_BSIZE), .maxval = BTOBB(XLOG_MAX_RECORD_BSIZE), .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SU, + .conflicts = { L_SUNIT, + LAST_CONFLICT }, .convert = true, .minval = 0, .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_DEV, + .conflicts = { L_AGNUM, + L_INTERNAL, + LAST_CONFLICT }, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SECTLOG, + .conflicts = { L_SECTSIZE, + LAST_CONFLICT }, .minval = XFS_MIN_SECTORSIZE_LOG, .maxval = XFS_MAX_SECTORSIZE_LOG, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SECTSIZE, + .conflicts = { L_SECTLOG, + LAST_CONFLICT }, .convert = true, .is_power_2 = true, .minval = XFS_MIN_SECTORSIZE, @@ -412,14 +492,20 @@ struct opt_params lopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_FILE, + .conflicts = { L_INTERNAL, + LAST_CONFLICT }, .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = L_NAME, + .conflicts = { L_AGNUM, + L_INTERNAL, + LAST_CONFLICT }, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_LAZYSBCNTR, + .conflicts = { LAST_CONFLICT }, .minval = 0, .maxval = 1, .defaultval = 1, @@ -442,11 +528,15 @@ struct opt_params nopts = { }, .subopt_params = { { .index = N_LOG, + .conflicts = { N_SIZE, + LAST_CONFLICT }, .minval = XFS_MIN_REC_DIRSIZE, .maxval = XFS_MAX_BLOCKSIZE_LOG, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = N_SIZE, + .conflicts = { N_LOG, + LAST_CONFLICT }, .convert = true, .is_power_2 = true, .minval = 1 << XFS_MIN_REC_DIRSIZE, @@ -454,11 +544,13 @@ struct opt_params nopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = N_VERSION, + .conflicts = { LAST_CONFLICT }, .minval = 2, .maxval = 2, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = N_FTYPE, + .conflicts = { LAST_CONFLICT }, .minval = 0, .maxval = 1, .defaultval = 1, @@ -485,32 +577,38 @@ struct opt_params ropts = { }, .subopt_params = { { .index = R_EXTSIZE, + .conflicts = { LAST_CONFLICT }, .convert = true, .minval = XFS_MIN_RTEXTSIZE, .maxval = XFS_MAX_RTEXTSIZE, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_SIZE, + .conflicts = { LAST_CONFLICT }, .convert = true, .minval = 0, .maxval = LLONG_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_DEV, + .conflicts = { LAST_CONFLICT }, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_FILE, .minval = 0, .maxval = 1, .defaultval = 1, + .conflicts = { LAST_CONFLICT }, }, { .index = R_NAME, + .conflicts = { LAST_CONFLICT }, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_NOALIGN, .minval = 0, .maxval = 1, .defaultval = 1, + .conflicts = { LAST_CONFLICT }, }, }, }; @@ -530,16 +628,25 @@ struct opt_params sopts = { }, .subopt_params = { { .index = S_LOG, + .conflicts = { S_SIZE, + S_SECTSIZE, + LAST_CONFLICT }, .minval = XFS_MIN_SECTORSIZE_LOG, .maxval = XFS_MAX_SECTORSIZE_LOG, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = S_SECTLOG, + .conflicts = { S_SIZE, + S_SECTSIZE, + LAST_CONFLICT }, .minval = XFS_MIN_SECTORSIZE_LOG, .maxval = XFS_MAX_SECTORSIZE_LOG, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = S_SIZE, + .conflicts = { S_LOG, + S_SECTLOG, + LAST_CONFLICT }, .convert = true, .is_power_2 = true, .minval = XFS_MIN_SECTORSIZE, @@ -547,6 +654,9 @@ struct opt_params sopts = { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = S_SECTSIZE, + .conflicts = { S_LOG, + S_SECTLOG, + LAST_CONFLICT }, .convert = true, .is_power_2 = true, .minval = XFS_MIN_SECTORSIZE, @@ -569,16 +679,19 @@ struct opt_params mopts = { }, .subopt_params = { { .index = M_CRC, + .conflicts = { LAST_CONFLICT }, .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = M_FINOBT, + .conflicts = { LAST_CONFLICT }, .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = M_UUID, + .conflicts = { LAST_CONFLICT }, .defaultval = SUBOPT_NEEDS_VAL, }, }, @@ -620,30 +733,14 @@ calc_stripe_factors( int *lsunit) { /* Handle data sunit/swidth options */ - if (*dsunit || *dswidth) { - if (dsu || dsw) { - fprintf(stderr, - _("data su/sw must not be used in " - "conjunction with data sunit/swidth\n")); - usage(); - } - - if ((*dsunit && !*dswidth) || (!*dsunit && *dswidth)) { - fprintf(stderr, - _("both data sunit and data swidth options " - "must be specified\n")); - usage(); - } + if ((*dsunit && !*dswidth) || (!*dsunit && *dswidth)) { + fprintf(stderr, + _("both data sunit and data swidth options " + "must be specified\n")); + usage(); } if (dsu || dsw) { - if (*dsunit || *dswidth) { - fprintf(stderr, - _("data sunit/swidth must not be used in " - "conjunction with data su/sw\n")); - usage(); - } - if ((dsu && !dsw) || (!dsu && dsw)) { fprintf(stderr, _("both data su and data sw options " @@ -671,24 +768,8 @@ calc_stripe_factors( /* Handle log sunit options */ - if (*lsunit) { - if (lsu) { - fprintf(stderr, - _("log su should not be used in " - "conjunction with log sunit\n")); - usage(); - } - } - - if (lsu) { - if (*lsunit) { - fprintf(stderr, - _("log sunit should not be used in " - "conjunction with log su\n")); - usage(); - } + if (lsu) *lsunit = (int)BTOBBT(lsu); - } } /* @@ -1411,6 +1492,17 @@ getnum( respec(opts->name, (char **)opts->subopts, index); sp->seen = true; + /* check for conflicts with the option */ + for (c = 0; c < MAX_CONFLICTS; c++) { + int conflict_opt = sp->conflicts[c]; + + if (conflict_opt == LAST_CONFLICT) + break; + if (opts->subopt_params[conflict_opt].seen) + conflict(opts->name, (char **)opts->subopts, + conflict_opt, index); + } + /* empty strings might just return a default value */ if (!str || *str == '\0') { if (sp->defaultval == SUBOPT_NEEDS_VAL) @@ -1606,17 +1698,11 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case B_LOG: - if (bsflag) - conflict('b', subopts, B_SIZE, - B_LOG); blocklog = getnum(value, &bopts, B_LOG); blocksize = 1 << blocklog; blflag = 1; break; case B_SIZE: - if (blflag) - conflict('b', subopts, B_LOG, - B_SIZE); blocksize = getnum(value, &bopts, B_SIZE); blocklog = libxfs_highbit32(blocksize); @@ -1665,61 +1751,29 @@ main( dsize = value; break; case D_SUNIT: - if (nodsflag) - conflict('d', subopts, D_NOALIGN, - D_SUNIT); dsunit = getnum(value, &dopts, D_SUNIT); break; case D_SWIDTH: - if (nodsflag) - conflict('d', subopts, D_NOALIGN, - D_SWIDTH); dswidth = getnum(value, &dopts, D_SWIDTH); break; case D_SU: - if (nodsflag) - conflict('d', subopts, D_NOALIGN, - D_SU); dsu = getnum(value, &dopts, D_SU); break; case D_SW: - if (nodsflag) - conflict('d', subopts, D_NOALIGN, - D_SW); dsw = getnum(value, &dopts, D_SW); break; case D_NOALIGN: nodsflag = getnum(value, &dopts, - D_NOALIGN); - if (nodsflag) { - if (dsu) - conflict('d', subopts, D_SU, - D_NOALIGN); - if (dsunit) - conflict('d', subopts, D_SUNIT, - D_NOALIGN); - if (dsw) - conflict('d', subopts, D_SW, D_NOALIGN); - if (dswidth) - conflict('d', subopts, D_SWIDTH, - D_NOALIGN); - } break; case D_SECTLOG: - if (ssflag) - conflict('d', subopts, D_SECTSIZE, - D_SECTLOG); sectorlog = getnum(value, &dopts, D_SECTLOG); sectorsize = 1 << sectorlog; slflag = 1; break; case D_SECTSIZE: - if (slflag) - conflict('d', subopts, D_SECTLOG, - D_SECTSIZE); sectorsize = getnum(value, &dopts, D_SECTSIZE); sectorlog = @@ -1762,12 +1816,6 @@ main( &iopts, I_ALIGN); break; case I_LOG: - if (ipflag) - conflict('i', subopts, I_PERBLOCK, - I_LOG); - if (isflag) - conflict('i', subopts, I_SIZE, - I_LOG); inodelog = getnum(value, &iopts, I_LOG); isize = 1 << inodelog; ilflag = 1; @@ -1778,23 +1826,11 @@ main( imflag = 1; break; case I_PERBLOCK: - if (ilflag) - conflict('i', subopts, I_LOG, - I_PERBLOCK); - if (isflag) - conflict('i', subopts, I_SIZE, - I_PERBLOCK); inopblock = getnum(value, &iopts, I_PERBLOCK); ipflag = 1; break; case I_SIZE: - if (ilflag) - conflict('i', subopts, I_LOG, - I_SIZE); - if (ipflag) - conflict('i', subopts, I_PERBLOCK, - I_SIZE); isize = getnum(value, &iopts, I_SIZE); inodelog = libxfs_highbit32(isize); isflag = 1; @@ -1809,9 +1845,8 @@ main( I_PROJID32BIT); break; case I_SPINODES: - sb_feat.spinodes = - getnum(value, &iopts, - I_SPINODES); + sb_feat.spinodes = getnum(value, + &iopts, I_SPINODES); break; default: unknown('i', value); @@ -1827,8 +1862,6 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case L_AGNUM: - if (ldflag) - conflict('l', subopts, L_AGNUM, L_DEV); logagno = getnum(value, &lopts, L_AGNUM); laflag = 1; break; @@ -1842,12 +1875,6 @@ main( xi.lcreat = 1; break; case L_INTERNAL: - if (ldflag) - conflict('l', subopts, L_INTERNAL, L_DEV); - if (xi.lisfile) - conflict('l', subopts, L_FILE, - L_INTERNAL); - loginternal = getnum(value, &lopts, L_INTERNAL); liflag = 1; @@ -1889,18 +1916,12 @@ main( lsflag = 1; break; case L_SECTLOG: - if (lssflag) - conflict('l', subopts, L_SECTSIZE, - L_SECTLOG); lsectorlog = getnum(value, &lopts, L_SECTLOG); lsectorsize = 1 << lsectorlog; lslflag = 1; break; case L_SECTSIZE: - if (lslflag) - conflict('l', subopts, L_SECTLOG, - L_SECTSIZE); lsectorsize = getnum(value, &lopts, L_SECTSIZE); lsectorlog = @@ -1960,18 +1981,12 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case N_LOG: - if (nsflag) - conflict('n', subopts, N_SIZE, - N_LOG); dirblocklog = getnum(value, &nopts, N_LOG); dirblocksize = 1 << dirblocklog; nlflag = 1; break; case N_SIZE: - if (nlflag) - conflict('n', subopts, N_LOG, - N_SIZE); dirblocksize = getnum(value, &nopts, N_SIZE); dirblocklog = @@ -2071,7 +2086,7 @@ main( &value)) { case S_LOG: case S_SECTLOG: - if (ssflag || lssflag) + if (lssflag) conflict('s', subopts, S_SECTSIZE, S_SECTLOG); sectorlog = getnum(value, &sopts, @@ -2083,7 +2098,7 @@ main( break; case S_SIZE: case S_SECTSIZE: - if (slflag || lslflag) + if (lslflag) conflict('s', subopts, S_SECTLOG, S_SECTSIZE); sectorsize = getnum(value, &sopts, @@ -2302,11 +2317,6 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); dirblocksize = 1 << dirblocklog; } - if (daflag && dasize) { - fprintf(stderr, - _("both -d agcount= and agsize= specified, use one or the other\n")); - usage(); - } if (xi.disfile && (!dsize || !xi.dname)) { fprintf(stderr, -- 2.5.0 From jtulak@redhat.com Thu Apr 21 04:40:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 443A17CB3 for ; Thu, 21 Apr 2016 04:40:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id AA072AC005 for ; Thu, 21 Apr 2016 02:40:12 -0700 (PDT) X-ASG-Debug-ID: 1461231611-04cbb00fe72d3d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id vJ6j0nUdZvH2E4ZV (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 21 Apr 2016 02:40:11 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 16DE8C056819 for ; Thu, 21 Apr 2016 09:40:11 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3L9ds0V007155 for ; Thu, 21 Apr 2016 05:40:10 -0400 From: Jan Tulak To: xfs@oss.sgi.com Subject: [PATCH 18/19] mkfs: add optional 'reason' for illegal_option Date: Thu, 21 Apr 2016 11:39:52 +0200 X-ASG-Orig-Subj: [PATCH 18/19] mkfs: add optional 'reason' for illegal_option Message-Id: <1461231593-31294-19-git-send-email-jtulak@redhat.com> In-Reply-To: <1461231593-31294-1-git-send-email-jtulak@redhat.com> References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461231611 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1895 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Allow us to tell the user what exactly is wrong with the specified options. For example, that the value is too small, instead of just generic "bad option." Signed-off-by: Jan Tulak --- CHANGES: * code format (space) * add translation _() to strings --- mkfs/xfs_mkfs.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index a35c4a5..c4cd5ba 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -1546,11 +1546,18 @@ static __attribute__((noreturn)) void illegal_option( const char *value, struct opt_params *opts, - int index) + int index, + const char *reason) { - fprintf(stderr, - _("Illegal value %s for -%c %s option\n"), - value, opts->name, opts->subopts[index]); + if (reason == NULL){ + fprintf(stderr, + _("Illegal value %s for -%c %s option\n"), + value, opts->name, opts->subopts[index]); + } else { + fprintf(stderr, + _("Illegal value %s for -%c %s option: %s\n"), + value, opts->name, opts->subopts[index], reason); + } usage(); } @@ -1642,16 +1649,18 @@ getnum( c = strtoll(str, &str_end, 0); if (c == 0 && str_end == str) - illegal_option(str, opts, index); + illegal_option(str, opts, index, NULL); if (*str_end != '\0') - illegal_option(str, opts, index); + illegal_option(str, opts, index, NULL); } /* Validity check the result. */ - if (c < sp->minval || c > sp->maxval) - illegal_option(str, opts, index); + if (c < sp->minval) + illegal_option(str, opts, index, _("value is too small")); + else if (c > sp->maxval) + illegal_option(str, opts, index, _("value is too large")); if (sp->is_power_2 && !ispow2(c)) - illegal_option(str, opts, index); + illegal_option(str, opts, index, _("value must be a power of 2")); return c; } -- 2.5.0 From jtulak@redhat.com Thu Apr 21 04:40:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6C6937CAE for ; Thu, 21 Apr 2016 04:40:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3E5C68F8065 for ; Thu, 21 Apr 2016 02:40:13 -0700 (PDT) X-ASG-Debug-ID: 1461231612-04cbb00fe92d3e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id tupfGYZVTxr10CvW (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 21 Apr 2016 02:40:12 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E81093B70D for ; Thu, 21 Apr 2016 09:40:11 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3L9ds0W007155 for ; Thu, 21 Apr 2016 05:40:11 -0400 From: Jan Tulak To: xfs@oss.sgi.com Subject: [PATCH 19/19] mkfs: conflicting values with disabled crc should fail Date: Thu, 21 Apr 2016 11:39:53 +0200 X-ASG-Orig-Subj: [PATCH 19/19] mkfs: conflicting values with disabled crc should fail Message-Id: <1461231593-31294-20-git-send-email-jtulak@redhat.com> In-Reply-To: <1461231593-31294-1-git-send-email-jtulak@redhat.com> References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461231612 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1648 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 If crc=0, then finobt=1 and spinodes=1 should both fail, instead of a warning. Signed-off-by: Jan Tulak --- mkfs/xfs_mkfs.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index c4cd5ba..249e547 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -2394,21 +2394,24 @@ _("32 bit Project IDs always enabled on CRC enabled filesytems\n")); } else { /* * The kernel doesn't currently support crc=0,finobt=1 - * filesystems. If crcs are not enabled and the user has - * explicitly turned them off then silently turn them off - * to avoid an unnecessary warning. If the user explicitly - * tried to use crc=0,finobt=1, then issue a warning before - * turning them off. The same is also for sparse inodes. + * filesystems. If crcs are not enabled and the user has not + * explicitly turned finobt on, then silently turn it off to + * avoid an unnecessary warning. + * If the user explicitly tried to use crc=0,finobt=1, + * then issue an error. + * The same is also for sparse inodes. */ if (sb_feat.finobt && mopts.subopt_params[M_FINOBT].seen) { fprintf(stderr, -_("warning: finobt not supported without CRC support, disabled.\n")); +_("finobt not supported without CRC support\n")); + usage(); } sb_feat.finobt = 0; if (sb_feat.spinodes) { fprintf(stderr, - _("warning: sparse inodes not supported without CRC support, disabled.\n")); + _("sparse inodes not supported without CRC support\n")); + usage(); } sb_feat.spinodes = 0; -- 2.5.0 From bfoster@redhat.com Thu Apr 21 07:40:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id ADBD17CA0 for ; Thu, 21 Apr 2016 07:40:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 702818F8035 for ; Thu, 21 Apr 2016 05:40:31 -0700 (PDT) X-ASG-Debug-ID: 1461242429-04cbb00fe738fd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xapD4lB12Xn859sm (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 21 Apr 2016 05:40:30 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 998E2811A7; Thu, 21 Apr 2016 12:40:29 +0000 (UTC) Received: from laptop.bfoster (vpn-54-188.rdu2.redhat.com [10.10.54.188]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3LCeRBd032013 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Thu, 21 Apr 2016 08:40:29 -0400 Date: Thu, 21 Apr 2016 08:40:22 -0400 From: Brian Foster To: Hugo Kuo Cc: xfs@oss.sgi.com, Darrell Bishop Subject: Re: [XFS] Any process to a particular XFS device hung in D state forever. Message-ID: <20160421124022.GA2633@laptop.bfoster> X-ASG-Orig-Subj: Re: [XFS] Any process to a particular XFS device hung in D state forever. References: <20160419113038.GA2649@laptop.bfoster> <20160419193435.GA2667@laptop.bfoster> <20160420112445.GA2773@laptop.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: 1461242430 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6214 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Apr 21, 2016 at 01:54:44PM +0800, Hugo Kuo wrote: > Hi Brian, > > Here's the result of xfs_repair on the same disk after rebooting. > https://gist.github.com/HugoKuo/e1d683d9653e66a80dfcfcbee4294fe8 > It's looks normal. > > We rebooted the server and no hanging process in past 12hrs. I'll keep eyes > on the server. > I know it's helpful to to trace-cmd for xfs. But there's too may xfs > operations are happening in the server. It's crazy like 100MB data per > second. I stopped the trace-cmd. As you said, we need to find out the > source of the problem. trace-cmd would be a nice option. Is there a way to > flush recored data if nothing happens in the past hours ? > I'm not sure XFS trace data will help you, at least until we've narrowed down to something that looks like an XFS problem. I wonder if multipath has any sort if tracing support..? It doesn't appear so on a quick look, but dm.c has some trace_block_bio*()/trace_block_rq*() tracepoints that might be useful enough to show whether requests are actually completing. To answer your question, 'trace-cmd record' writes to a local trace.dat file so you don't have to worry about pulling events from the kernel yourself (i.e., as with 'trace-cmd start'). Just make sure you sync or 'xfs_io -c fsync trace.dat' before you force a hard reset, if necessary. Brian > trace-cmd record -e xfs\* > > > > Regards // Hugo > > > > > On Wed, Apr 20, 2016 at 7:24 PM, Brian Foster wrote: > > > On Wed, Apr 20, 2016 at 01:49:49PM +0800, Hugo Kuo wrote: > > > Hi XFS team, > > > > > > > > > Here's the lsof output of the grouped result of any openfile happens on > > > problematic disks. The full log of xfs_repair -n is included in this gist > > > as well. The xfs_repair recommend to contact xfs mailing list in the end > > of > > > the command. > > > > > > https://gist.github.com/HugoKuo/95613d7864aa0a1343615642b3309451 > > > > > > Perhaps I should go ahead to reboot the machine and run the xfs_repair > > > again. Please find my answers inlines. > > > > > > > Yes, repair is crashing in this case. Best to try xfs_repair after > > you've rebooted and mounted/umounted the fs to replay the log. If it's > > still crashing at that point, we'll probably want a metadata image of > > the fs, if possible (though there's a good chance a newer xfsprogs has > > the problem fixed). > > > > > > > > On Wed, Apr 20, 2016 at 3:34 AM, Brian Foster > > wrote: > > > > > > > > > > > So there's definitely some traces waiting on AGF locks and whatnot, but > > > > also many traces that appear to be waiting on I/O. For example: > > > > > > > > > > Yes, those I/O waiting is the original problem of this thread. It looks > > > like the disk was locked. All these I/O waiting for same disk (a > > multipath > > > entry). > > > > > > > > > > > > > > kernel: swift-object- D 0000000000000008 0 2096 1605 0x00000000 > > > > kernel: ffff8877cc2378b8 0000000000000082 ffff8877cc237818 > > ffff887ff016eb68 > > > > kernel: ffff883fd4ab6b28 0000000000000046 ffff883fd4bd9400 > > 00000001e7ea49d0 > > > > kernel: ffff8877cc237848 ffffffff812735d1 ffff885fa2e4a5f8 > > ffff8877cc237fd8 > > > > kernel: Call Trace: > > > > kernel: [] ? __blk_run_queue+0x31/0x40 > > > > kernel: [] schedule_timeout+0x215/0x2e0 > > > > kernel: [] ? blk_peek_request+0x189/0x210 > > > > kernel: [] ? elv_queue_empty+0x33/0x40 > > > > kernel: [] ? dm_request_fn+0x240/0x340 [dm_mod] > > > > kernel: [] wait_for_common+0x123/0x180 > > > > kernel: [] ? default_wake_function+0x0/0x20 > > > > kernel: [] ? dm_unplug_all+0x36/0x50 [dm_mod] > > > > kernel: [] ? _xfs_buf_read+0x46/0x60 [xfs] > > > > kernel: [] ? xfs_trans_read_buf+0x197/0x410 [xfs] > > > > kernel: [] wait_for_completion+0x1d/0x20 > > > > kernel: [] xfs_buf_iowait+0x9b/0x100 [xfs] > > > > kernel: [] ? xfs_trans_read_buf+0x197/0x410 [xfs] > > > > kernel: [] _xfs_buf_read+0x46/0x60 [xfs] > > > > kernel: [] xfs_buf_read+0xab/0x100 [xfs] > > > > > > > > > > > > Are all of these swift processes running against independent storage, > > or > > > > one big array? Also, can you tell (e.g., with iotop) whether progress > > is > > > > being made here, albiet very slowly, or if the storage is indeed locked > > > > up..? > > > > > > > > There're 240+ swift processes in running. > > > All stuck swift processes were attempting to access same disk. I can > > > confirm it's indeed locked rather than slowly. By monitoring io via > > iotop. > > > There's 0 activity one the problematic mount point. > > > > > > > > > > In any event, given the I/O hangs, the fact that you're on an old > > distro > > > > kernel and you have things like multipath enabled, it might be > > > > worthwhile to see if you can rule out any multipath issues. > > > > > > > > > > > To upgrade the kernel for CentOS6.5 may not the option for the time being > > > but it definitely worth to give it try by picking up one of nodes for > > > testing later. As for the multipath, yes I did suspect some mystery > > problem > > > with multipath + XFS under a certain loading. But it's more like a XFS > > and > > > inode related hence I start to investigate from XFS. If there's no chance > > > to move forward in XFS, I might break the multipath and observe the > > result > > > for awhile. > > > > > > > It's hard to pinpoint something to the fs when there's a bunch of hung > > I/Os. You probably want to track down the source of those problems > > first. > > > > Brian > > > > > > > > > > > > > 'umount -l' doesn't necessarily force anything. It just lazily unmounts > > > > the fs from the namespace and cleans up the mount once all references > > > > are dropped. I suspect the fs is still mounted internally. > > > > > > > > Brian > > > > > > > > > > > Thanks // Hugo > > From jtulak@redhat.com Thu Apr 21 07:43:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 E2F757CA0 for ; Thu, 21 Apr 2016 07:43:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A3AD8304062 for ; Thu, 21 Apr 2016 05:43:42 -0700 (PDT) X-ASG-Debug-ID: 1461242621-04cbb00fe839320001-NocioJ Received: from mail-ig0-f170.google.com (mail-ig0-f170.google.com [209.85.213.170]) by cuda.sgi.com with ESMTP id vtdYr4fOQvSt7285 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 21 Apr 2016 05:43:41 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.213.170 Received: by mail-ig0-f170.google.com with SMTP id g8so80057177igr.0 for ; Thu, 21 Apr 2016 05:43:41 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to; bh=gPKfv+GNtCkOIX+Xx9YMaRYQCeGV3EIv+vdZvIqatKA=; b=knABuqUjMr0XOdpxIDuzeMBPq5yDW6LGLlHZhpOmGEOcJIJBQUlmPdaaxtUcX7hnhk qqFFbt0XW1rOoWg8fbjUQQyAGgx36PWP8RpqLmhMx0OAX5EvsghgVuEW8n3eSmPj8q6I 8PmHEH3hqcj2U6t70jHPwA0bP2xpXB5DpFurxMg/zyWb08ufeIwvXtLTC2mxyolYTqRd iRr+t7GmtGkYuCxpXdJe/dtaRDKcajBhLAOfKt3K/GZuPfiL+koDajof5ZOwQfvlPqO0 cUGYd6QhvUJUtuBOg1mOmnBKJJP/LV0xblvZSVN3ER2t8r4E+6J5MAw+pAKYbzrfvlWU EMng== X-Gm-Message-State: AOPr4FXWaCRMCBX04FWRAagwPEeTUlYZ+lZlFXsYjPWRQftlwndHR9IARFi+rsN3FjujNUmcd2QYC7f5MlQRu40+ X-Received: by 10.50.83.105 with SMTP id p9mr3314522igy.63.1461242620924; Thu, 21 Apr 2016 05:43:40 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.79 with HTTP; Thu, 21 Apr 2016 05:43:21 -0700 (PDT) In-Reply-To: <1461231593-31294-16-git-send-email-jtulak@redhat.com> References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> <1461231593-31294-16-git-send-email-jtulak@redhat.com> From: Jan Tulak Date: Thu, 21 Apr 2016 14:43:21 +0200 Message-ID: Subject: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices To: xfs-oss X-ASG-Orig-Subj: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices Content-Type: multipart/alternative; boundary=089e0116076e59f7680530fe0ffe X-Barracuda-Connect: mail-ig0-f170.google.com[209.85.213.170] X-Barracuda-Start-Time: 1461242621 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4360 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.28930 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --089e0116076e59f7680530fe0ffe Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Thu, Apr 21, 2016 at 11:39 AM, Jan Tulak wrote: > From: Dave Chinner > > THIS PATCH HAS KNOWN ISSUES - it fails xfs/206 and xfs/216 tests, as it > shrinks a file instead just not using it entirely, when -d size is used. > =E2=80=8BSo the shrinking is happening here: 3127 /* 3128 * If the data area is a file, then grow it out to its final size 3129 * so that the reads for the end of the device in the mount cod= e 3130 * will succeed. 3131 */ 3132 if (xi.disfile && ftruncate64(xi.dfd, dblocks * blocksize) < 0) {=E2=80=8B Before the patch, xi.disfile was 0 and so it didn't shrink the file to the size of the new FS. Now, what is the correct solve to this? Tests are written for the old behaviour, but this shrinking seems to be an intentional thing. It seems that the FS works ok even when this truncating is not applied, so I think that I should remove this chunk (or change it to xi.dcreate=3D1 only), and keep the old behaviour. What do you think about it, guys? Cheers, Jan --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --089e0116076e59f7680530fe0ffe Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
    On Thu, Ap= r 21, 2016 at 11:39 AM, Jan Tulak <jtulak@redhat.com> wrote:
    From: Dave Chinner <dchinner@redhat.com>

    THIS PATCH HAS KNOWN ISSUES - it fails xfs/206 and xfs/216 tests, as it
    shrinks a file instead just not using it entirely, when -d size is used.

    =E2=80=8BSo the shrinki= ng is happening here:
    3127 =C2=A0 =C2=A0 =C2=A0 =C2=A0/*
    3128 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * If the data = area is a file, then grow it out to its final size
    3129 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * so = that the reads for the end of the device in the mount code
    3130 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 * will succeed.
    3131 =C2=A0 =C2=A0 =C2=A0 =C2=A0 */
    3132 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (xi.disfile && ftruncate6= 4(xi.dfd, dblocks * blocksize) < 0) {=E2=80=8B
    =C2=A0
    <= div>
    Before the patch, xi.disfile was 0 and so it didn'= ;t shrink the file to the size of the new FS.
    Now, what is the corr= ect solve to this? Tests are written for the old behaviour, but this shrink= ing seems to be an intentional thing.
    It seems that the FS works ok= even when this truncating is not applied, so I think that I should remove = this chunk (or change it to xi.dcreate=3D1 only), and keep the old behaviou= r.

    What do you think about it, guys?

    Cheers,
    Jan



    --
    --089e0116076e59f7680530fe0ffe-- From eguan@redhat.com Thu Apr 21 08:08:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 722F37CA0 for ; Thu, 21 Apr 2016 08:08:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 41B4A304039 for ; Thu, 21 Apr 2016 06:08:15 -0700 (PDT) X-ASG-Debug-ID: 1461244093-04cbb00fe83a710001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id B3EObM61nz6Wm8vP (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 21 Apr 2016 06:08:14 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3F70937E72 for ; Thu, 21 Apr 2016 13:08:13 +0000 (UTC) Received: from localhost (dhcp12-159.nay.redhat.com [10.66.12.159] (may be forged)) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3LD8BmA021586; Thu, 21 Apr 2016 09:08:12 -0400 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH] xfsdump: fix race condition between lseek() and read()/write() Date: Thu, 21 Apr 2016 21:06:56 +0800 X-ASG-Orig-Subj: [PATCH] xfsdump: fix race condition between lseek() and read()/write() Message-Id: <1461244016-7373-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461244093 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5871 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 There's a race condition in the [get|put]_invtrecord() routines, because a lseek() followed by a read()/write() is not atmoic, the file offset might be changed before read()/write(). xfs/302 catches this failure as: xfsdump: drive 1: INV : Unknown version 0 - Expected version 1 xfsdump: inv_core.c:66: get_counters: Assertion `((invt_counter_t *)(*cntpp))->ic_vernum == (inv_version_t) 1' failed. And it can be reproduced by running multi-stream dump in a tight loop mount /dev/ /mnt/xfs mkdir /mnt/xfs/dumpdir # populate dumpdir here while xfsdump -M l1 -M l2 -f d1 -f d2 -L ses /mnt/xfs -s dumpdir; do : done Fix it by replacing the "lseek(); read()/write()" sequence by pread()/pwrite(), which make the seek and I/O an atomic operation. Also convert and remove all *_SEEKCUR routines to "SEEK_SET" variants, because they depend on the maintenance of current file offset, but pread()/pwrite() don't change file offset. Signed-off-by: Eryu Guan --- Tested via the reproducer and xfstests "-g dump" run, with both v4 and v5 XFS. I'm not sure if this is the right fix, perhaps what should be fixed is the "INVLOCK()", which is now implemented by flock(2), and doesn't work in multi-thread env, if what it's meant to protect is concurrent accesses from different threads, not processes. If so, it seems to me that making INVLOCK() a pthread rw lock could fix the race condition as well. But the INVLOCK calls are almost everywhere, I didn't find a simple way to try it. common/inventory.c | 4 ++-- inventory/inv_api.c | 5 ++--- inventory/inv_core.c | 24 ++++-------------------- inventory/inv_idx.c | 4 ++-- inventory/inv_priv.h | 9 --------- 5 files changed, 10 insertions(+), 36 deletions(-) diff --git a/common/inventory.c b/common/inventory.c index d1b810c..0e9c256 100644 --- a/common/inventory.c +++ b/common/inventory.c @@ -471,8 +471,8 @@ inv_stream_close( } if (dowrite) { - rval = PUT_REC_NOLOCK_SEEKCUR( fd, &strm, sizeof( invt_stream_t ), - (off64_t) -(sizeof( invt_stream_t )) ); + rval = PUT_REC_NOLOCK(fd, &strm, sizeof(invt_stream_t), + tok->md_stream_off); } end: INVLOCK( fd, LOCK_UN ); diff --git a/inventory/inv_api.c b/inventory/inv_api.c index acca40b..46fdde8 100644 --- a/inventory/inv_api.c +++ b/inventory/inv_api.c @@ -409,9 +409,8 @@ inv_stream_close( } if (dowrite) { - rval = PUT_REC_NOLOCK_SEEKCUR( fd, &strm, - sizeof( invt_stream_t ), - -(off64_t)(sizeof( invt_stream_t )) ); + rval = PUT_REC_NOLOCK(fd, &strm, sizeof(invt_stream_t), + tok->md_stream_off); } } diff --git a/inventory/inv_core.c b/inventory/inv_core.c index a17c2c9..42d0ac4 100644 --- a/inventory/inv_core.c +++ b/inventory/inv_core.c @@ -121,19 +121,10 @@ get_invtrecord( int fd, void *buf, size_t bufsz, off64_t off, if ( dolock ) INVLOCK( fd, LOCK_SH ); - if ( lseek( fd, (off_t)off, whence ) < 0 ) { - INV_PERROR( _("Error in reading inventory record " - "(lseek failed): ") ); - if ( dolock ) - INVLOCK( fd, LOCK_UN ); - return -1; - } - - nread = read( fd, buf, bufsz ); - + nread = pread(fd, buf, bufsz, (off_t)off); if ( nread != (int) bufsz ) { INV_PERROR( _("Error in reading inventory record :") ); - if ( dolock ) + if ( dolock ) INVLOCK( fd, LOCK_UN ); return -1; } @@ -162,15 +153,8 @@ put_invtrecord( int fd, void *buf, size_t bufsz, off64_t off, if ( dolock ) INVLOCK( fd, LOCK_EX ); - if ( lseek( fd, (off_t)off, whence ) < 0 ) { - INV_PERROR( _("Error in writing inventory record " - "(lseek failed): ") ); - if ( dolock ) - INVLOCK( fd, LOCK_UN ); - return -1; - } - - if (( nwritten = write( fd, buf, bufsz ) ) != (int) bufsz ) { + nwritten = pwrite(fd, buf, bufsz, (off_t)off); + if (nwritten != (int) bufsz ) { INV_PERROR( _("Error in writing inventory record :") ); if ( dolock ) INVLOCK( fd, LOCK_UN ); diff --git a/inventory/inv_idx.c b/inventory/inv_idx.c index 95529e8..cd9b9cb 100644 --- a/inventory/inv_idx.c +++ b/inventory/inv_idx.c @@ -341,8 +341,8 @@ idx_put_sesstime( inv_sestoken_t tok, bool_t whichtime) ent.ie_timeperiod.tp_start, ent.ie_timeperiod.tp_end ); #endif - rval = PUT_REC_NOLOCK_SEEKCUR( fd, &ent, sizeof( invt_entry_t ), - -(off64_t)(sizeof( invt_entry_t ))); + rval = PUT_REC_NOLOCK(fd, &ent, sizeof(invt_entry_t), + tok->sd_invtok->d_invindex_off); #ifdef INVT_DEBUG { diff --git a/inventory/inv_priv.h b/inventory/inv_priv.h index 1690271..cd1b527 100644 --- a/inventory/inv_priv.h +++ b/inventory/inv_priv.h @@ -303,9 +303,6 @@ typedef bool_t (*search_callback_t) (int, invt_seshdr_t *, void *, void *); #define GET_REC_NOLOCK( fd, buf, sz, off ) \ get_invtrecord( fd, buf, sz, off, SEEK_SET, INVT_DONTLOCK ) -#define GET_REC_SEEKCUR( fd, buf, sz, off ) \ - get_invtrecord( fd, buf, sz, off, SEEK_CUR, INVT_DOLOCK ) - #define GET_ALLHDRS_N_CNTS( fd, h, c, hsz, csz ) \ get_headerinfo( fd, h, c, hsz, csz, INVT_DOLOCK ) @@ -318,12 +315,6 @@ typedef bool_t (*search_callback_t) (int, invt_seshdr_t *, void *, void *); #define PUT_REC_NOLOCK( fd, buf, sz, off ) \ put_invtrecord( fd, buf, sz, off, SEEK_SET, INVT_DONTLOCK ) -#define PUT_REC_SEEKCUR( fd, buf, sz, off ) \ - put_invtrecord( fd, buf, sz, off, SEEK_CUR, INVT_DOLOCK ) - -#define PUT_REC_NOLOCK_SEEKCUR( fd, buf, sz, off ) \ - put_invtrecord( fd, buf, sz, off, SEEK_CUR, INVT_DONTLOCK ) - #define GET_COUNTERS( fd, cnt ) get_counters( fd, (void **)(cnt), \ sizeof(invt_counter_t) ) -- 2.5.5 From prvs=912f47dbc=Stephane.Larose@ibis.ulaval.ca Thu Apr 21 09:42:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DD5787CA0 for ; Thu, 21 Apr 2016 09:42:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 518A1AC001 for ; Thu, 21 Apr 2016 07:42:50 -0700 (PDT) X-ASG-Debug-ID: 1461249767-04cbb00fe840d60001-NocioJ Received: from exch-spam02.ulaval.ca (exch-spam02.ulaval.ca [132.203.244.24]) by cuda.sgi.com with ESMTP id t3LqzWVwi3d5ovlG (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 21 Apr 2016 07:42:47 -0700 (PDT) X-Barracuda-Envelope-From: prvs=912f47dbc=Stephane.Larose@ibis.ulaval.ca X-Barracuda-Effective-Source-IP: exch-spam02.ulaval.ca[132.203.244.24] X-Barracuda-Apparent-Source-IP: 132.203.244.24 Received: from ul-exc-pr-edg01.ulaval.ca ([132.203.244.26]) by exch-spam02.ulaval.ca with ESMTP/TLS/AES256-SHA; 21 Apr 2016 10:42:48 -0400 Received: from ul-exc-pr-mbx15.ulaval.ca (10.40.67.115) by UL-EXC-PR-EDG01.ulaval.ca (132.203.244.26) with Microsoft SMTP Server (TLS) id 15.0.1130.7; Thu, 21 Apr 2016 10:42:44 -0400 Received: from UL-EXC-PR-MBX11.ulaval.ca (10.40.67.111) by ul-exc-pr-mbx15.ulaval.ca (10.40.67.115) with Microsoft SMTP Server (TLS) id 15.0.1044.25; Thu, 21 Apr 2016 10:42:46 -0400 Received: from UL-EXC-PR-MBX11.ulaval.ca ([fe80::a088:6c2b:99d1:cec0]) by ul-exc-pr-mbx11.ulaval.ca ([fe80::a088:6c2b:99d1:cec0%25]) with mapi id 15.00.1044.021; Thu, 21 Apr 2016 10:42:46 -0400 From: =?utf-8?B?U3TDqXBoYW5lIExhcm9zZQ==?= To: "xfs@oss.sgi.com" Subject: RE: xfs_repair couldn't verify primary superblock Thread-Topic: xfs_repair couldn't verify primary superblock X-ASG-Orig-Subj: RE: xfs_repair couldn't verify primary superblock Thread-Index: AdGbK6ay8c20JfnqTlycBWFFEgycSwANv5uAAB16EtA= Date: Thu, 21 Apr 2016 14:42:45 +0000 Message-ID: <7ce740a1888c4bb28ce3c30fcedbe703@ul-exc-pr-mbx11.ulaval.ca> References: <5717E2EF.1080902@sandeen.net> In-Reply-To: <5717E2EF.1080902@sandeen.net> Accept-Language: fr-CA, en-US Content-Language: fr-FR X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-exchange-transport-fromentityheader: Hosted x-originating-ip: [132.203.160.225] Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-Barracuda-Connect: exch-spam02.ulaval.ca[132.203.244.24] X-Barracuda-Start-Time: 1461249767 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2968 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.28932 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... SGkgRXJpYywNCg0KTm90aGluZyBtb3JlIGludGVyZXN0aW5nLiBGcm9tIHRoZSBsb2c6DQoNCjIw MTYtMDQtMDRUMTQ6NDg6NDguNzM1NzM4LTA0OjAwIG1hbml0b3Uga2VybmVsOiBbMjcxMjExLjU0 ODg3OF0gWEZTIChkbS0yNCk6IE1vdW50aW5nIFY0IEZpbGVzeXN0ZW0NCjIwMTYtMDQtMDRUMTQ6 NDg6NDguODgyNzM4LTA0OjAwIG1hbml0b3Uga2VybmVsOiBbMjcxMjExLjY5NDI0Ml0gWEZTIChk bS0yNCk6IEVuZGluZyBjbGVhbiBtb3VudA0KDQpUaGVuIG5vIG1vcmUgbG9ncyBhYm91dCBkbS0y NC4NCg0KQWxzbyBubyBlcnJvcnMgZnJvbSB0aGUgdW5kZXJseWluZyBzdG9yYWdlICh2ZXJpZmll ZCBpbiBTQU50cmljaXR5KSB3aGljaCBpcyBhbiBJUzUwMDAuIFRoZSBmaWxlc3lzdGVtIHdhcyBu ZXcsIHRoZSBmaXJzdCBtb3VudCB3YXMgb24gMjAxNi0wNC0wNC4NCg0KbWFuaXRvdTp+ICMgYmxr aWQgL2Rldi9kbS0yNA0KL2Rldi9kbS0yNDogVVVJRD0iMWRhMjJhZTItYTU3Mi00ZGI3LWIxNzct YjkwMDIxYTIwODYzIiBUWVBFPSJ4ZnMiDQoNClRoYW5rIHlvdSBmb3IgeW91ciBoZWxwLA0KDQpT dMOpcGhhbmUNCg0KLS0tLS1NZXNzYWdlIGQnb3JpZ2luZS0tLS0tDQpEZcKgOiBFcmljIFNhbmRl ZW4gW21haWx0bzpzYW5kZWVuQHNhbmRlZW4ubmV0XSANCkVudm95w6nCoDogMjAgYXZyaWwgMjAx NiAxNjoxNA0Kw4DCoDogU3TDqXBoYW5lIExhcm9zZSA8U3RlcGhhbmUuTGFyb3NlQGliaXMudWxh dmFsLmNhPg0KT2JqZXTCoDogUmU6IHhmc19yZXBhaXIgY291bGRuJ3QgdmVyaWZ5IHByaW1hcnkg c3VwZXJibG9jaw0KDQpPbiA0LzIwLzE2IDE6NTAgUE0sIFN0w6lwaGFuZSBMYXJvc2Ugd3JvdGU6 DQo+IEhlbGxvLA0KPiANCj4gIA0KPiANCj4gV2hlbiBJIHRyeSB0byBtb3VudCBhIGNsZWFueSB1 bm1vdW50ZWQgWEZTIGZpbGVzeXN0ZW0sIEkgZ2V0IHRob3NlIGVycm9ycyBpbiB0aGUgbG9nIDoN Cj4gDQo+IA0KPiBbMTY1MDg1Ni4xMjEyMjldIFhGUyAoZG0tMjQpOiBNb3VudGluZyBWNCBGaWxl c3lzdGVtIFsxNjUwODU2LjEzNTQ1NV0gDQo+IFhGUyAoZG0tMjQpOiBMb2cgaW5jb25zaXN0ZW50 IG9yIG5vdCBhIGxvZyAobGFzdD09MCwgZmlyc3QhPTEpIA0KPiBbMTY1MDg1Ni4xMzU0NjFdIFhG UyAoZG0tMjQpOiBlbXB0eSBsb2cgY2hlY2sgZmFpbGVkIFsxNjUwODU2LjEzNTQ2M10gDQo+IFhG UyAoZG0tMjQpOiBsb2cgbW91bnQvcmVjb3ZlcnkgZmFpbGVkOiBlcnJvciAyMiBbMTY1MDg1Ni4x MzU0OTVdIFhGUyANCj4gKGRtLTI0KTogbG9nIG1vdW50IGZhaWxlZA0KDQpZb3UgY291bGQgbWF5 YmUgdXNlIHhmc19sb2dkdW1wIHRvIHNlZSB3aGF0J3MgdGhlcmUsIGJ1dC4uLg0KDQo+IEkgaGF2 ZSB0cmllZCB4ZnNfcmVwYWlyIGJ1dOKApg0KPiANCj4gbWFuaXRvdTp+ICMgeGZzX3JlcGFpciAv ZGV2L2RtLTI0DQo+IA0KPiBQaGFzZSAxIC0gZmluZCBhbmQgdmVyaWZ5IHN1cGVyYmxvY2suLi4N Cj4gY291bGRuJ3QgdmVyaWZ5IHByaW1hcnkgc3VwZXJibG9jayAtIG5vdCBlbm91Z2ggc2Vjb25k YXJ5IHN1cGVyYmxvY2tzIHdpdGggbWF0Y2hpbmcgZ2VvbWV0cnkgISEhDQo+IA0KPiBhdHRlbXB0 aW5nIHRvIGZpbmQgc2Vjb25kYXJ5IHN1cGVyYmxvY2suLi4NCj4gLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KDQo+IEFmdGVyIGEgbG90IG9mIGRvdHMsIHhmc19yZXBh aXIgY2Fu4oCZdCBmaW5kIHNlY29uZGFyeSBzdXBlcmJsb2Nrcy4NCj4gDQo+IFRoaXMgaXMgd2hl cmUgbXkga25vd2xlZGdlIG9mIFhGUyBmaWxlc3lzdGVtIHN0b3BzLiBMb29raW5nIGF0IHRoZSBz dXBlcmJsb2NrIGluZm9ybWF0aW9uLCBJIGhhdmUgYSBmZWVsaW5nIHRoYXQgdGhlIHByaW1hcnkg c3VwZXJibG9jayBpcyBmaW5lIGJ1dCBub3QgdGhlIHNlY29uZGFyeSBzdXBlcmJsb2NrcyAoc3Ry YW5nZSBibG9ja3NpemUgYW5kIGRibG9ja3MgbnVtYmVycykuIElzIHRoZXJlIGFueSB3YXkgdG8g Y29weSB0aGUgcHJpbWFyeSBzdXBlcmJsb2NrIHRvIHRoZSBzZWNvbmRhcnkgc3VwZXJibG9ja3M/ IE1heWJlIHRoaXMgaXMgbm90IGEgZ29vZCBpZGVhPw0KPiANCj4gVGhhbmsgeW91IGZvciBhbnkg aGVscCENCj4gDQoNCi4uLiB0aGUgc3RhdGVkIGxvY2F0aW9ucyBvZiB0aGUgYmFja3VwIHN1cGVy cyBjZXJ0YWlubHkgZG9uJ3QgY29udGFpbiBnb29kIGRhdGE6DQoNCj4geGZzX2RiPiBzYiAxDQo+ IHhmc19kYj4gcA0KPiBtYWdpY251bSA9IDB4ZjZiODlmYmYNCj4gYmxvY2tzaXplID0gMTQ4Mzkz MjEyOQ0KPiBkYmxvY2tzID0gMTU2OTQwMDk5MzMxMDE3MjIxMzcNCj4gcmJsb2NrcyA9IDExMDY4 NjI2NzU2MDE2OTAyODExDQo+IHJleHRlbnRzID0gMTU5MzA2MzYyMjE0ODMwMDEyOA0KLi4uDQo+ IHhmc19kYj4gc2IgMg0KPiB4ZnNfZGI+IHANCj4gbWFnaWNudW0gPSAweDQxNDc0MzQxDQo+IGJs b2Nrc2l6ZSA9IDExOTU1OTA0NzENCj4gZGJsb2NrcyA9IDQ4NDc5MjE5NTEwODUyNTM3MTYNCj4g cmJsb2NrcyA9IDQ4NDY3ODkzOTgzMDg4NjQ4MzUNCj4gcmV4dGVudHMgPSA0NzAyMTMyMTI1Mjk2 NzA3NDEyDQouLi4NCg0Kd2hpY2ggaXMgd2h5IGl0IGNvdWxkbid0IGZpbmQgYW55IHZhbGlkL21h dGNoaW5nIGJhY2t1cHMuICBUaGUgc3RhdGVkIEFHIHNpemUgZG9lcyBsb29rIGNvcnJlY3QsIHRo b3VnaCwgZm9yIHRoZSBvdmVyYWxsIHNpemUgb2YgdGhlIGZpbGVzeXN0ZW0gYXMgc3RhdGVkIGlu IFNCIDAuDQoNCklzIHRoZXJlIG1vcmUgdG8gdGhpcyBzdG9yeT8gIERpZCBzb21ldGhpbmcgImlu dGVyZXN0aW5nIiBoYXBwZW4gd2l0aCB0aGUgdW5kZXJseWluZyBzdG9yYWdlPyAgT3Igd2l0aCB0 aGUgZmlsZXN5c3RlbSBwcmlvciB0byB0aGlzIHByb2JsZW0/DQoNCmRvZXMgImJsa2lkIC9kZXYv ZG0tMjQiIHNheSBhbnl0aGluZyBvdGhlciB0aGFuICJ4ZnMgZmlsZXN5c3RlbT8iDQoNCi1Fcmlj DQoNCg== From pkuminov@bk.ru Thu Apr 21 10:42:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 771917CA0 for ; Thu, 21 Apr 2016 10:42:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D0B66AC009 for ; Thu, 21 Apr 2016 08:42:29 -0700 (PDT) X-ASG-Debug-ID: 1461253343-04cb6c09a05d520001-NocioJ Received: from mxs.bk.ru ([185.26.64.52]) by cuda.sgi.com with ESMTP id 2RXkJ95SwOuD1wig for ; Thu, 21 Apr 2016 08:42:24 -0700 (PDT) X-Barracuda-Envelope-From: pkuminov@bk.ru X-Barracuda-Effective-Source-IP: UNKNOWN[185.26.64.52] X-Barracuda-Apparent-Source-IP: 185.26.64.52 MIME-Version: 1.0 Date: Thu, 21 Apr 2016 18:42:23 +0300 Message-ID: <015645257.20160421184223@WDYXIRURRY> Subject: =?utf-8?B?0J7QsdGD0YfQtdC90LjQtSAyNzUt0KTQlyDQuCAxNTkt0KTQlw==?= From: "=?utf-8?B?0JjQt9C80LXQvdC10L3QuNGPICLQniDQs9C+0YHRg9C00LDRgNGB0YLQstC10L3QvdC+0Lwg0L7QsdC+0YDQvtC90L3QvtC8INC30LDQutCw0LfQtSI=?=" X-ASG-Orig-Subj: =?utf-8?B?0J7QsdGD0YfQtdC90LjQtSAyNzUt0KTQlyDQuCAxNTkt0KTQlw==?= To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=----------4C1FAA71051EB03D X-Barracuda-Connect: UNKNOWN[185.26.64.52] X-Barracuda-Start-Time: 1461253343 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 18918 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28933 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 ------------4C1FAA71051EB03D Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: base64 ICAgMjctMjgg0LDQv9GA0LXQu9GPDQogICDQsy4g0JzQvtGB0LrQstCwDQoNCiAgINCj0YfQtdCx 0L3Ri9C5INGG0LXQvdGC0YAg0L/RgNC40LPQu9Cw0YjQsNC10YIg0L3QsCDQvtCx0YPRh9C10L3Q uNC1INC/0L4g0YLQtdC80LU6DQoNCg0K0JPQvtGB0L7QsdC+0YDQvtC90LfQsNC60LDQtzog0L7R gNCz0LDQvdC40LfQsNGG0LjRjyDQtNC10Y/RgtC10LvRjNC90L7RgdGC0Lgg0LIg0YHQvtC+0YLQ stC10YLRgdGC0LLQuNC4INGBINC90L7QstGL0LzQuA0K0YLRgNC10LHQvtCy0LDQvdC40Y/QvNC4 IOKEliAyNzUt0KTQlyDQv9C+INC60L7QvdGC0YDQvtC70Y4g0LfQsCDRhtC10LvQtdCy0YvQvCDQ uNGB0L/QvtC70YzQt9C+0LLQsNC90LjQtdC8INGB0YDQtdC00YHRgtCyDQoNCirQkNGA0YLQuNC6 0YPQuzoqIDM3NQ0KDQrQktGA0LXQvNGPINC/0YDQvtCy0LXQtNC10L3QuNGPINC30LDQvdGP0YLQ uNGPOiBjIDEwOjAwINC00L4gMTc6MzANCg0KKtCQ0LTRgNC10YEg0L/RgNC+0LLQtdC00LXQvdC4 0Y8g0LfQsNC90Y/RgtC40Y86KiDRg9C7LiDQkdCw0YPQvNCw0L3RgdC60LDRjywg0LQuNiwg0YHR gtGALjIsINCRLtCmLiAi0JLQuNC60YLQvtGA0LjRjyDQn9C70LDQt9CwDQoiLg0KDQoNCirQktGB 0Y8g0L/QvtC00YDQvtCx0L3QsNGPINC40L3RhNC+0YDQvNCw0YbQuNGPINC/0L4g0L7QsdGD0YfQ tdC90LjRjiDQuCDRgNC10LPQuNGB0YLRgNCw0YbQuNGPINC/0L4g0L3QvtC80LXRgNGDOiAqDQo4 INC60L7QtCDQs9C+0YDQvtC00LAgKDQ5NSkg0YLQtdC70LXRhNC+0L0gNDExLTkwLTk4ICjQvNC9 0L7Qs9C+0LrQsNC90LDQu9GM0L3Ri9C5KQ0KDQoo0L/QvtC20LDQu9GD0LnRgdGC0LAg0L3QtSDQ vtGC0LLQtdGH0LDQudGC0LUg0L3QsCDQvtCx0YDQsNGC0L3Ri9C5INCw0LTRgNC10YEg0Y3Quy7Q v9C+0YfRgtGLKQ0KDQoNCg0KKiDQkiDQvtCx0YPRh9C10L3QuNC1INC/0YDQuNC90LjQvNCw0Y7R giDRg9GH0LDRgdGC0LjQtSDRgdC/0LXRhtC40LDQu9C40YHRgtGLINCj0L/RgNCw0LLQu9C10L3Q uNGPINC60L7QvdGC0YDQvtC70Y8NCtCz0L7RgdGD0LTQsNGA0YHRgtCy0LXQvdC90L7Qs9C+ICDQ vtCx0L7RgNC+0L3QvdC+0LPQviDQt9Cw0LrQsNC30LAg0KbQtdC90YLRgNCw0LvRjNC90L7Qs9C+ INCw0L/Qv9Cw0YDQsNGC0LAg0KTQkNChINCg0L7RgdGB0LjQuCwNCtC/0YDQtdC00YHRgtCw0LLQ uNGC0LXQu9C4INGN0LrRgdC/0LXRgNGC0L3Ri9GFICDQs9GA0YPQv9C/INCf0YDQsNCy0LjRgtC1 0LvRjNGB0YLQstCwINCg0KQqDQoNCiog0JfQsNC90Y/RgtC40LUg0LTQu9GPOiog0YDRg9C60L7Q stC+0LTQuNGC0LXQu9C10Lkg0Lgg0YHQv9C10YbQuNCw0LvQuNGB0YLQvtCyICjQs9C70LDQstC9 0YvRhSDQsdGD0YXQs9Cw0LvRgtC10YDQvtCyLA0K0Y3QutC+0L3QvtC80LjRgdGC0L7Qsiwg0Y7R gNC40YHRgtC+0LIpDQog0L/RgNC10LTQv9GA0LjRj9GC0LjQuSDQuCDQuNC90YvRhSDRjtGA0LjQ tNC40YfQtdGB0LrQuNGFINC70LjRhiwg0YPRh9Cw0YHRgtCy0YPRjtGJ0LjRhSDQsiDQuNGB0L/Q vtC70L3QtdC90LjQuA0K0LPQvtGB0YPQtNCw0YDRgdGC0LLQtdC90L3QvtCz0L4g0L7QsdC+0YDQ vtC90L3QvtCz0L4NCiDQt9Cw0LrQsNC30LAsINGB0L/QtdGG0LjQsNC70LjRgdGC0L7QsiDQv9C+ INCT0J7QlyDQv9GA0LXQtNC/0YDQuNGP0YLQuNC5INC+0LHQvtGA0L7QvdC90L4t0L/RgNC+0LzR i9GI0LvQtdC90L3QvtCz0L4g0LrQvtC80L/Qu9C10LrRgdCwLA0K0LfQsNC60LDQt9GH0LjQutC+ 0LIsDQog0YPRh9Cw0YHRgtC90LjQutC+0LIg0Lgg0LjRgdC/0L7Qu9C90LjRgtC10LvQtdC5INCT 0J7Qly4NCg0KKiDQptC10LvRjCDQvtCx0YPRh9C10L3QuNGPOiog0YDQsNC30YrRj9GB0L3QuNGC 0Ywg0L/RgNC40L3Rj9GC0YvQtSDQvdC+0LLQsNGG0LjQuCwg0LTQsNGC0Ywg0L/RgNCw0LrRgtC4 0YfQtdGB0LrQuNC1DQrRgNC10LrQvtC80LXQvdC00LDRhtC40Lgg0LLQvg0KINCy0LfQsNC40LzQ vtC00LXQudGB0YLQstC40Lgg0L/RgNC10LTQv9GA0LjRj9GC0LjQuSDRgSDRg9C/0L7Qu9C90L7Q vNC+0YfQtdC90L3Ri9C80Lgg0LHQsNC90LrQsNC80LgsINC30LDQutCw0LfRh9C40LrQsNC80Lgg 0LgNCtC60L7QvdGC0YDQvtC70YzQvdGL0LzQuA0KINC+0YDQs9Cw0L3QsNC80LguDQoNCiogICDQ kiDQv9GA0L7Qs9GA0LDQvNC80LU6Kg0KDQogICAgICogMS4qINCY0LfQvNC10L3QtdC90LjRjyDQ siDQt9Cw0LrQvtC90L7QtNCw0YLQtdC70YzRgdGC0LLQtSDQviDQs9C+0YHRg9C00LDRgNGB0YLQ stC10L3QvdC+0Lwg0L7QsdC+0YDQvtC90L3QvtC8INC30LDQutCw0LfQtQ0KKNCT0J7QlyksINCa 0L7QtNC10LrRgdC1INC+0LENCiDQsNC00LzQuNC90LjRgdGC0YDQsNGC0LjQstC90YvRhSDQv9GA 0LDQstC+0L3QsNGA0YPRiNC10L3QuNGP0YUg0LIg0KDQpCDQuCDRgi7QtC4NCg0KDQoNCirQndC+ 0YDQvNGLINC4INGC0YDQtdCx0L7QstCw0L3QuNGPINCk0Jcg4oSWIDI3NS3QpNCXINC+0YIgMjkg 0LTQtdC60LDQsdGA0Y8gMjAxMiDQsy4gItCeINCT0J7QlyI7INCd0L7QstC+0LUg0LINCtGB0LjR gdGC0LXQvNC1INCT0J7QlyDQsiDRgdC+0L7RgtCy0LXRgtGB0YLQstC40Lgg0YEg0L/QvtC70L7Q ttC10L3QuNGP0LzQuCDQpNCXIOKEliAxNTkt0KTQlyDQvtGCIDI5INC40Y7QvdGPIDIwMTUg0LMu ICAi0J4NCtCy0L3QtdGB0LXQvdC40Lgg0LjQt9C80LXQvdC10L3QuNC5INCyINCk0JcgItCeINCT 0J7QlyIg0Lgg0L7RgtC00LXQu9GM0L3Ri9C1INC30LDQutC+0L3QvtC00LDRgtC10LvRjNC90YvQ tSDQsNC60YLRiyDQoNCkIi4qDQoNCiAqMi4qINCe0YHQvdC+0LLQvdGL0LUg0L/RgNCw0LLQsCDQ uCDQvtCx0Y/Qt9Cw0L3QvdC+0YHRgtC4INCz0L7RgdGD0LTQsNGA0YHRgtCy0LXQvdC90L7Qs9C+ INC30LDQutCw0LfRh9C40LrQsCwg0LPQvtC70L7QstC90L7Qs9C+DQrQuNGB0L/QvtC70L3QuNGC 0LXQu9GPLA0KINC40YHQv9C+0LvQvdC40YLQtdC70Y8uDQoNCiAqMy4qINCd0L7QstGL0LUg0L7R gdC90L7QstC90YvQtSDQv9GA0LDQstCwINC4INC+0LHRj9C30LDQvdC90L7RgdGC0Lgg0LPQvtC7 0L7QstC90L7Qs9C+INC40YHQv9C+0LvQvdC40YLQtdC70Y8uINCa0L7QvtC/0LXRgNCw0YbQuNGP DQrQs9C+0LvQvtCy0L3QvtCz0L4NCiDQuNGB0L/QvtC70L3QuNGC0LXQu9GPLg0KDQogKjQuKiDQ ndC+0LLRi9C1INC+0YHQvdC+0LLQvdGL0LUg0L/RgNCw0LLQsCDQuCDQvtCx0Y/Qt9Cw0L3QvdC+ 0YHRgtC4INC40YHQv9C+0LvQvdC40YLQtdC70Y8uDQoNCiAqNS4qINCk0L7RgNC80LjRgNC+0LLQ sNC90LjQtSDQutC+0L7Qv9C10YDQsNGG0LjQuCDQs9C+0LvQvtCy0L3Ri9C80Lgg0LjRgdC/0L7Q u9C90LjRgtC10LvRj9C80Lgg0Lgg0LjRgdC/0L7Qu9C90LjRgtC10LvRj9C80Lgg0JPQntCXLg0K 0KPRgdC70L7QstC40Y8NCiDQt9Cw0LrQu9GO0YfQsNC10LzRi9GFINC60L7QvdGC0YDQsNC60YLQ vtCyINC/0L4g0JPQntCXLg0KDQogKjYuKiDQntCx0LXRgdC/0LXRh9C10L3QuNC1INC/0L7RgdGC 0LDQstC+0Log0L/RgNC+0LTRg9C60YbQuNC4LCDRgNCw0LfQvNC10YnQtdC90LjRjyDQt9Cw0LrQ sNC30L7QsiDQvdCwINC/0L7RgdGC0LDQstC60LgNCtC/0YDQvtC00YPQutGG0LjQuC4NCg0KICo3 Liog0JfQsNC60LvRjtGH0LXQvdC40LUg0LPQvtGB0YPQtNCw0YDRgdGC0LLQtdC90L3QvtCz0L4g 0LrQvtC90YLRgNCw0LrRgtCwLiDQktCy0LXQtNC10L3QuNC1INC40LTQtdC90YLQuNGE0LjQutCw 0YLQvtGA0LANCtCz0L7RgdGD0LTQsNGA0YHRgtCy0LXQvdC90L7Qs9C+DQog0LrQvtC90YLRgNCw 0LrRgtCwLg0KDQogKjguKiDQmtC+0L3RgtGA0L7Qu9GMINC30LAg0L7QsdC10YHQv9C10YfQtdC9 0LjQtdC8INC60L7QvdGC0YDQsNC60YLQsCDQuCDQv9C+0YHRgtCw0LLQvtC6INC/0YDQvtC00YPQ utGG0LjQuCDQuNGB0L/QvtC70L3QuNGC0LXQu9GP0LzQuA0K0Lgv0LjQu9C4INCz0L7Qu9C+0LLQ vdGL0LwNCiDQuNGB0L/QvtC70L3QuNGC0LXQu9C10LwuDQoNCiAqOS4qINCe0YLQutCw0Lcg0YPR h9Cw0YHRgtC90LjQutC+0LIg0LrQvtC+0L/QtdGA0LDRhtC40Lgg0L7RgiDQt9Cw0LrQu9GO0YfQ tdC90LjRjyDQutC+0L3RgtGA0LDQutGC0L7QsiDQsiDRgNCw0LzQutCw0YUNCtGB0L7Qv9GA0L7Q stC+0LbQtNCw0LXQvNC+0Lkg0YHQtNC10LvQutC4Lg0KINCQ0LvQs9C+0YDQuNGC0Lwg0YDQsNCx 0L7RgtGLINC/0L4g0YPRgNC10LPRg9C70LjRgNC+0LLQsNC90LjRjiDRgNCw0LfQvdC+0LPQu9Cw 0YHQuNC5OyDQoNC10LbQuNC8INC40YHQv9C+0LvRjNC30L7QstCw0L3QuNGPDQrQvtGC0LTQtdC7 0YzQvdC+0LPQviDRgdGH0LXRgtCwINC4DQog0LfQsNC/0YDQtdGC0Ysg0L3QsCDRgdC+0LLQtdGA 0YjQtdC90LjQtSDQvtC/0LXRgNCw0YbQuNC5OyDQmtGA0LjRgtC10YDQuNC4INC+0L/QtdGA0LDR htC40LksINC/0YDQuNC+0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdC80YvRhSDQsg0K0YHQvtC+0YLQ stC10YLRgdGC0LLQuNC4INGBDQog0KTQtdC00LXRgNCw0LvRjNC90YvQvCDQt9Cw0LrQvtC90L7Q vCDCq9CeINCz0L7RgdGD0LTQsNGA0YHRgtCy0LXQvdC90L7QvCDQvtCx0L7RgNC+0L3QvdC+0Lwg 0LfQsNC60LDQt9C1wrsg0Lgg0YIu0LQuDQoNCiAqMTAuKiDQo9GB0LvQvtCy0LjRjyDQs9C+0YHR g9C00LDRgNGB0YLQstC10L3QvdGL0YUg0LrQvtC90YLRgNCw0LrRgtC+0LIsINGD0YHRgtCw0L3Q sNCy0LvQuNCy0LDRjtGJ0LjQtSDRgNCw0LfQvNC10YAg0L/RgNC40LHRi9C70Lgg0LgNCijQuNC7 0LgpINC/0L7RgNGP0LTQvtC6DQog0LrQvtC80L/QtdC90YHQsNGG0LjQuCDQv9C+0L3QtdGB0LXQ vdC90YvRhSDQt9CwINGB0YfQtdGCINGB0L7QsdGB0YLQstC10L3QvdGL0YUg0YHRgNC10LTRgdGC 0LIg0YDQsNGB0YXQvtC00L7QsiDQvdCwDQrRhNC+0YDQvNC40YDQvtCy0LDQvdC40LUg0LfQsNC/ 0LDRgdCwDQog0L/RgNC+0LTRg9C60YbQuNC4LCDRgdGL0YDRjNGPLCDQvNCw0YLQtdGA0LjQsNC7 0L7Qsiwg0L/QvtC70YPRhNCw0LHRgNC40LrQsNGC0L7Qsiwg0LrQvtC80L/Qu9C10LrRgtGD0Y7R idC40YUg0LjQt9C00LXQu9C40LksDQrQvdC10L7QsdGF0L7QtNC40LzQvtCz0L4g0LTQu9GPDQog 0LLRi9C/0L7Qu9C90LXQvdC40Y8g0JPQntCXOw0KDQogKjExLiog0JjRgdGC0L7Rh9C90LjQutC4 INGE0LjQvdCw0L3RgdC40YDQvtCy0LDQvdC40Y8g0YDQsNCx0L7RgiDQv9C+INC60L7QvdGC0YDQ sNC60YLQsNC8LCDQt9Cw0LrQu9GO0YfQtdC90L3Ri9C8INGBDQrQuNGB0L/QvtC70L3QuNGC0LXQ u9GP0LzQuCDQuA0KINC30LDQutCw0LfRh9C40LrQsNC80LguDQoNCiAqMTIuKiDQkdCw0L3QutC+ 0LLRgdC60L7QtSDRgdC+0L/RgNC+0LLQvtC20LTQtdC90LjQtSDQs9C+0YHRg9C00LDRgNGB0YLQ stC10L3QvdC+0LPQviDQutC+0L3RgtGA0LDQutGC0LAg0Lgg0LrQvtC90YLRgNCw0LrRgtC+0LIg 0L/Qvg0K0JPQntCXDQoNCiAqMTMuKiDQk9C+0YHRg9C00LDRgNGB0YLQstC10L3QvdGL0Lkg0LrQ vtC90YLRgNC+0LvRjCAo0L3QsNC00LfQvtGAKSDQsiDRgdGE0LXRgNC1INCz0L7RgdGD0LTQsNGA 0YHRgtCy0LXQvdC90L7Qs9C+DQrQvtCx0L7RgNC+0L3QvdC+0LPQviDQt9Cw0LrQsNC30LAuDQoN CiAqMTQuKiDQndC+0LLRi9C1INC/0YDQsNCy0LjQu9CwINGG0LXQvdC+0L7QsdGA0LDQt9C+0LLQ sNC90LjRjyDQvdCwINC/0YDQvtC00YPQutGG0LjRjiDQvtCx0L7RgNC+0L3QvdC+0LPQviDQvdCw 0LfQvdCw0YfQtdC90LjRjy4NCg0KICoxNS4qINCf0L7RgNGP0LTQvtC6INCy0LXQtNC10L3QuNGP INGA0LDQt9C00LXQu9GM0L3QvtCz0L4g0YPRh9C10YLQsCDQt9Cw0YLRgNCw0YIg0Lgg0YDQtdC3 0YPQu9GM0YLQsNGC0L7Qsg0K0YTQuNC90LDQvdGB0L7QstC+LdGF0L7Qt9GP0LnRgdGC0LLQtdC9 0L3QvtC5DQog0LTQtdGP0YLQtdC70YzQvdC+0YHRgtC4INCyINGB0YTQtdGA0LUg0JPQntCXLg0K DQogKjE2Liog0J3QvtCy0YvQtSDQv9C+0LvQvdC+0LzQvtGH0LjRjyDQpNCQ0KEg0KDQvtGB0YHQ uNC4INC/0L4g0LrQvtC90YLRgNC+0LvRjiDQsiDRgdGE0LXRgNC1INCT0J7Qlywg0LAg0YLQsNC6 0LbQtQ0K0YDQtdCz0LjRgdGC0YDQsNGG0LjQuCDRhtC10L0g0L3QsA0KINC/0YDQvtC00YPQutGG 0LjRjiwg0L/QvtGB0YLQsNCy0LvRj9C10LzRg9GOINC/0L4g0JPQntCXLg0KDQogKjE3Liog0JDQ tNC80LjQvdC40YHRgtGA0LDRgtC40LLQvdCw0Y8g0L7RgtCy0LXRgtGB0YLQstC10L3QvdC+0YHR gtGMINCyINCa0L7QtNC10LrRgdC1INC+0LEg0LDQtNC80LjQvdC40YHRgtGA0LDRgtC40LLQvdGL 0YUNCtC/0YDQsNCy0L7QvdCw0YDRg9GI0LXQvdC40Y/RhSDQsiDQoNCkOg0KINCy0LjQtNGLINC/ 0YDQsNCy0L7QvdCw0YDRg9GI0LXQvdC40Lkg0Lgg0YDQsNC30LzQtdGAINC+0YLQstC10YLRgdGC 0LLQtdC90L3QvtGB0YLQuC4g0J7RgtCy0LXRgtGB0YLQstC10L3QvdC+0YHRgtGMINC30LANCtC9 0LXQtNC+0LHRgNC+0YHQvtCy0LXRgdGC0L3QvtC1DQog0LLRi9C/0L7Qu9C90LXQvdC40LUg0JPQ ntCXINCyINGB0L7QvtGC0LLQtdGC0YHRgtCy0LjQuCDRgSDRgtGA0LXQsdC+0LLQsNC90LjRj9C8 0Lgg0J/QvtGB0YLQsNC90L7QstC70LXQvdC40Y8g0J/RgNCw0LLQuNGC0LXQu9GM0YHRgtCy0LAg 4oSWDQoxMjExINC+0YIgMjINCiDQvdC+0Y/QsdGA0Y8gMjAxMiDQsy4NCg0KDQogICAgICAgICAg ICAgICAgKtCj0YfQsNGB0YLQuNC1INGB0L7RgdGC0LDQstC70Y/QtdGCOiogMjknODAwINGALg0K ICAgICAgICAgICAgICAgINCh0LrQuNC00LrQuCAo0L/RgNC4INGD0YfQsNGB0YLQuNC4IDIg0YHQ vtGC0YDRg9C00L3QuNC60L7QsiDQvtGCINC+0LTQvdC+0Lkg0LrQvtC80L/QsNC90LjQuCAtDQog ICAgICAgICAgICAgICAgMTAlLCDQv9GA0Lgg0YPRh9Cw0YHRgtC40LggMyAtIDE1JSwg0L/RgNC4 INGD0YfQsNGB0YLQuNC4IDQg0Lgg0LHQvtC70LXQtSDRgdC+0YLRgNGD0LTQvdC40LrQvtCyDQrQ vtGCINC+0LTQvdC+0Lkg0LrQvtC80L/QsNC90LjQuCAtIDIwJSkNCiAgICAgICAgICAgICAgICDQ kiDRgdGC0L7QuNC80L7RgdGC0Ywg0LLRhdC+0LTQuNGCINC80LXRgtC+0LTQuNGH0LXRgdC60LjQ uSDQvNCw0YLQtdGA0LjQsNC7LCDQvtCx0LXQtNGLLA0K0LrQvtGE0LUt0L/QsNGD0LfRiywg0YHQ tdGA0YLQuNGE0LjQutCw0YIuDQo= ------------4C1FAA71051EB03D Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PHRhYmxlIGJvcmRlcj0iMSIgYmdjb2xvcj0iIzQ3MkYyNSIgc3R5bGU9 ImZvbnQtZmFtaWx5OiYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7Ym9yZGVyLXdpZHRoOjBweCI+ PHRib2R5Pjx0cj48dGQgc3R5bGU9ImJvcmRlci1zdHlsZTpub25lO2JvcmRlci13aWR0aDptZWRp dW0iPjxkaXYgYWxpZ249ImNlbnRlciI+PHRhYmxlIGJvcmRlcj0iMSIgYmdjb2xvcj0iIzVFM0Qz MSIgc3R5bGU9ImJvcmRlci13aWR0aDowcHgiPjx0Ym9keT48dHI+PHRkIHN0eWxlPSJib3JkZXIt c3R5bGU6bm9uZTtib3JkZXItd2lkdGg6bWVkaXVtIj48ZGl2IGFsaWduPSJjZW50ZXIiPjx0YWJs ZSBib3JkZXI9IjEiIGJnY29sb3I9IiM3OTREM0UiIHN0eWxlPSJib3JkZXItd2lkdGg6MHB4Ij48 dGJvZHk+PHRyPjx0ZCBzdHlsZT0iYm9yZGVyLXN0eWxlOm5vbmU7Ym9yZGVyLXdpZHRoOm1lZGl1 bSI+PGRpdiBhbGlnbj0iY2VudGVyIj48dGFibGUgYm9yZGVyPSIxIiBiZ2NvbG9yPSIjOEM1OTQ4 IiBzdHlsZT0iYm9yZGVyLXdpZHRoOjBweCI+PHRib2R5Pjx0cj48dGQgc3R5bGU9ImJvcmRlci1z dHlsZTpub25lO2JvcmRlci13aWR0aDptZWRpdW0iPjxkaXYgYWxpZ249ImNlbnRlciI+PHRhYmxl IGJvcmRlcj0iMSIgYmdjb2xvcj0iI0FENzQ2MSIgc3R5bGU9ImJvcmRlci13aWR0aDowcHgiPjx0 Ym9keT48dHI+PHRkIHN0eWxlPSJib3JkZXItc3R5bGU6bm9uZTtib3JkZXItd2lkdGg6bWVkaXVt Ij48ZGl2IGFsaWduPSJjZW50ZXIiPjx0YWJsZSBib3JkZXI9IjEiIGJnY29sb3I9IiNDREFBOUUi IHN0eWxlPSJib3JkZXItd2lkdGg6MHB4Ij48dGJvZHk+PHRyPjx0ZCBzdHlsZT0iYm9yZGVyLXN0 eWxlOm5vbmU7Ym9yZGVyLXdpZHRoOm1lZGl1bSI+PGRpdiBhbGlnbj0iY2VudGVyIj48dGFibGUg Ym9yZGVyPSIxIiBiZ2NvbG9yPSIjRTJDRUM3IiBzdHlsZT0iYm9yZGVyLXdpZHRoOjBweCI+PHRi b2R5Pjx0cj48dGQgc3R5bGU9ImJvcmRlci1zdHlsZTpub25lO2JvcmRlci13aWR0aDptZWRpdW0i PjxkaXYgYWxpZ249ImNlbnRlciI+PHRhYmxlIGJvcmRlcj0iMSIgYmdjb2xvcj0iI0ZBRjdGNSIg d2lkdGg9IjY5MCIgc3R5bGU9ImJvcmRlci13aWR0aDowcHgiPjx0Ym9keT48dHI+PHRkIHN0eWxl PSJib3JkZXItc3R5bGU6bm9uZTtib3JkZXItd2lkdGg6bWVkaXVtIj48dGFibGUgYm9yZGVyPSIy IiB3aWR0aD0iMTAxJSI+PHRib2R5Pjx0cj48dGQgc3R5bGU9ImJvcmRlci1zdHlsZTpub25lO2Jv cmRlci13aWR0aDptZWRpdW0iPjx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBzdHlsZT0i Ym9yZGVyLXdpZHRoOjBweCI+PHRib2R5Pjx0cj48dGQgc3R5bGU9ImJvcmRlci1zdHlsZTpub25l O2JvcmRlci13aWR0aDptZWRpdW0iPjxmb250IHNpemU9IjQiIGZhY2U9IlRhaG9tYSIgY29sb3I9 IiMwMDAwQ0MiPsKgwqDCoDxzcGFuIGxhbmc9ImVuLXVzIj4yNy0yODwvc3Bhbj48L2ZvbnQ+PGZv bnQgY29sb3I9IiMwMDAwQ0MiIGZhY2U9IlRhaG9tYSIgc2l6ZT0iNCI+wqDQsNC/0YDQtdC70Y/C oDxicj7CoMKgPC9mb250Pjxmb250IGNvbG9yPSIjMDAwMENDIiBmYWNlPSJUYWhvbWEiPsKg0LMu INCc0L7RgdC60LLQsDwvZm9udD48Zm9udCBzaXplPSI1IiBjb2xvcj0iI0M4MDAwMCIgZmFjZT0i VGFob21hIj48YnI+PC9mb250Pjxmb250IGZhY2U9IlRhaG9tYSI+PGJyPsKgwqAg0KPRh9C10LHQ vdGL0Lkg0YbQtdC90YLRgCDQv9GA0LjQs9C70LDRiNCw0LXRgiDQvdCwINC+0LHRg9GH0LXQvdC4 0LUg0L/QviDRgtC10LzQtTo8L2ZvbnQ+PC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48cCBhbGln bj0iY2VudGVyIj48Zm9udCBzaXplPSI1IiBjb2xvcj0iI0M4MDAwMCIgZmFjZT0iVGFob21hIj48 Yj48YnI+PC9iPjwvZm9udD48Zm9udCBzaXplPSI0IiBjb2xvcj0iI0M4MDAwMCIgZmFjZT0iVGFo b21hIj7Qk9C+0YHQvtCx0L7RgNC+0L3Qt9Cw0LrQsNC3OiDQvtGA0LPQsNC90LjQt9Cw0YbQuNGP INC00LXRj9GC0LXQu9GM0L3QvtGB0YLQuCDQsiDRgdC+0L7RgtCy0LXRgtGB0YLQstC40Lgg0YEg 0L3QvtCy0YvQvNC4INGC0YDQtdCx0L7QstCw0L3QuNGP0LzQuCDihJYgMjc1LdCk0Jcg0L/QviDQ utC+0L3RgtGA0L7Qu9GOINC30LAg0YbQtdC70LXQstGL0Lwg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQ vdC40LXQvCDRgdGA0LXQtNGB0YLQsjwvZm9udD48L3A+PHAgYWxpZ249ImNlbnRlciI+PGZvbnQg ZmFjZT0iVGFob21hIj48Yj7QkNGA0YLQuNC60YPQuzo8L2I+wqAzNzU8YnI+PGJyPjxmb250IHNp emU9IjIiPtCS0YDQtdC80Y8g0L/RgNC+0LLQtdC00LXQvdC40Y8g0LfQsNC90Y/RgtC40Y88c3Bh biBsYW5nPSJlbi11cyI+OsKgPC9zcGFuPmMgMTA6MDAg0LTQviAxNzozMDxicj48L2ZvbnQ+PGJy PjxiPjxmb250IHNpemU9IjIiPtCQ0LTRgNC10YEg0L/RgNC+0LLQtdC00LXQvdC40Y8g0LfQsNC9 0Y/RgtC40Y86PC9mb250PjwvYj48Zm9udCBzaXplPSIyIj7CoNGD0LsuINCR0LDRg9C80LDQvdGB 0LrQsNGPLCDQtC42LCDRgdGC0YAuMiwg0JEu0KYuwqA8c3BhbiBsYW5nPSJlbi11cyI+JnF1b3Q7 PC9zcGFuPtCS0LjQutGC0L7RgNC40Y8g0J/Qu9Cw0LfQsDxzcGFuIGxhbmc9ImVuLXVzIj4mcXVv dDs8L3NwYW4+Ljxicj48YnI+PC9mb250PjxiPjxmb250IHNpemU9IjIiPtCS0YHRjyDQv9C+0LTR gNC+0LHQvdCw0Y8g0LjQvdGE0L7RgNC80LDRhtC40Y8g0L/QviDQvtCx0YPRh9C10L3QuNGOINC4 INGA0LXQs9C40YHRgtGA0LDRhtC40Y8g0L/QviDQvdC+0LzQtdGA0YM6wqA8YnI+PC9mb250Pjwv Yj48YnI+PGZvbnQgc2l6ZT0iNCI+ODwvZm9udD48Zm9udCBzaXplPSIyIj7CoNC60L7QtCDQs9C+ 0YDQvtC00LDCoDwvZm9udD48Zm9udCBzaXplPSI0Ij4oNDk1KcKgPC9mb250Pjxmb250IHNpemU9 IjIiPtGC0LXQu9C10YTQvtC9wqA8L2ZvbnQ+PGZvbnQgc2l6ZT0iNCI+NDExLTkwLTk4wqA8L2Zv bnQ+PGZvbnQgc2l6ZT0iMiI+KNC80L3QvtCz0L7QutCw0L3QsNC70YzQvdGL0LkpPC9mb250Pjwv Zm9udD48L3A+PHAgYWxpZ249ImNlbnRlciI+PGZvbnQgc2l6ZT0iMiIgY29sb3I9IiMwMDAwQ0Mi PijQv9C+0LbQsNC70YPQudGB0YLQsCDQvdC1INC+0YLQstC10YfQsNC50YLQtSDQvdCwINC+0LHR gNCw0YLQvdGL0Lkg0LDQtNGA0LXRgSDRjdC7LtC/0L7Rh9GC0YspPC9mb250PjwvcD48L3RkPjwv dHI+PC90Ym9keT48L3RhYmxlPjxwPjxiPjxzcGFuIGxhbmc9ImVuLXVzIj7CoDwvc3Bhbj48Zm9u dCBzaXplPSIyIiBmYWNlPSJUYWhvbWEiPtCSINC+0LHRg9GH0LXQvdC40LUg0L/RgNC40L3QuNC8 0LDRjtGCINGD0YfQsNGB0YLQuNC1INGB0L/QtdGG0LjQsNC70LjRgdGC0Ysg0KPQv9GA0LDQstC7 0LXQvdC40Y8g0LrQvtC90YLRgNC+0LvRjyDQs9C+0YHRg9C00LDRgNGB0YLQstC10L3QvdC+0LPQ vsKgPGJyPjxzcGFuIGxhbmc9ImVuLXVzIj7CoDwvc3Bhbj7QvtCx0L7RgNC+0L3QvdC+0LPQviDQ t9Cw0LrQsNC30LAg0KbQtdC90YLRgNCw0LvRjNC90L7Qs9C+INCw0L/Qv9Cw0YDQsNGC0LAg0KTQ kNChINCg0L7RgdGB0LjQuCwg0L/RgNC10LTRgdGC0LDQstC40YLQtdC70Lgg0Y3QutGB0L/QtdGA 0YLQvdGL0YXCoDxicj48c3BhbiBsYW5nPSJlbi11cyI+wqA8L3NwYW4+0LPRgNGD0L/QvyDQn9GA 0LDQstC40YLQtdC70YzRgdGC0LLQsCDQoNCkPC9mb250PjwvYj48Zm9udCBzaXplPSIyIiBmYWNl PSJUYWhvbWEiPjxicj48YnI+PGZvbnQgY29sb3I9IiMwMDAwODAiPjxiPjxzcGFuIGxhbmc9ImVu LXVzIj7CoDwvc3Bhbj7Ql9Cw0L3Rj9GC0LjQtSDQtNC70Y86PC9iPjwvZm9udD7CoNGA0YPQutC+ 0LLQvtC00LjRgtC10LvQtdC5INC4INGB0L/QtdGG0LjQsNC70LjRgdGC0L7QsiAo0LPQu9Cw0LLQ vdGL0YUg0LHRg9GF0LPQsNC70YLQtdGA0L7Qsiwg0Y3QutC+0L3QvtC80LjRgdGC0L7Qsiwg0Y7R gNC40YHRgtC+0LIpwqA8YnI+PHNwYW4gbGFuZz0iZW4tdXMiPsKgPC9zcGFuPtC/0YDQtdC00L/R gNC40Y/RgtC40Lkg0Lgg0LjQvdGL0YUg0Y7RgNC40LTQuNGH0LXRgdC60LjRhSDQu9C40YYsINGD 0YfQsNGB0YLQstGD0Y7RidC40YUg0LIg0LjRgdC/0L7Qu9C90LXQvdC40Lgg0LPQvtGB0YPQtNCw 0YDRgdGC0LLQtdC90L3QvtCz0L4g0L7QsdC+0YDQvtC90L3QvtCz0L7CoDxicj48c3BhbiBsYW5n PSJlbi11cyI+wqA8L3NwYW4+0LfQsNC60LDQt9CwLCDRgdC/0LXRhtC40LDQu9C40YHRgtC+0LIg 0L/QviDQk9Ce0Jcg0L/RgNC10LTQv9GA0LjRj9GC0LjQuSDQvtCx0L7RgNC+0L3QvdC+LdC/0YDQ vtC80YvRiNC70LXQvdC90L7Qs9C+INC60L7QvNC/0LvQtdC60YHQsCwg0LfQsNC60LDQt9GH0LjQ utC+0LIswqA8YnI+PHNwYW4gbGFuZz0iZW4tdXMiPsKgPC9zcGFuPtGD0YfQsNGB0YLQvdC40LrQ vtCyINC4INC40YHQv9C+0LvQvdC40YLQtdC70LXQuSDQk9Ce0JcuPGJyPjxicj48Zm9udCBjb2xv cj0iIzAwMDA4MCI+PGI+PHNwYW4gbGFuZz0iZW4tdXMiPsKgPC9zcGFuPtCm0LXQu9GMINC+0LHR g9GH0LXQvdC40Y86PC9iPjwvZm9udD7CoNGA0LDQt9GK0Y/RgdC90LjRgtGMINC/0YDQuNC90Y/R gtGL0LUg0L3QvtCy0LDRhtC40LgsINC00LDRgtGMINC/0YDQsNC60YLQuNGH0LXRgdC60LjQtSDR gNC10LrQvtC80LXQvdC00LDRhtC40Lgg0LLQvsKgPGJyPjxzcGFuIGxhbmc9ImVuLXVzIj7CoDwv c3Bhbj7QstC30LDQuNC80L7QtNC10LnRgdGC0LLQuNC4INC/0YDQtdC00L/RgNC40Y/RgtC40Lkg 0YEg0YPQv9C+0LvQvdC+0LzQvtGH0LXQvdC90YvQvNC4INCx0LDQvdC60LDQvNC4LCDQt9Cw0LrQ sNC30YfQuNC60LDQvNC4INC4INC60L7QvdGC0YDQvtC70YzQvdGL0LzQuMKgPGJyPjxzcGFuIGxh bmc9ImVuLXVzIj7CoDwvc3Bhbj7QvtGA0LPQsNC90LDQvNC4LjwvZm9udD48Yj48YnI+PGJyPjxm b250IGNvbG9yPSIjMDAwMENDIj48Zm9udCBzaXplPSI0Ij7CoMKgPC9mb250Pjxmb250IGZhY2U9 IlRhaG9tYSIgc2l6ZT0iMiI+wqA8dT7QkiDQv9GA0L7Qs9GA0LDQvNC80LU6PC91PjwvZm9udD48 L2ZvbnQ+PC9iPjxmb250IGZhY2U9IlRhaG9tYSI+PHU+PGZvbnQgc2l6ZT0iMiIgY29sb3I9IiMw MDAwQ0MiPsKgwqDCoDwvZm9udD48Zm9udCBzaXplPSIyIj7CoMKgPGJyPjxicj48L2ZvbnQ+PC91 PjwvZm9udD48Yj48Zm9udCBmYWNlPSJUYWhvbWEiPjxzcGFuIGxhbmc9ImVuLXVzIj48Zm9udCBz aXplPSIyIj7CoDwvZm9udD48L3NwYW4+PC9mb250Pjxmb250IGZhY2U9IlRhaG9tYSIgc2l6ZT0i MiI+MS48L2ZvbnQ+PC9iPjxmb250IGZhY2U9IlRhaG9tYSI+PGZvbnQgc2l6ZT0iMiI+wqDQmNC3 0LzQtdC90LXQvdC40Y8g0LIg0LfQsNC60L7QvdC+0LTQsNGC0LXQu9GM0YHRgtCy0LUg0L4g0LPQ vtGB0YPQtNCw0YDRgdGC0LLQtdC90L3QvtC8INC+0LHQvtGA0L7QvdC90L7QvCDQt9Cw0LrQsNC3 0LUgKNCT0J7QlyksINCa0L7QtNC10LrRgdC1INC+0LHCoDxicj7CoNCw0LTQvNC40L3QuNGB0YLR gNCw0YLQuNCy0L3Ri9GFINC/0YDQsNCy0L7QvdCw0YDRg9GI0LXQvdC40Y/RhSDQsiDQoNCkINC4 INGCLtC0Ljxicj48YnI+wqA8Yj7QndC+0YDQvNGLINC4INGC0YDQtdCx0L7QstCw0L3QuNGPINCk 0Jcg4oSWIDI3NS3QpNCXINC+0YIgMjkg0LTQtdC60LDQsdGA0Y8gMjAxMiDQsy4gJnF1b3Q70J4g 0JPQntCXJnF1b3Q7Ozxicj7CoNCd0L7QstC+0LUg0LIg0YHQuNGB0YLQtdC80LUg0JPQntCXINCy INGB0L7QvtGC0LLQtdGC0YHRgtCy0LjQuCDRgSDQv9C+0LvQvtC20LXQvdC40Y/QvNC4INCk0Jcg 4oSWIDE1OS3QpNCXINC+0YIgMjkg0LjRjtC90Y8gMjAxNSDQsy7CoDxicj7CoCZxdW90O9CeINCy 0L3QtdGB0LXQvdC40Lgg0LjQt9C80LXQvdC10L3QuNC5INCyINCk0JcgJnF1b3Q70J4g0JPQntCX JnF1b3Q7INC4INC+0YLQtNC10LvRjNC90YvQtSDQt9Cw0LrQvtC90L7QtNCw0YLQtdC70YzQvdGL 0LUg0LDQutGC0Ysg0KDQpCZxdW90Oy48L2I+PGJyPjxicj7CoDwvZm9udD48Yj48Zm9udCBzaXpl PSIyIj4yLjwvZm9udD48L2I+PGZvbnQgc2l6ZT0iMiI+wqDQntGB0L3QvtCy0L3Ri9C1INC/0YDQ sNCy0LAg0Lgg0L7QsdGP0LfQsNC90L3QvtGB0YLQuCDQs9C+0YHRg9C00LDRgNGB0YLQstC10L3Q vdC+0LPQviDQt9Cw0LrQsNC30YfQuNC60LAsINCz0L7Qu9C+0LLQvdC+0LPQviDQuNGB0L/QvtC7 0L3QuNGC0LXQu9GPLMKgPGJyPsKg0LjRgdC/0L7Qu9C90LjRgtC10LvRjy48YnI+PGJyPsKgPC9m b250PjxiPjxmb250IHNpemU9IjIiPjMuPC9mb250PjwvYj48Zm9udCBzaXplPSIyIj7CoNCd0L7Q stGL0LUg0L7RgdC90L7QstC90YvQtSDQv9GA0LDQstCwINC4INC+0LHRj9C30LDQvdC90L7RgdGC 0Lgg0LPQvtC70L7QstC90L7Qs9C+INC40YHQv9C+0LvQvdC40YLQtdC70Y8uINCa0L7QvtC/0LXR gNCw0YbQuNGPINCz0L7Qu9C+0LLQvdC+0LPQvsKgPGJyPsKg0LjRgdC/0L7Qu9C90LjRgtC10LvR jy48YnI+PGJyPsKgPC9mb250PjxiPjxmb250IHNpemU9IjIiPjQuPC9mb250PjwvYj48Zm9udCBz aXplPSIyIj7CoNCd0L7QstGL0LUg0L7RgdC90L7QstC90YvQtSDQv9GA0LDQstCwINC4INC+0LHR j9C30LDQvdC90L7RgdGC0Lgg0LjRgdC/0L7Qu9C90LjRgtC10LvRjy48YnI+PGJyPsKgPC9mb250 PjxiPjxmb250IHNpemU9IjIiPjUuPC9mb250PjwvYj48Zm9udCBzaXplPSIyIj7CoNCk0L7RgNC8 0LjRgNC+0LLQsNC90LjQtSDQutC+0L7Qv9C10YDQsNGG0LjQuCDQs9C+0LvQvtCy0L3Ri9C80Lgg 0LjRgdC/0L7Qu9C90LjRgtC10LvRj9C80Lgg0Lgg0LjRgdC/0L7Qu9C90LjRgtC10LvRj9C80Lgg 0JPQntCXLiDQo9GB0LvQvtCy0LjRj8KgPGJyPsKg0LfQsNC60LvRjtGH0LDQtdC80YvRhSDQutC+ 0L3RgtGA0LDQutGC0L7QsiDQv9C+INCT0J7Qly48YnI+PGJyPsKgPC9mb250PjxiPjxmb250IHNp emU9IjIiPjYuPC9mb250PjwvYj48Zm9udCBzaXplPSIyIj7CoNCe0LHQtdGB0L/QtdGH0LXQvdC4 0LUg0L/QvtGB0YLQsNCy0L7QuiDQv9GA0L7QtNGD0LrRhtC40LgsINGA0LDQt9C80LXRidC10L3Q uNGPINC30LDQutCw0LfQvtCyINC90LAg0L/QvtGB0YLQsNCy0LrQuCDQv9GA0L7QtNGD0LrRhtC4 0LguPGJyPjxicj7CoDwvZm9udD48Yj48Zm9udCBzaXplPSIyIj43LjwvZm9udD48L2I+PGZvbnQg c2l6ZT0iMiI+wqDQl9Cw0LrQu9GO0YfQtdC90LjQtSDQs9C+0YHRg9C00LDRgNGB0YLQstC10L3Q vdC+0LPQviDQutC+0L3RgtGA0LDQutGC0LAuINCS0LLQtdC00LXQvdC40LUg0LjQtNC10L3RgtC4 0YTQuNC60LDRgtC+0YDQsCDQs9C+0YHRg9C00LDRgNGB0YLQstC10L3QvdC+0LPQvsKgPGJyPsKg 0LrQvtC90YLRgNCw0LrRgtCwLjxicj48YnI+wqA8L2ZvbnQ+PGI+PGZvbnQgc2l6ZT0iMiI+OC48 L2ZvbnQ+PC9iPjxmb250IHNpemU9IjIiPsKg0JrQvtC90YLRgNC+0LvRjCDQt9CwINC+0LHQtdGB 0L/QtdGH0LXQvdC40LXQvCDQutC+0L3RgtGA0LDQutGC0LAg0Lgg0L/QvtGB0YLQsNCy0L7QuiDQ v9GA0L7QtNGD0LrRhtC40Lgg0LjRgdC/0L7Qu9C90LjRgtC10LvRj9C80Lgg0Lgv0LjQu9C4INCz 0L7Qu9C+0LLQvdGL0LzCoDxicj7CoNC40YHQv9C+0LvQvdC40YLQtdC70LXQvC48YnI+PGJyPsKg PC9mb250PjxiPjxmb250IHNpemU9IjIiPjkuPC9mb250PjwvYj48Zm9udCBzaXplPSIyIj7CoNCe 0YLQutCw0Lcg0YPRh9Cw0YHRgtC90LjQutC+0LIg0LrQvtC+0L/QtdGA0LDRhtC40Lgg0L7RgiDQ t9Cw0LrQu9GO0YfQtdC90LjRjyDQutC+0L3RgtGA0LDQutGC0L7QsiDQsiDRgNCw0LzQutCw0YUg 0YHQvtC/0YDQvtCy0L7QttC00LDQtdC80L7QuSDRgdC00LXQu9C60LguwqA8YnI+wqDQkNC70LPQ vtGA0LjRgtC8INGA0LDQsdC+0YLRiyDQv9C+INGD0YDQtdCz0YPQu9C40YDQvtCy0LDQvdC40Y4g 0YDQsNC30L3QvtCz0LvQsNGB0LjQuTsg0KDQtdC20LjQvCDQuNGB0L/QvtC70YzQt9C+0LLQsNC9 0LjRjyDQvtGC0LTQtdC70YzQvdC+0LPQviDRgdGH0LXRgtCwINC4wqA8YnI+wqDQt9Cw0L/RgNC1 0YLRiyDQvdCwINGB0L7QstC10YDRiNC10L3QuNC1INC+0L/QtdGA0LDRhtC40Lk7INCa0YDQuNGC 0LXRgNC40Lgg0L7Qv9C10YDQsNGG0LjQuSwg0L/RgNC40L7RgdGC0LDQvdCw0LLQu9C40LLQsNC1 0LzRi9GFINCyINGB0L7QvtGC0LLQtdGC0YHRgtCy0LjQuCDRgcKgPGJyPsKg0KTQtdC00LXRgNCw 0LvRjNC90YvQvCDQt9Cw0LrQvtC90L7QvCDCq9CeINCz0L7RgdGD0LTQsNGA0YHRgtCy0LXQvdC9 0L7QvCDQvtCx0L7RgNC+0L3QvdC+0Lwg0LfQsNC60LDQt9C1wrsg0Lgg0YIu0LQuPGJyPjxicj7C oDwvZm9udD48Yj48Zm9udCBzaXplPSIyIj4xMC48L2ZvbnQ+PC9iPjxmb250IHNpemU9IjIiPsKg 0KPRgdC70L7QstC40Y8g0LPQvtGB0YPQtNCw0YDRgdGC0LLQtdC90L3Ri9GFINC60L7QvdGC0YDQ sNC60YLQvtCyLCDRg9GB0YLQsNC90LDQstC70LjQstCw0Y7RidC40LUg0YDQsNC30LzQtdGAINC/ 0YDQuNCx0YvQu9C4INC4ICjQuNC70LgpINC/0L7RgNGP0LTQvtC6wqA8YnI+wqDQutC+0LzQv9C1 0L3RgdCw0YbQuNC4INC/0L7QvdC10YHQtdC90L3Ri9GFINC30LAg0YHRh9C10YIg0YHQvtCx0YHR gtCy0LXQvdC90YvRhSDRgdGA0LXQtNGB0YLQsiDRgNCw0YHRhdC+0LTQvtCyINC90LAg0YTQvtGA 0LzQuNGA0L7QstCw0L3QuNC1INC30LDQv9Cw0YHQsMKgPGJyPsKg0L/RgNC+0LTRg9C60YbQuNC4 LCDRgdGL0YDRjNGPLCDQvNCw0YLQtdGA0LjQsNC70L7Qsiwg0L/QvtC70YPRhNCw0LHRgNC40LrQ sNGC0L7Qsiwg0LrQvtC80L/Qu9C10LrRgtGD0Y7RidC40YUg0LjQt9C00LXQu9C40LksINC90LXQ vtCx0YXQvtC00LjQvNC+0LPQviDQtNC70Y/CoDxicj7CoNCy0YvQv9C+0LvQvdC10L3QuNGPINCT 0J7Qlzs8YnI+PGJyPsKgPC9mb250PjxiPjxmb250IHNpemU9IjIiPjExLjwvZm9udD48L2I+PGZv bnQgc2l6ZT0iMiI+wqDQmNGB0YLQvtGH0L3QuNC60Lgg0YTQuNC90LDQvdGB0LjRgNC+0LLQsNC9 0LjRjyDRgNCw0LHQvtGCINC/0L4g0LrQvtC90YLRgNCw0LrRgtCw0LwsINC30LDQutC70Y7Rh9C1 0L3QvdGL0Lwg0YEg0LjRgdC/0L7Qu9C90LjRgtC10LvRj9C80Lgg0LjCoDxicj7CoNC30LDQutCw 0LfRh9C40LrQsNC80LguPGJyPjxicj7CoDwvZm9udD48Yj48Zm9udCBzaXplPSIyIj4xMi48L2Zv bnQ+PC9iPjxmb250IHNpemU9IjIiPsKg0JHQsNC90LrQvtCy0YHQutC+0LUg0YHQvtC/0YDQvtCy 0L7QttC00LXQvdC40LUg0LPQvtGB0YPQtNCw0YDRgdGC0LLQtdC90L3QvtCz0L4g0LrQvtC90YLR gNCw0LrRgtCwINC4INC60L7QvdGC0YDQsNC60YLQvtCyINC/0L4g0JPQntCXPGJyPjxicj7CoDwv Zm9udD48Yj48Zm9udCBzaXplPSIyIj4xMy48L2ZvbnQ+PC9iPjxmb250IHNpemU9IjIiPsKg0JPQ vtGB0YPQtNCw0YDRgdGC0LLQtdC90L3Ri9C5INC60L7QvdGC0YDQvtC70YwgKNC90LDQtNC30L7R gCkg0LIg0YHRhNC10YDQtSDQs9C+0YHRg9C00LDRgNGB0YLQstC10L3QvdC+0LPQviDQvtCx0L7R gNC+0L3QvdC+0LPQviDQt9Cw0LrQsNC30LAuPGJyPjxicj7CoDwvZm9udD48Yj48Zm9udCBzaXpl PSIyIj4xNC48L2ZvbnQ+PC9iPjxmb250IHNpemU9IjIiPsKg0J3QvtCy0YvQtSDQv9GA0LDQstC4 0LvQsCDRhtC10L3QvtC+0LHRgNCw0LfQvtCy0LDQvdC40Y8g0L3QsCDQv9GA0L7QtNGD0LrRhtC4 0Y4g0L7QsdC+0YDQvtC90L3QvtCz0L4g0L3QsNC30L3QsNGH0LXQvdC40Y8uPGJyPjxicj7CoDwv Zm9udD48Yj48Zm9udCBzaXplPSIyIj4xNS48L2ZvbnQ+PC9iPjxmb250IHNpemU9IjIiPsKg0J/Q vtGA0Y/QtNC+0Log0LLQtdC00LXQvdC40Y8g0YDQsNC30LTQtdC70YzQvdC+0LPQviDRg9GH0LXR gtCwINC30LDRgtGA0LDRgiDQuCDRgNC10LfRg9C70YzRgtCw0YLQvtCyINGE0LjQvdCw0L3RgdC+ 0LLQvi3RhdC+0LfRj9C50YHRgtCy0LXQvdC90L7QucKgPGJyPsKg0LTQtdGP0YLQtdC70YzQvdC+ 0YHRgtC4INCyINGB0YTQtdGA0LUg0JPQntCXLjxicj48YnI+wqA8L2ZvbnQ+PGI+PGZvbnQgc2l6 ZT0iMiI+MTYuPC9mb250PjwvYj48Zm9udCBzaXplPSIyIj7CoNCd0L7QstGL0LUg0L/QvtC70L3Q vtC80L7Rh9C40Y8g0KTQkNChINCg0L7RgdGB0LjQuCDQv9C+INC60L7QvdGC0YDQvtC70Y4g0LIg 0YHRhNC10YDQtSDQk9Ce0JcsINCwINGC0LDQutC20LUg0YDQtdCz0LjRgdGC0YDQsNGG0LjQuCDR htC10L0g0L3QsMKgPGJyPsKg0L/RgNC+0LTRg9C60YbQuNGOLCDQv9C+0YHRgtCw0LLQu9GP0LXQ vNGD0Y4g0L/QviDQk9Ce0JcuPGJyPjxicj7CoDwvZm9udD48Yj48Zm9udCBzaXplPSIyIj4xNy48 L2ZvbnQ+PC9iPjxmb250IHNpemU9IjIiPsKg0JDQtNC80LjQvdC40YHRgtGA0LDRgtC40LLQvdCw 0Y8g0L7RgtCy0LXRgtGB0YLQstC10L3QvdC+0YHRgtGMINCyINCa0L7QtNC10LrRgdC1INC+0LEg 0LDQtNC80LjQvdC40YHRgtGA0LDRgtC40LLQvdGL0YUg0L/RgNCw0LLQvtC90LDRgNGD0YjQtdC9 0LjRj9GFINCyINCg0KQ6wqA8YnI+wqDQstC40LTRiyDQv9GA0LDQstC+0L3QsNGA0YPRiNC10L3Q uNC5INC4INGA0LDQt9C80LXRgCDQvtGC0LLQtdGC0YHRgtCy0LXQvdC90L7RgdGC0LguINCe0YLQ stC10YLRgdGC0LLQtdC90L3QvtGB0YLRjCDQt9CwINC90LXQtNC+0LHRgNC+0YHQvtCy0LXRgdGC 0L3QvtC1wqA8YnI+wqDQstGL0L/QvtC70L3QtdC90LjQtSDQk9Ce0Jcg0LIg0YHQvtC+0YLQstC1 0YLRgdGC0LLQuNC4INGBINGC0YDQtdCx0L7QstCw0L3QuNGP0LzQuCDQn9C+0YHRgtCw0L3QvtCy 0LvQtdC90LjRjyDQn9GA0LDQstC40YLQtdC70YzRgdGC0LLQsCDihJYgMTIxMSDQvtGCIDIywqA8 YnI+wqDQvdC+0Y/QsdGA0Y8gMjAxMiDQsy48L2ZvbnQ+PC9mb250Pjxicj48YnI+PGJyPsKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgPGZvbnQgc2l6ZT0iMiIgZmFjZT0iVGFob21hIj48 Yj7Qo9GH0LDRgdGC0LjQtSDRgdC+0YHRgtCw0LLQu9GP0LXRgjo8L2I+wqAyOTxzcGFuIGxhbmc9 ImVuLXVzIj4mIzM5Ozwvc3Bhbj44MDAg0YAuPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCDQodC60LjQtNC60LggKNC/0YDQuCDRg9GH0LDRgdGC0LjQuCAyINGB0L7RgtGA0YPQtNC9 0LjQutC+0LIg0L7RgiDQvtC00L3QvtC5INC60L7QvNC/0LDQvdC40LggLcKgPGJyPsKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAxMCUsINC/0YDQuCDRg9GH0LDRgdGC0LjQuCAzIC0gMTUl LCDQv9GA0Lgg0YPRh9Cw0YHRgtC40LggNCDQuCDQsdC+0LvQtdC1INGB0L7RgtGA0YPQtNC90LjQ utC+0LIg0L7RgiDQvtC00L3QvtC5INC60L7QvNC/0LDQvdC40LggLSAyMCUpwqA8YnI+wqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgINCSINGB0YLQvtC40LzQvtGB0YLRjCDQstGF0L7QtNC4 0YIg0LzQtdGC0L7QtNC40YfQtdGB0LrQuNC5INC80LDRgtC10YDQuNCw0LssINC+0LHQtdC00Yss INC60L7RhNC1LdC/0LDRg9C30YssINGB0LXRgNGC0LjRhNC40LrQsNGCLjwvZm9udD48YnI+wqA8 L3A+PC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj48L3RkPjwvdHI+PC90Ym9keT48L3Rh YmxlPjwvZGl2PjwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PC9kaXY+PC90ZD48L3RyPjwvdGJv ZHk+PC90YWJsZT48L2Rpdj48L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwvZGl2PjwvdGQ+PC90 cj48L3Rib2R5PjwvdGFibGU+PC9kaXY+PC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj48 L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwvZGl2Pg0K ------------4C1FAA71051EB03D-- From sandeen@sandeen.net Thu Apr 21 13:34:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 771057CA0 for ; Thu, 21 Apr 2016 13:34:18 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id F0F65AC005 for ; Thu, 21 Apr 2016 11:34:14 -0700 (PDT) X-ASG-Debug-ID: 1461263651-04bdf035965f4b0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 8LJvXyUn5CSEfoUd for ; Thu, 21 Apr 2016 11:34:12 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (unknown [74.203.127.200]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 269049F for ; Thu, 21 Apr 2016 13:34:11 -0500 (CDT) Subject: Re: xfs_repair couldn't verify primary superblock To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair couldn't verify primary superblock References: <5717E2EF.1080902@sandeen.net> <7ce740a1888c4bb28ce3c30fcedbe703@ul-exc-pr-mbx11.ulaval.ca> From: Eric Sandeen Message-ID: <57191D20.7020402@sandeen.net> Date: Thu, 21 Apr 2016 14:34:08 -0400 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: <7ce740a1888c4bb28ce3c30fcedbe703@ul-exc-pr-mbx11.ulaval.ca> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1461263652 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 824 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28940 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/21/16 10:42 AM, Stéphane Larose wrote: > Hi Eric, > > Nothing more interesting. From the log: > > 2016-04-04T14:48:48.735738-04:00 manitou kernel: [271211.548878] XFS (dm-24): Mounting V4 Filesystem > 2016-04-04T14:48:48.882738-04:00 manitou kernel: [271211.694242] XFS (dm-24): Ending clean mount > > Then no more logs about dm-24. > > Also no errors from the underlying storage (verified in SANtricity) > which is an IS5000. The filesystem was new, the first mount was on > 2016-04-04. > > manitou:~ # blkid /dev/dm-24 > /dev/dm-24: UUID="1da22ae2-a572-4db7-b177-b90021a20863" TYPE="xfs" > > Thank you for your help, Any chance that some other host is accessing the same LUN on the SAN? This really looks like something external corrupted the filesystem by writing over it... -Eric From sandeen@sandeen.net Thu Apr 21 15:14:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2186F7CA0 for ; Thu, 21 Apr 2016 15:14:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 90807AC007 for ; Thu, 21 Apr 2016 13:14:00 -0700 (PDT) X-ASG-Debug-ID: 1461269636-04cbb00fe9685a0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id PseG3cJdTDFMNmWO for ; Thu, 21 Apr 2016 13:13:56 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (unknown [74.203.127.200]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 04E6C9F for ; Thu, 21 Apr 2016 15:13:55 -0500 (CDT) Subject: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> <1461231593-31294-16-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: <57193483.8000700@sandeen.net> Date: Thu, 21 Apr 2016 16:13:55 -0400 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1461269636 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1956 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28942 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/21/16 8:43 AM, Jan Tulak wrote: > On Thu, Apr 21, 2016 at 11:39 AM, Jan Tulak >wrote: > > From: Dave Chinner > > > THIS PATCH HAS KNOWN ISSUES - it fails xfs/206 and xfs/216 tests, as it > shrinks a file instead just not using it entirely, when -d size is used. > > > ​So the shrinking is happening here: > 3127 /* > 3128 * If the data area is a file, then grow it out to its final size > 3129 * so that the reads for the end of the device in the mount code > 3130 * will succeed. > 3131 */ > 3132 if (xi.disfile && ftruncate64(xi.dfd, dblocks * blocksize) < 0) {​ > > > Before the patch, xi.disfile was 0 and so it didn't shrink the file > to the size of the new FS. Now, what is the correct solve to this? > Tests are written for the old behaviour, but this shrinking seems to > be an intentional thing. It seems that the FS works ok even when this > truncating is not applied, so I think that I should remove this chunk > (or change it to xi.dcreate=1 only), and keep the old behaviour. > > What do you think about it, guys? Can't remove it; that would break the other side of things, if you try to mkfs.xfs -d size=2g on an existing 1g file... mount tries to do IO to the last block, and if it's not truncated out, that will fail (as the comment says). I suppose the simple way to fix it is to only truncate up, never down. i.e. truncate to max(dblocks * blocksize, st_size) or if (xi.disfile && st_size < dblocks * blocksize) { truncate ... } -Eric > Cheers, > Jan > > > > -- > Jan Tulak > jtulak@redhat.com / jan@tulak.me > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From uwekezaji@utt-tz.org Thu Apr 21 21:07:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=MIME_QP_LONG_LINE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 82C0E7CA0 for ; Thu, 21 Apr 2016 21:07:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id EB89EAC007 for ; Thu, 21 Apr 2016 19:07:34 -0700 (PDT) X-ASG-Debug-ID: 1461290847-04cbb00fea872b0001-NocioJ Received: from windows8.internet-webhosting.com (mail-win8.internet-webhosting.com [103.8.25.63]) by cuda.sgi.com with ESMTP id MFsiIpyD959q16HO for ; Thu, 21 Apr 2016 19:07:28 -0700 (PDT) X-Barracuda-Envelope-From: uwekezaji@utt-tz.org X-Barracuda-Effective-Source-IP: mail-win8.internet-webhosting.com[103.8.25.63] X-Barracuda-Apparent-Source-IP: 103.8.25.63 Received: from [173.208.194.41] ([127.0.0.1]) by windows8.internet-webhosting.com with MailEnable ESMTP; Thu, 21 Apr 2016 09:23:07 +0800 Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Subject: Good day To: xfs@oss.sgi.com X-ASG-Orig-Subj: Good day From: "Jessica Alger" Date: Wed, 20 Apr 2016 18:26:14 -0700 Reply-To: jessalger@naver.com Message-ID: <29F6DF347CF946E8AFA8B9DFE47FDD12.MAI@windows8.internet-webhosting.com> X-ME-Bayesian: 0.000000 X-Barracuda-Connect: mail-win8.internet-webhosting.com[103.8.25.63] X-Barracuda-Start-Time: 1461290847 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 0 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.82 X-Barracuda-Spam-Status: No, SCORE=0.82 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28952 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.82 MIME_QP_LONG_LINE_2 RAW: Quoted-printable line longer than 76 chars Hello, = I wish to seek for your assistance in a deal that will be of mutual benefit= for the both of us from Camp Stanley, Stationed in Uijeongbu, South Korea. = Please get back to me on jessalger@naver.com for more info. = Thank you for your time. = Sgt. Jessica Alger From 2kx_dhh.h57.1db@offre-sender.com Thu Apr 21 22:40:04 2016 Return-Path: <2kx_dhh.h57.1db@offre-sender.com> X-Spam-Checker-Version: SpamAssassin 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 07F7C7CA0 for ; Thu, 21 Apr 2016 22:40:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id BC2338F8033 for ; Thu, 21 Apr 2016 20:40:03 -0700 (PDT) X-ASG-Debug-ID: 1461296399-04cbb00fe88e440001-NocioJ Received: from mta7fr.offre-sender.com (mta7fr.offre-sender.com [185.113.67.62]) by cuda.sgi.com with ESMTP id JGoSHS4rewOzXHwN for ; Thu, 21 Apr 2016 20:39:59 -0700 (PDT) X-Barracuda-Envelope-From: 2kx_dhh.h57.1db@offre-sender.com X-Barracuda-Effective-Source-IP: mta7fr.offre-sender.com[185.113.67.62] X-Barracuda-Apparent-Source-IP: 185.113.67.62 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=mta7fr; d=offre-sender.com; h=Date:To:From:Reply-to:Subject:List-Unsubscribe:Message-ID:MIME-Version:Content-Type; i=Investir_en_SCPI@offre-sender.com; bh=BQe+Rh7wCRpCV5DJwyblDl8C/jI=; b=wwZ8eBD29B+okue71sHRx9Pgd/T1i21nRCFNYKgoGz5130/Ju2fjAaU/nRnlHCakIeql+IbLhxmV CdFkxpDQK34Ig4UbTfSlkm5hgjJpV9+y/NzoNJ50RcxpMInUQqhekKRhZMQMCDG2RXYHA1cGZf5U qbw2WrBivJdNO01IayE= DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=mta7fr; d=offre-sender.com; b=t1NsG6nH3gPRnugQIb3wVvLJEl82I23KFMsIVdcjZKznA11cJZvwx2HaTjC8V2KQ60otQqrVa+Xu 3TOUUuk9XIOtC0henKbA7FQd67nLNNSIncpy/OQ94opeWrVChKOtlgQKy0Cv/+ry2pRM0pn/nZ9L tB8N+vfcW9XJNVxWmjA=; Date: Fri, 22 Apr 2016 05:39:59 +0200 To: xfs From: Investir en SCPI Reply-to: Investir en SCPI <2kx_dhh.h57.1db@offre-sender.com> Subject: =?utf-8?Q?Un_placement_qui_a_rapport=C3=A9_en_moyenne_4.85%_en_2016?= X-campaign_id: 48973930620745694364278577816_2 X-ASG-Orig-Subj: =?utf-8?Q?Un_placement_qui_a_rapport=C3=A9_en_moyenne_4.85%_en_2016?= Precedence: bulk X-uid_id_m: List-Unsubscribe: Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="Part1_b4465fd867da4e2b576414522cea319d" X-Barracuda-Connect: mta7fr.offre-sender.com[185.113.67.62] X-Barracuda-Start-Time: 1461296399 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9845 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28953 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --Part1_b4465fd867da4e2b576414522cea319d Content-Type: text/plain; charset = "utf-8" Content-Transfer-Encoding: 8bit Pour visualiser et se désabonner ce message, Veuillez, copier puis coller, l'adresse URL complète ci-dessous dans la barre d'adresse de votre navigateur et appuyer sur la touche "Entrée" de votre clavier. - - - - - - - - - - - - - - - - - http://www.offre-sender.com/v/?camp=48973930620745694364278577816_2&ms=eGZzQG9zcy5zZ2kuY29t - - - - - - - - - - - - - - - - - --Part1_b4465fd867da4e2b576414522cea319d Content-Type: text/html; charset = "utf-8" Content-Transfer-Encoding: 8bit Un placement qui a rapporté en moyenne 4.85% en 2016
    Si cet email ne s’affiche pas correctement, suivez ce lien.

    _pspacer7
    Pour se désabonner : Suivez ce lien.
    Si ce message vous a causé un quelconque dérangement, nous vous prions de nous en excuser.
    --Part1_b4465fd867da4e2b576414522cea319d-- From jtulak@redhat.com Fri Apr 22 02:46:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 5B5777CA0 for ; Fri, 22 Apr 2016 02:46:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 21B608F8033 for ; Fri, 22 Apr 2016 00:46:53 -0700 (PDT) X-ASG-Debug-ID: 1461311209-04cb6c09a3b1140001-NocioJ Received: from mail-io0-f181.google.com (mail-io0-f181.google.com [209.85.223.181]) by cuda.sgi.com with ESMTP id 5Kgq0TESbwF3PvB7 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 22 Apr 2016 00:46:49 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.181 Received: by mail-io0-f181.google.com with SMTP id u185so111069064iod.3 for ; Fri, 22 Apr 2016 00:46:49 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=C673OX7Cu7bY3x+/MVw+2jNfoe9n5VWbNT3tIVJg+Ss=; b=H9JbvYWlsovavpod7hHHe6DS/e1Paj5olEfUeZDP+gF6Jk/K/+s6Dj3qxjLwkjrbFQ Q3LEg/4dpYI7/NCsNBy3zIoYZ7mFhCjGkqgSet0gYJDcUYrLxT2Dgav1cZWJmLUabyrO s4Cdnrb7uoUiuJQM2LQovRZ0FAAMmqiHXHYK1by8o3AjonNSZQdVb8GfItFlPTPjs8Lk XLFLfZsDcHmRFDIMrrfwPkhOlCuuIkt85eOrdp6tS3DRebcbnADefwckdlq7uf6XAshI sioDxPBNLd1kS0+6pmHasCqoPjJ+v9Pr8fhXSt4wSUk4k24Hi8rnJ+8wdDfHopgYJH05 1Y2A== X-Gm-Message-State: AOPr4FWIZhjvQ9LGEiN1PYMGOsljQapLx73SpAba3ipjr3rD/2CD09m/iBBYwRzpDW1Lb+aU4/ju3NgKvJ2hYJh8 X-Received: by 10.107.9.232 with SMTP id 101mr14324036ioj.52.1461311208943; Fri, 22 Apr 2016 00:46:48 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.79 with HTTP; Fri, 22 Apr 2016 00:46:29 -0700 (PDT) In-Reply-To: <57193483.8000700@sandeen.net> References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> <1461231593-31294-16-git-send-email-jtulak@redhat.com> <57193483.8000700@sandeen.net> From: Jan Tulak Date: Fri, 22 Apr 2016 09:46:29 +0200 Message-ID: Subject: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH 15/19] mkfs: don't treat files as though they are block devices Cc: xfs-oss Content-Type: multipart/alternative; boundary=001a113ecdbe8410de05310e07f3 X-Barracuda-Connect: mail-io0-f181.google.com[209.85.223.181] X-Barracuda-Start-Time: 1461311209 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5732 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28957 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 --001a113ecdbe8410de05310e07f3 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Thu, Apr 21, 2016 at 10:13 PM, Eric Sandeen wrote: > > > On 4/21/16 8:43 AM, Jan Tulak wrote: > > On Thu, Apr 21, 2016 at 11:39 AM, Jan Tulak jtulak@redhat.com>>wrote: > > > > From: Dave Chinner >> > > > > THIS PATCH HAS KNOWN ISSUES - it fails xfs/206 and xfs/216 tests, a= s > it > > shrinks a file instead just not using it entirely, when -d size is > used. > > > > > > =E2=80=8BSo the shrinking is happening here: > > 3127 /* > > 3128 * If the data area is a file, then grow it out to its fina= l > size > > 3129 * so that the reads for the end of the device in the mount > code > > 3130 * will succeed. > > 3131 */ > > 3132 if (xi.disfile && ftruncate64(xi.dfd, dblocks * blocksize) = < > 0) {=E2=80=8B > > > > > > Before the patch, xi.disfile was 0 and so it didn't shrink the file > > to the size of the new FS. Now, what is the correct solve to this? > > Tests are written for the old behaviour, but this shrinking seems to > > be an intentional thing. It seems that the FS works ok even when this > > truncating is not applied, so I think that I should remove this chunk > > (or change it to xi.dcreate=3D1 only), and keep the old behaviour. > > > > What do you think about it, guys? > > Can't remove it; that would break the other side of things, if you try > to mkfs.xfs -d size=3D2g on an existing 1g file... mount tries to do > IO to the last block, and if it's not truncated out, that will fail > (as the comment says). > > I suppose the simple way to fix it is to only truncate up, never down. > > i.e. truncate to max(dblocks * blocksize, st_size) or > if (xi.disfile && st_size < dblocks * blocksize) { truncate ... } > All right, it seems that I should have read the man page, and not just look on the first sentence or two... . Now it works, thanks. Jan --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --001a113ecdbe8410de05310e07f3 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
    On Thu, Ap= r 21, 2016 at 10:13 PM, Eric Sandeen <sandeen@sandeen.net> wrote:


    On 4/21/16 8:43 AM, Jan Tulak wrote:
    > On Thu, Apr 21, 2016 at 11:39 AM, Jan Tulak <jtulak@redhat.com <mailto:jtulak@redhat.com>>wrote:
    >
    >=C2=A0 =C2=A0 =C2=A0From: Dave Chinner <dchinner@redhat.com <mailto:dchinner@redhat.com>>
    >
    >=C2=A0 =C2=A0 =C2=A0THIS PATCH HAS KNOWN ISSUES - it fails xfs/206 and = xfs/216 tests, as it
    >=C2=A0 =C2=A0 =C2=A0shrinks a file instead just not using it entirely, = when -d size is used.
    >
    >
    > =E2=80=8BSo the shrinking is happening here:
    > 3127=C2=A0 =C2=A0 =C2=A0 =C2=A0 /*
    > 3128=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0* If the data area is a file, th= en grow it out to its final size
    > 3129=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0* so that the reads for the end = of the device in the mount code
    > 3130=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0* will succeed.
    > 3131=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*/
    > 3132=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (xi.disfile && ftruncate64(= xi.dfd, dblocks * blocksize) < 0) {=E2=80=8B
    >
    >
    > Before the patch, xi.disfile was 0 and so it didn't shrink the fil= e
    > to the size of the new FS. Now, what is the correct solve to this?
    > Tests are written for the old behaviour, but this shrinking seems to > be an intentional thing. It seems that the FS works ok even when this<= br> > truncating is not applied, so I think that I should remove this chunk<= br> > (or change it to xi.dcreate=3D1 only), and keep the old behaviour.
    >
    > What do you think about it, guys?

    Can't remove it; that would break the other side of things, if y= ou try
    to mkfs.xfs -d size=3D2g on an existing 1g file... mount tries to do
    IO to the last block, and if it's not truncated out, that will fail
    (as the comment says).

    I suppose the simple way to fix it is to only truncate up, never down.

    i.e. truncate to max(dblocks * blocksize, st_size) or
    if (xi.disfile && st_size <=C2=A0 dblocks * blocksize) { truncat= e ... }

    All right, it seems that I s= hould have read the man page, and not just =C2=A0look on the first sentence= or two... <emoticon of me hitting a wall with my head repeatedly>.= =C2=A0

    Now it works, thanks.

    Jan<= /div>
    =C2=A0
    --
    Jan Tulak
    jtulak@redhat.com=C2=A0/ jan@tulak.me
    --001a113ecdbe8410de05310e07f3-- From jtulak@redhat.com Fri Apr 22 02:49:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2DC567CA1 for ; Fri, 22 Apr 2016 02:49:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id F3273304051 for ; Fri, 22 Apr 2016 00:49:47 -0700 (PDT) X-ASG-Debug-ID: 1461311385-04cbb00fea96c90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id H4tqKBU6LHGWP1oY (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 22 Apr 2016 00:49:46 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6FBD010F1B1 for ; Fri, 22 Apr 2016 07:49:45 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3M7niE8004498 for ; Fri, 22 Apr 2016 03:49:44 -0400 From: Jan Tulak To: xfs@oss.sgi.com Subject: [PATCH 15/19 v2] mkfs: don't treat files as though they are block devices Date: Fri, 22 Apr 2016 09:49:43 +0200 X-ASG-Orig-Subj: [PATCH 15/19 v2] mkfs: don't treat files as though they are block devices Message-Id: <1461311383-30897-1-git-send-email-jtulak@redhat.com> In-Reply-To: <1461231593-31294-16-git-send-email-jtulak@redhat.com> References: <1461231593-31294-16-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Fri, 22 Apr 2016 07:49:45 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461311386 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11730 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner If the device is actually a file, and "-d file" is not specified, mkfs will try to treat it as a block device and get stuff wrong. Image files don't necessarily have the same sector sizes as the block device or filesystem underlying the image file, nor should we be issuing discard ioctls on image files. To fix this sanely, only require "-d file" if the device name is invalid to trigger creation of the file. Otherwise, use stat() to determine if the device is a file or block device and deal with that appropriately by setting the "isfile" variables and turning off direct IO. Then ensure that we check the "isfile" options before doing things that are specific to block devices. Other file/blockdev issues fixed: - use getstr to detect specifying the data device name twice. - check file/size/name parameters before anything else. - overwrite checks need to be done before the image file is opened and potentially truncated. - blkid_get_topology() should not be called for image files, so warn when it is called that way. - zero_old_xfs_structures() emits a spurious error: "existing superblock read failed: Success" when it is run on a truncated image file. Don't warn if we see this problem on an image file. - Don't issue discards on image files. - Use fsync() for image files, not BLKFLSBUF in platform_flush_device() for Linux. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak --- CHANGES: * call ftruncate64() only when the existing file needs to be enlarged --- libxfs/init.c | 6 ++ libxfs/linux.c | 11 +++- mkfs/xfs_mkfs.c | 178 +++++++++++++++++++++++++++++++++++++++----------------- 3 files changed, 139 insertions(+), 56 deletions(-) diff --git a/libxfs/init.c b/libxfs/init.c index 8d747e8..da3485b 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -278,6 +278,8 @@ libxfs_init(libxfs_init_t *a) a->ddev= libxfs_device_open(dname, a->dcreat, flags, a->setblksize); a->dfd = libxfs_device_to_fd(a->ddev); + platform_findsizes(dname, a->dfd, &a->dsize, + &a->dbsize); } else { if (!check_open(dname, flags, &rawfile, &blockfile)) goto done; @@ -297,6 +299,8 @@ libxfs_init(libxfs_init_t *a) a->logdev = libxfs_device_open(logname, a->lcreat, flags, a->setblksize); a->logfd = libxfs_device_to_fd(a->logdev); + platform_findsizes(dname, a->logfd, &a->logBBsize, + &a->lbsize); } else { if (!check_open(logname, flags, &rawfile, &blockfile)) goto done; @@ -316,6 +320,8 @@ libxfs_init(libxfs_init_t *a) a->rtdev = libxfs_device_open(rtname, a->rcreat, flags, a->setblksize); a->rtfd = libxfs_device_to_fd(a->rtdev); + platform_findsizes(dname, a->rtfd, &a->rtsize, + &a->rtbsize); } else { if (!check_open(rtname, flags, &rawfile, &blockfile)) goto done; diff --git a/libxfs/linux.c b/libxfs/linux.c index f6ea1b2..c9f2baf 100644 --- a/libxfs/linux.c +++ b/libxfs/linux.c @@ -125,7 +125,16 @@ platform_set_blocksize(int fd, char *path, dev_t device, int blocksize, int fata void platform_flush_device(int fd, dev_t device) { - if (major(device) != RAMDISK_MAJOR) + struct stat64 st; + if (major(device) == RAMDISK_MAJOR) + return; + + if (fstat64(fd, &st) < 0) + return; + + if (S_ISREG(st.st_mode)) + fsync(fd); + else ioctl(fd, BLKFLSBUF, 0); } diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index b1043fb..20b5eb1 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -787,7 +787,7 @@ calc_stripe_factors( #ifdef ENABLE_BLKID static int check_overwrite( - char *device) + const char *device) { const char *type; blkid_probe pr = NULL; @@ -804,7 +804,7 @@ check_overwrite( fd = open(device, O_RDONLY); if (fd < 0) goto out; - platform_findsizes(device, fd, &size, &bsz); + platform_findsizes((char *)device, fd, &size, &bsz); close(fd); /* nothing to overwrite on a 0-length device */ @@ -851,7 +851,6 @@ check_overwrite( "according to blkid\n"), progname, device); } ret = 1; - out: if (pr) blkid_free_probe(pr); @@ -877,8 +876,12 @@ static void blkid_get_topology( struct stat statbuf; /* can't get topology info from a file */ - if (!stat(device, &statbuf) && S_ISREG(statbuf.st_mode)) + if (!stat(device, &statbuf) && S_ISREG(statbuf.st_mode)) { + fprintf(stderr, + _("%s: Warning: trying to probe topology of a file %s!\n"), + progname, device); return; + } pr = blkid_new_probe_from_filename(device); if (!pr) @@ -1016,6 +1019,79 @@ static void get_topology( } static void +check_device_type( + const char *name, + int *isfile, + bool no_size, + bool no_name, + int *create, + bool force_overwrite, + const char *optname) +{ + struct stat64 statbuf; + + if (*isfile && (no_size || no_name)) { + fprintf(stderr, + _("if -%s file then -%s name and -%s size are required\n"), + optname, optname, optname); + usage(); + } + + if (name == NULL) { + usage(); + } + + if (stat64(name, &statbuf)) { + if (errno == ENOENT && *isfile) { + if (create) + *create = 1; + return; + } + + fprintf(stderr, + _("Error accessing specified device %s: %s\n"), + name, strerror(errno)); + usage(); + return; + } + + if (!force_overwrite && check_overwrite(name)) { + fprintf(stderr, + _("%s: Use the -f option to force overwrite.\n"), + progname); + exit(1); + } + + /* + * We only want to completely truncate and recreate an existing file if + * we were specifically told it was a file. Set the create flag only in + * this case to trigger that behaviour. + */ + if (S_ISREG(statbuf.st_mode)) { + if (!*isfile) + *isfile = 1; + else if (create) + *create = 1; + return; + } + + if (S_ISBLK(statbuf.st_mode)) { + if (*isfile) { + fprintf(stderr, + _("specified \"-%s file\" on a block device %s\n"), + optname, name); + usage(); + } + return; + } + + fprintf(stderr, + _("specified device %s not a file or block device\n"), + name); + usage(); +} + +static void fixup_log_stripe_unit( int lsflag, int sunit, @@ -1280,7 +1356,6 @@ zero_old_xfs_structures( __uint32_t bsize; int i; xfs_off_t off; - int tmp; /* * We open regular files with O_TRUNC|O_CREAT. Nothing to do here... @@ -1300,15 +1375,18 @@ zero_old_xfs_structures( } memset(buf, 0, new_sb->sb_sectsize); - tmp = pread(xi->dfd, buf, new_sb->sb_sectsize, 0); - if (tmp < 0) { - fprintf(stderr, _("existing superblock read failed: %s\n"), - strerror(errno)); - goto done; - } - if (tmp != new_sb->sb_sectsize) { - fprintf(stderr, - _("warning: could not read existing superblock, skip zeroing\n")); + /* + * If we are creating an image file, it might be of zero length at this + * point in time. Hence reading the existing superblock is going to + * return zero bytes. It's not a failure we need to warn about in this + * case. + */ + off = pread(xi->dfd, buf, new_sb->sb_sectsize, 0); + if (off != new_sb->sb_sectsize) { + if (!xi->disfile) + fprintf(stderr, + _("error reading existing superblock: %s\n"), + strerror(errno)); goto done; } libxfs_sb_from_disk(&sb, buf); @@ -1786,8 +1864,6 @@ main( case D_FILE: xi.disfile = getnum(value, &dopts, D_FILE); - if (xi.disfile && !Nflag) - xi.dcreat = 1; break; case D_NAME: xi.dname = getstr(value, &dopts, D_NAME); @@ -1913,11 +1989,6 @@ main( case L_FILE: xi.lisfile = getnum(value, &lopts, L_FILE); - if (xi.lisfile && loginternal) - conflict('l', subopts, L_INTERNAL, - L_FILE); - if (xi.lisfile) - xi.lcreat = 1; break; case L_INTERNAL: loginternal = getnum(value, &lopts, @@ -2075,8 +2146,6 @@ main( case R_FILE: xi.risfile = getnum(value, &ropts, R_FILE); - if (xi.risfile) - xi.rcreat = 1; break; case R_NAME: case R_DEV: @@ -2181,6 +2250,26 @@ _("Minimum block size for CRC enabled filesystems is %d bytes.\n"), lsectorsize = sectorsize; } + /* + * Before anything else, verify that we are correctly operating on + * files or block devices and set the control parameters correctly. + * Explicitly disable direct IO for image files so we don't error out on + * sector size mismatches between the new filesystem and the underlying + * host filesystem. + */ + check_device_type(dfile, &xi.disfile, !dsize, !dfile, + Nflag ? NULL : &xi.dcreat, force_overwrite, "d"); + if (!loginternal) + check_device_type(xi.logname, &xi.lisfile, !logsize, !xi.logname, + Nflag ? NULL : &xi.lcreat, + force_overwrite, "l"); + if (xi.rtname) + check_device_type(xi.rtname, &xi.risfile, !rtsize, !xi.rtname, + Nflag ? NULL : &xi.rcreat, + force_overwrite, "r"); + if (xi.disfile || xi.lisfile || xi.risfile) + xi.isdirect = 0; + memset(&ft, 0, sizeof(ft)); get_topology(&xi, &ft, force_overwrite); @@ -2331,11 +2420,6 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); } - if (xi.disfile && (!dsize || !xi.dname)) { - fprintf(stderr, - _("if -d file then -d name and -d size are required\n")); - usage(); - } if (dsize) { __uint64_t dbytes; @@ -2368,11 +2452,6 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); usage(); } - if (xi.lisfile && (!logsize || !xi.logname)) { - fprintf(stderr, - _("if -l file then -l name and -l size are required\n")); - usage(); - } if (logsize) { __uint64_t logbytes; @@ -2390,11 +2469,6 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); (long long)logbytes, blocksize, (long long)(logblocks << blocklog)); } - if (xi.risfile && (!rtsize || !xi.rtname)) { - fprintf(stderr, - _("if -r file then -r name and -r size are required\n")); - usage(); - } if (rtsize) { __uint64_t rtbytes; @@ -2516,22 +2590,14 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); xi.rtsize &= sector_mask; xi.logBBsize &= (__uint64_t)-1 << (MAX(lsectorlog, 10) - BBSHIFT); - if (!force_overwrite) { - if (check_overwrite(dfile) || - check_overwrite(logfile) || - check_overwrite(xi.rtname)) { - fprintf(stderr, - _("%s: Use the -f option to force overwrite.\n"), - progname); - exit(1); - } - } + /* don't do discards on print-only runs or on files */ if (discard && !Nflag) { - discard_blocks(xi.ddev, xi.dsize); - if (xi.rtdev) + if (!xi.disfile) + discard_blocks(xi.ddev, xi.dsize); + if (xi.rtdev && !xi.risfile) discard_blocks(xi.rtdev, xi.rtsize); - if (xi.logdev && xi.logdev != xi.ddev) + if (xi.logdev && xi.logdev != xi.ddev && !xi.lisfile) discard_blocks(xi.logdev, xi.logBBsize); } @@ -3063,10 +3129,12 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), * so that the reads for the end of the device in the mount code * will succeed. */ - if (xi.disfile && ftruncate64(xi.dfd, dblocks * blocksize) < 0) { - fprintf(stderr, _("%s: Growing the data section failed\n"), - progname); - exit(1); + if (xi.disfile && xi.dsize*xi.dbsize < dblocks * blocksize) { + if (ftruncate64(xi.dfd, dblocks * blocksize) < 0) { + fprintf(stderr, _("%s: Growing the data section failed\n"), + progname); + exit(1); + } } /* -- 2.5.0 From prvs=913859f0c=Stephane.Larose@ibis.ulaval.ca Fri Apr 22 08:53:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9D6797CA0 for ; Fri, 22 Apr 2016 08:53:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 00B8CAC001 for ; Fri, 22 Apr 2016 06:53:13 -0700 (PDT) X-ASG-Debug-ID: 1461333189-04cb6c09a1bcb50001-NocioJ Received: from exch-spam02.ulaval.ca (exch-spam02.ulaval.ca [132.203.244.24]) by cuda.sgi.com with ESMTP id gauXRoFmS9zOjCYr (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 22 Apr 2016 06:53:10 -0700 (PDT) X-Barracuda-Envelope-From: prvs=913859f0c=Stephane.Larose@ibis.ulaval.ca X-Barracuda-Effective-Source-IP: exch-spam02.ulaval.ca[132.203.244.24] X-Barracuda-Apparent-Source-IP: 132.203.244.24 Received: from exch-edge02.ulaval.ca ([132.203.244.22]) by exch-spam02.ulaval.ca with ESMTP/TLS/AES128-SHA; 22 Apr 2016 09:53:10 -0400 Received: from UL-EXC-PR-MBX12.ulaval.ca (10.40.67.112) by EXCH-EDGE02.ulaval.ca (132.203.244.22) with Microsoft SMTP Server (TLS) id 8.3.342.0; Fri, 22 Apr 2016 09:53:09 -0400 Received: from UL-EXC-PR-MBX11.ulaval.ca (10.40.67.111) by ul-exc-pr-mbx12.ulaval.ca (10.40.67.112) with Microsoft SMTP Server (TLS) id 15.0.1044.25; Fri, 22 Apr 2016 09:53:09 -0400 Received: from UL-EXC-PR-MBX11.ulaval.ca ([fe80::a088:6c2b:99d1:cec0]) by ul-exc-pr-mbx11.ulaval.ca ([fe80::a088:6c2b:99d1:cec0%25]) with mapi id 15.00.1044.021; Fri, 22 Apr 2016 09:53:09 -0400 From: =?utf-8?B?U3TDqXBoYW5lIExhcm9zZQ==?= To: "xfs@oss.sgi.com" Subject: RE: xfs_repair couldn't verify primary superblock Thread-Topic: xfs_repair couldn't verify primary superblock X-ASG-Orig-Subj: RE: xfs_repair couldn't verify primary superblock Thread-Index: AdGbK6ay8c20JfnqTlycBWFFEgycSwANv5uAAB16EtAAEVdiAAAfxWfw Date: Fri, 22 Apr 2016 13:53:08 +0000 Message-ID: <73782a0bcaa6496f9906ba3e11d46d11@ul-exc-pr-mbx11.ulaval.ca> References: <5717E2EF.1080902@sandeen.net> <7ce740a1888c4bb28ce3c30fcedbe703@ul-exc-pr-mbx11.ulaval.ca> <57191D20.7020402@sandeen.net> In-Reply-To: <57191D20.7020402@sandeen.net> Accept-Language: fr-CA, en-US Content-Language: fr-FR X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-exchange-transport-fromentityheader: Hosted x-originating-ip: [132.203.160.225] Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-Barracuda-Connect: exch-spam02.ulaval.ca[132.203.244.24] X-Barracuda-Start-Time: 1461333190 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1610 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.28964 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... SGkgRXJpYywNCg0KWWVzLCB0aGF0IGNvdWxkIGJlIHRoZSBwcm9ibGVtLiBJIGhhdmUgYW5vdGhl ciBob3N0IHRoYXQgaGF2ZSBhY2Nlc3MgdG8gdGhlIHNhbWUgTFVOLiBPbiB0aGUgb3RoZXIgaG9z dCwgSSBoYWQgYSBwcm9ibGVtIGRvaW5nIGEgbGl2ZSBleHRlbmQgb2YgYW4gZXh0MyBmaWxlc3lz dGVtIGluIHRoZSBzYW1lIExWTSBWb2x1bWUgR3JvdXAuIE1heWJlIHRoaXMgY29ycnVwdGVkIHRo ZSBYRlMgZmlsZXN5c3RlbS4gQW55d2F5LCB3ZSBkZWNpZGVkIHRoaXMgbW9ybmluZyB0byBkZWxl dGUgdGhlIHBhcnRpdGlvbiBhbmQgcmVjcmVhdGUgdGhlIGZpbGVzeXN0ZW0uIFdlIHdpbGwgYmUg YWJsZSB0byByZWdlbmVyYXRlIHRoZSBkYXRhIHRoYXQgd2FzIG9uIGl0Lg0KDQpUaGFua3MsDQoN ClN0w6lwaGFuZQ0KDQotLS0tLU1lc3NhZ2UgZCdvcmlnaW5lLS0tLS0NCkRlwqA6IHhmcy1ib3Vu Y2VzQG9zcy5zZ2kuY29tIFttYWlsdG86eGZzLWJvdW5jZXNAb3NzLnNnaS5jb21dIERlIGxhIHBh cnQgZGUgRXJpYyBTYW5kZWVuDQpFbnZvecOpwqA6IDIxIGF2cmlsIDIwMTYgMTQ6MzQNCsOAwqA6 IHhmc0Bvc3Muc2dpLmNvbQ0KT2JqZXTCoDogUmU6IHhmc19yZXBhaXIgY291bGRuJ3QgdmVyaWZ5 IHByaW1hcnkgc3VwZXJibG9jaw0KDQpPbiA0LzIxLzE2IDEwOjQyIEFNLCBTdMOpcGhhbmUgTGFy b3NlIHdyb3RlOg0KPiBIaSBFcmljLA0KPiANCj4gTm90aGluZyBtb3JlIGludGVyZXN0aW5nLiBG cm9tIHRoZSBsb2c6DQo+IA0KPiAyMDE2LTA0LTA0VDE0OjQ4OjQ4LjczNTczOC0wNDowMCBtYW5p dG91IGtlcm5lbDogWzI3MTIxMS41NDg4NzhdIFhGUyANCj4gKGRtLTI0KTogTW91bnRpbmcgVjQg RmlsZXN5c3RlbQ0KPiAyMDE2LTA0LTA0VDE0OjQ4OjQ4Ljg4MjczOC0wNDowMCBtYW5pdG91IGtl cm5lbDogWzI3MTIxMS42OTQyNDJdIFhGUyANCj4gKGRtLTI0KTogRW5kaW5nIGNsZWFuIG1vdW50 DQo+IA0KPiBUaGVuIG5vIG1vcmUgbG9ncyBhYm91dCBkbS0yNC4NCj4gDQo+IEFsc28gbm8gZXJy b3JzIGZyb20gdGhlIHVuZGVybHlpbmcgc3RvcmFnZSAodmVyaWZpZWQgaW4gU0FOdHJpY2l0eSkg DQo+IHdoaWNoIGlzIGFuIElTNTAwMC4gVGhlIGZpbGVzeXN0ZW0gd2FzIG5ldywgdGhlIGZpcnN0 IG1vdW50IHdhcyBvbiANCj4gMjAxNi0wNC0wNC4NCj4gDQo+IG1hbml0b3U6fiAjIGJsa2lkIC9k ZXYvZG0tMjQNCj4gL2Rldi9kbS0yNDogVVVJRD0iMWRhMjJhZTItYTU3Mi00ZGI3LWIxNzctYjkw MDIxYTIwODYzIiBUWVBFPSJ4ZnMiDQo+IA0KPiBUaGFuayB5b3UgZm9yIHlvdXIgaGVscCwNCg0K QW55IGNoYW5jZSB0aGF0IHNvbWUgb3RoZXIgaG9zdCBpcyBhY2Nlc3NpbmcgdGhlIHNhbWUgTFVO IG9uIHRoZSBTQU4/DQoNClRoaXMgcmVhbGx5IGxvb2tzIGxpa2Ugc29tZXRoaW5nIGV4dGVybmFs IGNvcnJ1cHRlZCB0aGUgZmlsZXN5c3RlbSBieSB3cml0aW5nIG92ZXIgaXQuLi4NCg0KLUVyaWMN Cg0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCnhmcyBt YWlsaW5nIGxpc3QNCnhmc0Bvc3Muc2dpLmNvbQ0KaHR0cDovL29zcy5zZ2kuY29tL21haWxtYW4v bGlzdGluZm8veGZzDQo= From yh2@bbinzrsx.com Fri Apr 22 22:26:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=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 334FE7CA0 for ; Fri, 22 Apr 2016 22:26:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DD4208F8039 for ; Fri, 22 Apr 2016 20:26:13 -0700 (PDT) X-ASG-Debug-ID: 1461381966-04bdf0358e110840001-NocioJ Received: from c.bbinzrsx.com ([103.240.182.23]) by cuda.sgi.com with ESMTP id Q0cbBvKRFAfA6T2T for ; Fri, 22 Apr 2016 20:26:07 -0700 (PDT) X-Barracuda-Envelope-From: yh2@bbinzrsx.com X-Barracuda-Effective-Source-IP: UNKNOWN[103.240.182.23] X-Barracuda-Apparent-Source-IP: 103.240.182.23 Received: from uzdimquy (unknown [183.237.187.167]) by c.bbinzrsx.com (Postfix) with ESMTPA id 9E0FB407F for ; Sat, 23 Apr 2016 11:26:14 +0800 (CST) Date: Sat, 23 Apr 2016 11:25:09 +0800 From: "yh2" Reply-To: 2788662455@qq.com To: "xfs" Subject: =?GB2312?B?1rvSqsTjxNzP66Os1rvSqsTjz+vX9qOsv827p7K7ysfOyszio6zLq8+yyO28?= =?GB2312?B?/rDvxPq94r72o6GjoVFRo7oyNzg4NjYyNDU1?= Message-ID: <201604231125096754680@bbinzrsx.com> X-ASG-Orig-Subj: =?GB2312?B?1rvSqsTjxNzP66Os1rvSqsTjz+vX9qOsv827p7K7ysfOyszio6zLq8+yyO28?= =?GB2312?B?/rDvxPq94r72o6GjoVFRo7oyNzg4NjYyNDU1?= 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[103.240.182.23] X-Barracuda-Start-Time: 1461381966 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1602 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.10 X-Barracuda-Spam-Status: No, SCORE=2.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0141, HTML_MESSAGE, MIME_HTML_ONLY, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28981 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 2.00 BSF_SC0_MV0141 Custom rule MV0141 PGh0bWw+DQogIDxoZWFkPg0KICAgIDx0aXRsZT48L3RpdGxlPg0KICAgIDxtZXRhIGNvbnRlbnQ9 InRleHQvaHRtbDsgY2hhcnNldD1nYjIzMTIiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4N CiAgPC9oZWFkPg0KICA8Ym9keT4NCiAgICA8ZGl2PiYjMjQ3NDQ7JiMyMjkwOTsgPC9kaXY+DQog ICAgPGRpdj4mIzIyODA2OyYjMzYxNTI7JiMzMzgyOTsmIzM4MTQ0OyYjMzYyMzQ7JiMyNjQ2OTsm IzM2MjM0OyYjMzg1OTA7JiMyMDU3MDsmIzIwMTAyOyYjMTIyOTA7JiMyNDc0NDsmIzI2MTU5OyYj MjE1NDI7JiMyMTQ1NzsmIzI5NjE2OyYjNjUyOTI7JiMyNTEwNTsmIzIwMjA0OyYjMzAzNDA7JiMy NDMyMDsmIzIxNDU3OyYjMjA0NDk7JiMyNDYzNTsmIzI2MTU5OyYjMjEwNDA7JiMxOTk4MTsmIzIw MTAyOyYjMjM0NTg7JiMyNTE0MzsmIzMwMzQwOyYjMzcwMjc7JiMzNzMyNDsmIzIxNDM1OyYjMTIy OTA7PC9kaXY+DQogICAgPGRpdj4mIzM2NzE5OyYjMjAyMTQ7JiMzMDM0MDsmIzI2MTAyOyYjMjAx OTU7JiMyNjQ2OTsmIzIwMDIwOyYjMjAxMDI7JiM2NTI5MjsmIzI1MTA1OyYjMjAyMDQ7JiMyMDAy NjsmIzIwMzA5OyYjMTk5ODE7JiMzNjg3MzsmIzI1MzIxOyYjMzY4OTA7JiMzNjgwNzsmIzM2NzE5 OyYjMjAyMTQ7JiMyNDMyMDsmIzIxNDU3OyYjMjM0NTg7JiMyNTE0MzsmIzMwMzQwOyYjMjYwNDE7 JiMyNDMzNTsmIzIxNjAyOyYjNjUzMTE7PC9kaXY+DQogICAgPGRpdj4mIzI1MTA1OyYjMjE0OTY7 JiMzNjcxOTsmIzIwMjE0OyYjMzg1OTg7JiMyNTEwNDsmIzIwODQwOyYjMjk2OTk7JiMyMTUwODsm IzIyODIzOyYjMjU2Mjg7JiMzMjAzNDsmIzI0MzQxOyYjMjU4MDY7JiM2NTI5MjsmIzI3NTk5OyYj MjI4MjU7JiMyMTQ4NzsmIzIwMTk3OyYjMjAwMjY7JiMyNDc0NDsmIzI1NjI4OyYjMzIwMzQ7JiMx OTk3ODsmIzE5OTc1OyYjMzAzNDA7JiMyMzQ1ODsmIzI1MTQzOyYjMzI4NTI7JiMzMTk5NTsmIzI2 MDQxOyYjMjQzMzU7OyYjMzY3MTk7JiMyMDIxNDsmIzM2ODI0OyYjMjE0ODc7JiMyMDE5NzsmIzIx NDU3OyYjMzY4NjU7JiMxOTk2ODsmIzIzNTQ1OyYjMTk5Njg7JiMzMDM0MDsmIzIzNDU4OyYjMjUx NDM7JiMyNDMyMDsmIzIxNDU3OyYjMjA0NDk7JiM2NTI5MjsmIzM2ODkwOyYjMzY4MDc7JiMyOTQy MDsmIzI2Mzc3OyYjMzAzNDA7JiMyODAyMzsmIzIyODA2OyYjMjk0MjA7JiMzMTQzNTsmIzI2Mzgx OyYjMjExNTM7JiMyMjEyMDsmIzY1MjkyOyYjMjIyNjk7JiMyMjgwNjsmIzMwMzQwO0lQJiM2NTI5 MjsmIzIwNDQ5OyYjMzU0NjU7JiMyNDIzMDsmIzM5NjQwOyYjNjUyOTI7JiMzNTc1MzsmIzI1MTA1 OyYjMjAyMDQ7JiMzMDM0MDsmIzI0MzIwOyYjMjE0NTc7JiMyMDQ0OTsmIzMwMzQwOyYjMjEwNDA7 JiMzNjc5ODsmIzI5NTc1OyYjMjYzNTY7JiMzOTY0MDsmIzEyMjkwOyA8L2Rpdj4NCiAgICA8ZGl2 PiZuYnNwOzwvZGl2Pg0KICAgIDxkaXY+PT09PT09PT09PT09PT09PT09PT09PT09PT09IA0KICAg ICAgPGRpdj4mbmJzcDs8L2Rpdj4NCiAgICAgIDxkaXY+JiMzNTgzMTsmIzI4MTU1OyYjMjExNTI7 JiMyNjYzMTsmIzM5MDY0O1E8L2Rpdj49PT09PT09PQ0KICAgIDwvZGl2Pg0KICA8L2JvZHk+DQo8 L2h0bWw+ From VpxFedC@inbox.ru Sat Apr 23 10:58:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.4 required=5.0 tests=BASE64_LENGTH_79_INF, FREEMAIL_FROM,MIME_BASE64_BLANKS 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 5BD227CA2 for ; Sat, 23 Apr 2016 10:58:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 13C6A8F8037 for ; Sat, 23 Apr 2016 08:58:49 -0700 (PDT) X-ASG-Debug-ID: 1461427122-04bdf0359018f720001-NocioJ Received: from cdn66-171-236-18.gigecdn.com (hosted.at.gigecdn.com [66.171.236.18]) by cuda.sgi.com with ESMTP id JOY9qFjJCwBXzB5i (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 23 Apr 2016 08:58:42 -0700 (PDT) X-Barracuda-Envelope-From: VpxFedC@inbox.ru X-Barracuda-Effective-Source-IP: hosted.at.gigecdn.com[66.171.236.18] X-Barracuda-Apparent-Source-IP: 66.171.236.18 Received: from cdn66-171-236-18.gigecdn.com (localhost.localdomain [127.0.0.1]) by cdn66-171-236-18.gigecdn.com (8.14.4/8.14.4) with ESMTP id u3NFuPvk023673; Sat, 23 Apr 2016 10:56:40 -0500 Received: (from fozzi@localhost) by cdn66-171-236-18.gigecdn.com (8.14.4/8.14.4/Submit) id u3NFtRIW022875; Sat, 23 Apr 2016 10:55:27 -0500 Date: Sat, 23 Apr 2016 10:55:27 -0500 Message-Id: <201604231555.u3NFtRIW022875@cdn66-171-236-18.gigecdn.com> X-Authentication-Warning: cdn66-171-236-18.gigecdn.com: fozzi set sender to VpxFedC@inbox.ru using -f To: vobivyk@mo.org, roiza@teleport.net.ru, ssadfasqwefedfjfd@zadonsk.net, seo@sleipnirs.ru, viktor.vik12345@gmail.com, tyshch.serge@gmail.com, uraltralservis@mail.ru, saveliev@peter-greot.ru, xfs@oss.sgi.com, theo_mandel@compuserve.com, umnoc@ameros-sudan.ru, svyat@volgograd.kommersant.ru, rainjuwka@rambler.ru, verar@dp.ru, t.kamanova@rim-saratov.ru, sthumbkc@zjqnhmqg.com, yulia@smerdova.ru, tividum@moy.com, radionika046@mail.ru, takt-tula@mail.ru Subject: =?utf-8?B?0JzQsNGI0LjQvdCwINGD0LbQtSDRgyDQv9C+0LTRitC10LfQtNCwLg==?= X-PHP-Originating-Script: 48:hostdata112.php X-ASG-Orig-Subj: =?utf-8?B?0JzQsNGI0LjQvdCwINGD0LbQtSDRgyDQv9C+0LTRitC10LfQtNCwLg==?= From: =?utf-8?B?0J/QviDQstGL0LfQvtCy0YMg0YLQsNC60YHQuA==?= Subject: =?utf-8?B?0JzQsNGI0LjQvdCwINGD0LbQtSDRgyDQv9C+0LTRitC10LfQtNCwLg==?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?utf-8?B?0JzQsNGI0LjQvdCwINGD0LbQtSDRgyDQv9C+0LTRitC10LfQtNCwLg==?= Content-Type: text/plain; charset=UTF-8; Content-Transfer-Encoding: base64 X-Barracuda-Connect: hosted.at.gigecdn.com[66.171.236.18] X-Barracuda-Start-Time: 1461427122 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 423 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_MISMATCH_TO, FH_HELO_EQ_D_D_D_D, MIME_BASE64_BLANKS X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.28994 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 MIME_BASE64_BLANKS RAW: Extra blank lines in base64 encoding 0.50 FH_HELO_EQ_D_D_D_D Helo is d-d-d-d 0JHQtdGB0L/Qu9Cw0YLQvdCw0Y8g0L/QvtC00LDRh9CwINC80LDRiNC40L0g0L/QviDQs9C+0YDQvtC00YMgKNC60YDRg9Cz0LvQvtGB0YPRgtC+0YfQvdC+KS4gLSAK0JzQsNGI0LjQvdGLICLRjdC60L7QvdC+0LwiINC4ICLQutC+0LzRhNC+0YDRgiIg0LrQu9Cw0YHRgdCwLgrQn9GA0L7QstC+0LTRiyDQuCDQstGB0YLRgNC10YfQuCDQvdCwINCy0L7QutC30LDQu9Cw0YUg0Lgg0LIg0LDRjdGA0L7Qv9C+0YDRgtCw0YUuCtCf0YDQtdC00LvQsNCz0LDQtdC8INGD0YHQu9GD0LPRgyAi0YLRgNC10LfQstGL0Lkg0LLQvtC00LjRgtC10LvRjCIuCtCU0L7RgdGC0LDQstC60LAg0YbQstC10YLQvtCyINC4INC/0L7QtNCw0YDQutC+0LIuCtCe0LHRgdC70YPQttC40LLQsNC90LjQtSDRgdCy0LDQtNC10LEuIC0gaHR0cDovL3RheGktc2hvZmVyLnJ1 From vishal.l.verma@intel.com Sat Apr 23 13:08:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C27D17CA4 for ; Sat, 23 Apr 2016 13:08:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 782D88F804B for ; Sat, 23 Apr 2016 11:08:43 -0700 (PDT) X-ASG-Debug-ID: 1461434919-04bdf0358e19ec60001-NocioJ Received: from mga14.intel.com ([192.55.52.115]) by cuda.sgi.com with ESMTP id rzlIGPr5mAu8AhoB for ; Sat, 23 Apr 2016 11:08:39 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Effective-Source-IP: UNKNOWN[192.55.52.115] X-Barracuda-Apparent-Source-IP: 192.55.52.115 X-ASG-Whitelist: Client Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga103.fm.intel.com with ESMTP; 23 Apr 2016 11:08:40 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,523,1455004800"; d="scan'208";a="938742937" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by orsmga001.jf.intel.com with ESMTP; 23 Apr 2016 11:08:40 -0700 Received: from fmsmsx102.amr.corp.intel.com (10.18.124.200) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.248.2; Sat, 23 Apr 2016 11:08:38 -0700 Received: from fmsmsx113.amr.corp.intel.com ([169.254.13.211]) by FMSMSX102.amr.corp.intel.com ([169.254.10.110]) with mapi id 14.03.0248.002; Sat, 23 Apr 2016 11:08:38 -0700 From: "Verma, Vishal L" To: "hch@infradead.org" , "jmoyer@redhat.com" CC: "Wilcox, Matthew R" , "linux-kernel@vger.kernel.org" , "linux-block@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-nvdimm@ml01.01.org" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , "david@fromorbit.com" , "jack@suse.cz" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Thread-Topic: [PATCH v2 5/5] dax: handle media errors in dax_do_io X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Thread-Index: AQHRlzGOmdVyB28MyEyyQ/rUxU8Y+Z+T1f2AgASHRwA= Date: Sat, 23 Apr 2016 18:08:37 +0000 Message-ID: <1461434916.3695.7.camel@intel.com> References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <20160420205923.GA24797@infradead.org> In-Reply-To: <20160420205923.GA24797@infradead.org> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.254.113.52] Content-Type: text/plain; charset="utf-8" Content-ID: <627BD94691203943AE9F3F8DCFC1876B@intel.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-Barracuda-Connect: UNKNOWN[192.55.52.115] X-Barracuda-Start-Time: 1461434919 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1465 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 T24gV2VkLCAyMDE2LTA0LTIwIGF0IDEzOjU5IC0wNzAwLCBDaHJpc3RvcGggSGVsbHdpZyB3cm90 ZToNCj4gT24gRnJpLCBBcHIgMTUsIDIwMTYgYXQgMTI6MTE6MzZQTSAtMDQwMCwgSmVmZiBNb3ll ciB3cm90ZToNCj4gPiANCj4gPiA+IA0KPiA+ID4gKwlpZiAoSVNfREFYKGlub2RlKSkgew0KPiA+ ID4gKwkJcmV0ID0gZGF4X2RvX2lvKGlvY2IsIGlub2RlLCBpdGVyLCBvZmZzZXQsDQo+ID4gPiBi bGtkZXZfZ2V0X2Jsb2NrLA0KPiA+ID4gwqAJCQkJTlVMTCwgRElPX1NLSVBfRElPX0NPVU5UKTsN Cj4gPiA+ICsJCWlmIChyZXQgPT0gLUVJTyAmJiAoaW92X2l0ZXJfcncoaXRlcikgPT0gV1JJVEUp KQ0KPiA+ID4gKwkJCXJldF9zYXZlZCA9IHJldDsNCj4gPiA+ICsJCWVsc2UNCj4gPiA+ICsJCQly ZXR1cm4gcmV0Ow0KPiA+ID4gKwl9DQo+ID4gPiArDQo+ID4gPiArCXJldCA9IF9fYmxvY2tkZXZf ZGlyZWN0X0lPKGlvY2IsIGlub2RlLCBJX0JERVYoaW5vZGUpLA0KPiA+ID4gaXRlciwgb2Zmc2V0 LA0KPiA+ID4gwqAJCQkJwqDCoMKgwqBibGtkZXZfZ2V0X2Jsb2NrLCBOVUxMLA0KPiA+ID4gTlVM TCwNCj4gPiA+IMKgCQkJCcKgwqDCoMKgRElPX1NLSVBfRElPX0NPVU5UKTsNCj4gPiA+ICsJaWYg KHJldCA8IDAgJiYgcmV0X3NhdmVkKQ0KPiA+ID4gKwkJcmV0dXJuIHJldF9zYXZlZDsNCj4gPiA+ ICsNCj4gPiBIbW0sIGRpZCB5b3UganVzdCBicmVhayBhc3luYyBESU8/wqDCoEkgdGhpbmsgeW91 IGRpZCHCoMKgOikNCj4gPiBfX2Jsb2NrZGV2X2RpcmVjdF9JTyBjYW4gcmV0dXJuIC1FSU9DQlFV RVVFRCwgYW5kIHlvdSd2ZSBub3cgdHVybmVkDQo+ID4gdGhhdA0KPiA+IGludG8gLUVJTy7CoMKg UmVhbGx5LCBJIGRvbid0IHNlZSBhIHJlYXNvbiB0byBzYXZlIHRoYXQgZmlyc3QNCj4gPiAtRUlP LsKgwqBUaGUNCj4gPiBzYW1lIGFwcGxpZXMgdG8gYWxsIGluc3RhbmNlcyBpbiB0aGlzIHBhdGNo Lg0KPiBZZXMsIHRoZXJlIGlzIG5vIHBvaW50IGluIHNhdmluZyB0aGUgZWFybGllciBlcnJvciAt IGp1c3QgcmV0dXJuIHRoZQ0KPiBzZWNvbmQgZXJyb3IgYWxsIHRoZSB0aW1lLg0KDQpJcyBpdCBv ayB0byBkbyB0aGF0Pw0KDQpkaXJlY3RfSU8gbWlnaHQgZmFpbCB3aXRoIC1FSU5WQUwgZHVlIHRv IG1pc2FsaWdubWVudCwgb3IgLUVOT01FTSBkdWUNCnRvIHNvbWUgYWxsb2NhdGlvbiBmYWlsaW5n LCBhbmQgSSB0aG91Z2h0IHdlIHNob3VsZCByZXR1cm4gdGhlIG9yaWdpbmFsDQotRUlPIGluIHN1 Y2ggY2FzZXMgc28gdGhhdCB0aGUgYXBwbGljYXRpb24gZG9lc24ndCBsb3NlIHRoZSBpbmZvcm1h dGlvbg0KdGhhdCB0aGUgYmFkIGJsb2NrIGlzIGFjdHVhbGx5IGNhdXNpbmcgdGhlIGVycm9yLg0K DQo+IA0KPiBFLmcuDQo+IA0KPiAJcmV0ID0gZGF4X2lvKCk7DQo+IAlpZiAoZGF4X25lZWRfZGlv X3JldHJ5KHJldCkpDQo+IAkJcmV0ID0gZGlyZWN0X0lPKCk7DQo+IA== From vishal.l.verma@intel.com Sat Apr 23 14:14:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id ACD247CA7 for ; Sat, 23 Apr 2016 14:14:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 80A518F8033 for ; Sat, 23 Apr 2016 12:14:00 -0700 (PDT) X-ASG-Debug-ID: 1461438837-04cbb00fea195fb0002-NocioJ Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by cuda.sgi.com with ESMTP id T5KoyQKbKln9USgH for ; Sat, 23 Apr 2016 12:13:59 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Effective-Source-IP: mga03.intel.com[134.134.136.65] X-Barracuda-Apparent-Source-IP: 134.134.136.65 X-ASG-Whitelist: Client Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga103.jf.intel.com with ESMTP; 23 Apr 2016 12:13:58 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,523,1455004800"; d="scan'208";a="965085678" Received: from omniknight.lm.intel.com ([10.232.112.171]) by fmsmga002.fm.intel.com with ESMTP; 23 Apr 2016 12:13:58 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Dan Williams , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig , Jeff Moyer , "Kirill A. Shutemov" Subject: [PATCH v3 1/7] block, dax: pass blk_dax_ctl through to drivers Date: Sat, 23 Apr 2016 13:13:36 -0600 X-ASG-Orig-Subj: [PATCH v3 1/7] block, dax: pass blk_dax_ctl through to drivers Message-Id: <1461438822-3592-2-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1461438822-3592-1-git-send-email-vishal.l.verma@intel.com> References: <1461438822-3592-1-git-send-email-vishal.l.verma@intel.com> X-Barracuda-Connect: mga03.intel.com[134.134.136.65] X-Barracuda-Start-Time: 1461438838 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6648 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dan Williams This is in preparation for doing badblocks checking against the requested sector range in the driver. Currently we opportunistically return as much data that can be "dax'd" starting at the given sector. When errors are present we want to limit that range to the first encountered error, or fail the dax request if the range encompasses an error. Signed-off-by: Dan Williams --- arch/powerpc/sysdev/axonram.c | 10 +++++----- drivers/block/brd.c | 9 +++++---- drivers/nvdimm/pmem.c | 9 +++++---- drivers/s390/block/dcssblk.c | 12 ++++++------ fs/block_dev.c | 2 +- include/linux/blkdev.h | 3 +-- 6 files changed, 23 insertions(+), 22 deletions(-) diff --git a/arch/powerpc/sysdev/axonram.c b/arch/powerpc/sysdev/axonram.c index 0d112b9..d85673f 100644 --- a/arch/powerpc/sysdev/axonram.c +++ b/arch/powerpc/sysdev/axonram.c @@ -139,17 +139,17 @@ axon_ram_make_request(struct request_queue *queue, struct bio *bio) /** * axon_ram_direct_access - direct_access() method for block device - * @device, @sector, @data: see block_device_operations method + * @dax: see block_device_operations method */ static long -axon_ram_direct_access(struct block_device *device, sector_t sector, - void __pmem **kaddr, pfn_t *pfn) +axon_ram_direct_access(struct block_device *device, struct blk_dax_ctl *dax) { + sector_t sector = get_start_sect(device) + dax->sector; struct axon_ram_bank *bank = device->bd_disk->private_data; loff_t offset = (loff_t)sector << AXON_RAM_SECTOR_SHIFT; - *kaddr = (void __pmem __force *) bank->io_addr + offset; - *pfn = phys_to_pfn_t(bank->ph_addr + offset, PFN_DEV); + dax->addr = (void __pmem __force *) bank->io_addr + offset; + dax->pfn = phys_to_pfn_t(bank->ph_addr + offset, PFN_DEV); return bank->size - offset; } diff --git a/drivers/block/brd.c b/drivers/block/brd.c index 51a071e..71521c1 100644 --- a/drivers/block/brd.c +++ b/drivers/block/brd.c @@ -380,9 +380,10 @@ static int brd_rw_page(struct block_device *bdev, sector_t sector, } #ifdef CONFIG_BLK_DEV_RAM_DAX -static long brd_direct_access(struct block_device *bdev, sector_t sector, - void __pmem **kaddr, pfn_t *pfn) +static long brd_direct_access(struct block_device *bdev, + struct blk_dax_ctl *dax) { + sector_t sector = get_start_sect(bdev) + dax->sector; struct brd_device *brd = bdev->bd_disk->private_data; struct page *page; @@ -391,8 +392,8 @@ static long brd_direct_access(struct block_device *bdev, sector_t sector, page = brd_insert_page(brd, sector); if (!page) return -ENOSPC; - *kaddr = (void __pmem *)page_address(page); - *pfn = page_to_pfn_t(page); + dax->addr = (void __pmem *)page_address(page); + dax->pfn = page_to_pfn_t(page); return PAGE_SIZE; } diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c index f798899..f72733c 100644 --- a/drivers/nvdimm/pmem.c +++ b/drivers/nvdimm/pmem.c @@ -181,14 +181,15 @@ static int pmem_rw_page(struct block_device *bdev, sector_t sector, return rc; } -static long pmem_direct_access(struct block_device *bdev, sector_t sector, - void __pmem **kaddr, pfn_t *pfn) +static long pmem_direct_access(struct block_device *bdev, + struct blk_dax_ctl *dax) { + sector_t sector = get_start_sect(bdev) + dax->sector; struct pmem_device *pmem = bdev->bd_disk->private_data; resource_size_t offset = sector * 512 + pmem->data_offset; - *kaddr = pmem->virt_addr + offset; - *pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags); + dax->addr = pmem->virt_addr + offset; + dax->pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags); return pmem->size - pmem->pfn_pad - offset; } diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c index b839086..613f587 100644 --- a/drivers/s390/block/dcssblk.c +++ b/drivers/s390/block/dcssblk.c @@ -30,8 +30,8 @@ static int dcssblk_open(struct block_device *bdev, fmode_t mode); static void dcssblk_release(struct gendisk *disk, fmode_t mode); static blk_qc_t dcssblk_make_request(struct request_queue *q, struct bio *bio); -static long dcssblk_direct_access(struct block_device *bdev, sector_t secnum, - void __pmem **kaddr, pfn_t *pfn); +static long dcssblk_direct_access(struct block_device *bdev, + struct blk_dax_ctl *dax) static char dcssblk_segments[DCSSBLK_PARM_LEN] = "\0"; @@ -883,9 +883,9 @@ fail: } static long -dcssblk_direct_access (struct block_device *bdev, sector_t secnum, - void __pmem **kaddr, pfn_t *pfn) +dcssblk_direct_access(struct block_device *bdev, struct blk_dax_ctl *dax) { + sector_t secnum = get_start_sect(bdev) + dax->sector; struct dcssblk_dev_info *dev_info; unsigned long offset, dev_sz; @@ -894,8 +894,8 @@ dcssblk_direct_access (struct block_device *bdev, sector_t secnum, return -ENODEV; dev_sz = dev_info->end - dev_info->start; offset = secnum * 512; - *kaddr = (void __pmem *) (dev_info->start + offset); - *pfn = __pfn_to_pfn_t(PFN_DOWN(dev_info->start + offset), PFN_DEV); + dax->addr = (void __pmem *) (dev_info->start + offset); + dax->pfn = __pfn_to_pfn_t(PFN_DOWN(dev_info->start + offset), PFN_DEV); return dev_sz - offset; } diff --git a/fs/block_dev.c b/fs/block_dev.c index b25bb23..79defba 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -488,7 +488,7 @@ long bdev_direct_access(struct block_device *bdev, struct blk_dax_ctl *dax) sector += get_start_sect(bdev); if (sector % (PAGE_SIZE / 512)) return -EINVAL; - avail = ops->direct_access(bdev, sector, &dax->addr, &dax->pfn); + avail = ops->direct_access(bdev, dax); if (!avail) return -ERANGE; if (avail > 0 && avail & ~PAGE_MASK) diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 669e419..9d8c6d5 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1656,8 +1656,7 @@ struct block_device_operations { int (*rw_page)(struct block_device *, sector_t, struct page *, int rw); int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); - long (*direct_access)(struct block_device *, sector_t, void __pmem **, - pfn_t *); + long (*direct_access)(struct block_device *, struct blk_dax_ctl *dax); unsigned int (*check_events) (struct gendisk *disk, unsigned int clearing); /* ->media_changed() is DEPRECATED, use ->check_events() instead */ -- 2.5.5 From vishal.l.verma@intel.com Sat Apr 23 14:14:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D614D7CAE for ; Sat, 23 Apr 2016 14:14:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A99528F8033 for ; Sat, 23 Apr 2016 12:13:58 -0700 (PDT) X-ASG-Debug-ID: 1461438837-04cbb00fea195fb0001-NocioJ Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by cuda.sgi.com with ESMTP id 5HE7BBZLtDYGgShO for ; Sat, 23 Apr 2016 12:13:57 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Effective-Source-IP: mga03.intel.com[134.134.136.65] X-Barracuda-Apparent-Source-IP: 134.134.136.65 X-ASG-Whitelist: Client Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga103.jf.intel.com with ESMTP; 23 Apr 2016 12:13:56 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,523,1455004800"; d="scan'208";a="965085667" Received: from omniknight.lm.intel.com ([10.232.112.171]) by fmsmga002.fm.intel.com with ESMTP; 23 Apr 2016 12:13:55 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Vishal Verma , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dan Williams , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig , Jeff Moyer , "Kirill A. Shutemov" Subject: [PATCH v3 0/7] dax: handling media errors Date: Sat, 23 Apr 2016 13:13:35 -0600 X-ASG-Orig-Subj: [PATCH v3 0/7] dax: handling media errors Message-Id: <1461438822-3592-1-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 X-Barracuda-Connect: mga03.intel.com[134.134.136.65] X-Barracuda-Start-Time: 1461438837 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2741 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Until now, dax has been disabled if media errors were found on any device. This series attempts to address that. The first three patches from Dan re-enable dax even when media errors are present. The fourth patch from Matthew removes the zeroout path from dax entirely, making zeroout operations always go through the driver (The motivation is that if a backing device has media errors, and we create a sparse file on it, we don't want the initial zeroing to happen via dax, we want to give the block driver a chance to clear the errors). The fifth patch changes the behaviour of dax_do_io by adding a wrapper around it that is passed all the arguments also needed by __blockdev_do_direct_IO. If (the new) __dax_do_io fails with -EIO due to a bad block, we simply retry with the direct_IO path which forces the IO to go through the block driver, and can attempt to clear the error. Patch 6 reduces our calls to clear_pmem from dax in the truncate/hole-punch cases. We check if the range being truncated is sector aligned/sized, and if so, send blkdev_issue_zeroout instead of clear_pmem so that errors can be handled better by the driver. Patch 7 fixes a redundant comment in DAX and is mostly unrelated to the rest of this series. This series also depends on/is based on Jan Kara's DAX Locking fixes series [1]. [1]: http://www.spinics.net/lists/linux-mm/msg105819.html v3: - Wrapper-ize the direct_IO fallback again and make an exception for -EIOCBQUEUED (Jeff, Dan) - Reduce clear_pmem usage in DAX to the minimum Dan Williams (3): block, dax: pass blk_dax_ctl through to drivers dax: fallback from pmd to pte on error dax: enable dax in the presence of known media errors (badblocks) Matthew Wilcox (1): dax: use sb_issue_zerout instead of calling dax_clear_sectors Vishal Verma (3): dax: handle media errors in dax_do_io dax: for truncate/hole-punch, do zeroing through the driver if possible dax: fix a comment in dax_zero_page_range and dax_truncate_page arch/powerpc/sysdev/axonram.c | 10 +++--- block/ioctl.c | 9 ----- drivers/block/brd.c | 9 ++--- drivers/nvdimm/pmem.c | 17 +++++++--- drivers/s390/block/dcssblk.c | 12 +++---- fs/block_dev.c | 7 ++-- fs/dax.c | 78 +++++++++++++++---------------------------- fs/ext2/inode.c | 12 +++---- fs/ext4/inode.c | 5 +-- fs/xfs/xfs_aops.c | 8 ++--- fs/xfs/xfs_bmap_util.c | 15 +++------ include/linux/blkdev.h | 3 +- include/linux/dax.h | 31 ++++++++++++++++- 13 files changed, 108 insertions(+), 108 deletions(-) -- 2.5.5 From vishal.l.verma@intel.com Sat Apr 23 14:14:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4DADF7CA7 for ; Sat, 23 Apr 2016 14:14:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1E0698F8033 for ; Sat, 23 Apr 2016 12:14:03 -0700 (PDT) X-ASG-Debug-ID: 1461438837-04cbb00fea195fb0004-NocioJ Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by cuda.sgi.com with ESMTP id J9IkHkYXF0zifk82 for ; Sat, 23 Apr 2016 12:14:02 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Effective-Source-IP: mga03.intel.com[134.134.136.65] X-Barracuda-Apparent-Source-IP: 134.134.136.65 X-ASG-Whitelist: Client Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga103.jf.intel.com with ESMTP; 23 Apr 2016 12:14:02 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,523,1455004800"; d="scan'208";a="965085698" Received: from omniknight.lm.intel.com ([10.232.112.171]) by fmsmga002.fm.intel.com with ESMTP; 23 Apr 2016 12:14:01 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Dan Williams , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig , Jeff Moyer , "Kirill A. Shutemov" Subject: [PATCH v3 3/7] dax: enable dax in the presence of known media errors (badblocks) Date: Sat, 23 Apr 2016 13:13:38 -0600 X-ASG-Orig-Subj: [PATCH v3 3/7] dax: enable dax in the presence of known media errors (badblocks) Message-Id: <1461438822-3592-4-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1461438822-3592-1-git-send-email-vishal.l.verma@intel.com> References: <1461438822-3592-1-git-send-email-vishal.l.verma@intel.com> X-Barracuda-Connect: mga03.intel.com[134.134.136.65] X-Barracuda-Start-Time: 1461438841 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1750 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dan Williams 1/ If a mapping overlaps a bad sector fail the request. 2/ Do not opportunistically report more dax-capable capacity than is requested when errors present. [vishal: fix a conflict with system RAM collision patches] Signed-off-by: Dan Williams --- block/ioctl.c | 9 --------- drivers/nvdimm/pmem.c | 8 ++++++++ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/block/ioctl.c b/block/ioctl.c index 4ff1f92..bf80bfd 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -423,15 +423,6 @@ bool blkdev_dax_capable(struct block_device *bdev) || (bdev->bd_part->nr_sects % (PAGE_SIZE / 512))) return false; - /* - * If the device has known bad blocks, force all I/O through the - * driver / page cache. - * - * TODO: support finer grained dax error handling - */ - if (disk->bb && disk->bb->count) - return false; - return true; } #endif diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c index f72733c..4567d9a 100644 --- a/drivers/nvdimm/pmem.c +++ b/drivers/nvdimm/pmem.c @@ -188,9 +188,17 @@ static long pmem_direct_access(struct block_device *bdev, struct pmem_device *pmem = bdev->bd_disk->private_data; resource_size_t offset = sector * 512 + pmem->data_offset; + if (unlikely(is_bad_pmem(&pmem->bb, sector, dax->size))) + return -EIO; dax->addr = pmem->virt_addr + offset; dax->pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags); + /* + * If badblocks are present, limit known good range to the + * requested range. + */ + if (unlikely(pmem->bb.count)) + return dax->size; return pmem->size - pmem->pfn_pad - offset; } -- 2.5.5 From vishal.l.verma@intel.com Sat Apr 23 14:14:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2067B7CBA for ; Sat, 23 Apr 2016 14:14:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D0D08304032 for ; Sat, 23 Apr 2016 12:14:01 -0700 (PDT) X-ASG-Debug-ID: 1461438837-04cbb00fea195fb0003-NocioJ Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by cuda.sgi.com with ESMTP id nPJPSr8cYMhd9Wa3 for ; Sat, 23 Apr 2016 12:14:00 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Effective-Source-IP: mga03.intel.com[134.134.136.65] X-Barracuda-Apparent-Source-IP: 134.134.136.65 X-ASG-Whitelist: Client Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga103.jf.intel.com with ESMTP; 23 Apr 2016 12:14:00 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,523,1455004800"; d="scan'208";a="965085686" Received: from omniknight.lm.intel.com ([10.232.112.171]) by fmsmga002.fm.intel.com with ESMTP; 23 Apr 2016 12:13:59 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Dan Williams , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig , Jeff Moyer , "Kirill A. Shutemov" Subject: [PATCH v3 2/7] dax: fallback from pmd to pte on error Date: Sat, 23 Apr 2016 13:13:37 -0600 X-ASG-Orig-Subj: [PATCH v3 2/7] dax: fallback from pmd to pte on error Message-Id: <1461438822-3592-3-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1461438822-3592-1-git-send-email-vishal.l.verma@intel.com> References: <1461438822-3592-1-git-send-email-vishal.l.verma@intel.com> X-Barracuda-Connect: mga03.intel.com[134.134.136.65] X-Barracuda-Start-Time: 1461438839 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 927 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dan Williams In preparation for consulting a badblocks list in pmem_direct_access(), teach dax_pmd_fault() to fallback rather than fail immediately upon encountering an error. The thought being that reducing the span of the dax request may avoid the error region. Signed-off-by: Dan Williams --- fs/dax.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/dax.c b/fs/dax.c index 5a34f08..52f0044 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -1111,8 +1111,8 @@ int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address, long length = dax_map_atomic(bdev, &dax); if (length < 0) { - result = VM_FAULT_SIGBUS; - goto out; + dax_pmd_dbg(&bh, address, "dax-error fallback"); + goto fallback; } if (length < PMD_SIZE) { dax_pmd_dbg(&bh, address, "dax-length too small"); -- 2.5.5 From vishal.l.verma@intel.com Sat Apr 23 14:14:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1639D7CB8 for ; Sat, 23 Apr 2016 14:14:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D85288F8033 for ; Sat, 23 Apr 2016 12:14:04 -0700 (PDT) X-ASG-Debug-ID: 1461438837-04cbb00fea195fb0005-NocioJ Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by cuda.sgi.com with ESMTP id RSvqjvauSz9EQQEj for ; Sat, 23 Apr 2016 12:14:03 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Effective-Source-IP: mga03.intel.com[134.134.136.65] X-Barracuda-Apparent-Source-IP: 134.134.136.65 X-ASG-Whitelist: Client Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga103.jf.intel.com with ESMTP; 23 Apr 2016 12:14:03 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,523,1455004800"; d="scan'208";a="965085750" Received: from omniknight.lm.intel.com ([10.232.112.171]) by fmsmga002.fm.intel.com with ESMTP; 23 Apr 2016 12:14:02 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Matthew Wilcox , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Ross Zwisler , Dan Williams , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig , Jeff Moyer , "Kirill A. Shutemov" , Vishal Verma Subject: [PATCH v3 4/7] dax: use sb_issue_zerout instead of calling dax_clear_sectors Date: Sat, 23 Apr 2016 13:13:39 -0600 X-ASG-Orig-Subj: [PATCH v3 4/7] dax: use sb_issue_zerout instead of calling dax_clear_sectors Message-Id: <1461438822-3592-5-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1461438822-3592-1-git-send-email-vishal.l.verma@intel.com> References: <1461438822-3592-1-git-send-email-vishal.l.verma@intel.com> X-Barracuda-Connect: mga03.intel.com[134.134.136.65] X-Barracuda-Start-Time: 1461438842 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4023 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Matthew Wilcox dax_clear_sectors() cannot handle poisoned blocks. These must be zeroed using the BIO interface instead. Convert ext2 and XFS to use only sb_issue_zerout(). Signed-off-by: Matthew Wilcox [vishal: Also remove the dax_clear_sectors function entirely] Signed-off-by: Vishal Verma --- fs/dax.c | 32 -------------------------------- fs/ext2/inode.c | 7 +++---- fs/xfs/xfs_bmap_util.c | 15 ++++----------- include/linux/dax.h | 1 - 4 files changed, 7 insertions(+), 48 deletions(-) diff --git a/fs/dax.c b/fs/dax.c index 52f0044..5948d9b 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -116,38 +116,6 @@ struct page *read_dax_sector(struct block_device *bdev, sector_t n) return page; } -/* - * dax_clear_sectors() is called from within transaction context from XFS, - * and hence this means the stack from this point must follow GFP_NOFS - * semantics for all operations. - */ -int dax_clear_sectors(struct block_device *bdev, sector_t _sector, long _size) -{ - struct blk_dax_ctl dax = { - .sector = _sector, - .size = _size, - }; - - might_sleep(); - do { - long count, sz; - - count = dax_map_atomic(bdev, &dax); - if (count < 0) - return count; - sz = min_t(long, count, SZ_128K); - clear_pmem(dax.addr, sz); - dax.size -= sz; - dax.sector += sz / 512; - dax_unmap_atomic(bdev, &dax); - cond_resched(); - } while (dax.size); - - wmb_pmem(); - return 0; -} -EXPORT_SYMBOL_GPL(dax_clear_sectors); - static bool buffer_written(struct buffer_head *bh) { return buffer_mapped(bh) && !buffer_unwritten(bh); diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index 1f07b75..35f2b0bf 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -737,10 +738,8 @@ static int ext2_get_blocks(struct inode *inode, * so that it's not found by another thread before it's * initialised */ - err = dax_clear_sectors(inode->i_sb->s_bdev, - le32_to_cpu(chain[depth-1].key) << - (inode->i_blkbits - 9), - 1 << inode->i_blkbits); + err = sb_issue_zeroout(inode->i_sb, + le32_to_cpu(chain[depth-1].key), 1, GFP_NOFS); if (err) { mutex_unlock(&ei->truncate_mutex); goto cleanup; diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 3b63098..930ac6a 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -72,18 +72,11 @@ xfs_zero_extent( struct xfs_mount *mp = ip->i_mount; xfs_daddr_t sector = xfs_fsb_to_db(ip, start_fsb); sector_t block = XFS_BB_TO_FSBT(mp, sector); - ssize_t size = XFS_FSB_TO_B(mp, count_fsb); - - if (IS_DAX(VFS_I(ip))) - return dax_clear_sectors(xfs_find_bdev_for_inode(VFS_I(ip)), - sector, size); - - /* - * let the block layer decide on the fastest method of - * implementing the zeroing. - */ - return sb_issue_zeroout(mp->m_super, block, count_fsb, GFP_NOFS); + return blkdev_issue_zeroout(xfs_find_bdev_for_inode(VFS_I(ip)), + block << (mp->m_super->s_blocksize_bits - 9), + count_fsb << (mp->m_super->s_blocksize_bits - 9), + GFP_NOFS, true); } /* diff --git a/include/linux/dax.h b/include/linux/dax.h index ef94fa7..426841a 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h @@ -11,7 +11,6 @@ ssize_t dax_do_io(struct kiocb *, struct inode *, struct iov_iter *, loff_t, get_block_t, dio_iodone_t, int flags); -int dax_clear_sectors(struct block_device *bdev, sector_t _sector, long _size); int dax_zero_page_range(struct inode *, loff_t from, unsigned len, get_block_t); int dax_truncate_page(struct inode *, loff_t from, get_block_t); int dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t); -- 2.5.5 From vishal.l.verma@intel.com Sat Apr 23 14:14:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 55F487CC9 for ; Sat, 23 Apr 2016 14:14:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 29572304032 for ; Sat, 23 Apr 2016 12:14:08 -0700 (PDT) X-ASG-Debug-ID: 1461438837-04cbb00fea195fb0007-NocioJ Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by cuda.sgi.com with ESMTP id tTQrm353x1RFdQbX for ; Sat, 23 Apr 2016 12:14:07 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Effective-Source-IP: mga03.intel.com[134.134.136.65] X-Barracuda-Apparent-Source-IP: 134.134.136.65 X-ASG-Whitelist: Client Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga103.jf.intel.com with ESMTP; 23 Apr 2016 12:14:07 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,523,1455004800"; d="scan'208";a="965085776" Received: from omniknight.lm.intel.com ([10.232.112.171]) by fmsmga002.fm.intel.com with ESMTP; 23 Apr 2016 12:14:06 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Vishal Verma , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dan Williams , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig , Jeff Moyer , "Kirill A. Shutemov" Subject: [PATCH v3 6/7] dax: for truncate/hole-punch, do zeroing through the driver if possible Date: Sat, 23 Apr 2016 13:13:41 -0600 X-ASG-Orig-Subj: [PATCH v3 6/7] dax: for truncate/hole-punch, do zeroing through the driver if possible Message-Id: <1461438822-3592-7-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1461438822-3592-1-git-send-email-vishal.l.verma@intel.com> References: <1461438822-3592-1-git-send-email-vishal.l.verma@intel.com> X-Barracuda-Connect: mga03.intel.com[134.134.136.65] X-Barracuda-Start-Time: 1461438846 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2131 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 In the truncate or hole-punch path in dax, we clear out sub-page ranges. If these sub-page ranges are sector aligned and sized, we can do the zeroing through the driver instead so that error-clearing is handled automatically. For sub-sector ranges, we still have to rely on clear_pmem and have the possibility of tripping over errors. Cc: Matthew Wilcox Cc: Dan Williams Cc: Ross Zwisler Cc: Jeff Moyer Cc: Christoph Hellwig Cc: Dave Chinner Cc: Jan Kara Signed-off-by: Vishal Verma --- fs/dax.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/fs/dax.c b/fs/dax.c index 5948d9b..d8c974e 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -1196,6 +1196,20 @@ out: } EXPORT_SYMBOL_GPL(dax_pfn_mkwrite); +static bool dax_range_is_aligned(struct block_device *bdev, + struct blk_dax_ctl *dax, unsigned int offset, + unsigned int length) +{ + unsigned short sector_size = bdev_logical_block_size(bdev); + + if (((u64)dax->addr + offset) % sector_size) + return false; + if (length % sector_size) + return false; + + return true; +} + /** * dax_zero_page_range - zero a range within a page of a DAX file * @inode: The file being truncated @@ -1240,11 +1254,17 @@ int dax_zero_page_range(struct inode *inode, loff_t from, unsigned length, .size = PAGE_SIZE, }; - if (dax_map_atomic(bdev, &dax) < 0) - return PTR_ERR(dax.addr); - clear_pmem(dax.addr + offset, length); - wmb_pmem(); - dax_unmap_atomic(bdev, &dax); + if (dax_range_is_aligned(bdev, &dax, offset, length)) + return blkdev_issue_zeroout(bdev, dax.sector, + length / bdev_logical_block_size(bdev), + GFP_NOFS, true); + else { + if (dax_map_atomic(bdev, &dax) < 0) + return PTR_ERR(dax.addr); + clear_pmem(dax.addr + offset, length); + wmb_pmem(); + dax_unmap_atomic(bdev, &dax); + } } return 0; -- 2.5.5 From vishal.l.verma@intel.com Sat Apr 23 14:14:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 87CFD7CCB for ; Sat, 23 Apr 2016 14:14:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E3171AC003 for ; Sat, 23 Apr 2016 12:14:06 -0700 (PDT) X-ASG-Debug-ID: 1461438837-04cbb00fea195fb0006-NocioJ Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by cuda.sgi.com with ESMTP id EMdfpPErGs1mzoM4 for ; Sat, 23 Apr 2016 12:14:05 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Effective-Source-IP: mga03.intel.com[134.134.136.65] X-Barracuda-Apparent-Source-IP: 134.134.136.65 X-ASG-Whitelist: Client Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga103.jf.intel.com with ESMTP; 23 Apr 2016 12:14:05 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,523,1455004800"; d="scan'208";a="965085763" Received: from omniknight.lm.intel.com ([10.232.112.171]) by fmsmga002.fm.intel.com with ESMTP; 23 Apr 2016 12:14:04 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Vishal Verma , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dan Williams , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig , Jeff Moyer , "Kirill A. Shutemov" Subject: [PATCH v3 5/7] dax: handle media errors in dax_do_io Date: Sat, 23 Apr 2016 13:13:40 -0600 X-ASG-Orig-Subj: [PATCH v3 5/7] dax: handle media errors in dax_do_io Message-Id: <1461438822-3592-6-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1461438822-3592-1-git-send-email-vishal.l.verma@intel.com> References: <1461438822-3592-1-git-send-email-vishal.l.verma@intel.com> X-Barracuda-Connect: mga03.intel.com[134.134.136.65] X-Barracuda-Start-Time: 1461438844 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5531 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 dax_do_io (called for read() or write() for a dax file system) may fail in the presence of bad blocks or media errors. Since we expect that a write should clear media errors on nvdimms, make dax_do_io fall back to the direct_IO path, which will send down a bio to the driver, which can then attempt to clear the error. Cc: Matthew Wilcox Cc: Dan Williams Cc: Ross Zwisler Cc: Jeff Moyer Cc: Christoph Hellwig Cc: Dave Chinner Cc: Jan Kara Cc: Jens Axboe Cc: Al Viro Signed-off-by: Vishal Verma --- fs/block_dev.c | 5 +++-- fs/ext2/inode.c | 5 +++-- fs/ext4/inode.c | 5 +++-- fs/xfs/xfs_aops.c | 8 ++++---- include/linux/dax.h | 30 ++++++++++++++++++++++++++++++ 5 files changed, 43 insertions(+), 10 deletions(-) diff --git a/fs/block_dev.c b/fs/block_dev.c index 79defba..7c90516 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -168,8 +168,9 @@ blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) struct inode *inode = bdev_file_inode(file); if (IS_DAX(inode)) - return dax_do_io(iocb, inode, iter, offset, blkdev_get_block, - NULL, DIO_SKIP_DIO_COUNT); + return dax_io_fallback(iocb, inode, I_BDEV(inode), iter, offset, + blkdev_get_block, blkdev_get_block, + NULL, NULL, DIO_SKIP_DIO_COUNT); return __blockdev_direct_IO(iocb, inode, I_BDEV(inode), iter, offset, blkdev_get_block, NULL, NULL, DIO_SKIP_DIO_COUNT); diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index 35f2b0bf..1cec54b 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c @@ -862,8 +862,9 @@ ext2_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) ssize_t ret; if (IS_DAX(inode)) - ret = dax_do_io(iocb, inode, iter, offset, ext2_get_block, NULL, - DIO_LOCKING); + ret = dax_io_fallback(iocb, inode, inode->i_sb->s_bdev, iter, + offset, ext2_get_block, ext2_get_block, + NULL, NULL, DIO_LOCKING | DIO_SKIP_HOLES); else ret = blockdev_direct_IO(iocb, inode, iter, offset, ext2_get_block); diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 6d5d5c1..d29848b 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -3411,8 +3411,9 @@ static ssize_t ext4_direct_IO_write(struct kiocb *iocb, struct iov_iter *iter, BUG_ON(ext4_encrypted_inode(inode) && S_ISREG(inode->i_mode)); #endif if (IS_DAX(inode)) { - ret = dax_do_io(iocb, inode, iter, offset, get_block_func, - ext4_end_io_dio, dio_flags); + ret = dax_io_fallback(iocb, inode, inode->i_sb->s_bdev, iter, + offset, get_block_func, get_block_func, + ext4_end_io_dio, NULL, dio_flags); } else ret = __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev, iter, offset, diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index e49b240..48fe10a 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1412,7 +1412,7 @@ xfs_vm_direct_IO( struct inode *inode = iocb->ki_filp->f_mapping->host; dio_iodone_t *endio = NULL; int flags = 0; - struct block_device *bdev; + struct block_device *bdev = xfs_find_bdev_for_inode(inode); if (iov_iter_rw(iter) == WRITE) { endio = xfs_end_io_direct_write; @@ -1420,11 +1420,11 @@ xfs_vm_direct_IO( } if (IS_DAX(inode)) { - return dax_do_io(iocb, inode, iter, offset, - xfs_get_blocks_direct, endio, 0); + return dax_io_fallback(iocb, inode, bdev, iter, offset, + xfs_get_blocks_direct, xfs_get_blocks_direct, + endio, NULL, flags); } - bdev = xfs_find_bdev_for_inode(inode); return __blockdev_direct_IO(iocb, inode, bdev, iter, offset, xfs_get_blocks_direct, endio, NULL, flags); } diff --git a/include/linux/dax.h b/include/linux/dax.h index 426841a..7200e6f 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h @@ -3,6 +3,7 @@ #include #include +#include #include #include @@ -64,4 +65,33 @@ static inline bool dax_mapping(struct address_space *mapping) struct writeback_control; int dax_writeback_mapping_range(struct address_space *mapping, struct block_device *bdev, struct writeback_control *wbc); +/* + * This is a wrapper for dax_do_io which may be used for writes, and will + * perform a fallback to direct_io semantics if the dax_io fails due to a + * media error. + */ +static inline ssize_t dax_io_fallback(struct kiocb *iocb, struct inode *inode, + struct block_device *bdev, struct iov_iter *iter, loff_t pos, + get_block_t dax_get_block, get_block_t dio_get_block, + dio_iodone_t end_io, dio_submit_t submit_io, int flags) +{ + ssize_t retval; + + retval = dax_do_io(iocb, inode, iter, pos, dax_get_block, end_io, + flags); + if (iov_iter_rw(iter) == WRITE && retval == -EIO) { + /* + * __dax_do_io may have failed a write due to a bad block. + * Retry with direct_io, and if the direct_IO also fails + * (with the exception of -EIOCBQUEUED), return -EIO as + * that was the original error that led us down the + * direct_IO path. + */ + retval = __blockdev_direct_IO(iocb, inode, bdev, iter, pos, + dio_get_block, end_io, submit_io, flags); + if (retval < 0 && retval != -EIOCBQUEUED) + return -EIO; + } + return retval; +} #endif -- 2.5.5 From vishal.l.verma@intel.com Sat Apr 23 14:14:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5A62B7CCB for ; Sat, 23 Apr 2016 14:14:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C4436AC001 for ; Sat, 23 Apr 2016 12:14:10 -0700 (PDT) X-ASG-Debug-ID: 1461438837-04cbb00fea195fb0008-NocioJ Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by cuda.sgi.com with ESMTP id 36xDuAEIGnZfGrX9 for ; Sat, 23 Apr 2016 12:14:09 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Effective-Source-IP: mga03.intel.com[134.134.136.65] X-Barracuda-Apparent-Source-IP: 134.134.136.65 X-ASG-Whitelist: Client Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga103.jf.intel.com with ESMTP; 23 Apr 2016 12:14:09 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,523,1455004800"; d="scan'208";a="965085788" Received: from omniknight.lm.intel.com ([10.232.112.171]) by fmsmga002.fm.intel.com with ESMTP; 23 Apr 2016 12:14:08 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Vishal Verma , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dan Williams , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig , Jeff Moyer , "Kirill A. Shutemov" Subject: [PATCH v3 7/7] dax: fix a comment in dax_zero_page_range and dax_truncate_page Date: Sat, 23 Apr 2016 13:13:42 -0600 X-ASG-Orig-Subj: [PATCH v3 7/7] dax: fix a comment in dax_zero_page_range and dax_truncate_page Message-Id: <1461438822-3592-8-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1461438822-3592-1-git-send-email-vishal.l.verma@intel.com> References: <1461438822-3592-1-git-send-email-vishal.l.verma@intel.com> X-Barracuda-Connect: mga03.intel.com[134.134.136.65] X-Barracuda-Start-Time: 1461438847 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1995 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The distinction between PAGE_SIZE and PAGE_CACHE_SIZE was removed in 09cbfea mm, fs: get rid of PAGE_CACHE_* and page_cache_{get,release} macros The comments for the above functions described a distinction between those, that is now redundant, so remove those paragraphs Cc: Matthew Wilcox Cc: Kirill A. Shutemov Signed-off-by: Vishal Verma --- fs/dax.c | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/fs/dax.c b/fs/dax.c index d8c974e..b8fa85a 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -1221,12 +1221,6 @@ static bool dax_range_is_aligned(struct block_device *bdev, * page in a DAX file. This is intended for hole-punch operations. If * you are truncating a file, the helper function dax_truncate_page() may be * more convenient. - * - * We work in terms of PAGE_SIZE here for commonality with - * block_truncate_page(), but we could go down to PAGE_SIZE if the filesystem - * took care of disposing of the unnecessary blocks. Even if the filesystem - * block size is smaller than PAGE_SIZE, we have to zero the rest of the page - * since the file might be mmapped. */ int dax_zero_page_range(struct inode *inode, loff_t from, unsigned length, get_block_t get_block) @@ -1279,12 +1273,6 @@ EXPORT_SYMBOL_GPL(dax_zero_page_range); * * Similar to block_truncate_page(), this function can be called by a * filesystem when it is truncating a DAX file to handle the partial page. - * - * We work in terms of PAGE_SIZE here for commonality with - * block_truncate_page(), but we could go down to PAGE_SIZE if the filesystem - * took care of disposing of the unnecessary blocks. Even if the filesystem - * block size is smaller than PAGE_SIZE, we have to zero the rest of the page - * since the file might be mmapped. */ int dax_truncate_page(struct inode *inode, loff_t from, get_block_t get_block) { -- 2.5.5 From debbugs@buxtehude.debian.org Sat Apr 23 16:12:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 97B9B7CB5 for ; Sat, 23 Apr 2016 16:12:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1AEB4AC002 for ; Sat, 23 Apr 2016 14:12:11 -0700 (PDT) X-ASG-Debug-ID: 1461445928-04bdf0358e1ae110001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [206.12.19.147]) by cuda.sgi.com with ESMTP id OLpLCoNdmoQqEONF (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 23 Apr 2016 14:12:09 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Effective-Source-IP: buxtehude.debian.org[206.12.19.147] X-Barracuda-Apparent-Source-IP: 206.12.19.147 Received: from debbugs by buxtehude.debian.org with local (Exim 4.84_2) (envelope-from ) id 1au4qT-0008FK-Tw; Sat, 23 Apr 2016 21:12:06 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#822369: xfsprogs: FTBFS: error: redefinition of 'struct fsxattr' Reply-To: Martin Michlmayr , 822369@bugs.debian.org X-ASG-Orig-Subj: Bug#822369: xfsprogs: FTBFS: error: redefinition of 'struct fsxattr' Resent-From: Martin Michlmayr Resent-To: debian-bugs-dist@lists.debian.org Resent-CC: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Sat, 23 Apr 2016 21:12:02 +0000 Resent-Message-ID: X-Debian-PR-Message: report 822369 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: X-Debian-PR-Source: xfsprogs Received: via spool by submit@bugs.debian.org id=B.146144572030512 (code B); Sat, 23 Apr 2016 21:12:02 +0000 Received: (at submit) by bugs.debian.org; 23 Apr 2016 21:08:40 +0000 Received: from g1t6213.austin.hp.com ([15.73.96.121]) by buxtehude.debian.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1au4nA-0007vj-GM for submit@bugs.debian.org; Sat, 23 Apr 2016 21:08:40 +0000 Received: from g1t6217.austin.hpicorp.net (g1t6217.austin.hpicorp.net [15.67.1.144]) by g1t6213.austin.hp.com (Postfix) with ESMTP id AC8DD99 for ; Sat, 23 Apr 2016 21:08:33 +0000 (UTC) Received: from loric-alpo.cyrius.com (ospra0.fc.hp.com [16.79.38.117]) by g1t6217.austin.hpicorp.net (Postfix) with ESMTP id 7A8525F for ; Sat, 23 Apr 2016 21:08:33 +0000 (UTC) Received: by loric-alpo.cyrius.com (Postfix, from userid 1000) id E4973690AC; Sat, 23 Apr 2016 23:08:31 +0200 (CEST) Date: Sat, 23 Apr 2016 14:08:31 -0700 From: Martin Michlmayr To: submit@bugs.debian.org Message-ID: <20160423210831.GA19384@jirafa.cyrius.com> References: <20160423205226.67773120316@dl580gen9-02.hlinux> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160423205226.67773120316@dl580gen9-02.hlinux> User-Agent: Mutt/1.5.23 (2014-03-12) Delivered-To: submit@bugs.debian.org X-Barracuda-Connect: buxtehude.debian.org[206.12.19.147] X-Barracuda-Start-Time: 1461445929 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 801 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.28999 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Package: xfsprogs Version: 4.3.0+nmu1 Severity: serious This package fails to build in unstable: > sbuild (Debian sbuild) 0.68.0 (15 Jan 2016) on dl580gen9-02.hlinux ... > [CC] fiemap.o > In file included from ../include/xfs.h:58:0, > from io.h:19, > from fiemap.c:24: > ../include/xfs/xfs_fs.h:42:8: error: redefinition of 'struct fsxattr' > struct fsxattr { > ^ > In file included from fiemap.c:22:0: > /usr/include/linux/fs.h:155:8: note: originally defined here > struct fsxattr { > ^ > ../include/buildrules:59: recipe for target 'fiemap.o' failed > make[3]: *** [fiemap.o] Error 1 > include/buildrules:35: recipe for target 'io' failed -- Martin Michlmayr Linux for HPE Helion, Hewlett Packard Enterprise From shaun.tancheff@seagate.com Sat Apr 23 18:27:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 34E4A7CBC for ; Sat, 23 Apr 2016 18:27:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id EFC198F8033 for ; Sat, 23 Apr 2016 16:27:03 -0700 (PDT) X-ASG-Debug-ID: 1461454015-04cb6c09a31c99c0001-NocioJ Received: from mx0a-000cda01.pphosted.com (mx0a-00003501.pphosted.com [67.231.144.15]) by cuda.sgi.com with ESMTP id YhM4PIg1LBOGaj8N (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 23 Apr 2016 16:26:56 -0700 (PDT) X-Barracuda-Envelope-From: shaun.tancheff@seagate.com X-Barracuda-Effective-Source-IP: mx0a-00003501.pphosted.com[67.231.144.15] X-Barracuda-Apparent-Source-IP: 67.231.144.15 Received: from pps.filterd (m0075555.ppops.net [127.0.0.1]) by mx0a-00003501.pphosted.com (8.16.0.11/8.16.0.11) with SMTP id u3NNOooF023324 for ; Sat, 23 Apr 2016 19:26:55 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=seagate.com; h=mime-version : in-reply-to : references : from : date : message-id : subject : to : cc : content-type; s=proofpoint; bh=Z5vK9Vn/Nf3oiEUTv6bF1jQTxS6q0TEg86QTiNe3l38=; b=YkPD7lFZdQIIhx2KpLWA+5gFUtys4RJ6Le1EnHUs/IpQQXmZ1tofaOrBVx+yAW+rDNel wP5hWf7LFTplVO0VCjLdLw2HmkY4XkjiS4Swd5E6USQ2q2HFMB4bpbjOySkEgGPpvndq WnoOMoz60Q22EkdnuA6nWmfZulbkO3R4W3iTR6JHGWp6sbyWiaSjn0hSPDsJhaiSgsxF BTkK8TDKaOcLRpN9mffbvCe6ViFB0w/0+tzt79CQo6857V56yMJW3U97hYIg6joKwBkX K3eUqZF1xczTQGeHT6GdLyxbsHzrCy+ebWZuBx3WAk0upsMwrhK2vr2Xx6kGVW0Wo0ga kQ== Received: from mail-qk0-f200.google.com (mail-qk0-f200.google.com [209.85.220.200]) by mx0a-00003501.pphosted.com with ESMTP id 22gjptg03a-4 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Sat, 23 Apr 2016 19:26:54 -0400 Received: by mail-qk0-f200.google.com with SMTP id x7so311928903qkd.2 for ; Sat, 23 Apr 2016 16:26:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=seagate.com; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=dTGDkU2WvzMZxQAIoLtlE+ibMHjwd54YUwIizkkY0d4=; b=LVlFtQFwKkXacFoVxDLMCr01roMQ4Xxe+RM/FZn3nz8aPy92wkf9PfTDS7txQbmS6c poy9l+pumDKQaWvgnzBEPKRr6e9za0++dVD/TzExFUmVPftvl+uhGRxpshu7sgmmPzB/ +g72YYCNRRamhwu7S4dxo581H/7hRyR3+/ZeU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=dTGDkU2WvzMZxQAIoLtlE+ibMHjwd54YUwIizkkY0d4=; b=Gzoua/c7Of+92newDP+AQetNKR102nRHqUbE4BWu95E1Pe8okvPtQgARc7m7+IYjE4 +dhbc1/lVJv5lM0FIj1hcZVs6kRhDZhMkDBWWTUse3OZhrpySgTFsdO15GdVJu+1lowa f+gbQXj2fzHc9pwh6K4TEEBnc/chY1DClu3I/Ggyy3r447MEhMOmxBGf71xbrTxOwOhw 9E+5lEhZjyZFuHVYNubrPV43jzdq3pYH2ETmCWc5KJPNTUoXaIM20Q7zSnkI8N6YTw1i vNBapq4Q4SNhbwTfug/bs/8eqG5Mff5o3j1bOTtlWkwP5gHm5tqAewU0sh5TiGTSqItD qeKg== X-Gm-Message-State: AOPr4FXrw97JI6SawrK6aIqM37cnPRHHwpiGt7QbhtLfxE/uHFSdY4WeXOLAvliDW2fh6GzvFvfLa1peaXOgStWS2aCAPL2K26kMwX8EtFFNgQL11pUvIzVKWGgx13g6NyhaYatq4Pnu5Qmhm39GDfPkA/XP6ubTUnoCog6RC+g= X-Received: by 10.13.214.199 with SMTP id y190mr16598612ywd.241.1461454013776; Sat, 23 Apr 2016 16:26:53 -0700 (PDT) X-Received: by 10.13.214.199 with SMTP id y190mr16598602ywd.241.1461454013486; Sat, 23 Apr 2016 16:26:53 -0700 (PDT) MIME-Version: 1.0 Received: by 10.129.160.67 with HTTP; Sat, 23 Apr 2016 16:26:34 -0700 (PDT) In-Reply-To: <1460716802-2294-24-git-send-email-mchristi@redhat.com> References: <1460716802-2294-1-git-send-email-mchristi@redhat.com> <1460716802-2294-24-git-send-email-mchristi@redhat.com> From: Shaun Tancheff Date: Sat, 23 Apr 2016 18:26:34 -0500 Message-ID: Subject: Re: [dm-devel] [PATCH 23/42] md/raid: set bi_op to REQ_OP To: mchristi@redhat.com X-ASG-Orig-Subj: Re: [dm-devel] [PATCH 23/42] md/raid: set bi_op to REQ_OP Cc: linux-f2fs-devel@lists.sourceforge.net, linux-ext4@vger.kernel.org, konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, LKML , linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, xfs@oss.sgi.com, ocfs2-devel@oss.oracle.com Content-Type: multipart/alternative; boundary=94eb2c0766c65497ea05312f4703 X-Proofpoint-PolicyRoute: Outbound X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2016-04-24_01:,, signatures=0 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 suspectscore=9 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1603290000 definitions=main-1604230416 X-Proofpoint-Spam-Policy: Default Domain Policy X-Barracuda-Connect: mx0a-00003501.pphosted.com[67.231.144.15] X-Barracuda-Start-Time: 1461454016 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 87212 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29001 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --94eb2c0766c65497ea05312f4703 Content-Type: text/plain; charset=UTF-8 On Fri, Apr 15, 2016 at 5:39 AM, wrote: > From: Mike Christie > > This patch has md use bio->bi_op for REQ_OPs and rq_flag_bits > to bio->bi_rw. > > Signed-off-by: Mike Christie > Reviewed-by: Christoph Hellwig > Reviewed-by: Hannes Reinecke > --- > drivers/md/bitmap.c | 2 +- > drivers/md/dm-raid.c | 5 +++-- > drivers/md/md.c | 11 +++++++---- > drivers/md/md.h | 3 ++- > drivers/md/raid1.c | 34 ++++++++++++++++---------------- > drivers/md/raid10.c | 50 > ++++++++++++++++++++++++++---------------------- > drivers/md/raid5-cache.c | 25 +++++++++++++++--------- > drivers/md/raid5.c | 48 > ++++++++++++++++++++++++++-------------------- > 8 files changed, 101 insertions(+), 77 deletions(-) > > Sorry I though this would thread propertly: https://lkml.kernel.org/r/1461452709-6702-1-git-send-email-shaun@tancheff.com In raid0.c, raid10.c and raid5.c A couple of checks for REQ_PREFLUSH flag should also check for bi_op matching REQ_OP_FLUSH. In raid1.c [r1_sync_page_io()] and raid10.c [r10_sync_page_io()] Wrappers for sync_page_io() are passed READ/WRITE but need to be passed REQ_OP_READ and REQ_OP_WRITE. Anyway my raid testing was getting weird hangs and corruption without the patch. Thanks! > diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c > index 8b2e16f..9e8019e 100644 > --- a/drivers/md/bitmap.c > +++ b/drivers/md/bitmap.c > @@ -159,7 +159,7 @@ static int read_sb_page(struct mddev *mddev, loff_t > offset, > > if (sync_page_io(rdev, target, > roundup(size, > bdev_logical_block_size(rdev->bdev)), > - page, READ, true)) { > + page, REQ_OP_READ, 0, true)) { > page->index = index; > return 0; > } > diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c > index a090121..43a749c 100644 > --- a/drivers/md/dm-raid.c > +++ b/drivers/md/dm-raid.c > @@ -792,7 +792,7 @@ static int read_disk_sb(struct md_rdev *rdev, int size) > if (rdev->sb_loaded) > return 0; > > - if (!sync_page_io(rdev, 0, size, rdev->sb_page, READ, 1)) { > + if (!sync_page_io(rdev, 0, size, rdev->sb_page, REQ_OP_READ, 0, > 1)) { > DMERR("Failed to read superblock of device at position %d", > rdev->raid_disk); > md_error(rdev->mddev, rdev); > @@ -1646,7 +1646,8 @@ static void attempt_restore_of_faulty_devices(struct > raid_set *rs) > for (i = 0; i < rs->md.raid_disks; i++) { > r = &rs->dev[i].rdev; > if (test_bit(Faulty, &r->flags) && r->sb_page && > - sync_page_io(r, 0, r->sb_size, r->sb_page, READ, 1)) { > + sync_page_io(r, 0, r->sb_size, r->sb_page, > REQ_OP_READ, 0, > + 1)) { > DMINFO("Faulty %s device #%d has readable super > block." > " Attempting to revive it.", > rs->raid_type->name, i); > diff --git a/drivers/md/md.c b/drivers/md/md.c > index ec3c98d..9c40368 100644 > --- a/drivers/md/md.c > +++ b/drivers/md/md.c > @@ -392,6 +392,7 @@ static void submit_flushes(struct work_struct *ws) > bi->bi_end_io = md_end_flush; > bi->bi_private = rdev; > bi->bi_bdev = rdev->bdev; > + bi->bi_op = REQ_OP_WRITE; > bi->bi_rw = WRITE_FLUSH; > atomic_inc(&mddev->flush_pending); > submit_bio(bi); > @@ -741,6 +742,7 @@ void md_super_write(struct mddev *mddev, struct > md_rdev *rdev, > bio_add_page(bio, page, size, 0); > bio->bi_private = rdev; > bio->bi_end_io = super_written; > + bio->bi_op = REQ_OP_WRITE; > bio->bi_rw = WRITE_FLUSH_FUA; > > atomic_inc(&mddev->pending_writes); > @@ -754,14 +756,15 @@ void md_super_wait(struct mddev *mddev) > } > > int sync_page_io(struct md_rdev *rdev, sector_t sector, int size, > - struct page *page, int rw, bool metadata_op) > + struct page *page, int op, int op_flags, bool metadata_op) > { > struct bio *bio = bio_alloc_mddev(GFP_NOIO, 1, rdev->mddev); > int ret; > > bio->bi_bdev = (metadata_op && rdev->meta_bdev) ? > rdev->meta_bdev : rdev->bdev; > - bio->bi_rw = rw; > + bio->bi_op = op; > + bio->bi_rw = op_flags; > if (metadata_op) > bio->bi_iter.bi_sector = sector + rdev->sb_start; > else if (rdev->mddev->reshape_position != MaxSector && > @@ -787,7 +790,7 @@ static int read_disk_sb(struct md_rdev *rdev, int size) > if (rdev->sb_loaded) > return 0; > > - if (!sync_page_io(rdev, 0, size, rdev->sb_page, READ, true)) > + if (!sync_page_io(rdev, 0, size, rdev->sb_page, REQ_OP_READ, 0, > true)) > goto fail; > rdev->sb_loaded = 1; > return 0; > @@ -1473,7 +1476,7 @@ static int super_1_load(struct md_rdev *rdev, struct > md_rdev *refdev, int minor_ > return -EINVAL; > bb_sector = (long long)offset; > if (!sync_page_io(rdev, bb_sector, sectors << 9, > - rdev->bb_page, READ, true)) > + rdev->bb_page, REQ_OP_READ, 0, true)) > return -EIO; > bbp = (u64 *)page_address(rdev->bb_page); > rdev->badblocks.shift = sb->bblog_shift; > diff --git a/drivers/md/md.h b/drivers/md/md.h > index b5c4be7..2e0918f 100644 > --- a/drivers/md/md.h > +++ b/drivers/md/md.h > @@ -618,7 +618,8 @@ extern void md_super_write(struct mddev *mddev, struct > md_rdev *rdev, > sector_t sector, int size, struct page *page); > extern void md_super_wait(struct mddev *mddev); > extern int sync_page_io(struct md_rdev *rdev, sector_t sector, int size, > - struct page *page, int rw, bool metadata_op); > + struct page *page, int op, int op_flags, > + bool metadata_op); > extern void md_do_sync(struct md_thread *thread); > extern void md_new_event(struct mddev *mddev); > extern int md_allow_write(struct mddev *mddev); > diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c > index 424df7e..c7abd2d 100644 > --- a/drivers/md/raid1.c > +++ b/drivers/md/raid1.c > @@ -759,7 +759,7 @@ static void flush_pending_writes(struct r1conf *conf) > while (bio) { /* submit pending writes */ > struct bio *next = bio->bi_next; > bio->bi_next = NULL; > - if (unlikely((bio->bi_rw & REQ_DISCARD) && > + if (unlikely((bio->bi_op == REQ_OP_DISCARD) && > > !blk_queue_discard(bdev_get_queue(bio->bi_bdev)))) > /* Just ignore it */ > bio_endio(bio); > @@ -1033,7 +1033,7 @@ static void raid1_unplug(struct blk_plug_cb *cb, > bool from_schedule) > while (bio) { /* submit pending writes */ > struct bio *next = bio->bi_next; > bio->bi_next = NULL; > - if (unlikely((bio->bi_rw & REQ_DISCARD) && > + if (unlikely((bio->bi_op == REQ_OP_DISCARD) && > !blk_queue_discard(bdev_get_queue(bio->bi_bdev)))) > /* Just ignore it */ > bio_endio(bio); > @@ -1053,12 +1053,11 @@ static void raid1_make_request(struct mddev > *mddev, struct bio * bio) > int i, disks; > struct bitmap *bitmap; > unsigned long flags; > + const int op = bio->bi_op; > const int rw = bio_data_dir(bio); > const unsigned long do_sync = (bio->bi_rw & REQ_SYNC); > const unsigned long do_flush_fua = (bio->bi_rw & (REQ_FLUSH | > REQ_FUA)); > - const unsigned long do_discard = (bio->bi_rw > - & (REQ_DISCARD | REQ_SECURE)); > - const unsigned long do_same = (bio->bi_rw & REQ_WRITE_SAME); > + const unsigned long do_sec = (bio->bi_rw & REQ_SECURE); > struct md_rdev *blocked_rdev; > struct blk_plug_cb *cb; > struct raid1_plug_cb *plug = NULL; > @@ -1166,7 +1165,8 @@ read_again: > mirror->rdev->data_offset; > read_bio->bi_bdev = mirror->rdev->bdev; > read_bio->bi_end_io = raid1_end_read_request; > - read_bio->bi_rw = READ | do_sync; > + read_bio->bi_op = op; > + read_bio->bi_rw = do_sync; > read_bio->bi_private = r1_bio; > > if (max_sectors < r1_bio->sectors) { > @@ -1376,8 +1376,9 @@ read_again: > conf->mirrors[i].rdev->data_offset); > mbio->bi_bdev = conf->mirrors[i].rdev->bdev; > mbio->bi_end_io = raid1_end_write_request; > + mbio->bi_op = op; > mbio->bi_rw = > - WRITE | do_flush_fua | do_sync | do_discard | > do_same; > + do_flush_fua | do_sync | do_sec; > mbio->bi_private = r1_bio; > > atomic_inc(&r1_bio->remaining); > @@ -1771,7 +1772,7 @@ static void end_sync_write(struct bio *bio) > static int r1_sync_page_io(struct md_rdev *rdev, sector_t sector, > int sectors, struct page *page, int rw) > { > - if (sync_page_io(rdev, sector, sectors << 9, page, rw, false)) > + if (sync_page_io(rdev, sector, sectors << 9, page, rw, 0, false)) > /* success */ > return 1; > if (rw == WRITE) { > @@ -1825,7 +1826,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio) > rdev = conf->mirrors[d].rdev; > if (sync_page_io(rdev, sect, s<<9, > > bio->bi_io_vec[idx].bv_page, > - READ, false)) { > + REQ_OP_READ, 0, false)) { > success = 1; > break; > } > @@ -2030,7 +2031,7 @@ static void sync_request_write(struct mddev *mddev, > struct r1bio *r1_bio) > !test_bit(MD_RECOVERY_SYNC, &mddev->recovery)))) > continue; > > - wbio->bi_rw = WRITE; > + wbio->bi_op = REQ_OP_WRITE; > wbio->bi_end_io = end_sync_write; > atomic_inc(&r1_bio->remaining); > md_sync_acct(conf->mirrors[i].rdev->bdev, > bio_sectors(wbio)); > @@ -2090,7 +2091,7 @@ static void fix_read_error(struct r1conf *conf, int > read_disk, > is_badblock(rdev, sect, s, > &first_bad, &bad_sectors) == 0 && > sync_page_io(rdev, sect, s<<9, > - conf->tmppage, READ, false)) > + conf->tmppage, REQ_OP_READ, 0, > false)) > success = 1; > else { > d++; > @@ -2201,7 +2202,7 @@ static int narrow_write_error(struct r1bio *r1_bio, > int i) > wbio = bio_clone_mddev(r1_bio->master_bio, > GFP_NOIO, mddev); > } > > - wbio->bi_rw = WRITE; > + wbio->bi_op = REQ_OP_WRITE; > wbio->bi_iter.bi_sector = r1_bio->sector; > wbio->bi_iter.bi_size = r1_bio->sectors << 9; > > @@ -2344,7 +2345,8 @@ read_more: > bio->bi_iter.bi_sector = r1_bio->sector + > rdev->data_offset; > bio->bi_bdev = rdev->bdev; > bio->bi_end_io = raid1_end_read_request; > - bio->bi_rw = READ | do_sync; > + bio->bi_op = REQ_OP_READ; > + bio->bi_rw = do_sync; > bio->bi_private = r1_bio; > if (max_sectors < r1_bio->sectors) { > /* Drat - have to split this up more */ > @@ -2572,7 +2574,7 @@ static sector_t raid1_sync_request(struct mddev > *mddev, sector_t sector_nr, > if (i < conf->raid_disks) > still_degraded = 1; > } else if (!test_bit(In_sync, &rdev->flags)) { > - bio->bi_rw = WRITE; > + bio->bi_op = REQ_OP_WRITE; > bio->bi_end_io = end_sync_write; > write_targets ++; > } else { > @@ -2599,7 +2601,7 @@ static sector_t raid1_sync_request(struct mddev > *mddev, sector_t sector_nr, > if (disk < 0) > disk = i; > } > - bio->bi_rw = READ; > + bio->bi_op = REQ_OP_READ; > bio->bi_end_io = end_sync_read; > read_targets++; > } else if (!test_bit(WriteErrorSeen, &rdev->flags) > && > @@ -2611,7 +2613,7 @@ static sector_t raid1_sync_request(struct mddev > *mddev, sector_t sector_nr, > * if we are doing resync or repair. > Otherwise, leave > * this device alone for this sync request. > */ > - bio->bi_rw = WRITE; > + bio->bi_op = REQ_OP_WRITE; > bio->bi_end_io = end_sync_write; > write_targets++; > } > diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c > index 4736be8..63cd985 100644 > --- a/drivers/md/raid10.c > +++ b/drivers/md/raid10.c > @@ -865,7 +865,7 @@ static void flush_pending_writes(struct r10conf *conf) > while (bio) { /* submit pending writes */ > struct bio *next = bio->bi_next; > bio->bi_next = NULL; > - if (unlikely((bio->bi_rw & REQ_DISCARD) && > + if (unlikely((bio->bi_op == REQ_OP_DISCARD) && > > !blk_queue_discard(bdev_get_queue(bio->bi_bdev)))) > /* Just ignore it */ > bio_endio(bio); > @@ -1041,7 +1041,7 @@ static void raid10_unplug(struct blk_plug_cb *cb, > bool from_schedule) > while (bio) { /* submit pending writes */ > struct bio *next = bio->bi_next; > bio->bi_next = NULL; > - if (unlikely((bio->bi_rw & REQ_DISCARD) && > + if (unlikely((bio->bi_op == REQ_OP_DISCARD) && > !blk_queue_discard(bdev_get_queue(bio->bi_bdev)))) > /* Just ignore it */ > bio_endio(bio); > @@ -1058,12 +1058,11 @@ static void __make_request(struct mddev *mddev, > struct bio *bio) > struct r10bio *r10_bio; > struct bio *read_bio; > int i; > + const int op = bio->bi_op; > const int rw = bio_data_dir(bio); > const unsigned long do_sync = (bio->bi_rw & REQ_SYNC); > const unsigned long do_fua = (bio->bi_rw & REQ_FUA); > - const unsigned long do_discard = (bio->bi_rw > - & (REQ_DISCARD | REQ_SECURE)); > - const unsigned long do_same = (bio->bi_rw & REQ_WRITE_SAME); > + const unsigned long do_sec = (bio->bi_rw & REQ_SECURE); > unsigned long flags; > struct md_rdev *blocked_rdev; > struct blk_plug_cb *cb; > @@ -1156,7 +1155,8 @@ read_again: > choose_data_offset(r10_bio, rdev); > read_bio->bi_bdev = rdev->bdev; > read_bio->bi_end_io = raid10_end_read_request; > - read_bio->bi_rw = READ | do_sync; > + read_bio->bi_op = op; > + read_bio->bi_rw = do_sync; > read_bio->bi_private = r10_bio; > > if (max_sectors < r10_bio->sectors) { > @@ -1363,8 +1363,9 @@ retry_write: > rdev)); > mbio->bi_bdev = rdev->bdev; > mbio->bi_end_io = raid10_end_write_request; > + mbio->bi_op = op; > mbio->bi_rw = > - WRITE | do_sync | do_fua | do_discard | > do_same; > + do_sync | do_fua | do_sec; > mbio->bi_private = r10_bio; > > atomic_inc(&r10_bio->remaining); > @@ -1406,8 +1407,9 @@ retry_write: > r10_bio, rdev)); > mbio->bi_bdev = rdev->bdev; > mbio->bi_end_io = raid10_end_write_request; > + mbio->bi_op = op; > mbio->bi_rw = > - WRITE | do_sync | do_fua | do_discard | > do_same; > + do_sync | do_fua | do_sec; > mbio->bi_private = r10_bio; > > atomic_inc(&r10_bio->remaining); > @@ -1992,7 +1994,7 @@ static void sync_request_write(struct mddev *mddev, > struct r10bio *r10_bio) > > tbio->bi_vcnt = vcnt; > tbio->bi_iter.bi_size = fbio->bi_iter.bi_size; > - tbio->bi_rw = WRITE; > + tbio->bi_op = REQ_OP_WRITE; > tbio->bi_private = r10_bio; > tbio->bi_iter.bi_sector = r10_bio->devs[i].addr; > tbio->bi_end_io = end_sync_write; > @@ -2078,7 +2080,7 @@ static void fix_recovery_read_error(struct r10bio > *r10_bio) > addr, > s << 9, > bio->bi_io_vec[idx].bv_page, > - READ, false); > + REQ_OP_READ, 0, false); > if (ok) { > rdev = conf->mirrors[dw].rdev; > addr = r10_bio->devs[1].addr + sect; > @@ -2086,7 +2088,7 @@ static void fix_recovery_read_error(struct r10bio > *r10_bio) > addr, > s << 9, > bio->bi_io_vec[idx].bv_page, > - WRITE, false); > + REQ_OP_WRITE, 0, false); > if (!ok) { > set_bit(WriteErrorSeen, &rdev->flags); > if (!test_and_set_bit(WantReplacement, > @@ -2213,7 +2215,7 @@ static int r10_sync_page_io(struct md_rdev *rdev, > sector_t sector, > if (is_badblock(rdev, sector, sectors, &first_bad, &bad_sectors) > && (rw == READ || test_bit(WriteErrorSeen, &rdev->flags))) > return -1; > - if (sync_page_io(rdev, sector, sectors << 9, page, rw, false)) > + if (sync_page_io(rdev, sector, sectors << 9, page, rw, 0, false)) > /* success */ > return 1; > if (rw == WRITE) { > @@ -2299,7 +2301,8 @@ static void fix_read_error(struct r10conf *conf, > struct mddev *mddev, struct r10 > > r10_bio->devs[sl].addr + > sect, > s<<9, > - conf->tmppage, > READ, false); > + conf->tmppage, > + REQ_OP_READ, 0, > false); > rdev_dec_pending(rdev, mddev); > rcu_read_lock(); > if (success) > @@ -2474,7 +2477,7 @@ static int narrow_write_error(struct r10bio > *r10_bio, int i) > choose_data_offset(r10_bio, rdev) + > (sector - r10_bio->sector)); > wbio->bi_bdev = rdev->bdev; > - wbio->bi_rw = WRITE; > + wbio->bi_op = REQ_OP_WRITE; > > if (submit_bio_wait(wbio) < 0) > /* Failure! */ > @@ -2550,7 +2553,8 @@ read_more: > bio->bi_iter.bi_sector = r10_bio->devs[slot].addr > + choose_data_offset(r10_bio, rdev); > bio->bi_bdev = rdev->bdev; > - bio->bi_rw = READ | do_sync; > + bio->bi_op = REQ_OP_READ; > + bio->bi_rw = do_sync; > bio->bi_private = r10_bio; > bio->bi_end_io = raid10_end_read_request; > if (max_sectors < r10_bio->sectors) { > @@ -3040,7 +3044,7 @@ static sector_t raid10_sync_request(struct mddev > *mddev, sector_t sector_nr, > biolist = bio; > bio->bi_private = r10_bio; > bio->bi_end_io = end_sync_read; > - bio->bi_rw = READ; > + bio->bi_op = REQ_OP_READ; > from_addr = r10_bio->devs[j].addr; > bio->bi_iter.bi_sector = from_addr + > rdev->data_offset; > @@ -3066,7 +3070,7 @@ static sector_t raid10_sync_request(struct mddev > *mddev, sector_t sector_nr, > biolist = bio; > bio->bi_private = r10_bio; > bio->bi_end_io = end_sync_write; > - bio->bi_rw = WRITE; > + bio->bi_op = REQ_OP_WRITE; > bio->bi_iter.bi_sector = to_addr > + rdev->data_offset; > bio->bi_bdev = rdev->bdev; > @@ -3095,7 +3099,7 @@ static sector_t raid10_sync_request(struct mddev > *mddev, sector_t sector_nr, > biolist = bio; > bio->bi_private = r10_bio; > bio->bi_end_io = end_sync_write; > - bio->bi_rw = WRITE; > + bio->bi_op = REQ_OP_WRITE; > bio->bi_iter.bi_sector = to_addr + > rdev->data_offset; > bio->bi_bdev = rdev->bdev; > @@ -3215,7 +3219,7 @@ static sector_t raid10_sync_request(struct mddev > *mddev, sector_t sector_nr, > biolist = bio; > bio->bi_private = r10_bio; > bio->bi_end_io = end_sync_read; > - bio->bi_rw = READ; > + bio->bi_op = REQ_OP_READ; > bio->bi_iter.bi_sector = sector + > conf->mirrors[d].rdev->data_offset; > bio->bi_bdev = conf->mirrors[d].rdev->bdev; > @@ -3237,7 +3241,7 @@ static sector_t raid10_sync_request(struct mddev > *mddev, sector_t sector_nr, > biolist = bio; > bio->bi_private = r10_bio; > bio->bi_end_io = end_sync_write; > - bio->bi_rw = WRITE; > + bio->bi_op = REQ_OP_WRITE; > bio->bi_iter.bi_sector = sector + > conf->mirrors[d].replacement->data_offset; > bio->bi_bdev = conf->mirrors[d].replacement->bdev; > @@ -4320,7 +4324,7 @@ read_more: > + rdev->data_offset); > read_bio->bi_private = r10_bio; > read_bio->bi_end_io = end_sync_read; > - read_bio->bi_rw = READ; > + read_bio->bi_op = REQ_OP_READ; > read_bio->bi_flags &= (~0UL << BIO_RESET_BITS); > read_bio->bi_error = 0; > read_bio->bi_vcnt = 0; > @@ -4354,7 +4358,7 @@ read_more: > rdev2->new_data_offset; > b->bi_private = r10_bio; > b->bi_end_io = end_reshape_write; > - b->bi_rw = WRITE; > + b->bi_op = REQ_OP_WRITE; > b->bi_next = blist; > blist = b; > } > @@ -4522,7 +4526,7 @@ static int handle_reshape_read_error(struct mddev > *mddev, > addr, > s << 9, > bvec[idx].bv_page, > - READ, false); > + REQ_OP_READ, 0, false); > if (success) > break; > failed: > diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c > index 90c2618..56b20c3 100644 > --- a/drivers/md/raid5-cache.c > +++ b/drivers/md/raid5-cache.c > @@ -261,7 +261,7 @@ static struct bio *r5l_bio_alloc(struct r5l_log *log) > { > struct bio *bio = bio_alloc_bioset(GFP_NOIO, BIO_MAX_PAGES, > log->bs); > > - bio->bi_rw = WRITE; > + bio->bi_op = REQ_OP_WRITE; > bio->bi_bdev = log->rdev->bdev; > bio->bi_iter.bi_sector = log->rdev->data_offset + log->log_start; > > @@ -686,6 +686,7 @@ void r5l_flush_stripe_to_raid(struct r5l_log *log) > bio_reset(&log->flush_bio); > log->flush_bio.bi_bdev = log->rdev->bdev; > log->flush_bio.bi_end_io = r5l_log_flush_endio; > + log->flush_bio.bi_op = REQ_OP_WRITE; > log->flush_bio.bi_rw = WRITE_FLUSH; > submit_bio(&log->flush_bio); > } > @@ -882,7 +883,8 @@ static int r5l_read_meta_block(struct r5l_log *log, > struct r5l_meta_block *mb; > u32 crc, stored_crc; > > - if (!sync_page_io(log->rdev, ctx->pos, PAGE_SIZE, page, READ, > false)) > + if (!sync_page_io(log->rdev, ctx->pos, PAGE_SIZE, page, > REQ_OP_READ, 0, > + false)) > return -EIO; > > mb = page_address(page); > @@ -927,7 +929,8 @@ static int r5l_recovery_flush_one_stripe(struct > r5l_log *log, > &disk_index, sh); > > sync_page_io(log->rdev, *log_offset, PAGE_SIZE, > - sh->dev[disk_index].page, READ, > false); > + sh->dev[disk_index].page, > REQ_OP_READ, 0, > + false); > sh->dev[disk_index].log_checksum = > le32_to_cpu(payload->checksum[0]); > set_bit(R5_Wantwrite, &sh->dev[disk_index].flags); > @@ -935,7 +938,8 @@ static int r5l_recovery_flush_one_stripe(struct > r5l_log *log, > } else { > disk_index = sh->pd_idx; > sync_page_io(log->rdev, *log_offset, PAGE_SIZE, > - sh->dev[disk_index].page, READ, > false); > + sh->dev[disk_index].page, > REQ_OP_READ, 0, > + false); > sh->dev[disk_index].log_checksum = > le32_to_cpu(payload->checksum[0]); > set_bit(R5_Wantwrite, &sh->dev[disk_index].flags); > @@ -945,7 +949,7 @@ static int r5l_recovery_flush_one_stripe(struct > r5l_log *log, > sync_page_io(log->rdev, > r5l_ring_add(log, > *log_offset, BLOCK_SECTORS), > PAGE_SIZE, > sh->dev[disk_index].page, > - READ, false); > + REQ_OP_READ, 0, false); > sh->dev[disk_index].log_checksum = > le32_to_cpu(payload->checksum[1]); > set_bit(R5_Wantwrite, > @@ -987,11 +991,13 @@ static int r5l_recovery_flush_one_stripe(struct > r5l_log *log, > rdev = rcu_dereference(conf->disks[disk_index].rdev); > if (rdev) > sync_page_io(rdev, stripe_sect, PAGE_SIZE, > - sh->dev[disk_index].page, WRITE, > false); > + sh->dev[disk_index].page, > REQ_OP_WRITE, 0, > + false); > rrdev = > rcu_dereference(conf->disks[disk_index].replacement); > if (rrdev) > sync_page_io(rrdev, stripe_sect, PAGE_SIZE, > - sh->dev[disk_index].page, WRITE, > false); > + sh->dev[disk_index].page, > REQ_OP_WRITE, 0, > + false); > } > raid5_release_stripe(sh); > return 0; > @@ -1063,7 +1069,8 @@ static int r5l_log_write_empty_meta_block(struct > r5l_log *log, sector_t pos, > crc = crc32c_le(log->uuid_checksum, mb, PAGE_SIZE); > mb->checksum = cpu_to_le32(crc); > > - if (!sync_page_io(log->rdev, pos, PAGE_SIZE, page, WRITE_FUA, > false)) { > + if (!sync_page_io(log->rdev, pos, PAGE_SIZE, page, REQ_OP_WRITE, > + WRITE_FUA, false)) { > __free_page(page); > return -EIO; > } > @@ -1138,7 +1145,7 @@ static int r5l_load_log(struct r5l_log *log) > if (!page) > return -ENOMEM; > > - if (!sync_page_io(rdev, cp, PAGE_SIZE, page, READ, false)) { > + if (!sync_page_io(rdev, cp, PAGE_SIZE, page, REQ_OP_READ, 0, > false)) { > ret = -EIO; > goto ioerr; > } > diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c > index 8ab8b65..c36b817 100644 > --- a/drivers/md/raid5.c > +++ b/drivers/md/raid5.c > @@ -806,7 +806,8 @@ static void stripe_add_to_batch_list(struct r5conf > *conf, struct stripe_head *sh > dd_idx = 0; > while (dd_idx == sh->pd_idx || dd_idx == sh->qd_idx) > dd_idx++; > - if (head->dev[dd_idx].towrite->bi_rw != > sh->dev[dd_idx].towrite->bi_rw) > + if (head->dev[dd_idx].towrite->bi_rw != > sh->dev[dd_idx].towrite->bi_rw || > + head->dev[dd_idx].towrite->bi_op != > sh->dev[dd_idx].towrite->bi_op) > goto unlock_out; > > if (head->batch_head) { > @@ -891,29 +892,32 @@ static void ops_run_io(struct stripe_head *sh, > struct stripe_head_state *s) > if (r5l_write_stripe(conf->log, sh) == 0) > return; > for (i = disks; i--; ) { > - int rw; > + int op; > + int op_flags = 0; > int replace_only = 0; > struct bio *bi, *rbi; > struct md_rdev *rdev, *rrdev = NULL; > > sh = head_sh; > if (test_and_clear_bit(R5_Wantwrite, &sh->dev[i].flags)) { > - if (test_and_clear_bit(R5_WantFUA, > &sh->dev[i].flags)) > - rw = WRITE_FUA; > - else > - rw = WRITE; > + if (test_and_clear_bit(R5_WantFUA, > &sh->dev[i].flags)) { > + op = REQ_OP_WRITE; > + op_flags = WRITE_FUA; > + } else { > + op = REQ_OP_WRITE; > + } > if (test_bit(R5_Discard, &sh->dev[i].flags)) > - rw |= REQ_DISCARD; > + op = REQ_OP_DISCARD; > } else if (test_and_clear_bit(R5_Wantread, > &sh->dev[i].flags)) > - rw = READ; > + op = REQ_OP_READ; > else if (test_and_clear_bit(R5_WantReplace, > &sh->dev[i].flags)) { > - rw = WRITE; > + op = REQ_OP_WRITE; > replace_only = 1; > } else > continue; > if (test_and_clear_bit(R5_SyncIO, &sh->dev[i].flags)) > - rw |= REQ_SYNC; > + op_flags |= REQ_SYNC; > > again: > bi = &sh->dev[i].req; > @@ -927,7 +931,7 @@ again: > rdev = rrdev; > rrdev = NULL; > } > - if (rw & WRITE) { > + if (op_is_write(op)) { > if (replace_only) > rdev = NULL; > if (rdev == rrdev) > @@ -953,7 +957,7 @@ again: > * need to check for writes. We never accept write errors > * on the replacement, so we don't to check rrdev. > */ > - while ((rw & WRITE) && rdev && > + while (op_is_write(op) && rdev && > test_bit(WriteErrorSeen, &rdev->flags)) { > sector_t first_bad; > int bad_sectors; > @@ -995,8 +999,9 @@ again: > > bio_reset(bi); > bi->bi_bdev = rdev->bdev; > - bi->bi_rw = rw; > - bi->bi_end_io = (rw & WRITE) > + bi->bi_op = op; > + bi->bi_rw = op_flags; > + bi->bi_end_io = op_is_write(op) > ? raid5_end_write_request > : raid5_end_read_request; > bi->bi_private = sh; > @@ -1027,7 +1032,7 @@ again: > * If this is discard request, set bi_vcnt 0. We > don't > * want to confuse SCSI because SCSI will replace > payload > */ > - if (rw & REQ_DISCARD) > + if (op == REQ_OP_DISCARD) > bi->bi_vcnt = 0; > if (rrdev) > set_bit(R5_DOUBLE_LOCKED, > &sh->dev[i].flags); > @@ -1047,8 +1052,9 @@ again: > > bio_reset(rbi); > rbi->bi_bdev = rrdev->bdev; > - rbi->bi_rw = rw; > - BUG_ON(!(rw & WRITE)); > + rbi->bi_op = op; > + rbi->bi_rw = op_flags; > + BUG_ON(!op_is_write(op)); > rbi->bi_end_io = raid5_end_write_request; > rbi->bi_private = sh; > > @@ -1076,7 +1082,7 @@ again: > * If this is discard request, set bi_vcnt 0. We > don't > * want to confuse SCSI because SCSI will replace > payload > */ > - if (rw & REQ_DISCARD) > + if (op == REQ_OP_DISCARD) > rbi->bi_vcnt = 0; > if (conf->mddev->gendisk) > > trace_block_bio_remap(bdev_get_queue(rbi->bi_bdev), > @@ -1085,7 +1091,7 @@ again: > generic_make_request(rbi); > } > if (!rdev && !rrdev) { > - if (rw & WRITE) > + if (op_is_write(op)) > set_bit(STRIPE_DEGRADED, &sh->state); > pr_debug("skip op %ld on disc %d for sector > %llu\n", > bi->bi_rw, i, (unsigned long > long)sh->sector); > @@ -1623,7 +1629,7 @@ again: > set_bit(R5_WantFUA, &dev->flags); > if (wbi->bi_rw & REQ_SYNC) > set_bit(R5_SyncIO, &dev->flags); > - if (wbi->bi_rw & REQ_DISCARD) > + if (wbi->bi_op == REQ_OP_DISCARD) > set_bit(R5_Discard, &dev->flags); > else { > tx = async_copy_data(1, wbi, > &dev->page, > @@ -5178,7 +5184,7 @@ static void raid5_make_request(struct mddev *mddev, > struct bio * bi) > return; > } > > - if (unlikely(bi->bi_rw & REQ_DISCARD)) { > + if (unlikely(bi->bi_op == REQ_OP_DISCARD)) { > make_discard_request(mddev, bi); > return; > } > -- > 2.7.2 > > -- > dm-devel mailing list > dm-devel@redhat.com > https://www.redhat.com/mailman/listinfo/dm-devel > -- Shaun Tancheff --94eb2c0766c65497ea05312f4703 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPjxkaXYgY2xhc3M9ImdtYWls X3F1b3RlIj5PbiBGcmksIEFwciAxNSwgMjAxNiBhdCA1OjM5IEFNLCAgPHNwYW4gZGlyPSJsdHIi PiZsdDs8YSBocmVmPSJtYWlsdG86bWNocmlzdGlAcmVkaGF0LmNvbSIgdGFyZ2V0PSJfYmxhbmsi Pm1jaHJpc3RpQHJlZGhhdC5jb208L2E+Jmd0Ozwvc3Bhbj4gd3JvdGU6PGJyPjxibG9ja3F1b3Rl IGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjowcHggMHB4IDBweCAwLjhleDtib3Jk ZXItbGVmdC13aWR0aDoxcHg7Ym9yZGVyLWxlZnQtc3R5bGU6c29saWQ7Ym9yZGVyLWxlZnQtY29s b3I6cmdiKDIwNCwyMDQsMjA0KTtwYWRkaW5nLWxlZnQ6MWV4Ij5Gcm9tOiBNaWtlIENocmlzdGll ICZsdDs8YSBocmVmPSJtYWlsdG86bWNocmlzdGlAcmVkaGF0LmNvbSI+bWNocmlzdGlAcmVkaGF0 LmNvbTwvYT4mZ3Q7PGJyPg0KPGJyPg0KVGhpcyBwYXRjaCBoYXMgbWQgdXNlIGJpby0mZ3Q7Ymlf b3AgZm9yIFJFUV9PUHMgYW5kIHJxX2ZsYWdfYml0czxicj4NCnRvIGJpby0mZ3Q7YmlfcncuPGJy Pg0KPGJyPg0KU2lnbmVkLW9mZi1ieTogTWlrZSBDaHJpc3RpZSAmbHQ7PGEgaHJlZj0ibWFpbHRv Om1jaHJpc3RpQHJlZGhhdC5jb20iPm1jaHJpc3RpQHJlZGhhdC5jb208L2E+Jmd0Ozxicj4NClJl dmlld2VkLWJ5OiBDaHJpc3RvcGggSGVsbHdpZyAmbHQ7PGEgaHJlZj0ibWFpbHRvOmhjaEBsc3Qu ZGUiPmhjaEBsc3QuZGU8L2E+Jmd0Ozxicj4NClJldmlld2VkLWJ5OiBIYW5uZXMgUmVpbmVja2Ug Jmx0OzxhIGhyZWY9Im1haWx0bzpoYXJlQHN1c2UuY29tIj5oYXJlQHN1c2UuY29tPC9hPiZndDs8 YnI+DQotLS08YnI+DQrCoGRyaXZlcnMvbWQvYml0bWFwLmPCoCDCoCDCoCB8wqAgMiArLTxicj4N CsKgZHJpdmVycy9tZC9kbS1yYWlkLmPCoCDCoCDCoHzCoCA1ICsrKy0tPGJyPg0KwqBkcml2ZXJz L21kL21kLmPCoCDCoCDCoCDCoCDCoCB8IDExICsrKysrKystLS0tPGJyPg0KwqBkcml2ZXJzL21k L21kLmjCoCDCoCDCoCDCoCDCoCB8wqAgMyArKy08YnI+DQrCoGRyaXZlcnMvbWQvcmFpZDEuY8Kg IMKgIMKgIMKgfCAzNCArKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLTxicj4NCsKgZHJp dmVycy9tZC9yYWlkMTAuY8KgIMKgIMKgIHwgNTAgKysrKysrKysrKysrKysrKysrKysrKysrKyst LS0tLS0tLS0tLS0tLS0tLS0tLS0tPGJyPg0KwqBkcml2ZXJzL21kL3JhaWQ1LWNhY2hlLmMgfCAy NSArKysrKysrKysrKysrKystLS0tLS0tLS08YnI+DQrCoGRyaXZlcnMvbWQvcmFpZDUuY8KgIMKg IMKgIMKgfCA0OCArKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLS0tLS0t PGJyPg0KwqA4IGZpbGVzIGNoYW5nZWQsIDEwMSBpbnNlcnRpb25zKCspLCA3NyBkZWxldGlvbnMo LSk8YnI+DQo8YnI+PC9ibG9ja3F1b3RlPjxkaXY+PGJyPjwvZGl2PjxkaXY+U29ycnkgSSB0aG91 Z2ggdGhpcyB3b3VsZCB0aHJlYWQgcHJvcGVydGx5OsKgPC9kaXY+PGRpdj48YSBocmVmPSJodHRw czovL2xrbWwua2VybmVsLm9yZy9yLzE0NjE0NTI3MDktNjcwMi0xLWdpdC1zZW5kLWVtYWlsLXNo YXVuQHRhbmNoZWZmLmNvbSI+aHR0cHM6Ly9sa21sLmtlcm5lbC5vcmcvci8xNDYxNDUyNzA5LTY3 MDItMS1naXQtc2VuZC1lbWFpbC1zaGF1bkB0YW5jaGVmZi5jb208L2E+PGJyPjwvZGl2PjxkaXY+ PGJyPjwvZGl2PjxkaXY+SW4gcmFpZDAuYywgcmFpZDEwLmMgYW5kIHJhaWQ1LmM8L2Rpdj48ZGl2 Pjxicj48L2Rpdj48ZGl2PjxkaXY+QSBjb3VwbGUgb2YgY2hlY2tzIGZvciBSRVFfUFJFRkxVU0gg ZmxhZyBzaG91bGQgYWxzbyBjaGVjayBmb3I8L2Rpdj48ZGl2PmJpX29wIG1hdGNoaW5nIFJFUV9P UF9GTFVTSC48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PkluIHJhaWQxLmMgW3IxX3N5bmNfcGFn ZV9pbygpXSBhbmQgcmFpZDEwLmMgW3IxMF9zeW5jX3BhZ2VfaW8oKV08L2Rpdj48ZGl2Pjxicj48 L2Rpdj48ZGl2PldyYXBwZXJzIGZvciBzeW5jX3BhZ2VfaW8oKSBhcmUgcGFzc2VkIFJFQUQvV1JJ VEUgYnV0IG5lZWQgdG88L2Rpdj48ZGl2PmJlIHBhc3NlZCBSRVFfT1BfUkVBRCBhbmQgUkVRX09Q X1dSSVRFLjwvZGl2PjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+QW55d2F5IG15IHJhaWQgdGVz dGluZyB3YXMgZ2V0dGluZyB3ZWlyZCBoYW5ncyBhbmQgY29ycnVwdGlvbjwvZGl2PjxkaXY+d2l0 aG91dCB0aGUgcGF0Y2guPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5UaGFua3MhPC9kaXY+PGRp dj48YnI+PC9kaXY+PGRpdj7CoDwvZGl2PjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIg c3R5bGU9Im1hcmdpbjowcHggMHB4IDBweCAwLjhleDtib3JkZXItbGVmdC13aWR0aDoxcHg7Ym9y ZGVyLWxlZnQtc3R5bGU6c29saWQ7Ym9yZGVyLWxlZnQtY29sb3I6cmdiKDIwNCwyMDQsMjA0KTtw YWRkaW5nLWxlZnQ6MWV4Ij4NCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JpdG1hcC5jIGIvZHJp dmVycy9tZC9iaXRtYXAuYzxicj4NCmluZGV4IDhiMmUxNmYuLjllODAxOWUgMTAwNjQ0PGJyPg0K LS0tIGEvZHJpdmVycy9tZC9iaXRtYXAuYzxicj4NCisrKyBiL2RyaXZlcnMvbWQvYml0bWFwLmM8 YnI+DQpAQCAtMTU5LDcgKzE1OSw3IEBAIHN0YXRpYyBpbnQgcmVhZF9zYl9wYWdlKHN0cnVjdCBt ZGRldiAqbWRkZXYsIGxvZmZfdCBvZmZzZXQsPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgaWYgKHN5bmNfcGFnZV9pbyhyZGV2LCB0YXJnZXQsPGJyPg0KwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByb3VuZHVwKHNpemUsIGJkZXZfbG9n aWNhbF9ibG9ja19zaXplKHJkZXYtJmd0O2JkZXYpKSw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcGFnZSwgUkVBRCwgdHJ1ZSkpIHs8YnI+DQor wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcGFnZSwgUkVR X09QX1JFQUQsIDAsIHRydWUpKSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgcGFnZS0mZ3Q7aW5kZXggPSBpbmRleDs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCByZXR1cm4gMDs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB9PGJy Pg0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tcmFpZC5jIGIvZHJpdmVycy9tZC9kbS1yYWlk LmM8YnI+DQppbmRleCBhMDkwMTIxLi40M2E3NDljIDEwMDY0NDxicj4NCi0tLSBhL2RyaXZlcnMv bWQvZG0tcmFpZC5jPGJyPg0KKysrIGIvZHJpdmVycy9tZC9kbS1yYWlkLmM8YnI+DQpAQCAtNzky LDcgKzc5Miw3IEBAIHN0YXRpYyBpbnQgcmVhZF9kaXNrX3NiKHN0cnVjdCBtZF9yZGV2ICpyZGV2 LCBpbnQgc2l6ZSk8YnI+DQrCoCDCoCDCoCDCoCBpZiAocmRldi0mZ3Q7c2JfbG9hZGVkKTxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJldHVybiAwOzxicj4NCjxicj4NCi3CoCDCoCDCoCDC oGlmICghc3luY19wYWdlX2lvKHJkZXYsIDAsIHNpemUsIHJkZXYtJmd0O3NiX3BhZ2UsIFJFQUQs IDEpKSB7PGJyPg0KK8KgIMKgIMKgIMKgaWYgKCFzeW5jX3BhZ2VfaW8ocmRldiwgMCwgc2l6ZSwg cmRldi0mZ3Q7c2JfcGFnZSwgUkVRX09QX1JFQUQsIDAsIDEpKSB7PGJyPg0KwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgRE1FUlIoJnF1b3Q7RmFpbGVkIHRvIHJlYWQgc3VwZXJibG9jayBvZiBkZXZp Y2UgYXQgcG9zaXRpb24gJWQmcXVvdDssPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgcmRldi0mZ3Q7cmFpZF9kaXNrKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBt ZF9lcnJvcihyZGV2LSZndDttZGRldiwgcmRldik7PGJyPg0KQEAgLTE2NDYsNyArMTY0Niw4IEBA IHN0YXRpYyB2b2lkIGF0dGVtcHRfcmVzdG9yZV9vZl9mYXVsdHlfZGV2aWNlcyhzdHJ1Y3QgcmFp ZF9zZXQgKnJzKTxicj4NCsKgIMKgIMKgIMKgIGZvciAoaSA9IDA7IGkgJmx0OyBycy0mZ3Q7bWQu cmFpZF9kaXNrczsgaSsrKSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgciA9ICZhbXA7 cnMtJmd0O2RldltpXS5yZGV2Ozxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmICh0ZXN0 X2JpdChGYXVsdHksICZhbXA7ci0mZ3Q7ZmxhZ3MpICZhbXA7JmFtcDsgci0mZ3Q7c2JfcGFnZSAm YW1wOyZhbXA7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc3luY19wYWdlX2lv KHIsIDAsIHItJmd0O3NiX3NpemUsIHItJmd0O3NiX3BhZ2UsIFJFQUQsIDEpKSB7PGJyPg0KK8Kg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc3luY19wYWdlX2lvKHIsIDAsIHItJmd0O3NiX3Np emUsIHItJmd0O3NiX3BhZ2UsIFJFUV9PUF9SRUFELCAwLDxicj4NCivCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAxKSkgezxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIERNSU5GTygmcXVvdDtGYXVsdHkgJXMgZGV2aWNlICMlZCBo YXMgcmVhZGFibGUgc3VwZXIgYmxvY2suJnF1b3Q7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDvCoCBBdHRlbXB0aW5nIHRvIHJldml2ZSBp dC4mcXVvdDssPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBycy0mZ3Q7cmFpZF90eXBlLSZndDtuYW1lLCBpKTs8YnI+DQpkaWZmIC0tZ2l0IGEvZHJp dmVycy9tZC9tZC5jIGIvZHJpdmVycy9tZC9tZC5jPGJyPg0KaW5kZXggZWMzYzk4ZC4uOWM0MDM2 OCAxMDA2NDQ8YnI+DQotLS0gYS9kcml2ZXJzL21kL21kLmM8YnI+DQorKysgYi9kcml2ZXJzL21k L21kLmM8YnI+DQpAQCAtMzkyLDYgKzM5Miw3IEBAIHN0YXRpYyB2b2lkIHN1Ym1pdF9mbHVzaGVz KHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgYmktJmd0O2JpX2VuZF9pbyA9IG1kX2VuZF9mbHVzaDs8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBiaS0mZ3Q7YmlfcHJpdmF0ZSA9IHJkZXY7PGJyPg0K wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgYmktJmd0O2JpX2JkZXYgPSByZGV2 LSZndDtiZGV2Ozxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGJpLSZn dDtiaV9vcCA9IFJFUV9PUF9XUklURTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCBiaS0mZ3Q7YmlfcncgPSBXUklURV9GTFVTSDs8YnI+DQrCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCBhdG9taWNfaW5jKCZhbXA7bWRkZXYtJmd0O2ZsdXNoX3BlbmRp bmcpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHN1Ym1pdF9iaW8o YmkpOzxicj4NCkBAIC03NDEsNiArNzQyLDcgQEAgdm9pZCBtZF9zdXBlcl93cml0ZShzdHJ1Y3Qg bWRkZXYgKm1kZGV2LCBzdHJ1Y3QgbWRfcmRldiAqcmRldiw8YnI+DQrCoCDCoCDCoCDCoCBiaW9f YWRkX3BhZ2UoYmlvLCBwYWdlLCBzaXplLCAwKTs8YnI+DQrCoCDCoCDCoCDCoCBiaW8tJmd0O2Jp X3ByaXZhdGUgPSByZGV2Ozxicj4NCsKgIMKgIMKgIMKgIGJpby0mZ3Q7YmlfZW5kX2lvID0gc3Vw ZXJfd3JpdHRlbjs8YnI+DQorwqAgwqAgwqAgwqBiaW8tJmd0O2JpX29wID0gUkVRX09QX1dSSVRF Ozxicj4NCsKgIMKgIMKgIMKgIGJpby0mZ3Q7YmlfcncgPSBXUklURV9GTFVTSF9GVUE7PGJyPg0K PGJyPg0KwqAgwqAgwqAgwqAgYXRvbWljX2luYygmYW1wO21kZGV2LSZndDtwZW5kaW5nX3dyaXRl cyk7PGJyPg0KQEAgLTc1NCwxNCArNzU2LDE1IEBAIHZvaWQgbWRfc3VwZXJfd2FpdChzdHJ1Y3Qg bWRkZXYgKm1kZGV2KTxicj4NCsKgfTxicj4NCjxicj4NCsKgaW50IHN5bmNfcGFnZV9pbyhzdHJ1 Y3QgbWRfcmRldiAqcmRldiwgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgc2l6ZSw8YnI+DQotwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBydywgYm9vbCBtZXRhZGF0 YV9vcCk8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgc3RydWN0IHBhZ2UgKnBhZ2UsIGlu dCBvcCwgaW50IG9wX2ZsYWdzLCBib29sIG1ldGFkYXRhX29wKTxicj4NCsKgezxicj4NCsKgIMKg IMKgIMKgIHN0cnVjdCBiaW8gKmJpbyA9IGJpb19hbGxvY19tZGRldihHRlBfTk9JTywgMSwgcmRl di0mZ3Q7bWRkZXYpOzxicj4NCsKgIMKgIMKgIMKgIGludCByZXQ7PGJyPg0KPGJyPg0KwqAgwqAg wqAgwqAgYmlvLSZndDtiaV9iZGV2ID0gKG1ldGFkYXRhX29wICZhbXA7JmFtcDsgcmRldi0mZ3Q7 bWV0YV9iZGV2KSA/PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmRldi0mZ3Q7bWV0YV9i ZGV2IDogcmRldi0mZ3Q7YmRldjs8YnI+DQotwqAgwqAgwqAgwqBiaW8tJmd0O2JpX3J3ID0gcnc7 PGJyPg0KK8KgIMKgIMKgIMKgYmlvLSZndDtiaV9vcCA9IG9wOzxicj4NCivCoCDCoCDCoCDCoGJp by0mZ3Q7YmlfcncgPSBvcF9mbGFnczs8YnI+DQrCoCDCoCDCoCDCoCBpZiAobWV0YWRhdGFfb3Ap PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgYmlvLSZndDtiaV9pdGVyLmJpX3NlY3RvciA9 IHNlY3RvciArIHJkZXYtJmd0O3NiX3N0YXJ0Ozxicj4NCsKgIMKgIMKgIMKgIGVsc2UgaWYgKHJk ZXYtJmd0O21kZGV2LSZndDtyZXNoYXBlX3Bvc2l0aW9uICE9IE1heFNlY3RvciAmYW1wOyZhbXA7 PGJyPg0KQEAgLTc4Nyw3ICs3OTAsNyBAQCBzdGF0aWMgaW50IHJlYWRfZGlza19zYihzdHJ1Y3Qg bWRfcmRldiAqcmRldiwgaW50IHNpemUpPGJyPg0KwqAgwqAgwqAgwqAgaWYgKHJkZXYtJmd0O3Ni X2xvYWRlZCk8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZXR1cm4gMDs8YnI+DQo8YnI+ DQotwqAgwqAgwqAgwqBpZiAoIXN5bmNfcGFnZV9pbyhyZGV2LCAwLCBzaXplLCByZGV2LSZndDtz Yl9wYWdlLCBSRUFELCB0cnVlKSk8YnI+DQorwqAgwqAgwqAgwqBpZiAoIXN5bmNfcGFnZV9pbyhy ZGV2LCAwLCBzaXplLCByZGV2LSZndDtzYl9wYWdlLCBSRVFfT1BfUkVBRCwgMCwgdHJ1ZSkpPGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZ290byBmYWlsOzxicj4NCsKgIMKgIMKgIMKgIHJk ZXYtJmd0O3NiX2xvYWRlZCA9IDE7PGJyPg0KwqAgwqAgwqAgwqAgcmV0dXJuIDA7PGJyPg0KQEAg LTE0NzMsNyArMTQ3Niw3IEBAIHN0YXRpYyBpbnQgc3VwZXJfMV9sb2FkKHN0cnVjdCBtZF9yZGV2 ICpyZGV2LCBzdHJ1Y3QgbWRfcmRldiAqcmVmZGV2LCBpbnQgbWlub3JfPGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmV0dXJuIC1FSU5WQUw7PGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgYmJfc2VjdG9yID0gKGxvbmcgbG9uZylvZmZzZXQ7PGJyPg0KwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgaWYgKCFzeW5jX3BhZ2VfaW8ocmRldiwgYmJfc2VjdG9yLCBzZWN0 b3JzICZsdDsmbHQ7IDksPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgcmRldi0mZ3Q7YmJfcGFnZSwgUkVBRCwgdHJ1ZSkpPGJyPg0KK8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmRldi0mZ3Q7YmJf cGFnZSwgUkVRX09QX1JFQUQsIDAsIHRydWUpKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIHJldHVybiAtRUlPOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGJi cCA9ICh1NjQgKilwYWdlX2FkZHJlc3MocmRldi0mZ3Q7YmJfcGFnZSk7PGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgcmRldi0mZ3Q7YmFkYmxvY2tzLnNoaWZ0ID0gc2ItJmd0O2JibG9nX3No aWZ0Ozxicj4NCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL21kLmggYi9kcml2ZXJzL21kL21kLmg8 YnI+DQppbmRleCBiNWM0YmU3Li4yZTA5MThmIDEwMDY0NDxicj4NCi0tLSBhL2RyaXZlcnMvbWQv bWQuaDxicj4NCisrKyBiL2RyaXZlcnMvbWQvbWQuaDxicj4NCkBAIC02MTgsNyArNjE4LDggQEAg ZXh0ZXJuIHZvaWQgbWRfc3VwZXJfd3JpdGUoc3RydWN0IG1kZGV2ICptZGRldiwgc3RydWN0IG1k X3JkZXYgKnJkZXYsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplLCBzdHJ1Y3QgcGFnZSAqcGFnZSk7PGJyPg0KwqBl eHRlcm4gdm9pZCBtZF9zdXBlcl93YWl0KHN0cnVjdCBtZGRldiAqbWRkZXYpOzxicj4NCsKgZXh0 ZXJuIGludCBzeW5jX3BhZ2VfaW8oc3RydWN0IG1kX3JkZXYgKnJkZXYsIHNlY3Rvcl90IHNlY3Rv ciwgaW50IHNpemUsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc3Ry dWN0IHBhZ2UgKnBhZ2UsIGludCBydywgYm9vbCBtZXRhZGF0YV9vcCk7PGJyPg0KK8KgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBvcCwgaW50 IG9wX2ZsYWdzLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGJvb2wg bWV0YWRhdGFfb3ApOzxicj4NCsKgZXh0ZXJuIHZvaWQgbWRfZG9fc3luYyhzdHJ1Y3QgbWRfdGhy ZWFkICp0aHJlYWQpOzxicj4NCsKgZXh0ZXJuIHZvaWQgbWRfbmV3X2V2ZW50KHN0cnVjdCBtZGRl diAqbWRkZXYpOzxicj4NCsKgZXh0ZXJuIGludCBtZF9hbGxvd193cml0ZShzdHJ1Y3QgbWRkZXYg Km1kZGV2KTs8YnI+DQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkMS5jIGIvZHJpdmVycy9t ZC9yYWlkMS5jPGJyPg0KaW5kZXggNDI0ZGY3ZS4uYzdhYmQyZCAxMDA2NDQ8YnI+DQotLS0gYS9k cml2ZXJzL21kL3JhaWQxLmM8YnI+DQorKysgYi9kcml2ZXJzL21kL3JhaWQxLmM8YnI+DQpAQCAt NzU5LDcgKzc1OSw3IEBAIHN0YXRpYyB2b2lkIGZsdXNoX3BlbmRpbmdfd3JpdGVzKHN0cnVjdCBy MWNvbmYgKmNvbmYpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgd2hpbGUgKGJpbykgeyAv KiBzdWJtaXQgcGVuZGluZyB3cml0ZXMgKi88YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCBzdHJ1Y3QgYmlvICpuZXh0ID0gYmlvLSZndDtiaV9uZXh0Ozxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGJpby0mZ3Q7YmlfbmV4dCA9IE5VTEw7PGJy Pg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKHVubGlrZWx5KChiaW8t Jmd0O2JpX3J3ICZhbXA7IFJFUV9ESVNDQVJEKSAmYW1wOyZhbXA7PGJyPg0KK8KgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKHVubGlrZWx5KChiaW8tJmd0O2JpX29wID09IFJF UV9PUF9ESVNDQVJEKSAmYW1wOyZhbXA7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgIWJsa19xdWV1ZV9kaXNjYXJkKGJkZXZfZ2V0X3F1ZXVlKGJpby0mZ3Q7 YmlfYmRldikpKSk8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCAvKiBKdXN0IGlnbm9yZSBpdCAqLzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGJpb19lbmRpbyhiaW8pOzxicj4NCkBAIC0xMDMzLDcg KzEwMzMsNyBAQCBzdGF0aWMgdm9pZCByYWlkMV91bnBsdWcoc3RydWN0IGJsa19wbHVnX2NiICpj YiwgYm9vbCBmcm9tX3NjaGVkdWxlKTxicj4NCsKgIMKgIMKgIMKgIHdoaWxlIChiaW8pIHsgLyog c3VibWl0IHBlbmRpbmcgd3JpdGVzICovPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgc3Ry dWN0IGJpbyAqbmV4dCA9IGJpby0mZ3Q7YmlfbmV4dDs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCBiaW8tJmd0O2JpX25leHQgPSBOVUxMOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oGlmICh1bmxpa2VseSgoYmlvLSZndDtiaV9ydyAmYW1wOyBSRVFfRElTQ0FSRCkgJmFtcDsmYW1w Ozxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmICh1bmxpa2VseSgoYmlvLSZndDtiaV9v cCA9PSBSRVFfT1BfRElTQ0FSRCkgJmFtcDsmYW1wOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgICFibGtfcXVldWVfZGlzY2FyZChiZGV2X2dldF9xdWV1ZShiaW8tJmd0O2JpX2Jk ZXYpKSkpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgLyogSnVzdCBp Z25vcmUgaXQgKi88YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBiaW9f ZW5kaW8oYmlvKTs8YnI+DQpAQCAtMTA1MywxMiArMTA1MywxMSBAQCBzdGF0aWMgdm9pZCByYWlk MV9tYWtlX3JlcXVlc3Qoc3RydWN0IG1kZGV2ICptZGRldiwgc3RydWN0IGJpbyAqIGJpbyk8YnI+ DQrCoCDCoCDCoCDCoCBpbnQgaSwgZGlza3M7PGJyPg0KwqAgwqAgwqAgwqAgc3RydWN0IGJpdG1h cCAqYml0bWFwOzxicj4NCsKgIMKgIMKgIMKgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7PGJyPg0KK8Kg IMKgIMKgIMKgY29uc3QgaW50IG9wID0gYmlvLSZndDtiaV9vcDs8YnI+DQrCoCDCoCDCoCDCoCBj b25zdCBpbnQgcncgPSBiaW9fZGF0YV9kaXIoYmlvKTs8YnI+DQrCoCDCoCDCoCDCoCBjb25zdCB1 bnNpZ25lZCBsb25nIGRvX3N5bmMgPSAoYmlvLSZndDtiaV9ydyAmYW1wOyBSRVFfU1lOQyk7PGJy Pg0KwqAgwqAgwqAgwqAgY29uc3QgdW5zaWduZWQgbG9uZyBkb19mbHVzaF9mdWEgPSAoYmlvLSZn dDtiaV9ydyAmYW1wOyAoUkVRX0ZMVVNIIHwgUkVRX0ZVQSkpOzxicj4NCi3CoCDCoCDCoCDCoGNv bnN0IHVuc2lnbmVkIGxvbmcgZG9fZGlzY2FyZCA9IChiaW8tJmd0O2JpX3J3PGJyPg0KLcKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg JmFtcDsgKFJFUV9ESVNDQVJEIHwgUkVRX1NFQ1VSRSkpOzxicj4NCi3CoCDCoCDCoCDCoGNvbnN0 IHVuc2lnbmVkIGxvbmcgZG9fc2FtZSA9IChiaW8tJmd0O2JpX3J3ICZhbXA7IFJFUV9XUklURV9T QU1FKTs8YnI+DQorwqAgwqAgwqAgwqBjb25zdCB1bnNpZ25lZCBsb25nIGRvX3NlYyA9IChiaW8t Jmd0O2JpX3J3ICZhbXA7IFJFUV9TRUNVUkUpOzxicj4NCsKgIMKgIMKgIMKgIHN0cnVjdCBtZF9y ZGV2ICpibG9ja2VkX3JkZXY7PGJyPg0KwqAgwqAgwqAgwqAgc3RydWN0IGJsa19wbHVnX2NiICpj Yjs8YnI+DQrCoCDCoCDCoCDCoCBzdHJ1Y3QgcmFpZDFfcGx1Z19jYiAqcGx1ZyA9IE5VTEw7PGJy Pg0KQEAgLTExNjYsNyArMTE2NSw4IEBAIHJlYWRfYWdhaW46PGJyPg0KwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgbWlycm9yLSZndDtyZGV2LSZndDtkYXRhX29mZnNldDs8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZWFkX2Jpby0mZ3Q7YmlfYmRldiA9IG1pcnJvci0m Z3Q7cmRldi0mZ3Q7YmRldjs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZWFkX2Jpby0m Z3Q7YmlfZW5kX2lvID0gcmFpZDFfZW5kX3JlYWRfcmVxdWVzdDs8YnI+DQotwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqByZWFkX2Jpby0mZ3Q7YmlfcncgPSBSRUFEIHwgZG9fc3luYzs8YnI+DQorwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqByZWFkX2Jpby0mZ3Q7Ymlfb3AgPSBvcDs8YnI+DQorwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqByZWFkX2Jpby0mZ3Q7YmlfcncgPSBkb19zeW5jOzxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIHJlYWRfYmlvLSZndDtiaV9wcml2YXRlID0gcjFfYmlvOzxicj4N Cjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmIChtYXhfc2VjdG9ycyAmbHQ7IHIxX2Jp by0mZ3Q7c2VjdG9ycykgezxicj4NCkBAIC0xMzc2LDggKzEzNzYsOSBAQCByZWFkX2FnYWluOjxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg Y29uZi0mZ3Q7bWlycm9yc1tpXS5yZGV2LSZndDtkYXRhX29mZnNldCk7PGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgbWJpby0mZ3Q7YmlfYmRldiA9IGNvbmYtJmd0O21pcnJvcnNbaV0ucmRl di0mZ3Q7YmRldjs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBtYmlvLSZndDtiaV9lbmRf aW8gPSByYWlkMV9lbmRfd3JpdGVfcmVxdWVzdDs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBtYmlvLSZndDtiaV9vcCA9IG9wOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG1iaW8t Jmd0O2JpX3J3ID08YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBXUklU RSB8IGRvX2ZsdXNoX2Z1YSB8IGRvX3N5bmMgfCBkb19kaXNjYXJkIHwgZG9fc2FtZTs8YnI+DQor wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBkb19mbHVzaF9mdWEgfCBkb19zeW5j IHwgZG9fc2VjOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG1iaW8tJmd0O2JpX3ByaXZh dGUgPSByMV9iaW87PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgYXRvbWljX2lu YygmYW1wO3IxX2Jpby0mZ3Q7cmVtYWluaW5nKTs8YnI+DQpAQCAtMTc3MSw3ICsxNzcyLDcgQEAg c3RhdGljIHZvaWQgZW5kX3N5bmNfd3JpdGUoc3RydWN0IGJpbyAqYmlvKTxicj4NCsKgc3RhdGlj IGludCByMV9zeW5jX3BhZ2VfaW8oc3RydWN0IG1kX3JkZXYgKnJkZXYsIHNlY3Rvcl90IHNlY3Rv ciw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpbnQgc2Vj dG9ycywgc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBydyk8YnI+DQrCoHs8YnI+DQotwqAgwqAgwqAg wqBpZiAoc3luY19wYWdlX2lvKHJkZXYsIHNlY3Rvciwgc2VjdG9ycyAmbHQ7Jmx0OyA5LCBwYWdl LCBydywgZmFsc2UpKTxicj4NCivCoCDCoCDCoCDCoGlmIChzeW5jX3BhZ2VfaW8ocmRldiwgc2Vj dG9yLCBzZWN0b3JzICZsdDsmbHQ7IDksIHBhZ2UsIHJ3LCAwLCBmYWxzZSkpPGJyPg0KwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgLyogc3VjY2VzcyAqLzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIHJldHVybiAxOzxicj4NCsKgIMKgIMKgIMKgIGlmIChydyA9PSBXUklURSkgezxicj4NCkBA IC0xODI1LDcgKzE4MjYsNyBAQCBzdGF0aWMgaW50IGZpeF9zeW5jX3JlYWRfZXJyb3Ioc3RydWN0 IHIxYmlvICpyMV9iaW8pPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgcmRldiA9IGNvbmYtJmd0O21pcnJvcnNbZF0ucmRldjs8YnI+DQrCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZiAoc3luY19wYWdlX2lv KHJkZXYsIHNlY3QsIHMmbHQ7Jmx0OzksPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBiaW8tJmd0O2Jp X2lvX3ZlY1tpZHhdLmJ2X3BhZ2UsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIFJFQUQsIGZhbHNlKSkg ezxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBSRVFfT1BfUkVBRCwgMCwgZmFsc2UpKSB7PGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg c3VjY2VzcyA9IDE7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgYnJlYWs7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgfTxicj4NCkBAIC0yMDMwLDcgKzIwMzEsNyBAQCBzdGF0 aWMgdm9pZCBzeW5jX3JlcXVlc3Rfd3JpdGUoc3RydWN0IG1kZGV2ICptZGRldiwgc3RydWN0IHIx YmlvICpyMV9iaW8pPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgIXRlc3Rf Yml0KE1EX1JFQ09WRVJZX1NZTkMsICZhbXA7bWRkZXYtJmd0O3JlY292ZXJ5KSkpKTxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGNvbnRpbnVlOzxicj4NCjxicj4NCi3C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoHdiaW8tJmd0O2JpX3J3ID0gV1JJVEU7PGJyPg0KK8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgd2Jpby0mZ3Q7Ymlfb3AgPSBSRVFfT1BfV1JJVEU7PGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgd2Jpby0mZ3Q7YmlfZW5kX2lvID0gZW5kX3N5bmNfd3JpdGU7 PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgYXRvbWljX2luYygmYW1wO3IxX2Jpby0mZ3Q7 cmVtYWluaW5nKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBtZF9zeW5jX2FjY3QoY29u Zi0mZ3Q7bWlycm9yc1tpXS5yZGV2LSZndDtiZGV2LCBiaW9fc2VjdG9ycyh3YmlvKSk7PGJyPg0K QEAgLTIwOTAsNyArMjA5MSw3IEBAIHN0YXRpYyB2b2lkIGZpeF9yZWFkX2Vycm9yKHN0cnVjdCBy MWNvbmYgKmNvbmYsIGludCByZWFkX2Rpc2ssPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgaXNfYmFkYmxvY2socmRldiwgc2VjdCwgcyw8YnI+DQrCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAmYW1w O2ZpcnN0X2JhZCwgJmFtcDtiYWRfc2VjdG9ycykgPT0gMCAmYW1wOyZhbXA7PGJyPg0KwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgc3luY19wYWdlX2lvKHJkZXYsIHNl Y3QsIHMmbHQ7Jmx0OzksPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGNvbmYtJmd0O3RtcHBhZ2UsIFJFQUQsIGZhbHNlKSk8 YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgY29uZi0mZ3Q7dG1wcGFnZSwgUkVRX09QX1JFQUQsIDAsIGZhbHNlKSk8YnI+DQrC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzdWNjZXNzID0g MTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBlbHNlIHs8YnI+DQrC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBkKys7PGJyPg0K QEAgLTIyMDEsNyArMjIwMiw3IEBAIHN0YXRpYyBpbnQgbmFycm93X3dyaXRlX2Vycm9yKHN0cnVj dCByMWJpbyAqcjFfYmlvLCBpbnQgaSk8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCB3YmlvID0gYmlvX2Nsb25lX21kZGV2KHIxX2Jpby0mZ3Q7bWFzdGVyX2JpbywgR0ZQ X05PSU8sIG1kZGV2KTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB9PGJyPg0KPGJyPg0K LcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgd2Jpby0mZ3Q7YmlfcncgPSBXUklURTs8YnI+DQorwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqB3YmlvLSZndDtiaV9vcCA9IFJFUV9PUF9XUklURTs8YnI+DQrC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB3YmlvLSZndDtiaV9pdGVyLmJpX3NlY3RvciA9IHIxX2Jp by0mZ3Q7c2VjdG9yOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHdiaW8tJmd0O2JpX2l0 ZXIuYmlfc2l6ZSA9IHIxX2Jpby0mZ3Q7c2VjdG9ycyAmbHQ7Jmx0OyA5Ozxicj4NCjxicj4NCkBA IC0yMzQ0LDcgKzIzNDUsOCBAQCByZWFkX21vcmU6PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgYmlvLSZndDtiaV9pdGVyLmJpX3NlY3RvciA9IHIxX2Jpby0mZ3Q7c2VjdG9yICsgcmRldi0m Z3Q7ZGF0YV9vZmZzZXQ7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgYmlvLSZndDtiaV9i ZGV2ID0gcmRldi0mZ3Q7YmRldjs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBiaW8tJmd0 O2JpX2VuZF9pbyA9IHJhaWQxX2VuZF9yZWFkX3JlcXVlc3Q7PGJyPg0KLcKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgYmlvLSZndDtiaV9ydyA9IFJFQUQgfCBkb19zeW5jOzxicj4NCivCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoGJpby0mZ3Q7Ymlfb3AgPSBSRVFfT1BfUkVBRDs8YnI+DQorwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBiaW8tJmd0O2JpX3J3ID0gZG9fc3luYzs8YnI+DQrCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCBiaW8tJmd0O2JpX3ByaXZhdGUgPSByMV9iaW87PGJyPg0KwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgaWYgKG1heF9zZWN0b3JzICZsdDsgcjFfYmlvLSZndDtzZWN0b3JzKSB7PGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgLyogRHJhdCAtIGhhdmUgdG8g c3BsaXQgdGhpcyB1cCBtb3JlICovPGJyPg0KQEAgLTI1NzIsNyArMjU3NCw3IEBAIHN0YXRpYyBz ZWN0b3JfdCByYWlkMV9zeW5jX3JlcXVlc3Qoc3RydWN0IG1kZGV2ICptZGRldiwgc2VjdG9yX3Qg c2VjdG9yX25yLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmIChp ICZsdDsgY29uZi0mZ3Q7cmFpZF9kaXNrcyk8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzdGlsbF9kZWdyYWRlZCA9IDE7PGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgfSBlbHNlIGlmICghdGVzdF9iaXQoSW5fc3luYywgJmFtcDtyZGV2LSZn dDtmbGFncykpIHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBiaW8t Jmd0O2JpX3J3ID0gV1JJVEU7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgYmlvLSZndDtiaV9vcCA9IFJFUV9PUF9XUklURTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCBiaW8tJmd0O2JpX2VuZF9pbyA9IGVuZF9zeW5jX3dyaXRlOzxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHdyaXRlX3RhcmdldHMgKys7PGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgfSBlbHNlIHs8YnI+DQpAQCAtMjU5OSw3ICsyNjAx LDcgQEAgc3RhdGljIHNlY3Rvcl90IHJhaWQxX3N5bmNfcmVxdWVzdChzdHJ1Y3QgbWRkZXYgKm1k ZGV2LCBzZWN0b3JfdCBzZWN0b3JfbnIsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaWYgKGRpc2sgJmx0OyAwKTxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIGRpc2sgPSBpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIH08YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBiaW8tJmd0O2JpX3J3ID0gUkVBRDs8YnI+DQorwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBiaW8tJmd0O2JpX29wID0gUkVRX09Q X1JFQUQ7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgYmlvLSZndDtiaV9lbmRfaW8gPSBlbmRfc3luY19yZWFkOzxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJlYWRfdGFyZ2V0cysrOzxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIH0gZWxzZSBpZiAoIXRlc3RfYml0KFdy aXRlRXJyb3JTZWVuLCAmYW1wO3JkZXYtJmd0O2ZsYWdzKSAmYW1wOyZhbXA7PGJyPg0KQEAgLTI2 MTEsNyArMjYxMyw3IEBAIHN0YXRpYyBzZWN0b3JfdCByYWlkMV9zeW5jX3JlcXVlc3Qoc3RydWN0 IG1kZGV2ICptZGRldiwgc2VjdG9yX3Qgc2VjdG9yX25yLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKiBpZiB3ZSBhcmUgZG9pbmcgcmVzeW5j IG9yIHJlcGFpci4gT3RoZXJ3aXNlLCBsZWF2ZTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKiB0aGlzIGRldmljZSBhbG9uZSBmb3IgdGhpcyBz eW5jIHJlcXVlc3QuPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAqLzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoGJpby0mZ3Q7YmlfcncgPSBXUklURTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBiaW8tJmd0O2JpX29wID0gUkVRX09QX1dSSVRF Ozxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGJp by0mZ3Q7YmlfZW5kX2lvID0gZW5kX3N5bmNfd3JpdGU7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgd3JpdGVfdGFyZ2V0cysrOzxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIH08YnI+DQpkaWZmIC0tZ2l0IGEvZHJpdmVy cy9tZC9yYWlkMTAuYyBiL2RyaXZlcnMvbWQvcmFpZDEwLmM8YnI+DQppbmRleCA0NzM2YmU4Li42 M2NkOTg1IDEwMDY0NDxicj4NCi0tLSBhL2RyaXZlcnMvbWQvcmFpZDEwLmM8YnI+DQorKysgYi9k cml2ZXJzL21kL3JhaWQxMC5jPGJyPg0KQEAgLTg2NSw3ICs4NjUsNyBAQCBzdGF0aWMgdm9pZCBm bHVzaF9wZW5kaW5nX3dyaXRlcyhzdHJ1Y3QgcjEwY29uZiAqY29uZik8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCB3aGlsZSAoYmlvKSB7IC8qIHN1Ym1pdCBwZW5kaW5nIHdyaXRlcyAqLzxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHN0cnVjdCBiaW8gKm5leHQg PSBiaW8tJmd0O2JpX25leHQ7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgYmlvLSZndDtiaV9uZXh0ID0gTlVMTDs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBpZiAodW5saWtlbHkoKGJpby0mZ3Q7YmlfcncgJmFtcDsgUkVRX0RJU0NBUkQp ICZhbXA7JmFtcDs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAo dW5saWtlbHkoKGJpby0mZ3Q7Ymlfb3AgPT3CoCBSRVFfT1BfRElTQ0FSRCkgJmFtcDsmYW1wOzxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICFibGtfcXVldWVf ZGlzY2FyZChiZGV2X2dldF9xdWV1ZShiaW8tJmd0O2JpX2JkZXYpKSkpPGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgLyogSnVzdCBpZ25vcmUgaXQg Ki88YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBi aW9fZW5kaW8oYmlvKTs8YnI+DQpAQCAtMTA0MSw3ICsxMDQxLDcgQEAgc3RhdGljIHZvaWQgcmFp ZDEwX3VucGx1ZyhzdHJ1Y3QgYmxrX3BsdWdfY2IgKmNiLCBib29sIGZyb21fc2NoZWR1bGUpPGJy Pg0KwqAgwqAgwqAgwqAgd2hpbGUgKGJpbykgeyAvKiBzdWJtaXQgcGVuZGluZyB3cml0ZXMgKi88 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzdHJ1Y3QgYmlvICpuZXh0ID0gYmlvLSZndDti aV9uZXh0Ozxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGJpby0mZ3Q7YmlfbmV4dCA9IE5V TEw7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKHVubGlrZWx5KChiaW8tJmd0O2Jp X3J3ICZhbXA7IFJFUV9ESVNDQVJEKSAmYW1wOyZhbXA7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKg IMKgIMKgaWYgKHVubGlrZWx5KChiaW8tJmd0O2JpX29wID09wqAgUkVRX09QX0RJU0NBUkQpICZh bXA7JmFtcDs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAhYmxrX3F1ZXVlX2Rp c2NhcmQoYmRldl9nZXRfcXVldWUoYmlvLSZndDtiaV9iZGV2KSkpKTxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIC8qIEp1c3QgaWdub3JlIGl0ICovPGJyPg0KwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgYmlvX2VuZGlvKGJpbyk7PGJyPg0KQEAgLTEw NTgsMTIgKzEwNTgsMTEgQEAgc3RhdGljIHZvaWQgX19tYWtlX3JlcXVlc3Qoc3RydWN0IG1kZGV2 ICptZGRldiwgc3RydWN0IGJpbyAqYmlvKTxicj4NCsKgIMKgIMKgIMKgIHN0cnVjdCByMTBiaW8g KnIxMF9iaW87PGJyPg0KwqAgwqAgwqAgwqAgc3RydWN0IGJpbyAqcmVhZF9iaW87PGJyPg0KwqAg wqAgwqAgwqAgaW50IGk7PGJyPg0KK8KgIMKgIMKgIMKgY29uc3QgaW50IG9wID0gYmlvLSZndDti aV9vcDs8YnI+DQrCoCDCoCDCoCDCoCBjb25zdCBpbnQgcncgPSBiaW9fZGF0YV9kaXIoYmlvKTs8 YnI+DQrCoCDCoCDCoCDCoCBjb25zdCB1bnNpZ25lZCBsb25nIGRvX3N5bmMgPSAoYmlvLSZndDti aV9ydyAmYW1wOyBSRVFfU1lOQyk7PGJyPg0KwqAgwqAgwqAgwqAgY29uc3QgdW5zaWduZWQgbG9u ZyBkb19mdWEgPSAoYmlvLSZndDtiaV9ydyAmYW1wOyBSRVFfRlVBKTs8YnI+DQotwqAgwqAgwqAg wqBjb25zdCB1bnNpZ25lZCBsb25nIGRvX2Rpc2NhcmQgPSAoYmlvLSZndDtiaV9ydzxicj4NCi3C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCZhbXA7IChSRVFfRElTQ0FSRCB8IFJFUV9TRUNVUkUpKTs8YnI+DQotwqAgwqAgwqAgwqBj b25zdCB1bnNpZ25lZCBsb25nIGRvX3NhbWUgPSAoYmlvLSZndDtiaV9ydyAmYW1wOyBSRVFfV1JJ VEVfU0FNRSk7PGJyPg0KK8KgIMKgIMKgIMKgY29uc3QgdW5zaWduZWQgbG9uZyBkb19zZWMgPSAo YmlvLSZndDtiaV9ydyAmYW1wOyBSRVFfU0VDVVJFKTs8YnI+DQrCoCDCoCDCoCDCoCB1bnNpZ25l ZCBsb25nIGZsYWdzOzxicj4NCsKgIMKgIMKgIMKgIHN0cnVjdCBtZF9yZGV2ICpibG9ja2VkX3Jk ZXY7PGJyPg0KwqAgwqAgwqAgwqAgc3RydWN0IGJsa19wbHVnX2NiICpjYjs8YnI+DQpAQCAtMTE1 Niw3ICsxMTU1LDggQEAgcmVhZF9hZ2Fpbjo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCBjaG9vc2VfZGF0YV9vZmZzZXQocjEwX2JpbywgcmRldik7PGJyPg0KwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgcmVhZF9iaW8tJmd0O2JpX2JkZXYgPSByZGV2LSZndDtiZGV2Ozxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJlYWRfYmlvLSZndDtiaV9lbmRfaW8gPSByYWlk MTBfZW5kX3JlYWRfcmVxdWVzdDs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZWFkX2Jp by0mZ3Q7YmlfcncgPSBSRUFEIHwgZG9fc3luYzs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqByZWFkX2Jpby0mZ3Q7Ymlfb3AgPSBvcDs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBy ZWFkX2Jpby0mZ3Q7YmlfcncgPSBkb19zeW5jOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IHJlYWRfYmlvLSZndDtiaV9wcml2YXRlID0gcjEwX2Jpbzs8YnI+DQo8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCBpZiAobWF4X3NlY3RvcnMgJmx0OyByMTBfYmlvLSZndDtzZWN0b3JzKSB7 PGJyPg0KQEAgLTEzNjMsOCArMTM2Myw5IEBAIHJldHJ5X3dyaXRlOjxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJkZXYpKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCBtYmlvLSZndDtiaV9iZGV2ID0gcmRldi0mZ3Q7YmRldjs8YnI+DQrC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBtYmlvLSZndDtiaV9lbmRfaW8gPSBy YWlkMTBfZW5kX3dyaXRlX3JlcXVlc3Q7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgbWJpby0mZ3Q7Ymlfb3AgPSBvcDs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCBtYmlvLSZndDtiaV9ydyA9PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgV1JJVEUgfCBkb19zeW5jIHwgZG9fZnVhIHwgZG9f ZGlzY2FyZCB8IGRvX3NhbWU7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgZG9fc3luYyB8IGRvX2Z1YSB8IGRvX3NlYzs8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBtYmlvLSZndDtiaV9wcml2YXRlID0gcjEwX2Jpbzs8 YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBhdG9taWNfaW5j KCZhbXA7cjEwX2Jpby0mZ3Q7cmVtYWluaW5nKTs8YnI+DQpAQCAtMTQwNiw4ICsxNDA3LDkgQEAg cmV0cnlfd3JpdGU6PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByMTBfYmlvLCByZGV2KSk7PGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgbWJpby0mZ3Q7YmlfYmRldiA9 IHJkZXYtJmd0O2JkZXY7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg bWJpby0mZ3Q7YmlfZW5kX2lvID0gcmFpZDEwX2VuZF93cml0ZV9yZXF1ZXN0Ozxicj4NCivCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG1iaW8tJmd0O2JpX29wID0gb3A7PGJyPg0K wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgbWJpby0mZ3Q7YmlfcncgPTxicj4N Ci3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFdSSVRFIHwg ZG9fc3luYyB8IGRvX2Z1YSB8IGRvX2Rpc2NhcmQgfCBkb19zYW1lOzxicj4NCivCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGRvX3N5bmMgfCBkb19mdWEgfCBk b19zZWM7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgbWJpby0mZ3Q7 YmlfcHJpdmF0ZSA9IHIxMF9iaW87PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgYXRvbWljX2luYygmYW1wO3IxMF9iaW8tJmd0O3JlbWFpbmluZyk7PGJyPg0K QEAgLTE5OTIsNyArMTk5NCw3IEBAIHN0YXRpYyB2b2lkIHN5bmNfcmVxdWVzdF93cml0ZShzdHJ1 Y3QgbWRkZXYgKm1kZGV2LCBzdHJ1Y3QgcjEwYmlvICpyMTBfYmlvKTxicj4NCjxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIHRiaW8tJmd0O2JpX3ZjbnQgPSB2Y250Ozxicj4NCsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIHRiaW8tJmd0O2JpX2l0ZXIuYmlfc2l6ZSA9IGZiaW8tJmd0O2JpX2l0 ZXIuYmlfc2l6ZTs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0YmlvLSZndDtiaV9ydyA9 IFdSSVRFOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRiaW8tJmd0O2JpX29wID0gUkVR X09QX1dSSVRFOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHRiaW8tJmd0O2JpX3ByaXZh dGUgPSByMTBfYmlvOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHRiaW8tJmd0O2JpX2l0 ZXIuYmlfc2VjdG9yID0gcjEwX2Jpby0mZ3Q7ZGV2c1tpXS5hZGRyOzxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIHRiaW8tJmd0O2JpX2VuZF9pbyA9IGVuZF9zeW5jX3dyaXRlOzxicj4NCkBA IC0yMDc4LDcgKzIwODAsNyBAQCBzdGF0aWMgdm9pZCBmaXhfcmVjb3ZlcnlfcmVhZF9lcnJvcihz dHJ1Y3QgcjEwYmlvICpyMTBfYmlvKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIGFkZHIsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcyAmbHQ7Jmx0OyA5LDxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGJpby0mZ3Q7YmlfaW9fdmVj W2lkeF0uYnZfcGFnZSw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBSRUFELCBmYWxzZSk7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgUkVRX09QX1JFQUQsIDAsIGZhbHNlKTs8YnI+DQrC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZiAob2spIHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCByZGV2ID0gY29uZi0mZ3Q7bWlycm9yc1tkd10ucmRldjs8YnI+DQrC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBhZGRyID0gcjEwX2Jpby0mZ3Q7ZGV2 c1sxXS5hZGRyICsgc2VjdDs8YnI+DQpAQCAtMjA4Niw3ICsyMDg4LDcgQEAgc3RhdGljIHZvaWQg Zml4X3JlY292ZXJ5X3JlYWRfZXJyb3Ioc3RydWN0IHIxMGJpbyAqcjEwX2Jpbyk8YnI+DQrCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCBhZGRyLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIHMgJmx0OyZsdDsgOSw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBiaW8tJmd0O2JpX2lv X3ZlY1tpZHhdLmJ2X3BhZ2UsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgV1JJVEUsIGZhbHNlKTs8YnI+DQorwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBS RVFfT1BfV1JJVEUsIDAsIGZhbHNlKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCBpZiAoIW9rKSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgc2V0X2JpdChXcml0ZUVycm9yU2VlbiwgJmFtcDtyZGV2LSZndDtmbGFn cyk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg aWYgKCF0ZXN0X2FuZF9zZXRfYml0KFdhbnRSZXBsYWNlbWVudCw8YnI+DQpAQCAtMjIxMyw3ICsy MjE1LDcgQEAgc3RhdGljIGludCByMTBfc3luY19wYWdlX2lvKHN0cnVjdCBtZF9yZGV2ICpyZGV2 LCBzZWN0b3JfdCBzZWN0b3IsPGJyPg0KwqAgwqAgwqAgwqAgaWYgKGlzX2JhZGJsb2NrKHJkZXYs IHNlY3Rvciwgc2VjdG9ycywgJmFtcDtmaXJzdF9iYWQsICZhbXA7YmFkX3NlY3RvcnMpPGJyPg0K wqAgwqAgwqAgwqAgwqAgwqAgJmFtcDsmYW1wOyAocncgPT0gUkVBRCB8fCB0ZXN0X2JpdChXcml0 ZUVycm9yU2VlbiwgJmFtcDtyZGV2LSZndDtmbGFncykpKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIHJldHVybiAtMTs8YnI+DQotwqAgwqAgwqAgwqBpZiAoc3luY19wYWdlX2lvKHJkZXYs IHNlY3Rvciwgc2VjdG9ycyAmbHQ7Jmx0OyA5LCBwYWdlLCBydywgZmFsc2UpKTxicj4NCivCoCDC oCDCoCDCoGlmIChzeW5jX3BhZ2VfaW8ocmRldiwgc2VjdG9yLCBzZWN0b3JzICZsdDsmbHQ7IDks IHBhZ2UsIHJ3LCAwLCBmYWxzZSkpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgLyogc3Vj Y2VzcyAqLzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJldHVybiAxOzxicj4NCsKgIMKg IMKgIMKgIGlmIChydyA9PSBXUklURSkgezxicj4NCkBAIC0yMjk5LDcgKzIzMDEsOCBAQCBzdGF0 aWMgdm9pZCBmaXhfcmVhZF9lcnJvcihzdHJ1Y3QgcjEwY29uZiAqY29uZiwgc3RydWN0IG1kZGV2 ICptZGRldiwgc3RydWN0IHIxMDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcjEwX2Jp by0mZ3Q7ZGV2c1tzbF0uYWRkciArPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBzZWN0 LDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcyZsdDsmbHQ7OSw8YnI+DQotwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgY29uZi0mZ3Q7dG1wcGFnZSwgUkVBRCwgZmFsc2UpOzxicj4NCivC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBjb25mLSZndDt0bXBwYWdlLDxicj4NCivCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCBSRVFfT1BfUkVBRCwgMCwgZmFsc2UpOzxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJkZXZfZGVjX3BlbmRpbmcocmRldiwg bWRkZXYpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIHJjdV9yZWFkX2xvY2soKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCBpZiAoc3VjY2Vzcyk8YnI+DQpAQCAtMjQ3NCw3ICsyNDc3LDcgQEAg c3RhdGljIGludCBuYXJyb3dfd3JpdGVfZXJyb3Ioc3RydWN0IHIxMGJpbyAqcjEwX2JpbywgaW50 IGkpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBjaG9vc2VfZGF0YV9vZmZzZXQocjEwX2JpbywgcmRldikgKzxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKHNlY3RvciAtIHIxMF9i aW8tJmd0O3NlY3RvcikpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHdiaW8tJmd0O2Jp X2JkZXYgPSByZGV2LSZndDtiZGV2Ozxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHdiaW8t Jmd0O2JpX3J3ID0gV1JJVEU7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgd2Jpby0mZ3Q7 Ymlfb3AgPSBSRVFfT1BfV1JJVEU7PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg aWYgKHN1Ym1pdF9iaW9fd2FpdCh3YmlvKSAmbHQ7IDApPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgLyogRmFpbHVyZSEgKi88YnI+DQpAQCAtMjU1MCw3ICsyNTUzLDgg QEAgcmVhZF9tb3JlOjxicj4NCsKgIMKgIMKgIMKgIGJpby0mZ3Q7YmlfaXRlci5iaV9zZWN0b3Ig PSByMTBfYmlvLSZndDtkZXZzW3Nsb3RdLmFkZHI8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCArIGNob29zZV9kYXRhX29mZnNldChyMTBfYmlvLCByZGV2KTs8YnI+DQrCoCDCoCDCoCDCoCBi aW8tJmd0O2JpX2JkZXYgPSByZGV2LSZndDtiZGV2Ozxicj4NCi3CoCDCoCDCoCDCoGJpby0mZ3Q7 YmlfcncgPSBSRUFEIHwgZG9fc3luYzs8YnI+DQorwqAgwqAgwqAgwqBiaW8tJmd0O2JpX29wID0g UkVRX09QX1JFQUQ7PGJyPg0KK8KgIMKgIMKgIMKgYmlvLSZndDtiaV9ydyA9IGRvX3N5bmM7PGJy Pg0KwqAgwqAgwqAgwqAgYmlvLSZndDtiaV9wcml2YXRlID0gcjEwX2Jpbzs8YnI+DQrCoCDCoCDC oCDCoCBiaW8tJmd0O2JpX2VuZF9pbyA9IHJhaWQxMF9lbmRfcmVhZF9yZXF1ZXN0Ozxicj4NCsKg IMKgIMKgIMKgIGlmIChtYXhfc2VjdG9ycyAmbHQ7IHIxMF9iaW8tJmd0O3NlY3RvcnMpIHs8YnI+ DQpAQCAtMzA0MCw3ICszMDQ0LDcgQEAgc3RhdGljIHNlY3Rvcl90IHJhaWQxMF9zeW5jX3JlcXVl c3Qoc3RydWN0IG1kZGV2ICptZGRldiwgc2VjdG9yX3Qgc2VjdG9yX25yLDxicj4NCsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGJpb2xpc3QgPSBiaW87PGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgYmlvLSZn dDtiaV9wcml2YXRlID0gcjEwX2Jpbzs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCBiaW8tJmd0O2JpX2VuZF9pbyA9IGVuZF9zeW5jX3JlYWQ7PGJy Pg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgYmlvLSZn dDtiaV9ydyA9IFJFQUQ7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgYmlvLSZndDtiaV9vcCA9IFJFUV9PUF9SRUFEOzxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGZyb21fYWRkciA9IHIxMF9iaW8t Jmd0O2RldnNbal0uYWRkcjs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCBiaW8tJmd0O2JpX2l0ZXIuYmlfc2VjdG9yID0gZnJvbV9hZGRyICs8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCByZGV2LSZndDtkYXRhX29mZnNldDs8YnI+DQpAQCAtMzA2Niw3ICszMDcwLDcgQEAgc3Rh dGljIHNlY3Rvcl90IHJhaWQxMF9zeW5jX3JlcXVlc3Qoc3RydWN0IG1kZGV2ICptZGRldiwgc2Vj dG9yX3Qgc2VjdG9yX25yLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGJpb2xpc3QgPSBiaW87PGJyPg0KwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgYmlvLSZndDti aV9wcml2YXRlID0gcjEwX2Jpbzs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBiaW8tJmd0O2JpX2VuZF9pbyA9IGVuZF9zeW5j X3dyaXRlOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGJpby0mZ3Q7YmlfcncgPSBXUklURTs8YnI+DQorwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBiaW8tJmd0O2Jp X29wID0gUkVRX09QX1dSSVRFOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGJpby0mZ3Q7YmlfaXRlci5iaV9zZWN0b3IgPSB0 b19hZGRyPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKyByZGV2LSZndDtkYXRhX29mZnNldDs8YnI+DQrC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCBiaW8tJmd0O2JpX2JkZXYgPSByZGV2LSZndDtiZGV2Ozxicj4NCkBAIC0zMDk1LDcgKzMwOTks NyBAQCBzdGF0aWMgc2VjdG9yX3QgcmFpZDEwX3N5bmNfcmVxdWVzdChzdHJ1Y3QgbWRkZXYgKm1k ZGV2LCBzZWN0b3JfdCBzZWN0b3JfbnIsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgYmlvbGlzdCA9IGJpbzs8YnI+DQrCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBiaW8tJmd0O2JpX3ByaXZhdGUgPSByMTBf YmlvOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IGJpby0mZ3Q7YmlfZW5kX2lvID0gZW5kX3N5bmNfd3JpdGU7PGJyPg0KLcKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgYmlvLSZndDtiaV9ydyA9IFdSSVRFOzxi cj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGJpby0m Z3Q7Ymlfb3AgPSBSRVFfT1BfV1JJVEU7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgYmlvLSZndDtiaV9pdGVyLmJpX3NlY3RvciA9IHRvX2FkZHIg Kzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIHJkZXYtJmd0O2RhdGFfb2Zmc2V0Ozxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGJpby0mZ3Q7YmlfYmRldiA9IHJkZXYtJmd0O2Jk ZXY7PGJyPg0KQEAgLTMyMTUsNyArMzIxOSw3IEBAIHN0YXRpYyBzZWN0b3JfdCByYWlkMTBfc3lu Y19yZXF1ZXN0KHN0cnVjdCBtZGRldiAqbWRkZXYsIHNlY3Rvcl90IHNlY3Rvcl9uciw8YnI+DQrC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBiaW9saXN0ID0gYmlvOzxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGJpby0mZ3Q7YmlfcHJpdmF0ZSA9IHIx MF9iaW87PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgYmlvLSZndDti aV9lbmRfaW8gPSBlbmRfc3luY19yZWFkOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoGJpby0mZ3Q7YmlfcncgPSBSRUFEOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGJpby0mZ3Q7Ymlfb3AgPSBSRVFfT1BfUkVBRDs8YnI+DQrCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBiaW8tJmd0O2JpX2l0ZXIuYmlfc2VjdG9yID0g c2VjdG9yICs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCBjb25mLSZndDttaXJyb3JzW2RdLnJkZXYtJmd0O2RhdGFfb2Zmc2V0Ozxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGJpby0mZ3Q7YmlfYmRldiA9IGNvbmYtJmd0 O21pcnJvcnNbZF0ucmRldi0mZ3Q7YmRldjs8YnI+DQpAQCAtMzIzNyw3ICszMjQxLDcgQEAgc3Rh dGljIHNlY3Rvcl90IHJhaWQxMF9zeW5jX3JlcXVlc3Qoc3RydWN0IG1kZGV2ICptZGRldiwgc2Vj dG9yX3Qgc2VjdG9yX25yLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IGJpb2xpc3QgPSBiaW87PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg YmlvLSZndDtiaV9wcml2YXRlID0gcjEwX2Jpbzs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCBiaW8tJmd0O2JpX2VuZF9pbyA9IGVuZF9zeW5jX3dyaXRlOzxicj4NCi3C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGJpby0mZ3Q7YmlfcncgPSBXUklURTs8 YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBiaW8tJmd0O2JpX29wID0g UkVRX09QX1dSSVRFOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGJp by0mZ3Q7YmlfaXRlci5iaV9zZWN0b3IgPSBzZWN0b3IgKzxicj4NCsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGNvbmYtJmd0O21pcnJvcnNbZF0ucmVwbGFj ZW1lbnQtJmd0O2RhdGFfb2Zmc2V0Ozxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIGJpby0mZ3Q7YmlfYmRldiA9IGNvbmYtJmd0O21pcnJvcnNbZF0ucmVwbGFjZW1lbnQt Jmd0O2JkZXY7PGJyPg0KQEAgLTQzMjAsNyArNDMyNCw3IEBAIHJlYWRfbW9yZTo8YnI+DQrCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCsgcmRldi0mZ3Q7ZGF0 YV9vZmZzZXQpOzxicj4NCsKgIMKgIMKgIMKgIHJlYWRfYmlvLSZndDtiaV9wcml2YXRlID0gcjEw X2Jpbzs8YnI+DQrCoCDCoCDCoCDCoCByZWFkX2Jpby0mZ3Q7YmlfZW5kX2lvID0gZW5kX3N5bmNf cmVhZDs8YnI+DQotwqAgwqAgwqAgwqByZWFkX2Jpby0mZ3Q7YmlfcncgPSBSRUFEOzxicj4NCivC oCDCoCDCoCDCoHJlYWRfYmlvLSZndDtiaV9vcCA9IFJFUV9PUF9SRUFEOzxicj4NCsKgIMKgIMKg IMKgIHJlYWRfYmlvLSZndDtiaV9mbGFncyAmYW1wOz0gKH4wVUwgJmx0OyZsdDsgQklPX1JFU0VU X0JJVFMpOzxicj4NCsKgIMKgIMKgIMKgIHJlYWRfYmlvLSZndDtiaV9lcnJvciA9IDA7PGJyPg0K wqAgwqAgwqAgwqAgcmVhZF9iaW8tJmd0O2JpX3ZjbnQgPSAwOzxicj4NCkBAIC00MzU0LDcgKzQz NTgsNyBAQCByZWFkX21vcmU6PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgcmRldjItJmd0O25ld19kYXRhX29mZnNldDs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCBiLSZndDtiaV9wcml2YXRlID0gcjEwX2Jpbzs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCBiLSZndDtiaV9lbmRfaW8gPSBlbmRfcmVzaGFwZV93cml0ZTs8YnI+DQotwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBiLSZndDtiaV9ydyA9IFdSSVRFOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGItJmd0O2JpX29wID0gUkVRX09QX1dSSVRFOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIGItJmd0O2JpX25leHQgPSBibGlzdDs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBi bGlzdCA9IGI7PGJyPg0KwqAgwqAgwqAgwqAgfTxicj4NCkBAIC00NTIyLDcgKzQ1MjYsNyBAQCBz dGF0aWMgaW50IGhhbmRsZV9yZXNoYXBlX3JlYWRfZXJyb3Ioc3RydWN0IG1kZGV2ICptZGRldiw8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGFkZHIsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBzICZsdDsmbHQ7IDks PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBidmVjW2lkeF0uYnZfcGFnZSw8YnI+DQotwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg UkVBRCwgZmFsc2UpOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBSRVFfT1BfUkVBRCwgMCwgZmFsc2UpOzxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmIChzdWNjZXNzKTxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGJyZWFrOzxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGZhaWxlZDo8YnI+DQpkaWZmIC0tZ2l0IGEvZHJp dmVycy9tZC9yYWlkNS1jYWNoZS5jIGIvZHJpdmVycy9tZC9yYWlkNS1jYWNoZS5jPGJyPg0KaW5k ZXggOTBjMjYxOC4uNTZiMjBjMyAxMDA2NDQ8YnI+DQotLS0gYS9kcml2ZXJzL21kL3JhaWQ1LWNh Y2hlLmM8YnI+DQorKysgYi9kcml2ZXJzL21kL3JhaWQ1LWNhY2hlLmM8YnI+DQpAQCAtMjYxLDcg KzI2MSw3IEBAIHN0YXRpYyBzdHJ1Y3QgYmlvICpyNWxfYmlvX2FsbG9jKHN0cnVjdCByNWxfbG9n ICpsb2cpPGJyPg0KwqB7PGJyPg0KwqAgwqAgwqAgwqAgc3RydWN0IGJpbyAqYmlvID0gYmlvX2Fs bG9jX2Jpb3NldChHRlBfTk9JTywgQklPX01BWF9QQUdFUywgbG9nLSZndDticyk7PGJyPg0KPGJy Pg0KLcKgIMKgIMKgIMKgYmlvLSZndDtiaV9ydyA9IFdSSVRFOzxicj4NCivCoCDCoCDCoCDCoGJp by0mZ3Q7Ymlfb3AgPSBSRVFfT1BfV1JJVEU7PGJyPg0KwqAgwqAgwqAgwqAgYmlvLSZndDtiaV9i ZGV2ID0gbG9nLSZndDtyZGV2LSZndDtiZGV2Ozxicj4NCsKgIMKgIMKgIMKgIGJpby0mZ3Q7Ymlf aXRlci5iaV9zZWN0b3IgPSBsb2ctJmd0O3JkZXYtJmd0O2RhdGFfb2Zmc2V0ICsgbG9nLSZndDts b2dfc3RhcnQ7PGJyPg0KPGJyPg0KQEAgLTY4Niw2ICs2ODYsNyBAQCB2b2lkIHI1bF9mbHVzaF9z dHJpcGVfdG9fcmFpZChzdHJ1Y3QgcjVsX2xvZyAqbG9nKTxicj4NCsKgIMKgIMKgIMKgIGJpb19y ZXNldCgmYW1wO2xvZy0mZ3Q7Zmx1c2hfYmlvKTs8YnI+DQrCoCDCoCDCoCDCoCBsb2ctJmd0O2Zs dXNoX2Jpby5iaV9iZGV2ID0gbG9nLSZndDtyZGV2LSZndDtiZGV2Ozxicj4NCsKgIMKgIMKgIMKg IGxvZy0mZ3Q7Zmx1c2hfYmlvLmJpX2VuZF9pbyA9IHI1bF9sb2dfZmx1c2hfZW5kaW87PGJyPg0K K8KgIMKgIMKgIMKgbG9nLSZndDtmbHVzaF9iaW8uYmlfb3AgPSBSRVFfT1BfV1JJVEU7PGJyPg0K wqAgwqAgwqAgwqAgbG9nLSZndDtmbHVzaF9iaW8uYmlfcncgPSBXUklURV9GTFVTSDs8YnI+DQrC oCDCoCDCoCDCoCBzdWJtaXRfYmlvKCZhbXA7bG9nLSZndDtmbHVzaF9iaW8pOzxicj4NCsKgfTxi cj4NCkBAIC04ODIsNyArODgzLDggQEAgc3RhdGljIGludCByNWxfcmVhZF9tZXRhX2Jsb2NrKHN0 cnVjdCByNWxfbG9nICpsb2csPGJyPg0KwqAgwqAgwqAgwqAgc3RydWN0IHI1bF9tZXRhX2Jsb2Nr ICptYjs8YnI+DQrCoCDCoCDCoCDCoCB1MzIgY3JjLCBzdG9yZWRfY3JjOzxicj4NCjxicj4NCi3C oCDCoCDCoCDCoGlmICghc3luY19wYWdlX2lvKGxvZy0mZ3Q7cmRldiwgY3R4LSZndDtwb3MsIFBB R0VfU0laRSwgcGFnZSwgUkVBRCwgZmFsc2UpKTxicj4NCivCoCDCoCDCoCDCoGlmICghc3luY19w YWdlX2lvKGxvZy0mZ3Q7cmRldiwgY3R4LSZndDtwb3MsIFBBR0VfU0laRSwgcGFnZSwgUkVRX09Q X1JFQUQsIDAsPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZmFs c2UpKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJldHVybiAtRUlPOzxicj4NCjxicj4N CsKgIMKgIMKgIMKgIG1iID0gcGFnZV9hZGRyZXNzKHBhZ2UpOzxicj4NCkBAIC05MjcsNyArOTI5 LDggQEAgc3RhdGljIGludCByNWxfcmVjb3ZlcnlfZmx1c2hfb25lX3N0cmlwZShzdHJ1Y3QgcjVs X2xvZyAqbG9nLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJmFtcDtkaXNrX2luZGV4LCBzaCk7PGJyPg0KPGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgc3luY19wYWdlX2lvKGxvZy0m Z3Q7cmRldiwgKmxvZ19vZmZzZXQsIFBBR0VfU0laRSw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgc2gtJmd0O2RldltkaXNrX2luZGV4 XS5wYWdlLCBSRUFELCBmYWxzZSk7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHNoLSZndDtkZXZbZGlza19pbmRleF0ucGFnZSwgUkVR X09QX1JFQUQsIDAsPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIGZhbHNlKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCBzaC0mZ3Q7ZGV2W2Rpc2tfaW5kZXhdLmxvZ19jaGVja3N1bSA9PGJyPg0KwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgbGUzMl90b19jcHUocGF5 bG9hZC0mZ3Q7Y2hlY2tzdW1bMF0pOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIHNldF9iaXQoUjVfV2FudHdyaXRlLCAmYW1wO3NoLSZndDtkZXZbZGlza19pbmRleF0u ZmxhZ3MpOzxicj4NCkBAIC05MzUsNyArOTM4LDggQEAgc3RhdGljIGludCByNWxfcmVjb3Zlcnlf Zmx1c2hfb25lX3N0cmlwZShzdHJ1Y3QgcjVsX2xvZyAqbG9nLDxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIH0gZWxzZSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgZGlza19pbmRleCA9IHNoLSZndDtwZF9pZHg7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgc3luY19wYWdlX2lvKGxvZy0mZ3Q7cmRldiwgKmxvZ19vZmZzZXQsIFBB R0VfU0laRSw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgc2gtJmd0O2RldltkaXNrX2luZGV4XS5wYWdlLCBSRUFELCBmYWxzZSk7PGJy Pg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IHNoLSZndDtkZXZbZGlza19pbmRleF0ucGFnZSwgUkVRX09QX1JFQUQsIDAsPGJyPg0KK8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGZhbHNlKTs8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzaC0mZ3Q7ZGV2W2Rpc2tf aW5kZXhdLmxvZ19jaGVja3N1bSA9PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgbGUzMl90b19jcHUocGF5bG9hZC0mZ3Q7Y2hlY2tzdW1bMF0pOzxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHNldF9iaXQoUjVfV2FudHdy aXRlLCAmYW1wO3NoLSZndDtkZXZbZGlza19pbmRleF0uZmxhZ3MpOzxicj4NCkBAIC05NDUsNyAr OTQ5LDcgQEAgc3RhdGljIGludCByNWxfcmVjb3ZlcnlfZmx1c2hfb25lX3N0cmlwZShzdHJ1Y3Qg cjVsX2xvZyAqbG9nLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIHN5bmNfcGFnZV9pbyhsb2ctJmd0O3JkZXYsPGJyPg0KwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByNWxf cmluZ19hZGQobG9nLCAqbG9nX29mZnNldCwgQkxPQ0tfU0VDVE9SUyksPGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBQQUdFX1NJWkUsIHNoLSZndDtkZXZbZGlza19pbmRleF0ucGFnZSw8YnI+DQotwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg UkVBRCwgZmFsc2UpOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBSRVFfT1BfUkVBRCwgMCwgZmFsc2UpOzxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHNoLSZndDtk ZXZbZGlza19pbmRleF0ubG9nX2NoZWNrc3VtID08YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBsZTMyX3RvX2NwdShwYXlsb2Fk LSZndDtjaGVja3N1bVsxXSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgc2V0X2JpdChSNV9XYW50d3JpdGUsPGJyPg0KQEAgLTk4NywxMSArOTkx LDEzIEBAIHN0YXRpYyBpbnQgcjVsX3JlY292ZXJ5X2ZsdXNoX29uZV9zdHJpcGUoc3RydWN0IHI1 bF9sb2cgKmxvZyw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZGV2ID0gcmN1X2RlcmVm ZXJlbmNlKGNvbmYtJmd0O2Rpc2tzW2Rpc2tfaW5kZXhdLnJkZXYpOzxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIGlmIChyZGV2KTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIHN5bmNfcGFnZV9pbyhyZGV2LCBzdHJpcGVfc2VjdCwgUEFHRV9TSVpFLDxicj4NCi3C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzaC0m Z3Q7ZGV2W2Rpc2tfaW5kZXhdLnBhZ2UsIFdSSVRFLCBmYWxzZSk7PGJyPg0KK8KgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHNoLSZndDtkZXZbZGlz a19pbmRleF0ucGFnZSwgUkVRX09QX1dSSVRFLCAwLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBmYWxzZSk7PGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgcnJkZXYgPSByY3VfZGVyZWZlcmVuY2UoY29uZi0mZ3Q7ZGlza3NbZGlz a19pbmRleF0ucmVwbGFjZW1lbnQpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmIChy cmRldik8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzeW5jX3BhZ2Vf aW8ocnJkZXYsIHN0cmlwZV9zZWN0LCBQQUdFX1NJWkUsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHNoLSZndDtkZXZbZGlza19pbmRl eF0ucGFnZSwgV1JJVEUsIGZhbHNlKTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgc2gtJmd0O2RldltkaXNrX2luZGV4XS5wYWdlLCBS RVFfT1BfV1JJVEUsIDAsPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIGZhbHNlKTs8YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KwqAgwqAg wqAgwqAgcmFpZDVfcmVsZWFzZV9zdHJpcGUoc2gpOzxicj4NCsKgIMKgIMKgIMKgIHJldHVybiAw Ozxicj4NCkBAIC0xMDYzLDcgKzEwNjksOCBAQCBzdGF0aWMgaW50IHI1bF9sb2dfd3JpdGVfZW1w dHlfbWV0YV9ibG9jayhzdHJ1Y3QgcjVsX2xvZyAqbG9nLCBzZWN0b3JfdCBwb3MsPGJyPg0KwqAg wqAgwqAgwqAgY3JjID0gY3JjMzJjX2xlKGxvZy0mZ3Q7dXVpZF9jaGVja3N1bSwgbWIsIFBBR0Vf U0laRSk7PGJyPg0KwqAgwqAgwqAgwqAgbWItJmd0O2NoZWNrc3VtID0gY3B1X3RvX2xlMzIoY3Jj KTs8YnI+DQo8YnI+DQotwqAgwqAgwqAgwqBpZiAoIXN5bmNfcGFnZV9pbyhsb2ctJmd0O3JkZXYs IHBvcywgUEFHRV9TSVpFLCBwYWdlLCBXUklURV9GVUEsIGZhbHNlKSkgezxicj4NCivCoCDCoCDC oCDCoGlmICghc3luY19wYWdlX2lvKGxvZy0mZ3Q7cmRldiwgcG9zLCBQQUdFX1NJWkUsIHBhZ2Us IFJFUV9PUF9XUklURSw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBXUklURV9GVUEsIGZhbHNlKSkgezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIF9fZnJl ZV9wYWdlKHBhZ2UpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJldHVybiAtRUlPOzxi cj4NCsKgIMKgIMKgIMKgIH08YnI+DQpAQCAtMTEzOCw3ICsxMTQ1LDcgQEAgc3RhdGljIGludCBy NWxfbG9hZF9sb2coc3RydWN0IHI1bF9sb2cgKmxvZyk8YnI+DQrCoCDCoCDCoCDCoCBpZiAoIXBh Z2UpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmV0dXJuIC1FTk9NRU07PGJyPg0KPGJy Pg0KLcKgIMKgIMKgIMKgaWYgKCFzeW5jX3BhZ2VfaW8ocmRldiwgY3AsIFBBR0VfU0laRSwgcGFn ZSwgUkVBRCwgZmFsc2UpKSB7PGJyPg0KK8KgIMKgIMKgIMKgaWYgKCFzeW5jX3BhZ2VfaW8ocmRl diwgY3AsIFBBR0VfU0laRSwgcGFnZSwgUkVRX09QX1JFQUQsIDAsIGZhbHNlKSkgezxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJldCA9IC1FSU87PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgZ290byBpb2Vycjs8YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KZGlmZiAtLWdpdCBhL2Ry aXZlcnMvbWQvcmFpZDUuYyBiL2RyaXZlcnMvbWQvcmFpZDUuYzxicj4NCmluZGV4IDhhYjhiNjUu LmMzNmI4MTcgMTAwNjQ0PGJyPg0KLS0tIGEvZHJpdmVycy9tZC9yYWlkNS5jPGJyPg0KKysrIGIv ZHJpdmVycy9tZC9yYWlkNS5jPGJyPg0KQEAgLTgwNiw3ICs4MDYsOCBAQCBzdGF0aWMgdm9pZCBz dHJpcGVfYWRkX3RvX2JhdGNoX2xpc3Qoc3RydWN0IHI1Y29uZiAqY29uZiwgc3RydWN0IHN0cmlw ZV9oZWFkICpzaDxicj4NCsKgIMKgIMKgIMKgIGRkX2lkeCA9IDA7PGJyPg0KwqAgwqAgwqAgwqAg d2hpbGUgKGRkX2lkeCA9PSBzaC0mZ3Q7cGRfaWR4IHx8IGRkX2lkeCA9PSBzaC0mZ3Q7cWRfaWR4 KTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGRkX2lkeCsrOzxicj4NCi3CoCDCoCDCoCDC oGlmIChoZWFkLSZndDtkZXZbZGRfaWR4XS50b3dyaXRlLSZndDtiaV9ydyAhPSBzaC0mZ3Q7ZGV2 W2RkX2lkeF0udG93cml0ZS0mZ3Q7YmlfcncpPGJyPg0KK8KgIMKgIMKgIMKgaWYgKGhlYWQtJmd0 O2RldltkZF9pZHhdLnRvd3JpdGUtJmd0O2JpX3J3ICE9IHNoLSZndDtkZXZbZGRfaWR4XS50b3dy aXRlLSZndDtiaV9ydyB8fDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoGhlYWQtJmd0O2RldltkZF9p ZHhdLnRvd3JpdGUtJmd0O2JpX29wICE9IHNoLSZndDtkZXZbZGRfaWR4XS50b3dyaXRlLSZndDti aV9vcCk8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBnb3RvIHVubG9ja19vdXQ7PGJyPg0K PGJyPg0KwqAgwqAgwqAgwqAgaWYgKGhlYWQtJmd0O2JhdGNoX2hlYWQpIHs8YnI+DQpAQCAtODkx LDI5ICs4OTIsMzIgQEAgc3RhdGljIHZvaWQgb3BzX3J1bl9pbyhzdHJ1Y3Qgc3RyaXBlX2hlYWQg KnNoLCBzdHJ1Y3Qgc3RyaXBlX2hlYWRfc3RhdGUgKnMpPGJyPg0KwqAgwqAgwqAgwqAgaWYgKHI1 bF93cml0ZV9zdHJpcGUoY29uZi0mZ3Q7bG9nLCBzaCkgPT0gMCk8YnI+DQrCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCByZXR1cm47PGJyPg0KwqAgwqAgwqAgwqAgZm9yIChpID0gZGlza3M7IGktLTsg KSB7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaW50IHJ3Ozxicj4NCivCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoGludCBvcDs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpbnQgb3Bf ZmxhZ3MgPSAwOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGludCByZXBsYWNlX29ubHkg PSAwOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHN0cnVjdCBiaW8gKmJpLCAqcmJpOzxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHN0cnVjdCBtZF9yZGV2ICpyZGV2LCAqcnJkZXYg PSBOVUxMOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHNoID0gaGVhZF9zaDs8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZiAodGVzdF9hbmRfY2xlYXJfYml0KFI1X1dh bnR3cml0ZSwgJmFtcDtzaC0mZ3Q7ZGV2W2ldLmZsYWdzKSkgezxicj4NCi3CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUjVfV2FudEZVQSwg JmFtcDtzaC0mZ3Q7ZGV2W2ldLmZsYWdzKSk8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBydyA9IFdSSVRFX0ZVQTs8YnI+DQotwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBlbHNlPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcncgPSBXUklURTs8YnI+DQorwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAodGVzdF9hbmRfY2xlYXJfYml0KFI1X1dhbnRGVUEsICZh bXA7c2gtJmd0O2RldltpXS5mbGFncykpIHs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBvcCA9IFJFUV9PUF9XUklURTs8YnI+DQorwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBvcF9mbGFncyA9IFdSSVRFX0ZV QTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9IGVsc2Ugezxicj4N CivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG9wID0gUkVR X09QX1dSSVRFOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH08YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZiAodGVzdF9iaXQoUjVfRGlz Y2FyZCwgJmFtcDtzaC0mZ3Q7ZGV2W2ldLmZsYWdzKSk8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBydyB8PSBSRVFfRElTQ0FSRDs8YnI+DQorwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBvcCA9IFJFUV9PUF9E SVNDQVJEOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIH0gZWxzZSBpZiAodGVzdF9hbmRf Y2xlYXJfYml0KFI1X1dhbnRyZWFkLCAmYW1wO3NoLSZndDtkZXZbaV0uZmxhZ3MpKTxicj4NCi3C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJ3ID0gUkVBRDs8YnI+DQorwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBvcCA9IFJFUV9PUF9SRUFEOzxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIGVsc2UgaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSNV9XYW50UmVw bGFjZSw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCAmYW1wO3NoLSZndDtkZXZbaV0uZmxhZ3MpKSB7PGJyPg0KLcKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcncgPSBXUklURTs8YnI+DQorwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBvcCA9IFJFUV9PUF9XUklURTs8YnI+DQrCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZXBsYWNlX29ubHkgPSAxOzxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIH0gZWxzZTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIGNvbnRpbnVlOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmICh0 ZXN0X2FuZF9jbGVhcl9iaXQoUjVfU3luY0lPLCAmYW1wO3NoLSZndDtkZXZbaV0uZmxhZ3MpKTxi cj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJ3IHw9IFJFUV9TWU5DOzxi cj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG9wX2ZsYWdzIHw9IFJFUV9T WU5DOzxicj4NCjxicj4NCsKgYWdhaW46PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgYmkg PSAmYW1wO3NoLSZndDtkZXZbaV0ucmVxOzxicj4NCkBAIC05MjcsNyArOTMxLDcgQEAgYWdhaW46 PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmRldiA9IHJyZGV2Ozxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJyZGV2ID0gTlVMTDs8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB9PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg aWYgKHJ3ICZhbXA7IFdSSVRFKSB7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG9w X2lzX3dyaXRlKG9wKSkgezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IGlmIChyZXBsYWNlX29ubHkpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgcmRldiA9IE5VTEw7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgaWYgKHJkZXYgPT0gcnJkZXYpPGJyPg0KQEAgLTk1Myw3ICs5NTcsNyBAQCBh Z2Fpbjo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCogbmVlZCB0byBjaGVjayBmb3Ig d3JpdGVzLsKgIFdlIG5ldmVyIGFjY2VwdCB3cml0ZSBlcnJvcnM8YnI+DQrCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCogb24gdGhlIHJlcGxhY2VtZW50LCBzbyB3ZSBkb24mIzM5O3QgdG8gY2hl Y2sgcnJkZXYuPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAqLzxicj4NCi3CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoHdoaWxlICgocncgJmFtcDsgV1JJVEUpICZhbXA7JmFtcDsgcmRldiAm YW1wOyZhbXA7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgd2hpbGUgKG9wX2lzX3dyaXRl KG9wKSAmYW1wOyZhbXA7IHJkZXYgJmFtcDsmYW1wOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgdGVzdF9iaXQoV3JpdGVFcnJvclNlZW4sICZhbXA7cmRldi0mZ3Q7Zmxh Z3MpKSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgc2VjdG9yX3Qg Zmlyc3RfYmFkOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGludCBi YWRfc2VjdG9yczs8YnI+DQpAQCAtOTk1LDggKzk5OSw5IEBAIGFnYWluOjxicj4NCjxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGJpb19yZXNldChiaSk7PGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgYmktJmd0O2JpX2JkZXYgPSByZGV2LSZn dDtiZGV2Ozxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGJpLSZndDti aV9ydyA9IHJ3Ozxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGJpLSZn dDtiaV9lbmRfaW8gPSAocncgJmFtcDsgV1JJVEUpPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgYmktJmd0O2JpX29wID0gb3A7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgYmktJmd0O2JpX3J3ID0gb3BfZmxhZ3M7PGJyPg0KK8KgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgYmktJmd0O2JpX2VuZF9pbyA9IG9wX2lzX3dyaXRl KG9wKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg ID8gcmFpZDVfZW5kX3dyaXRlX3JlcXVlc3Q8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA6IHJhaWQ1X2VuZF9yZWFkX3JlcXVlc3Q7PGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgYmktJmd0O2JpX3ByaXZhdGUgPSBzaDs8 YnI+DQpAQCAtMTAyNyw3ICsxMDMyLDcgQEAgYWdhaW46PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAqIElmIHRoaXMgaXMgZGlzY2FyZCByZXF1ZXN0LCBzZXQgYmlf dmNudCAwLiBXZSBkb24mIzM5O3Q8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCogd2FudCB0byBjb25mdXNlIFNDU0kgYmVjYXVzZSBTQ1NJIHdpbGwgcmVwbGFjZSBw YXlsb2FkPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAqLzxicj4N Ci3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChydyAmYW1wOyBSRVFfRElT Q0FSRCk8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAob3AgPT0g UkVRX09QX0RJU0NBUkQpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgYmktJmd0O2JpX3ZjbnQgPSAwOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIGlmIChycmRldik8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzZXRfYml0KFI1X0RPVUJMRV9MT0NLRUQsICZhbXA7c2gt Jmd0O2RldltpXS5mbGFncyk7PGJyPg0KQEAgLTEwNDcsOCArMTA1Miw5IEBAIGFnYWluOjxicj4N Cjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGJpb19yZXNldChyYmkp Ozxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJiaS0mZ3Q7YmlfYmRl diA9IHJyZGV2LSZndDtiZGV2Ozxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoHJiaS0mZ3Q7YmlfcncgPSBydzs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBCVUdfT04oIShydyAmYW1wOyBXUklURSkpOzxicj4NCivCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoHJiaS0mZ3Q7Ymlfb3AgPSBvcDs8YnI+DQorwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByYmktJmd0O2JpX3J3ID0gb3BfZmxhZ3M7PGJyPg0KK8Kg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgQlVHX09OKCFvcF9pc193cml0ZShvcCkp Ozxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJiaS0mZ3Q7YmlfZW5k X2lvID0gcmFpZDVfZW5kX3dyaXRlX3JlcXVlc3Q7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgcmJpLSZndDtiaV9wcml2YXRlID0gc2g7PGJyPg0KPGJyPg0KQEAgLTEw NzYsNyArMTA4Miw3IEBAIGFnYWluOjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgKiBJZiB0aGlzIGlzIGRpc2NhcmQgcmVxdWVzdCwgc2V0IGJpX3ZjbnQgMC4gV2Ug ZG9uJiMzOTt0PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAqIHdh bnQgdG8gY29uZnVzZSBTQ1NJIGJlY2F1c2UgU0NTSSB3aWxsIHJlcGxhY2UgcGF5bG9hZDxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKi88YnI+DQotwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAocncgJmFtcDsgUkVRX0RJU0NBUkQpPGJyPg0K K8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG9wID09IFJFUV9PUF9ESVND QVJEKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IHJiaS0mZ3Q7YmlfdmNudCA9IDA7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgaWYgKGNvbmYtJmd0O21kZGV2LSZndDtnZW5kaXNrKTxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHRyYWNlX2Jsb2NrX2Jpb19yZW1hcChi ZGV2X2dldF9xdWV1ZShyYmktJmd0O2JpX2JkZXYpLDxicj4NCkBAIC0xMDg1LDcgKzEwOTEsNyBA QCBhZ2Fpbjo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBnZW5lcmlj X21ha2VfcmVxdWVzdChyYmkpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIH08YnI+DQrC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZiAoIXJkZXYgJmFtcDsmYW1wOyAhcnJkZXYpIHs8YnI+ DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAocncgJmFtcDsgV1JJVEUp PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG9wX2lzX3dyaXRl KG9wKSk8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCBzZXRfYml0KFNUUklQRV9ERUdSQURFRCwgJmFtcDtzaC0mZ3Q7c3RhdGUpOzxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHByX2RlYnVnKCZxdW90O3NraXAgb3AgJWxk IG9uIGRpc2MgJWQgZm9yIHNlY3RvciAlbGx1XG4mcXVvdDssPGJyPg0KwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgYmktJmd0O2JpX3J3LCBpLCAodW5zaWdu ZWQgbG9uZyBsb25nKXNoLSZndDtzZWN0b3IpOzxicj4NCkBAIC0xNjIzLDcgKzE2MjksNyBAQCBh Z2Fpbjo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCBzZXRfYml0KFI1X1dhbnRGVUEsICZhbXA7ZGV2LSZndDtmbGFncyk7PGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaWYgKHdi aS0mZ3Q7YmlfcncgJmFtcDsgUkVRX1NZTkMpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgc2V0X2JpdChSNV9TeW5jSU8sICZh bXA7ZGV2LSZndDtmbGFncyk7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgaWYgKHdiaS0mZ3Q7YmlfcncgJmFtcDsgUkVRX0RJU0NBUkQpPGJyPg0K K8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKHdiaS0m Z3Q7Ymlfb3AgPT0gUkVRX09QX0RJU0NBUkQpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgc2V0X2JpdChSNV9EaXNjYXJkLCAm YW1wO2Rldi0mZ3Q7ZmxhZ3MpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIGVsc2Ugezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHR4ID0gYXN5bmNfY29weV9kYXRhKDEsIHdi aSwgJmFtcDtkZXYtJmd0O3BhZ2UsPGJyPg0KQEAgLTUxNzgsNyArNTE4NCw3IEBAIHN0YXRpYyB2 b2lkIHJhaWQ1X21ha2VfcmVxdWVzdChzdHJ1Y3QgbWRkZXYgKm1kZGV2LCBzdHJ1Y3QgYmlvICog YmkpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmV0dXJuOzxicj4N CsKgIMKgIMKgIMKgIH08YnI+DQo8YnI+DQotwqAgwqAgwqAgwqBpZiAodW5saWtlbHkoYmktJmd0 O2JpX3J3ICZhbXA7IFJFUV9ESVNDQVJEKSkgezxicj4NCivCoCDCoCDCoCDCoGlmICh1bmxpa2Vs eShiaS0mZ3Q7Ymlfb3AgPT0gUkVRX09QX0RJU0NBUkQpKSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgbWFrZV9kaXNjYXJkX3JlcXVlc3QobWRkZXYsIGJpKTs8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCByZXR1cm47PGJyPg0KwqAgwqAgwqAgwqAgfTxicj4NCjxzcGFuIGNsYXNz PSIiPjxmb250IGNvbG9yPSIjODg4ODg4Ij4tLTxicj4NCjIuNy4yPGJyPg0KPGJyPg0KLS08YnI+ DQpkbS1kZXZlbCBtYWlsaW5nIGxpc3Q8YnI+DQo8YSBocmVmPSJtYWlsdG86ZG0tZGV2ZWxAcmVk aGF0LmNvbSI+ZG0tZGV2ZWxAcmVkaGF0LmNvbTwvYT48YnI+DQo8YSBocmVmPSJodHRwczovL3d3 dy5yZWRoYXQuY29tL21haWxtYW4vbGlzdGluZm8vZG0tZGV2ZWwiIHJlbD0ibm9yZWZlcnJlciIg dGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vd3d3LnJlZGhhdC5jb20vbWFpbG1hbi9saXN0aW5mby9k bS1kZXZlbDwvYT48YnI+DQo8L2ZvbnQ+PC9zcGFuPjwvYmxvY2txdW90ZT48L2Rpdj48YnI+PGJy IGNsZWFyPSJhbGwiPjxkaXY+PGJyPjwvZGl2Pi0tIDxicj48ZGl2IGNsYXNzPSJnbWFpbF9zaWdu YXR1cmUiPjxkaXYgZGlyPSJsdHIiPjxkaXY+PGRpdiBkaXI9Imx0ciI+PGRpdj5TaGF1biBUYW5j aGVmZjwvZGl2PjxkaXY+PGJyPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2Pg0KPC9kaXY+ PC9kaXY+DQo= --94eb2c0766c65497ea05312f4703-- From shlee@sellaslaser.com Sat Apr 23 21:08:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.0 required=5.0 tests=AXB_XMAILER_MIMEOLE_OL_E023A, 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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EFCD87CC5 for ; Sat, 23 Apr 2016 21:08:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 58A9BAC001 for ; Sat, 23 Apr 2016 19:08:11 -0700 (PDT) X-ASG-Debug-ID: 1461463687-04cbb00fe91aac30001-NocioJ Received: from mail.sellaslaser.com (group.sellaslaser.com [211.115.80.8]) by cuda.sgi.com with ESMTP id MI4SaFLTQ1yzVqRq for ; Sat, 23 Apr 2016 19:08:08 -0700 (PDT) X-Barracuda-Envelope-From: shlee@sellaslaser.com X-Barracuda-Effective-Source-IP: group.sellaslaser.com[211.115.80.8] X-Barracuda-Apparent-Source-IP: 211.115.80.8 Received: (qmail 19018 invoked by uid 11001); 24 Apr 2016 11:08:06 +0900 Received: from unknown (HELO bpm) (shlee@61.174.249.181) by 0 (qmail 1.03 + ejcp v14 + HB patch) with SMTP; 24 Apr 2016 11:08:06 +0900 Reply-To: Sender: shlee@sellaslaser.com Message-ID: <74DCF5923994D67F61E42C85AD883134@bpm> From: =?gb2312?B?udzA7dSx?= To: Subject: =?gb2312?B?zajWqqO608q8/s+1zbPJ/by2zOHKvg==?= Date: Sun, 24 Apr 2016 10:07:57 +0800 X-ASG-Orig-Subj: =?gb2312?B?zajWqqO608q8/s+1zbPJ/by2zOHKvg==?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_058B_01585B98.1C98D820" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5512 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5512 X-Barracuda-Connect: group.sellaslaser.com[211.115.80.8] X-Barracuda-Start-Time: 1461463688 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7643 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.29004 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. ------=_NextPart_000_058B_01585B98.1C98D820 Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 1/C+tLXEwey1vNLUvLDNrMrCo7oNCiAgICDTydPasr+31sDr1rDUsbmksOy5q9PKz+TDu9PQvLDK scnPvcnXos/61Oyzyc3iwfejrNHP1tjTsM/sxNqyv09B08q8/s+1zbO1xLCyyKvUy9Oqo6ENCs/W zajWqrG+0/LTw7unyOfPwqO6DQrE+rXERW1haWyjunhmc0Bvc3Muc2dpLmNvbdDo0qq9+NDQ08O7 p7XHvMexuLC4o6zT4sqxw7vNqLn9sbiwuLXE1cu6xb2ru+Gxu82j1rnKudPDo6ENCtTaytW1vc2o 1qq1xLXa0rvKsbzko6y9q8/CwdDQxc+izO7QtM3qsc+72Li01sGxvtPKz+SjoQ0K0NXD+6O6DQrW sM67o7oNCtPKz+Sjug0K08rP5LXHwry12Na3o7oNCtPKz+TD3MLro7oNCrP1yrzD3MLro7oNCsrW u/q6xcLro7o= ------=_NextPart_000_058B_01585B98.1C98D820 Content-Type: text/html; charset="gb2312" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWdi MjMxMiIgaHR0cC1lcXVpdj1Db250ZW50LVR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250 ZW50PSJNU0hUTUwgOC4wMC42MDAxLjE4NzAyIj48L0hFQUQ+DQo8Qk9EWT4NCjxQPjxTVFJPTkc+ PFNUUk9ORz48U1BBTiANCnN0eWxlPSJXSURPV1M6IDE7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBU RVhULUlOREVOVDogMHB4OyBESVNQTEFZOiBpbmxpbmUgIWltcG9ydGFudDsgRk9OVDogbWVkaXVt IFNpbXN1bjsgV0hJVEUtU1BBQ0U6IG5vcm1hbDsgRkxPQVQ6IG5vbmU7IExFVFRFUi1TUEFDSU5H OiBub3JtYWw7IENPTE9SOiByZ2IoMCwwLDApOyBXT1JELVNQQUNJTkc6IDBweDsgLXdlYmtpdC10 ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij48U1RST05HPtfwvrS1xMHstbzS1LywzazKwjwvU1RST05H PqO6PC9TUEFOPjxCUiANCnN0eWxlPSJXSURPV1M6IDE7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBU RVhULUlOREVOVDogMHB4OyBGT05UOiBtZWRpdW0gU2ltc3VuOyBXSElURS1TUEFDRTogbm9ybWFs OyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgV09SRC1TUEFDSU5H OiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PC9TVFJPTkc+PFNQQU4gDQpz dHlsZT0iV0lET1dTOiAxOyBURVhULVRSQU5TRk9STTogbm9uZTsgVEVYVC1JTkRFTlQ6IDBweDsg RElTUExBWTogaW5saW5lICFpbXBvcnRhbnQ7IEZPTlQ6IG1lZGl1bSBTaW1zdW47IFdISVRFLVNQ QUNFOiBub3JtYWw7IEZMT0FUOiBub25lOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBDT0xPUjog cmdiKDAsMCwwKTsgV09SRC1TUEFDSU5HOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6 IDBweCI+Jm5ic3A7PC9TUEFOPjxXQlIgDQpzdHlsZT0iV0lET1dTOiAxOyBURVhULVRSQU5TRk9S TTogbm9uZTsgVEVYVC1JTkRFTlQ6IDBweDsgRk9OVDogbWVkaXVtIFNpbXN1bjsgV0hJVEUtU1BB Q0U6IG5vcm1hbDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQ09MT1I6IHJnYigwLDAsMCk7IFdP UkQtU1BBQ0lORzogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiPjxTUEFOIA0K c3R5bGU9IldJRE9XUzogMTsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IFRFWFQtSU5ERU5UOiAwcHg7 IERJU1BMQVk6IGlubGluZSAhaW1wb3J0YW50OyBGT05UOiBtZWRpdW0gU2ltc3VuOyBXSElURS1T UEFDRTogbm9ybWFsOyBGTE9BVDogbm9uZTsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQ09MT1I6 IHJnYigwLDAsMCk7IFdPUkQtU1BBQ0lORzogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRo OiAwcHgiPiZuYnNwOzwvU1BBTj48V0JSIA0Kc3R5bGU9IldJRE9XUzogMTsgVEVYVC1UUkFOU0ZP Uk06IG5vbmU7IFRFWFQtSU5ERU5UOiAwcHg7IEZPTlQ6IG1lZGl1bSBTaW1zdW47IFdISVRFLVNQ QUNFOiBub3JtYWw7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IENPTE9SOiByZ2IoMCwwLDApOyBX T1JELVNQQUNJTkc6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij48U1BBTiAN CnN0eWxlPSJXSURPV1M6IDE7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBURVhULUlOREVOVDogMHB4 OyBESVNQTEFZOiBpbmxpbmUgIWltcG9ydGFudDsgRk9OVDogbWVkaXVtIFNpbXN1bjsgV0hJVEUt U1BBQ0U6IG5vcm1hbDsgRkxPQVQ6IG5vbmU7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IENPTE9S OiByZ2IoMCwwLDApOyBXT1JELVNQQUNJTkc6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0 aDogMHB4Ij4mbmJzcDs8L1NQQU4+PFdCUiANCnN0eWxlPSJXSURPV1M6IDE7IFRFWFQtVFJBTlNG T1JNOiBub25lOyBURVhULUlOREVOVDogMHB4OyBGT05UOiBtZWRpdW0gU2ltc3VuOyBXSElURS1T UEFDRTogbm9ybWFsOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsg V09SRC1TUEFDSU5HOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PFNQQU4g DQpzdHlsZT0iV0lET1dTOiAxOyBURVhULVRSQU5TRk9STTogbm9uZTsgVEVYVC1JTkRFTlQ6IDBw eDsgRElTUExBWTogaW5saW5lICFpbXBvcnRhbnQ7IEZPTlQ6IG1lZGl1bSBTaW1zdW47IFdISVRF LVNQQUNFOiBub3JtYWw7IEZMT0FUOiBub25lOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBDT0xP UjogcmdiKDAsMCwwKTsgV09SRC1TUEFDSU5HOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lk dGg6IDBweCI+PFNQQU4gDQpjbGFzcz1BcHBsZS1jb252ZXJ0ZWQtc3BhY2U+Jm5ic3A7PC9TUEFO PjxTVFJPTkc+08nT2rK/t9bA69aw1LG5pLDsuavTys/kw7vT0LywyrHJz73J16LP+tTss8nN4sH3 o6zRz9bY07DP7MTasr9PQdPKvP7Ptc2ztcSwssir1MvTqqOhPC9TVFJPTkc+PC9TUEFOPjxCUiAN CnN0eWxlPSJXSURPV1M6IDE7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBURVhULUlOREVOVDogMHB4 OyBGT05UOiBtZWRpdW0gU2ltc3VuOyBXSElURS1TUEFDRTogbm9ybWFsOyBMRVRURVItU1BBQ0lO Rzogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgV09SRC1TUEFDSU5HOiAwcHg7IC13ZWJraXQt dGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PFNQQU4gDQpzdHlsZT0iV0lET1dTOiAxOyBURVhULVRS QU5TRk9STTogbm9uZTsgVEVYVC1JTkRFTlQ6IDBweDsgRElTUExBWTogaW5saW5lICFpbXBvcnRh bnQ7IEZPTlQ6IG1lZGl1bSBTaW1zdW47IFdISVRFLVNQQUNFOiBub3JtYWw7IEZMT0FUOiBub25l OyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgV09SRC1TUEFDSU5H OiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PFNUUk9ORz7P1s2o1qqxvtPy 08O7p8jnz8KjujwvU1RST05HPjwvU1BBTj48L1NUUk9ORz48QlIgDQpzdHlsZT0iV0lET1dTOiAx OyBURVhULVRSQU5TRk9STTogbm9uZTsgVEVYVC1JTkRFTlQ6IDBweDsgRk9OVDogbWVkaXVtIFNp bXN1bjsgV0hJVEUtU1BBQ0U6IG5vcm1hbDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQ09MT1I6 IHJnYigwLDAsMCk7IFdPUkQtU1BBQ0lORzogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRo OiAwcHgiPjxTUEFOIA0Kc3R5bGU9IldJRE9XUzogMTsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IFRF WFQtSU5ERU5UOiAwcHg7IERJU1BMQVk6IGlubGluZSAhaW1wb3J0YW50OyBGT05UOiBtZWRpdW0g U2ltc3VuOyBXSElURS1TUEFDRTogbm9ybWFsOyBGTE9BVDogbm9uZTsgTEVUVEVSLVNQQUNJTkc6 IG5vcm1hbDsgQ09MT1I6IHJnYigwLDAsMCk7IFdPUkQtU1BBQ0lORzogMHB4OyAtd2Via2l0LXRl eHQtc3Ryb2tlLXdpZHRoOiAwcHgiPjxTVFJPTkc+xPq1xEVtYWlso7o8Rk9OVCANCmNvbG9yPXJl ZD54ZnNAb3NzLnNnaS5jb208L0ZPTlQ+PEZPTlQgDQpjb2xvcj1ibGFjaz7Q6NKqvfjQ0NPDu6e1 x7zHsbiwuKOs0+LKscO7zai5/bG4sLi1xNXLusW9q7vhsbvNo9a5yrnTw6OhPC9GT05UPjwvU1RS T05HPjwvU1BBTj48QlIgDQpzdHlsZT0iV0lET1dTOiAxOyBURVhULVRSQU5TRk9STTogbm9uZTsg VEVYVC1JTkRFTlQ6IDBweDsgRk9OVDogbWVkaXVtIFNpbXN1bjsgV0hJVEUtU1BBQ0U6IG5vcm1h bDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQ09MT1I6IHJnYigwLDAsMCk7IFdPUkQtU1BBQ0lO RzogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiPjxTUEFOPjxTVFJPTkc+1NrK 1bW9zajWqrXEtdrSu8qxvOSjrL2rz8LB0NDFz6LM7tC0zeqxz7vYuLTWwbG+08rP5KOhPC9TVFJP Tkc+PC9TUEFOPjwvUD4NCjxQPjxTUEFOIA0Kc3R5bGU9IldJRE9XUzogMTsgVEVYVC1UUkFOU0ZP Uk06IG5vbmU7IFRFWFQtSU5ERU5UOiAwcHg7IERJU1BMQVk6IGlubGluZSAhaW1wb3J0YW50OyBG T05UOiBtZWRpdW0gU2ltc3VuOyBXSElURS1TUEFDRTogbm9ybWFsOyBGTE9BVDogbm9uZTsgTEVU VEVSLVNQQUNJTkc6IG5vcm1hbDsgQ09MT1I6IHJnYigwLDAsMCk7IFdPUkQtU1BBQ0lORzogMHB4 OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiPjxTVFJPTkc+PFNUUk9ORz48U1RST05H PjxTVFJPTkc+PFNQQU4gDQpzdHlsZT0iV0lET1dTOiAxOyBURVhULVRSQU5TRk9STTogbm9uZTsg VEVYVC1JTkRFTlQ6IDBweDsgRElTUExBWTogaW5saW5lICFpbXBvcnRhbnQ7IEZPTlQ6IG1lZGl1 bSBTaW1zdW47IFdISVRFLVNQQUNFOiBub3JtYWw7IEZMT0FUOiBub25lOyBMRVRURVItU1BBQ0lO Rzogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgV09SRC1TUEFDSU5HOiAwcHg7IC13ZWJraXQt dGV4dC1zdHJva2Utd2lkdGg6IDBweCI+0NXD+6O6PC9TUEFOPjxCUiANCnN0eWxlPSJXSURPV1M6 IDE7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBURVhULUlOREVOVDogMHB4OyBGT05UOiBtZWRpdW0g U2ltc3VuOyBXSElURS1TUEFDRTogbm9ybWFsOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBDT0xP UjogcmdiKDAsMCwwKTsgV09SRC1TUEFDSU5HOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lk dGg6IDBweCI+PC9TVFJPTkc+PFNQQU4gDQpzdHlsZT0iV0lET1dTOiAxOyBURVhULVRSQU5TRk9S TTogbm9uZTsgVEVYVC1JTkRFTlQ6IDBweDsgRElTUExBWTogaW5saW5lICFpbXBvcnRhbnQ7IEZP TlQ6IG1lZGl1bSBTaW1zdW47IFdISVRFLVNQQUNFOiBub3JtYWw7IEZMT0FUOiBub25lOyBMRVRU RVItU1BBQ0lORzogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgV09SRC1TUEFDSU5HOiAwcHg7 IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+1rDOu6O6PC9TUEFOPjwvU1RST05HPjxC UiANCnN0eWxlPSJXSURPV1M6IDE7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBURVhULUlOREVOVDog MHB4OyBGT05UOiBtZWRpdW0gU2ltc3VuOyBXSElURS1TUEFDRTogbm9ybWFsOyBMRVRURVItU1BB Q0lORzogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgV09SRC1TUEFDSU5HOiAwcHg7IC13ZWJr aXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PFNQQU4gDQpzdHlsZT0iV0lET1dTOiAxOyBURVhU LVRSQU5TRk9STTogbm9uZTsgVEVYVC1JTkRFTlQ6IDBweDsgRElTUExBWTogaW5saW5lICFpbXBv cnRhbnQ7IEZPTlQ6IG1lZGl1bSBTaW1zdW47IFdISVRFLVNQQUNFOiBub3JtYWw7IEZMT0FUOiBu b25lOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgV09SRC1TUEFD SU5HOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+08rP5KO6PC9TUEFOPjxC UiANCnN0eWxlPSJXSURPV1M6IDE7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBURVhULUlOREVOVDog MHB4OyBGT05UOiBtZWRpdW0gU2ltc3VuOyBXSElURS1TUEFDRTogbm9ybWFsOyBMRVRURVItU1BB Q0lORzogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgV09SRC1TUEFDSU5HOiAwcHg7IC13ZWJr aXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PC9TVFJPTkc+PFNQQU4gDQpzdHlsZT0iV0lET1dT OiAxOyBURVhULVRSQU5TRk9STTogbm9uZTsgVEVYVC1JTkRFTlQ6IDBweDsgRElTUExBWTogaW5s aW5lICFpbXBvcnRhbnQ7IEZPTlQ6IG1lZGl1bSBTaW1zdW47IFdISVRFLVNQQUNFOiBub3JtYWw7 IEZMT0FUOiBub25lOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsg V09SRC1TUEFDSU5HOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+08rP5LXH wry12Na3o7o8L1NQQU4+PEJSIA0Kc3R5bGU9IldJRE9XUzogMTsgVEVYVC1UUkFOU0ZPUk06IG5v bmU7IFRFWFQtSU5ERU5UOiAwcHg7IEZPTlQ6IG1lZGl1bSBTaW1zdW47IFdISVRFLVNQQUNFOiBu b3JtYWw7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IENPTE9SOiByZ2IoMCwwLDApOyBXT1JELVNQ QUNJTkc6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij48U1BBTiANCnN0eWxl PSJXSURPV1M6IDE7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBURVhULUlOREVOVDogMHB4OyBESVNQ TEFZOiBpbmxpbmUgIWltcG9ydGFudDsgRk9OVDogbWVkaXVtIFNpbXN1bjsgV0hJVEUtU1BBQ0U6 IG5vcm1hbDsgRkxPQVQ6IG5vbmU7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IENPTE9SOiByZ2Io MCwwLDApOyBXT1JELVNQQUNJTkc6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4 Ij7Tys/kw9zC66O6PC9TUEFOPjxCUiANCnN0eWxlPSJXSURPV1M6IDE7IFRFWFQtVFJBTlNGT1JN OiBub25lOyBURVhULUlOREVOVDogMHB4OyBGT05UOiBtZWRpdW0gU2ltc3VuOyBXSElURS1TUEFD RTogbm9ybWFsOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgV09S RC1TUEFDSU5HOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PFNQQU4gDQpz dHlsZT0iV0lET1dTOiAxOyBURVhULVRSQU5TRk9STTogbm9uZTsgVEVYVC1JTkRFTlQ6IDBweDsg RElTUExBWTogaW5saW5lICFpbXBvcnRhbnQ7IEZPTlQ6IG1lZGl1bSBTaW1zdW47IFdISVRFLVNQ QUNFOiBub3JtYWw7IEZMT0FUOiBub25lOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBDT0xPUjog cmdiKDAsMCwwKTsgV09SRC1TUEFDSU5HOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6 IDBweCI+s/XKvMPcwuujujwvU1BBTj48QlIgDQpzdHlsZT0iV0lET1dTOiAxOyBURVhULVRSQU5T Rk9STTogbm9uZTsgVEVYVC1JTkRFTlQ6IDBweDsgRk9OVDogbWVkaXVtIFNpbXN1bjsgV0hJVEUt U1BBQ0U6IG5vcm1hbDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQ09MT1I6IHJnYigwLDAsMCk7 IFdPUkQtU1BBQ0lORzogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiPjxTUEFO IA0Kc3R5bGU9IldJRE9XUzogMTsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IFRFWFQtSU5ERU5UOiAw cHg7IERJU1BMQVk6IGlubGluZSAhaW1wb3J0YW50OyBGT05UOiBtZWRpdW0gU2ltc3VuOyBXSElU RS1TUEFDRTogbm9ybWFsOyBGTE9BVDogbm9uZTsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQ09M T1I6IHJnYigwLDAsMCk7IFdPUkQtU1BBQ0lORzogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdp ZHRoOiAwcHgiPsrWu/q6xcLro7o8L1NQQU4+PC9TVFJPTkc+PC9TUEFOPjwvUD48L0JPRFk+PC9I VE1MPg0K ------=_NextPart_000_058B_01585B98.1C98D820-- From dev@lynxeye.de Mon Apr 25 02:42:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 73F9A7CA0 for ; Mon, 25 Apr 2016 02:42:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id EE0DAAC002 for ; Mon, 25 Apr 2016 00:42:53 -0700 (PDT) X-ASG-Debug-ID: 1461570169-04bdf0358f2080e0001-NocioJ Received: from lynxeye.de (ns.lynxeye.de [87.118.118.114]) by cuda.sgi.com with ESMTP id bFyxlHSCWF4ftqBu for ; Mon, 25 Apr 2016 00:42:50 -0700 (PDT) X-Barracuda-Envelope-From: dev@lynxeye.de X-Barracuda-Effective-Source-IP: ns.lynxeye.de[87.118.118.114] X-Barracuda-Apparent-Source-IP: 87.118.118.114 Received: by lynxeye.de (Postfix, from userid 501) id AC44026C2003; Mon, 25 Apr 2016 09:42:48 +0200 (CEST) Received: from antimon.intern.lynxeye.de (p57B5ED0C.dip0.t-ipconnect.de [87.181.237.12]) by lynxeye.de (Postfix) with ESMTPA id 33B1326C2001; Mon, 25 Apr 2016 09:42:47 +0200 (CEST) From: Lucas Stach To: Dave Chinner Cc: xfs@oss.sgi.com, linux-kernel@vger.kernel.org Subject: [PATCH] xfs: idle aild if the AIL is pushed up to the target LSN Date: Mon, 25 Apr 2016 09:42:43 +0200 X-ASG-Orig-Subj: [PATCH] xfs: idle aild if the AIL is pushed up to the target LSN Message-Id: <1461570163-4083-1-git-send-email-dev@lynxeye.de> X-Mailer: git-send-email 2.5.5 X-Barracuda-Connect: ns.lynxeye.de[87.118.118.114] X-Barracuda-Start-Time: 1461570169 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2192 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29036 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header The current logic only idles aild if the AIL is empty, rescheduling the worker with a timeout of 50ms otherwise. If the target LSN isn't moved forward, the worker will not make any progress as it only pushes the AIL up to the target LSN, leading to the empty AIL condition to only be met after the log worker pushed the complete AIL. As the log worker runs on the scale of minutes, this leaves aild in the "no progress, 50ms timeout" state for extended periods of time, causing many unecessary wakeups. Fix this by idling aild as soon as the AIL is pushed up to the target LSN. All code paths that move the target LSN forward already ensure that aild is woken up again when needed. Signed-off-by: Lucas Stach --- I'm pretty sure that the above deduction is correct, but as this my first real encounter with the XFS code base, someone with a bit more knowledge than me should give this some thought. --- fs/xfs/xfs_trans_ail.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index d6c9c3e..7eca852 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -495,6 +495,7 @@ xfsaild( { struct xfs_ail *ailp = data; long tout = 0; /* milliseconds */ + struct xfs_log_item *lip; current->flags |= PF_MEMALLOC; set_freezable(); @@ -508,7 +509,8 @@ xfsaild( spin_lock(&ailp->xa_lock); /* - * Idle if the AIL is empty and we are not racing with a target + * Idle if the AIL is empty or pushed up to the requested + * target LSN and we are not racing with a target * update. We check the AIL after we set the task to a sleep * state to guarantee that we either catch an xa_target update * or that a wake_up resets the state to TASK_RUNNING. @@ -517,7 +519,8 @@ xfsaild( * The barrier matches the xa_target update in xfs_ail_push(). */ smp_rmb(); - if (!xfs_ail_min(ailp) && + lip = xfs_ail_min(ailp); + if ((!lip || XFS_LSN_CMP(lip->li_lsn, ailp->xa_target) >= 0) && ailp->xa_target == ailp->xa_target_prev) { spin_unlock(&ailp->xa_lock); freezable_schedule(); -- 2.5.5 From BATV+504b9d42077afd54c011+4628+infradead.org+hch@bombadil.srs.infradead.org Mon Apr 25 03:31:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 759AA7CA0 for ; Mon, 25 Apr 2016 03:31:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3CBE2304032 for ; Mon, 25 Apr 2016 01:31:21 -0700 (PDT) X-ASG-Debug-ID: 1461573077-04cbb00fea1f9300001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id g3lUtASgtDBEjROo (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 25 Apr 2016 01:31:18 -0700 (PDT) X-Barracuda-Envelope-From: BATV+504b9d42077afd54c011+4628+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1aubvG-000144-Mh; Mon, 25 Apr 2016 08:31:14 +0000 Date: Mon, 25 Apr 2016 01:31:14 -0700 From: "hch@infradead.org" To: "Verma, Vishal L" Cc: "hch@infradead.org" , "jmoyer@redhat.com" , "axboe@fb.com" , "jack@suse.cz" , "linux-nvdimm@ml01.01.org" , "david@fromorbit.com" , "linux-kernel@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-block@vger.kernel.org" , "linux-mm@kvack.org" , "Wilcox, Matthew R" , "linux-fsdevel@vger.kernel.org" , "akpm@linux-foundation.org" , "linux-ext4@vger.kernel.org" , "viro@zeniv.linux.org.uk" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Message-ID: <20160425083114.GA27556@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1461434916.3695.7.camel@intel.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1461573078 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 759 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29037 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Sat, Apr 23, 2016 at 06:08:37PM +0000, Verma, Vishal L wrote: > direct_IO might fail with -EINVAL due to misalignment, or -ENOMEM due > to some allocation failing, and I thought we should return the original > -EIO in such cases so that the application doesn't lose the information > that the bad block is actually causing the error. EINVAL is a concern here. Not due to the right error reported, but because it means your current scheme is fundamentally broken - we need to support I/O at any alignment for DAX I/O, and not fail due to alignbment concernes for a highly specific degraded case. I think this whole series need to go back to the drawing board as I don't think it can actually rely on using direct I/O as the EIO fallback. From bfoster@redhat.com Mon Apr 25 09:24:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2CC8A7CA0 for ; Mon, 25 Apr 2016 09:24:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C985D8F8033 for ; Mon, 25 Apr 2016 07:24:49 -0700 (PDT) X-ASG-Debug-ID: 1461594288-04bdf03596211630001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id bwzUTBoPnJfGjfqQ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 25 Apr 2016 07:24:48 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2D216C049D7F; Mon, 25 Apr 2016 14:24:48 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-148.bos.redhat.com [10.18.41.148]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3PEOl6t009604; Mon, 25 Apr 2016 10:24:47 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 7C6A01237F0; Mon, 25 Apr 2016 10:24:46 -0400 (EDT) Date: Mon, 25 Apr 2016 10:24:46 -0400 From: Brian Foster To: Lucas Stach Cc: Dave Chinner , linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: idle aild if the AIL is pushed up to the target LSN Message-ID: <20160425142444.GC33882@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: idle aild if the AIL is pushed up to the target LSN References: <1461570163-4083-1-git-send-email-dev@lynxeye.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1461570163-4083-1-git-send-email-dev@lynxeye.de> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461594288 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3669 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Apr 25, 2016 at 09:42:43AM +0200, Lucas Stach wrote: > The current logic only idles aild if the AIL is empty, rescheduling > the worker with a timeout of 50ms otherwise. If the target LSN isn't > moved forward, the worker will not make any progress as it only > pushes the AIL up to the target LSN, leading to the empty AIL > condition to only be met after the log worker pushed the complete > AIL. As the log worker runs on the scale of minutes, this leaves > aild in the "no progress, 50ms timeout" state for extended periods of > time, causing many unecessary wakeups. > Where do you get the "scale of minutes" from? I believe the default log worker interval is 30s, though it can be increased by the admin. The other thing to note is that the AIL target is also driven by demand on log space. E.g., see xlog_grant_push_ail(), which executes when a transaction attempts to reserve log space that isn't currently available in the log. That said, I'm not sure whether there's a notable benefit of idling for 50ms over just scheduling out when we've hit the target lsn. It seems like that anybody who pushes the target forward again is going to wake up the thread anyways. On the other hand, if the fs is idle the thread will eventually schedule out indefinitely. Have you observed problematic behavior due to the current heuristic? > Fix this by idling aild as soon as the AIL is pushed up to the target > LSN. All code paths that move the target LSN forward already ensure > that aild is woken up again when needed. > > Signed-off-by: Lucas Stach > --- > I'm pretty sure that the above deduction is correct, but as this my > first real encounter with the XFS code base, someone with a bit more > knowledge than me should give this some thought. > --- > fs/xfs/xfs_trans_ail.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c > index d6c9c3e..7eca852 100644 > --- a/fs/xfs/xfs_trans_ail.c > +++ b/fs/xfs/xfs_trans_ail.c > @@ -495,6 +495,7 @@ xfsaild( > { > struct xfs_ail *ailp = data; > long tout = 0; /* milliseconds */ > + struct xfs_log_item *lip; > > current->flags |= PF_MEMALLOC; > set_freezable(); > @@ -508,7 +509,8 @@ xfsaild( > spin_lock(&ailp->xa_lock); > > /* > - * Idle if the AIL is empty and we are not racing with a target > + * Idle if the AIL is empty or pushed up to the requested > + * target LSN and we are not racing with a target > * update. We check the AIL after we set the task to a sleep > * state to guarantee that we either catch an xa_target update > * or that a wake_up resets the state to TASK_RUNNING. > @@ -517,7 +519,8 @@ xfsaild( > * The barrier matches the xa_target update in xfs_ail_push(). > */ > smp_rmb(); > - if (!xfs_ail_min(ailp) && > + lip = xfs_ail_min(ailp); > + if ((!lip || XFS_LSN_CMP(lip->li_lsn, ailp->xa_target) >= 0) && I think you'd want to use > 0, as == 0 suggests you have an item that matches the target. FWIW, another option might be to increase the timeout to something much larger than the current 50ms when we've hit the target. See towards the end of xfsaild_push() where tout is determined based on the state of the push (and we already have logic to check against xa_target). Brian > ailp->xa_target == ailp->xa_target_prev) { > spin_unlock(&ailp->xa_lock); > freezable_schedule(); > -- > 2.5.5 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From fat_destroyer-xfs=oss.sgi.com@ulieta.com Mon Apr 25 10:13:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=DIET_1,HTML_MESSAGE, T_DKIM_INVALID,T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 51B5C7CA2 for ; Mon, 25 Apr 2016 10:13:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id BF214AC002 for ; Mon, 25 Apr 2016 08:13:48 -0700 (PDT) X-ASG-Debug-ID: 1461597221-04bdf0358f212ea0002-NocioJ Received: from mail.ulieta.com (til244.members.turizm.com [94.156.132.244]) by cuda.sgi.com with ESMTP id gOQX8KD6ErFiDKGy for ; Mon, 25 Apr 2016 08:13:47 -0700 (PDT) X-Barracuda-Envelope-From: fat_destroyer-xfs=oss.sgi.com@ulieta.com X-Barracuda-Effective-Source-IP: til244.members.turizm.com[94.156.132.244] X-Barracuda-Apparent-Source-IP: 94.156.132.244 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=dkim; d=ulieta.com; h=Date:From:To:Subject:MIME-Version:Content-Type:Message-ID; i=fat_destroyer@ulieta.com; bh=L4+mQlHX6AXvXnS5/WHyhmgbJzo=; b=Vlb/KpCVZd1upXuRHPaCD1YDZuLNcbO6tLtfjdNeX7aE7ZjhoJdTh5OSNW5oIjN2s22lR8xFOIwF OZRH06BgwEPOFtaXv2SJORhrmwPYj1aai4xQlKP1srRTfEEYBO9HeIG/h6znpvr05QM8CL7HcLPd hg1F1fpbWdPiMJtpwJ4= DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=dkim; d=ulieta.com; b=Er6ajgM4f/LpBBrj4Levn7TKUFtORS7t30fHT1NN9+cJZW0CqrCWSaG7VrT789da04tp5rzZi0C/ 97gzBASd+OeUr6PJ2clYXBt5fmscTZU15p2g305HZLmaZIeiy+fOQISwYmWXUehb7jhhcCBvMyWR MpUQlQupNxgVEqZWw6U=; Received: by mail.ulieta.com id h3oq2m0001gl for ; Mon, 25 Apr 2016 10:07:48 -0500 (envelope-from ) Date: Mon, 25 Apr 2016 10:07:48 -0500 From: "Fat Destroyer" To: Subject: Revolutionary "Fat Melter" Called "Miraculous." MIME-Version: 1.0 X-ASG-Orig-Subj: Revolutionary "Fat Melter" Called "Miraculous." Content-Type: multipart/alternative; boundary="----=_Part_277_1303243750.1461596687439" Message-ID: <0.0.0.2E.1D19F043A86852A.5A14B2@mail.ulieta.com> X-Barracuda-Connect: til244.members.turizm.com[94.156.132.244] X-Barracuda-Start-Time: 1461597226 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3651 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=DIET_1, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29044 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.34 DIET_1 BODY: Lose Weight Spam -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message ------=_Part_277_1303243750.1461596687439 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Revolutionary "Fat Melter" Called "Miraculous." http://www.ulieta.com/4c1lU865I2b5ZsnFjnn0ntv0Mjhe69/blue Update Preference- http://www.ulieta.com/red/rain/c4386VTi52baZsnFjnn0ntv0Mjha13 ------=_Part_277_1303243750.1461596687439 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit

    Revolutionary "Fat Melter" Called "Miraculous."

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

    And...

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

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

    The Fat Diminisher

    Crazy transformation, right? Well...

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

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

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

    To your success!



     

    This communication is for informational purposes only. Consult a physician before performing this or any exercise program. It is your responsibility to evaluate your own medical and physical condition, or that of your clients, and to independently determine whether to perform, use or adapt any of the information or content in this communication or the resulting web site. Any exercise program may result in injury. By voluntarily undertaking any exercise displayed in this communication or the resulting web site, you assume the risk of any resulting injury.

    DAS Services. - 315 Place d' Youville, Montré al, QC H2Y 0A4

    Copyright 2015. All rights reserved.

     

    Update Preferences

    New Fat Diminisher, 315 Place d' Youville, Montré al, QC H2Y 0A4










     


    ------=_Part_277_1303243750.1461596687439-- From jmoyer@redhat.com Mon Apr 25 10:32:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D72BF7CA0 for ; Mon, 25 Apr 2016 10:32:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7B9338F8033 for ; Mon, 25 Apr 2016 08:32:13 -0700 (PDT) X-ASG-Debug-ID: 1461598331-04bdf03590215470001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id UfEY7WMJrCtkiiTA (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 25 Apr 2016 08:32:12 -0700 (PDT) X-Barracuda-Envelope-From: jmoyer@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 47D1F62647; Mon, 25 Apr 2016 15:32:11 +0000 (UTC) Received: from segfault.boston.devel.redhat.com (segfault.boston.devel.redhat.com [10.19.60.26]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3PFW8Wm027904 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Mon, 25 Apr 2016 11:32:09 -0400 From: Jeff Moyer To: "hch\@infradead.org" Cc: "Verma\, Vishal L" , "axboe\@fb.com" , "jack\@suse.cz" , "linux-nvdimm\@ml01.01.org" , "david\@fromorbit.com" , "linux-kernel\@vger.kernel.org" , "xfs\@oss.sgi.com" , "linux-block\@vger.kernel.org" , "linux-mm\@kvack.org" , "Wilcox\, Matthew R" , "linux-fsdevel\@vger.kernel.org" , "akpm\@linux-foundation.org" , "linux-ext4\@vger.kernel.org" , "viro\@zeniv.linux.org.uk" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io X-PGP-KeyID: 1F78E1B4 X-PGP-CertKey: F6FE 280D 8293 F72C 65FD 5A58 1FF8 A7CA 1F78 E1B4 X-PCLoadLetter: What the f**k does that mean? Date: Mon, 25 Apr 2016 11:32:08 -0400 In-Reply-To: <20160425083114.GA27556@infradead.org> (hch@infradead.org's message of "Mon, 25 Apr 2016 01:31:14 -0700") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 25 Apr 2016 15:32:11 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461598332 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 903 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 "hch@infradead.org" writes: > On Sat, Apr 23, 2016 at 06:08:37PM +0000, Verma, Vishal L wrote: >> direct_IO might fail with -EINVAL due to misalignment, or -ENOMEM due >> to some allocation failing, and I thought we should return the original >> -EIO in such cases so that the application doesn't lose the information >> that the bad block is actually causing the error. > > EINVAL is a concern here. Not due to the right error reported, but > because it means your current scheme is fundamentally broken - we > need to support I/O at any alignment for DAX I/O, and not fail due to > alignbment concernes for a highly specific degraded case. > > I think this whole series need to go back to the drawing board as I > don't think it can actually rely on using direct I/O as the EIO > fallback. The only callers of dax_do_io are direct_IO methods. Cheers, Jeff From shyam@zadarastorage.com Mon Apr 25 11:51:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0A8967CA0 for ; Mon, 25 Apr 2016 11:51:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CECB78F8035 for ; Mon, 25 Apr 2016 09:51:36 -0700 (PDT) X-ASG-Debug-ID: 1461603092-04cbb00fe720bb70001-NocioJ Received: from mail-wm0-f41.google.com (mail-wm0-f41.google.com [74.125.82.41]) by cuda.sgi.com with ESMTP id h6Tw1hJycndmVpjk (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 25 Apr 2016 09:51:33 -0700 (PDT) X-Barracuda-Envelope-From: shyam@zadarastorage.com X-Barracuda-Effective-Source-IP: mail-wm0-f41.google.com[74.125.82.41] X-Barracuda-Apparent-Source-IP: 74.125.82.41 Received: by mail-wm0-f41.google.com with SMTP id u206so137290612wme.1 for ; Mon, 25 Apr 2016 09:51:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=from:mime-version:thread-index:date:message-id:subject:to:cc; bh=lMrpvlI8ziRI9BflJZqaJsQs46jdaWPQ6LPktibZQyE=; b=Gylan2S5VgtR94DfypmsPgtzDBglHV22p/o7cdi25SUG19F+Yct34CjojrHXflDLVU TAwbLfXWy6CjzeoBywyS1XjcmzG/YrweZYua0QBJmL9XTrr/xpqd2VI8qnYDwV8VRKbT yR1vpKmeF02BjRAvqttPZJMXS9JIKa+nwo61FtcB8XSEcKTP0bFaeaTTH3kV0Uf/G44y G2l6LGTLB16+4rSNPr9Zzzc+3KUFETlzb+qtvUjue5Jg8TrDY4MJWisipyP97qTkk2GU +eZLKovLID7YQ2fV+eshDY6A3mZWE/X9BV4jMhvQ6MfehIKMQIOJxRX3cOmdOvARTSZF lXFw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:mime-version:thread-index:date:message-id :subject:to:cc; bh=lMrpvlI8ziRI9BflJZqaJsQs46jdaWPQ6LPktibZQyE=; b=A1NDQAB5gghhjbG+bMM1+oYU7qnVAo4qxTEL21OQPP7RL7UpCbT2+s6+dQMSQXxtU9 5ozaok1TKKO4GRaWdJYl8Lm5IYrfwLj2+qZnt8EyxXSK/EV0bOLPLPX1Us1aoHws3E7c gEwKamOF5YXlxaxTqyR98rRHhoWZ+SdWq4JZlw8mbQdpmOZiIf09MAk4+Om1FXvOMjwY gQn5oJeW+U5s8xP0pXQyJ15k3sEXktK//dbOsnYnWRixW/aIv0vnDZ1kuG0+U6Y6Q4OJ P0FjTHVOqV1UEV1QwhmWF2PUqc4qy4am5ShjnMJ7K8P/pciv74okXDbyeos4VfECvY6q P1EQ== X-Gm-Message-State: AOPr4FVfnOkiFQ98n9caBB047iUEY0Zt9wYRxkv+7GlzvInJbxjq3XqZOMhjDSyapT3SVwlu+GgIQzYD4nDQOw== X-Received: by 10.194.14.130 with SMTP id p2mr38125618wjc.173.1461603092554; Mon, 25 Apr 2016 09:51:32 -0700 (PDT) From: Shyam Kaushik MIME-Version: 1.0 X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AdGfErcWWkk1SSaGRUCD3x4h7vmm3g== Date: Mon, 25 Apr 2016 22:21:30 +0530 Message-ID: <88e4a059c1428cb1f944b7e786cf8ed9@mail.gmail.com> Subject: Metadata corruption detected at xfs_attr3_leaf_write_verify+0xe5/0x100 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Metadata corruption detected at xfs_attr3_leaf_write_verify+0xe5/0x100 Cc: Alex Lyakas Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wm0-f41.google.com[74.125.82.41] X-Barracuda-Start-Time: 1461603093 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4569 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29046 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi Dave et al, We are periodically hitting the below metadata corruption with XFS over a raw disk running several file copies with xattr operations on kernel 3.18.19. Unmounting & running xfs_repair doesn't report any corruption. I see that this was last reported here http://oss.sgi.com/archives/xfs/2015-12/msg00224.html Unfortunately we dont have a reproducer, but this issue happens periodically. We can add more debug prints & allow this issue to happen again. Can you pls suggest any options to debug this further? Thanks Apr 20 21:58:03 node1 kernel: [16736.286370] XFS (dm-26): Metadata corruption detected at xfs_attr3_leaf_write_verify+0xe5/0x100 [xfs], block 0x19c5c728 Apr 20 21:58:03 node1 kernel: [16736.289084] XFS (dm-26): Unmount and run xfs_repair Apr 20 21:58:03 node1 kernel: [16736.290257] XFS (dm-26): First 64 bytes of corrupted metadata buffer: Apr 20 21:58:03 node1 kernel: [16736.291797] ffff880123668000: 00 00 00 00 00 00 00 00 fb ee 00 00 00 00 00 00 ................ Apr 20 21:58:03 node1 kernel: [16736.293823] ffff880123668010: 10 00 00 00 00 20 0f e0 00 00 00 00 00 00 00 00 ..... .......... Apr 20 21:58:03 node1 kernel: [16736.297504] ffff880123668020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Apr 20 21:58:03 node1 kernel: [16736.299343] ffff880123668030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Apr 20 21:58:03 node1 kernel: [16736.301465] XFS (dm-26): xfs_do_force_shutdown(0x8) called from line 1244 of file fs/xfs/xfs_buf.c. Return address = 0xffffffffc095cee0 Apr 20 21:58:03 node1 kernel: [16736.301469] ------------[ cut here ]------------ Apr 20 21:58:03 node1 kernel: [16736.301551] XFS(dm-26): SHUTDOWN!!! old_flags=0x0 new_flags=0x8 Apr 20 21:58:03 node1 kernel: [16736.301703] CPU: 1 PID: 7857 Comm: xfsaild/dm-26 Tainted: G OE 3.18.19 #1 Apr 20 21:58:03 node1 kernel: [16736.301705] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 Apr 20 21:58:03 node1 kernel: [16736.301707] 0000000000000009 ffff88020c5ffb38 ffffffff81710c85 0000000000000000 Apr 20 21:58:03 node1 kernel: [16736.301711] ffff88020c5ffb88 ffff88020c5ffb78 ffffffff81072df1 2e2e202030302030 Apr 20 21:58:03 node1 kernel: [16736.301715] 0000000000000000 0000000000000008 ffff88020c127000 0000000000000000 Apr 20 21:58:03 node1 kernel: [16736.301718] Call Trace: Apr 20 21:58:03 node1 kernel: [16736.301769] [] dump_stack+0x4e/0x71 Apr 20 21:58:03 node1 kernel: [16736.301780] [] warn_slowpath_common+0x81/0xa0 Apr 20 21:58:03 node1 kernel: [16736.301784] [] warn_slowpath_fmt+0x46/0x50 Apr 20 21:58:03 node1 kernel: [16736.301860] [] xfs_do_force_shutdown+0x33/0x170 [xfs] Apr 20 21:58:03 node1 kernel: [16736.301921] [] ? _xfs_buf_ioapply+0xa0/0x430 [xfs] Apr 20 21:58:03 node1 kernel: [16736.301951] [] ? __xfs_buf_delwri_submit+0x22b/0x290 [xfs] Apr 20 21:58:03 node1 kernel: [16736.302066] [] _xfs_buf_ioapply+0xa0/0x430 [xfs] Apr 20 21:58:03 node1 kernel: [16736.302137] [] ? wake_up_state+0x20/0x20 Apr 20 21:58:03 node1 kernel: [16736.302162] [] ? __xfs_buf_delwri_submit+0x22b/0x290 [xfs] Apr 20 21:58:03 node1 kernel: [16736.302183] [] xfs_buf_submit+0x68/0x210 [xfs] Apr 20 21:58:03 node1 kernel: [16736.302241] [] __xfs_buf_delwri_submit+0x22b/0x290 [xfs] Apr 20 21:58:03 node1 kernel: [16736.302267] [] ? xfs_buf_delwri_submit_nowait+0x20/0x30 [xfs] Apr 20 21:58:03 node1 kernel: [16736.302291] [] ? xfs_trans_ail_cursor_first+0x90/0x90 [xfs] Apr 20 21:58:03 node1 kernel: [16736.302308] [] xfs_buf_delwri_submit_nowait+0x20/0x30 [xfs] Apr 20 21:58:03 node1 kernel: [16736.302333] [] xfsaild+0x22b/0x630 [xfs] Apr 20 21:58:03 node1 kernel: [16736.302513] [] ? xfs_trans_ail_cursor_first+0x90/0x90 [xfs] Apr 20 21:58:03 node1 kernel: [16736.302518] [] kthread+0xc9/0xe0 Apr 20 21:58:03 node1 kernel: [16736.302522] [] ? kthread_create_on_node+0x180/0x180 Apr 20 21:58:03 node1 kernel: [16736.302530] [] ret_from_fork+0x58/0x90 Apr 20 21:58:03 node1 kernel: [16736.302549] [] ? kthread_create_on_node+0x180/0x180 Apr 20 21:58:03 node1 kernel: [16736.302551] ---[ end trace 0bb81b88fdd6a298 ]--- --Shyam From vishal.l.verma@intel.com Mon Apr 25 12:14:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D77F57CA0 for ; Mon, 25 Apr 2016 12:14:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id AA99E304032 for ; Mon, 25 Apr 2016 10:14:39 -0700 (PDT) X-ASG-Debug-ID: 1461604478-04cbb00fe820c450001-NocioJ Received: from mga04.intel.com ([192.55.52.120]) by cuda.sgi.com with ESMTP id UD9ghjMKB5OCqqr0 for ; Mon, 25 Apr 2016 10:14:38 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Effective-Source-IP: UNKNOWN[192.55.52.120] X-Barracuda-Apparent-Source-IP: 192.55.52.120 X-ASG-Whitelist: Client Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga104.fm.intel.com with ESMTP; 25 Apr 2016 10:14:38 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,533,1455004800"; d="scan'208";a="966146404" Received: from fmsmsx106.amr.corp.intel.com ([10.18.124.204]) by fmsmga002.fm.intel.com with ESMTP; 25 Apr 2016 10:14:38 -0700 Received: from fmsmsx113.amr.corp.intel.com ([169.254.13.211]) by FMSMSX106.amr.corp.intel.com ([169.254.5.219]) with mapi id 14.03.0248.002; Mon, 25 Apr 2016 10:14:37 -0700 From: "Verma, Vishal L" To: "hch@infradead.org" CC: "Wilcox, Matthew R" , "linux-kernel@vger.kernel.org" , "linux-block@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-nvdimm@ml01.01.org" , "jmoyer@redhat.com" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , "david@fromorbit.com" , "jack@suse.cz" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Thread-Topic: [PATCH v2 5/5] dax: handle media errors in dax_do_io X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Thread-Index: AQHRlzGOmdVyB28MyEyyQ/rUxU8Y+Z+T1f2AgASHRwCAAoNZAIAAkjsA Date: Mon, 25 Apr 2016 17:14:36 +0000 Message-ID: <1461604476.3106.12.camel@intel.com> References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> In-Reply-To: <20160425083114.GA27556@infradead.org> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.252.138.35] Content-Type: text/plain; charset="utf-8" Content-ID: <80F5C603E926CF47BF71F79A2B125709@intel.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-Barracuda-Connect: UNKNOWN[192.55.52.120] X-Barracuda-Start-Time: 1461604478 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2113 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 T24gTW9uLCAyMDE2LTA0LTI1IGF0IDAxOjMxIC0wNzAwLCBoY2hAaW5mcmFkZWFkLm9yZyB3cm90 ZToNCj4gT24gU2F0LCBBcHIgMjMsIDIwMTYgYXQgMDY6MDg6MzdQTSArMDAwMCwgVmVybWEsIFZp c2hhbCBMIHdyb3RlOg0KPiA+IA0KPiA+IGRpcmVjdF9JTyBtaWdodCBmYWlsIHdpdGggLUVJTlZB TCBkdWUgdG8gbWlzYWxpZ25tZW50LCBvciAtRU5PTUVNDQo+ID4gZHVlDQo+ID4gdG8gc29tZSBh bGxvY2F0aW9uIGZhaWxpbmcsIGFuZCBJIHRob3VnaHQgd2Ugc2hvdWxkIHJldHVybiB0aGUNCj4g PiBvcmlnaW5hbA0KPiA+IC1FSU8gaW4gc3VjaCBjYXNlcyBzbyB0aGF0IHRoZSBhcHBsaWNhdGlv biBkb2Vzbid0IGxvc2UgdGhlDQo+ID4gaW5mb3JtYXRpb24NCj4gPiB0aGF0IHRoZSBiYWQgYmxv Y2sgaXMgYWN0dWFsbHkgY2F1c2luZyB0aGUgZXJyb3IuDQo+IEVJTlZBTCBpcyBhIGNvbmNlcm4g aGVyZS7CoMKgTm90IGR1ZSB0byB0aGUgcmlnaHQgZXJyb3IgcmVwb3J0ZWQsIGJ1dA0KPiBiZWNh dXNlIGl0IG1lYW5zIHlvdXIgY3VycmVudCBzY2hlbWUgaXMgZnVuZGFtZW50YWxseSBicm9rZW4g LSB3ZQ0KPiBuZWVkIHRvIHN1cHBvcnQgSS9PIGF0IGFueSBhbGlnbm1lbnQgZm9yIERBWCBJL08s IGFuZCBub3QgZmFpbCBkdWUgdG8NCj4gYWxpZ25ibWVudCBjb25jZXJuZXMgZm9yIGEgaGlnaGx5 IHNwZWNpZmljIGRlZ3JhZGVkIGNhc2UuDQo+IA0KPiBJIHRoaW5rIHRoaXMgd2hvbGUgc2VyaWVz IG5lZWQgdG8gZ28gYmFjayB0byB0aGUgZHJhd2luZyBib2FyZCBhcyBJDQo+IGRvbid0IHRoaW5r IGl0IGNhbiBhY3R1YWxseSByZWx5IG9uIHVzaW5nIGRpcmVjdCBJL08gYXMgdGhlIEVJTw0KPiBm YWxsYmFjay4NCj4gDQpBZ3JlZWQgdGhhdCBEQVggSS9PIGNhbiBoYXBwZW4gd2l0aCBhbnkgc2l6 ZS9hbGlnbm1lbnQsIGJ1dCBob3cgZWxzZSBkbw0Kd2Ugc2VuZCBhbiBJTyB0aHJvdWdoIHRoZSBk cml2ZXIgd2l0aG91dCBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zPyBBbHNvLA0KdGhlIGdyYW51bGFy aXR5IGF0IHdoaWNoIHdlIHN0b3JlIGJhZGJsb2NrcyBpcyA1MTJCIHNlY3RvcnMsIHNvIGl0DQpz ZWVtcyBuYXR1cmFsIHRoYXQgdG8gY2xlYXIgc3VjaCBhIHNlY3RvciwgeW91J2QgZXhwZWN0IHRv IHNlbmQgYSB3cml0ZQ0KdG8gdGhlIHdob2xlIHNlY3Rvci4NCg0KVGhlIGV4cGVjdGVkIHVzYWdl IGZsb3cgaXM6DQoNCi0gQXBwbGljYXRpb24gaGl0cyBFSU8gZG9pbmcgZGF4X0lPIG9yIGxvYWQv c3RvcmUgaW8NCg0KLSBJdCBjaGVja3MgYmFkYmxvY2tzIGFuZCBkaXNjb3ZlcnMgaXQncyBmaWxl cyBoYXZlIGxvc3QgZGF0YQ0KDQotIEl0IHdyaXRlKClzIHRob3NlIHNlY3RvcnMgKHBvc3NpYmx5 IGNvbnZlcnRlZCB0byBmaWxlIG9mZnNldHMgdXNpbmcNCmZpZW1hcCkNCsKgIMKgICogVGhpcyB0 cmlnZ2VycyB0aGUgZmFsbGJhY2sgcGF0aCwgYnV0IGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBkb2lu Zw0KdGhpcyBsZXZlbCBvZiByZWNvdmVyeSwgaXQgd2lsbCBrbm93IHRoZSBzZWN0b3IgaXMgYmFk LCBhbmQgd3JpdGUgdGhlDQplbnRpcmUgc2VjdG9yDQoNCi0gT3IgaXQgcmVwbGFjZXMgdGhlIGVu dGlyZSBmaWxlIGZyb20gYmFja3VwIGFsc28gdXNpbmcgd3JpdGUoKSAobm90DQptbWFwK3N0b3Jl cykNCsKgIMKgICogVGhpcyBqdXN0IGZyZWVzIHRoZSBmcyBibG9jaywgYW5kIHRoZSBuZXh0IHRp bWUgdGhlIGJsb2NrIGlzDQpyZWFsbG9jYXRlZCBieSB0aGUgZnMsIGl0IHdpbGwgbGlrZWx5IGJl IHplcm9lZCBmaXJzdCwgYW5kIHRoYXQgd2lsbCBiZQ0KZG9uZSB0aHJvdWdoIHRoZSBkcml2ZXIg YW5kIHdpbGwgY2xlYXIgZXJyb3JzDQoNCg0KSSB0aGluayBpZiB3ZSB3YW50IHRvIGtlZXAgYWxs b3dpbmcgYXJiaXRyYXJ5IGFsaWdubWVudHMgZm9yIHRoZQ0KZGF4X2RvX2lvIHBhdGgsIHdlJ2Qg bmVlZDoNCjEuIFRvIHJlcHJlc2VudCBiYWRibG9ja3MgYXQgYSBmaW5lciBncmFudWxhcml0eSAo bGlrZWx5IGNhY2hlIGxpbmVzKQ0KMi4gVG8gYWxsb3cgdGhlIGRyaXZlciB0byBkbyBJTyB0byBh ICpibG9jayBkZXZpY2UqIGF0IHN1Yi1zZWN0b3INCmdyYW51bGFyaXR5DQoNCkNhbiB3ZSBkbyB0 aGF0Pw== From dan.j.williams@intel.com Mon Apr 25 12:21:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 26D1F7CA1 for ; Mon, 25 Apr 2016 12:21:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 835BAAC001 for ; Mon, 25 Apr 2016 10:21:47 -0700 (PDT) X-ASG-Debug-ID: 1461604905-04cb6c09a1237ee0001-NocioJ Received: from mail-oi0-f54.google.com (mail-oi0-f54.google.com [209.85.218.54]) by cuda.sgi.com with ESMTP id tOLrOUNvTFlUES3O (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 25 Apr 2016 10:21:45 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Effective-Source-IP: mail-oi0-f54.google.com[209.85.218.54] X-Barracuda-Apparent-Source-IP: 209.85.218.54 Received: by mail-oi0-f54.google.com with SMTP id r78so183828937oie.0 for ; Mon, 25 Apr 2016 10:21:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=9Dp/jWKV8y5d01Tgn0WU2jZRsKvzp4BbmZ/V8KbpJOs=; b=TsyA2HneCSc4SILbFjVGq8MbsgQlKJWxHBIOHwbRaOi9ndHso1X6fFgDeJeehBEHE5 ZGvzLWnwuqAfFwfrvnkIDsDR8tJWGFvaz4XzF1vggxFqmqMic8m6K9Y8FMHQ4uZ8FLRk YwwBkdnmfjmVAlOnNDAvTkXpzcoICJYyqG6DT0Ye8Wemula3siKKubZyChT03cHec49o ArKHsiD3ini/hLmJD5pmLP0Gto5CZ+J8o9DEDNISOZeTsYQy4nAw9Tr3E4nB59b8CsOO a6d4BGbsnd14lkOWdzdir+SPWz7qDx91XIxCXwmgt/GXPMCuxmmIYSfnsCVgdXgqBw5g 1vKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=9Dp/jWKV8y5d01Tgn0WU2jZRsKvzp4BbmZ/V8KbpJOs=; b=gg6cbP7INCjH6tSmgxvY7XtP5r2iKLGlcJRIwVgI/BoqIWpnDVmRT0UNUiQHcTForT hGMd3/PspzuV5GOU/KfXUm+mE2UdHCe6RzQ7wkjE9zaaH7C7R2z+AvmOZyHiFtXrMP2e Rr05rj2hyfu0pC43PdMlHrYOFn065KLRG/SkQXk49SZsT3cqhwHiPL6G8qGfvM4RDgSB roS4xslsT5PbSX4NZDM0Tq7iE0vCpRmRFz73OpiWPIibWwS9RVM6qa5AvotXEJ7mJZKR UfD9RuMLu1a3S5v6OfU1IPk1e65VUTZExQ2EjcL2RdiQYL5u6LPzclEpJRcoLGJ9OHB7 sUng== X-Gm-Message-State: AOPr4FUmqImSuU6ce31YE6+FBDiZZSOrxrM1/edKODfl1CBDo78IxvM0r2pAo+SNFNflFxtY/zjK80tS8FqjwubQ MIME-Version: 1.0 X-Received: by 10.202.227.85 with SMTP id a82mr15012708oih.49.1461604904854; Mon, 25 Apr 2016 10:21:44 -0700 (PDT) Received: by 10.157.38.39 with HTTP; Mon, 25 Apr 2016 10:21:44 -0700 (PDT) In-Reply-To: <1461604476.3106.12.camel@intel.com> References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> Date: Mon, 25 Apr 2016 10:21:44 -0700 Message-ID: Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io From: Dan Williams X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io To: "Verma, Vishal L" Cc: "hch@infradead.org" , "axboe@fb.com" , "jack@suse.cz" , "linux-nvdimm@ml01.01.org" , "david@fromorbit.com" , "linux-kernel@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-block@vger.kernel.org" , "linux-mm@kvack.org" , "Wilcox, Matthew R" , "linux-fsdevel@vger.kernel.org" , "akpm@linux-foundation.org" , "linux-ext4@vger.kernel.org" , "viro@zeniv.linux.org.uk" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oi0-f54.google.com[209.85.218.54] X-Barracuda-Start-Time: 1461604905 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2744 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29046 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain On Mon, Apr 25, 2016 at 10:14 AM, Verma, Vishal L wrote: > On Mon, 2016-04-25 at 01:31 -0700, hch@infradead.org wrote: >> On Sat, Apr 23, 2016 at 06:08:37PM +0000, Verma, Vishal L wrote: >> > >> > direct_IO might fail with -EINVAL due to misalignment, or -ENOMEM >> > due >> > to some allocation failing, and I thought we should return the >> > original >> > -EIO in such cases so that the application doesn't lose the >> > information >> > that the bad block is actually causing the error. >> EINVAL is a concern here. Not due to the right error reported, but >> because it means your current scheme is fundamentally broken - we >> need to support I/O at any alignment for DAX I/O, and not fail due to >> alignbment concernes for a highly specific degraded case. >> >> I think this whole series need to go back to the drawing board as I >> don't think it can actually rely on using direct I/O as the EIO >> fallback. >> > Agreed that DAX I/O can happen with any size/alignment, but how else do > we send an IO through the driver without alignment restrictions? Also, > the granularity at which we store badblocks is 512B sectors, so it > seems natural that to clear such a sector, you'd expect to send a write > to the whole sector. > > The expected usage flow is: > > - Application hits EIO doing dax_IO or load/store io > > - It checks badblocks and discovers it's files have lost data > > - It write()s those sectors (possibly converted to file offsets using > fiemap) > * This triggers the fallback path, but if the application is doing > this level of recovery, it will know the sector is bad, and write the > entire sector > > - Or it replaces the entire file from backup also using write() (not > mmap+stores) > * This just frees the fs block, and the next time the block is > reallocated by the fs, it will likely be zeroed first, and that will be > done through the driver and will clear errors > > > I think if we want to keep allowing arbitrary alignments for the > dax_do_io path, we'd need: > 1. To represent badblocks at a finer granularity (likely cache lines) > 2. To allow the driver to do IO to a *block device* at sub-sector > granularity 3. Arrange for O_DIRECT to bypass dax_do_io(), and leave the optimization only for the dax "buffered I/O" case. 4. Skip dax_do_io() entirely in the presence of errors I think 3 is the most closely aligned with the typical block device model. In the typical case a buffered write may fail due to a badblock read when filling the page cache, but an O_DIRECT write would bypass the page cache and potentially clear the error / cause the block to be reallocated internally to the drive. From dev@lynxeye.de Mon Apr 25 13:11:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 44A4E7CA0 for ; Mon, 25 Apr 2016 13:11:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 19D9B8F8033 for ; Mon, 25 Apr 2016 11:11:44 -0700 (PDT) X-ASG-Debug-ID: 1461607901-04cbb00fe720e3e0001-NocioJ Received: from lynxeye.de (ns.lynxeye.de [87.118.118.114]) by cuda.sgi.com with ESMTP id qot6rW0x7aRhTxNX for ; Mon, 25 Apr 2016 11:11:41 -0700 (PDT) X-Barracuda-Envelope-From: dev@lynxeye.de X-Barracuda-Effective-Source-IP: ns.lynxeye.de[87.118.118.114] X-Barracuda-Apparent-Source-IP: 87.118.118.114 Received: by lynxeye.de (Postfix, from userid 501) id 018C326C2002; Mon, 25 Apr 2016 20:11:40 +0200 (CEST) Received: from tellur.fritz.box (p57B5ED0C.dip0.t-ipconnect.de [87.181.237.12]) by lynxeye.de (Postfix) with ESMTPSA id 03ADF26C2001; Mon, 25 Apr 2016 20:11:38 +0200 (CEST) Message-ID: <1461607897.2364.27.camel@lynxeye.de> Subject: Re: [PATCH] xfs: idle aild if the AIL is pushed up to the target LSN From: Lucas Stach X-ASG-Orig-Subj: Re: [PATCH] xfs: idle aild if the AIL is pushed up to the target LSN To: Brian Foster Cc: Dave Chinner , linux-kernel@vger.kernel.org, xfs@oss.sgi.com Date: Mon, 25 Apr 2016 20:11:37 +0200 In-Reply-To: <20160425142444.GC33882@bfoster.bfoster> References: <1461570163-4083-1-git-send-email-dev@lynxeye.de> <20160425142444.GC33882@bfoster.bfoster> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.18.5.2 (3.18.5.2-1.fc23) Mime-Version: 1.0 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: ns.lynxeye.de[87.118.118.114] X-Barracuda-Start-Time: 1461607901 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5970 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29048 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Am Montag, den 25.04.2016, 10:24 -0400 schrieb Brian Foster: > On Mon, Apr 25, 2016 at 09:42:43AM +0200, Lucas Stach wrote: > > > > The current logic only idles aild if the AIL is empty, rescheduling > > the worker with a timeout of 50ms otherwise. If the target LSN > > isn't > > moved forward, the worker will not make any progress as it only > > pushes the AIL up to the target LSN, leading to the empty AIL > > condition to only be met after the log worker pushed the complete > > AIL. As the log worker runs on the scale of minutes, this leaves > > aild in the "no progress, 50ms timeout" state for extended periods > > of > > time, causing many unecessary wakeups. > > > Where do you get the "scale of minutes" from? I believe the default > log > worker interval is 30s, though it can be increased by the admin. > Uh, right. It's 30s, which is still a very long time when we consider that new items can be added to the AIL right after the log worker forced it out. > The other thing to note is that the AIL target is also driven by > demand > on log space. E.g., see xlog_grant_push_ail(), which executes when a > transaction attempts to reserve log space that isn't currently > available > in the log. > And that's where I think the problem stems from: the above function pushes the AIL only up to a target LSN to make room for the required log space. Only the log worker empties the AIL completely by issuing a xfs_ail_push_all_sync(). > That said, I'm not sure whether there's a notable benefit of idling > for > 50ms over just scheduling out when we've hit the target lsn. It seems > like that anybody who pushes the target forward again is going to > wake > up the thread anyways. On the other hand, if the fs is idle the > thread > will eventually schedule out indefinitely. Is this a problem? The patch tries to do exactly that: schedule out aild indefinitely when there is no more work to do as nobody is pushing the target LSN forward. On an idle FS this will stop aild when the target LSN is hit, will wake it up again as soon as the log worker requests the complete AIL to be pushed out, then it goes back to sleep indefinitely until the log fills up again. > Have you observed problematic > behavior due to the current heuristic? > Yes. On a FS with a low, but constant metadata workload I would expect aild to be scheduled only when the log space is running out and/or the log worker forces a sync. What currently happens is that aild stays in the "target LSN hit -> no work to do, schedule a timeout each 50ms" state for almost the entire runtime of the system. This causes about 20 CPU wakeups per second per mountpoint, most of which are completely wasted, as there is no work to do. My use case may be atypical, as I'm using XFS on a laptop, but in that case the XFS aild is actually causing most of the CPU wakeups in an otherwise idle system, which is clearly undesirable, as those wakeups aren't really needed as they don't lead to actual work getting done. > > > > Fix this by idling aild as soon as the AIL is pushed up to the > > target > > LSN. All code paths that move the target LSN forward already ensure > > that aild is woken up again when needed. > > > > Signed-off-by: Lucas Stach > > --- > > I'm pretty sure that the above deduction is correct, but as this my > > first real encounter with the XFS code base, someone with a bit > > more > > knowledge than me should give this some thought. > > --- > >  fs/xfs/xfs_trans_ail.c | 7 +++++-- > >  1 file changed, 5 insertions(+), 2 deletions(-) > > > > diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c > > index d6c9c3e..7eca852 100644 > > --- a/fs/xfs/xfs_trans_ail.c > > +++ b/fs/xfs/xfs_trans_ail.c > > @@ -495,6 +495,7 @@ xfsaild( > >  { > >   struct xfs_ail *ailp = data; > >   long tout = 0; /* milliseconds */ > > + struct xfs_log_item *lip; > >   > >   current->flags |= PF_MEMALLOC; > >   set_freezable(); > > @@ -508,7 +509,8 @@ xfsaild( > >   spin_lock(&ailp->xa_lock); > >   > >   /* > > -  * Idle if the AIL is empty and we are not racing > > with a target > > +  * Idle if the AIL is empty or pushed up to the > > requested > > +  * target LSN and we are not racing with a target > >    * update. We check the AIL after we set the task > > to a sleep > >    * state to guarantee that we either catch an > > xa_target update > >    * or that a wake_up resets the state to > > TASK_RUNNING. > > @@ -517,7 +519,8 @@ xfsaild( > >    * The barrier matches the xa_target update in > > xfs_ail_push(). > >    */ > >   smp_rmb(); > > - if (!xfs_ail_min(ailp) && > > + lip = xfs_ail_min(ailp); > > + if ((!lip || XFS_LSN_CMP(lip->li_lsn, ailp- > > >xa_target) >= 0) && > I think you'd want to use > 0, as == 0 suggests you have an item that > matches the target. > This check just mirrors what is done in xfsaild_push() to check if the target has been hit. Either both sites should be changed (which would assume the target LSN is inclusive and we should push the AIL to at least the target) or left as is (assuming the target LSN) is exclusive and we should push up to the target). > FWIW, another option might be to increase the timeout to something > much > larger than the current 50ms when we've hit the target. I don't think we want to extend the timeout if someone already pushed the target LSN forward, so we would need to mirror the check for the target LSN race here. I believe my change is less intrusive. Regards, Lucas > See towards the > end of xfsaild_push() where tout is determined based on the state of > the > push (and we already have logic to check against xa_target). > > Brian > > > > >       ailp->xa_target == ailp->xa_target_prev) { > >   spin_unlock(&ailp->xa_lock); > >   freezable_schedule(); From sandeen@sandeen.net Mon Apr 25 16:57:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5ACC27CA0 for ; Mon, 25 Apr 2016 16:57:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 22C83304032 for ; Mon, 25 Apr 2016 14:57:17 -0700 (PDT) X-ASG-Debug-ID: 1461621435-04cbb00fe921b020001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id huyey747fS6TO4e6 for ; Mon, 25 Apr 2016 14:57:15 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 677F5545 for ; Mon, 25 Apr 2016 16:57:12 -0500 (CDT) Subject: Re: Metadata corruption detected at xfs_attr3_leaf_write_verify+0xe5/0x100 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Metadata corruption detected at xfs_attr3_leaf_write_verify+0xe5/0x100 References: <88e4a059c1428cb1f944b7e786cf8ed9@mail.gmail.com> From: Eric Sandeen Message-ID: <571E92B7.3010608@sandeen.net> Date: Mon, 25 Apr 2016 16:57:11 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: <88e4a059c1428cb1f944b7e786cf8ed9@mail.gmail.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: 1461621435 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5323 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/25/16 11:51 AM, Shyam Kaushik wrote: > Hi Dave et al, > > We are periodically hitting the below metadata corruption with XFS over a > raw disk running several file copies with xattr operations on kernel > 3.18.19. Unmounting & running xfs_repair doesn't report any corruption. I > see that this was last reported here > http://oss.sgi.com/archives/xfs/2015-12/msg00224.html > > Unfortunately we dont have a reproducer, but this issue happens > periodically. We can add more debug prints & allow this issue to happen > again. Can you pls suggest any options to debug this further? Thanks Is this a non-crc filesystem? > Apr 20 21:58:03 node1 kernel: [16736.286370] XFS (dm-26): Metadata corruption detected at xfs_attr3_leaf_write_verify+0xe5/0x100 [xfs], block 0x19c5c728 > Apr 20 21:58:03 node1 kernel: [16736.289084] XFS (dm-26): Unmount and run xfs_repair > Apr 20 21:58:03 node1 kernel: [16736.290257] XFS (dm-26): First 64 bytes of corrupted metadata buffer: > Apr 20 21:58:03 node1 kernel: [16736.291797] ffff880123668000: 00 00 00 00 00 00 00 00 fb ee 00 00 00 00 00 00 ................ XFS_ATTR_LEAF_MAGIC is ok (if it's a non-crc filesystem) Looks the same as the other report, tripping on: if (ichdr.count == 0) return false; A reproducer would be super here. At least maybe a description of the workload that hits it? Count is manipulated in things like attr leaf compaction... Any other messages prior to this? How often do you hit it? You could also turn on xfs_attr_* tracepoints, maybe. -Eric > Apr 20 21:58:03 node1 kernel: [16736.293823] ffff880123668010: 10 00 00 00 00 20 0f e0 00 00 00 00 00 00 00 00 ..... .......... > Apr 20 21:58:03 node1 kernel: [16736.297504] ffff880123668020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ > Apr 20 21:58:03 node1 kernel: [16736.299343] ffff880123668030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ > Apr 20 21:58:03 node1 kernel: [16736.301465] XFS (dm-26): xfs_do_force_shutdown(0x8) called from line 1244 of file fs/xfs/xfs_buf.c. Return address = 0xffffffffc095cee0 > Apr 20 21:58:03 node1 kernel: [16736.301469] ------------[ cut here ]------------ > Apr 20 21:58:03 node1 kernel: [16736.301551] XFS(dm-26): SHUTDOWN!!! old_flags=0x0 new_flags=0x8 > Apr 20 21:58:03 node1 kernel: [16736.301703] CPU: 1 PID: 7857 Comm: xfsaild/dm-26 Tainted: G OE 3.18.19 #1 > Apr 20 21:58:03 node1 kernel: [16736.301705] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 > Apr 20 21:58:03 node1 kernel: [16736.301707] 0000000000000009 ffff88020c5ffb38 ffffffff81710c85 0000000000000000 > Apr 20 21:58:03 node1 kernel: [16736.301711] ffff88020c5ffb88 ffff88020c5ffb78 ffffffff81072df1 2e2e202030302030 > Apr 20 21:58:03 node1 kernel: [16736.301715] 0000000000000000 0000000000000008 ffff88020c127000 0000000000000000 > Apr 20 21:58:03 node1 kernel: [16736.301718] Call Trace: > Apr 20 21:58:03 node1 kernel: [16736.301769] [] dump_stack+0x4e/0x71 > Apr 20 21:58:03 node1 kernel: [16736.301780] [] warn_slowpath_common+0x81/0xa0 > Apr 20 21:58:03 node1 kernel: [16736.301784] [] warn_slowpath_fmt+0x46/0x50 > Apr 20 21:58:03 node1 kernel: [16736.301860] [] xfs_do_force_shutdown+0x33/0x170 [xfs] > Apr 20 21:58:03 node1 kernel: [16736.301921] [] ? _xfs_buf_ioapply+0xa0/0x430 [xfs] > Apr 20 21:58:03 node1 kernel: [16736.301951] [] ? __xfs_buf_delwri_submit+0x22b/0x290 [xfs] > Apr 20 21:58:03 node1 kernel: [16736.302066] [] _xfs_buf_ioapply+0xa0/0x430 [xfs] > Apr 20 21:58:03 node1 kernel: [16736.302137] [] ? wake_up_state+0x20/0x20 > Apr 20 21:58:03 node1 kernel: [16736.302162] [] ? __xfs_buf_delwri_submit+0x22b/0x290 [xfs] > Apr 20 21:58:03 node1 kernel: [16736.302183] [] xfs_buf_submit+0x68/0x210 [xfs] > Apr 20 21:58:03 node1 kernel: [16736.302241] [] __xfs_buf_delwri_submit+0x22b/0x290 [xfs] > Apr 20 21:58:03 node1 kernel: [16736.302267] [] ? xfs_buf_delwri_submit_nowait+0x20/0x30 [xfs] > Apr 20 21:58:03 node1 kernel: [16736.302291] [] ? xfs_trans_ail_cursor_first+0x90/0x90 [xfs] > Apr 20 21:58:03 node1 kernel: [16736.302308] [] xfs_buf_delwri_submit_nowait+0x20/0x30 [xfs] > Apr 20 21:58:03 node1 kernel: [16736.302333] [] xfsaild+0x22b/0x630 [xfs] > Apr 20 21:58:03 node1 kernel: [16736.302513] [] ? xfs_trans_ail_cursor_first+0x90/0x90 [xfs] > Apr 20 21:58:03 node1 kernel: [16736.302518] [] kthread+0xc9/0xe0 > Apr 20 21:58:03 node1 kernel: [16736.302522] [] ? kthread_create_on_node+0x180/0x180 > Apr 20 21:58:03 node1 kernel: [16736.302530] [] ret_from_fork+0x58/0x90 > Apr 20 21:58:03 node1 kernel: [16736.302549] [] ? kthread_create_on_node+0x180/0x180 > Apr 20 21:58:03 node1 kernel: [16736.302551] ---[ end trace > 0bb81b88fdd6a298 ]--- > > --Shyam > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From debbugs@buxtehude.debian.org Mon Apr 25 17:15:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 465C37CA0 for ; Mon, 25 Apr 2016 17:15:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id F20CF304032 for ; Mon, 25 Apr 2016 15:15:18 -0700 (PDT) X-ASG-Debug-ID: 1461622515-04bdf0358f226ff0001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [206.12.19.147]) by cuda.sgi.com with ESMTP id jU63neR0HxvgE3fZ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 25 Apr 2016 15:15:16 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Effective-Source-IP: buxtehude.debian.org[206.12.19.147] X-Barracuda-Apparent-Source-IP: 206.12.19.147 Received: from debbugs by buxtehude.debian.org with local (Exim 4.84_2) (envelope-from ) id 1auomd-0004rn-57; Mon, 25 Apr 2016 22:15:11 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#822369: xfsprogs: FTBFS: error: redefinition of 'struct fsxattr' Reply-To: Dave Chinner , 822369@bugs.debian.org X-ASG-Orig-Subj: Bug#822369: xfsprogs: FTBFS: error: redefinition of 'struct fsxattr' Resent-From: Dave Chinner Resent-To: debian-bugs-dist@lists.debian.org Resent-CC: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Mon, 25 Apr 2016 22:15:09 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 822369 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: X-Debian-PR-Source: xfsprogs Received: via spool by 822369-submit@bugs.debian.org id=B822369.146162246118545 (code B ref 822369); Mon, 25 Apr 2016 22:15:09 +0000 Received: (at 822369) by bugs.debian.org; 25 Apr 2016 22:14:21 +0000 Received: from ipmail06.adl2.internode.on.net ([150.101.137.129]) by buxtehude.debian.org with esmtp (Exim 4.84_2) (envelope-from ) id 1auolp-0004of-6n; Mon, 25 Apr 2016 22:14:21 +0000 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2B6BgAKlh5X/8/E03ZegziBUKFdhAkGjBSFaoQRhggEAgKBOk0BAQEBAQFmJ4RCAQEEOhwjEAgDDgoJJQ8FJQMhARKIKbwxhnABAQEBBgEBAQEcGYVAhROHaoIrAQSHcYcUiQqODI8ajy9ig30qMIkAAQEB Received: from ppp118-211-196-207.lns20.syd4.internode.on.net (HELO dastard) ([118.211.196.207]) by ipmail06.adl2.internode.on.net with ESMTP; 26 Apr 2016 07:44:06 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1auolX-00071U-36; Tue, 26 Apr 2016 08:14:03 +1000 Date: Tue, 26 Apr 2016 08:14:03 +1000 From: Dave Chinner To: Martin Michlmayr , 822369@bugs.debian.org Cc: submit@bugs.debian.org Message-ID: <20160425221403.GB18496@dastard> References: <20160423205226.67773120316@dl580gen9-02.hlinux> <20160423210831.GA19384@jirafa.cyrius.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160423210831.GA19384@jirafa.cyrius.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-CrossAssassin-Score: 2 X-Barracuda-Connect: buxtehude.debian.org[206.12.19.147] X-Barracuda-Start-Time: 1461622516 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 964 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sat, Apr 23, 2016 at 02:08:31PM -0700, Martin Michlmayr wrote: > Package: xfsprogs > Version: 4.3.0+nmu1 > Severity: serious > > This package fails to build in unstable: > > > sbuild (Debian sbuild) 0.68.0 (15 Jan 2016) on dl580gen9-02.hlinux > ... > > [CC] fiemap.o > > In file included from ../include/xfs.h:58:0, > > from io.h:19, > > from fiemap.c:24: > > ../include/xfs/xfs_fs.h:42:8: error: redefinition of 'struct fsxattr' > > struct fsxattr { > > ^ > > In file included from fiemap.c:22:0: > > /usr/include/linux/fs.h:155:8: note: originally defined here > > struct fsxattr { > > ^ > > ../include/buildrules:59: recipe for target 'fiemap.o' failed > > make[3]: *** [fiemap.o] Error 1 > > include/buildrules:35: recipe for target 'io' failed Kernel uapi change in 4.5 caused it. Upgrade to xfsprogs 4.5.0. Cheers, Dave. -- Dave Chinner david@fromorbit.com From debbugs@buxtehude.debian.org Mon Apr 25 17:18:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=unavailable version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4C7277CA0 for ; Mon, 25 Apr 2016 17:18:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 007AF304032 for ; Mon, 25 Apr 2016 15:18:12 -0700 (PDT) X-ASG-Debug-ID: 1461622688-04bdf03596227150001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [206.12.19.147]) by cuda.sgi.com with ESMTP id YneaJ1jnem3km19r (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 25 Apr 2016 15:18:09 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Effective-Source-IP: buxtehude.debian.org[206.12.19.147] X-Barracuda-Apparent-Source-IP: 206.12.19.147 Received: from debbugs by buxtehude.debian.org with local (Exim 4.84_2) (envelope-from ) id 1auopQ-00057Q-8Y; Mon, 25 Apr 2016 22:18:05 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#822369: xfsprogs: FTBFS: error: redefinition of 'struct fsxattr' Reply-To: Dave Chinner , 822369@bugs.debian.org X-ASG-Orig-Subj: Bug#822369: xfsprogs: FTBFS: error: redefinition of 'struct fsxattr' Resent-From: Dave Chinner Resent-To: debian-bugs-dist@lists.debian.org Resent-CC: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Mon, 25 Apr 2016 22:18:02 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 822369 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: X-Debian-PR-Source: xfsprogs Received: via spool by submit@bugs.debian.org id=B.146162246118536 (code B); Mon, 25 Apr 2016 22:18:02 +0000 Received: (at submit) by bugs.debian.org; 25 Apr 2016 22:14:21 +0000 Received: from ipmail06.adl2.internode.on.net ([150.101.137.129]) by buxtehude.debian.org with esmtp (Exim 4.84_2) (envelope-from ) id 1auolp-0004of-6n; Mon, 25 Apr 2016 22:14:21 +0000 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2B6BgAKlh5X/8/E03ZegziBUKFdhAkGjBSFaoQRhggEAgKBOk0BAQEBAQFmJ4RCAQEEOhwjEAgDDgoJJQ8FJQMhARKIKbwxhnABAQEBBgEBAQEcGYVAhROHaoIrAQSHcYcUiQqODI8ajy9ig30qMIkAAQEB Received: from ppp118-211-196-207.lns20.syd4.internode.on.net (HELO dastard) ([118.211.196.207]) by ipmail06.adl2.internode.on.net with ESMTP; 26 Apr 2016 07:44:06 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1auolX-00071U-36; Tue, 26 Apr 2016 08:14:03 +1000 Date: Tue, 26 Apr 2016 08:14:03 +1000 From: Dave Chinner To: Martin Michlmayr , 822369@bugs.debian.org Cc: submit@bugs.debian.org Message-ID: <20160425221403.GB18496@dastard> References: <20160423205226.67773120316@dl580gen9-02.hlinux> <20160423210831.GA19384@jirafa.cyrius.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160423210831.GA19384@jirafa.cyrius.com> User-Agent: Mutt/1.5.21 (2010-09-15) Delivered-To: submit@bugs.debian.org X-Barracuda-Connect: buxtehude.debian.org[206.12.19.147] X-Barracuda-Start-Time: 1461622689 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 964 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sat, Apr 23, 2016 at 02:08:31PM -0700, Martin Michlmayr wrote: > Package: xfsprogs > Version: 4.3.0+nmu1 > Severity: serious > > This package fails to build in unstable: > > > sbuild (Debian sbuild) 0.68.0 (15 Jan 2016) on dl580gen9-02.hlinux > ... > > [CC] fiemap.o > > In file included from ../include/xfs.h:58:0, > > from io.h:19, > > from fiemap.c:24: > > ../include/xfs/xfs_fs.h:42:8: error: redefinition of 'struct fsxattr' > > struct fsxattr { > > ^ > > In file included from fiemap.c:22:0: > > /usr/include/linux/fs.h:155:8: note: originally defined here > > struct fsxattr { > > ^ > > ../include/buildrules:59: recipe for target 'fiemap.o' failed > > make[3]: *** [fiemap.o] Error 1 > > include/buildrules:35: recipe for target 'io' failed Kernel uapi change in 4.5 caused it. Upgrade to xfsprogs 4.5.0. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Apr 25 18:09:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3D7607CA0 for ; Mon, 25 Apr 2016 18:09:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 03D4E304039 for ; Mon, 25 Apr 2016 16:09:25 -0700 (PDT) X-ASG-Debug-ID: 1461625758-04cbb00fe921d680001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 3KquPuu23frOQb7N for ; Mon, 25 Apr 2016 16:09:19 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CBBgAIox5XVs/E03ZegziBUKVoBowUhWqEEYR+gQoEAgKBOk0BAQEBAQEHAYEFhEEBAQEDATocIwULCAMOCgklDwUlAwcaE4giB8MrAQEBAQYBAQEBHBmFQIUTh2qCKwWYD44MjxqPL4JnG4FdKjCJAAEBAQ Received: from ppp118-211-196-207.lns20.syd4.internode.on.net (HELO dastard) ([118.211.196.207]) by ipmail06.adl2.internode.on.net with ESMTP; 26 Apr 2016 08:38:35 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aupcH-00077C-HQ; Tue, 26 Apr 2016 09:08:33 +1000 Date: Tue, 26 Apr 2016 09:08:33 +1000 From: Dave Chinner To: Lucas Stach Cc: Brian Foster , linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: idle aild if the AIL is pushed up to the target LSN Message-ID: <20160425230833.GC18496@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: idle aild if the AIL is pushed up to the target LSN References: <1461570163-4083-1-git-send-email-dev@lynxeye.de> <20160425142444.GC33882@bfoster.bfoster> <1461607897.2364.27.camel@lynxeye.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1461607897.2364.27.camel@lynxeye.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1461625759 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3599 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29054 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Apr 25, 2016 at 08:11:37PM +0200, Lucas Stach wrote: > Am Montag, den 25.04.2016, 10:24 -0400 schrieb Brian Foster: > > On Mon, Apr 25, 2016 at 09:42:43AM +0200, Lucas Stach wrote: > > > > > > The current logic only idles aild if the AIL is empty, rescheduling > > > the worker with a timeout of 50ms otherwise. If the target LSN > > > isn't > > > moved forward, the worker will not make any progress as it only > > > pushes the AIL up to the target LSN, leading to the empty AIL > > > condition to only be met after the log worker pushed the complete > > > AIL. As the log worker runs on the scale of minutes, this leaves > > > aild in the "no progress, 50ms timeout" state for extended periods > > > of > > > time, causing many unecessary wakeups. > > > > > Where do you get the "scale of minutes" from? I believe the default > > log > > worker interval is 30s, though it can be increased by the admin. > > > Uh, right. It's 30s, which is still a very long time when we consider > that new items can be added to the AIL right after the log worker > forced it out. Standard writeback timeout for data and metadata. > > The other thing to note is that the AIL target is also driven by > > demand > > on log space. E.g., see xlog_grant_push_ail(), which executes when a > > transaction attempts to reserve log space that isn't currently > > available > > in the log. > > > And that's where I think the problem stems from: the above function > pushes the AIL only up to a target LSN to make room for the required > log space. Only the log worker empties the AIL completely by issuing a > xfs_ail_push_all_sync(). xfs_ail_push_all(), actually, and the log worker runs every 30s by default. i.e. we move the target to the end to the AIL to try to empty it completely every 30s. > > That said, I'm not sure whether there's a notable benefit of idling > > for > > 50ms over just scheduling out when we've hit the target lsn. It seems > > like that anybody who pushes the target forward again is going to > > wake > > up the thread anyways. On the other hand, if the fs is idle the > > thread > > will eventually schedule out indefinitely. > > Is this a problem? The patch tries to do exactly that: schedule out > aild indefinitely when there is no more work to do as nobody is pushing > the target LSN forward. If the filesystem is slowly being dirtied, then the aild should't really idle at all.i Keep in mind that the xfsaild has multiple functions, one of which is a watchdog that catches log space stalls that would otherwise hang the filesystem. Every time we've removed the watchdog function (i.e. agressively idle the aild) we've had users report random, unreproducable hangs/stalls that have gone away when the watchdog function (i.e. don't idle until the log is covered and completely idle) was re-instated... > On an idle FS this will stop aild when the target LSN is hit, will wake > it up again as soon as the log worker requests the complete AIL to be > pushed out, then it goes back to sleep indefinitely until the log fills > up again. The behaviour suggests that your filesystem is not idle. The filesystem takes up to 90s to be marked idle (log needs to be covered, state machine takes 3x30s cycles to transition to idle "covered" state. If you want the filesytsem to idle quickly, then run the log worker more frequently to get the target updated more quickly. This will also speed up the log covering state machine as well. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Apr 25 18:25:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 791717CA0 for ; Mon, 25 Apr 2016 18:25:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 449CA304032 for ; Mon, 25 Apr 2016 16:25:57 -0700 (PDT) X-ASG-Debug-ID: 1461626754-04cb6c09a324fa50001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id GCPXk1V5E78vMewD for ; Mon, 25 Apr 2016 16:25:54 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2B/BgCqph5XVs/E03ZegziBUKVoBowUhWqEEYYIBAICgTtNAQEBAQEBBwGBBYRCAQEEMgEjIxAIAxIGCSUPBSUDBwYUE4gpwzYBAQEHAgEdGYVAhROEBgiDXIIrBZgPjgyPGkWOaoRfKjCJAAEBAQ Received: from ppp118-211-196-207.lns20.syd4.internode.on.net (HELO dastard) ([118.211.196.207]) by ipmail06.adl2.internode.on.net with ESMTP; 26 Apr 2016 08:55:52 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aupt2-00079f-3Z; Tue, 26 Apr 2016 09:25:52 +1000 Date: Tue, 26 Apr 2016 09:25:52 +1000 From: Dave Chinner To: "Verma, Vishal L" Cc: "hch@infradead.org" , "Wilcox, Matthew R" , "linux-kernel@vger.kernel.org" , "linux-block@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-nvdimm@ml01.01.org" , "jmoyer@redhat.com" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , "jack@suse.cz" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Message-ID: <20160425232552.GD18496@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1461604476.3106.12.camel@intel.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: 1461626754 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3002 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29054 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Apr 25, 2016 at 05:14:36PM +0000, Verma, Vishal L wrote: > On Mon, 2016-04-25 at 01:31 -0700, hch@infradead.org wrote: > > On Sat, Apr 23, 2016 at 06:08:37PM +0000, Verma, Vishal L wrote: > > > > > > direct_IO might fail with -EINVAL due to misalignment, or -ENOMEM > > > due > > > to some allocation failing, and I thought we should return the > > > original > > > -EIO in such cases so that the application doesn't lose the > > > information > > > that the bad block is actually causing the error. > > EINVAL is a concern here.  Not due to the right error reported, but > > because it means your current scheme is fundamentally broken - we > > need to support I/O at any alignment for DAX I/O, and not fail due to > > alignbment concernes for a highly specific degraded case. > > > > I think this whole series need to go back to the drawing board as I > > don't think it can actually rely on using direct I/O as the EIO > > fallback. > > > Agreed that DAX I/O can happen with any size/alignment, but how else do > we send an IO through the driver without alignment restrictions? Also, > the granularity at which we store badblocks is 512B sectors, so it > seems natural that to clear such a sector, you'd expect to send a write > to the whole sector. > > The expected usage flow is: > > - Application hits EIO doing dax_IO or load/store io > > - It checks badblocks and discovers it's files have lost data Lots of hand-waving here. How does the application map a bad "sector" to a file without scanning the entire filesystem to find the owner of the bad sector? > - It write()s those sectors (possibly converted to file offsets using > fiemap) >     * This triggers the fallback path, but if the application is doing > this level of recovery, it will know the sector is bad, and write the > entire sector Where does the application find the data that was lost to be able to rewrite it? > - Or it replaces the entire file from backup also using write() (not > mmap+stores) >     * This just frees the fs block, and the next time the block is > reallocated by the fs, it will likely be zeroed first, and that will be > done through the driver and will clear errors There's an implicit assumption that applications will keep redundant copies of their data at the /application layer/ and be able to automatically repair it? And then there's the implicit assumption that it will unlink and free the entire file before writing a new copy, and that then assumes the the filesystem will zero blocks if they get reused to clear errors on that LBA sector mapping before they are accessible again to userspace.. It seems to me that there are a number of assumptions being made across multiple layers here. Maybe I've missed something - can you point me to the design/architecture description so I can see how "app does data recovery itself" dance is supposed to work? Cheers, Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Mon Apr 25 18:35:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 71CC77CA0 for ; Mon, 25 Apr 2016 18:35:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 42910304039 for ; Mon, 25 Apr 2016 16:35:12 -0700 (PDT) X-ASG-Debug-ID: 1461627309-04cbb00fe721e2a0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id v9cgIqGwUS6S7OVH (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 25 Apr 2016 16:35:10 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] 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 u3PNYZv0018461 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 25 Apr 2016 23:34:36 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u3PNYYi2009070 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 25 Apr 2016 23:34:35 GMT Received: from abhmp0010.oracle.com (abhmp0010.oracle.com [141.146.116.16]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u3PNYWkA019511; Mon, 25 Apr 2016 23:34:33 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 25 Apr 2016 16:34:32 -0700 Date: Mon, 25 Apr 2016 16:34:29 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: "Verma, Vishal L" , "linux-block@vger.kernel.org" , "jack@suse.cz" , "axboe@fb.com" , "linux-nvdimm@ml01.01.org" , "linux-kernel@vger.kernel.org" , "xfs@oss.sgi.com" , "hch@infradead.org" , "linux-mm@kvack.org" , "jmoyer@redhat.com" , "Wilcox, Matthew R" , "linux-fsdevel@vger.kernel.org" , "akpm@linux-foundation.org" , "linux-ext4@vger.kernel.org" , "viro@zeniv.linux.org.uk" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Message-ID: <20160425233429.GH18517@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> <20160425232552.GD18496@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20160425232552.GD18496@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1461627310 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4094 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29054 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Apr 26, 2016 at 09:25:52AM +1000, Dave Chinner wrote: > On Mon, Apr 25, 2016 at 05:14:36PM +0000, Verma, Vishal L wrote: > > On Mon, 2016-04-25 at 01:31 -0700, hch@infradead.org wrote: > > > On Sat, Apr 23, 2016 at 06:08:37PM +0000, Verma, Vishal L wrote: > > > > > > > > direct_IO might fail with -EINVAL due to misalignment, or -ENOMEM > > > > due > > > > to some allocation failing, and I thought we should return the > > > > original > > > > -EIO in such cases so that the application doesn't lose the > > > > information > > > > that the bad block is actually causing the error. > > > EINVAL is a concern here.  Not due to the right error reported, but > > > because it means your current scheme is fundamentally broken - we > > > need to support I/O at any alignment for DAX I/O, and not fail due to > > > alignbment concernes for a highly specific degraded case. > > > > > > I think this whole series need to go back to the drawing board as I > > > don't think it can actually rely on using direct I/O as the EIO > > > fallback. > > > > > Agreed that DAX I/O can happen with any size/alignment, but how else do > > we send an IO through the driver without alignment restrictions? Also, > > the granularity at which we store badblocks is 512B sectors, so it > > seems natural that to clear such a sector, you'd expect to send a write > > to the whole sector. > > > > The expected usage flow is: > > > > - Application hits EIO doing dax_IO or load/store io > > > > - It checks badblocks and discovers it's files have lost data > > Lots of hand-waving here. How does the application map a bad > "sector" to a file without scanning the entire filesystem to find > the owner of the bad sector? FWIW there was some discussion @ LSF about using (XFS) rmap to figure out which parts of a file (on XFS) have gone bad. Chris Mason said that he'd like to collaborate on having a common getfsmap ioctl between btrfs and XFS since they have a backref index that could be hooked up to it for them. Obviously the app still has to coordinate stopping file IO and calling GETFSMAP since the fs won't do that on its own. There's also the question of how to handle LBA translation if there's other stuff like dm in the way. I don't think device-mapper or md do reverse mapping, so things get murky from here. Guess I should get on pushing out a getfsmap patch for review. :) --D (/me doesn't have answers to any of your other questions.) > > - It write()s those sectors (possibly converted to file offsets using > > fiemap) > >     * This triggers the fallback path, but if the application is doing > > this level of recovery, it will know the sector is bad, and write the > > entire sector > > Where does the application find the data that was lost to be able to > rewrite it? > > > - Or it replaces the entire file from backup also using write() (not > > mmap+stores) > >     * This just frees the fs block, and the next time the block is > > reallocated by the fs, it will likely be zeroed first, and that will be > > done through the driver and will clear errors > > There's an implicit assumption that applications will keep redundant > copies of their data at the /application layer/ and be able to > automatically repair it? And then there's the implicit assumption > that it will unlink and free the entire file before writing a new > copy, and that then assumes the the filesystem will zero blocks if > they get reused to clear errors on that LBA sector mapping before > they are accessible again to userspace.. > > It seems to me that there are a number of assumptions being made > across multiple layers here. Maybe I've missed something - can you > point me to the design/architecture description so I can see how > "app does data recovery itself" dance is supposed to work? > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From dan.j.williams@intel.com Mon Apr 25 18:43:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2ABC27CA1 for ; Mon, 25 Apr 2016 18:43:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 989D3AC001 for ; Mon, 25 Apr 2016 16:43:17 -0700 (PDT) X-ASG-Debug-ID: 1461627794-04cb6c09a2250020001-NocioJ Received: from mail-oi0-f47.google.com (mail-oi0-f47.google.com [209.85.218.47]) by cuda.sgi.com with ESMTP id dM1kpNx53dqXynCC (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 25 Apr 2016 16:43:14 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Effective-Source-IP: mail-oi0-f47.google.com[209.85.218.47] X-Barracuda-Apparent-Source-IP: 209.85.218.47 Received: by mail-oi0-f47.google.com with SMTP id x201so193609347oif.3 for ; Mon, 25 Apr 2016 16:43:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=fM037LjD1MJIaVncOPQycbJTPt1rQZ3UlVj/vpbwc+E=; b=dQbntW6tFLZQZOhgBVhq7orpjTq+0YT5PfgDt88N9DN/Bd2jnQk4c2mz7GYw227bF8 25eLg2REPP0FrnjZFil+O67gerPpVWJS+f89AuOMKBhTcuotY5g4j0dFUVAIKNfhTfHK aMBWcE/bwgYr/yAOR74OxLOAUXHFV/e9FjDm1986/MJJbgSxKiYhiatpTaBjPNwYTG6/ xbvtYBeuzVaJNZTk9TAWpU9oBeVCnNuqwCmXFIYDWWUZiZmOyZzX2NkxD6FitAJhbpVY ob0rC0XJ+QqvnFEWECd3hEw4hngvhuj+AmBP3dDg0JcJh61Duxtxf1NmFJ16c2wdf3SA Gkow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=fM037LjD1MJIaVncOPQycbJTPt1rQZ3UlVj/vpbwc+E=; b=XSxDettbpVPNS0kS64SNU+zZsjhgvY5wKAx6bu6hhUYCgq6ELvEk2Wbn8uU90/Kq3v CPHBIEZLPp3Nyb3KN+ZlPPSgQdJw8VwIAhLO7RBV9OeFaCa7b7H7dNLc8Q/F73/H+ek1 HuGwrRH6w9sVGB1Bs/dKO6IhDaVsHakG3/gkDJRwlt05LI/jhwbUyxngvpebQ/7H1UfY XWIppTOI0vNovQqFN99SG5egD3exrjF1z9dVQ0MN2gB6i4zK62NuCNo/1IrcMbXavaRX hGLO6cpJ5ny4q36YFMd4b/QyIushD+ITwWUZrzQazg5A9g3sVfbGv2kBBPGRkE36JEuy WRmQ== X-Gm-Message-State: AOPr4FV+CfURYE+KmEfFJGnkEB7Dx7a+tWdP0JouVLDN27bHqL5LPYaQ2Ac5fWUAjXVYeLw+XO0g7ot6f2ITTJU9 MIME-Version: 1.0 X-Received: by 10.157.44.73 with SMTP id f67mr14754222otb.155.1461627794267; Mon, 25 Apr 2016 16:43:14 -0700 (PDT) Received: by 10.157.38.39 with HTTP; Mon, 25 Apr 2016 16:43:14 -0700 (PDT) In-Reply-To: <20160425232552.GD18496@dastard> References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> <20160425232552.GD18496@dastard> Date: Mon, 25 Apr 2016 16:43:14 -0700 Message-ID: Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io From: Dan Williams X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io To: Dave Chinner Cc: "Verma, Vishal L" , "linux-block@vger.kernel.org" , "jack@suse.cz" , "axboe@fb.com" , "linux-nvdimm@ml01.01.org" , "linux-kernel@vger.kernel.org" , "xfs@oss.sgi.com" , "hch@infradead.org" , "linux-mm@kvack.org" , "Wilcox, Matthew R" , "linux-fsdevel@vger.kernel.org" , "akpm@linux-foundation.org" , "linux-ext4@vger.kernel.org" , "viro@zeniv.linux.org.uk" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oi0-f47.google.com[209.85.218.47] X-Barracuda-Start-Time: 1461627794 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3489 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29054 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Mon, Apr 25, 2016 at 4:25 PM, Dave Chinner wrote: > On Mon, Apr 25, 2016 at 05:14:36PM +0000, Verma, Vishal L wrote: >> On Mon, 2016-04-25 at 01:31 -0700, hch@infradead.org wrote: >> > On Sat, Apr 23, 2016 at 06:08:37PM +0000, Verma, Vishal L wrote: >> > > >> > > direct_IO might fail with -EINVAL due to misalignment, or -ENOMEM >> > > due >> > > to some allocation failing, and I thought we should return the >> > > original >> > > -EIO in such cases so that the application doesn't lose the >> > > information >> > > that the bad block is actually causing the error. >> > EINVAL is a concern here. Not due to the right error reported, but >> > because it means your current scheme is fundamentally broken - we >> > need to support I/O at any alignment for DAX I/O, and not fail due to >> > alignbment concernes for a highly specific degraded case. >> > >> > I think this whole series need to go back to the drawing board as I >> > don't think it can actually rely on using direct I/O as the EIO >> > fallback. >> > >> Agreed that DAX I/O can happen with any size/alignment, but how else do >> we send an IO through the driver without alignment restrictions? Also, >> the granularity at which we store badblocks is 512B sectors, so it >> seems natural that to clear such a sector, you'd expect to send a write >> to the whole sector. >> >> The expected usage flow is: >> >> - Application hits EIO doing dax_IO or load/store io >> >> - It checks badblocks and discovers it's files have lost data > > Lots of hand-waving here. How does the application map a bad > "sector" to a file without scanning the entire filesystem to find > the owner of the bad sector? > >> - It write()s those sectors (possibly converted to file offsets using >> fiemap) >> * This triggers the fallback path, but if the application is doing >> this level of recovery, it will know the sector is bad, and write the >> entire sector > > Where does the application find the data that was lost to be able to > rewrite it? > >> - Or it replaces the entire file from backup also using write() (not >> mmap+stores) >> * This just frees the fs block, and the next time the block is >> reallocated by the fs, it will likely be zeroed first, and that will be >> done through the driver and will clear errors > > There's an implicit assumption that applications will keep redundant > copies of their data at the /application layer/ and be able to > automatically repair it? And then there's the implicit assumption > that it will unlink and free the entire file before writing a new > copy, and that then assumes the the filesystem will zero blocks if > they get reused to clear errors on that LBA sector mapping before > they are accessible again to userspace.. > > It seems to me that there are a number of assumptions being made > across multiple layers here. Maybe I've missed something - can you > point me to the design/architecture description so I can see how > "app does data recovery itself" dance is supposed to work? > Maybe I missed something, but all these assumptions are already present for typical block devices, i.e. sectors may go bad and a write may make the sector usable again. This patch series is extending that out to the DAX-mmap case, but it's the same principle of "write to clear error" that we live with in the block-I/O path. What clarification are you looking for beyond that point? From vishal.l.verma@intel.com Mon Apr 25 18:53:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7140D7CA0 for ; Mon, 25 Apr 2016 18:53:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 410D8304032 for ; Mon, 25 Apr 2016 16:53:16 -0700 (PDT) X-ASG-Debug-ID: 1461628395-04cb6c09a22506b0001-NocioJ Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by cuda.sgi.com with ESMTP id x9QTK3trjaDBSGdJ for ; Mon, 25 Apr 2016 16:53:15 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Effective-Source-IP: mga09.intel.com[134.134.136.24] X-Barracuda-Apparent-Source-IP: 134.134.136.24 X-ASG-Whitelist: Client Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga102.jf.intel.com with ESMTP; 25 Apr 2016 16:53:14 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,534,1455004800"; d="scan'208";a="952792236" Received: from fmsmsx106.amr.corp.intel.com ([10.18.124.204]) by fmsmga001.fm.intel.com with ESMTP; 25 Apr 2016 16:53:14 -0700 Received: from fmsmsx111.amr.corp.intel.com (10.18.116.5) by FMSMSX106.amr.corp.intel.com (10.18.124.204) with Microsoft SMTP Server (TLS) id 14.3.248.2; Mon, 25 Apr 2016 16:53:14 -0700 Received: from fmsmsx113.amr.corp.intel.com ([169.254.13.211]) by fmsmsx111.amr.corp.intel.com ([10.18.116.5]) with mapi id 14.03.0248.002; Mon, 25 Apr 2016 16:53:13 -0700 From: "Verma, Vishal L" To: "david@fromorbit.com" CC: "linux-kernel@vger.kernel.org" , "linux-block@vger.kernel.org" , "hch@infradead.org" , "xfs@oss.sgi.com" , "linux-nvdimm@ml01.01.org" , "jmoyer@redhat.com" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" , "jack@suse.cz" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Thread-Topic: [PATCH v2 5/5] dax: handle media errors in dax_do_io X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Thread-Index: AQHRlzGOmdVyB28MyEyyQ/rUxU8Y+Z+T1f2AgASHRwCAAoNZAIAAkjsAgABnuwCAAAeVgA== Date: Mon, 25 Apr 2016 23:53:13 +0000 Message-ID: <1461628381.1421.24.camel@intel.com> References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> <20160425232552.GD18496@dastard> In-Reply-To: <20160425232552.GD18496@dastard> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.232.112.171] Content-Type: text/plain; charset="utf-8" Content-ID: <7502BB94DF2B3F4BBDDD7D995E54F60F@intel.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-Barracuda-Connect: mga09.intel.com[134.134.136.24] X-Barracuda-Start-Time: 1461628395 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3894 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 T24gVHVlLCAyMDE2LTA0LTI2IGF0IDA5OjI1ICsxMDAwLCBEYXZlIENoaW5uZXIgd3JvdGU6DQo+ wqANCjw+DQoNCj4gPiANCj4gPiAtIEl0IGNoZWNrcyBiYWRibG9ja3MgYW5kIGRpc2NvdmVycyBp dCdzIGZpbGVzIGhhdmUgbG9zdCBkYXRhDQo+IExvdHMgb2YgaGFuZC13YXZpbmcgaGVyZS4gSG93 IGRvZXMgdGhlIGFwcGxpY2F0aW9uIG1hcCBhIGJhZA0KPiAic2VjdG9yIiB0byBhIGZpbGUgd2l0 aG91dCBzY2FubmluZyB0aGUgZW50aXJlIGZpbGVzeXN0ZW0gdG8gZmluZA0KPiB0aGUgb3duZXIg b2YgdGhlIGJhZCBzZWN0b3I/DQoNClllcyB0aGlzIHdhcyBoYW5kLXdhdmV5LCBidXQgd2UgdGFs a2VkIGFib3V0IHRoaXMgYSBiaXQgYXQgTFNGLi4NClRoZSBpZGVhIGlzIHRoYXQgYSBwZXItYmxv Y2stZGV2aWNlIGJhZGJsb2NrcyBsaXN0IGlzIGF2YWlsYWJsZSBhdA0KL3N5cy9ibG9jay88cG1l bVg+L2JhZGJsb2Nrcy4gVGhlIGFwcGxpY2F0aW9uIChvciBhIHN1aXRhYmxlIHlldC10by1iZS0N CndyaXR0ZW4gbGlicmFyeSBmdW5jdGlvbikgZG9lcyBhIGZpZW1hcCB0byBmaWd1cmUgb3V0IHRo ZSBzZWN0b3JzIGl0cw0KZmlsZXMgYXJlIHVzaW5nLCBhbmQgY29ycmVsYXRlcyB0aGUgdHdvIGxp c3RzLg0KV2UgY2FuIGFsc28gbG9vayBpbnRvIHByb3ZpZGluZyBhbiBlYXNpZXItdG8tdXNlIGlu dGVyZmFjZSBmcm9tIHRoZQ0Ka2VybmVsLCBpbiB0aGUgZm9ybSBvZiBhbiBmaWVtYXAgZmxhZyB0 byByZXBvcnQgb25seSB0aGUgYmFkIHNlY3RvcnMsIG9yDQphIFNFRUtfQkFEIGZsYWcuLg0KVGhl IGFwcGxpY2F0aW9uIGRvZXNuJ3QgaGF2ZSB0byBzY2FuIHRoZSBlbnRpcmUgZmlsZXN5c3RlbSwg YnV0DQpwcmVzdW1hYmx5IGl0IGtub3dzIHdoYXQgZmlsZXMgaXQgJ293bnMnLCBhbmQgZG9lcyBh IGZpZW1hcCBmb3IgdGhvc2UuDQoNCj4gDQo+ID4gDQo+ID4gLSBJdCB3cml0ZSgpcyB0aG9zZSBz ZWN0b3JzIChwb3NzaWJseSBjb252ZXJ0ZWQgdG8gZmlsZSBvZmZzZXRzDQo+ID4gdXNpbmcNCj4g PiBmaWVtYXApDQo+ID4gwqAgwqAgKiBUaGlzIHRyaWdnZXJzIHRoZSBmYWxsYmFjayBwYXRoLCBi dXQgaWYgdGhlIGFwcGxpY2F0aW9uIGlzDQo+ID4gZG9pbmcNCj4gPiB0aGlzIGxldmVsIG9mIHJl Y292ZXJ5LCBpdCB3aWxsIGtub3cgdGhlIHNlY3RvciBpcyBiYWQsIGFuZCB3cml0ZQ0KPiA+IHRo ZQ0KPiA+IGVudGlyZSBzZWN0b3INCj4gV2hlcmUgZG9lcyB0aGUgYXBwbGljYXRpb24gZmluZCB0 aGUgZGF0YSB0aGF0IHdhcyBsb3N0IHRvIGJlIGFibGUgdG8NCj4gcmV3cml0ZSBpdD8NCg0KVGhl IGRhdGEgdGhhdCB3YXMgbG9zdCBpcyBnb25lIC0tIHRoaXMgYXNzdW1lcyB0aGUgYXBwbGljYXRp b24gaGFzIHNvbWUNCmFiaWxpdHkgdG8gcmVjb3ZlciB1c2luZyBhIGpvdXJuYWwvbG9nIG9yIG90 aGVyIHJlZHVuZGFuY3kgLSB5ZXMsIGF0IHRoZQ0KYXBwbGljYXRpb24gbGF5ZXIuIElmIGl0IGRv ZXNuJ3QgaGF2ZSB0aGlzIHNvcnQgb2YgY2FwYWJpbGl0eSwgdGhlIG9ubHkNCm9wdGlvbiBpcyB0 byByZXN0b3JlIGZpbGVzIGZyb20gYSBiYWNrdXAvbWlycm9yLg0KDQo+IA0KPiA+IA0KPiA+IC0g T3IgaXQgcmVwbGFjZXMgdGhlIGVudGlyZSBmaWxlIGZyb20gYmFja3VwIGFsc28gdXNpbmcgd3Jp dGUoKSAobm90DQo+ID4gbW1hcCtzdG9yZXMpDQo+ID4gwqAgwqAgKiBUaGlzIGp1c3QgZnJlZXMg dGhlIGZzIGJsb2NrLCBhbmQgdGhlIG5leHQgdGltZSB0aGUgYmxvY2sgaXMNCj4gPiByZWFsbG9j YXRlZCBieSB0aGUgZnMsIGl0IHdpbGwgbGlrZWx5IGJlIHplcm9lZCBmaXJzdCwgYW5kIHRoYXQg d2lsbA0KPiA+IGJlDQo+ID4gZG9uZSB0aHJvdWdoIHRoZSBkcml2ZXIgYW5kIHdpbGwgY2xlYXIg ZXJyb3JzDQo+IFRoZXJlJ3MgYW4gaW1wbGljaXQgYXNzdW1wdGlvbiB0aGF0IGFwcGxpY2F0aW9u cyB3aWxsIGtlZXAgcmVkdW5kYW50DQo+IGNvcGllcyBvZiB0aGVpciBkYXRhIGF0IHRoZSAvYXBw bGljYXRpb24gbGF5ZXIvIGFuZCBiZSBhYmxlIHRvDQo+IGF1dG9tYXRpY2FsbHkgcmVwYWlyIGl0 PyBBbmQgdGhlbiB0aGVyZSdzIHRoZSBpbXBsaWNpdCBhc3N1bXB0aW9uDQo+IHRoYXQgaXQgd2ls bCB1bmxpbmsgYW5kIGZyZWUgdGhlIGVudGlyZSBmaWxlIGJlZm9yZSB3cml0aW5nIGEgbmV3DQo+ IGNvcHksIGFuZCB0aGF0IHRoZW4gYXNzdW1lcyB0aGUgdGhlIGZpbGVzeXN0ZW0gd2lsbCB6ZXJv IGJsb2NrcyBpZg0KPiB0aGV5IGdldCByZXVzZWQgdG8gY2xlYXIgZXJyb3JzIG9uIHRoYXQgTEJB IHNlY3RvciBtYXBwaW5nIGJlZm9yZQ0KPiB0aGV5IGFyZSBhY2Nlc3NpYmxlIGFnYWluIHRvIHVz ZXJzcGFjZS4uDQo+IA0KPiBJdCBzZWVtcyB0byBtZSB0aGF0IHRoZXJlIGFyZSBhIG51bWJlciBv ZiBhc3N1bXB0aW9ucyBiZWluZyBtYWRlDQo+IGFjcm9zcyBtdWx0aXBsZSBsYXllcnMgaGVyZS4g TWF5YmUgSSd2ZSBtaXNzZWQgc29tZXRoaW5nIC0gY2FuIHlvdQ0KPiBwb2ludCBtZSB0byB0aGUg ZGVzaWduL2FyY2hpdGVjdHVyZSBkZXNjcmlwdGlvbiBzbyBJIGNhbiBzZWUgaG93DQo+ICJhcHAg ZG9lcyBkYXRhIHJlY292ZXJ5IGl0c2VsZiIgZGFuY2UgaXMgc3VwcG9zZWQgdG8gd29yaz8NCg0K VGhlcmUgaXNuJ3QgYSBkb2N1bWVudCBvdGhlciB0aGFuIHRoZSBmbG93IGluIG15IGhlYWQgOikg LSBidXQgbWF5YmUgSQ0KY291bGQgd3JpdGUgb25lIHVwLi4NCkkgd2Fzbid0IHRoaW5raW5nIHRo ZSBhcHBsaWNhdGlvbiBpdHNlbGYgbWFpbnRhaW5zIGFuZCByZXN0b3JlcyBmcm9tDQpiYWNrdXAg Y29weSBvZiB0aGUgZmlsZS4uIFRoZSBhcHBsaWNhdGlvbiBoaXRzIGVpdGhlciBhIFNJR0JVUyBv ciBFSU8NCmRlcGVuZGluZyBvbiBob3cgaXQgYWNjZXNzZXMgdGhlIGRhdGEsIGFuZCBjcmFzaGVz IG9yIHJhaXNlcyBzb21lIGFsYXJtLg0KVGhlIHJlY292ZXJ5IGlzIHRoZW4gZG9uZSBvdXQtb2Yt YmFuZCwgYnkgYSBzeXNhZG1pbiBvciBzdWNoIChpLmUuDQpkZWxldGUgdGhlIGZpbGUsIHJlcGxh Y2Ugd2l0aCBhIGtub3duIGdvb2QgY29weSwgcmVzdGFydCBhcHBsaWNhdGlvbikuDQoNClRvIHN1 bW1hcml6ZSwgdGhlIHR3byBjYXNlcyB3ZSB3YW50IHRvIGhhbmRsZSBhcmU6DQoxLiBBcHBsaWNh dGlvbiBoYXMgaW5idWlsdCByZWNvdmVyeToNCsKgIC0gaGl0cyBiYWRibG9jaw0KwqAgLSBmaWd1 cmVzIG91dCBpdCBpcyBhYmxlIHRvIHJlY292ZXIgdGhlIGRhdGENCsKgIC0gaGFuZGxlcyBTSUdC VVMgb3IgRUlPDQrCoCAtIGRvZXMgYSAoc2VjdG9yIGFsaWduZWQpIHdyaXRlKCkgdG8gcmVzdG9y ZSB0aGUgZGF0YQ0KMi4gQXBwbGljYXRpb24gZG9lc24ndCBoYXZlIGFueSBpbmJ1aWx0IHJlY292 ZXJ5IG1lY2hhbmlzbQ0KwqAgLSBoaXRzIGJhZGJsb2NrDQrCoCAtIGdldHMgU0lHQlVTIChvciBF SU8pIGFuZCBjcmFzaGVzDQrCoCAtIFN5c2FkbWluIHJlc3RvcmVzIGZpbGUgZnJvbSBiYWNrdXAN Cg0KQ2FzZSAxIGlzIGhhbmRsZWQgYnkgZWl0aGVyIGEgZmFsbGJhY2sgdG8gZGlyZWN0X0lPIGZy b20gZGF4X2RvX2lvLCBvcg0KYWx3YXlzIF9hY3R1YWxseV8gZG9pbmcgZGlyZWN0X0lPIHdoZW4g d2UncmUgb3BlbmVkIHdpdGggT19ESVJFQ1QgaW4NCnNwaXRlIG9mIGRheCAod2hhdCBEYW4gc3Vn Z2VzdGVkKS4gQ3VycmVudGx5IGlmIHdlJ3JlIG1vdW50ZWQgd2l0aCBkYXgsDQphbGwgSU8gT19E SVJFQ1Qgb3Igb3RoZXJ3aXNlIHdpbGwgZ28gdGhyb3VnaCBkYXhfZG9faW8uDQpDYXNlIDIgaXMg aGFuZGxlZCBieSBwYXRjaCA0IG9mIHRoZSBzZXJpZXM6DQrCoCDCoCBkYXg6IHVzZSBzYl9pc3N1 ZV96ZXJvdXQgaW5zdGVhZCBvZiBjYWxsaW5nIGRheF9jbGVhcl9zZWN0b3JzDQoNCj4gDQo+IENo ZWVycywNCj4gDQo+IERhdmUu From david@fromorbit.com Mon Apr 25 19:13:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 640D47CA0 for ; Mon, 25 Apr 2016 19:13:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1C28030404E for ; Mon, 25 Apr 2016 17:13:05 -0700 (PDT) X-ASG-Debug-ID: 1461629578-04bdf0358e22ae40001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id EhCTfgd8o4FyjIUQ for ; Mon, 25 Apr 2016 17:12:59 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DEBgBdsR5XVs/E03ZegziBUKVoBowUhWqEEYYIAgIBAQKBPE0BAQEBAQEHAYEFhEEBAQEDAScTHCMFCwgDEgYJJQ8FJQMHBhQTiCIHwysBAQEHAgEdGYVAhROEBgiDXIIrBZgPjgyBcId2hTRFjmqCZxuBXSowiQABAQE Received: from ppp118-211-196-207.lns20.syd4.internode.on.net (HELO dastard) ([118.211.196.207]) by ipmail06.adl2.internode.on.net with ESMTP; 26 Apr 2016 09:41:58 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1auqbd-0007Ex-3y; Tue, 26 Apr 2016 10:11:57 +1000 Date: Tue, 26 Apr 2016 10:11:57 +1000 From: Dave Chinner To: Dan Williams Cc: "Verma, Vishal L" , "linux-block@vger.kernel.org" , "jack@suse.cz" , "axboe@fb.com" , "linux-nvdimm@ml01.01.org" , "linux-kernel@vger.kernel.org" , "xfs@oss.sgi.com" , "hch@infradead.org" , "linux-mm@kvack.org" , "Wilcox, Matthew R" , "linux-fsdevel@vger.kernel.org" , "akpm@linux-foundation.org" , "linux-ext4@vger.kernel.org" , "viro@zeniv.linux.org.uk" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Message-ID: <20160426001157.GE18496@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> <20160425232552.GD18496@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1461629578 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5896 X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29055 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Apr 25, 2016 at 04:43:14PM -0700, Dan Williams wrote: > On Mon, Apr 25, 2016 at 4:25 PM, Dave Chinner wrote: > > On Mon, Apr 25, 2016 at 05:14:36PM +0000, Verma, Vishal L wrote: > >> On Mon, 2016-04-25 at 01:31 -0700, hch@infradead.org wrote: > >> > On Sat, Apr 23, 2016 at 06:08:37PM +0000, Verma, Vishal L wrote: > >> > > > >> > > direct_IO might fail with -EINVAL due to misalignment, or -ENOMEM > >> > > due > >> > > to some allocation failing, and I thought we should return the > >> > > original > >> > > -EIO in such cases so that the application doesn't lose the > >> > > information > >> > > that the bad block is actually causing the error. > >> > EINVAL is a concern here. Not due to the right error reported, but > >> > because it means your current scheme is fundamentally broken - we > >> > need to support I/O at any alignment for DAX I/O, and not fail due to > >> > alignbment concernes for a highly specific degraded case. > >> > > >> > I think this whole series need to go back to the drawing board as I > >> > don't think it can actually rely on using direct I/O as the EIO > >> > fallback. > >> > > >> Agreed that DAX I/O can happen with any size/alignment, but how else do > >> we send an IO through the driver without alignment restrictions? Also, > >> the granularity at which we store badblocks is 512B sectors, so it > >> seems natural that to clear such a sector, you'd expect to send a write > >> to the whole sector. > >> > >> The expected usage flow is: > >> > >> - Application hits EIO doing dax_IO or load/store io > >> > >> - It checks badblocks and discovers it's files have lost data > > > > Lots of hand-waving here. How does the application map a bad > > "sector" to a file without scanning the entire filesystem to find > > the owner of the bad sector? > > > >> - It write()s those sectors (possibly converted to file offsets using > >> fiemap) > >> * This triggers the fallback path, but if the application is doing > >> this level of recovery, it will know the sector is bad, and write the > >> entire sector > > > > Where does the application find the data that was lost to be able to > > rewrite it? > > > >> - Or it replaces the entire file from backup also using write() (not > >> mmap+stores) > >> * This just frees the fs block, and the next time the block is > >> reallocated by the fs, it will likely be zeroed first, and that will be > >> done through the driver and will clear errors > > > > There's an implicit assumption that applications will keep redundant > > copies of their data at the /application layer/ and be able to > > automatically repair it? And then there's the implicit assumption > > that it will unlink and free the entire file before writing a new > > copy, and that then assumes the the filesystem will zero blocks if > > they get reused to clear errors on that LBA sector mapping before > > they are accessible again to userspace.. > > > > It seems to me that there are a number of assumptions being made > > across multiple layers here. Maybe I've missed something - can you > > point me to the design/architecture description so I can see how > > "app does data recovery itself" dance is supposed to work? > > > > Maybe I missed something, but all these assumptions are already > present for typical block devices, i.e. sectors may go bad and a write > may make the sector usable again. The assumption we make about sectors going bad on SSDs or SRDs is that the device is about to die and needs replacing ASAP. Then RAID takes care of the rebuild completely transparently. i.e. handling and correcting bad sectors is typically done completely transparently /below/ the filesytem like so: Application Filesystem block [LBA mapping/redundancy/correction driver e.g. md/dm] driver hardware [LBA redundancy/correction e.g h/w RAID] In the case of filesystems with their own RAID/redundancy code (e.g. btrfs), then it looks like this: Application Filesystem mapping/redundancy/correction driver block driver hardware [LBA redundancy/correction e.g h/w RAID] > This patch series is extending that > out to the DAX-mmap case, but it's the same principle of "write to > clear error" that we live with in the block-I/O path. What > clarification are you looking for beyond that point? I'm asking for an actual design document that explains how moving all the redundancy and bad sector correction stuff from the LBA layer up into application space is supposed to work when applications have no clue about LBA mappings, nor tend to keep redundant data around. i.e. you're proposing this: Application Application data redundancy/correction Filesystem Block [LBA mapping/redundancy/correction driver e.g. md/dm] driver hardware And somehow all the error information from the hardware layer needs to be propagated up to the application layer, along with all the mapping information from the filesystem and block layers for the application to make sense of the hardware reported errors. I see assumptions this this "just works" but we don't have any of the relevant APIs or infrastructure to enable the application to do the hardware error->file+offset namespace mapping (i.e. filesystem reverse mapping for for file offsets and directory paths, and reverse mapping for the the block layer remapping drivers). I haven't seen any design/documentation for infrastructure at the application layer to handle redundant data and correctly transparently so I don't have any idea what the technical requirements this different IO stack places on filesystems may be. Hence I'm asking for some kind of architecture/design documentation that I can read to understand exactly what is being proposed here... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Apr 25 19:42:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id ADDDD7CA0 for ; Mon, 25 Apr 2016 19:42:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 73E4D8F8033 for ; Mon, 25 Apr 2016 17:42:02 -0700 (PDT) X-ASG-Debug-ID: 1461631318-04cb6c09a2251840001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id OFMnqMkHXTDGsjAA for ; Mon, 25 Apr 2016 17:41:58 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DEBgA4uB5XVs/E03ZegziBUKVoBowUhWqEEYYIAgIBAQKBPE0BAQEBAQEHAYEFhEEBAQEDATIBIx4FBQsIAxIGCSUPBSUDBwYUExuIBwfDKwEBAQcCAR0ZhUCFE4QGI4NBgisFh3GHFIkKjgyBcI0qRYVeiQyCYgUbgV0qMIdDgT0BAQE Received: from ppp118-211-196-207.lns20.syd4.internode.on.net (HELO dastard) ([118.211.196.207]) by ipmail06.adl2.internode.on.net with ESMTP; 26 Apr 2016 10:11:57 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1aur4e-0007H5-12; Tue, 26 Apr 2016 10:41:56 +1000 Date: Tue, 26 Apr 2016 10:41:55 +1000 From: Dave Chinner To: "Verma, Vishal L" Cc: "linux-kernel@vger.kernel.org" , "linux-block@vger.kernel.org" , "hch@infradead.org" , "xfs@oss.sgi.com" , "linux-nvdimm@ml01.01.org" , "jmoyer@redhat.com" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" , "jack@suse.cz" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Message-ID: <20160426004155.GF18496@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> <20160425232552.GD18496@dastard> <1461628381.1421.24.camel@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1461628381.1421.24.camel@intel.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: 1461631318 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5913 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29056 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Apr 25, 2016 at 11:53:13PM +0000, Verma, Vishal L wrote: > On Tue, 2016-04-26 at 09:25 +1000, Dave Chinner wrote: > >  > <> > > > > > > > - It checks badblocks and discovers it's files have lost data > > Lots of hand-waving here. How does the application map a bad > > "sector" to a file without scanning the entire filesystem to find > > the owner of the bad sector? > > Yes this was hand-wavey, but we talked about this a bit at LSF.. > The idea is that a per-block-device badblocks list is available at > /sys/block//badblocks. The application (or a suitable yet-to-be- > written library function) does a fiemap to figure out the sectors its > files are using, and correlates the two lists. > We can also look into providing an easier-to-use interface from the > kernel, in the form of an fiemap flag to report only the bad sectors, or > a SEEK_BAD flag.. > The application doesn't have to scan the entire filesystem, but > presumably it knows what files it 'owns', and does a fiemap for those. You're assuming that only the DAX aware application accesses it's files. users, backup programs, data replicators, fileystem re-organisers (e.g. defragmenters) etc all may access the files and they may throw errors. What then? > > > - It write()s those sectors (possibly converted to file offsets > > > using > > > fiemap) > > >     * This triggers the fallback path, but if the application is > > > doing > > > this level of recovery, it will know the sector is bad, and write > > > the > > > entire sector > > Where does the application find the data that was lost to be able to > > rewrite it? > > The data that was lost is gone -- this assumes the application has some > ability to recover using a journal/log or other redundancy - yes, at the > application layer. If it doesn't have this sort of capability, the only > option is to restore files from a backup/mirror. So the architecture has a built in assumption that only userspace can handle data loss? What about filesytsems like NOVA, that use log structured design to provide DAX w/ update atomicity and can potentially also provide redundancy/repair through the same mechanisms? Won't pmem native filesystems with built in data protection features like this remove the need for adding all this to userspace applications? If so, shouldn't that be the focus of development rahter than placing the burden on userspace apps to handle storage repair situations? > > > - Or it replaces the entire file from backup also using write() (not > > > mmap+stores) > > >     * This just frees the fs block, and the next time the block is > > > reallocated by the fs, it will likely be zeroed first, and that will > > > be > > > done through the driver and will clear errors > > There's an implicit assumption that applications will keep redundant > > copies of their data at the /application layer/ and be able to > > automatically repair it? And then there's the implicit assumption > > that it will unlink and free the entire file before writing a new > > copy, and that then assumes the the filesystem will zero blocks if > > they get reused to clear errors on that LBA sector mapping before > > they are accessible again to userspace.. > > > > It seems to me that there are a number of assumptions being made > > across multiple layers here. Maybe I've missed something - can you > > point me to the design/architecture description so I can see how > > "app does data recovery itself" dance is supposed to work? > > There isn't a document other than the flow in my head :) - but maybe I > could write one up.. > I wasn't thinking the application itself maintains and restores from > backup copy of the file.. The application hits either a SIGBUS or EIO > depending on how it accesses the data, and crashes or raises some alarm. > The recovery is then done out-of-band, by a sysadmin or such (i.e. > delete the file, replace with a known good copy, restart application). > > To summarize, the two cases we want to handle are: > 1. Application has inbuilt recovery: >   - hits badblock >   - figures out it is able to recover the data >   - handles SIGBUS or EIO >   - does a (sector aligned) write() to restore the data The "figures out" step here is where >95% of the work we'd have to do is. And that's in filesystem and block layer code, not userspace, and userspace can't do that work in a signal handler. And it can still fall down to the second case when the application doesn't have another copy of the data somewhere. FWIW, we don't have a DAX enabled filesystem that can do reverse block mapping, so we're a year or two away from this being a workable production solution from the filesystem perspective. And AFAICT, it's not even on the roadmap for dm/md layers. > 2. Application doesn't have any inbuilt recovery mechanism >   - hits badblock >   - gets SIGBUS (or EIO) and crashes >   - Sysadmin restores file from backup Which is no different to an existing non-DAX application getting an EIO/sigbus from current storage technologies. Except: in the existing storage stack, redundancy and correction has already had to have failed for the application to see such an error. Hence this is normally considered a DR case as there's had to be cascading failures (e.g. multiple disk failures in a RAID) to get to this stage, not a single error in a single sector in non-redundant storage. We need some form of redundancy and correction in the PMEM stack to prevent single sector errors from taking down services until an administrator can correct the problem. I'm trying to understand where this is supposed to fit into the picture - at this point I really don't think userspace applications are going to be able to do this reliably.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From dan.j.williams@intel.com Mon Apr 25 20:45:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 71D907CA6 for ; Mon, 25 Apr 2016 20:45:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 27A3C8F8037 for ; Mon, 25 Apr 2016 18:45:13 -0700 (PDT) X-ASG-Debug-ID: 1461635109-04bdf0358e22d630001-NocioJ Received: from mail-oi0-f53.google.com (mail-oi0-f53.google.com [209.85.218.53]) by cuda.sgi.com with ESMTP id JlUwVXAziXTexUzb (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 25 Apr 2016 18:45:09 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Effective-Source-IP: mail-oi0-f53.google.com[209.85.218.53] X-Barracuda-Apparent-Source-IP: 209.85.218.53 Received: by mail-oi0-f53.google.com with SMTP id k142so639669oib.1 for ; Mon, 25 Apr 2016 18:45:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=A0X24ySTXJopmB0aPelywBZgJlRBXUhYZ03XnMY+tp0=; b=o29vfHXOQ3xfjwvJLJvkP110m3ld2iBo2OYkO5Wnw05gAMq/BAcM9jV4HZYXoVqZ94 WfvMa+PbOKBYuv/Xv1zrnv92sxtjwL02m1vX4LJpWzXxceQG7V9ju/k1NR/IP6OzVw9p Z1jyBd+LArWhXpws18aeNFwRrsyuAeO3f4abcddH72IurOsc5NA8FIDDrfThCj1tcqTm OAF+jDRXIP1K57GYb5netQxwo00qcY5m/cnSsHs+BydoqLZ5wNIIKCyrEJFoHjlP07NP 1i7y98EzV2/gfgpISFMp/mBrIplbzsYDgz7qLhgI7uH1BBurY1iKkw70+X0IMnmJQ/s6 JGJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=A0X24ySTXJopmB0aPelywBZgJlRBXUhYZ03XnMY+tp0=; b=E9k+WcVctiAIaCgu4Pz/XsyuTiD7Hhdm81qQGKj6x5e38RHAgRlG1BKWObVUYYKAcd tFEL7FNvuv3oZMpHRywCKt4urQtdfoTStPWsvMNCg44HKXKjEWNhjaAZXQGaAAfdZ5NQ nCJDKfdYugmfpYJkx7NK0a1jzhtp9btaaIwj1Wvu2rxJDodmOC12anK9uM93U7tZ4Bot xcsR/3L2E6P5qrs8c2Xyn/sKDoc2WbEM4XQDSuMY9OJo6dKEzIWRQ7Qg4KoPTFjlMqae 1VQCVzVQoif2kNqwx198hW5AYXd4JYm4AO5CLD9sIR6WAxyXO/PqDtHI8wEigBCqoDfO X7zw== X-Gm-Message-State: AOPr4FXzwlezYipMmEOkzeqL40eBcLeqFeGngRz+203aky89aBrDHn4KhoaGUoUytdhFWy7EasaF7sOimE5OQtwc MIME-Version: 1.0 X-Received: by 10.202.189.10 with SMTP id n10mr15480391oif.101.1461635109140; Mon, 25 Apr 2016 18:45:09 -0700 (PDT) Received: by 10.157.38.39 with HTTP; Mon, 25 Apr 2016 18:45:08 -0700 (PDT) In-Reply-To: <20160426001157.GE18496@dastard> References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> <20160425232552.GD18496@dastard> <20160426001157.GE18496@dastard> Date: Mon, 25 Apr 2016 18:45:08 -0700 Message-ID: Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io From: Dan Williams X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io To: Dave Chinner Cc: "Verma, Vishal L" , "linux-block@vger.kernel.org" , "jack@suse.cz" , "axboe@fb.com" , "linux-nvdimm@ml01.01.org" , "linux-kernel@vger.kernel.org" , "xfs@oss.sgi.com" , "hch@infradead.org" , "linux-mm@kvack.org" , "Wilcox, Matthew R" , "linux-fsdevel@vger.kernel.org" , "akpm@linux-foundation.org" , "linux-ext4@vger.kernel.org" , "viro@zeniv.linux.org.uk" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oi0-f53.google.com[209.85.218.53] X-Barracuda-Start-Time: 1461635109 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5288 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29058 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Mon, Apr 25, 2016 at 5:11 PM, Dave Chinner wrote: > On Mon, Apr 25, 2016 at 04:43:14PM -0700, Dan Williams wrote: [..] >> Maybe I missed something, but all these assumptions are already >> present for typical block devices, i.e. sectors may go bad and a write >> may make the sector usable again. > > The assumption we make about sectors going bad on SSDs or SRDs is > that the device is about to die and needs replacing ASAP. Similar assumptions here. Storage media is experiencing errors and past a certain threshold it may be time to decommission the device. You can see definitions for SMART / media health commands from various vendors at these links, and yes, hopefully these are standardized / unified at some point down the road: http://pmem.io/documents/NVDIMM_DSM_Interface_Example.pdf https://github.com/HewlettPackard/hpe-nvm/blob/master/Documentation/NFIT_DSM_DDR4_NVDIMM-N_v84s.pdf https://msdn.microsoft.com/en-us/library/windows/hardware/mt604717(v=vs.85).aspx > Then > RAID takes care of the rebuild completely transparently. i.e. > handling and correcting bad sectors is typically done completely > transparently /below/ the filesytem like so: Again, same for an NVDIMM. Use the pmem block-device as a RAID-member device. >> This patch series is extending that >> out to the DAX-mmap case, but it's the same principle of "write to >> clear error" that we live with in the block-I/O path. What >> clarification are you looking for beyond that point? > > I'm asking for an actual design document that explains how moving > all the redundancy and bad sector correction stuff from the LBA > layer up into application space is supposed to work when > applications have no clue about LBA mappings, nor tend to keep > redundant data around. i.e. you're proposing this: These patches are not proposing *new* / general infrastructure for moving redundancy and bad sector correction handling to userspace. If an existing app is somehow dealing with raw (without RAID) device errors on disk storage media today it should not need to change to handle errors on an NVDIMM. My expectation is that very few if any applications handle this today and just fail in the presence of media errors. > Application > Application data redundancy/correction > Filesystem > Block > [LBA mapping/redundancy/correction driver e.g. md/dm] > driver > hardware > > And somehow all the error information from the hardware layer needs > to be propagated up to the application layer, along with all the > mapping information from the filesystem and block layers for the > application to make sense of the hardware reported errors. > > I see assumptions this this "just works" but we don't have any of > the relevant APIs or infrastructure to enable the application to do > the hardware error->file+offset namespace mapping (i.e. filesystem > reverse mapping for for file offsets and directory paths, and > reverse mapping for the the block layer remapping drivers). If an application expects errors to be handled beneath the filesystem then it should forgo DAX and arrange for the NVDIMM devices to be RAIDed. Otherwise, if an application wants to use DAX then it might need to be prepared to handle media errors itself same as the un-RAIDed disk case. Yes, at an administrative level without reverse-mapping support from a filesystem there's presently no way to ask "which files on this fs are impacted by media errors", and we're aware that reverse-mapping capabilities are nascent for current DAX-aware filesystems. The forward lookup path, as impractical as it is for large numbers of files, is available if an application wanted to know if a specific file was impacted. We've discussed possibly extending fiemap() to return bad blocks in a file rather than consulting sysfs, or extending lseek() with something like SEEK_ERROR to return offsets of bad areas in a file. > I haven't seen any design/documentation for infrastructure at the > application layer to handle redundant data and correctly > transparently so I don't have any idea what the technical > requirements this different IO stack places on filesystems may be. > Hence I'm asking for some kind of architecture/design documentation > that I can read to understand exactly what is being proposed here... I think this is a discussion for a solution that would build on top of this basic "here are the errors, re-write them with good data if you can; otherwise, best of luck" foundation. Something like a DAX-aware device mapper layer that duplicates data tagged with REQ_META so at least we have a recovery path when a sector error lands in critical filesystem-metadata. However, anything we come up with to make NVDIMM errors more survivable should be directly applicable to traditional disk storage as well. Along these lines we had a BoF session at Vault where drive vendors we're wondering if the sysfs bad sectors list could help software recover from the loss of a disk-head, or other errors that only take down part of the drive. An I/O hint that flags data that should be stored redundantly might be useful there as well. By the way, your presence was sorely missed at LSF/MM! From david@fromorbit.com Mon Apr 25 21:56:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E9BBF7CB8 for ; Mon, 25 Apr 2016 21:56:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5DD04AC002 for ; Mon, 25 Apr 2016 19:56:53 -0700 (PDT) X-ASG-Debug-ID: 1461639409-04cbb00fea2225c0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id T0xiG7EIkZrdSMVu for ; Mon, 25 Apr 2016 19:56:49 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BsCQAC2B5XVs/E03ZegzhTfaViAQEBAQEBBowUhWqEESSCOoJmRAICAQECgTpNAQEBAQEBBwGBBYRBAQEBAgEBJxMcIwULCAMSBgklDwUlAwcGFBMbiAcHD8MUAQsBHRmFQIUThCmFbAWXTESFfIgRgXFOhyiFNEWOa4JnG4FdKjABh0KBPQEBAQ Received: from ppp118-211-196-207.lns20.syd4.internode.on.net (HELO dastard) ([118.211.196.207]) by ipmail06.adl2.internode.on.net with ESMTP; 26 Apr 2016 12:26:47 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1autB7-0007VL-Pq; Tue, 26 Apr 2016 12:56:45 +1000 Date: Tue, 26 Apr 2016 12:56:45 +1000 From: Dave Chinner To: Dan Williams Cc: "Verma, Vishal L" , "linux-block@vger.kernel.org" , "jack@suse.cz" , "axboe@fb.com" , "linux-nvdimm@ml01.01.org" , "linux-kernel@vger.kernel.org" , "xfs@oss.sgi.com" , "hch@infradead.org" , "linux-mm@kvack.org" , "Wilcox, Matthew R" , "linux-fsdevel@vger.kernel.org" , "akpm@linux-foundation.org" , "linux-ext4@vger.kernel.org" , "viro@zeniv.linux.org.uk" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Message-ID: <20160426025645.GG18496@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io References: <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> <20160425232552.GD18496@dastard> <20160426001157.GE18496@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1461639409 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7022 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29060 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Apr 25, 2016 at 06:45:08PM -0700, Dan Williams wrote: > On Mon, Apr 25, 2016 at 5:11 PM, Dave Chinner wrote: > > On Mon, Apr 25, 2016 at 04:43:14PM -0700, Dan Williams wrote: > [..] > >> Maybe I missed something, but all these assumptions are already > >> present for typical block devices, i.e. sectors may go bad and a write > >> may make the sector usable again. > > > > The assumption we make about sectors going bad on SSDs or SRDs is > > that the device is about to die and needs replacing ASAP. > > Similar assumptions here. Storage media is experiencing errors and > past a certain threshold it may be time to decommission the device. > > You can see definitions for SMART / media health commands from various > vendors at these links, and yes, hopefully these are standardized / > unified at some point down the road: > > http://pmem.io/documents/NVDIMM_DSM_Interface_Example.pdf > https://github.com/HewlettPackard/hpe-nvm/blob/master/Documentation/NFIT_DSM_DDR4_NVDIMM-N_v84s.pdf > https://msdn.microsoft.com/en-us/library/windows/hardware/mt604717(v=vs.85).aspx > > > > Then > > RAID takes care of the rebuild completely transparently. i.e. > > handling and correcting bad sectors is typically done completely > > transparently /below/ the filesytem like so: > > Again, same for an NVDIMM. Use the pmem block-device as a RAID-member device. Which means we're not using DAX and so the existing storage model applies. I understand how this works. What I'm asking about the redundancy/error correction model /when using DAX/ and a userspace DAX load/store throws the MCE. > > And somehow all the error information from the hardware layer needs > > to be propagated up to the application layer, along with all the > > mapping information from the filesystem and block layers for the > > application to make sense of the hardware reported errors. > > > > I see assumptions this this "just works" but we don't have any of > > the relevant APIs or infrastructure to enable the application to do > > the hardware error->file+offset namespace mapping (i.e. filesystem > > reverse mapping for for file offsets and directory paths, and > > reverse mapping for the the block layer remapping drivers). > > If an application expects errors to be handled beneath the filesystem > then it should forgo DAX and arrange for the NVDIMM devices to be > RAIDed. See above: I'm asking about the DAX-enabled error handling model, not the traditional error handling model. > Otherwise, if an application wants to use DAX then it might > need to be prepared to handle media errors itself same as the > un-RAIDed disk case. Yes, at an administrative level without > reverse-mapping support from a filesystem there's presently no way to > ask "which files on this fs are impacted by media errors", and we're > aware that reverse-mapping capabilities are nascent for current > DAX-aware filesystems. Precisely my point - suggestions are being proposed which assume use of infrastructure that *does not exist yet* and has not been discussed or documented. If we're expecting such infrastructure to be implemented in the filesystems and block device drivers, then we need to determine that the error model actually works first... > The forward lookup path, as impractical as it > is for large numbers of files, is available if an application wanted > to know if a specific file was impacted. We've discussed possibly > extending fiemap() to return bad blocks in a file rather than > consulting sysfs, or extending lseek() with something like SEEK_ERROR > to return offsets of bad areas in a file. Via what infrastructure will the filesystem use for finding out whether a file has bad blocks in it? And if the file does have bad blocks, what are you expecting the filesystem to do with that information? > > I haven't seen any design/documentation for infrastructure at the > > application layer to handle redundant data and correctly > > transparently so I don't have any idea what the technical > > requirements this different IO stack places on filesystems may be. > > Hence I'm asking for some kind of architecture/design documentation > > that I can read to understand exactly what is being proposed here... > > I think this is a discussion for a solution that would build on top of > this basic "here are the errors, re-write them with good data if you > can; otherwise, best of luck" foundation. Something like a DAX-aware > device mapper layer that duplicates data tagged with REQ_META so at > least we have a recovery path when a sector error lands in critical > filesystem-metadata. Filesytsem metadata is not the topic of discussion here - it's user data that throws an error on a DAX load/store that is the issue. > However, anything we come up with to make NVDIMM > errors more survivable should be directly applicable to traditional > disk storage as well. I'm not sure it does. DAX implies that traditional block layer RAID infrastructure is not possible, nor are data CRCs, nor are any other sort of data transformations that are needed for redundancy at the device layers. Anything that relies on copying/modifying/stable data to provide redundancies needs to do such work at a place where it can stall userspace page faults. This is where pmem native filesystem designs like NOVA take over from traditional block based filesystems - they are designed around the ability to do atomic page-based operations for data protection and recovery operations. It is this mechanism that allows stable pages to be committed to permanent storage and as such, allow redundancy operations such as mirroring to be performed before operations are marked as "stable". I'm missing the bigger picture that is being aimed at here - what's the point of DAX if we have to turn it off if we want any sort of failure protection? What's the big plan for fully enabling DAX with robust error correction? Where is this all supposed to be leading to? > Along these lines we had a BoF session at Vault > where drive vendors we're wondering if the sysfs bad sectors list > could help software recover from the loss of a disk-head, or other > errors that only take down part of the drive. Right, but as I've said elsewhere, loss of a disk head implies terabyte scale data loss. That is not something we can automatically recovery from at the filesystem level. Low level raid recovery could handle that sort of loss, but at the higher layers it's a disaster similar to multiple disk RAID failure. It's a completely different scale to a single sector/page loss we are talking about here, and so I don't see there as being much (if any) overlap here. > An I/O hint that flags > data that should be stored redundantly might be useful there as well. DAX doesn't have an IO path to hint with... :/ Cheers, Dave. -- Dave Chinner david@fromorbit.com From dan.j.williams@intel.com Mon Apr 25 23:18:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7F8DB7CB1 for ; Mon, 25 Apr 2016 23:18:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 35F69304032 for ; Mon, 25 Apr 2016 21:18:45 -0700 (PDT) X-ASG-Debug-ID: 1461644322-04bdf0358f231e00001-NocioJ Received: from mail-oi0-f47.google.com (mail-oi0-f47.google.com [209.85.218.47]) by cuda.sgi.com with ESMTP id UHdCzFhgTkJaXJPY (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 25 Apr 2016 21:18:42 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Effective-Source-IP: mail-oi0-f47.google.com[209.85.218.47] X-Barracuda-Apparent-Source-IP: 209.85.218.47 Received: by mail-oi0-f47.google.com with SMTP id k142so3158387oib.1 for ; Mon, 25 Apr 2016 21:18:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=DwErJcx8ZVQ4g8ffqkylu+r84yTIoUORiNL6PMhZX70=; b=V2V7Cu9PBafTExDBYxU5nEMjr4EHJtWKXAsbU+6nDj3S+7c82ZP91gustNCL0r0GGD 9jQD8swuduZFT6GZFvCxvMVSNyKcu+otoPaNDmcH0ZwhHyLAZQIzRCC5tFplYdPkW39b W7YCWf/BMppZNl0VFYuznKBfwUEgv00GfmuyeXp/yJXgu46wdrkljcQNzBsHPWsrOMym Ev4fJdR9hnvJElMOfeFSqt0jFbDWreC4a4BFMyDjEzGdJ7DozhM11rJLdIp0XWCHhIBc yL2wbXM5CMhqNpjrYmTqgZB44WG5LBVNCNibvO/hiHHaze/lEJ3Av3fKS+r9Be2RdhAQ 9lyA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=DwErJcx8ZVQ4g8ffqkylu+r84yTIoUORiNL6PMhZX70=; b=I4m3hjLGYMF4E7k4c2gqSjw7EPoqlZdw3zLk+8KGDUN1ukceXzJDmPLGBvJSgYzJcD DibaDbLTGIlfNCN03J6oZ6YMra8YIy5uebKHqGtUiZnlJcwvdIPqtvqr802qMTPn2CJZ 5hfYnC7YoawxiOZDJEEaTNealO3m3ghrxkICJKVwdKh3hdbQI/r/klfeqNBMcqTHtviH yMesfrKbXQbrJlKECXBbaEfMFQbq9YM/8cd+Wxy/cN4QbNy8VWWjF8ezm+JnOomTLCii dW2UY6CMICbGQ/grntu7tkWXbysqO05B/q8favbNju9g8vD2CMo4xEXKyY89JHefsQTK gz8A== X-Gm-Message-State: AOPr4FVJMU63O8t3t0CI+URqntVpSrRQOt0goVkGILwfQCHQembAFV/od0swGQwhnw1KhVBR9F4bhVO0xDIONBb5 MIME-Version: 1.0 X-Received: by 10.157.61.225 with SMTP id l88mr155888otc.95.1461644322267; Mon, 25 Apr 2016 21:18:42 -0700 (PDT) Received: by 10.157.38.39 with HTTP; Mon, 25 Apr 2016 21:18:42 -0700 (PDT) In-Reply-To: <20160426025645.GG18496@dastard> References: <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> <20160425232552.GD18496@dastard> <20160426001157.GE18496@dastard> <20160426025645.GG18496@dastard> Date: Mon, 25 Apr 2016 21:18:42 -0700 Message-ID: Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io From: Dan Williams X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io To: Dave Chinner Cc: "Verma, Vishal L" , "linux-block@vger.kernel.org" , "jack@suse.cz" , "axboe@fb.com" , "linux-nvdimm@ml01.01.org" , "linux-kernel@vger.kernel.org" , "xfs@oss.sgi.com" , "hch@infradead.org" , "linux-mm@kvack.org" , "Wilcox, Matthew R" , "linux-fsdevel@vger.kernel.org" , "akpm@linux-foundation.org" , "linux-ext4@vger.kernel.org" , "viro@zeniv.linux.org.uk" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oi0-f47.google.com[209.85.218.47] X-Barracuda-Start-Time: 1461644322 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6464 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29061 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Mon, Apr 25, 2016 at 7:56 PM, Dave Chinner wrote: > On Mon, Apr 25, 2016 at 06:45:08PM -0700, Dan Williams wrote: [..] >> Otherwise, if an application wants to use DAX then it might >> need to be prepared to handle media errors itself same as the >> un-RAIDed disk case. Yes, at an administrative level without >> reverse-mapping support from a filesystem there's presently no way to >> ask "which files on this fs are impacted by media errors", and we're >> aware that reverse-mapping capabilities are nascent for current >> DAX-aware filesystems. > > Precisely my point - suggestions are being proposed which assume > use of infrastructure that *does not exist yet* and has not been > discussed or documented. If we're expecting such infrastructure to > be implemented in the filesystems and block device drivers, then we > need to determine that the error model actually works first... These patches only assume the clear-error-on write-model, and that *maybe* the sysfs bad blocks list is useful if the filesystem has a reverse-map, or if the application can compare the list against the results of fiemap(). Beyond that, this is the same perennial "we should really have better error coordination between block device and filesystems" discussions that we have at LSF. > >> The forward lookup path, as impractical as it >> is for large numbers of files, is available if an application wanted >> to know if a specific file was impacted. We've discussed possibly >> extending fiemap() to return bad blocks in a file rather than >> consulting sysfs, or extending lseek() with something like SEEK_ERROR >> to return offsets of bad areas in a file. > > Via what infrastructure will the filesystem use for finding out > whether a file has bad blocks in it? And if the file does have bad > blocks, what are you expecting the filesystem to do with that > information? We currently have no expectation that the filesystem does anything with the bad blocks list. However, if a filesystem had btrfs-like capabilities to recover data from a redundant location we'd be looking to plug into that infrastructure. >> > I haven't seen any design/documentation for infrastructure at the >> > application layer to handle redundant data and correctly >> > transparently so I don't have any idea what the technical >> > requirements this different IO stack places on filesystems may be. >> > Hence I'm asking for some kind of architecture/design documentation >> > that I can read to understand exactly what is being proposed here... >> >> I think this is a discussion for a solution that would build on top of >> this basic "here are the errors, re-write them with good data if you >> can; otherwise, best of luck" foundation. Something like a DAX-aware >> device mapper layer that duplicates data tagged with REQ_META so at >> least we have a recovery path when a sector error lands in critical >> filesystem-metadata. > > Filesytsem metadata is not the topic of discussion here - it's > user data that throws an error on a DAX load/store that is the > issue. Which is not a new problem since volatile DRAM in the non-DAX case can throw the exact same error. The current recovery model there is crash the kernel (without MCE recovery), or crash the application and hope the kernel maps out the page or the application knows how to restart after SIGBUS. Memory mirroring is meant to make this a bit less harsh, but there's no mechanism to make this available outside the kernel. >> However, anything we come up with to make NVDIMM >> errors more survivable should be directly applicable to traditional >> disk storage as well. > > I'm not sure it does. DAX implies that traditional block layer RAID > infrastructure is not possible, nor are data CRCs, nor are any other > sort of data transformations that are needed for redundancy at the > device layers. Anything that relies on copying/modifying/stable data to > provide redundancies needs to do such work at a place where it can > stall userspace page faults. > > This is where pmem native filesystem designs like NOVA take over > from traditional block based filesystems - they are designed around > the ability to do atomic page-based operations for data protection > and recovery operations. It is this mechanism that allows stable > pages to be committed to permanent storage and as such, allow > redundancy operations such as mirroring to be performed before > operations are marked as "stable". > > I'm missing the bigger picture that is being aimed at here - what's the > point of DAX if we have to turn it off if we want any sort of > failure protection? What's the big plan for fully enabling DAX with > robust error correction? Where is this all supposed to be leading > to? > NOVA and other solutions are free and encouraged to do a coherent bottoms-up rethink of error handling on top of persistent memory devices, in the meantime applications can only expect the legacy SIGBUS and -EIO mechanisms are available. So I'm still trying to connect how the "What would NOVA do?" discussion is anything but orthogonal to hooking up SIGBUS and -EIO for traditional-filesystem DAX. It's the only error model an application can expect because it's the only one that currently exists. >> Along these lines we had a BoF session at Vault >> where drive vendors we're wondering if the sysfs bad sectors list >> could help software recover from the loss of a disk-head, or other >> errors that only take down part of the drive. > > Right, but as I've said elsewhere, loss of a disk head implies > terabyte scale data loss. That is not something we can automatically > recovery from at the filesystem level. Low level raid recovery could > handle that sort of loss, but at the higher layers it's a disaster > similar to multiple disk RAID failure. It's a completely different > scale to a single sector/page loss we are talking about here, and so > I don't see there as being much (if any) overlap here. > >> An I/O hint that flags >> data that should be stored redundantly might be useful there as well. > > DAX doesn't have an IO path to hint with... :/ ...I was thinking traditional filesystem metadata operations through the block layer. NOVA could of course do something better since it always indirects userspace access through a filesystem managed page. From david@fromorbit.com Tue Apr 26 03:27:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 46E7A7CCA for ; Tue, 26 Apr 2016 03:27:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1A55C8F8035 for ; Tue, 26 Apr 2016 01:27:34 -0700 (PDT) X-ASG-Debug-ID: 1461659246-04cb6c09a125f780001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id W27dZnLjoy7k6VLW for ; Tue, 26 Apr 2016 01:27:27 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DLBgB4JR9X/8/E03ZegziBUIJzonUGjBSFaoQRgl6DKgICAQECgThNAQEBAQEBZieEQQEBAQMBOhwaCQULCAMSBgklDwUlAw0UExuIBwfDPwEBCAIeGYVAhBGBAoQpg0GCKwWXTESODYFxh3aFNEWOa2KCBRuBXSowh0OBPQEBAQ Received: from ppp118-211-196-207.lns20.syd4.internode.on.net (HELO dastard) ([118.211.196.207]) by ipmail07.adl2.internode.on.net with ESMTP; 26 Apr 2016 17:57:25 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1auyKt-0007yl-RF; Tue, 26 Apr 2016 18:27:11 +1000 Date: Tue, 26 Apr 2016 18:27:11 +1000 From: Dave Chinner To: Dan Williams Cc: "Verma, Vishal L" , "linux-block@vger.kernel.org" , "jack@suse.cz" , "axboe@fb.com" , "linux-nvdimm@ml01.01.org" , "linux-kernel@vger.kernel.org" , "xfs@oss.sgi.com" , "hch@infradead.org" , "linux-mm@kvack.org" , "Wilcox, Matthew R" , "linux-fsdevel@vger.kernel.org" , "akpm@linux-foundation.org" , "linux-ext4@vger.kernel.org" , "viro@zeniv.linux.org.uk" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Message-ID: <20160426082711.GC26977@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io References: <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> <20160425232552.GD18496@dastard> <20160426001157.GE18496@dastard> <20160426025645.GG18496@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1461659246 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7199 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29065 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Apr 25, 2016 at 09:18:42PM -0700, Dan Williams wrote: > On Mon, Apr 25, 2016 at 7:56 PM, Dave Chinner wrote: > > On Mon, Apr 25, 2016 at 06:45:08PM -0700, Dan Williams wrote: > >> > I haven't seen any design/documentation for infrastructure at the > >> > application layer to handle redundant data and correctly > >> > transparently so I don't have any idea what the technical > >> > requirements this different IO stack places on filesystems may be. > >> > Hence I'm asking for some kind of architecture/design documentation > >> > that I can read to understand exactly what is being proposed here... > >> > >> I think this is a discussion for a solution that would build on top of > >> this basic "here are the errors, re-write them with good data if you > >> can; otherwise, best of luck" foundation. Something like a DAX-aware > >> device mapper layer that duplicates data tagged with REQ_META so at > >> least we have a recovery path when a sector error lands in critical > >> filesystem-metadata. > > > > Filesytsem metadata is not the topic of discussion here - it's > > user data that throws an error on a DAX load/store that is the > > issue. > > Which is not a new problem since volatile DRAM in the non-DAX case can > throw the exact same error. They are not the same class of error, not by a long shot. The "bad page in page cache" error on traditional storage means data is not lost - the original copy still in whatever storage medium that the cached page was filled from. i.e. Re-read the file and the data is still there, which is no different to crashing and restarting that machine and losing whatever writes had not been committed to stable storage.. In the pmem case, a "bad page" is a permanent loss of data - it's unrecoverable without some form data recovery operation being performed on the storage. > The current recovery model there is crash > the kernel (without MCE recovery), Ouch. Permanent data loss and a system wide DoS. > or crash the application and hope > the kernel maps out the page or the application knows how to restart > after SIGBUS. Not much better - neither provide a mechanism for recovery. > Memory mirroring is meant to make this a bit less > harsh, but there's no mechanism to make this available outside the > kernel. Which implies that we need a DM module that interfaces with the hardware memory mirroring to perform recovery and remapping operations. i.e. in the traditional storage stack location. > >> However, anything we come up with to make NVDIMM > >> errors more survivable should be directly applicable to traditional > >> disk storage as well. > > > > I'm not sure it does. DAX implies that traditional block layer RAID > > infrastructure is not possible, nor are data CRCs, nor are any other > > sort of data transformations that are needed for redundancy at the > > device layers. Anything that relies on copying/modifying/stable data to > > provide redundancies needs to do such work at a place where it can > > stall userspace page faults. > > > > This is where pmem native filesystem designs like NOVA take over > > from traditional block based filesystems - they are designed around > > the ability to do atomic page-based operations for data protection > > and recovery operations. It is this mechanism that allows stable > > pages to be committed to permanent storage and as such, allow > > redundancy operations such as mirroring to be performed before > > operations are marked as "stable". > > > > I'm missing the bigger picture that is being aimed at here - what's the > > point of DAX if we have to turn it off if we want any sort of > > failure protection? What's the big plan for fully enabling DAX with > > robust error correction? Where is this all supposed to be leading > > to? > > > > NOVA and other solutions are free and encouraged to do a coherent > bottoms-up rethink of error handling on top of persistent memory > devices, in the meantime applications can only expect the legacy > SIGBUS and -EIO mechanisms are available. So I'm still trying to > connect how the "What would NOVA do?" discussion is anything but > orthogonal to hooking up SIGBUS and -EIO for traditional-filesystem > DAX. It's the only error model an application can expect because it's > the only one that currently exists. Yes, I get that. I'm not interested in the resultant fatal error delivery - I'm asking about what happens between the memory error and the delivery of the fatal "we've lost your data forever" error that gets delivered to userspace. i.e. I'm after a description of how error correction/recovery is supposed to be applied to DAX *before we report SIGBUS or EIO* to the application. What is the plan/model/vision for intercepting MCEs and recovering from them? e.g. how do we going to pull the good copy from hardware/software memory mirrors? What layer is supposed to be responsible for that? Is it different for hardware mirroring compared to a more traditional software dm-RAID1 solution? What requirements does software recovery imply - do we need stable page state for DAX (i.e. to prevent userspace modification while we make copies)? Do we need to remap LBAs in the storage stack iduring recovery when bad blocks are reported? If so, where does it get done? What atomicity and resiliency requirements are there for recovery? e.g. bad block is reported, system crashes - what needs to happen on reboot to have recovery work correctly? There's heaps of stuff that is completely undefined here - error handling is fucking hard at the best of times, but I'm struggling to understand even the basics of what is being proposed here apart from "pmem error == crash the application, maybe even the system". Future filesystems are only part of the solution here - infrastructure like access to hardware mirrored copies for recovery purposes will impact greatly on the design of upper layers and their performance (e.g. no need for RAID1 in a software layer), so we really need the model/architecture to be pretty clearly defined at the outset before people waste too much time going down paths that simply won't work on the hardware/infrastructure that is being provided.... > >> An I/O hint that flags > >> data that should be stored redundantly might be useful there as well. > > > > DAX doesn't have an IO path to hint with... :/ > > ...I was thinking traditional filesystem metadata operations through > the block layer. NOVA could of course do something better since it > always indirects userspace access through a filesystem managed page. It seems to me you are focussing on code/technologies that exist today instead of trying to define an architecture that is more optimal for pmem storage systems. Yes, working code is great, but if you can't tell people how things like robust error handling and redundancy are going to work in future then it's going to take forever for everyone else to handle such errors robustly through the storage stack... Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+431143db896eb6b1521d+4629+infradead.org+hch@bombadil.srs.infradead.org Tue Apr 26 03:32:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B976F7CCD for ; Tue, 26 Apr 2016 03:32:17 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 23BCDAC003 for ; Tue, 26 Apr 2016 01:32:17 -0700 (PDT) X-ASG-Debug-ID: 1461659533-04cbb00fe922ce30001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 0VY9TDMIuUzyyBGh (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 26 Apr 2016 01:32:14 -0700 (PDT) X-Barracuda-Envelope-From: BATV+431143db896eb6b1521d+4629+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1auyPi-0005Fk-7C; Tue, 26 Apr 2016 08:32:10 +0000 Date: Tue, 26 Apr 2016 01:32:10 -0700 From: "hch@infradead.org" To: Jeff Moyer Cc: "hch@infradead.org" , "Verma, Vishal L" , "axboe@fb.com" , "jack@suse.cz" , "linux-nvdimm@ml01.01.org" , "david@fromorbit.com" , "linux-kernel@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-block@vger.kernel.org" , "linux-mm@kvack.org" , "Wilcox, Matthew R" , "linux-fsdevel@vger.kernel.org" , "akpm@linux-foundation.org" , "linux-ext4@vger.kernel.org" , "viro@zeniv.linux.org.uk" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Message-ID: <20160426083210.GA364@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1461659534 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 688 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29065 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Apr 25, 2016 at 11:32:08AM -0400, Jeff Moyer wrote: > > EINVAL is a concern here. Not due to the right error reported, but > > because it means your current scheme is fundamentally broken - we > > need to support I/O at any alignment for DAX I/O, and not fail due to > > alignbment concernes for a highly specific degraded case. > > > > I think this whole series need to go back to the drawing board as I > > don't think it can actually rely on using direct I/O as the EIO > > fallback. > > The only callers of dax_do_io are direct_IO methods. They are because the DAX I/O pass is a mess, but that doesn't mean the user specific O_DIRECT on the open nessecarily. From BATV+431143db896eb6b1521d+4629+infradead.org+hch@bombadil.srs.infradead.org Tue Apr 26 03:33:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 47F097CCF for ; Tue, 26 Apr 2016 03:33:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0850030404E for ; Tue, 26 Apr 2016 01:33:39 -0700 (PDT) X-ASG-Debug-ID: 1461659614-04bdf0358e238c60001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id x2DdobY3C8YDIkIq (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 26 Apr 2016 01:33:35 -0700 (PDT) X-Barracuda-Envelope-From: BATV+431143db896eb6b1521d+4629+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1auyR2-0006Ol-Rz; Tue, 26 Apr 2016 08:33:32 +0000 Date: Tue, 26 Apr 2016 01:33:32 -0700 From: "hch@infradead.org" To: "Verma, Vishal L" Cc: "hch@infradead.org" , "Wilcox, Matthew R" , "linux-kernel@vger.kernel.org" , "linux-block@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-nvdimm@ml01.01.org" , "jmoyer@redhat.com" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , "david@fromorbit.com" , "jack@suse.cz" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Message-ID: <20160426083332.GB364@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1461604476.3106.12.camel@intel.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1461659615 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 840 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29065 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Apr 25, 2016 at 05:14:36PM +0000, Verma, Vishal L wrote: > - Application hits EIO doing dax_IO or load/store io > > - It checks badblocks and discovers it's files have lost data > > - It write()s those sectors (possibly converted to file offsets using > fiemap) > ?? ?? * This triggers the fallback path, but if the application is doing > this level of recovery, it will know the sector is bad, and write the > entire sector This sounds like a mess. > I think if we want to keep allowing arbitrary alignments for the > dax_do_io path, we'd need: > 1. To represent badblocks at a finer granularity (likely cache lines) > 2. To allow the driver to do IO to a *block device* at sub-sector > granularity It's not a block device if it supports DAX. It's byte addressable memory masquerading as a block device. From age_defying_skincare-xfs=oss.sgi.com@tab-brand.com Tue Apr 26 04:15:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_IMAGE_RATIO_02, HTML_MESSAGE,T_DKIM_INVALID,T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0FC657CD3 for ; Tue, 26 Apr 2016 04:15:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D66C68F8035 for ; Tue, 26 Apr 2016 02:15:09 -0700 (PDT) X-ASG-Debug-ID: 1461662106-04bdf0358e2399e0001-NocioJ Received: from mail.tab-brand.com (til246.members.turizm.com [94.156.132.246]) by cuda.sgi.com with ESMTP id R4kqKaFIUiFQxIUy for ; Tue, 26 Apr 2016 02:15:07 -0700 (PDT) X-Barracuda-Envelope-From: age_defying_skincare-xfs=oss.sgi.com@tab-brand.com X-Barracuda-Effective-Source-IP: til246.members.turizm.com[94.156.132.246] X-Barracuda-Apparent-Source-IP: 94.156.132.246 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=dkim; d=tab-brand.com; h=Date:From:To:Subject:MIME-Version:Content-Type:Message-ID; i=age_defying_skincare@tab-brand.com; bh=P+UOIxr3vHZdHNsjUKJc5RuDDnw=; b=hIQJt1ge/mu1htLT0iAHLpxaS9xFoV3k1/VcRqIinBJ/qkdqeEzWCeI4qunWndfy+ryqgpXHSTKw rbGiy2hcun9NHxQ+ZzA2KFPoQT8hdy3yVMJ0+aNJ9yzHrD45BngprqOWutXiB6/Y2vj6HHkseL/b D7eWoMNZUF8wZbKxqFM= DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=dkim; d=tab-brand.com; b=iJmaiZtncLYB9rg9u+KYZBQs/lnRoXyxdmmVV7umimGDwJDBz+bHQFxdBk4HXugLdMWhysFeN1ny n9vOFZxd+etwWx7kRp4qc7Ltkua5iFsZpDpiQUuFPfO8I+YLMuWcBnGIW7oCx397q500rqo4NO+v L2PEi7v6y7YCE6K9jkk=; Received: by mail.tab-brand.com id h3sp180001gf for ; Tue, 26 Apr 2016 04:11:27 -0500 (envelope-from ) Date: Tue, 26 Apr 2016 04:11:27 -0500 From: "Age Defying Skincare" To: Subject: Instantly Conceal All Imperfections MIME-Version: 1.0 X-ASG-Orig-Subj: Instantly Conceal All Imperfections Content-Type: multipart/alternative; boundary="----=_Part_367_1290601775.1461661541974" Message-ID: <0.0.0.28.1D19F9B9CD822C8.335DC1@mail.tab-brand.com> X-Barracuda-Connect: til246.members.turizm.com[94.156.132.246] X-Barracuda-Start-Time: 1461662106 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5331 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.55 X-Barracuda-Spam-Status: No, SCORE=0.55 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_RATIO_02, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29066 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.55 HTML_IMAGE_RATIO_02 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message ------=_Part_367_1290601775.1461661541974 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Instantly Conceal All Imperfections http://www.tab-brand.com/a43w86K52d8ZsnFjnn0ntv0Mjh940/fine/green Update Preferences- http://www.tab-brand.com/ad98ho652es3ZsnFjnn0ntv0Mjh3fb/blue ------=_Part_367_1290601775.1461661541974 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit mst_email2

    Instantly Conceal All Imperfections

     
    Erase All Imperfection In Just 15 Seconds!
    Instantly produces a flawless airbrush look - Diminish the look of wrinkles & fine lines - Protect   Reverse signs of skin damage - Perfectly conceals ALL imperfections: Signs of aging - Redness - Acne - Dark Circles - Pores
    Kelly Monaco, Actress and Emmy Award Nominee - Berore and After
    Try it today! - Click here
    Day & Night Skin Perfecting Breakthrough!
    Within seconds, WRINKLES start to vanish. SKIN TEXTURE and SKIN TONE appears nearly flawless. PORES begin to disappear... all while the anti-aging natural actives deliver advanced long term benefits!
    Get Started
    It's Science. It's Research. It's Innovation. It's Beauty...Its Miracle Skin Transformer

    Update Preferences


    P.O Box 310 Hoboken, NJ 07030










     


    ------=_Part_367_1290601775.1461661541974-- From odellcaw@gmail.com Tue Apr 26 04:41:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.5 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID,URI_NOVOWEL autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B04327CD2 for ; Tue, 26 Apr 2016 04:41:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 46C438F8033 for ; Tue, 26 Apr 2016 02:41:22 -0700 (PDT) X-ASG-Debug-ID: 1461663677-04cb6c09a1261030001-NocioJ Received: from mail-pf0-f195.google.com (mail-pf0-f195.google.com [209.85.192.195]) by cuda.sgi.com with ESMTP id 5M0CAEakimUwSEUi (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 26 Apr 2016 02:41:18 -0700 (PDT) X-Barracuda-Envelope-From: odellcaw@gmail.com X-Barracuda-Effective-Source-IP: mail-pf0-f195.google.com[209.85.192.195] X-Barracuda-Apparent-Source-IP: 209.85.192.195 Received: by mail-pf0-f195.google.com with SMTP id 145so1063032pfz.1 for ; Tue, 26 Apr 2016 02:41:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:from:to:subject:date:mime-version; bh=YsCUfXNn2YOQxcXls2GSS3rRTJpOZtH+xu1y/1JyPXM=; b=eULqejmnYNoETDylh3V5mCI5v34r5YEqjjJkWiu8JD/0i3OfvaS36zab4OP1ABSNjM 8f2Md+7O+Uz5q2WpNM5GHKeYTBwfRbuaM+G+6Z7yr+23klhwA3o1/6FH4sQM41TXVApC rdsVuXYz3erHsIkoKdOKtCMePVkN55F5LB5EaONz+2jn/NFSOY/XS0EyKq/RkiutBJzy HOhS6uZFP3LShQErWm6q3z9085QFg3BoRjGT9WJ4bUwyDnQjmJkaYLp7KOxwUg5JX9Br 2E7wKLSd6L7tEEaE2R6qxJnsSwOB5tBUSj5/EExOCQ3FLk+dH8GSWwhXOaJHSX/95kFg ae7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:from:to:subject:date:mime-version; bh=YsCUfXNn2YOQxcXls2GSS3rRTJpOZtH+xu1y/1JyPXM=; b=c+TsKnrS3aCtgRvqllmU3axjmozlNgLPaL6Ub4Ss/sK8t0wAUmuvoULlJXgaH4g4+K 5Yku2D4PRlLRECrK7uCN955m6STd2AvIuZ1jUfu44ZkLFw8c0fjVBRK01pP9KwBYTrUb cLP1ODOPYD4FCB4jTmSjqle/A8q6cctSmJ2IRBHoeUJwAjhUjL0itDCyTErQQ5eTlmFG rHnO+j/Q8P/CTSIqgnKJTLN2P59VHEaO1H0SkeWlow8GEj7pa4nePm+uZgAWpnMChWZq FPMCUs0RNxhC7C28gUdXsjLlTfMhX3nS5LtZnrxz/HY0qedCK2xaaLJULWlUxrDsduHs BzDA== X-Gm-Message-State: AOPr4FUZVKwNw7MmLIRcs9JODc6orKLICk8iFMI0c2q6Mhg8oHOYXVsSJTflmkLBvfuSWA== X-Received: by 10.98.102.207 with SMTP id s76mr898275pfj.54.1461663677732; Tue, 26 Apr 2016 02:41:17 -0700 (PDT) Received: from bigfoot.com ([180.155.84.57]) by smtp.gmail.com with ESMTPSA id lq10sm36573004pab.36.2016.04.26.02.41.13 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 26 Apr 2016 02:41:15 -0700 (PDT) Message-ID: <20160426174115168727@gmail.com> From: "Alice" To: Subject: No Extra Cable Boxes, No Extra Fees Date: Tue, 26 Apr 2016 17:41:09 +0800 X-ASG-Orig-Subj: No Extra Cable Boxes, No Extra Fees MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0AC2_01BB5FB2.16E49E90" X-Priority: 1 X-mailer: Pvbkrz 3 X-Barracuda-Connect: mail-pf0-f195.google.com[209.85.192.195] X-Barracuda-Start-Time: 1461663678 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 12880 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_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, TO_CC_NONE, URI_NOVOWEL X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29066 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.50 URI_NOVOWEL URI: URI hostname has long non-vowel sequence 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 TO_CC_NONE No To: or Cc: header This is a multi-part message in MIME format. ------=_NextPart_000_0AC2_01BB5FB2.16E49E90 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: base64 DQoNCg0KIA0KTmV3IHllYXIncyBncmVldGluZ3MgdG8geW91IGFuZCB5b3VycyENCg0KDQpEaWQg eW91IGtub3cgeW91IGNvdWxkIHdhdGNoIGRpZmZlcmVudCBjaGFubmVscyBvbiAyIGRpZmZlcmVu dCBUVidzIHVzaW5nIG9ubHkgb25lIGNhYmxlIGxpbmUgb3IgZnJvbSBvbmUgcm9vbSB0byBhbm90 aGVyPw0KDQoNCkZpbmQgb3V0IE1vcmUNCg0KDQoNCg0KU2luY2UgMTk4NywgQUlUZWNoIGhhcyBi ZWVuIHRoZSB3b3JsZCBsZWFkZXIgaW4gUEMtVFYgbXVsdGltZWRpYSBjb25uZWN0aXZpdHksIGFu ZCBjb252ZXJzaW9uIHRlY2hub2xvZ2llcyBmb3Igb3ZlciAyNyB5ZWFycy4gVGhlIHByb2R1Y3Rz IGluY2x1ZGUgYWxsIG5lY2Vzc2FyeSB2aWRlbyBhY2Nlc3Nvcmllcy4gV2Ugb3duIG11bHRpcGxl IHBhdGVudHMgb24gb3VyIHRlY2hub2xvZ2llcyBhbmQgb3VyIHByb2R1Y3RzIGFyZSBleGNlZWRp bmcgaW5kdXN0cnkgc3RhbmRhcmRzLg0KDQoNCiAg ------=_NextPart_000_0AC2_01BB5FB2.16E49E90 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPjxUSVRMRT48L1RJVExFPg0KPE1FVEEgY29udGVudD0idGV4dC9o dG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIGh0dHAtZXF1aXY9Y29udGVudC10eXBlPg0KPE1FVEEg bmFtZT1HRU5FUkFUT1IgY29udGVudD0iTVNIVE1MIDExLjAwLjk2MDAuMTgyODMiPjwvSEVBRD4N CjxCT0RZPg0KPERJViBjbGFzcz1PdXRlckJHQ29sb3IgDQpzdHlsZT0iQkFDS0dST1VORC1JTUFH RTogdXJsKGh0dHBzOi8vc3RhdGljLmN0Y3RjZG4uY29tL2dhbGlsZW8vaW1hZ2VzL3RlbXBsYXRl cy9HYWxpbGVvLVRlbXBsYXRlLUltYWdlcy9XaW50ZXJIb2xpZGF5Mi9PdXRlckJHSW1hZ2UucG5n KTsgV0hJVEUtU1BBQ0U6IG5vcm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IFRFWFQtVFJBTlNGT1JN OiBub25lOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVDogbWVkaXVtICdUaW1lcyBOZXcgUm9tYW4n OyBXSURPV1M6IDE7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6IHJn YigxNCw0OSwxMzEpOyBURVhULUlOREVOVDogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRo OiAwcHgiIA0KYWxpZ249Y2VudGVyIGJnY29sb3I9IiMwZTMxODMiIA0KYmFja2dyb3VuZD0iaHR0 cHM6Ly9zdGF0aWMuY3RjdGNkbi5jb20vZ2FsaWxlby9pbWFnZXMvdGVtcGxhdGVzL0dhbGlsZW8t VGVtcGxhdGUtSW1hZ2VzL1dpbnRlckhvbGlkYXkyL091dGVyQkdJbWFnZS5wbmciPg0KPFRBQkxF IGNsYXNzPU91dGVyQkdDb2xvciANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU4tTEVG VDogYXV0bzsgTUFSR0lOLVJJR0hUOiBhdXRvIiBjZWxsU3BhY2luZz0wIA0KY2VsbFBhZGRpbmc9 MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCBjbGFz cz1IaWRlSW5Nb2JpbGUgDQogICAgc3R5bGU9IkZPTlQtRkFNSUxZOiBhcmlhbCwgdmVyZGFuYSwg c2Fucy1zZXJpZjsgTElORS1IRUlHSFQ6IDEuNjY2Ij48SU1HIA0KICAgICAgc3R5bGU9IkJPUkRF Ui1UT1A6IDBweDsgQk9SREVSLVJJR0hUOiAwcHg7IEJPUkRFUi1CT1RUT006IDBweDsgQk9SREVS LUxFRlQ6IDBweCIgDQogICAgICBib3JkZXI9MCBoc3BhY2U9MCBhbHQ9IiIgDQogICAgICBzcmM9 Imh0dHBzOi8vc3RhdGljLmN0Y3RjZG4uY29tL2xldHRlcnMvaW1hZ2VzLzExMDExMTY3ODQyMjEv Uy5naWYiIA0KICAgICAgd2lkdGg9MSBoZWlnaHQ9NT48L1REPg0KICAgIDxURCBjbGFzcz1NYWlu V2lkdGggDQogICAgc3R5bGU9IkZPTlQtRkFNSUxZOiBhcmlhbCwgdmVyZGFuYSwgc2Fucy1zZXJp ZjsgV0lEVEg6IDYyMHB4OyBMSU5FLUhFSUdIVDogMS42NjYiIA0KICAgIHZBbGlnbj10b3Agd2lk dGg9NjIwIGFsaWduPWNlbnRlcj4NCiAgICAgIDxESVYgY2xhc3M9TWF4TWFpbldpZHRoIA0KICAg ICAgc3R5bGU9Ik1BWC1XSURUSDogNjIwcHg7IE1BUkdJTi1MRUZUOiBhdXRvOyBNQVJHSU4tUklH SFQ6IGF1dG8iIA0KICAgICAgYWxpZ249Y2VudGVyPg0KICAgICAgPFRBQkxFIHN0eWxlPSJURVhU LUFMSUdOOiBsZWZ0IiBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTAgd2lkdGg9IjEwMCUiIA0K ICAgICAgYm9yZGVyPTA+DQogICAgICAgIDxUQk9EWT4NCiAgICAgICAgPFRSPg0KICAgICAgICAg IDxURCBjbGFzcz1Cb2R5UGFkZGluZyANCiAgICAgICAgICBzdHlsZT0iRk9OVC1GQU1JTFk6IGFy aWFsLCB2ZXJkYW5hLCBzYW5zLXNlcmlmOyBQQURESU5HLUJPVFRPTTogMTVweDsgUEFERElORy1U T1A6IDE1cHg7IFBBRERJTkctTEVGVDogNXB4OyBMSU5FLUhFSUdIVDogMS42NjY7IFBBRERJTkct UklHSFQ6IDVweCIgDQogICAgICAgICAgdkFsaWduPXRvcCBhbGlnbj1jZW50ZXI+PEJSPg0KICAg ICAgICAgICAgPFRBQkxFIGNsYXNzPUJvcmRlckNvbG9yIA0KICAgICAgICAgICAgc3R5bGU9IkJB Q0tHUk9VTkQtSU1BR0U6IG5vbmU7IEJBQ0tHUk9VTkQtQVRUQUNITUVOVDogc2Nyb2xsOyBCQUNL R1JPVU5ELVBPU0lUSU9OOiAwJSA1MCU7IFRFWFQtQUxJR046IGxlZnQ7IEJBQ0tHUk9VTkQtQ09M T1I6IHRyYW5zcGFyZW50IiANCiAgICAgICAgICAgIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9 MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+DQogICAgICAgICAgICAgIDxUQk9EWT4NCiAgICAgICAg ICAgICAgPFRSPg0KICAgICAgICAgICAgICAgIDxURCBjbGFzcz1Cb3JkZXJXaWR0aCANCiAgICAg ICAgICAgICAgICBzdHlsZT0iRk9OVC1GQU1JTFk6IGFyaWFsLCB2ZXJkYW5hLCBzYW5zLXNlcmlm OyBQQURESU5HLUJPVFRPTTogMHB4OyBQQURESU5HLVRPUDogMHB4OyBQQURESU5HLUxFRlQ6IDBw eDsgTElORS1IRUlHSFQ6IDEuNjY2OyBQQURESU5HLVJJR0hUOiAwcHgiIA0KICAgICAgICAgICAg ICAgIHZBbGlnbj10b3Agd2lkdGg9IjEwMCUiIGFsaWduPWNlbnRlcj4NCiAgICAgICAgICAgICAg ICAgIDxUQUJMRSBjbGFzcz1Jbm5lckJHQ29sb3IgDQogICAgICAgICAgICAgICAgICBzdHlsZT0i VEVYVC1BTElHTjogbGVmdDsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KSIgDQog ICAgICAgICAgICAgICAgICBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTAgd2lkdGg9IjEwMCUi IGJnQ29sb3I9I2ZmZmZmZiANCiAgICAgICAgICAgICAgICAgIGJvcmRlcj0wPg0KICAgICAgICAg ICAgICAgICAgICA8VEJPRFk+DQogICAgICAgICAgICAgICAgICAgIDxUUj4NCiAgICAgICAgICAg ICAgICAgICAgICA8VEQgY2xhc3M9RW1haWxDb250YWluZXIgDQogICAgICAgICAgICAgICAgICAg ICAgc3R5bGU9IkZPTlQtRkFNSUxZOiBhcmlhbCwgdmVyZGFuYSwgc2Fucy1zZXJpZjsgUEFERElO Ry1CT1RUT006IDBweDsgUEFERElORy1UT1A6IDBweDsgUEFERElORy1MRUZUOiAwcHg7IExJTkUt SEVJR0hUOiAxLjY2NjsgUEFERElORy1SSUdIVDogMHB4IiANCiAgICAgICAgICAgICAgICAgICAg ICB2QWxpZ249dG9wIHdpZHRoPSIxMDAlIiBhbGlnbj1jZW50ZXI+DQogICAgICAgICAgICAgICAg ICAgICAgICA8VEFCTEUgaWQ9Y29udGVudF9MRVRURVIuQkxPQ0sxOSANCiAgICAgICAgICAgICAg ICAgICAgICAgIHN0eWxlPSJURVhULUFMSUdOOiBsZWZ0IiBjZWxsU3BhY2luZz0wIGNlbGxQYWRk aW5nPTAgDQogICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+DQog ICAgICAgICAgICAgICAgICAgICAgICAgIDxUQk9EWT4NCiAgICAgICAgICAgICAgICAgICAgICAg ICAgPFRSPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxURCBjbGFzcz0iSW1hZ2UgTWFp blRleHQiIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJGT05ULVNJWkU6IDEx cHQ7IEZPTlQtRkFNSUxZOiBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IENPTE9SOiByZ2IoMTE4LDEx OCwxMTgpOyBQQURESU5HLUJPVFRPTTogMHB4OyBQQURESU5HLVRPUDogMHB4OyBQQURESU5HLUxF RlQ6IDBweDsgTElORS1IRUlHSFQ6IDEuNjY2OyBQQURESU5HLVJJR0hUOiAwcHgiIA0KICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHZBbGlnbj10b3AgYWxpZ249Y2VudGVyPjxCUj48SU1HIA0K ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRFUi1UT1A6IDBweDsgSEVJ R0hUOiAyNDBweDsgQk9SREVSLVJJR0hUOiAwcHg7IFdJRFRIOiA1NjlweDsgQk9SREVSLUJPVFRP TTogMHB4OyBCT1JERVItTEVGVDogMHB4IiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGFsdD0iIiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz0iaHR0cDovL3d3dy5h aXRlY2guY29tL3BpY3R1cmVzL3dpcmVsZXNzY2FibGV0di1oZWFkZXIuanBnIj48QlI+DQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICA8VEFCTEUgY2xhc3M9Ik9uZUNvbHVtbk1vYmlsZSBD Q19Ob0VkaXQiIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IlRFWFQtQUxJ R046IGxlZnQ7IE1BUkdJTjogMHB4IiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNl bGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MCB3aWR0aD02MDAgDQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBkYXRhLXBhZGRpbmctY29udmVydGVkPSJ0cnVlIj4NCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgPFRCT0RZPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICA8VFI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxURCANCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkZPTlQtRkFNSUxZOiBhcmlhbCwgdmVyZGFuYSwg c2Fucy1zZXJpZjsgQ09MT1I6IHJnYigxMTgsMTE4LDExOCk7IFBBRERJTkctQk9UVE9NOiAwcHg7 IFBBRERJTkctVE9QOiAwcHg7IFBBRERJTkctTEVGVDogMHB4OyBMSU5FLUhFSUdIVDogMS42NjY7 IFBBRERJTkctUklHSFQ6IDBweCIgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdp ZHRoPSIxJSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxESVYgYWxpZ249Y2Vu dGVyPjxJTUcgY2xhc3M9Y2MtaW1hZ2UtcmVzaXplIA0KICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBzdHlsZT0iTUFYLVdJRFRIOiAxMDAlOyBCT1JERVItVE9QOiAwcHg7IEhFSUdIVDog YXV0byAhaW1wb3J0YW50OyBCT1JERVItUklHSFQ6IDBweDsgQk9SREVSLUJPVFRPTTogMHB4OyBC T1JERVItTEVGVDogMHB4OyBESVNQTEFZOiBibG9jayIgDQogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGJvcmRlcj0wIGhzcGFjZT0wIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBzcmM9ImZpbGU6Ly8vQzovVXNlcnMvZmVpeXV0aW5nL0Rlc2t0b3AvMui2Lue6p+YtJm5i c3A7PyMxNDk7Tz8jMTUzO3M/IzEzOTtZPyMxMzA7ruS7tue+pOU/IzE0NTs/c2h5O6PlvI8/IzEz NzteJTIwLSUyMD8jMTM3O6/mbz8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0 aD02MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PTI1Mz48L0RJVj48L1RE PjwvVFI+PC9UQk9EWT48L1RBQkxFPjxCUj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPiAgICAg ICAgICAgICAgICAgICAgICAgIDxUQUJMRSBpZD1jb250ZW50X0xFVFRFUi5CTE9DSzIwICAgICAg ICAgICAgICAgICAgICAgICAgIHN0eWxlPSIgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHdpZHRoPSIxMDAlIiBURVhULUFMSUdOOiBsZWZ0PyBjZWxsU3BhY2luZz0iMCIgDQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxQYWRkaW5nPSIwIj4gPC9ESVY+PC9URD48 L1RSPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VEJPRFk+DQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIDxUUj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgPFREIGNsYXNzPSJIZWFkbGluZUNvbnRlbnQgSGVhZGxpbmVUZXh0IiANCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkZPTlQtU0laRTogMThwdDsgRk9OVC1GQU1JTFk6 IEdlb3JnaWEsIFRpbWVzLCAnVGltZXMgTmV3IFJvbWFuJywgc2VyaWY7IEZPTlQtV0VJR0hUOiBi b2xkOyBDT0xPUjogcmdiKDAsMjIsMTAzKTsgUEFERElORy1CT1RUT006IDlweDsgUEFERElORy1U T1A6IDhweDsgUEFERElORy1MRUZUOiAyMHB4OyBMSU5FLUhFSUdIVDogMS42NjY7IFBBRERJTkct UklHSFQ6IDIwcHgiIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2QWxpZ249dG9w IGFsaWduPWNlbnRlcj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPERJVj48ST5O ZXcgeWVhcidzIGdyZWV0aW5ncyB0byB5b3UgYW5kIA0KICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB5b3VycyE8QlI+PC9JPjwvRElWPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VEFCTEUgaWQ9Y29udGVudF9MRVRURVIuQkxP Q0syMSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJURVhULUFMSUdOOiBs ZWZ0IiBjZWxsU3BhY2luZz0wIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFBh ZGRpbmc9MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+DQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDxUQk9EWT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRSPg0KICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VEQgY2xhc3M9IkNvbnRlbnQgTWFpblRleHQi IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iRk9OVC1TSVpFOiAxMXB0 OyBGT05ULUZBTUlMWTogSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBDT0xPUjogcmdiKDExOCwxMTgs MTE4KTsgUEFERElORy1CT1RUT006IDlweDsgUEFERElORy1UT1A6IDhweDsgUEFERElORy1MRUZU OiAyMHB4OyBMSU5FLUhFSUdIVDogMS42NjY7IFBBRERJTkctUklHSFQ6IDIwcHgiIA0KICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB2QWxpZ249dG9wIGFsaWduPWNlbnRlcj4NCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgPERJVj48QlI+PFNQQU4gY2xhc3M9SGVhZGxpbmVU ZXh0IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iRk9OVC1TSVpFOiAx OHB0OyBGT05ULUZBTUlMWTogR2VvcmdpYSwgVGltZXMsICdUaW1lcyBOZXcgUm9tYW4nLCBzZXJp ZjsgRk9OVC1XRUlHSFQ6IGJvbGQ7IENPTE9SOiByZ2IoMCwyMiwxMDMpIj5EaWQgDQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHlvdSBrbm93IHlvdSBjb3VsZCB3YXRjaCBkaWZmZXJl bnQgY2hhbm5lbHMgb24gMiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVy ZW50IFRWJ3MgdXNpbmcgb25seSBvbmUgY2FibGUgbGluZSBvciBmcm9tIA0KICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBvbmUgcm9vbSB0byANCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgYW5vdGhlcj88L1NQQU4+PEJSPjwvRElWPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFC TEU+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VEFCTEUgaWQ9Y29udGVudF9MRVRU RVIuQkxPQ0syMiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJURVhULUFM SUdOOiBsZWZ0IiBjZWxsU3BhY2luZz0wIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Y2VsbFBhZGRpbmc9MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+DQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIDxUQk9EWT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRS Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VEQgY2xhc3M9Ik91dGVyVGV4dCBM b2dvIiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkZPTlQtRkFNSUxZ OiBhcmlhbCwgdmVyZGFuYSwgc2Fucy1zZXJpZjsgQ09MT1I6IHJnYigwLDAsMCk7IFBBRERJTkct Qk9UVE9NOiAxNXB4OyBQQURESU5HLVRPUDogMTVweDsgUEFERElORy1MRUZUOiAwcHg7IExJTkUt SEVJR0hUOiAxLjY2NjsgUEFERElORy1SSUdIVDogMHB4IiANCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgdkFsaWduPXRvcCBhbGlnbj1jZW50ZXI+PElNRyANCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRFUi1UT1A6IDBweDsgSEVJR0hUOiAyMDFweDsg Qk9SREVSLVJJR0hUOiAwcHg7IFdJRFRIOiAxNTZweDsgQk9SREVSLUJPVFRPTTogMHB4OyBCT1JE RVItTEVGVDogMHB4IiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PSIiIA0K ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9Imh0dHA6Ly93d3cuYWl0ZWNoLmNv bS9waWN0dXJlcy93Y2F0dmljb241LmpwZyI+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUQUJMRSBzdHlsZT0iVEVYVC1BTElHTjogbGVm dCIgY2VsbFNwYWNpbmc9MCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxQYWRk aW5nPTAgd2lkdGg9IjEwMCUiIGJvcmRlcj0wPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICA8VEJPRFk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUUj4NCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgPFREIGNsYXNzPVNvY2lhbE1lZGlhUGFkZGluZyAN CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkZPTlQtRkFNSUxZOiBhcmlh bCwgdmVyZGFuYSwgc2Fucy1zZXJpZjsgUEFERElORy1CT1RUT006IDlweDsgUEFERElORy1UT1A6 IDhweDsgUEFERElORy1MRUZUOiAwcHg7IExJTkUtSEVJR0hUOiAxLjY2NjsgUEFERElORy1SSUdI VDogMHB4IiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdkFsaWduPXRvcCB3aWR0 aD0iMTAwJSIgYWxpZ249Y2VudGVyPjxTUEFOIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBjbGFzcz1IZWFkbGluZVRleHQgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHN0eWxlPSJGT05ULVNJWkU6IDE4cHQ7IEZPTlQtRkFNSUxZOiBHZW9yZ2lhLCBUaW1lcywgJ1Rp bWVzIE5ldyBSb21hbicsIHNlcmlmOyBGT05ULVdFSUdIVDogYm9sZDsgQ09MT1I6IHJnYigwLDIy LDEwMykiPjxBIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQ09MT1I6 IHJnYigxOSwxMjksNjgpIiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj0i aHR0cDovL3d3dy5haXRlY2guY29tL3Byb2R1Y3RzL3dpcmVsZXNzY2FibGV0di5odG0iPkZpbmQg DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBNb3JlPC9BPjxCUj48L1NQQU4+ PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDxUQUJMRSBzdHlsZT0iVEVYVC1BTElHTjogbGVmdCIgY2VsbFNwYWNpbmc9MCANCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGNlbGxQYWRkaW5nPTAgd2lkdGg9IjEwMCUiIGJvcmRlcj0w Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VEJPRFk+DQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIDxUUj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg PFREIGNsYXNzPVNwYWNlckhlaWdodCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg c3R5bGU9IkhFSUdIVDogMXB4OyBGT05ULUZBTUlMWTogYXJpYWwsIHZlcmRhbmEsIHNhbnMtc2Vy aWY7IFBBRERJTkctQk9UVE9NOiAxOXB4OyBMSU5FLUhFSUdIVDogMXB4IiANCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PTEgYWxpZ249Y2VudGVyPjxJTUcgDQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItVE9QOiAwcHg7IEhFSUdIVDog MXB4OyBCT1JERVItUklHSFQ6IDBweDsgV0lEVEg6IDVweDsgQk9SREVSLUJPVFRPTTogMHB4OyBC T1JERVItTEVGVDogMHB4OyBESVNQTEFZOiBibG9jayIgDQogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGJvcmRlcj0wIGhzcGFjZT0wIGFsdD0iIiANCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgc3JjPSJodHRwczovL3N0YXRpYy5jdGN0Y2RuLmNvbS9sZXR0ZXJzL2ltYWdl cy8xMTAxMTE2Nzg0MjIxL1MuZ2lmIiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg d2lkdGg9NSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PTE+PC9URD48L1RSPjwv VEJPRFk+PC9UQUJMRT48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPjwvVEQ+PC9UUj48L1RCT0RZ PjwvVEFCTEU+DQogICAgICAgICAgICAgICAgICA8VEFCTEUgDQogICAgICAgICAgICAgICAgICBz dHlsZT0iRk9OVC1TVFlMRTogaXRhbGljOyBURVhULUFMSUdOOiBsZWZ0OyBCQUNLR1JPVU5ELUNP TE9SOiB0cmFuc3BhcmVudCIgDQogICAgICAgICAgICAgICAgICBjZWxsU3BhY2luZz0wIGNlbGxQ YWRkaW5nPTAgd2lkdGg9IjEwMCUiIGJvcmRlcj0wPg0KICAgICAgICAgICAgICAgICAgICA8VEJP RFk+DQogICAgICAgICAgICAgICAgICAgIDxUUj4NCiAgICAgICAgICAgICAgICAgICAgICA8VEQg Y2xhc3M9Qm90dG9tTWFyZ2luIA0KICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJGT05ULUZB TUlMWTogYXJpYWwsIHZlcmRhbmEsIHNhbnMtc2VyaWY7IFBBRERJTkctQk9UVE9NOiA4cHg7IFBB RERJTkctVE9QOiA5cHg7IFBBRERJTkctTEVGVDogMHB4OyBMSU5FLUhFSUdIVDogMS42NjY7IFBB RERJTkctUklHSFQ6IDBweCIgDQogICAgICAgICAgICAgICAgICAgICAgdkFsaWduPXRvcCB3aWR0 aD0iMTAwJSIgYWxpZ249Y2VudGVyPjxTUEFOIA0KICAgICAgICAgICAgICAgICAgICAgICAgc3R5 bGU9IkZPTlQtU0laRTogMThweDsgRk9OVC1GQU1JTFk6IEdhcmFtb25kLCAnVGltZXMgTmV3IFJv bWFuJywgVGltZXMsIHNlcmlmOyBGT05ULVZBUklBTlQ6IG5vcm1hbDsgV0hJVEUtU1BBQ0U6IG5v cm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBGT05ULVdFSUdI VDogbm9ybWFsOyBDT0xPUjogcmdiKDIyMSwyMTQsMTQyKTsgV0lET1dTOiAxOyBMRVRURVItU1BB Q0lORzogbm9ybWFsOyBMSU5FLUhFSUdIVDogbm9ybWFsOyBURVhULUlOREVOVDogMHB4Ij5TaW5j ZSANCiAgICAgICAgICAgICAgICAgICAgICAgIDE5ODcsIEFJVGVjaCBoYXMgYmVlbiB0aGUgd29y bGQgbGVhZGVyIGluIFBDLVRWIA0KICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGltZWRpYSBj b25uZWN0aXZpdHksIGFuZCBjb252ZXJzaW9uIHRlY2hub2xvZ2llcyBmb3IgDQogICAgICAgICAg ICAgICAgICAgICAgICBvdmVyIDI3IHllYXJzLiBUaGUgcHJvZHVjdHMgaW5jbHVkZSBhbGwgbmVj ZXNzYXJ5IHZpZGVvIA0KICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzb3JpZXMuIFdlIG93 biBtdWx0aXBsZSBwYXRlbnRzIG9uIG91ciB0ZWNobm9sb2dpZXMgDQogICAgICAgICAgICAgICAg ICAgICAgICBhbmQgb3VyIHByb2R1Y3RzIGFyZSBleGNlZWRpbmcgaW5kdXN0cnkgDQogICAgICAg ICAgICAgICAgICAgICAgc3RhbmRhcmRzLjwvU1BBTj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxF PjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQogICAgICAgICAgICA8RElWPjwvRElWPjwvVEQ+ DQogICAgICAgICAgPFREIGNsYXNzPUhpZGVJbk1vYmlsZSANCiAgICAgICAgICBzdHlsZT0iRk9O VC1GQU1JTFk6IGFyaWFsLCB2ZXJkYW5hLCBzYW5zLXNlcmlmOyBGT05ULVNUWUxFOiBpdGFsaWM7 IExJTkUtSEVJR0hUOiAxLjY2NjsgQkFDS0dST1VORC1DT0xPUjogdHJhbnNwYXJlbnQiPjxJTUcg DQogICAgICAgICAgICBzdHlsZT0iQk9SREVSLVRPUDogMHB4OyBCT1JERVItUklHSFQ6IDBweDsg Qk9SREVSLUJPVFRPTTogMHB4OyBCT1JERVItTEVGVDogMHB4IiANCiAgICAgICAgICAgIGJvcmRl cj0wIGhzcGFjZT0wIGFsdD0iIiANCiAgICAgICAgICAgIHNyYz0iZmlsZTovLy9DOi9Vc2Vycy9m ZWl5dXRpbmcvRGVza3RvcC8y6LYu57qn5i0mbmJzcDs/IzE0OTtPPyMxNTM7cz8jMTM5O1k/IzEz MDuu5Lu2576k5T8jMTQ1Oz9zaHk7o+W8jz8jMTM3O14lMjAtJTIwPyMxMzc7r+ZvPyAgICAgICB3 aWR0aD0xIGhlaWdodD01PjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+PC9ESVY+PFAgc3R5bGU9 IiANCiAgICAgICAgICAgIFdISVRFLVNQQUNFOiBXT1JELVNQQUNJTkc6IFRFWFQtVFJBTlNGT1JN OiBub25lOyBDT0xPUjogcmdiKDAsMCwwKTsgDQogICAgICAgICAgICBGT05UOiAxNHB4IDIzcHgg SGVsdmV0aWNhLCA/TWljcm9zb2Z0IFlhaGVpPywgdmVyZGFuYTsgDQogICAgICAgICAgICBMRVRU RVItU1BBQ0lORzogbm9ybWFsOyBURVhULUlOREVOVDogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tl LXdpZHRoOiANCiAgICAgICAgICAgIDBweD8+PEJSIGNsYXNzPUFwcGxlLWludGVyY2hhbmdlLW5l d2xpbmU+Jm5ic3A7IA0KICAgICAgICAgICAgPFA+PC9QPjwvVEQ+PC9UUj48L1RCT0RZPg0KICAg ICAgICA8RElWPjwvRElWPjwvVFI+PC9UQk9EWT4NCiAgICAgICAgPERJVj48L0RJVj48L0RJVj48 L1RSPjwvVEJPRFk+PC9ESVY+PC9CT0RZPjwvSFRNTD4NCg== ------=_NextPart_000_0AC2_01BB5FB2.16E49E90-- From shyam@zadarastorage.com Tue Apr 26 05:40:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4BB367CD2 for ; Tue, 26 Apr 2016 05:40:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9FDB8AC001 for ; Tue, 26 Apr 2016 03:40:44 -0700 (PDT) X-ASG-Debug-ID: 1461667238-04cb6c09a1262610001-NocioJ Received: from mail-wm0-f51.google.com (mail-wm0-f51.google.com [74.125.82.51]) by cuda.sgi.com with ESMTP id XOp29bI4HW4MkXlG (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 26 Apr 2016 03:40:39 -0700 (PDT) X-Barracuda-Envelope-From: shyam@zadarastorage.com X-Barracuda-Effective-Source-IP: mail-wm0-f51.google.com[74.125.82.51] X-Barracuda-Apparent-Source-IP: 74.125.82.51 Received: by mail-wm0-f51.google.com with SMTP id v188so119254911wme.1 for ; Tue, 26 Apr 2016 03:40:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=from:references:in-reply-to:mime-version:thread-index:date :message-id:subject:to; bh=RPU0ZuDzyFETT08pOLyli59e5hZtQ7Saavn71wbBx8Q=; b=A58CLFgarWfJfrIs/HlWjjkUTataytVaHnQ2poWpOus1+I1Y2HJryGaVJsaeeWFlcP 22UKwaYmLcUpSmEYE27nBaVkXNrL9z7fr/77fQ56dqM0hPl1zNEb+q44w4x8gy2Iq0Ey cTNqQ3umZ0OhlPhg1J8sfOqKduQC7+uYFpy6QR41sD3kfOZDNr6wzCZPdd7jUqUyzHit uD5v5AdWHFNZkAfF8pR/5TigPb6sh6uqhGp8sYyKNc6t7ldmb5m7VWUUfv6qLh3beMi0 jhyb9gGJiwmbFNRt08fAoVXiy213AwesWoMiHJ+x/LKGgfl5kv9g7Ku+QqeJ+UarBrbW 9AQw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:references:in-reply-to:mime-version :thread-index:date:message-id:subject:to; bh=RPU0ZuDzyFETT08pOLyli59e5hZtQ7Saavn71wbBx8Q=; b=FUiIb24XipvDBmg0L7qwR4qdVZLobKrog4C9rGFOdVddrke+7GUplM5pTuLmIGeBfp 08NXg7haDFM8e6fhNyHFI060W8NaQsAWhQ+YJ9esmoE8If7acCDl34aAo2/WDSzDRdK3 9SYk6Fl1XVOMf2z5AVGqu7rMWUCCkD1IhYHT/b77eJdnaOZebtikbV/Pl3ZA3osJN8Bb lGolI7TZ6sQE85XAkrz+J1KBnW64+U1VbG0VU1V2Bss1ABEWgDmh0i7RqwOE2cFEhDaz IyZPV4j2G0GU2AbnVc8vQ2vnikUB3uH3vYfYXmKSvQsbLf8rdFEYgQMW+zvCSzsL/8y2 a6wA== X-Gm-Message-State: AOPr4FUc4Fux1/MGhNU/KK2et56KC1HNfmkDxkuxa0kjt20A02UQrepoREsXR3CO11BUtHpyahep8VHlPIduXQ== X-Received: by 10.28.230.137 with SMTP id e9mr17708965wmi.90.1461667238588; Tue, 26 Apr 2016 03:40:38 -0700 (PDT) From: Shyam Kaushik References: 88e4a059c1428cb1f944b7e786cf8ed9@mail.gmail.com In-Reply-To: 88e4a059c1428cb1f944b7e786cf8ed9@mail.gmail.com MIME-Version: 1.0 X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AdGfErcWWkk1SSaGRUCD3x4h7vmm3gAjdNYQ Date: Tue, 26 Apr 2016 16:10:37 +0530 Message-ID: <7c2c798d9a484eb28ec0cc36c1e2a062@mail.gmail.com> Subject: RE: Metadata corruption detected at xfs_attr3_leaf_write_verify+0xe5/0x100 To: xfs@oss.sgi.com X-ASG-Orig-Subj: RE: Metadata corruption detected at xfs_attr3_leaf_write_verify+0xe5/0x100 Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wm0-f51.google.com[74.125.82.51] X-Barracuda-Start-Time: 1461667239 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5912 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29067 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi Eric, Yes this is a non-CRC FS. The workload is we a custom application that does several (16 threads) file create/read/writes/update xattrs on a XFS mounted over raw disk. There is no messages prior to this & we hit this once in a few days (like every 4-5 days). I will try your suggestion of running with xfs_attr_* tracepoints all the time so that when we hit this error we have better info. Please let me know if you prefer to add further debug prints. Thanks. --Shyam > Eric Sandeen sandeen at sandeen.net wrote: > On Mon Apr 25 16:57:11 CDT 2016 > > Is this a non-crc filesystem? > > > XFS_ATTR_LEAF_MAGIC is ok (if it's a non-crc filesystem) > > Looks the same as the other report, tripping on: > > if (ichdr.count == 0) > return false; > > A reproducer would be super here. At least maybe a description of the > workload that hits it? > > Count is manipulated in things like attr leaf compaction... > Any other messages prior to this? > > How often do you hit it? > > You could also turn on xfs_attr_* tracepoints, maybe. > > -Eric -----Original Message----- From: Shyam Kaushik [mailto:shyam@zadarastorage.com] Sent: 25 April 2016 22:22 To: 'xfs@oss.sgi.com' Cc: Alex Lyakas Subject: Metadata corruption detected at xfs_attr3_leaf_write_verify+0xe5/0x100 Hi Dave et al, We are periodically hitting the below metadata corruption with XFS over a raw disk running several file copies with xattr operations on kernel 3.18.19. Unmounting & running xfs_repair doesn't report any corruption. I see that this was last reported here http://oss.sgi.com/archives/xfs/2015-12/msg00224.html Unfortunately we dont have a reproducer, but this issue happens periodically. We can add more debug prints & allow this issue to happen again. Can you pls suggest any options to debug this further? Thanks Apr 20 21:58:03 node1 kernel: [16736.286370] XFS (dm-26): Metadata corruption detected at xfs_attr3_leaf_write_verify+0xe5/0x100 [xfs], block 0x19c5c728 Apr 20 21:58:03 node1 kernel: [16736.289084] XFS (dm-26): Unmount and run xfs_repair Apr 20 21:58:03 node1 kernel: [16736.290257] XFS (dm-26): First 64 bytes of corrupted metadata buffer: Apr 20 21:58:03 node1 kernel: [16736.291797] ffff880123668000: 00 00 00 00 00 00 00 00 fb ee 00 00 00 00 00 00 ................ Apr 20 21:58:03 node1 kernel: [16736.293823] ffff880123668010: 10 00 00 00 00 20 0f e0 00 00 00 00 00 00 00 00 ..... .......... Apr 20 21:58:03 node1 kernel: [16736.297504] ffff880123668020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Apr 20 21:58:03 node1 kernel: [16736.299343] ffff880123668030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Apr 20 21:58:03 node1 kernel: [16736.301465] XFS (dm-26): xfs_do_force_shutdown(0x8) called from line 1244 of file fs/xfs/xfs_buf.c. Return address = 0xffffffffc095cee0 Apr 20 21:58:03 node1 kernel: [16736.301469] ------------[ cut here ]------------ Apr 20 21:58:03 node1 kernel: [16736.301551] XFS(dm-26): SHUTDOWN!!! old_flags=0x0 new_flags=0x8 Apr 20 21:58:03 node1 kernel: [16736.301703] CPU: 1 PID: 7857 Comm: xfsaild/dm-26 Tainted: G OE 3.18.19 #1 Apr 20 21:58:03 node1 kernel: [16736.301705] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 Apr 20 21:58:03 node1 kernel: [16736.301707] 0000000000000009 ffff88020c5ffb38 ffffffff81710c85 0000000000000000 Apr 20 21:58:03 node1 kernel: [16736.301711] ffff88020c5ffb88 ffff88020c5ffb78 ffffffff81072df1 2e2e202030302030 Apr 20 21:58:03 node1 kernel: [16736.301715] 0000000000000000 0000000000000008 ffff88020c127000 0000000000000000 Apr 20 21:58:03 node1 kernel: [16736.301718] Call Trace: Apr 20 21:58:03 node1 kernel: [16736.301769] [] dump_stack+0x4e/0x71 Apr 20 21:58:03 node1 kernel: [16736.301780] [] warn_slowpath_common+0x81/0xa0 Apr 20 21:58:03 node1 kernel: [16736.301784] [] warn_slowpath_fmt+0x46/0x50 Apr 20 21:58:03 node1 kernel: [16736.301860] [] xfs_do_force_shutdown+0x33/0x170 [xfs] Apr 20 21:58:03 node1 kernel: [16736.301921] [] ? _xfs_buf_ioapply+0xa0/0x430 [xfs] Apr 20 21:58:03 node1 kernel: [16736.301951] [] ? __xfs_buf_delwri_submit+0x22b/0x290 [xfs] Apr 20 21:58:03 node1 kernel: [16736.302066] [] _xfs_buf_ioapply+0xa0/0x430 [xfs] Apr 20 21:58:03 node1 kernel: [16736.302137] [] ? wake_up_state+0x20/0x20 Apr 20 21:58:03 node1 kernel: [16736.302162] [] ? __xfs_buf_delwri_submit+0x22b/0x290 [xfs] Apr 20 21:58:03 node1 kernel: [16736.302183] [] xfs_buf_submit+0x68/0x210 [xfs] Apr 20 21:58:03 node1 kernel: [16736.302241] [] __xfs_buf_delwri_submit+0x22b/0x290 [xfs] Apr 20 21:58:03 node1 kernel: [16736.302267] [] ? xfs_buf_delwri_submit_nowait+0x20/0x30 [xfs] Apr 20 21:58:03 node1 kernel: [16736.302291] [] ? xfs_trans_ail_cursor_first+0x90/0x90 [xfs] Apr 20 21:58:03 node1 kernel: [16736.302308] [] xfs_buf_delwri_submit_nowait+0x20/0x30 [xfs] Apr 20 21:58:03 node1 kernel: [16736.302333] [] xfsaild+0x22b/0x630 [xfs] Apr 20 21:58:03 node1 kernel: [16736.302513] [] ? xfs_trans_ail_cursor_first+0x90/0x90 [xfs] Apr 20 21:58:03 node1 kernel: [16736.302518] [] kthread+0xc9/0xe0 Apr 20 21:58:03 node1 kernel: [16736.302522] [] ? kthread_create_on_node+0x180/0x180 Apr 20 21:58:03 node1 kernel: [16736.302530] [] ret_from_fork+0x58/0x90 Apr 20 21:58:03 node1 kernel: [16736.302549] [] ? kthread_create_on_node+0x180/0x180 Apr 20 21:58:03 node1 kernel: [16736.302551] ---[ end trace 0bb81b88fdd6a298 ]--- --Shyam From mstsxfx@gmail.com Tue Apr 26 06:56:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 409CC7CD5 for ; Tue, 26 Apr 2016 06:56:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id AEC3DAC003 for ; Tue, 26 Apr 2016 04:56:24 -0700 (PDT) X-ASG-Debug-ID: 1461671781-04bdf0359623e490001-NocioJ Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com [74.125.82.65]) by cuda.sgi.com with ESMTP id amRJ0IpVBEZl8tG8 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 26 Apr 2016 04:56:22 -0700 (PDT) X-Barracuda-Envelope-From: mstsxfx@gmail.com X-Barracuda-Effective-Source-IP: mail-wm0-f65.google.com[74.125.82.65] X-Barracuda-Apparent-Source-IP: 74.125.82.65 Received: by mail-wm0-f65.google.com with SMTP id n3so4243847wmn.1 for ; Tue, 26 Apr 2016 04:56:22 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=lFDZH1Y0kLglufyg/hv7hzREf4uJwJEwRoLeyyL/F24=; b=LzZupo9L4r/+nQyg6BDWf3Sr4UF9BLgwxaUCSk8RBhcNRab8DWeHELk4hNkBHo0471 QkVV0VcF+mtF0C2OC0tkv5e6Lyw8vMf/gj8cAQOdIHCjh3Qs5a4opT461aG3kiCgY55H SkExhfZIFKe41jS+7Wh++4q0d3n41yoeLWQHLZ4x+/Ia0WfVOXC87IDf+ziT3Q2P9BPE 5AWl+Rlr9L4iLs+dfeMWgESpFiIBmSrUIDZm9aQ+OHqg+Z/ANH7lWGrMj30bzxErxEWZ J9k1Jjice1TdmjGs+9LdNigu70S0FpLgnC4vcbb55yJyrT0O3ZzMwgm9bo8xfbJL7xti MY2g== X-Gm-Message-State: AOPr4FWf8oE83d/T09HGXzX5B5CgQtT2XOOLAPws0MmWSNoT1kvk1DEb5YGo2NtMQFAddQ== X-Received: by 10.194.190.201 with SMTP id gs9mr3026803wjc.133.1461671780981; Tue, 26 Apr 2016 04:56:20 -0700 (PDT) Received: from tiehlicka.suse.cz (nat1.scz.suse.com. [213.151.88.250]) by smtp.gmail.com with ESMTPSA id b12sm20343939wmb.0.2016.04.26.04.56.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 26 Apr 2016 04:56:20 -0700 (PDT) From: Michal Hocko To: , Cc: Andrew Morton , Dave Chinner , "Theodore Ts'o" , Chris Mason , Jan Kara , ceph-devel@vger.kernel.org, cluster-devel@redhat.com, linux-nfs@vger.kernel.org, logfs@logfs.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-mtd@lists.infradead.org, reiserfs-devel@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-f2fs-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, LKML Subject: [PATCH 0/2] scop GFP_NOFS api Date: Tue, 26 Apr 2016 13:56:10 +0200 X-ASG-Orig-Subj: [PATCH 0/2] scop GFP_NOFS api Message-Id: <1461671772-1269-1-git-send-email-mhocko@kernel.org> X-Mailer: git-send-email 2.8.0.rc3 X-Barracuda-Connect: mail-wm0-f65.google.com[74.125.82.65] X-Barracuda-Start-Time: 1461671782 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1750 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29069 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi, we have discussed this topic at LSF/MM this year. There was a general interest in the scope GFP_NOFS allocation context among some FS developers. For those who are not aware of the discussion or the issue I am trying to sort out (or at least start in that direction) please have a look at patch 1 which adds memalloc_nofs_{save,restore} api which basically copies what we have for the scope GFP_NOIO allocation context. I haven't converted any of the FS myself because that is way beyond my area of expertise but I would be happy to help with further changes on the MM front as well as in some more generic code paths. Dave had an idea on how to further improve the reclaim context to be less all-or-nothing wrt. GFP_NOFS. In short he was suggesting an opaque and FS specific cookie set in the FS allocation context and consumed by the FS reclaim context to allow doing some provably save actions that would be skipped due to GFP_NOFS normally. I like this idea and I believe we can go that direction regardless of the approach taken here. Many filesystems simply need to cleanup their NOFS usage first before diving into a more complex changes. The patch 2 is a debugging aid which warns about explicit allocation requests from the scope context. This is should help to reduce the direct usage of the NOFS flags to bare minimum in favor of the scope API. It is not aimed to be merged upstream. I would hope Andrew took it into mmotm tree to give it linux-next exposure and allow developers to do further cleanups. There is a new kernel command line parameter which has to be used for the debugging to be enabled. I think the GFP_NOIO should be seeing the same clean up. Any feedback is highly appreciated. From mstsxfx@gmail.com Tue Apr 26 06:56:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 32BAD7CD5 for ; Tue, 26 Apr 2016 06:56:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 87E64AC002 for ; Tue, 26 Apr 2016 04:56:26 -0700 (PDT) X-ASG-Debug-ID: 1461671783-04cbb00fe9236770001-NocioJ Received: from mail-wm0-f68.google.com (mail-wm0-f68.google.com [74.125.82.68]) by cuda.sgi.com with ESMTP id k8R0apvYQyTz1Plm (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 26 Apr 2016 04:56:24 -0700 (PDT) X-Barracuda-Envelope-From: mstsxfx@gmail.com X-Barracuda-Effective-Source-IP: mail-wm0-f68.google.com[74.125.82.68] X-Barracuda-Apparent-Source-IP: 74.125.82.68 Received: by mail-wm0-f68.google.com with SMTP id e201so3738644wme.2 for ; Tue, 26 Apr 2016 04:56:24 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=FiW2XwQJJUh1ZSfUbENsOKrYpphA46lldaop3/rxBog=; b=Z/ki+3Tf1SXSAt3XZ/Vm9lZ//CNaaVeqUfuzbRkiHVg72fF3EVz3nrXyCGuPdIZ7N6 1Z0wUH3O1D5G4yA4xDQaDdfZtASkPtdyy2CDWyCgLtjLDpVbU9Z+dsr7M/CB8SoLS+/H UE52LAlFuloFgynnuDHHhuABMLkxB01yyZ5wBBU1WHtSVCm76LUC2Br4abH0a+nTNRxE A498iNqhF4MX3s+uRTQc/cjaZKtuOHjbLaDHtIUtAVcMw+7zIUVpqrFRunI50cT4I+Zd D6hXfcJkYWVNincc3GWntUEkZ9AqmyQtHdREreHRRfKlCzeIrBp1EdLZ9BpHUvp2TOWa YMRw== X-Gm-Message-State: AOPr4FXcio8LN62qOiPeArjG3qKyUK0WD2Pv1PEBoXSdmwyDqGIh6EE1C3sNk4l41fKn1g== X-Received: by 10.194.113.3 with SMTP id iu3mr3045131wjb.149.1461671783136; Tue, 26 Apr 2016 04:56:23 -0700 (PDT) Received: from tiehlicka.suse.cz (nat1.scz.suse.com. [213.151.88.250]) by smtp.gmail.com with ESMTPSA id b12sm20343939wmb.0.2016.04.26.04.56.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 26 Apr 2016 04:56:22 -0700 (PDT) From: Michal Hocko To: , Cc: Andrew Morton , Dave Chinner , "Theodore Ts'o" , Chris Mason , Jan Kara , ceph-devel@vger.kernel.org, cluster-devel@redhat.com, linux-nfs@vger.kernel.org, logfs@logfs.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-mtd@lists.infradead.org, reiserfs-devel@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-f2fs-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, LKML , Michal Hocko Subject: [PATCH 2/2] mm, debug: report when GFP_NO{FS,IO} is used explicitly from memalloc_no{fs,io}_{save,restore} context Date: Tue, 26 Apr 2016 13:56:12 +0200 X-ASG-Orig-Subj: [PATCH 2/2] mm, debug: report when GFP_NO{FS,IO} is used explicitly from memalloc_no{fs,io}_{save,restore} context Message-Id: <1461671772-1269-3-git-send-email-mhocko@kernel.org> X-Mailer: git-send-email 2.8.0.rc3 In-Reply-To: <1461671772-1269-1-git-send-email-mhocko@kernel.org> References: <1461671772-1269-1-git-send-email-mhocko@kernel.org> X-Barracuda-Connect: mail-wm0-f68.google.com[74.125.82.68] X-Barracuda-Start-Time: 1461671784 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3196 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29069 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header From: Michal Hocko THIS PATCH IS FOR TESTING ONLY AND NOT MEANT TO HIT LINUS TREE It is desirable to reduce the direct GFP_NO{FS,IO} usage at minimum and prefer scope usage defined by memalloc_no{fs,io}_{save,restore} API. Let's help this process and add a debugging tool to catch when an explicit allocation request for GFP_NO{FS,IO} is done from the scope context. The printed stacktrace should help to identify the caller and evaluate whether it can be changed to use a wider context or whether it is called from another potentially dangerous context which needs a scope protection as well. The checks have to be enabled explicitly by debug_scope_gfp kernel command line parameter. Signed-off-by: Michal Hocko --- mm/page_alloc.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 86bb5d6ddd7d..085d00280496 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -3750,6 +3750,61 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, return page; } +static bool debug_scope_gfp; + +static int __init enable_debug_scope_gfp(char *unused) +{ + debug_scope_gfp = true; + return 0; +} + +/* + * spit the stack trace if the given gfp_mask clears flags which are context + * wide cleared. Such a caller can remove special flags clearing and rely on + * the context wide mask. + */ +static inline void debug_scope_gfp_context(gfp_t gfp_mask) +{ + gfp_t restrict_mask; + + if (likely(!debug_scope_gfp)) + return; + + /* both NOFS, NOIO are irrelevant when direct reclaim is disabled */ + if (!(gfp_mask & __GFP_DIRECT_RECLAIM)) + return; + + if (current->flags & PF_MEMALLOC_NOIO) + restrict_mask = __GFP_IO; + else if ((current->flags & PF_MEMALLOC_NOFS) && (gfp_mask & __GFP_IO)) + restrict_mask = __GFP_FS; + else + return; + + if ((gfp_mask & restrict_mask) != restrict_mask) { + /* + * If you see this this warning then the code does: + * memalloc_no{fs,io}_save() + * ... + * foo() + * alloc_page(GFP_NO{FS,IO}) + * ... + * memalloc_no{fs,io}_restore() + * + * allocation which is unnecessary because the scope gfp + * context will do that for all allocation requests already. + * If foo() is called from multiple contexts then make sure other + * contexts are safe wrt. GFP_NO{FS,IO} semantic and either add + * scope protection into particular paths or change the gfp mask + * to GFP_KERNEL. + */ + pr_info("Unnecesarily specific gfp mask:%#x(%pGg) for the %s task wide context\n", gfp_mask, &gfp_mask, + (current->flags & PF_MEMALLOC_NOIO)?"NOIO":"NOFS"); + dump_stack(); + } +} +early_param("debug_scope_gfp", enable_debug_scope_gfp); + /* * This is the 'heart' of the zoned buddy allocator. */ @@ -3796,6 +3851,7 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, ac.nodemask); /* First allocation attempt */ + debug_scope_gfp_context(gfp_mask); page = get_page_from_freelist(alloc_mask, order, alloc_flags, &ac); if (likely(page)) goto out; -- 2.8.0.rc3 From mstsxfx@gmail.com Tue Apr 26 06:56:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9D1DD7CDD for ; Tue, 26 Apr 2016 06:56:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 21E47AC001 for ; Tue, 26 Apr 2016 04:56:27 -0700 (PDT) X-ASG-Debug-ID: 1461671782-04bdf0359023e490001-NocioJ Received: from mail-wm0-f68.google.com (mail-wm0-f68.google.com [74.125.82.68]) by cuda.sgi.com with ESMTP id pBpezTCBymw9iDxi (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 26 Apr 2016 04:56:23 -0700 (PDT) X-Barracuda-Envelope-From: mstsxfx@gmail.com X-Barracuda-Effective-Source-IP: mail-wm0-f68.google.com[74.125.82.68] X-Barracuda-Apparent-Source-IP: 74.125.82.68 Received: by mail-wm0-f68.google.com with SMTP id n3so4244001wmn.1 for ; Tue, 26 Apr 2016 04:56:23 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=tSMfGAXe/pYhRGzZhlR1cy0fuXlrjFDAofN5Etz+hSI=; b=jwwmRMky3wFBPUn61xlBkTSHAqR+fzcU3iq8H5Tg70oTN+VCQ7ET3MblPGoBzpvNfg gJoY+gras7789J6P1BV66rMHIdJiCgpeTvoy5463wRSmFlx6NE+FNZ3euqmvDh8iYVdi xtBC7KQ0Q1OS7CYVu24ECJ8/IjTP9iJB8c3UPRzwHGAy/BZDja9X07MJ5PokY2Ews9RY e5zlmEPr2dU6Hs7JWa/3b55yfWGFehYx6d0K8DDejKxCeGtsTlgwwVl6c7Z/0HmGImxh mfCOh17ktZkKQWhFlfF00AQC2VmtrpAppulu2/+Tnxm/Dlb1OKpVceA2Rn6XgRZFu9UP Guog== X-Gm-Message-State: AOPr4FWERyfN15Plj1vUiYgGkVjM2MSCEz9eXUJUwDCI+Li2D//3U1QtSDIXqYHbPDsYsw== X-Received: by 10.194.140.17 with SMTP id rc17mr3031995wjb.175.1461671782092; Tue, 26 Apr 2016 04:56:22 -0700 (PDT) Received: from tiehlicka.suse.cz (nat1.scz.suse.com. [213.151.88.250]) by smtp.gmail.com with ESMTPSA id b12sm20343939wmb.0.2016.04.26.04.56.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 26 Apr 2016 04:56:21 -0700 (PDT) From: Michal Hocko To: , Cc: Andrew Morton , Dave Chinner , "Theodore Ts'o" , Chris Mason , Jan Kara , ceph-devel@vger.kernel.org, cluster-devel@redhat.com, linux-nfs@vger.kernel.org, logfs@logfs.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-mtd@lists.infradead.org, reiserfs-devel@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-f2fs-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, LKML , Michal Hocko Subject: [PATCH 1/2] mm: add PF_MEMALLOC_NOFS Date: Tue, 26 Apr 2016 13:56:11 +0200 X-ASG-Orig-Subj: [PATCH 1/2] mm: add PF_MEMALLOC_NOFS Message-Id: <1461671772-1269-2-git-send-email-mhocko@kernel.org> X-Mailer: git-send-email 2.8.0.rc3 In-Reply-To: <1461671772-1269-1-git-send-email-mhocko@kernel.org> References: <1461671772-1269-1-git-send-email-mhocko@kernel.org> X-Barracuda-Connect: mail-wm0-f68.google.com[74.125.82.68] X-Barracuda-Start-Time: 1461671783 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 13640 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29069 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header From: Michal Hocko GFP_NOFS context is used for the following 4 reasons currently - to prevent from deadlocks when the lock held by the allocation context would be needed during the memory reclaim - to prevent from stack overflows during the reclaim because the allocation is performed from a deep context already - to prevent lockups when the allocation context depends on other reclaimers to make a forward progress indirectly - just in case because this would be safe from the fs POV Unfortunately overuse of this allocation context brings some problems to the MM. Memory reclaim is much weaker (especially during heavy FS metadata workloads), OOM killer cannot be invoked because the MM layer doesn't have enough information about how much memory is freeable by the FS layer. In many cases it is far from clear why the weaker context is even used and so it might be used unnecessarily. We would like to get rid of those as much as possible. One way to do that is to use the flag in the scopes rather than isolated cases. Such a scope is declared when really necessary, tracked per task and all the allocation requests from within the context will simply inherit the GFP_NOFS semantic. Not only this is easier to understand and maintain because there are much less problematic contexts than specific allocation requests, this also helps code paths where FS layer interacts with other layers (e.g. crypto, security modules, MM etc...) and there is no easy way to convey the allocation context between the layers. Introduce PF_MEMALLOC_NOFS task specific flag and memalloc_nofs_{save,restore} API to control the scope. This is basically copying memalloc_noio_{save,restore} API we have for other restricted allocation context GFP_NOIO. Xfs has already had a similar functionality as PF_FSTRANS so let's just give it a more generic name and make it usable for others as well and move the GFP_NOFS context tracking to the page allocator. Xfs has its own accessor functions but let's keep them for now to reduce this patch as minimum. This patch shouldn't introduce any functional changes. Xfs code paths preserve their semantic. kmem_flags_convert() doesn't need to evaluate the flag anymore because it is the page allocator to care about the flag. memalloc_noio_flags is renamed to current_gfp_context because it now cares about both PF_MEMALLOC_NOFS and PF_MEMALLOC_NOIO contexts. Let's hope that filesystems will drop direct GFP_NOFS (resp. ~__GFP_FS) usage as much and possible and only use a properly documented memalloc_nofs_{save,restore} checkpoints where they are appropriate. Signed-off-by: Michal Hocko --- fs/xfs/kmem.c | 4 ++-- fs/xfs/kmem.h | 2 +- fs/xfs/libxfs/xfs_btree.c | 2 +- fs/xfs/xfs_aops.c | 6 +++--- fs/xfs/xfs_trans.c | 12 ++++++------ include/linux/gfp.h | 8 ++++++++ include/linux/sched.h | 32 ++++++++++++++++++++++++++------ mm/page_alloc.c | 8 +++++--- mm/vmscan.c | 4 ++-- 9 files changed, 54 insertions(+), 24 deletions(-) diff --git a/fs/xfs/kmem.c b/fs/xfs/kmem.c index 686ba6fb20dd..73f6ab59c664 100644 --- a/fs/xfs/kmem.c +++ b/fs/xfs/kmem.c @@ -80,13 +80,13 @@ kmem_zalloc_large(size_t size, xfs_km_flags_t flags) * context via PF_MEMALLOC_NOIO to prevent memory reclaim re-entering * the filesystem here and potentially deadlocking. */ - if ((current->flags & PF_FSTRANS) || (flags & KM_NOFS)) + if ((current->flags & PF_MEMALLOC_NOFS) || (flags & KM_NOFS)) noio_flag = memalloc_noio_save(); lflags = kmem_flags_convert(flags); ptr = __vmalloc(size, lflags | __GFP_HIGHMEM | __GFP_ZERO, PAGE_KERNEL); - if ((current->flags & PF_FSTRANS) || (flags & KM_NOFS)) + if ((current->flags & PF_MEMALLOC_NOFS) || (flags & KM_NOFS)) memalloc_noio_restore(noio_flag); return ptr; diff --git a/fs/xfs/kmem.h b/fs/xfs/kmem.h index d1c66e465ca5..b35688a54c9a 100644 --- a/fs/xfs/kmem.h +++ b/fs/xfs/kmem.h @@ -50,7 +50,7 @@ kmem_flags_convert(xfs_km_flags_t flags) lflags = GFP_ATOMIC | __GFP_NOWARN; } else { lflags = GFP_KERNEL | __GFP_NOWARN; - if ((current->flags & PF_FSTRANS) || (flags & KM_NOFS)) + if (flags & KM_NOFS) lflags &= ~__GFP_FS; } diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index a0eb18ce3ad3..326566f4a131 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -2540,7 +2540,7 @@ xfs_btree_split_worker( struct xfs_btree_split_args *args = container_of(work, struct xfs_btree_split_args, work); unsigned long pflags; - unsigned long new_pflags = PF_FSTRANS; + unsigned long new_pflags = PF_MEMALLOC_NOFS; /* * we are in a transaction context here, but may also be doing work diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index d12dfcfd0cc8..6d816ff0b763 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -124,7 +124,7 @@ xfs_setfilesize_trans_alloc( * We hand off the transaction to the completion thread now, so * clear the flag here. */ - current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); + current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS); return 0; } @@ -169,7 +169,7 @@ xfs_setfilesize_ioend( * thus we need to mark ourselves as being in a transaction manually. * Similarly for freeze protection. */ - current_set_flags_nested(&tp->t_pflags, PF_FSTRANS); + current_set_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS); __sb_writers_acquired(VFS_I(ip)->i_sb, SB_FREEZE_FS); /* we abort the update if there was an IO error */ @@ -979,7 +979,7 @@ xfs_vm_writepage( * Given that we do not allow direct reclaim to call us, we should * never be called while in a filesystem transaction. */ - if (WARN_ON_ONCE(current->flags & PF_FSTRANS)) + if (WARN_ON_ONCE(current->flags & PF_MEMALLOC_NOFS)) goto redirty; /* Is this page beyond the end of the file? */ diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 748b16aff45a..1d247366c733 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -176,7 +176,7 @@ xfs_trans_reserve( 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); + current_set_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS); /* * Attempt to reserve the needed disk blocks by decrementing @@ -186,7 +186,7 @@ xfs_trans_reserve( if (blocks > 0) { error = xfs_mod_fdblocks(tp->t_mountp, -((int64_t)blocks), rsvd); if (error != 0) { - current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); + current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS); return -ENOSPC; } tp->t_blk_res += blocks; @@ -263,7 +263,7 @@ xfs_trans_reserve( tp->t_blk_res = 0; } - current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); + current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS); return error; } @@ -921,7 +921,7 @@ __xfs_trans_commit( xfs_log_commit_cil(mp, tp, &commit_lsn, regrant); - current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); + current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS); xfs_trans_free(tp); /* @@ -951,7 +951,7 @@ __xfs_trans_commit( if (commit_lsn == -1 && !error) error = -EIO; } - current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); + current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS); xfs_trans_free_items(tp, NULLCOMMITLSN, !!error); xfs_trans_free(tp); @@ -1005,7 +1005,7 @@ xfs_trans_cancel( xfs_log_done(mp, tp->t_ticket, NULL, false); /* mark this thread as no longer being in a transaction */ - current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); + current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS); xfs_trans_free_items(tp, NULLCOMMITLSN, dirty); xfs_trans_free(tp); diff --git a/include/linux/gfp.h b/include/linux/gfp.h index 570383a41853..3ebdbdff44b4 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h @@ -210,8 +210,16 @@ struct vm_area_struct; * * GFP_NOIO will use direct reclaim to discard clean pages or slab pages * that do not require the starting of any physical IO. + * Please try to avoid using this flag directly and instead use + * memalloc_noio_{save,restore} to mark the whole scope which cannot + * perform any IO with a short explanation why. All allocation requests + * will inherit GFP_NOIO implicitly. * * GFP_NOFS will use direct reclaim but will not use any filesystem interfaces. + * Please try to avoid using this flag directly and instead use + * memalloc_nofs_{save,restore} to mark the whole scope which cannot/shouldn't + * recurse into the FS layer with a short explanation why. All allocation + * requests will inherit GFP_NOFS implicitly. * * GFP_USER is for userspace allocations that also need to be directly * accessibly by the kernel or hardware. It is typically used by hardware diff --git a/include/linux/sched.h b/include/linux/sched.h index acfc32b30704..e9521dc0475f 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -2102,9 +2102,9 @@ extern void thread_group_cputime_adjusted(struct task_struct *p, cputime_t *ut, #define PF_USED_ASYNC 0x00004000 /* used async_schedule*(), used by module init */ #define PF_NOFREEZE 0x00008000 /* this thread should not be frozen */ #define PF_FROZEN 0x00010000 /* frozen for system suspend */ -#define PF_FSTRANS 0x00020000 /* inside a filesystem transaction */ -#define PF_KSWAPD 0x00040000 /* I am kswapd */ -#define PF_MEMALLOC_NOIO 0x00080000 /* Allocating memory without IO involved */ +#define PF_KSWAPD 0x00020000 /* I am kswapd */ +#define PF_MEMALLOC_NOFS 0x00040000 /* All allocation requests will inherit GFP_NOFS */ +#define PF_MEMALLOC_NOIO 0x00080000 /* All allocation requests will inherit GFP_NOIO */ #define PF_LESS_THROTTLE 0x00100000 /* Throttle me less: I clean memory */ #define PF_KTHREAD 0x00200000 /* I am a kernel thread */ #define PF_RANDOMIZE 0x00400000 /* randomize virtual address space */ @@ -2140,13 +2140,21 @@ extern void thread_group_cputime_adjusted(struct task_struct *p, cputime_t *ut, #define tsk_used_math(p) ((p)->flags & PF_USED_MATH) #define used_math() tsk_used_math(current) -/* __GFP_IO isn't allowed if PF_MEMALLOC_NOIO is set in current->flags - * __GFP_FS is also cleared as it implies __GFP_IO. +/* + * Applies per-task gfp context to the given allocation flags. + * PF_MEMALLOC_NOIO implies GFP_NOIO + * PF_MEMALLOC_NOFS implies GFP_NOFS */ -static inline gfp_t memalloc_noio_flags(gfp_t flags) +static inline gfp_t current_gfp_context(gfp_t flags) { + /* + * NOIO implies both NOIO and NOFS and it is a weaker context + * so always make sure it makes precendence + */ if (unlikely(current->flags & PF_MEMALLOC_NOIO)) flags &= ~(__GFP_IO | __GFP_FS); + else if (unlikely(current->flags & PF_MEMALLOC_NOFS)) + flags &= ~__GFP_FS; return flags; } @@ -2162,6 +2170,18 @@ static inline void memalloc_noio_restore(unsigned int flags) current->flags = (current->flags & ~PF_MEMALLOC_NOIO) | flags; } +static inline unsigned int memalloc_nofs_save(void) +{ + unsigned int flags = current->flags & PF_MEMALLOC_NOFS; + current->flags |= PF_MEMALLOC_NOFS; + return flags; +} + +static inline void memalloc_nofs_restore(unsigned int flags) +{ + current->flags = (current->flags & ~PF_MEMALLOC_NOFS) | flags; +} + /* Per-process atomic flags. */ #define PFA_NO_NEW_PRIVS 0 /* May not gain new privileges. */ #define PFA_SPREAD_PAGE 1 /* Spread page cache over cpuset */ diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 0e2bb8f4ec0b..86bb5d6ddd7d 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -3801,10 +3801,12 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, goto out; /* - * Runtime PM, block IO and its error handling path can deadlock - * because I/O on the device might not complete. + * Apply scoped allocation constrains. This is mainly about + * GFP_NOFS resp. GFP_NOIO which has to be inherited for all + * allocation requests from a particular context which has + * been marked by memalloc_no{fs,io}_{save,restore} */ - alloc_mask = memalloc_noio_flags(gfp_mask); + alloc_mask = current_gfp_context(gfp_mask); ac.spread_dirty_pages = false; page = __alloc_pages_slowpath(alloc_mask, order, &ac); diff --git a/mm/vmscan.c b/mm/vmscan.c index c4a2f4512fca..cfb74de1efa3 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -2808,7 +2808,7 @@ unsigned long try_to_free_pages(struct zonelist *zonelist, int order, unsigned long nr_reclaimed; struct scan_control sc = { .nr_to_reclaim = SWAP_CLUSTER_MAX, - .gfp_mask = (gfp_mask = memalloc_noio_flags(gfp_mask)), + .gfp_mask = (gfp_mask = current_gfp_context(gfp_mask)), .order = order, .nodemask = nodemask, .priority = DEF_PRIORITY, @@ -3656,7 +3656,7 @@ static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order) struct reclaim_state reclaim_state; struct scan_control sc = { .nr_to_reclaim = max(nr_pages, SWAP_CLUSTER_MAX), - .gfp_mask = (gfp_mask = memalloc_noio_flags(gfp_mask)), + .gfp_mask = (gfp_mask = current_gfp_context(gfp_mask)), .order = order, .priority = ZONE_RECLAIM_PRIORITY, .may_writepage = !!(zone_reclaim_mode & RECLAIM_WRITE), -- 2.8.0.rc3 From shyam@zadarastorage.com Tue Apr 26 09:02:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 94FC47CD9 for ; Tue, 26 Apr 2016 09:02:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 69E458F8033 for ; Tue, 26 Apr 2016 07:02:12 -0700 (PDT) X-ASG-Debug-ID: 1461679327-04cbb00fe723aef0001-NocioJ Received: from mail-wm0-f53.google.com (mail-wm0-f53.google.com [74.125.82.53]) by cuda.sgi.com with ESMTP id NNoMo59ogHsRC1hF (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 26 Apr 2016 07:02:09 -0700 (PDT) X-Barracuda-Envelope-From: shyam@zadarastorage.com X-Barracuda-Effective-Source-IP: mail-wm0-f53.google.com[74.125.82.53] X-Barracuda-Apparent-Source-IP: 74.125.82.53 Received: by mail-wm0-f53.google.com with SMTP id v188so130833955wme.1 for ; Tue, 26 Apr 2016 07:02:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=from:mime-version:thread-index:date:message-id:subject:to:cc; bh=qaouIlYGZ2LSAc1IWrt7XAlT2sBaCJzVCoEXc4NXtHU=; b=lswlFPda0zPBu4sk2IsDJwIADiMuWpFe/8nxq2JEa6OAJxHP/vuXK0JNIp8VW5/xam +A8YS+jn8q3EaZQZwdkSe85cjJFGhsVttbK7fgCqNvl2HyyfU2SEjClsJw6soExep4PA FqhlqTGLy74nsGtexaoO6My6q6GLxp5DrC71lUoFFIlXQ6gCzVmuxOl934v9Ab7QzSWA ZeC4Z2I3Z+hgY2MNcBpODS0q29c5skysdIuL1r2T+orY6lp/YxFLguNM/pmlaRsc4aMo YKHktjutVCB42x0ynPX6nfebBHiKhcocKbOvBWmUsmpODrN2tBqt634RMqwTzkjffZf9 PT7Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:mime-version:thread-index:date:message-id :subject:to:cc; bh=qaouIlYGZ2LSAc1IWrt7XAlT2sBaCJzVCoEXc4NXtHU=; b=JJ0awua1deUu14IUp+AaxyPY4HSLP0r+T0RpA4/j38uo7kbzjYY6n6LYUTHjL06bcx cKC18gK608HYPRjbzClWNfauXmnBYoWy/GDk+bUYEpsAZiitbSuDsCP6N/glH6Oo2wAO SaiCleJi7JYW+qOdQy9N3H26Kj9F7a0lAZ82dlEKUlGfWg3QxPGeWurxULs7xdYaJzz/ t43yAIqYpBcpkVo25rMMdxwFVU63MgBX4ew6s1xhOJDJzQ5sgW60IsCivXl6tTuhuSck xfJoTnrMGxQGrfWHf7feVwTZ+Pg+qIW7Y5z6YxSvze0ad51j8MlDETW66kIru7pfkMUI W+xw== X-Gm-Message-State: AOPr4FXlLtCcWU8DssUiXry2LpEkDjYap2kPXh+MeSY8Lgow20DqIZMwthCn40/CEoe+GHMoKn25CFdmWmT6VQ== X-Received: by 10.194.14.130 with SMTP id p2mr3534333wjc.173.1461679321880; Tue, 26 Apr 2016 07:02:01 -0700 (PDT) From: Shyam Kaushik MIME-Version: 1.0 X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AdGfxDOTYCTqo7DyQ3SbW7clHfIRpA== Date: Tue, 26 Apr 2016 19:31:59 +0530 Message-ID: Subject: [PATCH] xfs_buf_iodone_callbacks to force shutdown & resubmit buf in case of permanent failure To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs_buf_iodone_callbacks to force shutdown & resubmit buf in case of permanent failure Cc: Alex Lyakas Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wm0-f53.google.com[74.125.82.53] X-Barracuda-Start-Time: 1461679328 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1558 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29071 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature When XFS underlying disk fails, it could take several milliseconds for the FS to be marked shutdown. xfs_buf_iodone_callbacks() retries buf upon first failure by submitting it once again. But if the buf fails 2nd time before FS is marked for shutdown, it just releases the buf with xfs_buf_relse(). This is flawed that nobody is releasing the XFS_IFLOCK on the inode. Because of this AIL tasks repeated effort to xfs_inode_item_push() will see that xfs_iflock() cannot be acquired. This blocks XFS from being unmounted as xfs_ail_push_all_sync() will keep looping without progress. Fix this by marking the FS for shutdown if we have a permanent failure & resubmit the buf. xfs_buf_submit() will see FS marked for shutdown & invoke the callback which releases XFS_IFLOCK. diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 1a6c9b9..6f73ee0 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -1100,7 +1100,12 @@ xfs_buf_iodone_callbacks( XBF_DONE | XBF_WRITE_FAIL; xfs_buf_submit(bp); } else { - xfs_buf_relse(bp); + /* + * if we have the buf fail 2nd time, force a FS shutdown & resubmit + * the buf for it to be failed back immediately + */ + xfs_force_shutdown(mp, SHUTDOWN_LOG_IO_ERROR); + xfs_buf_submit(bp); } return; From vishal@kernel.org Tue Apr 26 09:59:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4F35B7CDC for ; Tue, 26 Apr 2016 09:59:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D5B738F8035 for ; Tue, 26 Apr 2016 07:58:57 -0700 (PDT) X-ASG-Debug-ID: 1461682735-04bdf0358f245660001-NocioJ Received: from mail.kernel.org ([198.145.29.136]) by cuda.sgi.com with ESMTP id hQ0ZaIolKr8QVOLv (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 26 Apr 2016 07:58:55 -0700 (PDT) X-Barracuda-Envelope-From: vishal@kernel.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.145.29.136] 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 6966220138; Tue, 26 Apr 2016 14:58:54 +0000 (UTC) Received: from gamestarV3L (184-99-237-189.hlrn.qwest.net [184.99.237.189]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 775B220125; Tue, 26 Apr 2016 14:58:52 +0000 (UTC) Message-ID: <1461682731.26226.20.camel@kernel.org> Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io From: Vishal Verma X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io To: Dave Chinner , "Verma, Vishal L" Cc: "hch@infradead.org" , "jack@suse.cz" , "axboe@fb.com" , "linux-nvdimm@ml01.01.org" , "linux-kernel@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-block@vger.kernel.org" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "linux-fsdevel@vger.kernel.org" , "akpm@linux-foundation.org" , "linux-ext4@vger.kernel.org" , "Wilcox, Matthew R" Date: Tue, 26 Apr 2016 08:58:51 -0600 In-Reply-To: <20160426004155.GF18496@dastard> References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> <20160425232552.GD18496@dastard> <1461628381.1421.24.camel@intel.com> <20160426004155.GF18496@dastard> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.18.5.2 (3.18.5.2-1.fc23) Mime-Version: 1.0 Content-Transfer-Encoding: 8bit X-Virus-Scanned: ClamAV using ClamSMTP X-Barracuda-Connect: UNKNOWN[198.145.29.136] X-Barracuda-Start-Time: 1461682735 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5371 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29072 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, 2016-04-26 at 10:41 +1000, Dave Chinner wrote: > <> > > The application doesn't have to scan the entire filesystem, but > > presumably it knows what files it 'owns', and does a fiemap for > > those. > You're assuming that only the DAX aware application accesses it's > files.  users, backup programs, data replicators, fileystem > re-organisers (e.g.  defragmenters) etc all may access the files and > they may throw errors. What then? In this scenario, backup applications etc that try to read that data before it has been replaced will just hit the errors and fail.. >  <> > > The data that was lost is gone -- this assumes the application has > > some > > ability to recover using a journal/log or other redundancy - yes, > > at the > > application layer. If it doesn't have this sort of capability, the > > only > > option is to restore files from a backup/mirror. > So the architecture has a built in assumption that only userspace > can handle data loss? > > What about filesytsems like NOVA, that use log structured design to > provide DAX w/ update atomicity and can potentially also provide > redundancy/repair through the same mechanisms? Won't pmem native > filesystems with built in data protection features like this remove > the need for adding all this to userspace applications? > > If so, shouldn't that be the focus of development rahter than > placing the burden on userspace apps to handle storage repair > situations? Agreed that file systems like NOVA can be designed to handle this better, but haven't you said in the past that it may take years for a new file system to become production ready, and that DAX is the until- then solution that gets us most of the way there.. I think we just want to ensure that current-DAX has some way to deal with errors, and these patches provide an admin-intervention recovery path and possibly another if the app wants to try something fancy for recovery. <> > > >  > > To summarize, the two cases we want to handle are: > > 1. Application has inbuilt recovery: > >   - hits badblock > >   - figures out it is able to recover the data > >   - handles SIGBUS or EIO > >   - does a (sector aligned) write() to restore the data > The "figures out" step here is where >95% of the work we'd have to > do is. And that's in filesystem and block layer code, not > userspace, and userspace can't do that work in a signal handler. > And it  can still fall down to the second case when the application > doesn't have another copy of the data somewhere. Ah when I said "figures out" I was only thinking if the application has some redundancy/jouranlling, and if it can recover using that -- not additional recovery mechanisms at the block/fs layer. > > FWIW, we don't have a DAX enabled filesystem that can do > reverse block mapping, so we're a year or two away from this being a > workable production solution from the filesystem perspective. And > AFAICT, it's not even on the roadmap for dm/md layers. > > > > > 2. Application doesn't have any inbuilt recovery mechanism > >   - hits badblock > >   - gets SIGBUS (or EIO) and crashes > >   - Sysadmin restores file from backup > Which is no different to an existing non-DAX application getting an > EIO/sigbus from current storage technologies. > > Except: in the existing storage stack, redundancy and correction has > already had to have failed for the application to see such an error. > Hence this is normally considered a DR case as there's had to be > cascading failures (e.g.  multiple disk failures in a RAID) to get > to this stage, not a single error in a single sector in > non-redundant storage. > > We need some form of redundancy and correction in the PMEM stack to > prevent single sector errors from taking down services until an > administrator can correct the problem. I'm trying to understand > where this is supposed to fit into the picture - at this point I > really don't think userspace applications are going to be able to do > this reliably.... Agreed that the pmem stack could use more redundancy and error correction, perhaps enabling md-raid to raid pmem devices and then enable DAX on top of that and we'll have a better chance to handle errors, but that level of recovery isn't what these patches are aiming for -- that is obviously a longer term effort. These simply aim to provide that disaster recovery path when a single sector failure does take down the service. Today, on a dax enabled filesystem, if/when the app hits an error and crashes, dax is simply disabled till the errors are gone. This is obviously less than ideal. (This was done because there is currently no way for a DAX file system to send any IO - mmap or otherwise - through the driver, including zeroing of new fs blocks). These patches enable the DR path by allowing some non-mmap IO (most importantly zeroing) to go through the driver which can tell the device to do some remapping etc. So, yes, this is very much a DR case in our current pmem+dax architecture, and we should probably design more robust handling at the block/md/fs layer, but with these, you at least get to crash the app, delete its files and restore them from out-of-band backups and continue with DAX. > > Cheers, > > Dave. From dan.j.williams@intel.com Tue Apr 26 09:59:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 64B3E7CDC for ; Tue, 26 Apr 2016 09:59:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id EF6DFAC001 for ; Tue, 26 Apr 2016 07:59:12 -0700 (PDT) X-ASG-Debug-ID: 1461682751-04bdf035902456b0001-NocioJ Received: from mail-oi0-f48.google.com (mail-oi0-f48.google.com [209.85.218.48]) by cuda.sgi.com with ESMTP id MRhw9fYCEfDlxuTN (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 26 Apr 2016 07:59:11 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Effective-Source-IP: mail-oi0-f48.google.com[209.85.218.48] X-Barracuda-Apparent-Source-IP: 209.85.218.48 Received: by mail-oi0-f48.google.com with SMTP id r78so17694305oie.0 for ; Tue, 26 Apr 2016 07:59:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=oySleQSKSj+xRzPPwX/zcw4vyKkbunLUqrdEzjsWFHk=; b=MCtGOioRlvpS88BuuEAT8F5Ai8d7PaI9NkTbHpiP8p+v1fES+32csX8nkNnbtE1ddS 6yW48ZwM2wr9pRuUjjlIAM0jtlrYYE3Qp7t2ZhBe6aFe4QPxk8fE9Zk9L+HK/4/SHRM9 YVtGk0I6JKXhLEdaPs0yWUNoHMn2gxRytv/BF+pAVXbNb3RvABW8yjeOWS6D4eUpFILf i1oM945U9UT+iR+TVQdKIHNUl8E5aIH6AMEiyec5kqEFMGNPHRh+vSl3qy9WJ3M9yYwD g7ZlFqLs3tYw/9w5TKpWqlNhA5A7vssRiGK0kHackP5HEYkmudKZak64y8e2bM5PCuX6 H6Kw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=oySleQSKSj+xRzPPwX/zcw4vyKkbunLUqrdEzjsWFHk=; b=SQV3dM9y9PZ8zZDNK/T+Cv38aiYfW9cRGhQ5A7DUF1AluLegV6qA/Mu3E04ynHd0RP jXerGe1YJn5pnyIrfAu6oUr6jYRoWmGbSkoTvJlsJw40V1xgJo8vUsy9VE68nOTW5xjx vhHQWsC1Ztou9/SOFrat0nfl9eHBSLCsxSQw6M3em9mAVibGSjcTmPZOZ/RQHvFMd0T1 gV4ikqWWz9+SDAYvRLnSm8nOzDFP/Z95UWp9i+xUw25vU5b4JEHIObDLagWAs1rzWYHG 5qNyXqpiHhxajwIhs59n8wzZzLiEXfoRaGsqcEDZhTrXWU5eoun/kAx0cC2G2nFUods6 iM+w== X-Gm-Message-State: AOPr4FWJTK37CPhhSFdNBp/Yh/e2rK4JVFk53pLpmbnWkt9jJxskUQqnmTCL6I2IrJIBf0e+teCtaD8z8GWLUieh MIME-Version: 1.0 X-Received: by 10.157.55.139 with SMTP id x11mr1310929otb.66.1461682750856; Tue, 26 Apr 2016 07:59:10 -0700 (PDT) Received: by 10.157.38.39 with HTTP; Tue, 26 Apr 2016 07:59:10 -0700 (PDT) In-Reply-To: <20160426082711.GC26977@dastard> References: <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> <20160425232552.GD18496@dastard> <20160426001157.GE18496@dastard> <20160426025645.GG18496@dastard> <20160426082711.GC26977@dastard> Date: Tue, 26 Apr 2016 07:59:10 -0700 Message-ID: Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io From: Dan Williams X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io To: Dave Chinner Cc: "Verma, Vishal L" , "linux-block@vger.kernel.org" , "jack@suse.cz" , "axboe@fb.com" , "linux-nvdimm@ml01.01.org" , "linux-kernel@vger.kernel.org" , "xfs@oss.sgi.com" , "hch@infradead.org" , "linux-mm@kvack.org" , "Wilcox, Matthew R" , "linux-fsdevel@vger.kernel.org" , "akpm@linux-foundation.org" , "linux-ext4@vger.kernel.org" , "viro@zeniv.linux.org.uk" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oi0-f48.google.com[209.85.218.48] X-Barracuda-Start-Time: 1461682751 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1267 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29072 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Apr 26, 2016 at 1:27 AM, Dave Chinner wrote: > On Mon, Apr 25, 2016 at 09:18:42PM -0700, Dan Williams wrote: [..] > It seems to me you are focussing on code/technologies that exist > today instead of trying to define an architecture that is more > optimal for pmem storage systems. Yes, working code is great, but if > you can't tell people how things like robust error handling and > redundancy are going to work in future then it's going to take > forever for everyone else to handle such errors robustly through the > storage stack... Precisely because higher order redundancy is built on top this baseline. MD-RAID can't do it's error recovery if we don't have -EIO and clear-error-on-write. On the other hand, you're absolutely right that we have a gaping hole on top of the SIGBUS recovery model, and don't have a kernel layer we can interpose on top of DAX to provide some semblance of redundancy. In the meantime, a handful of applications with a team of full-time site-reliability-engineers may be able to plug in external redundancy infrastructure on top of what is defined in these patches. For everyone else, the hard problem, we need to do a lot more thinking about a trap and recover solution. From vishal@kernel.org Tue Apr 26 10:01:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 94FCE7CDF for ; Tue, 26 Apr 2016 10:01:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 647DE304067 for ; Tue, 26 Apr 2016 08:01:50 -0700 (PDT) X-ASG-Debug-ID: 1461682903-04cbb00fe923e7c0001-NocioJ Received: from mail.kernel.org ([198.145.29.136]) by cuda.sgi.com with ESMTP id 6CHvCc3lQOotXJbP (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 26 Apr 2016 08:01:44 -0700 (PDT) X-Barracuda-Envelope-From: vishal@kernel.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.145.29.136] 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 EB8F620204; Tue, 26 Apr 2016 15:01:37 +0000 (UTC) Received: from gamestarV3L (184-99-237-189.hlrn.qwest.net [184.99.237.189]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 08E30201BB; Tue, 26 Apr 2016 15:01:32 +0000 (UTC) Message-ID: <1461682892.26226.23.camel@kernel.org> Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io From: Vishal Verma X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io To: "hch@infradead.org" , "Verma, Vishal L" Cc: "Wilcox, Matthew R" , "linux-kernel@vger.kernel.org" , "linux-block@vger.kernel.org" , "xfs@oss.sgi.com" , "linux-nvdimm@ml01.01.org" , "jmoyer@redhat.com" , "linux-mm@kvack.org" , "viro@zeniv.linux.org.uk" , "axboe@fb.com" , "akpm@linux-foundation.org" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , "david@fromorbit.com" , "jack@suse.cz" Date: Tue, 26 Apr 2016 09:01:32 -0600 In-Reply-To: <20160426083332.GB364@infradead.org> References: <1459303190-20072-1-git-send-email-vishal.l.verma@intel.com> <1459303190-20072-6-git-send-email-vishal.l.verma@intel.com> <20160420205923.GA24797@infradead.org> <1461434916.3695.7.camel@intel.com> <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> <20160426083332.GB364@infradead.org> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.18.5.2 (3.18.5.2-1.fc23) Mime-Version: 1.0 Content-Transfer-Encoding: 8bit X-Virus-Scanned: ClamAV using ClamSMTP X-Barracuda-Connect: UNKNOWN[198.145.29.136] X-Barracuda-Start-Time: 1461682903 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1306 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29072 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, 2016-04-26 at 01:33 -0700, hch@infradead.org wrote: > On Mon, Apr 25, 2016 at 05:14:36PM +0000, Verma, Vishal L wrote: > > > > - Application hits EIO doing dax_IO or load/store io > > > > - It checks badblocks and discovers it's files have lost data > > > > - It write()s those sectors (possibly converted to file offsets > > using > > fiemap) > > ?? ?? * This triggers the fallback path, but if the application is > > doing > > this level of recovery, it will know the sector is bad, and write > > the > > entire sector > This sounds like a mess. > > > > > I think if we want to keep allowing arbitrary alignments for the > > dax_do_io path, we'd need: > > 1. To represent badblocks at a finer granularity (likely cache > > lines) > > 2. To allow the driver to do IO to a *block device* at sub-sector > > granularity > It's not a block device if it supports DAX.  It's byte addressable > memory masquerading as a block device. Yes but we made that decision a while back with pmem :) Are you saying it should stop being a block device anymore? > -- > To unsubscribe from this list: send the line "unsubscribe linux- > block" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at  http://vger.kernel.org/majordomo-info.html From surface.protection.solution-xfs=oss.sgi.com@scubashax.com Tue Apr 26 10:11:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 091947CE3 for ; Tue, 26 Apr 2016 10:11:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C75448F8033 for ; Tue, 26 Apr 2016 08:11:03 -0700 (PDT) X-ASG-Debug-ID: 1461683460-04cb6c09a226cf50001-NocioJ Received: from mail.scubashax.com (til231.members.turizm.com [94.156.132.231]) by cuda.sgi.com with ESMTP id qmoewuGpyR3KCzFE for ; Tue, 26 Apr 2016 08:11:01 -0700 (PDT) X-Barracuda-Envelope-From: surface.protection.solution-xfs=oss.sgi.com@scubashax.com X-Barracuda-Effective-Source-IP: til231.members.turizm.com[94.156.132.231] X-Barracuda-Apparent-Source-IP: 94.156.132.231 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=dkim; d=scubashax.com; h=Date:From:To:Subject:MIME-Version:Content-Type:Message-ID; i=surface.protection.solution@scubashax.com; bh=BI9Gi7r+wSr+2SWDJoj7abefSJY=; b=xDsZ6YjNKYtmmBe9PqsKZmqLJ96WSzC4z8+lteyrU3F5/uM7/CqJA3I6kj0Ro10yEuoZKm7yDz9M B13LMWFzG0tomFJrvg/MRAgZXvJkavMn1x+abAQgabDjGNVnMjwdHvKLs1AoWBH0cT+HQEKun2e4 gAxwcWhrqX7xsse+0UE= DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=dkim; d=scubashax.com; b=O2oaHa8aIjtFr5ysxe6YSvwS8xeR7XJnT9MfOyTQHcCXNobnOG7w6uNkinl+WL9lgkP2qnAjQhOi EwfPxqvD9kdt+FwvrQmpPpZV5R5uF/7t81fJ2pynPbiJiBMVOSNgu8Z9zotsXzFys2gvjV6HcziG eQVdEALI5R5uJDuSvTQ=; Received: by mail.scubashax.com id h3u2ns0001gk for ; Tue, 26 Apr 2016 10:06:33 -0500 (envelope-from ) Date: Tue, 26 Apr 2016 10:06:33 -0500 From: "Surface Protection Solution" To: Subject: Protect & Restore your floors MIME-Version: 1.0 X-ASG-Orig-Subj: Protect & Restore your floors Content-Type: multipart/alternative; boundary="----=_Part_16_1427994677.1461682859653" Message-ID: <0.0.0.1.1D19FCD386B7BD2.51D1F2@mail.scubashax.com> X-Barracuda-Connect: til231.members.turizm.com[94.156.132.231] X-Barracuda-Start-Time: 1461683460 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4458 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.00 X-Barracuda-Spam-Status: No, SCORE=1.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, FR_3TAG_3TAG, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29072 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 1.00 FR_3TAG_3TAG RAW: Looks like 3 small tags. ------=_Part_16_1427994677.1461682859653 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Protect & Restore your floors http://www.scubashax.com/dc7Ks8652f2ZsnFjnn0ntv0Mjh9f4/red Update Preferences- http://www.scubashax.com/miss/e40w8k65Eg2f7ZsnFjnn0ntv0Mjha8c ------=_Part_16_1427994677.1461682859653 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit

    Protect & Restore your floors

     
    Protect your investment with ProSurfaceSaver - an easy to use, industrial strength DIY  sealant for wood, concrete and metal surfaces.
    Click here for your free quote. 

      Click Here to Protect your Surfaces - Free Quote

    Commercial, Residential &   Industrial Applications

    ProSurfaceSaver sealants are able to coat, protect, and restore almost any wood, concrete or metal surface.

      -Use on your garage floor or basement

              - Works great on metal roofs

          - Coat and protect your driveway

          - Excellent for warehouse and industrial facilities

        Click Here to get a free quote for your project

     

    Questions?  Concerns? Write to us at:  1930 Village Center Circle #3-3787
    Las Vegas, NV 89134.


    Update Preferences.

    © 2016 ProSurfaceSaver. All rights reserved.










     


    ------=_Part_16_1427994677.1461682859653-- From jack@suse.cz Tue Apr 26 10:31:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5256A7CE5 for ; Tue, 26 Apr 2016 10:31:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0A17D304051 for ; Tue, 26 Apr 2016 08:31:25 -0700 (PDT) X-ASG-Debug-ID: 1461684681-04cb6c09a126dae0001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id mxCvKPxZDoEEJVSe (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 26 Apr 2016 08:31:22 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Effective-Source-IP: mx2.suse.de[195.135.220.15] 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 324A1ABDD; Tue, 26 Apr 2016 15:31:18 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id 098761E0962; Tue, 26 Apr 2016 17:31:18 +0200 (CEST) Date: Tue, 26 Apr 2016 17:31:18 +0200 From: Jan Kara To: Dan Williams Cc: Dave Chinner , "Verma, Vishal L" , "linux-block@vger.kernel.org" , "jack@suse.cz" , "axboe@fb.com" , "linux-nvdimm@ml01.01.org" , "linux-kernel@vger.kernel.org" , "xfs@oss.sgi.com" , "hch@infradead.org" , "linux-mm@kvack.org" , "Wilcox, Matthew R" , "linux-fsdevel@vger.kernel.org" , "akpm@linux-foundation.org" , "linux-ext4@vger.kernel.org" , "viro@zeniv.linux.org.uk" Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Message-ID: <20160426153118.GI27612@quack2.suse.cz> X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io References: <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> <20160425232552.GD18496@dastard> <20160426001157.GE18496@dastard> <20160426025645.GG18496@dastard> <20160426082711.GC26977@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1461684682 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2220 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29072 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue 26-04-16 07:59:10, Dan Williams wrote: > On Tue, Apr 26, 2016 at 1:27 AM, Dave Chinner wrote: > > On Mon, Apr 25, 2016 at 09:18:42PM -0700, Dan Williams wrote: > [..] > > It seems to me you are focussing on code/technologies that exist > > today instead of trying to define an architecture that is more > > optimal for pmem storage systems. Yes, working code is great, but if > > you can't tell people how things like robust error handling and > > redundancy are going to work in future then it's going to take > > forever for everyone else to handle such errors robustly through the > > storage stack... > > Precisely because higher order redundancy is built on top this baseline. > > MD-RAID can't do it's error recovery if we don't have -EIO and > clear-error-on-write. On the other hand, you're absolutely right that > we have a gaping hole on top of the SIGBUS recovery model, and don't > have a kernel layer we can interpose on top of DAX to provide some > semblance of redundancy. > > In the meantime, a handful of applications with a team of full-time > site-reliability-engineers may be able to plug in external redundancy > infrastructure on top of what is defined in these patches. For > everyone else, the hard problem, we need to do a lot more thinking > about a trap and recover solution. So we could actually implement some kind of redundancy with DAX with reasonable effort. We already do track dirty storage PFNs in the radix tree. After DAX locking patches get merged we also have a reliable way to write-protect them when we decide to do 'writeback' (translates to flushing CPU caches) for them. When we do that, we have all the infrastructure in place to provide 'stable pages' while some mirroring or other redundancy mechanism in kernel works with the data. But as Dave said, we should do some writeup of how this is all supposed to work and e.g. which layer is going to be responsible for the redundancy. Do we want to have that in DAX code? Or just provide stable page guarantees from DAX and do the redundancy from device mapper? This needs more thought... Honza -- Jan Kara SUSE Labs, CR From dan.j.williams@intel.com Tue Apr 26 12:16:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AC1A27CE7 for ; Tue, 26 Apr 2016 12:16:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2CCFDAC002 for ; Tue, 26 Apr 2016 10:16:29 -0700 (PDT) X-ASG-Debug-ID: 1461690982-04bdf0358e24b350001-NocioJ Received: from mail-ob0-f172.google.com (mail-ob0-f172.google.com [209.85.214.172]) by cuda.sgi.com with ESMTP id VIb1m5c6XZQC0AtI (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 26 Apr 2016 10:16:23 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Effective-Source-IP: mail-ob0-f172.google.com[209.85.214.172] X-Barracuda-Apparent-Source-IP: 209.85.214.172 Received: by mail-ob0-f172.google.com with SMTP id bg3so10217840obb.1 for ; Tue, 26 Apr 2016 10:16:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=iPRyMPoOvN8Giilhkx4r8qaa4+hKtUxgL7dzKZ53zeE=; b=OvnWq+kjD8m17cpRbarQdDvv5LdCvHUkh8QbxRse9nEdQK5+FEKvx1AIV8RgrHwzyv QRamSsrPrfJ4KAaU2+xXE31L8gGb50UaLdh8XcOW14mmXCTPwKdtqOz518CVFw0l7ZDN W2HhqYqn6qpm6SIKxJ7gfB0I2/zdSoDdkR+XNuEf87rW56vaOWWffVWQuMowDW247lgh Ju96+CoMp0Wa7M4yINTE8jUWIWURNapCq3q+LfMkKiEPlf015spMjTTPk2NNXI2c8W3g RQteCeXwQP1tSDSjAscQbR5NI3baHhCSSR8yqTtv8F7PqpZuOq0uliWNfUy1STleJe2d K2XA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=iPRyMPoOvN8Giilhkx4r8qaa4+hKtUxgL7dzKZ53zeE=; b=mUvXeWzZlAj0iHmqzVdl2WjjS2lHz93u9g8BnoYE+70Acbvj06G4H3yVKNI9qw7Rgy E5+af3hn1fMSXIhsis4Zs4ZLw7ZT06aYtLL/nin6ZAR9SH7OgUpE5rSNZYGISBMrPlGu ESi6Wi8y4xmazu34YB0Q522DPnW88kJdViapQkoKEnONDbl3hkcLBwIRN07Ks5bnp37p VP0fszWedNHRrghU4g3Fn+qVAsh9MLDFYzu8cGcUpkax7tOMvpKBkOVaF3ZsVABIamYt G8SnEkFptj4qETNIHN/HG+LDLRGoh0RdgfQd6LtAFOssVjQPd8oIq5SxkAoIa3uxzZ29 LK2g== X-Gm-Message-State: AOPr4FVKZjHeA1IwS5n0c/+u3vjDxJcF1VXIDtHXP9XfO18Xle0JYf2BGctQiZePIOdkgIx5KWQjmapueLCw/Nho MIME-Version: 1.0 X-Received: by 10.60.173.69 with SMTP id bi5mr1619545oec.59.1461690982442; Tue, 26 Apr 2016 10:16:22 -0700 (PDT) Received: by 10.157.38.39 with HTTP; Tue, 26 Apr 2016 10:16:22 -0700 (PDT) In-Reply-To: <20160426153118.GI27612@quack2.suse.cz> References: <20160425083114.GA27556@infradead.org> <1461604476.3106.12.camel@intel.com> <20160425232552.GD18496@dastard> <20160426001157.GE18496@dastard> <20160426025645.GG18496@dastard> <20160426082711.GC26977@dastard> <20160426153118.GI27612@quack2.suse.cz> Date: Tue, 26 Apr 2016 10:16:22 -0700 Message-ID: Subject: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io From: Dan Williams X-ASG-Orig-Subj: Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io To: Jan Kara Cc: Dave Chinner , "Verma, Vishal L" , "linux-block@vger.kernel.org" , "axboe@fb.com" , "linux-nvdimm@ml01.01.org" , "linux-kernel@vger.kernel.org" , "xfs@oss.sgi.com" , "hch@infradead.org" , "linux-mm@kvack.org" , "Wilcox, Matthew R" , "linux-fsdevel@vger.kernel.org" , "akpm@linux-foundation.org" , "linux-ext4@vger.kernel.org" , "viro@zeniv.linux.org.uk" , Mike Snitzer Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ob0-f172.google.com[209.85.214.172] X-Barracuda-Start-Time: 1461690983 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3142 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29075 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Apr 26, 2016 at 8:31 AM, Jan Kara wrote: > On Tue 26-04-16 07:59:10, Dan Williams wrote: >> On Tue, Apr 26, 2016 at 1:27 AM, Dave Chinner wrote: >> > On Mon, Apr 25, 2016 at 09:18:42PM -0700, Dan Williams wrote: >> [..] >> > It seems to me you are focussing on code/technologies that exist >> > today instead of trying to define an architecture that is more >> > optimal for pmem storage systems. Yes, working code is great, but if >> > you can't tell people how things like robust error handling and >> > redundancy are going to work in future then it's going to take >> > forever for everyone else to handle such errors robustly through the >> > storage stack... >> >> Precisely because higher order redundancy is built on top this baseline. >> >> MD-RAID can't do it's error recovery if we don't have -EIO and >> clear-error-on-write. On the other hand, you're absolutely right that >> we have a gaping hole on top of the SIGBUS recovery model, and don't >> have a kernel layer we can interpose on top of DAX to provide some >> semblance of redundancy. >> >> In the meantime, a handful of applications with a team of full-time >> site-reliability-engineers may be able to plug in external redundancy >> infrastructure on top of what is defined in these patches. For >> everyone else, the hard problem, we need to do a lot more thinking >> about a trap and recover solution. > > So we could actually implement some kind of redundancy with DAX with > reasonable effort. We already do track dirty storage PFNs in the radix > tree. After DAX locking patches get merged we also have a reliable way to > write-protect them when we decide to do 'writeback' (translates to flushing > CPU caches) for them. When we do that, we have all the infrastructure in > place to provide 'stable pages' while some mirroring or other redundancy > mechanism in kernel works with the data. > > But as Dave said, we should do some writeup of how this is all supposed to > work and e.g. which layer is going to be responsible for the redundancy. Do > we want to have that in DAX code? Or just provide stable page guarantees > from DAX and do the redundancy from device mapper? This needs more > thought... > [ adding Mike, since his ears are likely burning by this point ] If we had the ability to specify a range or list of ranges to blkdev_issue_flush() that would allow the driver level to implement redundancy at sync time. And no, before someone flies off the handle, this isn't rehashing the same argument I lost about where to track dirty pfns. Rather this relies on the radix to track dirty pfns, but asks the driver to do the flush operation. In the nominal case this is a clflush / clwb loop or wbinvd in the pmem driver, in the redundancy case the pmem driver is swapped out for a driver that uses the flush request as a trigger point to synchronize redundant data. We want this at the driver level to take advantage of standard asynchronous completions, and make it administratively equivalent to the dm/md layering people are used to using. From Benjamin.Wirth@winmagic.com Tue Apr 26 15:51:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 440C47CF9 for ; Tue, 26 Apr 2016 15:51:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 154808F8052 for ; Tue, 26 Apr 2016 13:51:15 -0700 (PDT) X-ASG-Debug-ID: 1461703872-04cbb00fe9250100001-NocioJ Received: from mail1.bemta12.messagelabs.com (mail1.bemta12.messagelabs.com [216.82.251.14]) by cuda.sgi.com with ESMTP id 44KheuETMDz1gFWD for ; Tue, 26 Apr 2016 13:51:13 -0700 (PDT) X-Barracuda-Envelope-From: Benjamin.Wirth@winmagic.com X-Barracuda-Effective-Source-IP: mail1.bemta12.messagelabs.com[216.82.251.14] X-Barracuda-Apparent-Source-IP: 216.82.251.14 Received: from [216.82.251.34] by server-14.bemta-12.messagelabs.com id E4/A9-19275-0C4DF175; Tue, 26 Apr 2016 20:51:12 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrDIsWRWlGSWpSXmKPExsWSocJ5SffAFfl wg5efhS0W9d1idGD0WH1hK2MAYxRrZl5SfkUCa8a6pW+YC3aqVSy40sbcwLhAqYuRi0NIYDqj xJxNF1kgnOOMEm3nOoAcTg42ASOJlkPn2bsYOThEBNQlHv+3BgkLC1hJPO8+xQxiiwjYS7zfP ZMFokRP4tImFxCTRUBVYt3fbJAKXoEgib2LD4JVMwqISXw/tYYJxGYWEJe49WQ+mC0hICCxZM 95ZghbVOLl43+sELa8xI2WdlaI+jyJn98uMULMFJQ4OfMJ2JFCAhoS67YcgqoPlnjzpY15AqP QLCQrZiFpn4WkHSKuI7Fg9yc2CFtbYtnC18ww9pkDj5mQxRcwsq9i1ChOLSpLLdI1MtRLKspM zyjJTczM0TU0NNLLTS0uTkxPzUlMKtZLzs/dxAiMlXoGBsYdjO3TvQ4xSnIwKYnyxq6TDxfiS 8pPqcxILM6ILyrNSS0+xCjDwaEkwZt4GSgnWJSanlqRlpkDjFqYtAQHj5IIrxQwcoV4iwsSc4 sz0yFSpxgVpcR5WUASAiCJjNI8uDZYorjEKCslzMvIwMAgxFOQWpSbWYIq/4pRnINRSZi3EGQ 7T2ZeCdz0V0CLmYAWXz4kC7K4JBEhJdXAKFJ28VtItJx5cW7iRpm9TLve2mi9+anTo571S/iT Xs/kRc5bohzfNvyYYcqRXikjeNrd76fECpeqI2o/Cljycq74HjiwdsZ5W3HV9b9ad9y828xj1 xJeyuSXM3O5pft3AaGg/e5952Ymb+0QsfN17VucMXPax17pmraO7n7lP/45QsI+zSpKLMUZiY ZazEXFiQCF+YgxDwMAAA== X-Env-Sender: Benjamin.Wirth@winmagic.com X-Msg-Ref: server-4.tower-145.messagelabs.com!1461703871!25709346!1 X-Originating-IP: [104.36.9.210] X-StarScan-Received: X-StarScan-Version: 8.28; banners=-,-,- X-VirusChecked: Checked Received: (qmail 124942 invoked from network); 26 Apr 2016 20:51:12 -0000 Received: from 104-36-9-210.dedicated.allstream.net (HELO mail.winmagic.com) (104.36.9.210) by server-4.tower-145.messagelabs.com with SMTP; 26 Apr 2016 20:51:12 -0000 Received: from WMSEXCHSVR02.winmagic.local ([10.10.2.28]) by mail.winmagic.com with Microsoft SMTPSVC(6.0.3790.4675); Tue, 26 Apr 2016 16:51:11 -0400 Received: from WMSEXCHSVR01.winmagic.local ([fe80::e48c:f8da:c401:64eb]) by wmsexchsvr02.winmagic.local ([fe80::dc94:79fd:690a:f31d%16]) with mapi id 14.03.0266.001; Tue, 26 Apr 2016 16:51:11 -0400 From: Benjamin Wirth To: "xfs@oss.sgi.com" Subject: development APIs for used/free blocks information Thread-Topic: development APIs for used/free blocks information X-ASG-Orig-Subj: development APIs for used/free blocks information Thread-Index: AdGf/VxhHvG/iQ6eTkuDbtQDeeIgSA== Date: Tue, 26 Apr 2016 20:51:10 +0000 Message-ID: <97A4F433DEE099488FE21C1718A641D2139E86F5@wmsexchsvr01.winmagic.local> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.11.3.114] Content-Type: multipart/alternative; boundary="_000_97A4F433DEE099488FE21C1718A641D2139E86F5wmsexchsvr01win_" MIME-Version: 1.0 X-OriginalArrivalTime: 26 Apr 2016 20:51:11.0754 (UTC) FILETIME=[5DABD6A0:01D19FFD] X-Barracuda-Connect: mail1.bemta12.messagelabs.com[216.82.251.14] X-Barracuda-Start-Time: 1461703872 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4523 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.62 X-Barracuda-Spam-Status: No, SCORE=0.62 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MARKETING_SUBJECT, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29081 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 HTML_MESSAGE BODY: HTML included in message --_000_97A4F433DEE099488FE21C1718A641D2139E86F5wmsexchsvr01win_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hello, I was looking for development APIs for XFS. The contents of xfsprogs-devel = seem to only contain a few IOCTL commands, mostly file/inode based operatio= ns. I need to query free/used blocks of an entire XFS filesystem and was hoping= to find some user-space APIs for this. I have done the same task for EXT f= ilesystem which seemed fairly easy as it provided simple open/query/close A= PIs. I know that XFS is a bit different as it manages free extents in two B= + trees per AG, but is this free/used block/extent information externalized= somehow for developers to use? Am I not looking in the right place or thes= e functionalities are simply not provided to application developers? Any help/pointers would be greatly appreciated. Regards, Benjamin Wirth | Senior Software Developer WinMagic Inc. 5600A Cancross Court Mississauga, ON | L5R 3E9 | Canada --_000_97A4F433DEE099488FE21C1718A641D2139E86F5wmsexchsvr01win_ Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

    Hello,

     

    I was looking for development APIs for XFS. The cont= ents of xfsprogs-devel seem to only contain a few IOCTL commands, mostly fi= le/inode based operations.

     

    I need to query free/used blocks of an entire XFS fi= lesystem and was hoping to find some user-space APIs for this. I have done = the same task for EXT filesystem which seemed fairly easy as it provided si= mple open/query/close APIs. I know that XFS is a bit different as it manages free extents in two B+ trees= per AG, but is this free/used block/extent information externalized someho= w for developers to use? Am I not looking in the right place or these funct= ionalities are simply not provided to application developers?

     

    Any help/pointers would be greatly appreciated.=

     

    Regards,

     

    Benjamin Wirth | Senior Software Developer

    WinMagic Inc.
    5600A Cancross Court =

    Mississauga, ON  |  L5R 3E9 |  Canada=

     

    --_000_97A4F433DEE099488FE21C1718A641D2139E86F5wmsexchsvr01win_-- From sandeen@sandeen.net Tue Apr 26 16:33:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 936AE7CFB for ; Tue, 26 Apr 2016 16:33:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 59226304032 for ; Tue, 26 Apr 2016 14:33:40 -0700 (PDT) X-ASG-Debug-ID: 1461706418-04bdf03590255360001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 44gI5AHRLm7l3SxC for ; Tue, 26 Apr 2016 14:33:38 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 0DA839E for ; Tue, 26 Apr 2016 16:33:38 -0500 (CDT) Subject: Re: development APIs for used/free blocks information To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: development APIs for used/free blocks information References: <97A4F433DEE099488FE21C1718A641D2139E86F5@wmsexchsvr01.winmagic.local> From: Eric Sandeen Message-ID: <571FDEB1.90701@sandeen.net> Date: Tue, 26 Apr 2016 16:33:37 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: <97A4F433DEE099488FE21C1718A641D2139E86F5@wmsexchsvr01.winmagic.local> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1461706418 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1015 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.29081 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On 4/26/16 3:51 PM, Benjamin Wirth wrote: > Hello, > > I was looking for development APIs for XFS. The contents of > xfsprogs-devel seem to only contain a few IOCTL commands, mostly > file/inode based operations. > > I need to query free/used blocks of an entire XFS filesystem and was > hoping to find some user-space APIs for this. I have done the same > task for EXT filesystem which seemed fairly easy as it provided > simple open/query/close APIs. I know that XFS is a bit different as > it manages free extents in two B+ trees per AG, but is this free/used > block/extent information externalized somehow for developers to use? > Am I not looking in the right place or these functionalities are > simply not provided to application developers? > > Any help/pointers would be greatly appreciated. It's not exported for application developers, no; it's not generally something applications need, AFAIK. You could look at how the freesp_f function works in xfs_db, I suppose. -Eric From david@fromorbit.com Tue Apr 26 17:21:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E664C7CEE for ; Tue, 26 Apr 2016 17:21:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A8E798F804C for ; Tue, 26 Apr 2016 15:21:50 -0700 (PDT) X-ASG-Debug-ID: 1461709302-04cbb00fe7251fd0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id j8OIwdlQ82sDZ9OW for ; Tue, 26 Apr 2016 15:21:43 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2B3FQAS6R9X/8/E03ZegziBUIJzongGjBSJe4YJBAICgT9NAQEBAQEBZidBAQEBAQEBAQcCAoNvAQEEOhwjEAgDGAklDwUlAyETiCnEUAEBAQcCAR0ZhUCFE4dqgisBBJgQjg2BWwGNP48wYoN9KjCBUFeDAIF2ghEBAQE Received: from ppp118-211-196-207.lns20.syd4.internode.on.net (HELO dastard) ([118.211.196.207]) by ipmail07.adl2.internode.on.net with ESMTP; 27 Apr 2016 07:51:42 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1avBMH-0001ee-7q; Wed, 27 Apr 2016 08:21:29 +1000 Date: Wed, 27 Apr 2016 08:21:29 +1000 From: Dave Chinner To: Benjamin Wirth Cc: "xfs@oss.sgi.com" Subject: Re: development APIs for used/free blocks information Message-ID: <20160426222129.GD26977@dastard> X-ASG-Orig-Subj: Re: development APIs for used/free blocks information References: <97A4F433DEE099488FE21C1718A641D2139E86F5@wmsexchsvr01.winmagic.local> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <97A4F433DEE099488FE21C1718A641D2139E86F5@wmsexchsvr01.winmagic.local> 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: 1461709302 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 446 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29082 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Apr 26, 2016 at 08:51:10PM +0000, Benjamin Wirth wrote: > Hello, > > I was looking for development APIs for XFS. The contents of > xfsprogs-devel seem to only contain a few IOCTL commands, mostly > file/inode based operations. > > I need to query free/used blocks of an entire XFS filesystem and > was hoping to find some user-space APIs for this. $ man 2 statvfs Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 26 17:46:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 988F67CF5 for ; Tue, 26 Apr 2016 17:46:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4B3B08F8052 for ; Tue, 26 Apr 2016 15:46:29 -0700 (PDT) X-ASG-Debug-ID: 1461710786-04cbb00fe82528a0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id j92L8tfvZwNg5NeS for ; Tue, 26 Apr 2016 15:46:26 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CTBgAG7x9X/8/E03ZegziBUIJzongGjBSDUYIZhBGGCQQCAoE6TQEBAQEBAWYnhEEBAQEDATocIwULCAMYCSUPBSUDIRMbiAcHxFABAQEBAQUBAQEBHBmFQIUTh2qCKwWHcYcViQqODY8bRY5rYoIFGxaBRyowiS4BAQE Received: from ppp118-211-196-207.lns20.syd4.internode.on.net (HELO dastard) ([118.211.196.207]) by ipmail07.adl2.internode.on.net with ESMTP; 27 Apr 2016 08:16:25 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1avBkC-0001iN-PB; Wed, 27 Apr 2016 08:46:12 +1000 Date: Wed, 27 Apr 2016 08:46:12 +1000 From: Dave Chinner To: Shyam Kaushik Cc: xfs@oss.sgi.com, Alex Lyakas Subject: Re: [PATCH] xfs_buf_iodone_callbacks to force shutdown & resubmit buf in case of permanent failure Message-ID: <20160426224612.GE26977@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs_buf_iodone_callbacks to force shutdown & resubmit buf in case of permanent failure 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: 1461710786 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3138 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29082 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Apr 26, 2016 at 07:31:59PM +0530, Shyam Kaushik wrote: > When XFS underlying disk fails, it could take several milliseconds for the > FS to be marked > shutdown. xfs_buf_iodone_callbacks() retries buf upon first failure by > submitting it once > again. But if the buf fails 2nd time before FS is marked for shutdown, it > just releases the > buf with xfs_buf_relse(). This is flawed that nobody is releasing the > XFS_IFLOCK on the inode. > Because of this AIL tasks repeated effort to xfs_inode_item_push() will > see that xfs_iflock() > cannot be acquired. This blocks XFS from being unmounted as > xfs_ail_push_all_sync() will keep > looping without progress. Patch formatting first: commit messages should wrap at 68-72 columns... > Fix this by marking the FS for shutdown if we have a permanent failure & > resubmit the buf. > xfs_buf_submit() will see FS marked for shutdown & invoke the callback > which releases > XFS_IFLOCK. > > diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c > index 1a6c9b9..6f73ee0 100644 > --- a/fs/xfs/xfs_buf_item.c > +++ b/fs/xfs/xfs_buf_item.c > @@ -1100,7 +1100,12 @@ xfs_buf_iodone_callbacks( > XBF_DONE | XBF_WRITE_FAIL; > xfs_buf_submit(bp); > } else { > - xfs_buf_relse(bp); > + /* > + * if we have the buf fail 2nd time, force a FS > shutdown & resubmit > + * the buf for it to be failed back immediately > + */ > + xfs_force_shutdown(mp, SHUTDOWN_LOG_IO_ERROR); > + xfs_buf_submit(bp); > } > > return; ... and patches should not be wrapped or have tabs converted to spaces. See Documentation/SubmittingPatches. Ok, so yes, it would seem there is a bug here, but I don't think this is correct solution: this will shut down the filesystem immediately on inode write IO errors. As i've said *many* times before: this is might seem like a fix, but it is incorrect behaviour as it does not give transient failures (e.g. multipath failover causing timeouts) a chance to be resolved before shutting down the filesystem. That's the reason for all the retry behaviour on XFS metadata - the system can continue to run logging new changes even if it can't write back the changes immediately. As long as the log writes continue to work, the filesystem can continue to function correctly. Hence shutting down the filesystem immediately on any metadata write error (other than a journal write) is premature and will lead to spurious errors causing shutdowns rather than just logging a warning. We are in the process of making this error behaviour configurable - Carlos is going to finish off the patchset I originally wrote to do this, so the "shutdown immediately" option will be avaialable through that set of interfaces. We'll still need to fix the unlock case for retry here, though... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Tue Apr 26 17:51:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E282F7CF8 for ; Tue, 26 Apr 2016 17:51:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A2B83304032 for ; Tue, 26 Apr 2016 15:51:37 -0700 (PDT) X-ASG-Debug-ID: 1461711094-04cbb00fe9252bf0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id juWbBDOgDJYDMv0d for ; Tue, 26 Apr 2016 15:51:34 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 933619E for ; Tue, 26 Apr 2016 17:51:34 -0500 (CDT) Subject: Re: development APIs for used/free blocks information To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: development APIs for used/free blocks information References: <97A4F433DEE099488FE21C1718A641D2139E86F5@wmsexchsvr01.winmagic.local> <20160426222129.GD26977@dastard> From: Eric Sandeen Message-ID: <571FF0F6.2030202@sandeen.net> Date: Tue, 26 Apr 2016 17:51:34 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: <20160426222129.GD26977@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: 1461711094 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 615 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.29084 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On 4/26/16 5:21 PM, Dave Chinner wrote: > On Tue, Apr 26, 2016 at 08:51:10PM +0000, Benjamin Wirth wrote: >> Hello, >> >> I was looking for development APIs for XFS. The contents of >> xfsprogs-devel seem to only contain a few IOCTL commands, mostly >> file/inode based operations. >> >> I need to query free/used blocks of an entire XFS filesystem and >> was hoping to find some user-space APIs for this. > > $ man 2 statvfs I was assuming that he was interested in the actual used/free block locations, not just the total count. But maybe I was wrong! -Eric > Cheers, > > Dave. > From david@fromorbit.com Tue Apr 26 17:59:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7E93B7CF8 for ; Tue, 26 Apr 2016 17:59:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4DABB304039 for ; Tue, 26 Apr 2016 15:59:39 -0700 (PDT) X-ASG-Debug-ID: 1461711576-04cbb00fea252de0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id PxKEXjtYdtUYvHaV for ; Tue, 26 Apr 2016 15:59:37 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CjCABN8h9X/8/E03ZUCoM4gVCCc6J4BowUhWqEEYYJAgIBAQKBO00BAQEBAQFmJ0EOg3IBAQEEOhwjEAgDDgcDCRoLDwUlAyETiCnETAEBAQEGAgEdGYVAhROBIIJ1g1WCKwWSeiWEcY4NjxtFjmtigjaBRyowhi6DAAEBAQ Received: from ppp118-211-196-207.lns20.syd4.internode.on.net (HELO dastard) ([118.211.196.207]) by ipmail07.adl2.internode.on.net with ESMTP; 27 Apr 2016 08:28:58 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1avBwL-0001k7-Cj; Wed, 27 Apr 2016 08:58:45 +1000 Date: Wed, 27 Apr 2016 08:58:45 +1000 From: Dave Chinner To: Michal Hocko Cc: linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, Andrew Morton , Theodore Ts'o , Chris Mason , Jan Kara , ceph-devel@vger.kernel.org, cluster-devel@redhat.com, linux-nfs@vger.kernel.org, logfs@logfs.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-mtd@lists.infradead.org, reiserfs-devel@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-f2fs-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, LKML , Michal Hocko Subject: Re: [PATCH 2/2] mm, debug: report when GFP_NO{FS,IO} is used explicitly from memalloc_no{fs,io}_{save,restore} context Message-ID: <20160426225845.GF26977@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] mm, debug: report when GFP_NO{FS,IO} is used explicitly from memalloc_no{fs,io}_{save,restore} context References: <1461671772-1269-1-git-send-email-mhocko@kernel.org> <1461671772-1269-3-git-send-email-mhocko@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1461671772-1269-3-git-send-email-mhocko@kernel.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: 1461711576 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1694 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29084 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Apr 26, 2016 at 01:56:12PM +0200, Michal Hocko wrote: > From: Michal Hocko > > THIS PATCH IS FOR TESTING ONLY AND NOT MEANT TO HIT LINUS TREE > > It is desirable to reduce the direct GFP_NO{FS,IO} usage at minimum and > prefer scope usage defined by memalloc_no{fs,io}_{save,restore} API. > > Let's help this process and add a debugging tool to catch when an > explicit allocation request for GFP_NO{FS,IO} is done from the scope > context. The printed stacktrace should help to identify the caller > and evaluate whether it can be changed to use a wider context or whether > it is called from another potentially dangerous context which needs > a scope protection as well. You're going to get a large number of these from XFS. There are call paths in XFs that get called both inside and outside transaction context, and many of them are marked with GFP_NOFS to prevent issues that have cropped up in the past. Often these are to silence lockdep warnings (e.g. commit b17cb36 ("xfs: fix missing KM_NOFS tags to keep lockdep happy")) because lockdep gets very unhappy about the same functions being called with different reclaim contexts. e.g. directory block mapping might occur from readdir (no transaction context) or within transactions (create/unlink). hence paths like this are tagged with GFP_NOFS to stop lockdep emitting false positive warnings.... Removing the GFP_NOFS flags in situations like this is simply going to restart the flood of false positive lockdep warnings we've silenced over the years, so perhaps lockdep needs to be made smarter as well... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 26 18:07:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A3F907CFF for ; Tue, 26 Apr 2016 18:07:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1E844AC006 for ; Tue, 26 Apr 2016 16:07:19 -0700 (PDT) X-ASG-Debug-ID: 1461712036-04cb6c09a227ede0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id yTOxNG2awycjmdMO for ; Tue, 26 Apr 2016 16:07:16 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DXBgCz8x9X/8/E03ZegziBUIJzongGjBSDUYIZhBGGCQICAQECgTpNAQEBAQEBZieEQQEBAQMBOhwjBQsIAw4HAwklDwUlAyETiCIHxE4BCwEdGYVAhROKFQWNVIo8jg2PG0WOa2KDfSowiS4BAQE Received: from ppp118-211-196-207.lns20.syd4.internode.on.net (HELO dastard) ([118.211.196.207]) by ipmail07.adl2.internode.on.net with ESMTP; 27 Apr 2016 08:37:15 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1avC4M-0001mu-DA; Wed, 27 Apr 2016 09:07:02 +1000 Date: Wed, 27 Apr 2016 09:07:02 +1000 From: Dave Chinner To: Michal Hocko Cc: linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, Andrew Morton , Theodore Ts'o , Chris Mason , Jan Kara , ceph-devel@vger.kernel.org, cluster-devel@redhat.com, linux-nfs@vger.kernel.org, logfs@logfs.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-mtd@lists.infradead.org, reiserfs-devel@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-f2fs-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, LKML , Michal Hocko Subject: Re: [PATCH 1/2] mm: add PF_MEMALLOC_NOFS Message-ID: <20160426230702.GG26977@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/2] mm: add PF_MEMALLOC_NOFS References: <1461671772-1269-1-git-send-email-mhocko@kernel.org> <1461671772-1269-2-git-send-email-mhocko@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1461671772-1269-2-git-send-email-mhocko@kernel.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: 1461712036 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1778 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29084 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Apr 26, 2016 at 01:56:11PM +0200, Michal Hocko wrote: > From: Michal Hocko > > GFP_NOFS context is used for the following 4 reasons currently > - to prevent from deadlocks when the lock held by the allocation > context would be needed during the memory reclaim > - to prevent from stack overflows during the reclaim because > the allocation is performed from a deep context already > - to prevent lockups when the allocation context depends on > other reclaimers to make a forward progress indirectly > - just in case because this would be safe from the fs POV - silencing lockdep false positives > Introduce PF_MEMALLOC_NOFS task specific flag and memalloc_nofs_{save,restore} > API to control the scope. This is basically copying > memalloc_noio_{save,restore} API we have for other restricted allocation > context GFP_NOIO. > > Xfs has already had a similar functionality as PF_FSTRANS so let's just > give it a more generic name and make it usable for others as well and > move the GFP_NOFS context tracking to the page allocator. Xfs has its > own accessor functions but let's keep them for now to reduce this patch > as minimum. Can you split this into two patches? The first simply does this: #define PF_MEMALLOC_NOFS PF_FSTRANS and changes only the XFS code to use PF_MEMALLOC_NOFS. The second patch can then do the rest of the mm API changes that we don't actually care about in XFS at all. That way I can carry all the XFS changes in the XFS tree and not have to worry about when this stuff gets merged or conflicts with the rest of the work that is being done to the mm/ code and whatever tree that eventually lands in... Cheers, Dave. -- Dave Chinner david@fromorbit.com From debbugs@buxtehude.debian.org Tue Apr 26 18:09:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CF5DC7D01 for ; Tue, 26 Apr 2016 18:09:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A29DF304039 for ; Tue, 26 Apr 2016 16:09:12 -0700 (PDT) X-ASG-Debug-ID: 1461712149-04cbb00fe72530f0001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [206.12.19.147]) by cuda.sgi.com with ESMTP id pDSnl72Gm8tXiLj3 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 26 Apr 2016 16:09:09 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Effective-Source-IP: buxtehude.debian.org[206.12.19.147] X-Barracuda-Apparent-Source-IP: 206.12.19.147 Received: from debbugs by buxtehude.debian.org with local (Exim 4.84_2) (envelope-from ) id 1avC6M-0001zj-Vu; Tue, 26 Apr 2016 23:09:06 +0000 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.505 (Entity 5.505) Content-Type: text/plain; charset=utf-8 From: owner@bugs.debian.org (Debian Bug Tracking System) To: James Clarke CC: xfs@oss.sgi.com Subject: Processed (with 2 errors): Re: Bug#822470: qemu: FTBFS: error: redefinition of 'struct fsxattr' Message-ID: X-ASG-Orig-Subj: Processed (with 2 errors): Re: Bug#822470: qemu: FTBFS: error: redefinition of 'struct fsxattr' References: <9BB9DBC1-E0BF-4F88-BAF0-DC76729B2927@jrtc27.com> <20160424200935.GE4077@jirafa.cyrius.com> X-Debian-PR-Package: xfsprogs X-Debian-PR-Source: xfsprogs X-Debian-PR-Message: transcript X-Loop: owner@bugs.debian.org Date: Tue, 26 Apr 2016 23:09:06 +0000 X-Barracuda-Connect: buxtehude.debian.org[206.12.19.147] X-Barracuda-Start-Time: 1461712149 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 725 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29084 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Processing control commands: > package xfsprogs Limiting to bugs with field 'package' containing at least one of 'xfsprogs' Limit currently set to 'package':'xfsprogs' > forcemerge 822369 -1 Bug #822369 [xfsprogs] xfsprogs: FTBFS: error: redefinition of 'struct fsxa= ttr' package: "qemu"' does not match at least one of "xfsprogs" Failed to forcibly merge 822369: limit failed for bugs: 822470, 822369. > affects -1 src:qemu package: "qemu"' does not match at least one of "xfsprogs" Failed to mark 822470 as affecting package(s): limit failed for bugs: 82247= 0. --=20 822470: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=3D822470 Debian Bug Tracking System Contact owner@bugs.debian.org with problems From david@fromorbit.com Tue Apr 26 18:09:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BDA3B7D01 for ; Tue, 26 Apr 2016 18:09:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9063F8F8037 for ; Tue, 26 Apr 2016 16:09:52 -0700 (PDT) X-ASG-Debug-ID: 1461712189-04cb6c09a227ee80001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id dDPL5NyRLoVryQ3W for ; Tue, 26 Apr 2016 16:09:50 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BOCADk9B9X/8/E03ZegzhTfYJzonkGjBSJeySFZQQCAoE6TQEBAQEBAWYnQQ6DcwEBBDocIxAIAxgJJQ8FJQMhE4gpD8RAAQEBAQYCARkEGYVAhROCXoc3BZgQhXyIEY8bjzBig30qMAGFJoQHAQEB Received: from ppp118-211-196-207.lns20.syd4.internode.on.net (HELO dastard) ([118.211.196.207]) by ipmail07.adl2.internode.on.net with ESMTP; 27 Apr 2016 08:39:38 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1avC6f-0001n9-9D; Wed, 27 Apr 2016 09:09:25 +1000 Date: Wed, 27 Apr 2016 09:09:25 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: development APIs for used/free blocks information Message-ID: <20160426230925.GH26977@dastard> X-ASG-Orig-Subj: Re: development APIs for used/free blocks information References: <97A4F433DEE099488FE21C1718A641D2139E86F5@wmsexchsvr01.winmagic.local> <20160426222129.GD26977@dastard> <571FF0F6.2030202@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <571FF0F6.2030202@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: 1461712189 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1084 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29084 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Apr 26, 2016 at 05:51:34PM -0500, Eric Sandeen wrote: > > > On 4/26/16 5:21 PM, Dave Chinner wrote: > > On Tue, Apr 26, 2016 at 08:51:10PM +0000, Benjamin Wirth wrote: > >> Hello, > >> > >> I was looking for development APIs for XFS. The contents of > >> xfsprogs-devel seem to only contain a few IOCTL commands, mostly > >> file/inode based operations. > >> > >> I need to query free/used blocks of an entire XFS filesystem and > >> was hoping to find some user-space APIs for this. > > > > $ man 2 statvfs > > I was assuming that he was interested in the actual used/free block > locations, not just the total count. But maybe I was wrong! Maybe I'm wrong, but asking for free/used blocks is ambiguous to say the least. If he wants free/used blocks, then we just need to forward port this kernel branch: https://git.kernel.org/cgit/linux/kernel/git/dgc/linux-xfs.git/log/?h=fiemapfs And this xfsprogs branch: https://git.kernel.org/cgit/fs/xfs/xfsprogs-dev.git/log/?h=spaceman Cheers, Dave. -- Dave Chinner david@fromorbit.com From debbugs@buxtehude.debian.org Tue Apr 26 18:12:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B94477D03 for ; Tue, 26 Apr 2016 18:12:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 315A0AC002 for ; Tue, 26 Apr 2016 16:12:17 -0700 (PDT) X-ASG-Debug-ID: 1461712334-04cb6c09a027ef30001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [206.12.19.147]) by cuda.sgi.com with ESMTP id BB7VF86SnAYvw1p4 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 26 Apr 2016 16:12:15 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Effective-Source-IP: buxtehude.debian.org[206.12.19.147] X-Barracuda-Apparent-Source-IP: 206.12.19.147 Received: from debbugs by buxtehude.debian.org with local (Exim 4.84_2) (envelope-from ) id 1avC9K-0002HY-8K; Tue, 26 Apr 2016 23:12:10 +0000 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.505 (Entity 5.505) Content-Type: text/plain; charset=utf-8 From: owner@bugs.debian.org (Debian Bug Tracking System) To: James Clarke CC: pkg-qemu-devel@lists.alioth.debian.org, xfs@oss.sgi.com Subject: Processed: Re: Bug#822470: qemu: FTBFS: error: redefinition of 'struct fsxattr' Message-ID: X-ASG-Orig-Subj: Processed: Re: Bug#822470: qemu: FTBFS: error: redefinition of 'struct fsxattr' References: <20160424200935.GE4077@jirafa.cyrius.com> X-Debian-PR-Package: xfsprogs qemu X-Debian-PR-Source: qemu xfsprogs X-Debian-PR-Message: transcript X-Loop: owner@bugs.debian.org Date: Tue, 26 Apr 2016 23:12:10 +0000 X-Barracuda-Connect: buxtehude.debian.org[206.12.19.147] X-Barracuda-Start-Time: 1461712334 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1068 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29084 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Processing control commands: > reassign -1 xfsprogs Bug #822470 [qemu] qemu: FTBFS: error: redefinition of 'struct fsxattr' Bug reassigned from package 'qemu' to 'xfsprogs'. No longer marked as found in versions qemu/1:2.5+dfsg-5. Ignoring request to alter fixed versions of bug #822470 to the same values = previously set > forcemerge 822369 -1 Bug #822369 [xfsprogs] xfsprogs: FTBFS: error: redefinition of 'struct fsxa= ttr' Bug #822470 [xfsprogs] qemu: FTBFS: error: redefinition of 'struct fsxattr' Marked as found in versions xfsprogs/4.3.0+nmu1. Merged 822369 822470 > affects -1 src:qemu Bug #822470 [xfsprogs] qemu: FTBFS: error: redefinition of 'struct fsxattr' Bug #822369 [xfsprogs] xfsprogs: FTBFS: error: redefinition of 'struct fsxa= ttr' Added indication that 822470 affects src:qemu Added indication that 822369 affects src:qemu --=20 822369: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=3D822369 822470: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=3D822470 Debian Bug Tracking System Contact owner@bugs.debian.org with problems From chupt@inbox.ru Tue Apr 26 21:47:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 72EA97D03 for ; Tue, 26 Apr 2016 21:47:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4359B304032 for ; Tue, 26 Apr 2016 19:47:33 -0700 (PDT) X-ASG-Debug-ID: 1461725248-04cbb00fe7265650001-NocioJ Received: from mxs.inbox.ru (mail.hostergigant.net [85.25.84.153]) by cuda.sgi.com with ESMTP id OhxMUB5sDpcqpGYN for ; Tue, 26 Apr 2016 19:47:28 -0700 (PDT) X-Barracuda-Envelope-From: chupt@inbox.ru X-Barracuda-Effective-Source-IP: mail.hostergigant.net[85.25.84.153] X-Barracuda-Apparent-Source-IP: 85.25.84.153 Message-ID: <9E5DCA4033DC8CC6F88B8CE15F6518C5@GGXKYBBTHV> From: "=?utf-8?B?0J7QsdGD0YfQtdC90LjQtSDQsdC10YDQtdC20LvQuNCy0L7QvNGDINC/0YDQvtC40LfQstC+0LTRgdGC0LLRgyA=?=" To: Subject: =?utf-8?B?0JHQtdGA0LXQttC70LjQstC+0LUg0L/RgNC+0LjQt9Cy0L7QtNGB0YLQstC+OiDQvtGCINGB0YLRgNCw0YLQtdCz0LjQuCDQuiDQstC90LXQtNGA0LXQvdC40Y4=?= Date: Wed, 27 Apr 2016 05:47:29 +0300 X-ASG-Orig-Subj: =?utf-8?B?0JHQtdGA0LXQttC70LjQstC+0LUg0L/RgNC+0LjQt9Cy0L7QtNGB0YLQstC+OiDQvtGCINGB0YLRgNCw0YLQtdCz0LjQuCDQuiDQstC90LXQtNGA0LXQvdC40Y4=?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_000B_01D1A048.4925F990" X-Priority: 3 X-MSMail-Priority: Normal Importance: Normal X-Mailer: Microsoft Windows Live Mail 15.4.3555.308 X-MimeOLE: Produced By Microsoft MimeOLE V15.4.3555.308 X-Barracuda-Connect: mail.hostergigant.net[85.25.84.153] X-Barracuda-Start-Time: 1461725248 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 28374 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.29088 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message Ýòî — ñîîáùåíèå èç íåñêîëüêèõ ÷àñòåé â ôîðìàòå MIME. ------=_NextPart_000_000B_01D1A048.4925F990 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable =20 =20 12 - 13 =D0=BC=D0=B0=D1=8F | =D0=B3. = =D0=9C=D0=BE=D1=81=D0=BA=D0=B2=D0=B0=20 = (=D0=B0=D1=80=D1=82=D0=B8=D0=BA=D1=83=D0=BB: 381) =D0=9A=D0=B0=D0=BA = =D0=B2=D0=BD=D0=B5=D0=B4=D1=80=D0=B8=D1=82=D1=8C =D0=BD=D0=B0 = =D0=BF=D1=80=D0=B5=D0=B4=D0=BF=D1=80=D0=B8=D1=8F=D1=82=D0=B8=D0=B8 = =D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D1=8B=20 = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0 = =D0=9E=D0=B1=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5 =D0=B4=D0=BB=D1=8F: = =D1=80=D1=83=D0=BA=D0=BE=D0=B2=D0=BE=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D0=B5=D0= =B9, =D1=82=D0=B5=D1=85=D0=BD=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D1=85 = =D0=B4=D0=B8=D1=80=D0=B5=D0=BA=D1=82=D0=BE=D1=80=D0=BE=D0=B2, = =D0=B3=D0=BB=D0=B0=D0=B2=D0=BD=D1=8B=D1=85 = =D0=B8=D0=BD=D0=B6=D0=B5=D0=BD=D0=B5=D1=80=D0=BE=D0=B2, = =D0=B4=D0=B8=D1=80=D0=B5=D0=BA=D1=82=D0=BE=D1=80=D0=BE=D0=B2 = =D0=BF=D0=BE=20 = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D1=83,= =D0=BD=D0=B0=D1=87=D0=B0=D0=BB=D1=8C=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2 = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0,= =D0=BD=D0=B0=D1=87=D0=B0=D0=BB=D1=8C=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2 = =D1=86=D0=B5=D1=85=D0=BE=D0=B2 =D0=B8 = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B5=D0= =BD=D0=BD=D1=8B=D1=85 =D1=83=D1=87=D0=B0=D1=81=D1=82=D0=BA=D0=BE=D0=B2. = =D0=A6=D0=B5=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D1=8C = =D0=BE=D0=B1=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F:=20 = =D1=80=D0=B0=D1=81=D1=81=D0=BC=D0=BE=D1=82=D1=80=D0=B8=D1=82=D0=B5 = =D0=BA=D0=BE=D0=BD=D1=86=D0=B5=D0=BF=D1=86=D0=B8=D1=8E = =D1=80=D0=B0=D0=B7=D0=B2=D0=B8=D1=82=D0=B8=D1=8F = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0 = =C2=AB=D0=91=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B5 = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=BE=C2= =BB=20 = =D0=BD=D0=B0=D1=83=D1=87=D0=B8=D1=82=D0=B5=D1=81=D1=8C = =D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D1=8F=D1=82=D1=8C = =D0=BD=D0=B0=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F = =D1=81=D1=82=D1=80=D0=B0=D1=82=D0=B5=D0=B3=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0= =BE=D0=B3=D0=BE =D1=80=D0=B0=D0=B7=D0=B2=D0=B8=D1=82=D0=B8=D1=8F = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0 = =D0=BD=D0=B0=D1=83=D1=87=D0=B8=D1=82=D0=B5=D1=81=D1=8C = =D0=B2=D0=B8=D0=B4=D0=B5=D1=82=D1=8C = =D0=BF=D0=BE=D1=82=D0=B5=D1=80=D0=B8 =D0=BD=D0=B0 = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B5 = =D0=BD=D0=B0=D1=83=D1=87=D0=B8=D1=82=D0=B5=D1=81=D1=8C = =D0=BE=D1=86=D0=B5=D0=BD=D0=B8=D0=B2=D0=B0=D1=82=D1=8C = =D1=83=D1=80=D0=BE=D0=B2=D0=B5=D0=BD=D1=8C = =D1=80=D0=B0=D0=B7=D0=B2=D0=B8=D1=82=D0=B8=D1=8F = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B5=D0= =BD=D0=BD=D0=BE=D0=B9 =D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D1=8B = =D0=BD=D0=B0=D1=83=D1=87=D0=B8=D1=82=D0=B5=D1=81=D1=8C = =D1=80=D0=B0=D1=81=D1=81=D1=87=D0=B8=D1=82=D1=8B=D0=B2=D0=B0=D1=82=D1=8C = =D0=BF=D0=BE=D0=BB=D0=BD=D1=83=D1=8E = =D1=8D=D1=84=D1=84=D0=B5=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D1=81=D1=82=D1= =8C = =D0=BE=D0=B1=D0=BE=D1=80=D1=83=D0=B4=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F =D1=81=D0=BC=D0=BE=D0=B6=D0=B5=D1=82=D0=B5 = =D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=D1=81=D1=8F = =D0=BF=D1=80=D0=B8=D0=B5=D0=BC=D0=B0=D0=BC=D0=B8 = =D0=BF=D0=BE=D0=B2=D1=8B=D1=88=D0=B5=D0=BD=D0=B8=D1=8F = =D1=8D=D1=84=D1=84=D0=B5=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D1=81=D1=82=D0= =B8 =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B = =D0=BF=D0=B5=D1=80=D1=81=D0=BE=D0=BD=D0=B0=D0=BB=D0=B0 ~ ~ ~ ~ ~ ~ ~ ~=20 =D0=92=D1=80=D0=B5=D0=BC=D1=8F = =D0=B7=D0=B0=D0=BD=D1=8F=D1=82=D0=B8=D0=B9 =D1=81 10:00 =D0=B4=D0=BE = 17:30 =D0=9C=D0=B5=D1=81=D1=82=D0=BE = =D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F: =D0=BC. = =D0=91=D0=B0=D1=83=D0=BC=D0=B0=D0=BD=D1=81=D0=BA=D0=B0=D1=8F, = =D1=83=D0=BB. = =D0=91=D0=B0=D1=83=D0=BC=D0=B0=D0=BD=D1=81=D0=BA=D0=B0=D1=8F, =D0=B4.6, = =D1=81=D1=82=D1=80.2. =D0=92=D1=81=D1=8F = =D0=BF=D0=BE=D0=B4=D1=80=D0=BE=D0=B1=D0=BD=D0=B0=D1=8F = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D1=8F =D0=B8 = =D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B0=D1=86=D0=B8=D1=8F = =D0=BF=D0=BE =D0=BD=D0=BE=D0=BC=D0=B5=D1=80=D1=83:=20 8 =D0=BA=D0=BE=D0=B4 = =D0=B3=D0=BE=D1=80=D0=BE=D0=B4=D0=B0 (495) = =D1=82=D0=B5=D0=BB=D0=B5=D1=84=D0=BE=D0=BD 411-90-98. =20 =20 =20 = =D0=9F=D0=A0=D0=9E=D0=93=D0=A0=D0=90=D0=9C=D0=9C=D0=90: 1. = =D0=91=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B5 = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=BE.= =20 = =D0=98=D0=B4=D0=B5=D0=BE=D0=BB=D0=BE=D0=B3=D0=B8=D1=8F = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.= =D0=9F=D1=80=D0=B8=D0=BD=D1=86=D0=B8=D0=BF=D1=8B = =D0=91=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE = =D0=9F=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.= =D0=92=D0=BD=D0=B5=D0=B4=D1=80=D1=8F=D1=82=D1=8C =D0=B8=D0=BB=D0=B8 = =D0=BD=D0=B5=20 = =D0=B2=D0=BD=D0=B5=D0=B4=D1=80=D1=8F=D1=82=D1=8C? =D0=92 = =D0=BA=D0=B0=D0=BA=D0=BE=D0=B9 = =D1=81=D1=82=D0=B5=D0=BF=D0=B5=D0=BD=D0=B8? =D0=9A=D0=B0=D0=BA = =D0=B1=D1=8B=D1=81=D1=82=D1=80=D0=BE? = =D0=9C=D0=BE=D1=82=D0=B8=D0=B2=D1=8B =D0=B4=D0=BB=D1=8F = =D0=B2=D0=BD=D0=B5=D0=B4=D1=80=D0=B5=D0=BD=D0=B8=D1=8F = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.= =20 = =D0=A0=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D1=82=D1=8B = =D0=BE=D1=82 =D0=B2=D0=BD=D0=B5=D0=B4=D1=80=D0=B5=D0=BD=D0=B8=D1=8F = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.= 2. = =D0=98=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D1=8B = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.= =20 =D0=9C=D0=B5=D1=82=D0=BE=D0=B4 = =D1=83=D0=BF=D0=BE=D1=80=D1=8F=D0=B4=D0=BE=D1=87=D0=B8=D0=B2=D0=B0=D0=BD=D0= =B8=D1=8F (5=D0=A1). = =D0=97=D0=BE=D0=BD=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5. = =D0=9E=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B5=D0= =BD=D0=BD=D1=8B=D1=85 = =D0=BF=D1=80=D0=BE=D0=B4=D1=83=D0=BA=D1=82=D0=BE=D0=B2=D1=8B=D1=85 = =D1=8F=D1=87=D0=B5=D0=B5=D0=BA.=20 = =D0=A1=D1=85=D0=B5=D0=BC=D0=B0=D1=82=D0=B8=D1=87=D0=BD=D0=BE=D0=B5 = =D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0= =B8=D0=B5 = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.= =D0=9C=D0=B5=D1=82=D0=BE=D0=B4 = =D0=B2=D1=8B=D1=82=D1=8F=D0=B3=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F. = =D0=9F=D0=BE=D1=82=D0=BE=D0=BA.=20 = =D0=A1=D1=83=D0=BF=D0=B5=D1=80=D0=BC=D0=B0=D1=80=D0=BA=D0=B5=D1=82. = =D0=9A=D0=B0=D0=BD=D0=B1=D0=B0=D0=BD. =D0=A4=D0=98=D0=A4=D0=9E. = =D0=A1=D0=B8=D0=BD=D1=85=D1=80=D0=BE=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1= =8F = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B5=D0= =BD=D0=BD=D1=8B=D1=85 =D0=B8 = =D0=BB=D0=BE=D0=B3=D0=B8=D1=81=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D1= =85 =D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B9. = =D0=A2=D0=B0=D0=BA=D1=82 JIT = =C2=AB=D0=A2=D0=BE=D1=87=D0=BD=D0=BE-=D0=B2=D0=BE=D0=B2=D1=80=D0=B5=D0=BC= =D1=8F=C2=BB. = =D0=92=D1=8B=D1=80=D0=B0=D0=B2=D0=BD=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5 = =D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8. = =D0=9C=D0=B5=D1=82=D0=BE=D0=B4 =D0=9E=D0=A5=D0=9E=D0=A5. = =D0=91=D0=B0=D0=BB=D0=B0=D0=BD=D1=81=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0 = =D0=BF=D0=BE=D1=82=D0=BE=D0=BA=D0=B0.=20 = =D0=92=D0=B8=D0=B7=D1=83=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F.= =D0=92=D0=B8=D0=B7=D1=83=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B5 = =D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81=D0=BE=D0=BC = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.= =D0=92=D1=81=D1=82=D1=80=D0=B0=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5 = =D0=BA=D0=B0=D1=87=D0=B5=D1=81=D1=82=D0=B2=D0=B0 =D0=B2=20 = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B5=D0= =BD=D0=BD=D1=8B=D0=B9 =D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81. = =D0=91=D1=8B=D1=81=D1=82=D1=80=D0=B0=D1=8F = =D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=B0=D0=BB=D0=B0=D0=B4=D0=BA=D0=B0 = =D0=BE=D0=B1=D0=BE=D1=80=D1=83=D0=B4=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F.= =D0=9E=D0=B1=D1=89=D0=B5=D0=B5 = =D0=BE=D0=B1=D1=81=D0=BB=D1=83=D0=B6=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5 = = =D0=BE=D0=B1=D0=BE=D1=80=D1=83=D0=B4=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F.= = =D0=A1=D1=82=D0=B0=D0=BD=D0=B4=D0=B0=D1=80=D1=82=D0=B8=D0=B7=D0=B0=D1=86=D0= =B8=D1=8F =D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B9. = =D0=98=D0=BD=D1=82=D0=B5=D0=B3=D1=80=D0=B0=D0=B8=D1=8F = =D1=82=D1=80=D1=83=D0=B4=D0=B0. = =D0=98=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0= =B5 = =D0=BD=D0=B5=D1=84=D0=B8=D0=BD=D0=B0=D0=BD=D1=81=D0=BE=D0=B2=D1=8B=D1=85 = = =D0=BF=D0=BE=D0=BA=D0=B0=D0=B7=D0=B0=D1=82=D0=B5=D0=BB=D0=B5=D0=B9 = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.= 3. = =D0=9E=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.= =20 =D0=9F=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=D0=B0 = =D0=BF=D0=BE=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BD=D0=B8=D1=8F = =D0=91=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE = =D0=9F=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.= =D0=9F=D0=BB=D0=B0=D0=BD=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B8 = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.= =20 = =D0=9E=D0=B1=D0=BE=D1=80=D1=83=D0=B4=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5 = =D0=B8 =D1=82=D0=B5=D1=85=D0=BD=D0=BE=D0=BB=D0=BE=D0=B3=D0=B8=D0=B8 = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.= =D0=A0=D0=BE=D0=BB=D1=8C = =D0=BF=D0=B5=D1=80=D1=81=D0=BE=D0=BD=D0=B0=D0=BB=D0=B0 =D0=B2 = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=BC=20 = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B5 = (=D0=BD=D0=B0 =D0=97=D0=B0=D0=BF=D0=B0=D0=B4=D0=B5 =D0=B8 =D0=B2 = =D0=A0=D0=BE=D1=81=D1=81=D0=B8=D0=B8). = =D0=98=D0=BD=D1=84=D1=80=D0=B0=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1= =80=D0=B0 = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.= =D0=9F=D0=BE=D1=82=D0=BE=D0=BA=20 = =D0=BC=D0=B0=D1=82=D0=B5=D1=80=D0=B8=D0=B0=D0=BB=D0=BE=D0=B2 =D0=B2 = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=BC = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B5,= =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=B0=D1=8F = =D0=B7=D0=B0=D0=B2=D0=BE=D0=B4=D1=81=D0=BA=D0=B0=D1=8F = =D0=BB=D0=BE=D0=B3=D0=B8=D1=81=D1=82=D0=B8=D0=BA=D0=B0. = =D0=9F=D0=BB=D0=B0=D0=BD=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5 = =D0=B2=20 =D1=83=D1=81=D0=BB=D0=BE=D0=B2=D0=B8=D1=8F=D1=85 = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.= 4. = =D0=92=D0=BD=D0=B5=D0=B4=D1=80=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.= =20 =D0=90=D0=BB=D0=B3=D0=BE=D1=80=D0=B8=D1=82=D0=BC = =D0=BF=D0=B5=D1=80=D0=B5=D1=85=D0=BE=D0=B4=D0=B0 =D0=BE=D1=82 = =D1=82=D1=80=D0=B0=D0=B4=D0=B8=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D0=BE=D0=B3=D0= =BE = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0 = =D0=BA = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=BC=D1=83 = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D1=83.= =D0=A1=D0=BF=D0=B5=D1=86=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=20 = =D0=A0=D0=BE=D1=81=D1=81=D0=B8=D0=B9=D1=81=D0=BA=D0=BE=D0=B3=D0=BE = =D0=BF=D1=83=D1=82=D0=B8. =D0=A0=D0=B5=D1=81=D1=83=D1=80=D1=81=D1=8B, = =D0=BD=D0=B5=D0=BE=D0=B1=D1=85=D0=BE=D0=B4=D0=B8=D0=BC=D1=8B=D0=B5 = =D0=BD=D0=B0 =D0=B2=D0=BD=D0=B5=D0=B4=D1=80=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.= =D0=A2=D1=80=D1=83=D0=B4=D0=BD=D0=BE=D1=81=D1=82=D0=B8 =D0=B8=20 = =D0=BE=D0=BF=D0=B0=D1=81=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=B2=D0=BD=D0=B5=D0=B4=D1=80=D0=B5=D0=BD=D0=B8=D1=8F = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0 = =D0=BD=D0=B0 = =D0=A0=D0=BE=D1=81=D1=81=D0=B8=D0=B9=D1=81=D0=BA=D0=B8=D1=85 = =D0=BF=D1=80=D0=B5=D0=B4=D0=BF=D1=80=D0=B8=D1=8F=D1=82=D0=B8=D1=8F=D1=85.= =D0=A2=D0=B8=D0=BF = =D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8=20 = =D0=BF=D1=80=D0=B5=D0=B4=D0=BF=D1=80=D0=B8=D1=8F=D1=82=D0=B8=D1=8F = =D0=B8 =D0=BF=D0=BE=D0=B4=D1=85=D0=BE=D0=B4 =D0=BA = =D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8E = =D0=BF=D0=B5=D1=80=D1=81=D0=BE=D0=BD=D0=B0=D0=BB=D0=BE=D0=BC =D0=B2 = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=BC = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B5.= 5. = =D0=9A=D0=BB=D1=8E=D1=87=D0=B5=D0=B2=D1=8B=D0=B5 = =D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D1=8B = =D1=83=D1=81=D0=BF=D0=B5=D1=85=D0=B0 = =D0=B2=D0=BD=D0=B5=D0=B4=D1=80=D0=B5=D0=BD=D0=B8=D1=8F = =D0=9B=D0=98=D0=9D-=D1=82=D0=B5=D1=85=D0=BD=D0=BE=D0=BB=D0=BE=D0=B3=D0=B8= =D0=B9. =20 =D0=A2=D0=B8=D0=BF=D0=B8=D1=87=D0=BD=D1=8B=D0=B5 = =D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8 = =D0=B2=D0=BD=D0=B5=D0=B4=D1=80=D0=B5=D0=BD=D0=B8=D1=8F. = =D0=9A=D1=80=D0=B0=D1=81=D0=BD=D1=8B=D0=B5 = =D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B8 =D0=B8 = =D0=BF=D0=BE=D0=B4=D0=B2=D0=BE=D0=B4=D0=BD=D1=8B=D0=B5 = =D0=BA=D0=B0=D0=BC=D0=BD=D0=B8 =D0=BF=D1=80=D0=B8 = =D0=B2=D0=BD=D0=B5=D0=B4=D1=80=D0=B5=D0=BD=D0=B8=D0=B8. = =D0=9A=D0=BB=D1=8E=D1=87=D0=B5=D0=B2=D1=8B=D0=B5=20 =D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D1=8B = =D1=83=D1=81=D0=BF=D0=B5=D1=85=D0=B0 = =D0=B2=D0=BD=D0=B5=D0=B4=D1=80=D0=B5=D0=BD=D0=B8=D1=8F = =D0=9B=D0=98=D0=9D-=D1=82=D0=B5=D1=85=D0=BD=D0=BE=D0=BB=D0=BE=D0=B3=D0=B8= =D0=B9. 6. =D0=9F=D0=BE=D0=B4=D1=85=D0=BE=D0=B4 = =D0=BA =D0=BF=D1=80=D0=B8=D0=BD=D1=8F=D1=82=D0=B8=D1=8E = =D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B9 = =D0=BE=D1=82=D0=BD=D0=BE=D1=81=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE = =D0=B2=D0=BD=D0=B5=D0=B4=D1=80=D0=B5=D0=BD=D0=B8=D1=8F = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.= =20 =D0=9E=D1=86=D0=B5=D0=BD=D0=BA=D0=B0 = =D1=86=D0=B5=D0=BB=D0=B5=D1=81=D0=BE=D0=BE=D0=B1=D1=80=D0=B0=D0=B7=D0=BD=D0= =BE=D1=81=D1=82=D0=B8 = =D0=BF=D1=80=D0=B8=D0=B2=D0=BB=D0=B5=D1=87=D0=B5=D0=BD=D0=B8=D1=8F = =D0=BA=D0=BE=D0=BD=D1=81=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D0=BD=D1=82=D0=BE=D0= =B2. =20 = =D0=A1=D1=82=D0=BE=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D1=8C = =D1=83=D1=87=D0=B0=D1=81=D1=82=D0=B8=D1=8F: 22 800 =D1=80=D1=83=D0=B1.=20 =D0=A1=D0=BA=D0=B8=D0=B4=D0=BA=D0=B8 = (=D0=BE=D1=82 2 =D1=87=D0=B5=D0=BB=D0=BE=D0=B2=D0=B5=D0=BA=D0=B0 = =E2=80=93 10%, 3 =D1=87=D0=B5=D0=BB=D0=BE=D0=B2=D0=B5=D0=BA=D0=B0 = =E2=80=93 15%, 4 =D1=87=D0=B5=D0=BB=D0=BE=D0=B2=D0=B5=D0=BA=D0=B0 =D0=B8 = =D0=B1=D0=BE=D0=BB=D0=B5=D0=B5 =E2=80=93 20%.) =D0=92 = =D1=81=D1=82=D0=BE=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D1=8C = =D0=B2=D1=85=D0=BE=D0=B4=D0=B8=D1=82 = =D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B9 = =D0=BC=D0=B0=D1=82=D0=B5=D1=80=D0=B8=D0=B0=D0=BB, = =D0=BE=D0=B1=D0=B5=D0=B4=D1=8B, = =D0=BA=D0=BE=D1=84=D0=B5-=D0=BF=D0=B0=D1=83=D0=B7=D1=8B, = =D1=81=D0=B5=D1=80=D1=82=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=82.=20 = =D0=98=D0=BD=D0=BE=D0=B3=D0=BE=D1=80=D0=BE=D0=B4=D0=BD=D0=B8=D0=BC = =D1=83=D1=87=D0=B0=D1=81=D1=82=D0=BD=D0=B8=D0=BA=D0=B0=D0=BC = =D0=BF=D0=BE=D0=BC=D0=BE=D0=B3=D0=B0=D0=B5=D0=BC =D0=B2 = =D0=B1=D1=80=D0=BE=D0=BD=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B8 = =D0=B3=D0=BE=D1=81=D1=82=D0=B8=D0=BD=D0=B8=D1=86=D1=8B. =20 =20 =20 =20 =20 ------=_NextPart_000_000B_01D1A048.4925F990 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable

    2.=20 = =D0=98=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D1=8B = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE=20 = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.=

    1.=20 = =D0=91=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B5=20 = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=BE.=

          


    12 - 13 = =D0=BC=D0=B0=D1=8F | =D0=B3.=20 =D0=9C=D0=BE=D1=81=D0=BA=D0=B2=D0=B0 
    (=D0=B0=D1=80=D1=82=D0=B8=D0=BA=D1=83=D0=BB:=20 381)


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

    =D0=A6=D0=B5=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D1=8C=20 = =D0=BE=D0=B1=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F: 
    =D1=80=D0=B0=D1=81=D1= =81=D0=BC=D0=BE=D1=82=D1=80=D0=B8=D1=82=D0=B5=20 = =D0=BA=D0=BE=D0=BD=D1=86=D0=B5=D0=BF=D1=86=D0=B8=D1=8E = =D1=80=D0=B0=D0=B7=D0=B2=D0=B8=D1=82=D0=B8=D1=8F = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0 = =C2=AB=D0=91=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B5=20 = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=BE=C2= =BB 
    =D0=BD=D0=B0=D1=83=D1=87=D0= =B8=D1=82=D0=B5=D1=81=D1=8C=20 = =D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D1=8F=D1=82=D1=8C = =D0=BD=D0=B0=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F = =D1=81=D1=82=D1=80=D0=B0=D1=82=D0=B5=D0=B3=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0= =BE=D0=B3=D0=BE =D1=80=D0=B0=D0=B7=D0=B2=D0=B8=D1=82=D0=B8=D1=8F=20 = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0<= BR>=D0=BD=D0=B0=D1=83=D1=87=D0=B8=D1=82=D0=B5=D1=81=D1=8C = =D0=B2=D0=B8=D0=B4=D0=B5=D1=82=D1=8C = =D0=BF=D0=BE=D1=82=D0=B5=D1=80=D0=B8 =D0=BD=D0=B0=20 = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B5<= BR>=D0=BD=D0=B0=D1=83=D1=87=D0=B8=D1=82=D0=B5=D1=81=D1=8C = =D0=BE=D1=86=D0=B5=D0=BD=D0=B8=D0=B2=D0=B0=D1=82=D1=8C = =D1=83=D1=80=D0=BE=D0=B2=D0=B5=D0=BD=D1=8C=20 = =D1=80=D0=B0=D0=B7=D0=B2=D0=B8=D1=82=D0=B8=D1=8F = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B5=D0= =BD=D0=BD=D0=BE=D0=B9 = =D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D1=8B
    =D0=BD=D0=B0=D1=83=D1=87=D0= =B8=D1=82=D0=B5=D1=81=D1=8C=20 = =D1=80=D0=B0=D1=81=D1=81=D1=87=D0=B8=D1=82=D1=8B=D0=B2=D0=B0=D1=82=D1=8C = =D0=BF=D0=BE=D0=BB=D0=BD=D1=83=D1=8E = =D1=8D=D1=84=D1=84=D0=B5=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D1=81=D1=82=D1= =8C=20 = =D0=BE=D0=B1=D0=BE=D1=80=D1=83=D0=B4=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F<= BR>=D1=81=D0=BC=D0=BE=D0=B6=D0=B5=D1=82=D0=B5 = =D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=D1=81=D1=8F = =D0=BF=D1=80=D0=B8=D0=B5=D0=BC=D0=B0=D0=BC=D0=B8=20 = =D0=BF=D0=BE=D0=B2=D1=8B=D1=88=D0=B5=D0=BD=D0=B8=D1=8F = =D1=8D=D1=84=D1=84=D0=B5=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D1=81=D1=82=D0= =B8 =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20 =D0=BF=D0=B5=D1=80=D1=81=D0=BE=D0=BD=D0=B0=D0=BB=D0=B0

    ~ =20 ~  ~  ~  ~  ~  = ~  ~=20

    =D0=92=D1=80=D0=B5=D0=BC=D1=8F = =D0=B7=D0=B0=D0=BD=D1=8F=D1=82=D0=B8=D0=B9 =D1=81 10:00=20 =D0=B4=D0=BE = 17:30

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

    =D0=92=D1=81=D1=8F = =D0=BF=D0=BE=D0=B4=D1=80=D0=BE=D0=B1=D0=BD=D0=B0=D1=8F = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D1=8F =D0=B8=20 = =D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B0=D1=86=D0=B8=D1=8F = =D0=BF=D0=BE =D0=BD=D0=BE=D0=BC=D0=B5=D1=80=D1=83: 
    8 =D0=BA=D0=BE=D0=B4=20 = =D0=B3=D0=BE=D1=80=D0=BE=D0=B4=D0=B0 (495) =D1=82=D0=B5=D0=BB=D0=B5=D1=84=D0=BE=D0=BD 411-90-98.
     

     
         


     =D0=9F=D0=A0=D0=9E=D0=93=D0=A0=D0=90=D0=9C=D0=9C=D0=90:<= /FONT>

    =D0=98=D0=B4=D0=B5=D0=BE=D0=BB=D0=BE=D0=B3=D0=B8=D1=8F = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE=20 = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.= =D0=9F=D1=80=D0=B8=D0=BD=D1=86=D0=B8=D0=BF=D1=8B = =D0=91=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE = =D0=9F=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.= =20 =D0=92=D0=BD=D0=B5=D0=B4=D1=80=D1=8F=D1=82=D1=8C = =D0=B8=D0=BB=D0=B8 =D0=BD=D0=B5 
    =D0=B2=D0=BD=D0=B5=D0=B4=D1= =80=D1=8F=D1=82=D1=8C? =D0=92=20 =D0=BA=D0=B0=D0=BA=D0=BE=D0=B9 = =D1=81=D1=82=D0=B5=D0=BF=D0=B5=D0=BD=D0=B8? =D0=9A=D0=B0=D0=BA = =D0=B1=D1=8B=D1=81=D1=82=D1=80=D0=BE? = =D0=9C=D0=BE=D1=82=D0=B8=D0=B2=D1=8B =D0=B4=D0=BB=D1=8F = =D0=B2=D0=BD=D0=B5=D0=B4=D1=80=D0=B5=D0=BD=D0=B8=D1=8F=20 = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.=  
    =D0=A0=D0=B5=D0=B7=D1=83=D0= =BB=D1=8C=D1=82=D0=B0=D1=82=D1=8B=20 =D0=BE=D1=82 = =D0=B2=D0=BD=D0=B5=D0=B4=D1=80=D0=B5=D0=BD=D0=B8=D1=8F = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.=

    =D0=9C=D0=B5=D1=82=D0=BE=D0=B4 = =D1=83=D0=BF=D0=BE=D1=80=D1=8F=D0=B4=D0=BE=D1=87=D0=B8=D0=B2=D0=B0=D0=BD=D0= =B8=D1=8F=20 (5=D0=A1). = =D0=97=D0=BE=D0=BD=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5. = =D0=9E=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B5=D0= =BD=D0=BD=D1=8B=D1=85=20 = =D0=BF=D1=80=D0=BE=D0=B4=D1=83=D0=BA=D1=82=D0=BE=D0=B2=D1=8B=D1=85 = =D1=8F=D1=87=D0=B5=D0=B5=D0=BA. 
    =D0=A1=D1=85=D0=B5=D0=BC=D0= =B0=D1=82=D0=B8=D1=87=D0=BD=D0=BE=D0=B5=20 = =D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0= =B8=D0=B5 = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.= =D0=9C=D0=B5=D1=82=D0=BE=D0=B4=20 = =D0=B2=D1=8B=D1=82=D1=8F=D0=B3=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F. = =D0=9F=D0=BE=D1=82=D0=BE=D0=BA. 
    =D0=A1=D1=83=D0=BF=D0=B5=D1= =80=D0=BC=D0=B0=D1=80=D0=BA=D0=B5=D1=82.=20 =D0=9A=D0=B0=D0=BD=D0=B1=D0=B0=D0=BD. = =D0=A4=D0=98=D0=A4=D0=9E. = =D0=A1=D0=B8=D0=BD=D1=85=D1=80=D0=BE=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1= =8F = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B5=D0= =BD=D0=BD=D1=8B=D1=85 =D0=B8=20 = =D0=BB=D0=BE=D0=B3=D0=B8=D1=81=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D1= =85 =D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B9. = =D0=A2=D0=B0=D0=BA=D1=82
    JIT = =C2=AB=D0=A2=D0=BE=D1=87=D0=BD=D0=BE-=D0=B2=D0=BE=D0=B2=D1=80=D0=B5=D0=BC= =D1=8F=C2=BB.=20 = =D0=92=D1=8B=D1=80=D0=B0=D0=B2=D0=BD=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5 = =D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8. = =D0=9C=D0=B5=D1=82=D0=BE=D0=B4 =D0=9E=D0=A5=D0=9E=D0=A5. = =D0=91=D0=B0=D0=BB=D0=B0=D0=BD=D1=81=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0 = =D0=BF=D0=BE=D1=82=D0=BE=D0=BA=D0=B0. 
    =D0=92=D0=B8=D0=B7=D1=83=D0= =B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F.=20 = =D0=92=D0=B8=D0=B7=D1=83=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B5 = =D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81=D0=BE=D0=BC = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.= =20 = =D0=92=D1=81=D1=82=D1=80=D0=B0=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5 = =D0=BA=D0=B0=D1=87=D0=B5=D1=81=D1=82=D0=B2=D0=B0 =D0=B2 
    =D0=BF=D1=80=D0=BE=D0=B8=D0= =B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0=BD=D1=8B=D0=B9=20 =D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81. = =D0=91=D1=8B=D1=81=D1=82=D1=80=D0=B0=D1=8F = =D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=B0=D0=BB=D0=B0=D0=B4=D0=BA=D0=B0 = =D0=BE=D0=B1=D0=BE=D1=80=D1=83=D0=B4=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F.= =D0=9E=D0=B1=D1=89=D0=B5=D0=B5=20 = =D0=BE=D0=B1=D1=81=D0=BB=D1=83=D0=B6=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5<= SPAN=20 = class=3DApple-converted-space> 
    =D0=BE=D0=B1=D0=BE=D1=80=D1= =83=D0=B4=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F.=20 = =D0=A1=D1=82=D0=B0=D0=BD=D0=B4=D0=B0=D1=80=D1=82=D0=B8=D0=B7=D0=B0=D1=86=D0= =B8=D1=8F =D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B9. = =D0=98=D0=BD=D1=82=D0=B5=D0=B3=D1=80=D0=B0=D0=B8=D1=8F = =D1=82=D1=80=D1=83=D0=B4=D0=B0. = =D0=98=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0= =B5=20 = =D0=BD=D0=B5=D1=84=D0=B8=D0=BD=D0=B0=D0=BD=D1=81=D0=BE=D0=B2=D1=8B=D1=85<= SPAN=20 = class=3DApple-converted-space> 
    =D0=BF=D0=BE=D0=BA=D0=B0=D0= =B7=D0=B0=D1=82=D0=B5=D0=BB=D0=B5=D0=B9=20 = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.=

    3.=20 = =D0=9E=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE=20 = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.=

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

    4.=20 = =D0=92=D0=BD=D0=B5=D0=B4=D1=80=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE=20 = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.=

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

    5.=20 = =D0=9A=D0=BB=D1=8E=D1=87=D0=B5=D0=B2=D1=8B=D0=B5 = =D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D1=8B = =D1=83=D1=81=D0=BF=D0=B5=D1=85=D0=B0 = =D0=B2=D0=BD=D0=B5=D0=B4=D1=80=D0=B5=D0=BD=D0=B8=D1=8F=20 = =D0=9B=D0=98=D0=9D-=D1=82=D0=B5=D1=85=D0=BD=D0=BE=D0=BB=D0=BE=D0=B3=D0=B8= =D0=B9.

    =D0=A2=D0=B8=D0=BF=D0=B8=D1=87=D0=BD=D1=8B=D0=B5 = =D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20 = =D0=B2=D0=BD=D0=B5=D0=B4=D1=80=D0=B5=D0=BD=D0=B8=D1=8F. = =D0=9A=D1=80=D0=B0=D1=81=D0=BD=D1=8B=D0=B5 = =D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B8 =D0=B8 = =D0=BF=D0=BE=D0=B4=D0=B2=D0=BE=D0=B4=D0=BD=D1=8B=D0=B5 = =D0=BA=D0=B0=D0=BC=D0=BD=D0=B8 =D0=BF=D1=80=D0=B8=20 = =D0=B2=D0=BD=D0=B5=D0=B4=D1=80=D0=B5=D0=BD=D0=B8=D0=B8. = =D0=9A=D0=BB=D1=8E=D1=87=D0=B5=D0=B2=D1=8B=D0=B5 
    =D1=84=D0=B0=D0=BA=D1=82=D0= =BE=D1=80=D1=8B=20 =D1=83=D1=81=D0=BF=D0=B5=D1=85=D0=B0 = =D0=B2=D0=BD=D0=B5=D0=B4=D1=80=D0=B5=D0=BD=D0=B8=D1=8F = =D0=9B=D0=98=D0=9D-=D1=82=D0=B5=D1=85=D0=BD=D0=BE=D0=BB=D0=BE=D0=B3=D0=B8= =D0=B9.

    6.=20 =D0=9F=D0=BE=D0=B4=D1=85=D0=BE=D0=B4 = =D0=BA =D0=BF=D1=80=D0=B8=D0=BD=D1=8F=D1=82=D0=B8=D1=8E = =D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B9 = =D0=BE=D1=82=D0=BD=D0=BE=D1=81=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE = =D0=B2=D0=BD=D0=B5=D0=B4=D1=80=D0=B5=D0=BD=D0=B8=D1=8F=20 = =D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE=20 = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B0.=

    =D0=9E=D1=86=D0=B5=D0=BD=D0=BA=D0=B0 = =D1=86=D0=B5=D0=BB=D0=B5=D1=81=D0=BE=D0=BE=D0=B1=D1=80=D0=B0=D0=B7=D0=BD=D0= =BE=D1=81=D1=82=D0=B8=20 = =D0=BF=D1=80=D0=B8=D0=B2=D0=BB=D0=B5=D1=87=D0=B5=D0=BD=D0=B8=D1=8F = =D0=BA=D0=BE=D0=BD=D1=81=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D0=BD=D1=82=D0=BE=D0= =B2.

     

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

    <= /TR>
    ------=_NextPart_000_000B_01D1A048.4925F990-- From greenlux68@beammax.com Tue Apr 26 21:53:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_FONT_FACE_BAD, 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 BFF537D03 for ; Tue, 26 Apr 2016 21:53:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 92D7A304032 for ; Tue, 26 Apr 2016 19:53:31 -0700 (PDT) X-ASG-Debug-ID: 1461725603-04cb6c09a1290970001-NocioJ Received: from beammax.com ([122.225.254.226]) by cuda.sgi.com with SMTP id CNauh2EKV3SCufHH for ; Tue, 26 Apr 2016 19:53:25 -0700 (PDT) X-Barracuda-Envelope-From: greenlux68@beammax.com X-Barracuda-Effective-Source-IP: UNKNOWN[122.225.254.226] X-Barracuda-Apparent-Source-IP: 122.225.254.226 Received: from XB-20160409PGNE[127.0.0.1] by XB-20160409PGNE[127.0.0.1] (SMTPD32); Wed, 27 Apr 2016 10:54:00 +0800 From: "beam-max@haifu.net.cn" Subject: Re: LED lighting from Hugh To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: LED lighting from Hugh MIME-Version: 1.0 Sender: greenlux68@beammax.com Reply-To: beam-max@haifu.net.cn Date: Wed, 27 Apr 2016 10:54:00 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[122.225.254.226] X-Barracuda-Start-Time: 1461725604 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4205 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.35 X-Barracuda-Spam-Status: No, SCORE=1.35 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_FONT_FACE_BAD, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29089 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.61 HTML_FONT_FACE_BAD BODY: HTML font face is not a word 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160427025331.3551F129608C@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVU Ri04IiBodHRwLWVxdWl2PWNvbnRlbnQtdHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCA4LjAwLjc2MDEuMTg5MzQiPjwvSEVBRD4NCjxCT0RZPg0KPFA+PFNQQU4gDQpz dHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7QXJpYWwmIzM5OywmIzM5O3NhbnMtc2VyaWYmIzM5Ozsg QkFDS0dST1VORDogI2Y2ZjZmNjsgRk9OVC1TSVpFOiAxMC41cHQ7IG1zby1mYXJlYXN0LWZvbnQt ZmFtaWx5OiDlrovkvZM7IG1zby1hbnNpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLWZhcmVhc3QtbGFu Z3VhZ2U6IFpILUNOOyBtc28tYmlkaS1sYW5ndWFnZTogQVItU0EiIA0KbGFuZz1FTi1VUz5IaSw8 QlI+R2xhZCB0byBoZWFyIHRoYXQgeW91JiMzOTtyZSBvbiB0aGUgbWFya2V0IGZvciBMRUQgDQps aWdodGluZy48QlI+VGhpcyBpcyBIdWdoIGZyb20gQkVBTW1heC4gV2Ugc3BlY2lhbGl6ZWQgaW4g TEVEIGxpZ2h0aW5nIHN1Y2ggYXMgDQp0aGUgTEVEIHR1YmUgbGlnaHQsIGJ1bGIgbGlnaHQsIGZs b29kIGxpZ2h0LCBoaWdoIGJheSBsaWdodCwgcGFuZWwgbGlnaHQsIDxTUEFOIA0Kc3R5bGU9Im1z by1zcGFjZXJ1bjogeWVzIj4mbmJzcDs8L1NQQU4+c3RyaXAgbGlnaHQgZXRjLiBhbmQgaG9wZSB0 byBmaW5kIGEgd2F5IA0KdG8gY29vcGVyYXRlIHdpdGggeW91ITxCUj5JZiB5b3UgYXJlIGludGVy ZXN0ZWQgaW4gb3VyIHByb2R1Y3RzLCBwbGVhc2UgY29udGFjdCANCm1lIGZyZWVseS48QlI+QmVz dCByZWdhcmRzPC9TUEFOPjwvUD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtBcmlh bCYjMzk7LCYjMzk7c2Fucy1zZXJpZiYjMzk7OyBCQUNLR1JPVU5EOiAjZjZmNmY2OyBGT05ULVNJ WkU6IDEwLjVwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWFuc2ktbGFu Z3VhZ2U6IEVOLVVTOyBtc28tZmFyZWFzdC1sYW5ndWFnZTogWkgtQ047IG1zby1iaWRpLWxhbmd1 YWdlOiBBUi1TQSIgDQpsYW5nPUVOLVVTPg0KPERJViANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJp YWw7IENPTE9SOiByZ2IoMTUzLDE1MywxNTMpOyBGT05ULVNJWkU6IDEwcHQiPj09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PTwvRElWPg0KPERJViBzdHlsZT0iRk9OVC1GQU1J TFk6IEFyaWFsOyBDT0xPUjogcmdiKDE1MywxNTMsMTUzKTsgRk9OVC1TSVpFOiAxMHB0Ij48U1BB TiANCnN0eWxlPSJGT05ULUZBTUlMWTogVGFob21hOyBGT05ULVNJWkU6IDEwLjVwdCI+PFNQQU4g DQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBDT0xPUjogcmdiKDUxLDEwMiwyNTUpOyBGT05U LVNJWkU6IDExcHQ7IEZPTlQtV0VJR0hUOiBib2xkIj5IdWdoPC9TUEFOPjwvU1BBTj48L0RJVj4N CjxESVYgc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgQ09MT1I6IHJnYigxNTMsMTUzLDE1Myk7 IEZPTlQtU0laRTogMTBwdCI+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IFRhaG9tYTsgRk9O VC1TSVpFOiAxMC41cHQiPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgQ09MT1I6 IHJnYig1MSwxMDIsMjU1KTsgRk9OVC1TSVpFOiAxMXB0OyBGT05ULVdFSUdIVDogYm9sZCI+PEZP TlQgDQpjb2xvcj0jMDAwMDAwIHNpemU9MiBmYWNlPVRhaG9tYT5TYWxlcyByZXByZXNlbnRhdGl2 ZTwvRk9OVD48L1NQQU4+PC9TUEFOPjwvRElWPg0KPERJViBzdHlsZT0iRk9OVC1GQU1JTFk6IEFy aWFsOyBDT0xPUjogcmdiKDE1MywxNTMsMTUzKTsgRk9OVC1TSVpFOiAxMHB0Ij48U1BBTiANCnN0 eWxlPSJGT05ULUZBTUlMWTogVGFob21hOyBGT05ULVNJWkU6IDEwLjVwdCI+PFNQQU4gDQpzdHls ZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBDT0xPUjogcmdiKDUxLDEwMiwyNTUpOyBGT05ULVNJWkU6 IDExcHQ7IEZPTlQtV0VJR0hUOiBib2xkIj48L1NQQU4+PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZP TlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1TSVpFOiAxMHB0Ij5UZWw6IA0KKzg2LTU3NC04OTAyMDgw MCZuYnNwOyZuYnNwOyZuYnNwOyB8fCBTa3lwZTogSHVnaE1hcnM8L1NQQU4+PC9ESVY+DQo8RElW IHN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IENPTE9SOiByZ2IoMTUzLDE1MywxNTMpOyBGT05U LVNJWkU6IDEwcHQiPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1TSVpF OiAxMHB0Ij48L1NQQU4+RmF4OiANCis4Ni01NzQtODkwMjA4MTYmbmJzcDsmbmJzcDsmbmJzcDt8 fCBFLU1haWw6PFNQQU4gDQpjbGFzcz1BcHBsZS1jb252ZXJ0ZWQtc3BhY2U+Jm5ic3A7PC9TUEFO PjxGT05UIGNvbG9yPSM5OTk5OTk+PEEgDQpocmVmPSJtYWlsdG86YmVhbS1tYXhAaGFpZnUubmV0 LmNuIj5iZWFtLW1heEBoYWlmdS5uZXQuY248L0E+PC9GT05UPjwvRElWPg0KPERJViBzdHlsZT0i Rk9OVC1GQU1JTFk6IEFyaWFsOyBDT0xPUjogcmdiKDE1MywxNTMsMTUzKTsgRk9OVC1TSVpFOiAx MHB0Ij48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IENPTE9SOiByZ2IoMCwwLDI1 NSk7IEZPTlQtU0laRTogMTBwdCI+PC9TUEFOPldlYjo8U1BBTiANCmNsYXNzPUFwcGxlLWNvbnZl cnRlZC1zcGFjZT4mbmJzcDs8L1NQQU4+PEEgDQpzdHlsZT0iTUFSR0lOLVRPUDogMHB4OyBGT05U LUZBTUlMWTogQXJpYWw7IE1BUkdJTi1CT1RUT006IDBweDsgRk9OVC1TSVpFOiAxMHB0IiANCmhy ZWY9Imh0dHA6Ly93d3cuYmVhbW1heC5uZXQvIj53d3cuYmVhbW1heC5uZXQ8L0E+Jm5ic3A7fHwg TW9iaWxlOiArODYgDQoxODg2ODk0NDI4MjwvRElWPg0KPERJViBzdHlsZT0iRk9OVC1GQU1JTFk6 IEFyaWFsOyBDT0xPUjogcmdiKDE1MywxNTMsMTUzKTsgRk9OVC1TSVpFOiAxMHB0Ij48SU1HIA0K c3R5bGU9IldJRFRIOiAzMTFweDsgSEVJR0hUOiA0NHB4IiBib3JkZXI9MCBoc3BhY2U9MCBhbHQ9 IiIgYWxpZ249YmFzZWxpbmUgDQpzcmM9ImNpZDppbWcwLmpwZyIgDQp3aWR0aD0zNTEgaGVpZ2h0 PTQ0PjwvRElWPjxTUEFOIA0Kc3R5bGU9IlRFWFQtVFJBTlNGT1JNOiBub25lOyBCQUNLR1JPVU5E LUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBGT05ULVZBUklBTlQ6IG5vcm1hbDsgRk9OVC1TVFlM RTogbm9ybWFsOyBURVhULUlOREVOVDogMHB4OyBGT05ULUZBTUlMWTog5a6L5L2TOyBXSElURS1T UEFDRTogbm9ybWFsOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsg Rk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IFdPUkQtU1BBQ0lORzogMHB4 OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiPg0KPERJViBzdHlsZT0iRk9OVC1GQU1J TFk6IEFyaWFsOyBDT0xPUjogcmdiKDE1MywxNTMsMTUzKTsgRk9OVC1TSVpFOiAxMHB0Ij48Rk9O VCANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJ WkU6IDEwcHQ7IEZPTlQtV0VJR0hUOiBib2xkIiANCmNvbG9yPSMwMDAwMDEgc2l6ZT0xIGZhY2U9 IiI+TklOR0JPJm5ic3A7QkVBTU1BWCBMSUdIVElORyBDTy4sIA0KTFRELjwvRk9OVD48QlI+PFNQ QU4gc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1TSVpFOiAxMHB0Ij5BZGQ6IDl0aCAN CkZsb29yLFNoYW5zaGFuIEJ1aWxkaW5nLE5vLjc3NzxCUj5NaWRkbGUgUmlsaSBSb2FkLFlpbnpo b3UgDQpEaXN0cmljdCxOaW5nYm8sQ2hpbmEuPEJSPjwvU1BBTj49PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PC9ESVY+DQo8RElWIHN0eWxlPSJGT05ULUZBTUlMWTogQXJp YWw7IENPTE9SOiByZ2IoMTUzLDE1MywxNTMpOyBGT05ULVNJWkU6IDEwcHQiPjxGT05UIA0KY29s b3I9I2ZmZmZmZj4zMDU5QkVFQi00QjUzLTQ2MTEtQTZEQy0xQUIxMzQ4MEUxNkQzMDU5QkVFQi00 QjUzLTQ2MTEtQTZEQy0xQUIxMzQ4MEUxNkQzMDU5QkVFQi00QjUzLTQ2MTEtQTZEQy0xQUIxMzQ4 MEUxNkQzMDU5QkVFQi00QjUzLTQ2MTEtQTZEQy0xQUIxMzQ4MEUxNkQzMDU5QkVFQi00QjUzLTQ2 MTEtQTZEQy0xQUIxMzQ4MEUxNkQzMDU5QkVFQi00QjUzLTQ2MTEtQTZEQy0xQUIxMzQ4MEUxNkQ8 L0ZPTlQ+PC9ESVY+PC9TUEFOPjwvU1BBTj48L0JPRFk+PC9IVE1MPg0KDQo= From shyam@zadarastorage.com Tue Apr 26 23:59:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3848A7D07 for ; Tue, 26 Apr 2016 23:59:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F1F318F8037 for ; Tue, 26 Apr 2016 21:59:34 -0700 (PDT) X-ASG-Debug-ID: 1461733170-04cb6c09a0293610001-NocioJ Received: from mail-wm0-f43.google.com (mail-wm0-f43.google.com [74.125.82.43]) by cuda.sgi.com with ESMTP id qktuBErbb5R0KrXC (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 26 Apr 2016 21:59:31 -0700 (PDT) X-Barracuda-Envelope-From: shyam@zadarastorage.com X-Barracuda-Effective-Source-IP: mail-wm0-f43.google.com[74.125.82.43] X-Barracuda-Apparent-Source-IP: 74.125.82.43 Received: by mail-wm0-f43.google.com with SMTP id n129so10141883wmn.1 for ; Tue, 26 Apr 2016 21:59:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zadarastorage-com.20150623.gappssmtp.com; s=20150623; h=from:references:in-reply-to:mime-version:thread-index:date :message-id:subject:to:cc; bh=MkBOEc+L8ioxNdLJNN4BllzySQ00PfeorN4nQ/yOmcM=; b=PC+FAe3IjacqAFU1bs/NO1409anP/wyKlEjFDnp64PPYZ1xuHL3+i5ziTj0tP/7vF5 CYefgiV9Z+tfQhaM3JfvCaYzI3TdJXgHyhzm4Xb9y3VIbzeECVLB/Lg8kz9RniJAup3w PxiXiFxRQs0vHYT7fPKr1yfyYEEPidMpBWU/WWkK6R0WhW04SZ4ByUIqWYgWQqKMM6xF Kh3yrf2ij0PcUst3T+o+BHgNf1oDprNZhkmtpreaJXSDIKnFoc9PnvqmiBUU7LfvyopJ B+n+iKA7IgdDlsl255w1r1zSIwITtAEf5F/LO2RLkI4c2IqUhIhdIeRH1bf6brqVFU51 Orgg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:references:in-reply-to:mime-version :thread-index:date:message-id:subject:to:cc; bh=MkBOEc+L8ioxNdLJNN4BllzySQ00PfeorN4nQ/yOmcM=; b=TWjO9Bg+V0qoOMb52mGivBA+TTm5EACBpsZr1yiojxGg644E6O84c7kXYlciSSr6yw iXnVW+pUF8PzNRRN1Bqi79ttu1DhdrMkh8ElXoB6Ze731/xD2x9wMuJOuf/mc/qJjxNm NiT9ScrGibLO7qWLNhr2R33rcE2gUY1XWiG84Kn7dvzTm6kf0pjLMKfsFxJCDHHo+8se icYpvrWbP0kLx+tlbiqiOV28TWRtM8GzsP/dGjbw7EDwpT+mGNdTRm5CswHFwIBr1YDB s419KvFvbM4bznOvhsXiQdVi76QjrqPAAPVdfgEzoMY2sUrrEUjAockR37VEukordJJe zI3g== X-Gm-Message-State: AOPr4FW2Y1YRYpbNBVzEsEd63PxMQGOcl5NgNlkce9Gvr8WfzBExQoqis80vdrGUZXC2I/Z5edmv5qyc/UStVg== X-Received: by 10.28.125.138 with SMTP id y132mr7347787wmc.90.1461733170512; Tue, 26 Apr 2016 21:59:30 -0700 (PDT) From: Shyam Kaushik References: <20160426224612.GE26977@dastard> In-Reply-To: <20160426224612.GE26977@dastard> MIME-Version: 1.0 X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AdGgDXirk8RQf/jNTz+g2wicyMbclQALUo8A Date: Wed, 27 Apr 2016 10:29:29 +0530 Message-ID: Subject: RE: [PATCH] xfs_buf_iodone_callbacks to force shutdown & resubmit buf in case of permanent failure To: Dave Chinner X-ASG-Orig-Subj: RE: [PATCH] xfs_buf_iodone_callbacks to force shutdown & resubmit buf in case of permanent failure Cc: xfs@oss.sgi.com, Alex Lyakas Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wm0-f43.google.com[74.125.82.43] X-Barracuda-Start-Time: 1461733171 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3552 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29091 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi Dave, I am not sure how to do lock release in this code path. Is it possible that you can take over this bug/patch? Thanks. --Shyam -----Original Message----- From: Dave Chinner [mailto:david@fromorbit.com] Sent: 27 April 2016 04:16 To: Shyam Kaushik Cc: xfs@oss.sgi.com; Alex Lyakas Subject: Re: [PATCH] xfs_buf_iodone_callbacks to force shutdown & resubmit buf in case of permanent failure On Tue, Apr 26, 2016 at 07:31:59PM +0530, Shyam Kaushik wrote: > When XFS underlying disk fails, it could take several milliseconds for the > FS to be marked > shutdown. xfs_buf_iodone_callbacks() retries buf upon first failure by > submitting it once > again. But if the buf fails 2nd time before FS is marked for shutdown, it > just releases the > buf with xfs_buf_relse(). This is flawed that nobody is releasing the > XFS_IFLOCK on the inode. > Because of this AIL tasks repeated effort to xfs_inode_item_push() will > see that xfs_iflock() > cannot be acquired. This blocks XFS from being unmounted as > xfs_ail_push_all_sync() will keep > looping without progress. Patch formatting first: commit messages should wrap at 68-72 columns... > Fix this by marking the FS for shutdown if we have a permanent failure & > resubmit the buf. > xfs_buf_submit() will see FS marked for shutdown & invoke the callback > which releases > XFS_IFLOCK. > > diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c > index 1a6c9b9..6f73ee0 100644 > --- a/fs/xfs/xfs_buf_item.c > +++ b/fs/xfs/xfs_buf_item.c > @@ -1100,7 +1100,12 @@ xfs_buf_iodone_callbacks( > XBF_DONE | XBF_WRITE_FAIL; > xfs_buf_submit(bp); > } else { > - xfs_buf_relse(bp); > + /* > + * if we have the buf fail 2nd time, force a FS > shutdown & resubmit > + * the buf for it to be failed back immediately > + */ > + xfs_force_shutdown(mp, SHUTDOWN_LOG_IO_ERROR); > + xfs_buf_submit(bp); > } > > return; ... and patches should not be wrapped or have tabs converted to spaces. See Documentation/SubmittingPatches. Ok, so yes, it would seem there is a bug here, but I don't think this is correct solution: this will shut down the filesystem immediately on inode write IO errors. As i've said *many* times before: this is might seem like a fix, but it is incorrect behaviour as it does not give transient failures (e.g. multipath failover causing timeouts) a chance to be resolved before shutting down the filesystem. That's the reason for all the retry behaviour on XFS metadata - the system can continue to run logging new changes even if it can't write back the changes immediately. As long as the log writes continue to work, the filesystem can continue to function correctly. Hence shutting down the filesystem immediately on any metadata write error (other than a journal write) is premature and will lead to spurious errors causing shutdowns rather than just logging a warning. We are in the process of making this error behaviour configurable - Carlos is going to finish off the patchset I originally wrote to do this, so the "shutdown immediately" option will be avaialable through that set of interfaces. We'll still need to fix the unlock case for retry here, though... Cheers, Dave. -- Dave Chinner david@fromorbit.com From penny21@bedfurniture.com Wed Apr 27 00:42:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=DATE_IN_PAST_12_24, 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 67BFE7D09 for ; Wed, 27 Apr 2016 00:42:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 258ED8F8033 for ; Tue, 26 Apr 2016 22:42:32 -0700 (PDT) X-ASG-Debug-ID: 1461735749-04cbb00fea269720001-NocioJ Received: from bedfurniture.com ([101.20.109.25]) by cuda.sgi.com with SMTP id 7spsT1JHCjtcxlm1 for ; Tue, 26 Apr 2016 22:42:30 -0700 (PDT) X-Barracuda-Envelope-From: penny21@bedfurniture.com X-Barracuda-Effective-Source-IP: UNKNOWN[101.20.109.25] X-Barracuda-Apparent-Source-IP: 101.20.109.25 Received: from SZ44TFADZFK58T8[127.0.0.1] by SZ44TFADZFK58T8[127.0.0.1] (SMTPD32); Tue, 26 Apr 2016 16:42:28 +0800 From: "pennywang81@163.com" Subject: Leather bed from China To: xfs@oss.sgi.com X-ASG-Orig-Subj: Leather bed from China MIME-Version: 1.0 Sender: penny21@bedfurniture.com Reply-To: pennywang81@163.com Date: Tue, 26 Apr 2016 16:42:28 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[101.20.109.25] X-Barracuda-Start-Time: 1461735749 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8210 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.56 X-Barracuda-Spam-Status: No, SCORE=1.56 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, DATE_IN_PAST_12_24, DATE_IN_PAST_12_24_2, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29091 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 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.80 DATE_IN_PAST_12_24_2 DATE_IN_PAST_12_24_2 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160427054232.CBC94106C121@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOS4wMC44MTEyLjE2Njg0Ij48L0hFQUQ+DQo8Qk9EWT4NCjxQIHN0eWxlPSJNQVJHSU46 IDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsg QkFDS0dST1VORDogcmdiKDI1NSwyMzcsMTk2KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0la RTogMTBwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZh bWlseTog5b6u6L2v6ZuF6buROyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdDsgbXNvLXNoYWRp bmc6IHJnYigyNTUsMjM3LDE5NikiPkhpIA0KU2lyL01hZGFtLDwvU1BBTj48U1BBTiANCnN0eWxl PSJGT05ULUZBTUlMWTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjM3LDE5Nik7IENPTE9S OiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEwcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5 OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOW+rui9r+mbhem7kTsgbXNvLWZvbnQta2Vybmlu ZzogMS4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDIzNywxOTYpIj48QlI+PC9TUEFOPjxT UEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdiKDI1NSwyMzcs MTk2KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTBwdDsgbXNvLXNwYWNlcnVuOiAm IzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5b6u6L2v6ZuF6buROyBtc28t Zm9udC1rZXJuaW5nOiAxLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjM3LDE5NikiPjxC Uj48L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiBy Z2IoMjU1LDIzNywxOTYpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMHB0OyBtc28t c3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlvq7ova/p m4Xpu5E7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwy MzcsMTk2KSI+R2xhZCANCnRvIGhlYXIgdGhhdCB5b3UmIzM5O3JlIG9uIHRoZSBtYXJrZXQgZm9y IGZ1cm5pdHVyZSx3ZSBzcGVjaWFsaXplIGluIHRoaXMgZmllbGQgZm9yIA0KMTwvU1BBTj48U1BB TiANCnN0eWxlPSJGT05ULUZBTUlMWTog5b6u6L2v6ZuF6buROyBCQUNLR1JPVU5EOiByZ2IoMjU1 LDIzNywxOTYpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMHB0OyBtc28tc3BhY2Vy dW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0OyBtc28tc2hhZGlu ZzogcmdiKDI1NSwyMzcsMTk2KTsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNvLWhh bnNpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNvLWJpZGktZm9udC1mYW1pbHk6IEFyaWFsIj42PC9T UEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdiKDI1 NSwyMzcsMTk2KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTBwdDsgbXNvLXNwYWNl cnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5b6u6L2v6ZuF6buR OyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjM3LDE5 NikiPiZuYnNwO3llYXJzLHdpdGggDQp0aGUmbmJzcDtzdHJlbmd0aCBvZiA8L1NQQU4+PFNQQU4g DQpzdHlsZT0iRk9OVC1GQU1JTFk6IOW+rui9r+mbhem7kTsgQkFDS0dST1VORDogcmdiKDI1NSwy MzcsMTk2KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTBwdDsgbXNvLXNwYWNlcnVu OiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdDsgbXNvLXNoYWRpbmc6 IHJnYigyNTUsMjM3LDE5Nik7IG1zby1hc2NpaS1mb250LWZhbWlseTogQXJpYWw7IG1zby1oYW5z aS1mb250LWZhbWlseTogQXJpYWw7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiBBcmlhbCI+YmVkIA0K RlVSTklUVVJFIDwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEJBQ0tH Uk9VTkQ6IHJnYigyNTUsMjM3LDE5Nik7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEw cHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6 IOW+rui9r+mbhem7kTsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1zaGFkaW5nOiBy Z2IoMjU1LDIzNywxOTYpIj4sd2l0aCANCmdvb2QgcXVhbGl0eSBhbmQgcHJldHR5IGNvbXBldGl0 aXZlIHByaWNlLjwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEJBQ0tH Uk9VTkQ6IHJnYigyNTUsMjM3LDE5Nik7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEw cHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6 IOW+rui9r+mbhem7kTsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1zaGFkaW5nOiBy Z2IoMjU1LDIzNywxOTYpIj48QlI+PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBB cmlhbDsgQkFDS0dST1VORDogcmdiKDI1NSwyMzcsMTk2KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZP TlQtU0laRTogMTBwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1m b250LWZhbWlseTog5b6u6L2v6ZuF6buROyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdDsgbXNv LXNoYWRpbmc6IHJnYigyNTUsMjM3LDE5NikiPjxCUj48L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9O VC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2IoMjU1LDIzNywxOTYpOyBDT0xPUjogcmdi KDAsMCwwKTsgRk9OVC1TSVpFOiAxMHB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1z by1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlvq7ova/pm4Xpu5E7IG1zby1mb250LWtlcm5pbmc6IDEu MDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyMzcsMTk2KSI+QWxzbyANCndlIGhhdmUgb3Vy IG93biBwcm9mZXNzaW9uYWwgZGVzaWduZXJzIHRvIG1lZXQgYW55IG9mIHlvdXIgcmVxdTwvU1BB Tj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTog5b6u6L2v6ZuF6buROyBCQUNLR1JPVU5EOiBy Z2IoMjU1LDIzNywxOTYpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMHB0OyBtc28t c3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0OyBtc28t c2hhZGluZzogcmdiKDI1NSwyMzcsMTk2KTsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBBcmlhbDsg bXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNvLWJpZGktZm9udC1mYW1pbHk6IEFyaWFs Ij5pcjwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEJBQ0tHUk9VTkQ6 IHJnYigyNTUsMjM3LDE5Nik7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEwcHQ7IG1z by1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOW+rui9 r+mbhem7kTsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1 LDIzNywxOTYpIj5lbWVudHM8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IOW+rui9 r+mbhem7kTsgQkFDS0dST1VORDogcmdiKDI1NSwyMzcsMTk2KTsgQ09MT1I6IHJnYigwLDAsMCk7 IEZPTlQtU0laRTogMTBwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1r ZXJuaW5nOiAxLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjM3LDE5Nik7IG1zby1hc2Np aS1mb250LWZhbWlseTogQXJpYWw7IG1zby1oYW5zaS1mb250LWZhbWlseTogQXJpYWw7IG1zby1i aWRpLWZvbnQtZmFtaWx5OiBBcmlhbCI+Jm5ic3A7PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQt RkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdiKDI1NSwyMzcsMTk2KTsgQ09MT1I6IHJnYigw LDAsMCk7IEZPTlQtU0laRTogMTBwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28t ZmFyZWFzdC1mb250LWZhbWlseTog5b6u6L2v6ZuF6buROyBtc28tZm9udC1rZXJuaW5nOiAxLjAw MDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjM3LDE5NikiPi48L1NQQU4+PFNQQU4gDQpzdHls ZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2IoMjU1LDIzNywxOTYpOyBDT0xP UjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMHB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMz OTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlvq7ova/pm4Xpu5E7IG1zby1mb250LWtlcm5p bmc6IDEuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyMzcsMTk2KSI+PEJSPjwvU1BBTj48 U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjM3 LDE5Nik7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEwcHQ7IG1zby1zcGFjZXJ1bjog JiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOW+rui9r+mbhem7kTsgbXNv LWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDIzNywxOTYpIj48 QlI+PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDog cmdiKDI1NSwyMzcsMTk2KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTBwdDsgbXNv LXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5b6u6L2v 6ZuF6buROyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUs MjM3LDE5NikiPlNob3VsZCANCnlvdSBoYXZlIGFueSBxdWVzdGlvbnMsY2FsbCBtZSxsZXQmIzM5 O3MgdGFsayBkZXRhaWxzLjwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7 IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjM3LDE5Nik7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJ WkU6IDEwcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1m YW1pbHk6IOW+rui9r+mbhem7kTsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1zaGFk aW5nOiByZ2IoMjU1LDIzNywxOTYpIj48QlI+PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFN SUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdiKDI1NSwyMzcsMTk2KTsgQ09MT1I6IHJnYigwLDAs MCk7IEZPTlQtU0laRTogMTBwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFy ZWFzdC1mb250LWZhbWlseTog5b6u6L2v6ZuF6buROyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBw dDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjM3LDE5NikiPjxCUj48L1NQQU4+PFNQQU4gDQpzdHls ZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2IoMjU1LDIzNywxOTYpOyBDT0xP UjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMHB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMz OTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlvq7ova/pm4Xpu5E7IG1zby1mb250LWtlcm5p bmc6IDEuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyMzcsMTk2KSI+QmVzdCANCnJlZ2Fy ZHM8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IOW+rui9r+mbhem7kTsgQkFDS0dS T1VORDogcmdiKDI1NSwyMzcsMTk2KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTBw dDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBw dDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjM3LDE5Nik7IG1zby1hc2NpaS1mb250LWZhbWlseTog QXJpYWw7IG1zby1oYW5zaS1mb250LWZhbWlseTogQXJpYWw7IG1zby1iaWRpLWZvbnQtZmFtaWx5 OiBBcmlhbCI+LDwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTog5b6u6L2v6ZuF6buR OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDIzNywxOTYpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1T SVpFOiAxMHB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6 IDEuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyMzcsMTk2KTsgbXNvLWFzY2lpLWZvbnQt ZmFtaWx5OiBBcmlhbDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNvLWJpZGktZm9u dC1mYW1pbHk6IEFyaWFsIj48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lO OiAwcHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7 IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjM3LDE5Nik7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJ WkU6IDEwcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1m YW1pbHk6IOW+rui9r+mbhem7kTsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1zaGFk aW5nOiByZ2IoMjU1LDIzNywxOTYpIj5Db21wYW55IA0KbmFtZTogSG9uZGUgRnVybml0dXJlIElu ZHVzdHJpYWwgQ28uLEx0ZDwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7 IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjM3LDE5Nik7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJ WkU6IDEwcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1m YW1pbHk6IOW+rui9r+mbhem7kTsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1zaGFk aW5nOiByZ2IoMjU1LDIzNywxOTYpIj48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0i TUFSR0lOOiAwcHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTog QXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjM3LDE5Nik7IENPTE9SOiByZ2IoMCwwLDApOyBG T05ULVNJWkU6IDEwcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3Qt Zm9udC1mYW1pbHk6IOW+rui9r+mbhem7kTsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1z by1zaGFkaW5nOiByZ2IoMjU1LDIzNywxOTYpIj5UZWwvRmF4OiANCjAwODYtMzE2LTIzNjI4MDE8 L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2Io MjU1LDIzNywxOTYpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMHB0OyBtc28tc3Bh Y2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlvq7ova/pm4Xp u5E7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyMzcs MTk2KSI+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgc3R5bGU9Ik1BUkdJTjogMHB0IiBjbGFz cz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5E OiByZ2IoMjU1LDIzNywxOTYpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMHB0OyBt c28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlvq7o va/pm4Xpu5E7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1 NSwyMzcsMTk2KSI+TUIvV2hhdHNhcHA6MDA4NjEzODMxNjUwOTk3IA0KPC9TUEFOPjxTUEFOIA0K c3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdiKDI1NSwyMzcsMTk2KTsg Q09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTBwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3ll cyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5b6u6L2v6ZuF6buROyBtc28tZm9udC1r ZXJuaW5nOiAxLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjM3LDE5NikiPjxvOnA+PC9v OnA+PC9TUEFOPjwvUD4NCjxQPjwhLS1FbmRGcmFnbWVudC0tPjwvUD48L0JPRFk+PC9IVE1MPg0K DQo= From mstsxfx@gmail.com Wed Apr 27 02:51:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 431897D0C for ; Wed, 27 Apr 2016 02:51:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9FACAAC001 for ; Wed, 27 Apr 2016 00:51:07 -0700 (PDT) X-ASG-Debug-ID: 1461743463-04cb6c09a0297400001-NocioJ Received: from mail-wm0-f67.google.com (mail-wm0-f67.google.com [74.125.82.67]) by cuda.sgi.com with ESMTP id OwThVJS57N0soD6E (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 27 Apr 2016 00:51:04 -0700 (PDT) X-Barracuda-Envelope-From: mstsxfx@gmail.com X-Barracuda-Effective-Source-IP: mail-wm0-f67.google.com[74.125.82.67] X-Barracuda-Apparent-Source-IP: 74.125.82.67 Received: by mail-wm0-f67.google.com with SMTP id e201so10262253wme.2 for ; Wed, 27 Apr 2016 00:51:04 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=C+4g8BbNxutU/kVs3wMrnmNCi8i5YAJvVfKPsAFKzQo=; b=LnT/1ck22jhiOuNJA+nefjZxMkXXAGVQsi6ZMS4W4X8vECXh1wHMyFEtE9cFHsuc5u FObRUZ03CymEo3VuYGvQnJWmaYzlieoL73QVSFq8KT1swTwTSMrBOPgqcMNtkipd3IDS nTuQ1CBXfup/a/eFLVO+BvqoPsNRZcTYTwlWeFLg3lMKc35ZRIKz5CCEK5Pk61J5IHID yLnKZb7M3ZbqS0J5C0TNvPoe4QzS6V8olOU7K/AkE35cUlZUkyxOy6RDv0gzYHy/ixy4 ewrnqrQLK/ZgHMEsSXd2KUYbxkZYFcS1NW3odqBaBbInrvo03Fj8iUuxpeA4TNQOrNG4 a9cQ== X-Gm-Message-State: AOPr4FWW6zCoRVRguKlSNBtjpyBZZ1eGlo86V8+lFVdgWhVCMOQXPz6QIrfMeXdf+r/O1g== X-Received: by 10.28.91.199 with SMTP id p190mr22687074wmb.47.1461743463494; Wed, 27 Apr 2016 00:51:03 -0700 (PDT) Received: from localhost (nat1.scz.suse.com. [213.151.88.250]) by smtp.gmail.com with ESMTPSA id lh1sm2601930wjb.20.2016.04.27.00.51.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 27 Apr 2016 00:51:02 -0700 (PDT) Date: Wed, 27 Apr 2016 09:51:02 +0200 From: Michal Hocko To: Dave Chinner Cc: linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, Andrew Morton , Theodore Ts'o , Chris Mason , Jan Kara , ceph-devel@vger.kernel.org, cluster-devel@redhat.com, linux-nfs@vger.kernel.org, logfs@logfs.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-mtd@lists.infradead.org, reiserfs-devel@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-f2fs-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, LKML Subject: Re: [PATCH 1/2] mm: add PF_MEMALLOC_NOFS Message-ID: <20160427075102.GB2179@dhcp22.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 1/2] mm: add PF_MEMALLOC_NOFS References: <1461671772-1269-1-git-send-email-mhocko@kernel.org> <1461671772-1269-2-git-send-email-mhocko@kernel.org> <20160426230702.GG26977@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160426230702.GG26977@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: mail-wm0-f67.google.com[74.125.82.67] X-Barracuda-Start-Time: 1461743464 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1894 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29094 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed 27-04-16 09:07:02, Dave Chinner wrote: > On Tue, Apr 26, 2016 at 01:56:11PM +0200, Michal Hocko wrote: > > From: Michal Hocko > > > > GFP_NOFS context is used for the following 4 reasons currently > > - to prevent from deadlocks when the lock held by the allocation > > context would be needed during the memory reclaim > > - to prevent from stack overflows during the reclaim because > > the allocation is performed from a deep context already > > - to prevent lockups when the allocation context depends on > > other reclaimers to make a forward progress indirectly > > - just in case because this would be safe from the fs POV > > - silencing lockdep false positives > > > Introduce PF_MEMALLOC_NOFS task specific flag and memalloc_nofs_{save,restore} > > API to control the scope. This is basically copying > > memalloc_noio_{save,restore} API we have for other restricted allocation > > context GFP_NOIO. > > > > Xfs has already had a similar functionality as PF_FSTRANS so let's just > > give it a more generic name and make it usable for others as well and > > move the GFP_NOFS context tracking to the page allocator. Xfs has its > > own accessor functions but let's keep them for now to reduce this patch > > as minimum. > > Can you split this into two patches? The first simply does this: > > #define PF_MEMALLOC_NOFS PF_FSTRANS > > and changes only the XFS code to use PF_MEMALLOC_NOFS. > > The second patch can then do the rest of the mm API changes that we > don't actually care about in XFS at all. That way I can carry all > the XFS changes in the XFS tree and not have to worry about when > this stuff gets merged or conflicts with the rest of the work that > is being done to the mm/ code and whatever tree that eventually > lands in... Sure I will do that -- Michal Hocko SUSE Labs From mstsxfx@gmail.com Wed Apr 27 03:03:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 6BFD97D15 for ; Wed, 27 Apr 2016 03:03:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3E5698F8037 for ; Wed, 27 Apr 2016 01:03:19 -0700 (PDT) X-ASG-Debug-ID: 1461744193-04cb6c09a12978d0001-NocioJ Received: from mail-wm0-f67.google.com (mail-wm0-f67.google.com [74.125.82.67]) by cuda.sgi.com with ESMTP id QdurwVjnN7UBSwd3 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 27 Apr 2016 01:03:14 -0700 (PDT) X-Barracuda-Envelope-From: mstsxfx@gmail.com X-Barracuda-Effective-Source-IP: mail-wm0-f67.google.com[74.125.82.67] X-Barracuda-Apparent-Source-IP: 74.125.82.67 Received: by mail-wm0-f67.google.com with SMTP id n129so1065618wmn.1 for ; Wed, 27 Apr 2016 01:03:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=2d5yH/OQcIQW//AFb2gVtkT3cOdnChHCcJxuwYEYpVw=; b=PqNzWQpLAollpj4J733ZEZp0cM36/hDakyhh1VonzPgfisRJG+ngtAGkPTZCzopmVM tirqdkCxJFA63JDyTV5NrTot1EoMxCZiuR1hfV//SlNO2wshsFH3OLDCAV36jo+F/3kL 5NdGwlkz64gpFO9fhPKbf1kBAmY51S83sjjhNDClx6YLe1nN49pNPfol84cRQSE44QRS ZGk87VyqyiO4GtC+pyqV5o/n18XDDAdYki3ht0jgH+KQ3TElpztqyyTdUdHScY/kemqv hGupMJe+h/KzXOO95ab5DmzGDsVP93BYFzqQOhJqRN4ofQADasieDCwnvyrTM1rpsoUU bCtA== X-Gm-Message-State: AOPr4FXdRCVMK3FTnmxgn08AEOTNqrRXz3Zh79daZy3yCmDreu93O50LREW1+Tr+IWe0tQ== X-Received: by 10.28.236.88 with SMTP id k85mr23699656wmh.53.1461744193123; Wed, 27 Apr 2016 01:03:13 -0700 (PDT) Received: from localhost (nat1.scz.suse.com. [213.151.88.250]) by smtp.gmail.com with ESMTPSA id kz1sm2607462wjc.46.2016.04.27.01.03.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 27 Apr 2016 01:03:12 -0700 (PDT) Date: Wed, 27 Apr 2016 10:03:11 +0200 From: Michal Hocko To: Dave Chinner Cc: linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, Andrew Morton , Theodore Ts'o , Chris Mason , Jan Kara , ceph-devel@vger.kernel.org, cluster-devel@redhat.com, linux-nfs@vger.kernel.org, logfs@logfs.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-mtd@lists.infradead.org, reiserfs-devel@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-f2fs-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, LKML Subject: Re: [PATCH 2/2] mm, debug: report when GFP_NO{FS,IO} is used explicitly from memalloc_no{fs,io}_{save,restore} context Message-ID: <20160427080311.GC2179@dhcp22.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 2/2] mm, debug: report when GFP_NO{FS,IO} is used explicitly from memalloc_no{fs,io}_{save,restore} context References: <1461671772-1269-1-git-send-email-mhocko@kernel.org> <1461671772-1269-3-git-send-email-mhocko@kernel.org> <20160426225845.GF26977@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160426225845.GF26977@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: mail-wm0-f67.google.com[74.125.82.67] X-Barracuda-Start-Time: 1461744193 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1950 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29094 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed 27-04-16 08:58:45, Dave Chinner wrote: > On Tue, Apr 26, 2016 at 01:56:12PM +0200, Michal Hocko wrote: > > From: Michal Hocko > > > > THIS PATCH IS FOR TESTING ONLY AND NOT MEANT TO HIT LINUS TREE > > > > It is desirable to reduce the direct GFP_NO{FS,IO} usage at minimum and > > prefer scope usage defined by memalloc_no{fs,io}_{save,restore} API. > > > > Let's help this process and add a debugging tool to catch when an > > explicit allocation request for GFP_NO{FS,IO} is done from the scope > > context. The printed stacktrace should help to identify the caller > > and evaluate whether it can be changed to use a wider context or whether > > it is called from another potentially dangerous context which needs > > a scope protection as well. > > You're going to get a large number of these from XFS. There are call > paths in XFs that get called both inside and outside transaction > context, and many of them are marked with GFP_NOFS to prevent issues > that have cropped up in the past. > > Often these are to silence lockdep warnings (e.g. commit b17cb36 > ("xfs: fix missing KM_NOFS tags to keep lockdep happy")) because > lockdep gets very unhappy about the same functions being called with > different reclaim contexts. e.g. directory block mapping might > occur from readdir (no transaction context) or within transactions > (create/unlink). hence paths like this are tagged with GFP_NOFS to > stop lockdep emitting false positive warnings.... I would much rather see lockdep being fixed than abusing GFP_NOFS to workaround its limitations. GFP_NOFS has a real consequences to the memory reclaim. I will go and check the commit you mentioned and try to understand why that is a problem. From what you described above I would like to get rid of exactly this kind of usage which is not really needed for the recursion protection. Thanks! -- Michal Hocko SUSE Labs From mstsxfx@gmail.com Wed Apr 27 06:54:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id ED2637D1B for ; Wed, 27 Apr 2016 06:54:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 57B1BAC002 for ; Wed, 27 Apr 2016 04:54:51 -0700 (PDT) X-ASG-Debug-ID: 1461758088-04cb6c09a129e6d0001-NocioJ Received: from mail-wm0-f67.google.com (mail-wm0-f67.google.com [74.125.82.67]) by cuda.sgi.com with ESMTP id IZ9NuFdhz5kDioho (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 27 Apr 2016 04:54:48 -0700 (PDT) X-Barracuda-Envelope-From: mstsxfx@gmail.com X-Barracuda-Effective-Source-IP: mail-wm0-f67.google.com[74.125.82.67] X-Barracuda-Apparent-Source-IP: 74.125.82.67 Received: by mail-wm0-f67.google.com with SMTP id e201so12240962wme.2 for ; Wed, 27 Apr 2016 04:54:48 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=0CwBiFF66eLUHZhyGy9b7gM3raPbLriSoj4VQ1zP3e8=; b=O14hp4dKSdORejsYnuFn55WUzdwRPlnb0g1C035Z9kJrMB2xCLmR+4Nw8WoZQDtngn vAFiZGVK8bo3BmHxdv3E6NTFAtq50HUjtde6QwqiPJhjE2sOywxR7VBkvCFDoMx1DjAR oafBBRAYALalhNSW/wXcb/d2VDRuDapuYCeobM+scOYI1xuoscXdCbudc2vEsxt5jBy2 qFe6ve/f9Mj9FBXCMktDTTL0yxPUbEiP6nL4FaR/6qmEtTMP7pooGo2Vkg5UZyrq0ci7 +21z+Dvf8A9weZkHVwpwbGWSAXUlryZfBQhrhOH/mKAr5qO3VG/Y1AB9jupc6CSrjUBY PM6A== X-Gm-Message-State: AOPr4FWaJ7Vu0eHUyjDOee/tOBEMT12b6izPIqjf+aDlpNlJ4JsqERATCv/803SRYeMyEg== X-Received: by 10.28.216.76 with SMTP id p73mr9814341wmg.3.1461758087736; Wed, 27 Apr 2016 04:54:47 -0700 (PDT) Received: from tiehlicka.suse.cz (nat1.scz.suse.com. [213.151.88.250]) by smtp.gmail.com with ESMTPSA id g197sm4580261wme.15.2016.04.27.04.54.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 27 Apr 2016 04:54:47 -0700 (PDT) From: Michal Hocko To: , Cc: Andrew Morton , Dave Chinner , "Theodore Ts'o" , Chris Mason , Jan Kara , ceph-devel@vger.kernel.org, cluster-devel@redhat.com, linux-nfs@vger.kernel.org, logfs@logfs.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-mtd@lists.infradead.org, reiserfs-devel@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-f2fs-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, LKML , Michal Hocko Subject: [PATCH 1.2/2] mm: introduce memalloc_nofs_{save,restore} API Date: Wed, 27 Apr 2016 13:54:35 +0200 X-ASG-Orig-Subj: [PATCH 1.2/2] mm: introduce memalloc_nofs_{save,restore} API Message-Id: <1461758075-21815-2-git-send-email-mhocko@kernel.org> X-Mailer: git-send-email 2.8.0.rc3 In-Reply-To: <1461758075-21815-1-git-send-email-mhocko@kernel.org> References: <1461671772-1269-2-git-send-email-mhocko@kernel.org> <1461758075-21815-1-git-send-email-mhocko@kernel.org> X-Barracuda-Connect: mail-wm0-f67.google.com[74.125.82.67] X-Barracuda-Start-Time: 1461758088 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9473 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29098 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header From: Michal Hocko GFP_NOFS context is used for the following 4 reasons currently - to prevent from deadlocks when the lock held by the allocation context would be needed during the memory reclaim - to prevent from stack overflows during the reclaim because the allocation is performed from a deep context already - to prevent lockups when the allocation context depends on other reclaimers to make a forward progress indirectly - just in case because this would be safe from the fs POV Unfortunately overuse of this allocation context brings some problems to the MM. Memory reclaim is much weaker (especially during heavy FS metadata workloads), OOM killer cannot be invoked because the MM layer doesn't have enough information about how much memory is freeable by the FS layer. In many cases it is far from clear why the weaker context is even used and so it might be used unnecessarily. We would like to get rid of those as much as possible. One way to do that is to use the flag in the scopes rather than isolated cases. Such a scope is declared when really necessary, tracked per task and all the allocation requests from within the context will simply inherit the GFP_NOFS semantic. Not only this is easier to understand and maintain because there are much less problematic contexts than specific allocation requests, this also helps code paths where FS layer interacts with other layers (e.g. crypto, security modules, MM etc...) and there is no easy way to convey the allocation context between the layers. Introduce memalloc_nofs_{save,restore} API to control the scope of GFP_NOFS allocation context. This is basically copying memalloc_noio_{save,restore} API we have for other restricted allocation context GFP_NOIO. The PF_MEMALLOC_NOFS flag already exists and it is just an alias for PF_FSTRANS which has been xfs specific until recently. There are no more PF_FSTRANS users anymore so let's just drop it. PF_MEMALLOC_NOFS is now checked in the MM layer and drops __GFP_FS implicitly same as PF_MEMALLOC_NOIO drops __GFP_IO. memalloc_noio_flags is renamed to current_gfp_context because it now cares about both PF_MEMALLOC_NOFS and PF_MEMALLOC_NOIO contexts. Xfs code paths preserve their semantic. kmem_flags_convert() doesn't need to evaluate the flag anymore. This patch shouldn't introduce any functional changes. Let's hope that filesystems will drop direct GFP_NOFS (resp. ~__GFP_FS) usage as much and possible and only use a properly documented memalloc_nofs_{save,restore} checkpoints where they are appropriate. Signed-off-by: Michal Hocko --- fs/xfs/kmem.h | 2 +- include/linux/gfp.h | 8 ++++++++ include/linux/sched.h | 34 ++++++++++++++++++++++++++-------- mm/page_alloc.c | 8 +++++--- mm/vmscan.c | 4 ++-- 5 files changed, 42 insertions(+), 14 deletions(-) diff --git a/fs/xfs/kmem.h b/fs/xfs/kmem.h index 0d83f332e5c2..b35688a54c9a 100644 --- a/fs/xfs/kmem.h +++ b/fs/xfs/kmem.h @@ -50,7 +50,7 @@ kmem_flags_convert(xfs_km_flags_t flags) lflags = GFP_ATOMIC | __GFP_NOWARN; } else { lflags = GFP_KERNEL | __GFP_NOWARN; - if ((current->flags & PF_MEMALLOC_NOFS) || (flags & KM_NOFS)) + if (flags & KM_NOFS) lflags &= ~__GFP_FS; } diff --git a/include/linux/gfp.h b/include/linux/gfp.h index 570383a41853..3ebdbdff44b4 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h @@ -210,8 +210,16 @@ struct vm_area_struct; * * GFP_NOIO will use direct reclaim to discard clean pages or slab pages * that do not require the starting of any physical IO. + * Please try to avoid using this flag directly and instead use + * memalloc_noio_{save,restore} to mark the whole scope which cannot + * perform any IO with a short explanation why. All allocation requests + * will inherit GFP_NOIO implicitly. * * GFP_NOFS will use direct reclaim but will not use any filesystem interfaces. + * Please try to avoid using this flag directly and instead use + * memalloc_nofs_{save,restore} to mark the whole scope which cannot/shouldn't + * recurse into the FS layer with a short explanation why. All allocation + * requests will inherit GFP_NOFS implicitly. * * GFP_USER is for userspace allocations that also need to be directly * accessibly by the kernel or hardware. It is typically used by hardware diff --git a/include/linux/sched.h b/include/linux/sched.h index 820db8f98bfc..e9521dc0475f 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -2102,9 +2102,9 @@ extern void thread_group_cputime_adjusted(struct task_struct *p, cputime_t *ut, #define PF_USED_ASYNC 0x00004000 /* used async_schedule*(), used by module init */ #define PF_NOFREEZE 0x00008000 /* this thread should not be frozen */ #define PF_FROZEN 0x00010000 /* frozen for system suspend */ -#define PF_FSTRANS 0x00020000 /* inside a filesystem transaction */ -#define PF_KSWAPD 0x00040000 /* I am kswapd */ -#define PF_MEMALLOC_NOIO 0x00080000 /* Allocating memory without IO involved */ +#define PF_KSWAPD 0x00020000 /* I am kswapd */ +#define PF_MEMALLOC_NOFS 0x00040000 /* All allocation requests will inherit GFP_NOFS */ +#define PF_MEMALLOC_NOIO 0x00080000 /* All allocation requests will inherit GFP_NOIO */ #define PF_LESS_THROTTLE 0x00100000 /* Throttle me less: I clean memory */ #define PF_KTHREAD 0x00200000 /* I am a kernel thread */ #define PF_RANDOMIZE 0x00400000 /* randomize virtual address space */ @@ -2115,8 +2115,6 @@ extern void thread_group_cputime_adjusted(struct task_struct *p, cputime_t *ut, #define PF_FREEZER_SKIP 0x40000000 /* Freezer should not count it as freezable */ #define PF_SUSPEND_TASK 0x80000000 /* this thread called freeze_processes and should not be frozen */ -#define PF_MEMALLOC_NOFS PF_FSTRANS /* Transition to a more generic GFP_NOFS scope semantic */ - /* * Only the _current_ task can read/write to tsk->flags, but other * tasks can access tsk->flags in readonly mode for example @@ -2142,13 +2140,21 @@ extern void thread_group_cputime_adjusted(struct task_struct *p, cputime_t *ut, #define tsk_used_math(p) ((p)->flags & PF_USED_MATH) #define used_math() tsk_used_math(current) -/* __GFP_IO isn't allowed if PF_MEMALLOC_NOIO is set in current->flags - * __GFP_FS is also cleared as it implies __GFP_IO. +/* + * Applies per-task gfp context to the given allocation flags. + * PF_MEMALLOC_NOIO implies GFP_NOIO + * PF_MEMALLOC_NOFS implies GFP_NOFS */ -static inline gfp_t memalloc_noio_flags(gfp_t flags) +static inline gfp_t current_gfp_context(gfp_t flags) { + /* + * NOIO implies both NOIO and NOFS and it is a weaker context + * so always make sure it makes precendence + */ if (unlikely(current->flags & PF_MEMALLOC_NOIO)) flags &= ~(__GFP_IO | __GFP_FS); + else if (unlikely(current->flags & PF_MEMALLOC_NOFS)) + flags &= ~__GFP_FS; return flags; } @@ -2164,6 +2170,18 @@ static inline void memalloc_noio_restore(unsigned int flags) current->flags = (current->flags & ~PF_MEMALLOC_NOIO) | flags; } +static inline unsigned int memalloc_nofs_save(void) +{ + unsigned int flags = current->flags & PF_MEMALLOC_NOFS; + current->flags |= PF_MEMALLOC_NOFS; + return flags; +} + +static inline void memalloc_nofs_restore(unsigned int flags) +{ + current->flags = (current->flags & ~PF_MEMALLOC_NOFS) | flags; +} + /* Per-process atomic flags. */ #define PFA_NO_NEW_PRIVS 0 /* May not gain new privileges. */ #define PFA_SPREAD_PAGE 1 /* Spread page cache over cpuset */ diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 0e2bb8f4ec0b..86bb5d6ddd7d 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -3801,10 +3801,12 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, goto out; /* - * Runtime PM, block IO and its error handling path can deadlock - * because I/O on the device might not complete. + * Apply scoped allocation constrains. This is mainly about + * GFP_NOFS resp. GFP_NOIO which has to be inherited for all + * allocation requests from a particular context which has + * been marked by memalloc_no{fs,io}_{save,restore} */ - alloc_mask = memalloc_noio_flags(gfp_mask); + alloc_mask = current_gfp_context(gfp_mask); ac.spread_dirty_pages = false; page = __alloc_pages_slowpath(alloc_mask, order, &ac); diff --git a/mm/vmscan.c b/mm/vmscan.c index c4a2f4512fca..cfb74de1efa3 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -2808,7 +2808,7 @@ unsigned long try_to_free_pages(struct zonelist *zonelist, int order, unsigned long nr_reclaimed; struct scan_control sc = { .nr_to_reclaim = SWAP_CLUSTER_MAX, - .gfp_mask = (gfp_mask = memalloc_noio_flags(gfp_mask)), + .gfp_mask = (gfp_mask = current_gfp_context(gfp_mask)), .order = order, .nodemask = nodemask, .priority = DEF_PRIORITY, @@ -3656,7 +3656,7 @@ static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order) struct reclaim_state reclaim_state; struct scan_control sc = { .nr_to_reclaim = max(nr_pages, SWAP_CLUSTER_MAX), - .gfp_mask = (gfp_mask = memalloc_noio_flags(gfp_mask)), + .gfp_mask = (gfp_mask = current_gfp_context(gfp_mask)), .order = order, .priority = ZONE_RECLAIM_PRIORITY, .may_writepage = !!(zone_reclaim_mode & RECLAIM_WRITE), -- 2.8.0.rc3 From mstsxfx@gmail.com Wed Apr 27 06:54:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B56617D1F for ; Wed, 27 Apr 2016 06:54:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6EBE48F8037 for ; Wed, 27 Apr 2016 04:54:54 -0700 (PDT) X-ASG-Debug-ID: 1461758086-04bdf0359627a4c0001-NocioJ Received: from mail-wm0-f67.google.com (mail-wm0-f67.google.com [74.125.82.67]) by cuda.sgi.com with ESMTP id b4jhYpfDC1qTi4CT (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 27 Apr 2016 04:54:48 -0700 (PDT) X-Barracuda-Envelope-From: mstsxfx@gmail.com X-Barracuda-Effective-Source-IP: mail-wm0-f67.google.com[74.125.82.67] X-Barracuda-Apparent-Source-IP: 74.125.82.67 Received: by mail-wm0-f67.google.com with SMTP id w143so12240085wmw.3 for ; Wed, 27 Apr 2016 04:54:47 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=aCH1AXv+N9F4UmecyzTH43U0sstzdltsYrQHW8OKJ/A=; b=iU4JhGD0D57VobtmzklpJq/zWUxjANgUmx6hr/my1M73tKytsnQgQADK6X4KLpBgFf fzPVf+S+nGcKu24xkt6vaX/nkwwnAyivQRwevplT1mawwS6bpcH/dJoSbA3gy6kH/HI2 0jM8POVtAdaEwQcxhG6uEnkCJujr7d2XxxCvcNB+ymqauR2CbLT0vx2v7VambtxqunCH K+Y1f5yJNv6bfAD+ncDZXMzoChjAgk/YL9QuRN3+u1/BJ0aAtdRxiZi5IKd9SSJDBm9u iF/M5/YKcoPvKvjlzCga3Etg3R8iXNnmVIcSrLuLegNy7NPnDOI2k6H9fIJzV8AsKcwu yguA== X-Gm-Message-State: AOPr4FWpXt3ci0RK5HxI7cMsZ0LhGGkyfeghA+yo1d+3NIhafXOUCRtAGlzubjR9wHlbhA== X-Received: by 10.28.92.69 with SMTP id q66mr9890176wmb.102.1461758086592; Wed, 27 Apr 2016 04:54:46 -0700 (PDT) Received: from tiehlicka.suse.cz (nat1.scz.suse.com. [213.151.88.250]) by smtp.gmail.com with ESMTPSA id g197sm4580261wme.15.2016.04.27.04.54.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 27 Apr 2016 04:54:45 -0700 (PDT) From: Michal Hocko To: , Cc: Andrew Morton , Dave Chinner , "Theodore Ts'o" , Chris Mason , Jan Kara , ceph-devel@vger.kernel.org, cluster-devel@redhat.com, linux-nfs@vger.kernel.org, logfs@logfs.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-mtd@lists.infradead.org, reiserfs-devel@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-f2fs-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, LKML , Michal Hocko Subject: [PATCH 1.1/2] xfs: abstract PF_FSTRANS to PF_MEMALLOC_NOFS Date: Wed, 27 Apr 2016 13:54:34 +0200 X-ASG-Orig-Subj: [PATCH 1.1/2] xfs: abstract PF_FSTRANS to PF_MEMALLOC_NOFS Message-Id: <1461758075-21815-1-git-send-email-mhocko@kernel.org> X-Mailer: git-send-email 2.8.0.rc3 In-Reply-To: <1461671772-1269-2-git-send-email-mhocko@kernel.org> References: <1461671772-1269-2-git-send-email-mhocko@kernel.org> X-Barracuda-Connect: mail-wm0-f67.google.com[74.125.82.67] X-Barracuda-Start-Time: 1461758087 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6844 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29098 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header From: Michal Hocko xfs has defined PF_FSTRANS to declare a scope GFP_NOFS semantic quite some time ago. We would like to make this concept more generic and use it for other filesystems as well. Let's start by giving the flag a more genric name PF_MEMALLOC_NOFS which is in line with an exiting PF_MEMALLOC_NOIO already used for the same purpose for GFP_NOIO contexts. Replace all PF_FSTRANS usage from the xfs code in the first step before we introduce a full API for it as xfs uses the flag directly anyway. This patch doesn't introduce any functional change. Signed-off-by: Michal Hocko --- Hi, as suggested by Dave, I have split up [1] into two parts. The first one addes a new PF flag which is just an alias to the existing PF_FSTRANS and does all the renaming and the second one to introduce the generic API which only changes the bare minimum in the xfs proper. fs/xfs/kmem.c | 4 ++-- fs/xfs/kmem.h | 2 +- fs/xfs/libxfs/xfs_btree.c | 2 +- fs/xfs/xfs_aops.c | 6 +++--- fs/xfs/xfs_trans.c | 12 ++++++------ include/linux/sched.h | 2 ++ 6 files changed, 15 insertions(+), 13 deletions(-) diff --git a/fs/xfs/kmem.c b/fs/xfs/kmem.c index 686ba6fb20dd..73f6ab59c664 100644 --- a/fs/xfs/kmem.c +++ b/fs/xfs/kmem.c @@ -80,13 +80,13 @@ kmem_zalloc_large(size_t size, xfs_km_flags_t flags) * context via PF_MEMALLOC_NOIO to prevent memory reclaim re-entering * the filesystem here and potentially deadlocking. */ - if ((current->flags & PF_FSTRANS) || (flags & KM_NOFS)) + if ((current->flags & PF_MEMALLOC_NOFS) || (flags & KM_NOFS)) noio_flag = memalloc_noio_save(); lflags = kmem_flags_convert(flags); ptr = __vmalloc(size, lflags | __GFP_HIGHMEM | __GFP_ZERO, PAGE_KERNEL); - if ((current->flags & PF_FSTRANS) || (flags & KM_NOFS)) + if ((current->flags & PF_MEMALLOC_NOFS) || (flags & KM_NOFS)) memalloc_noio_restore(noio_flag); return ptr; diff --git a/fs/xfs/kmem.h b/fs/xfs/kmem.h index d1c66e465ca5..0d83f332e5c2 100644 --- a/fs/xfs/kmem.h +++ b/fs/xfs/kmem.h @@ -50,7 +50,7 @@ kmem_flags_convert(xfs_km_flags_t flags) lflags = GFP_ATOMIC | __GFP_NOWARN; } else { lflags = GFP_KERNEL | __GFP_NOWARN; - if ((current->flags & PF_FSTRANS) || (flags & KM_NOFS)) + if ((current->flags & PF_MEMALLOC_NOFS) || (flags & KM_NOFS)) lflags &= ~__GFP_FS; } diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index a0eb18ce3ad3..326566f4a131 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -2540,7 +2540,7 @@ xfs_btree_split_worker( struct xfs_btree_split_args *args = container_of(work, struct xfs_btree_split_args, work); unsigned long pflags; - unsigned long new_pflags = PF_FSTRANS; + unsigned long new_pflags = PF_MEMALLOC_NOFS; /* * we are in a transaction context here, but may also be doing work diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index d12dfcfd0cc8..6d816ff0b763 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -124,7 +124,7 @@ xfs_setfilesize_trans_alloc( * We hand off the transaction to the completion thread now, so * clear the flag here. */ - current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); + current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS); return 0; } @@ -169,7 +169,7 @@ xfs_setfilesize_ioend( * thus we need to mark ourselves as being in a transaction manually. * Similarly for freeze protection. */ - current_set_flags_nested(&tp->t_pflags, PF_FSTRANS); + current_set_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS); __sb_writers_acquired(VFS_I(ip)->i_sb, SB_FREEZE_FS); /* we abort the update if there was an IO error */ @@ -979,7 +979,7 @@ xfs_vm_writepage( * Given that we do not allow direct reclaim to call us, we should * never be called while in a filesystem transaction. */ - if (WARN_ON_ONCE(current->flags & PF_FSTRANS)) + if (WARN_ON_ONCE(current->flags & PF_MEMALLOC_NOFS)) goto redirty; /* Is this page beyond the end of the file? */ diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 748b16aff45a..1d247366c733 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -176,7 +176,7 @@ xfs_trans_reserve( 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); + current_set_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS); /* * Attempt to reserve the needed disk blocks by decrementing @@ -186,7 +186,7 @@ xfs_trans_reserve( if (blocks > 0) { error = xfs_mod_fdblocks(tp->t_mountp, -((int64_t)blocks), rsvd); if (error != 0) { - current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); + current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS); return -ENOSPC; } tp->t_blk_res += blocks; @@ -263,7 +263,7 @@ xfs_trans_reserve( tp->t_blk_res = 0; } - current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); + current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS); return error; } @@ -921,7 +921,7 @@ __xfs_trans_commit( xfs_log_commit_cil(mp, tp, &commit_lsn, regrant); - current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); + current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS); xfs_trans_free(tp); /* @@ -951,7 +951,7 @@ __xfs_trans_commit( if (commit_lsn == -1 && !error) error = -EIO; } - current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); + current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS); xfs_trans_free_items(tp, NULLCOMMITLSN, !!error); xfs_trans_free(tp); @@ -1005,7 +1005,7 @@ xfs_trans_cancel( xfs_log_done(mp, tp->t_ticket, NULL, false); /* mark this thread as no longer being in a transaction */ - current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); + current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS); xfs_trans_free_items(tp, NULLCOMMITLSN, dirty); xfs_trans_free(tp); diff --git a/include/linux/sched.h b/include/linux/sched.h index acfc32b30704..820db8f98bfc 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -2115,6 +2115,8 @@ extern void thread_group_cputime_adjusted(struct task_struct *p, cputime_t *ut, #define PF_FREEZER_SKIP 0x40000000 /* Freezer should not count it as freezable */ #define PF_SUSPEND_TASK 0x80000000 /* this thread called freeze_processes and should not be frozen */ +#define PF_MEMALLOC_NOFS PF_FSTRANS /* Transition to a more generic GFP_NOFS scope semantic */ + /* * Only the _current_ task can read/write to tsk->flags, but other * tasks can access tsk->flags in readonly mode for example -- 2.8.0.rc3 From fansmerik@yahoo.com Wed Apr 27 06:58:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.4 required=5.0 tests=FORGED_YAHOO_RCVD, FREEMAIL_FROM autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A619A7D1D for ; Wed, 27 Apr 2016 06:58:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6BE008F804B for ; Wed, 27 Apr 2016 04:58:23 -0700 (PDT) X-ASG-Debug-ID: 1461758297-04bdf0358f27a6c0002-NocioJ Received: from guangzhou.susubest.cn (guangzhou.susubest.cn [185.22.173.57]) by cuda.sgi.com with ESMTP id 7vh7r7HHxQYNnF2F for ; Wed, 27 Apr 2016 04:58:21 -0700 (PDT) X-Barracuda-Envelope-From: fansmerik@yahoo.com X-Barracuda-Effective-Source-IP: guangzhou.susubest.cn[185.22.173.57] X-Barracuda-Apparent-Source-IP: 185.22.173.57 To: xfs@oss.sgi.com Subject: Custom Shaped USB drives with your logo Message-ID: <71fc4734a3fe5a504370f17981bee404@drsfostersmith.com> X-ASG-Orig-Subj: Custom Shaped USB drives with your logo Date: Wed, 27 Apr 2016 12:42:16 +0200 From: "Stacy Kingley" Reply-To: kinmass@aliyun.com MIME-Version: 1.0 X-Mailer-LID: 46 X-Mailer-RecptId: 28011433 X-Mailer-SID: 2279 X-Mailer-Sent-By: 1 Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: guangzhou.susubest.cn[185.22.173.57] X-Barracuda-Start-Time: 1461758300 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1313 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.41 X-Barracuda-Spam-Status: No, SCORE=1.41 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=FORGED_YAHOO_RCVD, FORGED_YAHOO_RCVD_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29098 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 FORGED_YAHOO_RCVD 'From' yahoo.com does not match 'Received' headers 1.41 FORGED_YAHOO_RCVD_2 'From' yahoo.com does not match 'Received' headers Hi, I wanted to follow up from last week. I have been trying to reach you about an email I had sent about a week ago. I would like to contact the person that does your buying of branded promotional products for your company? Our company manufactures USB Flash Drives that are custom printed with your logo. They make the perfect marketing tool for your business or organization. We offer low minimum quantities, and all memory sizes. Over 150 Stock Models as well as 100 % custom shaped USB drives. We are always running a promotion, just ask! 1-844-294-4941 We can pre-load your media files, images, presentations and files onto the drives for you. These are ideal handouts for trade shows, branding, corporate gifts and employees. Our USB Pricing is at an ALL TIME LOW - now is the time to get your USB drives. Let us send you a quote! We will EARN your business! * Please reply back and let me know what quantity and memory size you need for a Fast Quote! * Are you a school or nonprofit? Please let us know for even further discounts. Looking for other items with your logo? Let us know, we supply everything from T-shirts to coffee Mugs! Thanks! Stacy Kingley National Account Rep Promo / Branded Flash Drives 1-844-294-4941 Email: hungier@sina.com From Benjamin.Wirth@winmagic.com Wed Apr 27 07:54:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B8BA07D21 for ; Wed, 27 Apr 2016 07:54:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8F103304039 for ; Wed, 27 Apr 2016 05:54:30 -0700 (PDT) X-ASG-Debug-ID: 1461761668-04cb6c09a22a17b0001-NocioJ Received: from mail1.bemta8.messagelabs.com (mail1.bemta8.messagelabs.com [216.82.243.197]) by cuda.sgi.com with ESMTP id od3NQ4ExYRGAm5ER for ; Wed, 27 Apr 2016 05:54:28 -0700 (PDT) X-Barracuda-Envelope-From: Benjamin.Wirth@winmagic.com X-Barracuda-Effective-Source-IP: mail1.bemta8.messagelabs.com[216.82.243.197] X-Barracuda-Apparent-Source-IP: 216.82.243.197 Received: from [216.82.242.179] by server-5.bemta-8.messagelabs.com id 2E/8D-24561-486B0275; Wed, 27 Apr 2016 12:54:28 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFupjleJIrShJLcpLzFFi42LJUOG8pNuyTSH cYI2fxZZj9xgtFvXdYnRg8ji1SMJj9YWtjAFMUayZeUn5FQmsGRMv72EtuMRZMe/wd7YGxl/s XYxcHEIC0xkl3k1tYO1i5ARyjjNK3D7PB2KzCRhJtBw6zw5iiwioSUyatIMZxGYWUJeYMHULC 4gtLGAnsefRYlaIGnuJ97tnAsU5gGwriRlf3UFMFgFViaNdWiAVvAJBEi0/z7FDbCqROHTvDS NICaeArsSNi6YgYUYBMYnvp9YwQSwSl7j1ZD6YLSEgILFkz3lmCFtU4uXjf6wgrRICchLTtql DlOtILNj9iQ3C1pZYtvA1M8RWQYmTM5+wQGzVkFi35RArxJhgibsXZrNMYBSbhWTbLCSjZiEZ NQvJqAWMLKsYNYpTi8pSi3QNDfWSijLTM0pyEzNzdA0NLPRyU4uLE9NTcxKTivWS83M3MQLji QEIdjDOmOV8iFGSg0lJlJdzhUK4EF9SfkplRmJxRnxRaU5q8SFGGQ4OJQne+K1AOcGi1PTUir TMHGBkw6QlOHiURHhfbAFK8xYXJOYWZ6ZDpE4xKkqJ86aB9AmAJDJK8+DaYMnkEqOslDAvI9A hQjwFqUW5mSWo8q8YxTkYlYR580Gm8GTmlcBNfwW0mAlo8eVDsiCLSxIRUlINjMm//v/4u11M y25y4KlVjG9Xn5tcsbRZUlLcaWp6it3xztbXj9bXSRSvVF41rfpv5qct1u6qiq38C8U33c95r /+2uLdtj4FZPPez2s3LPGTnHbObtaRaZ5+u2sYA56Z/1WxfF3wpqslJDgpuvKs6K4yxu+Bh0P 4sXoOo4u+PBBl4Y/sCrVgjlFiKMxINtZiLihMBCHhrgCEDAAA= X-Env-Sender: Benjamin.Wirth@winmagic.com X-Msg-Ref: server-10.tower-86.messagelabs.com!1461761667!29124063!1 X-Originating-IP: [104.36.9.210] X-StarScan-Received: X-StarScan-Version: 8.28; banners=-,-,- X-VirusChecked: Checked Received: (qmail 8587 invoked from network); 27 Apr 2016 12:54:27 -0000 Received: from 104-36-9-210.dedicated.allstream.net (HELO mail.winmagic.com) (104.36.9.210) by server-10.tower-86.messagelabs.com with SMTP; 27 Apr 2016 12:54:27 -0000 Received: from WMSEXCHSVR02.winmagic.local ([10.10.2.28]) by mail.winmagic.com with Microsoft SMTPSVC(6.0.3790.4675); Wed, 27 Apr 2016 08:54:27 -0400 Received: from WMSEXCHSVR01.winmagic.local ([fe80::e48c:f8da:c401:64eb]) by wmsexchsvr02.winmagic.local ([fe80::dc94:79fd:690a:f31d%16]) with mapi id 14.03.0266.001; Wed, 27 Apr 2016 08:54:27 -0400 From: Benjamin Wirth To: Dave Chinner CC: "xfs@oss.sgi.com" Subject: RE: development APIs for used/free blocks information Thread-Topic: development APIs for used/free blocks information X-ASG-Orig-Subj: RE: development APIs for used/free blocks information Thread-Index: AdGf/VxhHvG/iQ6eTkuDbtQDeeIgSAALiVKAABWxo1A= Date: Wed, 27 Apr 2016 12:54:24 +0000 Message-ID: <97A4F433DEE099488FE21C1718A641D2139E972E@wmsexchsvr01.winmagic.local> References: <97A4F433DEE099488FE21C1718A641D2139E86F5@wmsexchsvr01.winmagic.local> <20160426222129.GD26977@dastard> In-Reply-To: <20160426222129.GD26977@dastard> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.11.3.80] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginalArrivalTime: 27 Apr 2016 12:54:27.0898 (UTC) FILETIME=[EEDB89A0:01D1A083] X-Barracuda-Connect: mail1.bemta8.messagelabs.com[216.82.243.197] X-Barracuda-Start-Time: 1461761668 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1246 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.62 X-Barracuda-Spam-Status: No, SCORE=0.62 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29099 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hello Dave, Thanks for your response. And I apologize, reading back my email I wasn't clear about what I was look= ing for. I want to be able to query which blocks are free or used, not just the coun= ts. In EXT I was able to use ext2fs_test_block_bitmap() for that. XFS has a= BTree with the free extents ordered by block number which I was hoping to = be able to access from user-space, but couldn't find any APIs for it (or th= e headers containing the structure definitions) in the xfsprogs-devel packa= ge. Am I trying to do something impossible here? Thanks, Ben -----Original Message----- From: Dave Chinner [mailto:david@fromorbit.com]=20 Sent: Tuesday, April 26, 2016 6:21 PM To: Benjamin Wirth Cc: xfs@oss.sgi.com Subject: Re: development APIs for used/free blocks information On Tue, Apr 26, 2016 at 08:51:10PM +0000, Benjamin Wirth wrote: > Hello, >=20 > I was looking for development APIs for XFS. The contents of=20 > xfsprogs-devel seem to only contain a few IOCTL commands, mostly=20 > file/inode based operations. >=20 > I need to query free/used blocks of an entire XFS filesystem and was=20 > hoping to find some user-space APIs for this. $ man 2 statvfs Cheers, Dave. -- Dave Chinner david@fromorbit.com From mstsxfx@gmail.com Wed Apr 27 08:07:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A35487D23 for ; Wed, 27 Apr 2016 08:07:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 28013AC002 for ; Wed, 27 Apr 2016 06:07:18 -0700 (PDT) X-ASG-Debug-ID: 1461762434-04bdf0359027dd90001-NocioJ Received: from mail-wm0-f67.google.com (mail-wm0-f67.google.com [74.125.82.67]) by cuda.sgi.com with ESMTP id xNE8UN4NR9p3Tc3m (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 27 Apr 2016 06:07:15 -0700 (PDT) X-Barracuda-Envelope-From: mstsxfx@gmail.com X-Barracuda-Effective-Source-IP: mail-wm0-f67.google.com[74.125.82.67] X-Barracuda-Apparent-Source-IP: 74.125.82.67 Received: by mail-wm0-f67.google.com with SMTP id n129so3560011wmn.1 for ; Wed, 27 Apr 2016 06:07:15 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=MtsWwNDmFHS3RKw6J6Gids5z0B/N+nxM0Z37vKYs2/s=; b=Mu6t7M1ZonMr+fPHczTal5H4gpVwGXmCe2uhCClmN0/ctn9ElZDB+kXNN2WFeZn0hY D1ZxrEpM0/Q+YVQ0wF8wKUxYIHQk32jefpFARVDH351ZJVgQU6manzoE9zCFzBSwNh4d eQMW55k09vrr8sphuQXGrycQi9GAV7aS+0HndJwBs2JqwHA33WK8HM3UdjCGSP8SNpln E16yyXxUDWvmuIBGjkgl9mmlW/55X9m4KlCP8je8qdaEXqkzay+FvNEPQgz8vnFGZgWH bYdMQgar3rZ45rkKS+PB4Ly3GKTjFpIYAlqQ4fezoTwOSuAZkhLIZFp2gtAR9TXjsJIU LOLA== X-Gm-Message-State: AOPr4FXzaUQeE74pVtylZD1aNk7/8iEoRZ+SZ+av5k4QlfcKT5IF87KYnnQS8mrWCxr4BA== X-Received: by 10.28.17.211 with SMTP id 202mr9402243wmr.11.1461762434260; Wed, 27 Apr 2016 06:07:14 -0700 (PDT) Received: from localhost (nat1.scz.suse.com. [213.151.88.250]) by smtp.gmail.com with ESMTPSA id s10sm4048031wjp.3.2016.04.27.06.07.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 27 Apr 2016 06:07:13 -0700 (PDT) Date: Wed, 27 Apr 2016 15:07:12 +0200 From: Michal Hocko To: linux-mm@kvack.org, linux-fsdevel@vger.kernel.org Cc: Andrew Morton , Dave Chinner , Theodore Ts'o , Chris Mason , Jan Kara , ceph-devel@vger.kernel.org, cluster-devel@redhat.com, linux-nfs@vger.kernel.org, logfs@logfs.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-mtd@lists.infradead.org, reiserfs-devel@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-f2fs-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, LKML Subject: Re: [PATCH 1.2/2] mm: introduce memalloc_nofs_{save,restore} API Message-ID: <20160427130712.GK2179@dhcp22.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 1.2/2] mm: introduce memalloc_nofs_{save,restore} API References: <1461671772-1269-2-git-send-email-mhocko@kernel.org> <1461758075-21815-1-git-send-email-mhocko@kernel.org> <1461758075-21815-2-git-send-email-mhocko@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1461758075-21815-2-git-send-email-mhocko@kernel.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: mail-wm0-f67.google.com[74.125.82.67] X-Barracuda-Start-Time: 1461762435 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 699 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29099 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed 27-04-16 13:54:35, Michal Hocko wrote: > From: Michal Hocko > Ups missed Dave's note about: > GFP_NOFS context is used for the following 4 reasons currently > - to prevent from deadlocks when the lock held by the allocation > context would be needed during the memory reclaim > - to prevent from stack overflows during the reclaim because > the allocation is performed from a deep context already > - to prevent lockups when the allocation context depends on > other reclaimers to make a forward progress indirectly > - just in case because this would be safe from the fs POV - silence lockdep false positives -- Michal Hocko SUSE Labs From adilger@dilger.ca Wed Apr 27 12:42:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5EDB67D25 for ; Wed, 27 Apr 2016 12:42:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 97BE0AC002 for ; Wed, 27 Apr 2016 10:42:08 -0700 (PDT) X-ASG-Debug-ID: 1461778923-04cb6c09a12b7850001-NocioJ Received: from mail-ig0-f196.google.com (mail-ig0-f196.google.com [209.85.213.196]) by cuda.sgi.com with ESMTP id wCVUy6GTH9RKSnnL (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 27 Apr 2016 10:42:04 -0700 (PDT) X-Barracuda-Envelope-From: adilger@dilger.ca X-Barracuda-Effective-Source-IP: mail-ig0-f196.google.com[209.85.213.196] X-Barracuda-Apparent-Source-IP: 209.85.213.196 Received: by mail-ig0-f196.google.com with SMTP id fn8so8077982igb.2 for ; Wed, 27 Apr 2016 10:42:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dilger-ca.20150623.gappssmtp.com; s=20150623; h=subject:mime-version:from:in-reply-to:date:cc:message-id:references :to; bh=z7l9OBGTJAI3zxpjgz2VsvApA862Wo0Osf/e3iP2gxE=; b=D1E42fOKUDma0U70bwbtYhAwo2ze1qWlbcTFE/t2CNaM8zKUDnq0YinSzNL1a3Vk5G iH1eKdjDOicf9o1/JYDxgvadOdrihvGI86lJKj/OwCA+ha5tDJhCHWmJpdYHAcKNxLLZ y0SB2pSSxCZTQEXiqT1RNJzRiL2GaYn4kheJgSc6CD5q9LDXl95Y85I40k7hrgi3ePi6 Pp347nIbTprGA8+MVasSFk9o2enIaaE98277wCc5p7UjgtYi4ejaj4cPPrw74w8eC2n1 Fp9g6RssWgyvDF2dOnKtvh+kqax2FBxeHR8J3ZbsVwyT2bSVjF91y2QtlsrIvF9gnx2q TV3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:mime-version:from:in-reply-to:date:cc :message-id:references:to; bh=z7l9OBGTJAI3zxpjgz2VsvApA862Wo0Osf/e3iP2gxE=; b=jPRejOtkkp1NP0LEssxL3qt5MGmwWa9YDOhhIvj5/iZlNCq1BJu6JpJGih5vRIepBG odMUmcRl8HDt6gTVjPx8X8XvNX1a2n3y4TcJIzpQIHtqOmgYPGrmFdAyo3JsMbeThGXj rAgn0AICUUWwucuA5Q2BXMA8zipH6pK/tr5rkYw45HsP8hnTyP5WdUAxynszP9kDziBf hIW4tE0QPfIcry4/k8ZhsuihX9qM2BZshEL61G/g2jSHbT3tv8hs1Y+QmncLyzhdTslz ebtJiIHMsxwHvUTX9cYJxA+uUJfdLQnJ1TWKYqR8UHLS6xoXhu6A9xVvapO55xROXYG/ VDkg== X-Gm-Message-State: AOPr4FXUOwS9x78mfkn/WsSXkyt78GqLYeGflk4JmKS9tpxWlotwpNRNCVAteGqJBcCu3A== X-Received: by 10.50.73.169 with SMTP id m9mr25525899igv.11.1461778923459; Wed, 27 Apr 2016 10:42:03 -0700 (PDT) Received: from cabot-wlan.adilger.int (S0106002191d9348b.cg.shawcable.net. [68.147.249.135]) by smtp.gmail.com with ESMTPSA id in6sm15080190igb.0.2016.04.27.10.41.56 (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 27 Apr 2016 10:42:02 -0700 (PDT) Subject: Re: [PATCH 1.1/2] xfs: abstract PF_FSTRANS to PF_MEMALLOC_NOFS Mime-Version: 1.0 (Mac OS X Mail 9.3 \(3124\)) X-ASG-Orig-Subj: Re: [PATCH 1.1/2] xfs: abstract PF_FSTRANS to PF_MEMALLOC_NOFS Content-Type: multipart/signed; boundary="Apple-Mail=_E2A13889-F5F8-484A-9C14-046AD6B7906F"; protocol="application/pgp-signature"; micalg=pgp-sha256 X-Pgp-Agent: GPGMail 2.6b2 From: Andreas Dilger In-Reply-To: <1461758075-21815-1-git-send-email-mhocko@kernel.org> Date: Wed, 27 Apr 2016 11:41:51 -0600 Cc: Linux MM , linux-fsdevel , Andrew Morton , Dave Chinner , Theodore Ts'o , Chris Mason , Jan Kara , ceph-devel@vger.kernel.org, cluster-devel , Linux NFS Mailing List , logfs@logfs.org, XFS Developers , linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-mtd@lists.infradead.org, reiserfs-devel@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-f2fs-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, LKML , Michal Hocko Message-Id: <04798BA8-2157-4611-B4EA-B8BCBA88AEC3@dilger.ca> References: <1461671772-1269-2-git-send-email-mhocko@kernel.org> <1461758075-21815-1-git-send-email-mhocko@kernel.org> To: Michal Hocko X-Mailer: Apple Mail (2.3124) X-Barracuda-Connect: mail-ig0-f196.google.com[209.85.213.196] X-Barracuda-Start-Time: 1461778923 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7748 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29105 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature --Apple-Mail=_E2A13889-F5F8-484A-9C14-046AD6B7906F Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii On Apr 27, 2016, at 5:54 AM, Michal Hocko wrote: >=20 > From: Michal Hocko >=20 > xfs has defined PF_FSTRANS to declare a scope GFP_NOFS semantic quite > some time ago. We would like to make this concept more generic and use > it for other filesystems as well. Let's start by giving the flag a > more genric name PF_MEMALLOC_NOFS which is in line with an exiting > PF_MEMALLOC_NOIO already used for the same purpose for GFP_NOIO > contexts. Replace all PF_FSTRANS usage from the xfs code in the first > step before we introduce a full API for it as xfs uses the flag = directly > anyway. >=20 > This patch doesn't introduce any functional change. >=20 > Signed-off-by: Michal Hocko > --- > Hi, > as suggested by Dave, I have split up [1] into two parts. The first = one > addes a new PF flag which is just an alias to the existing PF_FSTRANS > and does all the renaming and the second one to introduce the generic > API which only changes the bare minimum in the xfs proper. >=20 > fs/xfs/kmem.c | 4 ++-- > fs/xfs/kmem.h | 2 +- > fs/xfs/libxfs/xfs_btree.c | 2 +- > fs/xfs/xfs_aops.c | 6 +++--- > fs/xfs/xfs_trans.c | 12 ++++++------ > include/linux/sched.h | 2 ++ > 6 files changed, 15 insertions(+), 13 deletions(-) >=20 > diff --git a/fs/xfs/kmem.c b/fs/xfs/kmem.c > index 686ba6fb20dd..73f6ab59c664 100644 > --- a/fs/xfs/kmem.c > +++ b/fs/xfs/kmem.c > @@ -80,13 +80,13 @@ kmem_zalloc_large(size_t size, xfs_km_flags_t = flags) > * context via PF_MEMALLOC_NOIO to prevent memory reclaim = re-entering > * the filesystem here and potentially deadlocking. > */ > - if ((current->flags & PF_FSTRANS) || (flags & KM_NOFS)) > + if ((current->flags & PF_MEMALLOC_NOFS) || (flags & KM_NOFS)) > noio_flag =3D memalloc_noio_save(); >=20 > lflags =3D kmem_flags_convert(flags); > ptr =3D __vmalloc(size, lflags | __GFP_HIGHMEM | __GFP_ZERO, = PAGE_KERNEL); >=20 > - if ((current->flags & PF_FSTRANS) || (flags & KM_NOFS)) > + if ((current->flags & PF_MEMALLOC_NOFS) || (flags & KM_NOFS)) > memalloc_noio_restore(noio_flag); Not really the fault of this patch, but it brings this nasty bit of code = into the light. Is all of this machinery still needed given that __vmalloc() = can accept GFP flags? If yes, wouldn't it be better to fix __vmalloc() to = honor the GFP flags instead of working around it in the filesystem code? Cheers, Andreas > return ptr; > diff --git a/fs/xfs/kmem.h b/fs/xfs/kmem.h > index d1c66e465ca5..0d83f332e5c2 100644 > --- a/fs/xfs/kmem.h > +++ b/fs/xfs/kmem.h > @@ -50,7 +50,7 @@ kmem_flags_convert(xfs_km_flags_t flags) > lflags =3D GFP_ATOMIC | __GFP_NOWARN; > } else { > lflags =3D GFP_KERNEL | __GFP_NOWARN; > - if ((current->flags & PF_FSTRANS) || (flags & KM_NOFS)) > + if ((current->flags & PF_MEMALLOC_NOFS) || (flags & = KM_NOFS)) > lflags &=3D ~__GFP_FS; > } >=20 > diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c > index a0eb18ce3ad3..326566f4a131 100644 > --- a/fs/xfs/libxfs/xfs_btree.c > +++ b/fs/xfs/libxfs/xfs_btree.c > @@ -2540,7 +2540,7 @@ xfs_btree_split_worker( > struct xfs_btree_split_args *args =3D container_of(work, > struct = xfs_btree_split_args, work); > unsigned long pflags; > - unsigned long new_pflags =3D PF_FSTRANS; > + unsigned long new_pflags =3D PF_MEMALLOC_NOFS; >=20 > /* > * we are in a transaction context here, but may also be doing = work > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index d12dfcfd0cc8..6d816ff0b763 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -124,7 +124,7 @@ xfs_setfilesize_trans_alloc( > * We hand off the transaction to the completion thread now, so > * clear the flag here. > */ > - current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); > + current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS); > return 0; > } >=20 > @@ -169,7 +169,7 @@ xfs_setfilesize_ioend( > * thus we need to mark ourselves as being in a transaction = manually. > * Similarly for freeze protection. > */ > - current_set_flags_nested(&tp->t_pflags, PF_FSTRANS); > + current_set_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS); > __sb_writers_acquired(VFS_I(ip)->i_sb, SB_FREEZE_FS); >=20 > /* we abort the update if there was an IO error */ > @@ -979,7 +979,7 @@ xfs_vm_writepage( > * Given that we do not allow direct reclaim to call us, we = should > * never be called while in a filesystem transaction. > */ > - if (WARN_ON_ONCE(current->flags & PF_FSTRANS)) > + if (WARN_ON_ONCE(current->flags & PF_MEMALLOC_NOFS)) > goto redirty; >=20 > /* Is this page beyond the end of the file? */ > diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c > index 748b16aff45a..1d247366c733 100644 > --- a/fs/xfs/xfs_trans.c > +++ b/fs/xfs/xfs_trans.c > @@ -176,7 +176,7 @@ xfs_trans_reserve( > bool rsvd =3D (tp->t_flags & XFS_TRANS_RESERVE) !=3D = 0; >=20 > /* Mark this thread as being in a transaction */ > - current_set_flags_nested(&tp->t_pflags, PF_FSTRANS); > + current_set_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS); >=20 > /* > * Attempt to reserve the needed disk blocks by decrementing > @@ -186,7 +186,7 @@ xfs_trans_reserve( > if (blocks > 0) { > error =3D xfs_mod_fdblocks(tp->t_mountp, = -((int64_t)blocks), rsvd); > if (error !=3D 0) { > - current_restore_flags_nested(&tp->t_pflags, = PF_FSTRANS); > + current_restore_flags_nested(&tp->t_pflags, = PF_MEMALLOC_NOFS); > return -ENOSPC; > } > tp->t_blk_res +=3D blocks; > @@ -263,7 +263,7 @@ xfs_trans_reserve( > tp->t_blk_res =3D 0; > } >=20 > - current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); > + current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS); >=20 > return error; > } > @@ -921,7 +921,7 @@ __xfs_trans_commit( >=20 > xfs_log_commit_cil(mp, tp, &commit_lsn, regrant); >=20 > - current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); > + current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS); > xfs_trans_free(tp); >=20 > /* > @@ -951,7 +951,7 @@ __xfs_trans_commit( > if (commit_lsn =3D=3D -1 && !error) > error =3D -EIO; > } > - current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); > + current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS); > xfs_trans_free_items(tp, NULLCOMMITLSN, !!error); > xfs_trans_free(tp); >=20 > @@ -1005,7 +1005,7 @@ xfs_trans_cancel( > xfs_log_done(mp, tp->t_ticket, NULL, false); >=20 > /* mark this thread as no longer being in a transaction */ > - current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); > + current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS); >=20 > xfs_trans_free_items(tp, NULLCOMMITLSN, dirty); > xfs_trans_free(tp); > diff --git a/include/linux/sched.h b/include/linux/sched.h > index acfc32b30704..820db8f98bfc 100644 > --- a/include/linux/sched.h > +++ b/include/linux/sched.h > @@ -2115,6 +2115,8 @@ extern void thread_group_cputime_adjusted(struct = task_struct *p, cputime_t *ut, > #define PF_FREEZER_SKIP 0x40000000 /* Freezer should not = count it as freezable */ > #define PF_SUSPEND_TASK 0x80000000 /* this thread called = freeze_processes and should not be frozen */ >=20 > +#define PF_MEMALLOC_NOFS PF_FSTRANS /* Transition to a more generic = GFP_NOFS scope semantic */ > + > /* > * Only the _current_ task can read/write to tsk->flags, but other > * tasks can access tsk->flags in readonly mode for example > -- > 2.8.0.rc3 >=20 > -- > 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 Cheers, Andreas --Apple-Mail=_E2A13889-F5F8-484A-9C14-046AD6B7906F Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=signature.asc Content-Type: application/pgp-signature; name=signature.asc Content-Description: Message signed with OpenPGP using GPGMail -----BEGIN PGP SIGNATURE----- Comment: GPGTools - http://gpgtools.org iQIVAwUBVyD54HKl2rkXzB/gAQhFgA//ZYuehVpoM5drnP3bbKWtQjn+P6DN/JN+ Tm6ZVTirAPubH6MoXJ2+c7UHpnxzIRKlauzLQkZih1i3oYUyC58bNJuSeJNmffsY QVqB/INiLvJhfSwzzUzJEAZBrrrMp5laltsy4fgc13GqRoeT4wY3IoTb4ZofuC9G ij6BiTMALIp6IkhPNk/9Ru5jBqWbcVTMHngMfeYrWRuzKOM7QO58ceqCYM4xsz7n QuH/685BricBeQYPxQXaaAM0Gh6LAUd4ctzWFBpJavT+oaJoG7/JLSTUoLU/2W0b pGJHCCWpY59eUz1AT13PGTYcCxo6+ta+PRtWX8qEuME5vrsCkfYgUHjkislp3avM dahSdlxRLo5Ji4kxUiKS9RATKRfh1G7ucKsUC+PIeaXjfQEGXaihjFFHj0ioHVtl vqVlOmxSCSXhwHbvLiwehrb2njBhtfTplbQ1YL370/c00tezhDbDMrp4q1GmuCGJ 1ewQTTHhixNPogyV5ameP/4oq8CMCztnmGw65/54BCcORcOkgE4Vprwwvi+AOJP4 DG5SdP+Sj4DdcOHI2MtDjvna9vGLbiINSsu76YPgltbvnQMqp+CUyK9qBoBsXNUi Aco5N8PaQWzKloGPDOeVzHdMBononKFf+4wtbaQ0kEUkX0bXdvkSJqxlDsK/6wnE 05SCP6c8sd4= =dU5k -----END PGP SIGNATURE----- --Apple-Mail=_E2A13889-F5F8-484A-9C14-046AD6B7906F-- From dev@lynxeye.de Wed Apr 27 13:31:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F39BB7D27 for ; Wed, 27 Apr 2016 13:31:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9B7518F8033 for ; Wed, 27 Apr 2016 11:31:47 -0700 (PDT) X-ASG-Debug-ID: 1461781903-04bdf0358f296bb0001-NocioJ Received: from lynxeye.de (ns.lynxeye.de [87.118.118.114]) by cuda.sgi.com with ESMTP id HBZfxAfxn7QGSPKL for ; Wed, 27 Apr 2016 11:31:44 -0700 (PDT) X-Barracuda-Envelope-From: dev@lynxeye.de X-Barracuda-Effective-Source-IP: ns.lynxeye.de[87.118.118.114] X-Barracuda-Apparent-Source-IP: 87.118.118.114 Received: by lynxeye.de (Postfix, from userid 501) id C046926C2002; Wed, 27 Apr 2016 20:31:42 +0200 (CEST) Received: from tellur.fritz.box (p57B5ED0C.dip0.t-ipconnect.de [87.181.237.12]) by lynxeye.de (Postfix) with ESMTPSA id 2733526C2001; Wed, 27 Apr 2016 20:31:39 +0200 (CEST) Message-ID: <1461781898.2516.10.camel@lynxeye.de> Subject: Re: [PATCH] xfs: idle aild if the AIL is pushed up to the target LSN From: Lucas Stach X-ASG-Orig-Subj: Re: [PATCH] xfs: idle aild if the AIL is pushed up to the target LSN To: Dave Chinner Cc: Brian Foster , linux-kernel@vger.kernel.org, xfs@oss.sgi.com Date: Wed, 27 Apr 2016 20:31:38 +0200 In-Reply-To: <20160425230833.GC18496@dastard> References: <1461570163-4083-1-git-send-email-dev@lynxeye.de> <20160425142444.GC33882@bfoster.bfoster> <1461607897.2364.27.camel@lynxeye.de> <20160425230833.GC18496@dastard> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.18.5.2 (3.18.5.2-1.fc23) Mime-Version: 1.0 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: ns.lynxeye.de[87.118.118.114] X-Barracuda-Start-Time: 1461781903 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1948 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29107 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Am Dienstag, den 26.04.2016, 09:08 +1000 schrieb Dave Chinner: [...] > > > > > > > > That said, I'm not sure whether there's a notable benefit of > > > idling > > > for > > > 50ms over just scheduling out when we've hit the target lsn. It > > > seems > > > like that anybody who pushes the target forward again is going to > > > wake > > > up the thread anyways. On the other hand, if the fs is idle the > > > thread > > > will eventually schedule out indefinitely.  > > Is this a problem? The patch tries to do exactly that: schedule out > > aild indefinitely when there is no more work to do as nobody is > > pushing > > the target LSN forward. > If the filesystem is slowly being dirtied, then the aild should't > really idle at all.i > > Keep in mind that the xfsaild has multiple functions, one of which > is a watchdog that catches log space stalls that would otherwise > hang the filesystem. Every time we've removed the watchdog function > (i.e.  agressively idle the aild) we've had users report random, > unreproducable hangs/stalls that have gone away when the watchdog > function (i.e. don't idle until the log is covered and completely > idle) was re-instated... > I can only see xfsaild_push() doing any work after it has hit the target LSN if something moves the target LSN forward. You say that aggressively idling aild might produce log stalls, which would imply there are races in the code where a code path that moves the target LSN forward doesn't properly wake up aild. Wouldn't this problem also be present when doing non-aggressive idle of aild, just the probability of hitting the issue being reduced significantly? The commit that re-enabled non-aggressive aild idle especially mentions some races that have been fixed and I think those fixes should allow for agressive aild idle. If they are insufficient it wouldn't be safe to idle aild at all, right? Regards, Lucas From mstsxfx@gmail.com Wed Apr 27 14:43:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6983D7D29 for ; Wed, 27 Apr 2016 14:43:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3B47F304051 for ; Wed, 27 Apr 2016 12:43:52 -0700 (PDT) X-ASG-Debug-ID: 1461786229-04cb6c09a12c09b0001-NocioJ Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com [74.125.82.65]) by cuda.sgi.com with ESMTP id NCAXCvoWUtzPrJNH (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 27 Apr 2016 12:43:50 -0700 (PDT) X-Barracuda-Envelope-From: mstsxfx@gmail.com X-Barracuda-Effective-Source-IP: mail-wm0-f65.google.com[74.125.82.65] X-Barracuda-Apparent-Source-IP: 74.125.82.65 Received: by mail-wm0-f65.google.com with SMTP id e201so16108705wme.2 for ; Wed, 27 Apr 2016 12:43:50 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=hA2F3FOMRNJd4iHovvND7r7RgZBfIqdZXcZ3LyFI7bQ=; b=VfU3VZIINxHbxMrHiQegUCGWbAmduqwIbKZpxJA7CYnFBk15pOvu8uaFH69KLbNFsl SILtT6pPf/S6QejvK7llMhn9GLDbZcKOyGpLgkuxk0+g0es2iHFBxFgR+ydxQfO6u1hT vPBMxaKUAnvm2yzyfUoQ0H0+msDh7+Yhc7n0feEHkgzHPHh1Kfq8ACme9lwSQFFFdEET UuNTS11ws8sNsZNy0Zj4y51tAbtjwcPoSV8GBDIrSVTTiSQX7sQQfPOh7WkZRWosY13t Scs0Kt1UDoYs/z1sxHPrfDs3YjlRv7SfmiwcK7x3sIMwxTManR47lG107EyGLCSj4WBP RV3w== X-Gm-Message-State: AOPr4FWtN8i5i8HEJ20NPcvmKJ0XPwDLdRdf58ai3iWvxskyG79wiDWQSxb/EqyDOG/+hQ== X-Received: by 10.28.127.80 with SMTP id a77mr12122267wmd.66.1461786229068; Wed, 27 Apr 2016 12:43:49 -0700 (PDT) Received: from localhost (ip-86-49-65-8.net.upcbroadband.cz. [86.49.65.8]) by smtp.gmail.com with ESMTPSA id da5sm5657005wjb.25.2016.04.27.12.43.48 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 27 Apr 2016 12:43:48 -0700 (PDT) Date: Wed, 27 Apr 2016 21:43:47 +0200 From: Michal Hocko To: Andreas Dilger Cc: Linux MM , linux-fsdevel , Andrew Morton , Dave Chinner , Theodore Ts'o , Chris Mason , Jan Kara , ceph-devel@vger.kernel.org, cluster-devel , Linux NFS Mailing List , logfs@logfs.org, XFS Developers , linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-mtd@lists.infradead.org, reiserfs-devel@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-f2fs-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, LKML Subject: Re: [PATCH 1.1/2] xfs: abstract PF_FSTRANS to PF_MEMALLOC_NOFS Message-ID: <20160427194347.GA22544@dhcp22.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 1.1/2] xfs: abstract PF_FSTRANS to PF_MEMALLOC_NOFS References: <1461671772-1269-2-git-send-email-mhocko@kernel.org> <1461758075-21815-1-git-send-email-mhocko@kernel.org> <04798BA8-2157-4611-B4EA-B8BCBA88AEC3@dilger.ca> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <04798BA8-2157-4611-B4EA-B8BCBA88AEC3@dilger.ca> User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: mail-wm0-f65.google.com[74.125.82.65] X-Barracuda-Start-Time: 1461786230 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1608 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29108 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed 27-04-16 11:41:51, Andreas Dilger wrote: > On Apr 27, 2016, at 5:54 AM, Michal Hocko wrote: [...] > > --- a/fs/xfs/kmem.c > > +++ b/fs/xfs/kmem.c > > @@ -80,13 +80,13 @@ kmem_zalloc_large(size_t size, xfs_km_flags_t flags) > > * context via PF_MEMALLOC_NOIO to prevent memory reclaim re-entering > > * the filesystem here and potentially deadlocking. > > */ > > - if ((current->flags & PF_FSTRANS) || (flags & KM_NOFS)) > > + if ((current->flags & PF_MEMALLOC_NOFS) || (flags & KM_NOFS)) > > noio_flag = memalloc_noio_save(); > > > > lflags = kmem_flags_convert(flags); > > ptr = __vmalloc(size, lflags | __GFP_HIGHMEM | __GFP_ZERO, PAGE_KERNEL); > > > > - if ((current->flags & PF_FSTRANS) || (flags & KM_NOFS)) > > + if ((current->flags & PF_MEMALLOC_NOFS) || (flags & KM_NOFS)) > > memalloc_noio_restore(noio_flag); > > Not really the fault of this patch, but it brings this nasty bit of code into > the light. Is all of this machinery still needed given that __vmalloc() can > accept GFP flags? If yes, wouldn't it be better to fix __vmalloc() to honor > the GFP flags instead of working around it in the filesystem code? This is not that easy. __vmalloc can accept gfp flags but it doesn't honor __GFP_IO 100%. IIRC some paths like page table allocations are hardcoded GFP_KERNEL. Besides that I would like to have GFP_NOIO used via memalloc_noio_{save,restore} API as well for the similar reasons as GFP_NOFS - it is just easier to explain scope than particular code paths which might be shared. -- Michal Hocko SUSE Labs From mstsxfx@gmail.com Wed Apr 27 15:09:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4973C7D2B for ; Wed, 27 Apr 2016 15:09:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0E6BC8F8033 for ; Wed, 27 Apr 2016 13:09:36 -0700 (PDT) X-ASG-Debug-ID: 1461787770-04cbb00fe92980b0001-NocioJ Received: from mail-pa0-f66.google.com (mail-pa0-f66.google.com [209.85.220.66]) by cuda.sgi.com with ESMTP id MYbeSDQ1JnrkVErp (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 27 Apr 2016 13:09:31 -0700 (PDT) X-Barracuda-Envelope-From: mstsxfx@gmail.com X-Barracuda-Effective-Source-IP: mail-pa0-f66.google.com[209.85.220.66] X-Barracuda-Apparent-Source-IP: 209.85.220.66 Received: by mail-pa0-f66.google.com with SMTP id yl2so5931198pac.1 for ; Wed, 27 Apr 2016 13:09:31 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=oxKrb8t+BkDkC/+NOIoBYv9eVlVWTACZuJsdfW2tQhQ=; b=eCmW3HDimAo1Oi7znxWydB5eO7ofE6ZFdXpNt5Qzo4ZQOM6yaUsxTXRSgO0GSRB+cr +uUwIc1wFxLyfAwprlMunknHMe8s+KZ7HRlscxdCRpq3HQQWnQFhyxSwA0YD4NTigcRI 5404W3XCcKGGlWN0ZhglbfPfrF3qlxvGs6BRbH1ddQYfosYLnIZsRMsDSV7vGv/wjyjC 7CQ37As+8X8D/KkT14MNeCWdkBlCx5QONX+6doOG1xId4Ffy3ZTVLN6LAT0ASnbXpMRw tpZGL8jtNFcryhS/UF9eEc1ZcoPpyDeB2uOpBaM8d0l+KApqxLhT3LucIaPZ/TTREARJ J1Rg== X-Gm-Message-State: AOPr4FWs989WbtFE/6Oxj7hb/oinccBpjdmuniXll6YBAq6yzRjoc5VG6vVpAy1vkkpoRw== X-Received: by 10.66.162.101 with SMTP id xz5mr14768981pab.157.1461787770361; Wed, 27 Apr 2016 13:09:30 -0700 (PDT) Received: from localhost (ip-86-49-65-8.net.upcbroadband.cz. [86.49.65.8]) by smtp.gmail.com with ESMTPSA id m184sm8725581pfb.22.2016.04.27.13.09.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 27 Apr 2016 13:09:29 -0700 (PDT) Date: Wed, 27 Apr 2016 22:09:27 +0200 From: Michal Hocko To: Dave Chinner Cc: Andrew Morton , linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, Theodore Ts'o , Chris Mason , Jan Kara , ceph-devel@vger.kernel.org, cluster-devel@redhat.com, linux-nfs@vger.kernel.org, logfs@logfs.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-mtd@lists.infradead.org, reiserfs-devel@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-f2fs-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, LKML Subject: Re: [PATCH 1.2/2] mm: introduce memalloc_nofs_{save,restore} API Message-ID: <20160427200927.GC22544@dhcp22.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 1.2/2] mm: introduce memalloc_nofs_{save,restore} API References: <1461671772-1269-2-git-send-email-mhocko@kernel.org> <1461758075-21815-1-git-send-email-mhocko@kernel.org> <1461758075-21815-2-git-send-email-mhocko@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1461758075-21815-2-git-send-email-mhocko@kernel.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: mail-pa0-f66.google.com[209.85.220.66] X-Barracuda-Start-Time: 1461787771 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8104 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29109 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi Dave, On Wed 27-04-16 13:54:35, Michal Hocko wrote: [...] > diff --git a/fs/xfs/kmem.h b/fs/xfs/kmem.h > index 0d83f332e5c2..b35688a54c9a 100644 > --- a/fs/xfs/kmem.h > +++ b/fs/xfs/kmem.h > @@ -50,7 +50,7 @@ kmem_flags_convert(xfs_km_flags_t flags) > lflags = GFP_ATOMIC | __GFP_NOWARN; > } else { > lflags = GFP_KERNEL | __GFP_NOWARN; > - if ((current->flags & PF_MEMALLOC_NOFS) || (flags & KM_NOFS)) > + if (flags & KM_NOFS) > lflags &= ~__GFP_FS; > } > I was trying to reproduce the false positives you mentioned in other email by reverting b17cb364dbbb ("xfs: fix missing KM_NOFS tags to keep lockdep happy"). I could really hit the one below but then it turned out that it is this hunk above which causes the lockdep warning. Now I am trying to understand how is this possible as ~__GFP_FS happens at the page allocation level so we should never leak the __GFP_FS context when the PF flag is set. One possible explanation would be that some code path hands over to a kworker which then loses the PF flag but it would get a gfp_mask which would have the FS flag cleared with the original code. xfs_btree_split_worker is using PF_MEMALLOC_NOFS directly so it should be OK and xfs_reclaim_worker resp. xfs_eofblocks_worker use struct xfs_mount as a context which doesn't contain gfp_mask. The stack trace also doesn't indicate any kworker involvement. Do you have an idea what else might get wrong or what am I missing? --- [ 53.990821] ================================= [ 53.991672] [ INFO: inconsistent lock state ] [ 53.992419] 4.5.0-nofs5-00004-g35ad69a8eb83-dirty #902 Not tainted [ 53.993458] --------------------------------- [ 53.993480] inconsistent {RECLAIM_FS-ON-W} -> {IN-RECLAIM_FS-R} usage. [ 53.993480] kswapd0/467 [HC0[0]:SC0[0]:HE1:SE1] takes: [ 53.993480] (&xfs_nondir_ilock_class){+++++-}, at: [] xfs_ilock+0x18a/0x205 [xfs] [ 53.993480] {RECLAIM_FS-ON-W} state was registered at: [ 53.993480] [] mark_held_locks+0x5e/0x74 [ 53.993480] [] lockdep_trace_alloc+0xb2/0xb5 [ 53.993480] [] kmem_cache_alloc+0x36/0x2b0 [ 53.993480] [] kmem_zone_alloc+0x65/0xc1 [xfs] [ 54.003925] [] xfs_buf_item_init+0x40/0x147 [xfs] [ 54.003925] [] _xfs_trans_bjoin+0x23/0x53 [xfs] [ 54.003925] [] xfs_trans_read_buf_map+0x2e9/0x5b3 [xfs] [ 54.003925] [] xfs_read_agf+0x141/0x1d4 [xfs] [ 54.003925] [] xfs_alloc_read_agf+0x104/0x223 [xfs] [ 54.003925] [] xfs_alloc_pagf_init+0x1a/0x3a [xfs] [ 54.003925] [] xfs_bmap_longest_free_extent+0x4c/0x9c [xfs] [ 54.003925] [] xfs_bmap_btalloc_nullfb+0x7a/0xc6 [xfs] [ 54.003925] [] xfs_bmap_btalloc+0x21a/0x59d [xfs] [ 54.003925] [] xfs_bmap_alloc+0xe/0x10 [xfs] [ 54.003925] [] xfs_bmapi_write+0x401/0x80f [xfs] [ 54.003925] [] xfs_iomap_write_allocate+0x1bf/0x2b3 [xfs] [ 54.003925] [] xfs_map_blocks+0x141/0x3c9 [xfs] [ 54.003925] [] xfs_vm_writepage+0x3f6/0x612 [xfs] [ 54.003925] [] __writepage+0x16/0x34 [ 54.003925] [] write_cache_pages+0x35d/0x4b4 [ 54.003925] [] generic_writepages+0x50/0x6f [ 54.003925] [] xfs_vm_writepages+0x44/0x4c [xfs] [ 54.003925] [] do_writepages+0x23/0x2c [ 54.003925] [] __filemap_fdatawrite_range+0x84/0x8b [ 54.003925] [] filemap_write_and_wait_range+0x2d/0x5b [ 54.003925] [] xfs_file_fsync+0x113/0x29a [xfs] [ 54.003925] [] vfs_fsync_range+0x8c/0x9e [ 54.003925] [] vfs_fsync+0x1c/0x1e [ 54.003925] [] do_fsync+0x31/0x4a [ 54.003925] [] SyS_fsync+0x10/0x14 [ 54.003925] [] entry_SYSCALL_64_fastpath+0x12/0x6b [ 54.003925] irq event stamp: 2998549 [ 54.003925] hardirqs last enabled at (2998549): [] _raw_spin_unlock_irq+0x2c/0x4a [ 54.003925] hardirqs last disabled at (2998548): [] _raw_spin_lock_irq+0x13/0x47 [ 54.003925] softirqs last enabled at (2994888): [] __do_softirq+0x38f/0x4d5 [ 54.003925] softirqs last disabled at (2994867): [] irq_exit+0x6f/0xd1 [ 54.003925] [ 54.003925] other info that might help us debug this: [ 54.003925] Possible unsafe locking scenario: [ 54.003925] [ 54.003925] CPU0 [ 54.003925] ---- [ 54.003925] lock(&xfs_nondir_ilock_class); [ 54.003925] [ 54.003925] lock(&xfs_nondir_ilock_class); [ 54.003925] [ 54.003925] *** DEADLOCK *** [ 54.003925] [ 54.003925] 2 locks held by kswapd0/467: [ 54.003925] #0: (shrinker_rwsem){++++..}, at: [] shrink_slab+0x7a/0x518 [ 54.003925] #1: (&type->s_umount_key#25){.+.+..}, at: [] trylock_super+0x1b/0x4b [ 54.003925] [ 54.003925] stack backtrace: [ 54.003925] CPU: 0 PID: 467 Comm: kswapd0 Not tainted 4.5.0-nofs5-00004-g35ad69a8eb83-dirty #902 [ 54.003925] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Debian-1.8.2-1 04/01/2014 [ 54.003925] 0000000000000000 ffff8800065678b8 ffffffff81308ded ffffffff825caa70 [ 54.003925] ffff880007328000 ffff8800065678f0 ffffffff81121489 0000000000000009 [ 54.003925] ffff8800073288a0 ffff880007328000 ffffffff810936a7 0000000000000009 [ 54.003925] Call Trace: [ 54.003925] [] dump_stack+0x67/0x90 [ 54.003925] [] print_usage_bug.part.24+0x259/0x268 [ 54.003925] [] ? print_shortest_lock_dependencies+0x180/0x180 [ 54.003925] [] mark_lock+0x381/0x567 [ 54.003925] [] __lock_acquire+0x9f7/0x190c [ 54.003925] [] ? xfs_ilock+0x18a/0x205 [xfs] [ 54.003925] [] ? check_irq_usage+0x99/0xaa [ 54.003925] [] ? add_lock_to_list.isra.8.constprop.25+0x82/0x8d [ 54.003925] [] ? __lock_acquire+0x17a9/0x190c [ 54.003925] [] lock_acquire+0x139/0x1e1 [ 54.003925] [] ? lock_acquire+0x139/0x1e1 [ 54.003925] [] ? xfs_ilock+0x18a/0x205 [xfs] [ 54.003925] [] ? xfs_free_eofblocks+0x84/0x1ce [xfs] [ 54.003925] [] down_read_nested+0x29/0x3e [ 54.003925] [] ? xfs_ilock+0x18a/0x205 [xfs] [ 54.003925] [] xfs_ilock+0x18a/0x205 [xfs] [ 54.003925] [] xfs_free_eofblocks+0x84/0x1ce [xfs] [ 54.003925] [] ? trace_hardirqs_on_caller+0x16c/0x188 [ 54.003925] [] xfs_inactive+0x55/0xc6 [xfs] [ 54.003925] [] xfs_fs_evict_inode+0x14b/0x1bd [xfs] [ 54.003925] [] evict+0xb0/0x165 [ 54.003925] [] dispose_list+0x3c/0x4a [ 54.003925] [] prune_icache_sb+0x4a/0x55 [ 54.003925] [] super_cache_scan+0x12f/0x179 [ 54.003925] [] shrink_slab+0x2cb/0x518 [ 54.003925] [] shrink_zone+0x175/0x263 [ 54.003925] [] kswapd+0x7dc/0x948 [ 54.003925] [] ? mem_cgroup_shrink_node_zone+0x305/0x305 [ 54.003925] [] kthread+0xed/0xf5 [ 54.003925] [] ? _raw_spin_unlock_irq+0x2c/0x4a [ 54.003925] [] ? kthread_create_on_node+0x1bd/0x1bd [ 54.003925] [] ret_from_fork+0x3f/0x70 [ 54.003925] [] ? kthread_create_on_node+0x1bd/0x1bd -- Michal Hocko SUSE Labs From mstsxfx@gmail.com Wed Apr 27 15:30:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 762307CA3 for ; Wed, 27 Apr 2016 15:30:17 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 457DB30404E for ; Wed, 27 Apr 2016 13:30:17 -0700 (PDT) X-ASG-Debug-ID: 1461789014-04cbb00fea2992a0001-NocioJ Received: from mail-pa0-f65.google.com (mail-pa0-f65.google.com [209.85.220.65]) by cuda.sgi.com with ESMTP id DM2o0OUrByy5wRJ4 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 27 Apr 2016 13:30:15 -0700 (PDT) X-Barracuda-Envelope-From: mstsxfx@gmail.com X-Barracuda-Effective-Source-IP: mail-pa0-f65.google.com[209.85.220.65] X-Barracuda-Apparent-Source-IP: 209.85.220.65 Received: by mail-pa0-f65.google.com with SMTP id zy2so6974328pac.2 for ; Wed, 27 Apr 2016 13:30:15 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=8//dV5p2PIU9RpPS8Mx2Vfy1p4Fj7xfbfWiiZf7J6l8=; b=PPBXOcyrlqiu1jNDa7VlsiwgllqHVXvNFYpFY3Y6n8qT7hJJrhQfy2wKrndmZQ9dGe 8ParlDWBUcBlgj9qJ6VWzIORnrRXfx4iI7RRdnx+I9ZNdlWk9Dai8myBNGGeGuDONatt RBFZlFXTDrLP1pqqaexvUv9it8tvOGFRt6QE/m0aTzQTQgkS4ov7cPL8imzheqABjrHz bHN6NKfo/KVdNKU15N2bV+z78A0A6wUr8Tt1LiNvvgTR1FhyGalK4fnZm/aNFK4rBrwV CZnvDYMFFsmtX1C5fCC0KHQMtceptpui73Gfg4CmiZApyJJ5nVOddEjuHXkagK4BtTTP dfRQ== X-Gm-Message-State: AOPr4FUH60eCnS39SnDvY4hZVRg936e7Vy1omP5azT8cyPzwzGl2M//1gCDusQ+7Ln0j4A== X-Received: by 10.66.72.198 with SMTP id f6mr15187720pav.60.1461789014578; Wed, 27 Apr 2016 13:30:14 -0700 (PDT) Received: from localhost (ip-86-49-65-8.net.upcbroadband.cz. [86.49.65.8]) by smtp.gmail.com with ESMTPSA id u63sm8806435pfu.18.2016.04.27.13.30.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 27 Apr 2016 13:30:14 -0700 (PDT) Date: Wed, 27 Apr 2016 22:30:10 +0200 From: Michal Hocko To: Dave Chinner Cc: Andrew Morton , linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, Theodore Ts'o , Chris Mason , Jan Kara , ceph-devel@vger.kernel.org, cluster-devel@redhat.com, linux-nfs@vger.kernel.org, logfs@logfs.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-mtd@lists.infradead.org, reiserfs-devel@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-f2fs-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, LKML Subject: Re: [PATCH 1.2/2] mm: introduce memalloc_nofs_{save,restore} API Message-ID: <20160427203010.GD22544@dhcp22.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 1.2/2] mm: introduce memalloc_nofs_{save,restore} API References: <1461671772-1269-2-git-send-email-mhocko@kernel.org> <1461758075-21815-1-git-send-email-mhocko@kernel.org> <1461758075-21815-2-git-send-email-mhocko@kernel.org> <20160427200927.GC22544@dhcp22.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160427200927.GC22544@dhcp22.suse.cz> User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: mail-pa0-f65.google.com[209.85.220.65] X-Barracuda-Start-Time: 1461789015 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 613 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29109 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed 27-04-16 22:09:27, Michal Hocko wrote: [...] > [ 53.993480] [] mark_held_locks+0x5e/0x74 > [ 53.993480] [] lockdep_trace_alloc+0xb2/0xb5 > [ 53.993480] [] kmem_cache_alloc+0x36/0x2b0 Scratch that. I got it. It is the lockdep annotation which I got wrong with my patch. I thought this was done much later in the slow path. My head is burnt so I will get back to it tomorrow. The patch 1.1 should be OK to go for XFS though because it doesn't really introduce anything new. Sorry about the noise! -- Michal Hocko SUSE Labs From mstsxfx@gmail.com Wed Apr 27 16:14:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 591367D29 for ; Wed, 27 Apr 2016 16:14:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0D083304039 for ; Wed, 27 Apr 2016 14:14:20 -0700 (PDT) X-ASG-Debug-ID: 1461791656-04bdf0358f2a5180001-NocioJ Received: from mail-wm0-f66.google.com (mail-wm0-f66.google.com [74.125.82.66]) by cuda.sgi.com with ESMTP id 035KkpzS8nNeMkcp (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 27 Apr 2016 14:14:17 -0700 (PDT) X-Barracuda-Envelope-From: mstsxfx@gmail.com X-Barracuda-Effective-Source-IP: mail-wm0-f66.google.com[74.125.82.66] X-Barracuda-Apparent-Source-IP: 74.125.82.66 Received: by mail-wm0-f66.google.com with SMTP id n129so7523000wmn.1 for ; Wed, 27 Apr 2016 14:14:17 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=esI5GZ70FiiObl9/tQo9JA82Btp2VkXjuOrQW3uoQ/w=; b=UyH/wUwmqyH0Av3hXkeBp9IwVk2lSGMrtKsBmRR3wQaXCunjJWD6vgqOyqCUewhKeX k84GMMyuHZMPvL9657CcsNbeuBMz2I14uwKaoNF2JYE8+yofQSsaiSEWtLt92p1fwDsD AflIaGY1lo5/6Vo+Xlya+Lx36+JgucSDvssWmf3XLu7EHxpAqBXE4G5SnUTvUcmF3ud4 r7Wc9DQwGnJdRSHiUDk+Sk6xc6CvETOAdAdKqfqbllpLQBRRB89eCgJ3zfrpMrO9sEcx aIJmBdUJwBOQcbdXfmnZWNX8kbKYWw9/dsb80tEq5+f//gemjo5ziaoB/zwsGnm7HeCO idUg== X-Gm-Message-State: AOPr4FWhx7MTKWxWyAc+w1BjNMfcb0JAzRBT6G/yXXo+IaSp6pcX4XSfilFXMbmkFpITGA== X-Received: by 10.28.54.33 with SMTP id d33mr12739060wma.62.1461791655739; Wed, 27 Apr 2016 14:14:15 -0700 (PDT) Received: from localhost (ip-86-49-65-8.net.upcbroadband.cz. [86.49.65.8]) by smtp.gmail.com with ESMTPSA id ug8sm5959074wjc.42.2016.04.27.14.14.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 27 Apr 2016 14:14:15 -0700 (PDT) Date: Wed, 27 Apr 2016 23:14:14 +0200 From: Michal Hocko To: linux-mm@kvack.org, linux-fsdevel@vger.kernel.org Cc: Andrew Morton , Dave Chinner , Theodore Ts'o , Chris Mason , Jan Kara , ceph-devel@vger.kernel.org, cluster-devel@redhat.com, linux-nfs@vger.kernel.org, logfs@logfs.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-mtd@lists.infradead.org, reiserfs-devel@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-f2fs-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, LKML Subject: Re: [PATCH 1.2/2] mm: introduce memalloc_nofs_{save,restore} API Message-ID: <20160427211414.GA24919@dhcp22.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 1.2/2] mm: introduce memalloc_nofs_{save,restore} API References: <1461671772-1269-2-git-send-email-mhocko@kernel.org> <1461758075-21815-1-git-send-email-mhocko@kernel.org> <1461758075-21815-2-git-send-email-mhocko@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1461758075-21815-2-git-send-email-mhocko@kernel.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: mail-wm0-f66.google.com[74.125.82.66] X-Barracuda-Start-Time: 1461791656 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1322 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29110 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header OK, so the lockdep splats I was seeing [1] were much easier to fix than I originally thought. So the following should be folded into the original patch. I will send the full patch later on. [1] http://lkml.kernel.org/r/20160427200927.GC22544@dhcp22.suse.cz --- >From 1968c0a8ace4090a9deca8f4c1a206ee546e595a Mon Sep 17 00:00:00 2001 From: Michal Hocko Date: Wed, 27 Apr 2016 22:32:57 +0200 Subject: [PATCH] fold me "mm: introduce memalloc_nofs_{save,restore} API" Lockdep infrastructure is hooked into early hot paths of the allocator so __lockdep_trace_alloc has to check for PF_MEMALLOC_NOFS directly and do not rely on current_gfp_context Signed-off-by: Michal Hocko --- kernel/locking/lockdep.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c index 716547fdb873..f60124d0871c 100644 --- a/kernel/locking/lockdep.c +++ b/kernel/locking/lockdep.c @@ -2750,7 +2750,7 @@ static void __lockdep_trace_alloc(gfp_t gfp_mask, unsigned long flags) return; /* We're only interested __GFP_FS allocations for now */ - if (!(gfp_mask & __GFP_FS)) + if (!(gfp_mask & __GFP_FS) || (curr->flags & PF_MEMALLOC_NOFS)) return; /* -- 2.8.0.rc3 -- Michal Hocko SUSE Labs From david@fromorbit.com Wed Apr 27 17:30:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 762487D1F for ; Wed, 27 Apr 2016 17:30:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 36C958F8039 for ; Wed, 27 Apr 2016 15:30:00 -0700 (PDT) X-ASG-Debug-ID: 1461796192-04cb6c09a22cff00001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id cAK37qvg2ybAxhuW for ; Wed, 27 Apr 2016 15:29:53 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CVCgBSPCFXPMPVLHlegziBUIJzg3meZwEBAQEBAQaMFIVqhBOEf4EKBAICgTdNAQEBAQEBBwEBAQFCQIRBAQEBAwEyASMjBQsIAw4KCSUPBSUDBxoTiCIHwn4BAQEHAh4ZhUCFE4F4giGFegWTH4Rxjg2PG48wgmcbgV0qMId4gT4BAQE Received: from ppp121-44-213-195.lns20.syd7.internode.on.net (HELO dastard) ([121.44.213.195]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Apr 2016 07:59:51 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1avXxu-00050a-Gw; Thu, 28 Apr 2016 08:29:50 +1000 Date: Thu, 28 Apr 2016 08:29:50 +1000 From: Dave Chinner To: Lucas Stach Cc: Brian Foster , linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: idle aild if the AIL is pushed up to the target LSN Message-ID: <20160427222950.GI26977@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: idle aild if the AIL is pushed up to the target LSN References: <1461570163-4083-1-git-send-email-dev@lynxeye.de> <20160425142444.GC33882@bfoster.bfoster> <1461607897.2364.27.camel@lynxeye.de> <20160425230833.GC18496@dastard> <1461781898.2516.10.camel@lynxeye.de> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1461781898.2516.10.camel@lynxeye.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: 1461796193 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3225 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29112 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Apr 27, 2016 at 08:31:38PM +0200, Lucas Stach wrote: > Am Dienstag, den 26.04.2016, 09:08 +1000 schrieb Dave Chinner: > [...] > > > > > > > > > > > That said, I'm not sure whether there's a notable benefit of > > > > idling > > > > for > > > > 50ms over just scheduling out when we've hit the target lsn. It > > > > seems > > > > like that anybody who pushes the target forward again is going to > > > > wake > > > > up the thread anyways. On the other hand, if the fs is idle the > > > > thread > > > > will eventually schedule out indefinitely.  > > > Is this a problem? The patch tries to do exactly that: schedule out > > > aild indefinitely when there is no more work to do as nobody is > > > pushing > > > the target LSN forward. > > If the filesystem is slowly being dirtied, then the aild should't > > really idle at all.i > > > > Keep in mind that the xfsaild has multiple functions, one of which > > is a watchdog that catches log space stalls that would otherwise > > hang the filesystem. Every time we've removed the watchdog function > > (i.e.  agressively idle the aild) we've had users report random, > > unreproducable hangs/stalls that have gone away when the watchdog > > function (i.e. don't idle until the log is covered and completely > > idle) was re-instated... > > > I can only see xfsaild_push() doing any work after it has hit the > target LSN if something moves the target LSN forward. You say that > aggressively idling aild might produce log stalls, which would imply > there are races in the code where a code path that moves the target LSN > forward doesn't properly wake up aild. Well, yes. The code is horrifically complex, there's a heap of lockless operations along with cross-subsystem co-ordinated operations done under different locks amongst other things to provide scalability. History tells me that no matter whether we *think* we've got it right, there's always another bug lurking. > Wouldn't this problem also be present when doing non-aggressive idle of > aild, just the probability of hitting the issue being reduced > significantly? Welcome to Risk Management 101. I've got better things to do with my time than remove a safety net and the be forced to spend days or even weeks trying to solve all the subtle, deeply hidden problems that have been around for 20 years that are now exposed to users. That's not a productive use of the limited amount of XFS developer's time we have available. If you want to go ahead and do all this, I'll be happy to spend a year teaching you about how all the log space reservation code works... > The commit that re-enabled non-aggressive aild idle > especially mentions some races that have been fixed and I think those > fixes should allow for agressive aild idle. If they are insufficient it > wouldn't be safe to idle aild at all, right? No - the log state machine that covers (idles) the log is the one we really care about and it guarantees that the AIL is empty. i.e. The AIL has active items in it until the log is covered and hence, by definition, it can't be idle until the log is covered. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 27 17:55:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 441FF7D33 for ; Wed, 27 Apr 2016 17:55:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 09F5F304051 for ; Wed, 27 Apr 2016 15:55:20 -0700 (PDT) X-ASG-Debug-ID: 1461797717-04cb6c09a32d2680001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id cFoyFyicvwHPBMkI for ; Wed, 27 Apr 2016 15:55:17 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2D2DwBkQiFXPMPVLHlUAgiDOIFQgnODeZ5pAQEBAQEBBowUhWqEE4UDgQYCAgEBAoEzTQEBAQEBAQcBAQEBQkBBDgGDcQEBAQQ6HCMQCAMOBgEDCRoLDwUlAwcaEQKIKcJ6AQEBBwIBHRmFQIUTgSCCdQQChXgFmBCODY8bRY5rgmcbFoFHKgMthDWDQ4E+AQEB Received: from ppp121-44-213-195.lns20.syd7.internode.on.net (HELO dastard) ([121.44.213.195]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Apr 2016 08:25:15 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1avYMU-00055D-S5; Thu, 28 Apr 2016 08:55:14 +1000 Date: Thu, 28 Apr 2016 08:55:14 +1000 From: Dave Chinner To: Michal Hocko Cc: linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, Andrew Morton , Theodore Ts'o , Chris Mason , Jan Kara , ceph-devel@vger.kernel.org, cluster-devel@redhat.com, linux-nfs@vger.kernel.org, logfs@logfs.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-mtd@lists.infradead.org, reiserfs-devel@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-f2fs-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, LKML Subject: Re: [PATCH 2/2] mm, debug: report when GFP_NO{FS,IO} is used explicitly from memalloc_no{fs,io}_{save,restore} context Message-ID: <20160427225514.GJ26977@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] mm, debug: report when GFP_NO{FS,IO} is used explicitly from memalloc_no{fs,io}_{save,restore} context References: <1461671772-1269-1-git-send-email-mhocko@kernel.org> <1461671772-1269-3-git-send-email-mhocko@kernel.org> <20160426225845.GF26977@dastard> <20160427080311.GC2179@dhcp22.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160427080311.GC2179@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: 1461797717 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4263 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29114 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Apr 27, 2016 at 10:03:11AM +0200, Michal Hocko wrote: > On Wed 27-04-16 08:58:45, Dave Chinner wrote: > > On Tue, Apr 26, 2016 at 01:56:12PM +0200, Michal Hocko wrote: > > > From: Michal Hocko > > > > > > THIS PATCH IS FOR TESTING ONLY AND NOT MEANT TO HIT LINUS TREE > > > > > > It is desirable to reduce the direct GFP_NO{FS,IO} usage at minimum and > > > prefer scope usage defined by memalloc_no{fs,io}_{save,restore} API. > > > > > > Let's help this process and add a debugging tool to catch when an > > > explicit allocation request for GFP_NO{FS,IO} is done from the scope > > > context. The printed stacktrace should help to identify the caller > > > and evaluate whether it can be changed to use a wider context or whether > > > it is called from another potentially dangerous context which needs > > > a scope protection as well. > > > > You're going to get a large number of these from XFS. There are call > > paths in XFs that get called both inside and outside transaction > > context, and many of them are marked with GFP_NOFS to prevent issues > > that have cropped up in the past. > > > > Often these are to silence lockdep warnings (e.g. commit b17cb36 > > ("xfs: fix missing KM_NOFS tags to keep lockdep happy")) because > > lockdep gets very unhappy about the same functions being called with > > different reclaim contexts. e.g. directory block mapping might > > occur from readdir (no transaction context) or within transactions > > (create/unlink). hence paths like this are tagged with GFP_NOFS to > > stop lockdep emitting false positive warnings.... > > I would much rather see lockdep being fixed than abusing GFP_NOFS to > workaround its limitations. GFP_NOFS has a real consequences to the > memory reclaim. I will go and check the commit you mentioned and try > to understand why that is a problem. From what you described above > I would like to get rid of exactly this kind of usage which is not > really needed for the recursion protection. The problem is that every time we come across this, the answer is "use lockdep annotations". Our lockdep annotations are freakin' complex because of this, and more often than not lockdep false positives occur due to bugs in the annotations. e.g. see fs/xfs/xfs_inode.h for all the inode locking annotations we have to use and the hoops we have to jump through because we are limited to 8 subclasses and we have to be able to annotate nested inode locks 5 deep in places (RENAME_WHITEOUT, thanks). At one point, we had to reset lockdep classes for inodes in reclaim so that they didn't throw lockdep false positives the moment an inode was locked in a memory reclaim context. We had to change locking to remove that problem (commit 4f59af7 ("xfs: remove iolock lock classes"). Then there were all the problems with reclaim triggering lockdep warnings on directory inodes - we had to add a separate directory inode class for them, and even then we still need GFP_NOFS in places to minimise reclaim noise (as per the above commit). Put simply: we've had to resort to designing locking and allocation strategies around the limitations of lockdep annotations, as opposed to what is actually possible or even optimal. i.e. when the choice is a 2 minute fix to add GFP_NOFS in cases like this, versus another week long effort to rewrite the inode annotations (again) like this one last year: commit 0952c8183c1575a78dc416b5e168987ff98728bb Author: Dave Chinner Date: Wed Aug 19 10:32:49 2015 +1000 xfs: clean up inode lockdep annotations Lockdep annotations are a maintenance nightmare. Locking has to be modified to suit the limitations of the annotations, and we're always having to fix the annotations because they are unable to express the complexity of locking heirarchies correctly. ..... It's a no-brainer to see why GFP_NOFS will be added to the allocation in question. I've been saying for years that I consider lockdep harmful - if you want to get rid of GFP_NOFS, then you're going to need to sort out the lockdep reclaim annotation mess at the same time... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 27 18:41:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 337287D37 for ; Wed, 27 Apr 2016 18:41:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9C874AC001 for ; Wed, 27 Apr 2016 16:41:14 -0700 (PDT) X-ASG-Debug-ID: 1461800470-04cbb00fe72aaa40001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 6UsgTnhaVRva4gBo for ; Wed, 27 Apr 2016 16:41:10 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2D1OQDpTCFXMcPVLHlegzhTfYJzolkMAQEBAQEBBowViX0ihWcEAgKBNE0BAQEBAQEHAQEBAQFAAUBBAQEBAQEBAQcCAoNvAQEEOhwjEAgDGAklDwUlAwcaE4gpD8MKASkZhUCFE4JehzUFmBCFfIgRjxuPMIRfKjABhTyBAQhgghABAQE Received: from ppp121-44-213-195.lns20.syd7.internode.on.net (HELO dastard) ([121.44.213.195]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Apr 2016 09:11:09 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1avZ4u-00059M-Cj; Thu, 28 Apr 2016 09:41:08 +1000 Date: Thu, 28 Apr 2016 09:41:08 +1000 From: Dave Chinner To: Benjamin Wirth Cc: "xfs@oss.sgi.com" Subject: Re: development APIs for used/free blocks information Message-ID: <20160427234108.GK26977@dastard> X-ASG-Orig-Subj: Re: development APIs for used/free blocks information References: <97A4F433DEE099488FE21C1718A641D2139E86F5@wmsexchsvr01.winmagic.local> <20160426222129.GD26977@dastard> <97A4F433DEE099488FE21C1718A641D2139E972E@wmsexchsvr01.winmagic.local> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <97A4F433DEE099488FE21C1718A641D2139E972E@wmsexchsvr01.winmagic.local> 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: 1461800470 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 839 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29116 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Apr 27, 2016 at 12:54:24PM +0000, Benjamin Wirth wrote: > Hello Dave, > > Thanks for your response. > > And I apologize, reading back my email I wasn't clear about what I > was looking for. > > I want to be able to query which blocks are free or used, not just > the counts. In EXT I was able to use ext2fs_test_block_bitmap() > for that. XFS has a BTree with the free extents ordered by block > number which I was hoping to be able to access from user-space, > but couldn't find any APIs for it (or the headers containing the > structure definitions) in the xfsprogs-devel package. Am I trying > to do something impossible here? There are prototypes that need a bit of polishing to complete: http://oss.sgi.com/archives/xfs/2016-04/msg00633.html Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 27 18:53:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 70AA07D39 for ; Wed, 27 Apr 2016 18:53:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DC962AC002 for ; Wed, 27 Apr 2016 16:53:57 -0700 (PDT) X-ASG-Debug-ID: 1461801234-04cbb00fea2abf40001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id vkX89aoch03Yn8eE for ; Wed, 27 Apr 2016 16:53:55 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AmHABYUCFXMcPVLHlegziBUIJzg3mebQEBAQEBAQaMFYNRghmEE4YJBAICgTRNAQEBAQEBBwEBAQEBQAFAQQ4Bg3IBAQQ6HCMQCAMYCSUPBSUDBxoTiCnDJgEBCAIeGYVAhROKEwEEhWiSKItfgi6PG0WOa4MYgUcqMIU9g3kBAQE Received: from ppp121-44-213-195.lns20.syd7.internode.on.net (HELO dastard) ([121.44.213.195]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Apr 2016 09:23:16 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1avZGd-0005AE-Sy; Thu, 28 Apr 2016 09:53:15 +1000 Date: Thu, 28 Apr 2016 09:53:15 +1000 From: Dave Chinner To: Shyam Kaushik Cc: xfs@oss.sgi.com, Alex Lyakas Subject: Re: [PATCH] xfs_buf_iodone_callbacks to force shutdown & resubmit buf in case of permanent failure Message-ID: <20160427235315.GL26977@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs_buf_iodone_callbacks to force shutdown & resubmit buf in case of permanent failure References: <20160426224612.GE26977@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1461801234 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 692 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29117 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Apr 27, 2016 at 10:29:29AM +0530, Shyam Kaushik wrote: > Hi Dave, > > I am not sure how to do lock release in this code path. Is it possible > that you can take over this bug/patch? Thanks. To tell the truth, I haven't even thought about how to fix it yet. I suspect that the callbacks will need to be run, but with a new parameter passed to xfs_iflush_done to say "still dirty, unlock only" so that it simply unlocks and removes each object from the buffer callback list. I've got other things that need my attention right now (e.g agfl size problem), so it's going to be next week before I get to this... Cheers, Dave. -- Dave Chinner david@fromorbit.com From kyluciluzej@korea.com Thu Apr 28 01:37:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 A190A7D19 for ; Thu, 28 Apr 2016 01:37:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8E4F5AC001 for ; Wed, 27 Apr 2016 23:37:22 -0700 (PDT) X-ASG-Debug-ID: 1461825437-04cbb00fe72d0730001-NocioJ Received: from r-smtp6.korea.com (vmd526.contabo.host [193.164.133.121]) by cuda.sgi.com with ESMTP id QeJeWUW5DT7IFe5S for ; Wed, 27 Apr 2016 23:37:18 -0700 (PDT) X-Barracuda-Envelope-From: kyluciluzej@korea.com X-Barracuda-Effective-Source-IP: vmd526.contabo.host[193.164.133.121] X-Barracuda-Apparent-Source-IP: 193.164.133.121 Message-ID: <146666F03893D16621348ACE2779D0DF@ESWSDJMPTSP> From: "=?utf-8?B?0J7QsdGD0YfQtdC90LjQtSDQutCw0LTRgNC+0LLQuNC60L7Qsg==?=" To: Subject: =?utf-8?B?0KHQv9C10YbQuNCw0LvQuNGB0YLQsNC8INC+0YLQtNC10LvQsCDQutCw0LTRgNC+0LI=?= Date: Thu, 28 Apr 2016 09:37:19 +0300 X-ASG-Orig-Subj: =?utf-8?B?0KHQv9C10YbQuNCw0LvQuNGB0YLQsNC8INC+0YLQtNC10LvQsCDQutCw0LTRgNC+0LI=?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0069_01D1A131.8EC1CCB0" X-Priority: 3 X-MSMail-Priority: Normal Importance: Normal X-Mailer: Microsoft Windows Live Mail 15.4.3555.308 X-MimeOLE: Produced By Microsoft MimeOLE V15.4.3555.308 X-Barracuda-Connect: vmd526.contabo.host[193.164.133.121] X-Barracuda-Start-Time: 1461825437 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 22966 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.29123 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message Ýòî — ñîîáùåíèå èç íåñêîëüêèõ ÷àñòåé â ôîðìàòå MIME. ------=_NextPart_000_0069_01D1A131.8EC1CCB0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable =20 =20 =20 19 =D0=BC=D0=B0=D1=8F =D0=B3.=D0=9C=D0=BE=D1=81=D0=BA=D0=B2=D0=B0 =D0=A3=D1=87=D0=B5=D0=B1=D0=BD=D1=8B=D0=B9 = =D1=86=D0=B5=D0=BD=D1=82=D1=80 = =D0=BF=D1=80=D0=B8=D0=B3=D0=BB=D0=B0=D1=88=D0=B0=D0=B5=D1=82 = =D0=BD=D0=B0 =D1=81=D0=B5=D0=BC=D0=B8=D0=BD=D0=B0=D1=80 = (=D0=BF=D1=80=D0=BE=D0=BC=D0=BE=D0=BA=D0=BE=D0=B4: 378): =D0=A0=D0=90=D0=91=D0=9E=D0=A7=D0=95=D0=95 = =D0=92=D0=A0=D0=95=D0=9C=D0=AF =D0=98 =D0=92=D0=A0=D0=95=D0=9C=D0=AF = =D0=9E=D0=A2=D0=94=D0=AB=D0=A5=D0=90:=20 =D0=A1=D0=9B=D0=9E=D0=96=D0=9D=D0=AB=D0=95 = =D0=92=D0=9E=D0=9F=D0=A0=D0=9E=D0=A1=D0=AB = =D0=9F=D0=A0=D0=90=D0=9A=D0=A2=D0=98=D0=A7=D0=95=D0=A1=D0=9A=D0=9E=D0=93=D0= =9E =D0=9F=D0=A0=D0=98=D0=9C=D0=95=D0=9D=D0=95=D0=9D=D0=98=D0=AF = =D0=9F=D0=A0=D0=90=D0=92=D0=9E=D0=92=D0=AB=D0=A5 = =D0=9D=D0=9E=D0=A0=D0=9C = =D0=9F=D1=80=D0=B5=D0=B4=D0=BD=D0=B0=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0= =BE =D0=B4=D0=BB=D1=8F: = =D1=80=D1=83=D0=BA=D0=BE=D0=B2=D0=BE=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D0=B5=D0= =B9 =D0=B8 = =D1=81=D0=BF=D0=B5=D1=86=D0=B8=D0=B0=D0=BB=D0=B8=D1=81=D1=82=D0=BE=D0=B2 = =D0=BA=D0=B0=D0=B4=D1=80=D0=BE=D0=B2=D1=8B=D1=85 = =D1=81=D0=BB=D1=83=D0=B6=D0=B1, = =D0=BD=D0=B0=D1=87=D0=B0=D0=BB=D1=8C=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2 = =D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D0=B0 = =D0=BA=D0=B0=D0=B4=D1=80=D0=BE=D0=B2 =D0=B8 =D0=B8=D1=85=20 = =D0=B7=D0=B0=D0=BC=D0=B5=D1=81=D1=82=D0=B8=D1=82=D0=B5=D0=BB=D0=B5=D0=B9,= = =D1=81=D0=BF=D0=B5=D1=86=D0=B8=D0=B0=D0=BB=D0=B8=D1=81=D1=82=D0=BE=D0=B2 = =D0=BA=D0=B0=D0=B4=D1=80=D0=BE=D0=B2=D0=BE=D0=B9 = =D1=81=D0=BB=D1=83=D0=B6=D0=B1=D1=8B, = =D0=BC=D0=B5=D0=BD=D0=B5=D0=B4=D0=B6=D0=B5=D1=80=D0=BE=D0=B2 = =D0=BF=D0=BE =D0=BF=D0=B5=D1=80=D1=81=D0=BE=D0=BD=D0=B0=D0=BB=D1=83 = =D0=B8 =D0=BA=D0=B0=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D0=BA=D0=BE=D0=B2- = =D0=B4=D0=B5=D0=BB=D0=BE=D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D0= =B8=D1=82=D0=B5=D0=BB=D0=B5=D0=B9. =D0=A6=D0=B5=D0=BB=D1=8C: = =D0=BF=D0=BE=D0=B7=D0=BD=D0=B0=D0=BA=D0=BE=D0=BC=D0=B8=D1=82=D1=8C = =D1=83=D1=87=D0=B0=D1=81=D1=82=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2 = =D1=81=D0=BE =D1=81=D0=BB=D0=BE=D0=B6=D0=BD=D1=8B=D0=BC=D0=B8 =D0=B8 = =D1=81=D0=BF=D0=BE=D1=80=D0=BD=D1=8B=D0=BC=D0=B8 = =D0=B2=D0=BE=D0=BF=D1=80=D0=BE=D1=81=D0=B0=D0=BC=D0=B8, = =D1=81=D0=B2=D1=8F=D0=B7=D0=B0=D0=BD=D0=BD=D1=8B=D0=BC=D0=B8 =D1=81=20 = =D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0= =B5=D0=BC =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B3=D0=BE = =D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8 =D0=B8 = =D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8 = =D0=BE=D1=82=D0=B4=D1=8B=D1=85=D0=B0. = =D0=9E=D1=81=D0=BE=D0=B1=D0=BE=D0=B5 = =D0=B2=D0=BD=D0=B8=D0=BC=D0=B0=D0=BD=D0=B8=D0=B5 = =D0=B1=D1=83=D0=B4=D0=B5=D1=82 = =D1=83=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=BE = =D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7=D1=83=20 =D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B9 = =D0=B2 =D0=BF=D1=80=D0=B0=D0=B2=D0=BE=D0=B2=D0=BE=D0=BC = =D1=80=D0=B5=D0=B3=D1=83=D0=BB=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0= =B8 =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B3=D0=BE = =D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8 =D0=B8 = =D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8 = =D0=BE=D1=82=D0=B4=D1=8B=D1=85=D0=B0, = =D0=BF=D1=80=D0=B8=D0=BD=D1=8F=D1=82=D1=8B=D1=85 =D0=B2 = =D0=BF=D0=BE=D1=81=D0=BB=D0=B5=D0=B4=D0=BD=D0=B5=D0=B5=20 =D0=B2=D1=80=D0=B5=D0=BC=D1=8F. =20 =D0=97=D0=B0=D0=BD=D1=8F=D1=82=D0=B8=D1=8F = =D0=BF=D1=80=D0=BE=D1=85=D0=BE=D0=B4=D1=8F=D1=82 =D1=81 10:00 = =D0=B4=D0=BE 17:30 =D0=9C=D0=B5=D1=81=D1=82=D0=BE = =D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F: =D0=BC. = =D0=91=D0=B0=D1=83=D0=BC=D0=B0=D0=BD=D1=81=D0=BA=D0=B0=D1=8F, = =D1=83=D0=BB. = =D0=91=D0=B0=D1=83=D0=BC=D0=B0=D0=BD=D1=81=D0=BA=D0=B0=D1=8F, =D0=B4.6, = =D0=91.=D0=A6. "=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D1=8F = =D0=9F=D0=BB=D0=B0=D0=B7=D0=B0". =D0=92=D1=81=D1=8F = =D0=B8=D0=BD=D1=82=D0=B5=D1=80=D0=B5=D1=81=D1=83=D1=8E=D1=89=D0=B0=D1=8F = =D0=92=D0=B0=D1=81 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D1=8F =D0=B8 = =D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B0=D1=86=D0=B8=D1=8F = =D0=BF=D0=BE =D1=82=D0=B5=D0=BB=D0=B5=D1=84=D0=BE=D0=BD=D1=83: =20 8 =D0=BA=D0=BE=D0=B4 =D0=B3=D0=BE=D1=80=D0=BE=D0=B4=D0=B0 = (495) =D1=82=D0=B5=D0=BB.: 961-00-38 = (=D0=BC=D0=BD=D0=BE=D0=B3=D0=BE=D0=BA=D0=B0=D0=BD=D0=B0=D0=BB=D1=8C=D0=BD= =D1=8B=D0=B9) =20 =20 =20 =20 =D0=9E=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5 = =D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D1=8B:=20 =D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0, = =D1=82=D1=80=D1=83=D0=B4 =D0=B8 =D0=B2=D1=80=D0=B5=D0=BC=D1=8F. - = =D0=A0=D0=B5=D0=B3=D0=BB=D0=B0=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D1= =8F =D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8 = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B =D0=B2 = =D0=B3=D1=80=D0=B0=D0=B6=D0=B4=D0=B0=D0=BD=D1=81=D0=BA=D0=BE-=D0=BF=D1=80= =D0=B0=D0=B2=D0=BE=D0=B2=D1=8B=D1=85 =D0=B8 = =D1=82=D1=80=D1=83=D0=B4=D0=BE=D0=B2=D1=8B=D1=85 = =D0=BE=D1=82=D0=BD=D0=BE=D1=88=D0=B5=D0=BD=D0=B8=D0=B9 = (=D1=81=D0=BE=D0=BE=D1=82=D0=BD=D0=BE=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=20 =D1=82=D1=80=D1=83=D0=B4=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE = =D0=B8 = =D0=B3=D1=80=D0=B0=D0=B6=D0=B4=D0=B0=D0=BD=D1=81=D0=BA=D0=BE-=D0=BF=D1=80= =D0=B0=D0=B2=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE = =D0=B4=D0=BE=D0=B3=D0=BE=D0=B2=D0=BE=D1=80=D0=B0 =D0=B2 = =D1=81=D1=84=D0=B5=D1=80=D0=B5 =D1=82=D1=80=D1=83=D0=B4=D0=B0 =D1=81 = =D1=82=D0=BE=D1=87=D0=BA=D0=B8 =D0=B7=D1=80=D0=B5=D0=BD=D0=B8=D1=8F = =D1=83=D1=87=D0=B5=D1=82=D0=B0 =D0=B8=20 = =D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8 = =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B3=D0=BE = =D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8 =D0=B8 = =D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8 = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B). - =D0=9F=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=D0=B0 = =D0=B2=D0=BD=D1=83=D1=82=D1=80=D0=B5=D0=BD=D0=BD=D0=B5=D0=B3=D0=BE = =D1=82=D1=80=D1=83=D0=B4=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE = =D1=80=D0=B0=D1=81=D0=BF=D0=BE=D1=80=D1=8F=D0=B4=D0=BA=D0=B0. - = =D0=9E=D1=81=D0=BE=D0=B1=D0=B5=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F = =D1=82=D0=B0=D0=B1=D0=B5=D0=BB=D1=8F =D1=83=D1=87=D0=B5=D1=82=D0=B0 = =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B3=D0=BE = =D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8. - = =D0=A7=D0=B5=D1=80=D0=B5=D0=B4=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5 = =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B3=D0=BE = =D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8 =D0=B8 = =D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8 = =D0=BE=D1=82=D0=B4=D1=8B=D1=85=D0=B0. - = =D0=A1=D0=BE=D0=BA=D1=80=D0=B0=D1=89=D0=B5=D0=BD=D0=BD=D0=BE=D0=B5 = =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B5 = =D0=B2=D1=80=D0=B5=D0=BC=D1=8F. - =D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0 =D0=B2=D0=BE = =D0=B2=D1=80=D0=B5=D0=B4=D0=BD=D1=8B=D1=85 = =D1=83=D1=81=D0=BB=D0=BE=D0=B2=D0=B8=D1=8F=D1=85. - = =D0=9E=D1=82=D0=B2=D0=B5=D1=82=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0=BD=D0=BE=D1= =81=D1=82=D1=8C =D0=B7=D0=B0 = =D0=BD=D0=B0=D1=80=D1=83=D1=88=D0=B5=D0=BD=D0=B8=D0=B5 = =D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B0 =D1=82=D1=80=D1=83=D0=B4=D0=B0 = =D0=B8 =D0=BE=D1=82=D0=B4=D1=8B=D1=85=D0=B0. = =D0=A1=D1=82=D0=B0=D0=BD=D0=B4=D0=B0=D1=80=D1=82=D0=BD=D1=8B=D0=B9 = =D0=B8 = =D0=BD=D0=B5=D1=81=D1=82=D0=B0=D0=BD=D0=B4=D0=B0=D1=80=D1=82=D0=BD=D1=8B=D0= =B5 =D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D1=8B = =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B3=D0=BE = =D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8. - = =D0=9D=D0=B5=D0=BD=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0= =BD=D1=8B=D0=B9 =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B8=D0=B9 = =D0=B4=D0=B5=D0=BD=D1=8C, =D1=81=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B=D0=B9 = =D0=B3=D1=80=D0=B0=D1=84=D0=B8=D0=BA. = =D0=9E=D1=82=D0=BB=D0=B8=D1=87=D0=B8=D0=B5 = =D0=BD=D0=B5=D0=BD=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0= =BD=D0=BE=D0=B3=D0=BE =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B3=D0=BE = =D0=B4=D0=BD=D1=8F=20 =D0=BE=D1=82 = =D1=81=D0=B2=D0=B5=D1=80=D1=85=D1=83=D1=80=D0=BE=D1=87=D0=BD=D0=BE=D0=B9 = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B.=20 - = =D0=A1=D0=B2=D0=B5=D1=80=D1=85=D1=83=D1=80=D0=BE=D1=87=D0=BD=D0=B0=D1=8F = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0 =D0=BF=D1=80=D0=B8 = =D1=80=D0=B0=D0=B7=D0=BD=D1=8B=D1=85 = =D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B0=D1=85 = =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B3=D0=BE = =D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8. - =D0=93=D0=B8=D0=B1=D0=BA=D0=B8=D0=B9 = =D0=B3=D1=80=D0=B0=D1=84=D0=B8=D0=BA: = =D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5 = =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B3=D0=BE =D0=B4=D0=BD=D1=8F = =D0=BD=D0=B0 =D1=87=D0=B0=D1=81=D1=82=D0=B8, = =C2=AB=D0=BF=D0=BB=D0=B0=D0=B2=D0=B0=D1=8E=D1=89=D0=B8=D0=B5=C2=BB = =D0=BD=D0=B0=D1=87=D0=B0=D0=BB=D0=BE =D0=B8 = =D0=BE=D0=BA=D0=BE=D0=BD=D1=87=D0=B0=D0=BD=D0=B8=D0=B5 = =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B3=D0=BE=20 =D0=B4=D0=BD=D1=8F. - = =D0=9E=D1=81=D0=BE=D0=B1=D0=B5=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B0 = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B: = =D0=B1=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D0=BE=D0=B9 = =D0=B6=D0=B5=D0=BD=D1=89=D0=B8=D0=BD=D1=8B, = =D0=BC=D0=B0=D1=82=D0=B5=D1=80=D0=B8-=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BD= =D0=B8=D1=86=D1=8B, =D0=B8=D0=BD=D1=8B=D1=85 =D0=BB=D0=B8=D1=86=20 =D1=81 = =D1=81=D0=B5=D0=BC=D0=B5=D0=B9=D0=BD=D1=8B=D0=BC=D0=B8 = =D0=BE=D0=B1=D1=8F=D0=B7=D0=B0=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D1=8F=D0=BC=D0= =B8. - =D0=9E=D0=BF=D0=BB=D0=B0=D1=82=D0=B0 = =D1=82=D1=80=D1=83=D0=B4=D0=B0 =D0=BF=D1=80=D0=B8 = =D0=BD=D0=B5=D1=81=D1=82=D0=B0=D0=BD=D0=B4=D0=B0=D1=80=D1=82=D0=BD=D1=8B=D1= =85 =D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B0=D1=85 = =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B3=D0=BE = =D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8. = =D0=A1=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D0=B0=D1=8F = =D0=BE=D0=BF=D0=BB=D0=B0=D1=82=D0=B0, = =D0=BE=D0=BF=D0=BB=D0=B0=D1=82=D0=B0=20 =D0=B2=D1=8B=D1=85=D0=BE=D0=B4=D0=BD=D1=8B=D1=85 =D0=B8 = =D0=BF=D1=80=D0=B0=D0=B7=D0=B4=D0=BD=D0=B8=D1=87=D0=BD=D1=8B=D1=85 = =D0=B4=D0=BD=D0=B5=D0=B9. = =D0=9A=D0=BE=D0=BC=D0=BF=D0=B5=D0=BD=D1=81=D0=B0=D1=86=D0=B8=D1=8F = =D0=BD=D0=B5=D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B8=D1=85 = =D0=BF=D1=80=D0=B0=D0=B7=D0=B4=D0=BD=D0=B8=D1=87=D0=BD=D1=8B=D1=85 = =D0=B4=D0=BD=D0=B5=D0=B9. - = =D0=9D=D0=B5=D1=81=D1=82=D0=B0=D0=BD=D0=B4=D0=B0=D1=80=D1=82=D0=BD=D1=8B=D0= =B5 =D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D1=8B = =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B3=D0=BE = =D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8. - =D0=92=D1=8B=D1=85=D0=BE=D0=B4=D0=BD=D1=8B=D0=B5 = =D0=B4=D0=BD=D0=B8. = =D0=9F=D1=80=D0=BE=D0=B4=D0=BE=D0=BB=D0=B6=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0= =BD=D0=BE=D1=81=D1=82=D1=8C = =D0=BD=D0=B5=D0=BF=D1=80=D0=B5=D1=80=D1=8B=D0=B2=D0=BD=D0=BE=D0=B3=D0=BE = =D0=B5=D0=B6=D0=B5=D0=BD=D0=B5=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D0=B3=D0= =BE =D0=BE=D1=82=D0=B4=D1=8B=D1=85=D0=B0 =D1=83 = =D0=B2=D0=BE=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D0=B5=D0=B9,=20 = =C2=AB=D0=B2=D1=80=D0=B5=D0=B4=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2=C2=BB, = =C2=AB=D0=B4=D0=B8=D1=81=D1=82=D0=B0=D0=BD=D1=86=D0=B8=D0=BE=D0=BD=D1=89=D0= =B8=D0=BA=D0=BE=D0=B2=C2=BB. = =D0=95=D0=B6=D0=B5=D0=B4=D0=BD=D0=B5=D0=B2=D0=BD=D1=8B=D0=B5 = =D0=BF=D0=B5=D1=80=D0=B5=D1=80=D1=8B=D0=B2=D1=8B =D0=BD=D0=B0 = =D0=BE=D1=82=D0=B4=D1=8B=D1=85 =D0=B8 = =D0=BF=D0=B8=D1=82=D0=B0=D0=BD=D0=B8=D0=B5=20 (=D0=B2 =D1=82.=D1=87. = =C2=AB=D0=BF=D0=BB=D0=B0=D0=B2=D0=B0=D1=8E=D1=89=D0=B8=D0=B5=C2=BB). = =D0=9F=D1=80=D0=B0=D0=B7=D0=B4=D0=BD=D0=B8=D1=87=D0=BD=D1=8B=D0=B5 = =D0=B8 = =D0=BF=D1=80=D0=B5=D0=B4=D0=BF=D1=80=D0=B0=D0=B7=D0=B4=D0=BD=D0=B8=D1=87=D0= =BD=D1=8B=D0=B5 =D0=B4=D0=BD=D0=B8. =D0=A1=D0=BB=D0=BE=D0=B6=D0=BD=D1=8B=D0=B5 = =D0=B2=D0=BE=D0=BF=D1=80=D0=BE=D1=81=D1=8B = =D0=BF=D1=80=D0=B5=D0=B4=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0= =B8=D1=8F =D0=B8 = =D0=BE=D1=84=D0=BE=D1=80=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F = =D0=BE=D1=82=D0=BF=D1=83=D1=81=D0=BA=D0=B0 = =D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=BC = =D0=BA=D0=B0=D1=82=D0=B5=D0=B3=D0=BE=D1=80=D0=B8=D1=8F=D0=BC=20 = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2. - = =D0=9E=D1=81=D0=BE=D0=B1=D0=B5=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=BF=D1=80=D0=B5=D0=B4=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0= =B8=D1=8F =D0=BE=D1=82=D0=BF=D1=83=D1=81=D0=BA=D0=B0: = =D1=81=D0=BE=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=B8=D1=82=D0=B5=D0=BB=D1=8F=D0= =BC; =D0=B1=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B=D0=BC = =D0=B6=D0=B5=D0=BD=D1=89=D0=B8=D0=BD=D0=B0=D0=BC; = =D0=B6=D0=B5=D0=BD=D1=89=D0=B8=D0=BD=D0=B0=D0=BC,=20 = =D0=BD=D0=B0=D1=85=D0=BE=D0=B4=D1=8F=D1=89=D0=B8=D0=BC=D1=81=D1=8F = =D0=B2 =D0=BE=D1=82=D0=BF=D1=83=D1=81=D0=BA=D0=B5 =D0=BF=D0=BE = =D1=83=D1=85=D0=BE=D0=B4=D1=83 =D0=B7=D0=B0 = =D1=80=D0=B5=D0=B1=D0=B5=D0=BD=D0=BA=D0=BE=D0=BC =D0=B8 = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D1=8E=D1=89=D0=B8=D0=BC = =D0=BD=D0=B5=D0=BF=D0=BE=D0=BB=D0=BD=D1=8B=D0=B9 = =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B8=D0=B9 =D0=B4=D0=B5=D0=BD=D1=8C; = =D0=BD=D0=B5=D0=B4=D0=B0=D0=B2=D0=BD=D0=BE=20 =D0=BF=D1=80=D0=B8=D0=BD=D1=8F=D1=82=D1=8B=D0=BC = =D0=BD=D0=B0 =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=83 =D0=B8 =D0=BF=D1=80.=20 - =D0=9E=D1=82=D0=BF=D1=83=D1=81=D0=BA=D0=B0 = =D0=BB=D1=8C=D0=B3=D0=BE=D1=82=D0=BD=D1=8B=D0=BC = =D0=BA=D0=B0=D1=82=D0=B5=D0=B3=D0=BE=D1=80=D0=B8=D1=8F=D0=BC = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2 = (=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D1=8E=D1=89=D0=B8=D0=BC =D0=B2 = =D1=83=D1=81=D0=BB=D0=BE=D0=B2=D0=B8=D1=8F=D1=85 = =D0=9A=D1=80=D0=B0=D0=B9=D0=BD=D0=B5=D0=B3=D0=BE = =D0=A1=D0=B5=D0=B2=D0=B5=D1=80=D0=B0,=20 = =C2=AB=D0=B2=D1=80=D0=B5=D0=B4=D0=BD=D0=B8=D0=BA=D0=B0=D0=BC=C2=BB = =D0=B8 =D0=BF=D1=80.).=20 - =D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81 = =D0=BE=D1=82=D0=BF=D1=83=D1=81=D0=BA=D0=B0 =D0=BF=D0=BE = =D0=B8=D0=BD=D0=B8=D1=86=D0=B8=D0=B0=D1=82=D0=B8=D0=B2=D0=B5 = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BD=D0=B8=D0=BA=D0=B0 = =D0=B8=D0=BB=D0=B8 = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BE=D0=B4=D0=B0=D1=82=D0=B5=D0=BB=D1=8F.= =20 - =D0=9E=D1=82=D0=B7=D1=8B=D0=B2 =D0=B8=D0=B7 = =D0=BE=D1=82=D0=BF=D1=83=D1=81=D0=BA=D0=B0.=20 - =D0=91=D0=BE=D0=BB=D0=B5=D0=B7=D0=BD=D1=8C = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BD=D0=B8=D0=BA=D0=B0 =D0=B2=D0=BE = =D0=B2=D1=80=D0=B5=D0=BC=D1=8F = =D0=BE=D1=82=D0=BF=D1=83=D1=81=D0=BA=D0=B0: = =D0=BF=D0=BE=D1=80=D1=8F=D0=B4=D0=BE=D0=BA = =D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D0=B8=D1=8F/=D0=BF= =D1=80=D0=BE=D0=B4=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F = =D0=BE=D1=82=D0=BF=D1=83=D1=81=D0=BA=D0=B0.=20 - =D0=A0=D0=B0=D1=81=D1=87=D0=B5=D1=82 = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B5=D0=BD=D1=81=D0=B0=D1=86=D0=B8=D0=B8 = =D0=B7=D0=B0 = =D0=BD=D0=B5=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0= =BD=D0=BD=D1=8B=D0=B9 =D0=BE=D1=82=D0=BF=D1=83=D1=81=D0=BA = =D0=BF=D1=80=D0=B8 = =D1=83=D0=B2=D0=BE=D0=BB=D1=8C=D0=BD=D0=B5=D0=BD=D0=B8=D0=B8. . = =D0=A0=D0=B5=D0=BA=D0=BE=D0=BC=D0=B5=D0=BD=D0=B4=D0=B0=D1=86=D0=B8=D0=B8 = =D0=A0=D0=BE=D1=81=D1=82=D1=80=D1=83=D0=B4=D0=B0, = =D0=BE=D1=81=D0=BE=D0=B1=D0=B5=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=B8=D1=85 = =D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F. = =D0=9A=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D0=B9 = =D1=81=D1=83=D0=B4=D0=B5=D0=B1=D0=BD=D0=BE=D0=B9 = =D0=BF=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D0=BA=D0=B8. =20 * * * * * * * * * * * * =20 =D0=A1=D1=82=D0=BE=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D1=8C = =D1=83=D1=87=D0=B0=D1=81=D1=82=D0=B8=D1=8F: 11 800 =D1=80=D1=83=D0=B1.=20 =D0=A1=D0=BA=D0=B8=D0=B4=D0=BA=D0=B8 (2 = =D1=87=D0=B5=D0=BB=D0=BE=D0=B2=D0=B5=D0=BA=D0=B0 =E2=80=93 10%, 3 = =D1=87=D0=B5=D0=BB=D0=BE=D0=B2=D0=B5=D0=BA=D0=B0 =E2=80=93 15%, 4 = =D1=87=D0=B5=D0=BB=D0=BE=D0=B2=D0=B5=D0=BA=D0=B0 =D0=B8 = =D0=B1=D0=BE=D0=BB=D0=B5=D0=B5 =E2=80=93 20%.) =D0=92 =D1=81=D1=82=D0=BE=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D1=8C = =D0=B2=D1=85=D0=BE=D0=B4=D0=B8=D1=82 = =D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B9 = =D0=BC=D0=B0=D1=82=D0=B5=D1=80=D0=B8=D0=B0=D0=BB, = =D0=BE=D0=B1=D0=B5=D0=B4=D1=8B, = =D0=BA=D0=BE=D1=84=D0=B5-=D0=BF=D0=B0=D1=83=D0=B7=D1=8B, = =D1=81=D0=B5=D1=80=D1=82=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=82. =20 =20 ------=_NextPart_000_0069_01D1A131.8EC1CCB0 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable
                   


    19 =D0=BC=D0=B0=D1=8F
    =D0=B3.=D0= =9C=D0=BE=D1=81=D0=BA=D0=B2=D0=B0

    =D0=A3=D1=87=D0= =B5=D0=B1=D0=BD=D1=8B=D0=B9=20 =D1=86=D0=B5=D0=BD=D1=82=D1=80 = =D0=BF=D1=80=D0=B8=D0=B3=D0=BB=D0=B0=D1=88=D0=B0=D0=B5=D1=82 = =D0=BD=D0=B0 =D1=81=D0=B5=D0=BC=D0=B8=D0=BD=D0=B0=D1=80 = (=D0=BF=D1=80=D0=BE=D0=BC=D0=BE=D0=BA=D0=BE=D0=B4: 378):

    = =D0=A0=D0=90=D0=91=D0=9E=D0=A7=D0=95=D0=95 = =D0=92=D0=A0=D0=95=D0=9C=D0=AF =D0=98 =D0=92=D0=A0=D0=95=D0=9C=D0=AF=20 =D0=9E=D0=A2=D0=94=D0=AB=D0=A5=D0=90: 
    =D0=A1=D0=9B=D0=9E=D0=96=D0= =9D=D0=AB=D0=95=20 =D0=92=D0=9E=D0=9F=D0=A0=D0=9E=D0=A1=D0=AB = =D0=9F=D0=A0=D0=90=D0=9A=D0=A2=D0=98=D0=A7=D0=95=D0=A1=D0=9A=D0=9E=D0=93=D0= =9E =D0=9F=D0=A0=D0=98=D0=9C=D0=95=D0=9D=D0=95=D0=9D=D0=98=D0=AF = =D0=9F=D0=A0=D0=90=D0=92=D0=9E=D0=92=D0=AB=D0=A5 = =D0=9D=D0=9E=D0=A0=D0=9C

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

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

     
    =D0=97=D0=B0=D0=BD=D1=8F=D1=82=D0=B8=D1=8F=20 =D0=BF=D1=80=D0=BE=D1=85=D0=BE=D0=B4=D1=8F=D1=82 =D1=81 = 10:00 =D0=B4=D0=BE 17:30

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

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

                    =D0=9E=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5 = =D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D1=8B: 

    =D0=A0=D0= =B0=D0=B1=D0=BE=D1=82=D0=B0,=20 =D1=82=D1=80=D1=83=D0=B4 =D0=B8 = =D0=B2=D1=80=D0=B5=D0=BC=D1=8F.
    - = =D0=A0=D0=B5=D0=B3=D0=BB=D0=B0=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D1= =8F =D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8 = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B =D0=B2=20 = =D0=B3=D1=80=D0=B0=D0=B6=D0=B4=D0=B0=D0=BD=D1=81=D0=BA=D0=BE-=D0=BF=D1=80= =D0=B0=D0=B2=D0=BE=D0=B2=D1=8B=D1=85 =D0=B8 = =D1=82=D1=80=D1=83=D0=B4=D0=BE=D0=B2=D1=8B=D1=85 = =D0=BE=D1=82=D0=BD=D0=BE=D1=88=D0=B5=D0=BD=D0=B8=D0=B9 = (=D1=81=D0=BE=D0=BE=D1=82=D0=BD=D0=BE=D1=88=D0=B5=D0=BD=D0=B8=D0=B5 
       =20 =D1=82=D1=80=D1=83=D0=B4=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE = =D0=B8 = =D0=B3=D1=80=D0=B0=D0=B6=D0=B4=D0=B0=D0=BD=D1=81=D0=BA=D0=BE-=D0=BF=D1=80= =D0=B0=D0=B2=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE = =D0=B4=D0=BE=D0=B3=D0=BE=D0=B2=D0=BE=D1=80=D0=B0 =D0=B2 = =D1=81=D1=84=D0=B5=D1=80=D0=B5 =D1=82=D1=80=D1=83=D0=B4=D0=B0 =D1=81 = =D1=82=D0=BE=D1=87=D0=BA=D0=B8=20 =D0=B7=D1=80=D0=B5=D0=BD=D0=B8=D1=8F = =D1=83=D1=87=D0=B5=D1=82=D0=B0 =D0=B8 
       =20 = =D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8 = =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B3=D0=BE = =D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8 =D0=B8 = =D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8 = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B).
    - = =D0=9F=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=D0=B0=20 = =D0=B2=D0=BD=D1=83=D1=82=D1=80=D0=B5=D0=BD=D0=BD=D0=B5=D0=B3=D0=BE = =D1=82=D1=80=D1=83=D0=B4=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE = =D1=80=D0=B0=D1=81=D0=BF=D0=BE=D1=80=D1=8F=D0=B4=D0=BA=D0=B0.
    - = =D0=9E=D1=81=D0=BE=D0=B1=D0=B5=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F = =D1=82=D0=B0=D0=B1=D0=B5=D0=BB=D1=8F=20 =D1=83=D1=87=D0=B5=D1=82=D0=B0 = =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B3=D0=BE = =D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8.
    - = =D0=A7=D0=B5=D1=80=D0=B5=D0=B4=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5 = =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B3=D0=BE = =D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8 =D0=B8 = =D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8=20 =D0=BE=D1=82=D0=B4=D1=8B=D1=85=D0=B0.
    - = =D0=A1=D0=BE=D0=BA=D1=80=D0=B0=D1=89=D0=B5=D0=BD=D0=BD=D0=BE=D0=B5 = =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B5 = =D0=B2=D1=80=D0=B5=D0=BC=D1=8F.
    - = =D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0 =D0=B2=D0=BE = =D0=B2=D1=80=D0=B5=D0=B4=D0=BD=D1=8B=D1=85=20 =D1=83=D1=81=D0=BB=D0=BE=D0=B2=D0=B8=D1=8F=D1=85.
    - = =D0=9E=D1=82=D0=B2=D0=B5=D1=82=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0=BD=D0=BE=D1= =81=D1=82=D1=8C =D0=B7=D0=B0 = =D0=BD=D0=B0=D1=80=D1=83=D1=88=D0=B5=D0=BD=D0=B8=D0=B5 = =D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B0 =D1=82=D1=80=D1=83=D0=B4=D0=B0 = =D0=B8=20 = =D0=BE=D1=82=D0=B4=D1=8B=D1=85=D0=B0.
    =D0=A1=D1=82=D0=B0=D0=BD=D0=B4= =D0=B0=D1=80=D1=82=D0=BD=D1=8B=D0=B9 =D0=B8 = =D0=BD=D0=B5=D1=81=D1=82=D0=B0=D0=BD=D0=B4=D0=B0=D1=80=D1=82=D0=BD=D1=8B=D0= =B5 =D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D1=8B = =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B3=D0=BE=20 =D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8.
    - = =D0=9D=D0=B5=D0=BD=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0= =BD=D1=8B=D0=B9 =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B8=D0=B9 = =D0=B4=D0=B5=D0=BD=D1=8C, =D1=81=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B=D0=B9 = =D0=B3=D1=80=D0=B0=D1=84=D0=B8=D0=BA.=20 =D0=9E=D1=82=D0=BB=D0=B8=D1=87=D0=B8=D0=B5 = =D0=BD=D0=B5=D0=BD=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0= =BD=D0=BE=D0=B3=D0=BE =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B3=D0=BE = =D0=B4=D0=BD=D1=8F 
        = =D0=BE=D1=82=20 = =D1=81=D0=B2=D0=B5=D1=80=D1=85=D1=83=D1=80=D0=BE=D1=87=D0=BD=D0=BE=D0=B9 = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B. 
    - = =D0=A1=D0=B2=D0=B5=D1=80=D1=85=D1=83=D1=80=D0=BE=D1=87=D0=BD=D0=B0=D1=8F = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20 =D0=BF=D1=80=D0=B8 =D1=80=D0=B0=D0=B7=D0=BD=D1=8B=D1=85 = =D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B0=D1=85 = =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B3=D0=BE = =D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8.
    - = =D0=93=D0=B8=D0=B1=D0=BA=D0=B8=D0=B9 = =D0=B3=D1=80=D0=B0=D1=84=D0=B8=D0=BA: = =D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20 =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B3=D0=BE = =D0=B4=D0=BD=D1=8F =D0=BD=D0=B0 =D1=87=D0=B0=D1=81=D1=82=D0=B8, = =C2=AB=D0=BF=D0=BB=D0=B0=D0=B2=D0=B0=D1=8E=D1=89=D0=B8=D0=B5=C2=BB = =D0=BD=D0=B0=D1=87=D0=B0=D0=BB=D0=BE =D0=B8 = =D0=BE=D0=BA=D0=BE=D0=BD=D1=87=D0=B0=D0=BD=D0=B8=D0=B5 = =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B3=D0=BE 
       =20 =D0=B4=D0=BD=D1=8F.
    - = =D0=9E=D1=81=D0=BE=D0=B1=D0=B5=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B0 = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B: = =D0=B1=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D0=BE=D0=B9 = =D0=B6=D0=B5=D0=BD=D1=89=D0=B8=D0=BD=D1=8B,=20 = =D0=BC=D0=B0=D1=82=D0=B5=D1=80=D0=B8-=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BD= =D0=B8=D1=86=D1=8B, =D0=B8=D0=BD=D1=8B=D1=85 =D0=BB=D0=B8=D1=86 
        =D1=81 = =D1=81=D0=B5=D0=BC=D0=B5=D0=B9=D0=BD=D1=8B=D0=BC=D0=B8 = =D0=BE=D0=B1=D1=8F=D0=B7=D0=B0=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D1=8F=D0=BC=D0= =B8.
    - =D0=9E=D0=BF=D0=BB=D0=B0=D1=82=D0=B0 = =D1=82=D1=80=D1=83=D0=B4=D0=B0 =D0=BF=D1=80=D0=B8 = =D0=BD=D0=B5=D1=81=D1=82=D0=B0=D0=BD=D0=B4=D0=B0=D1=80=D1=82=D0=BD=D1=8B=D1= =85 =D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B0=D1=85=20 =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B3=D0=BE = =D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8. = =D0=A1=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D0=B0=D1=8F = =D0=BE=D0=BF=D0=BB=D0=B0=D1=82=D0=B0, = =D0=BE=D0=BF=D0=BB=D0=B0=D1=82=D0=B0 
       =20 =D0=B2=D1=8B=D1=85=D0=BE=D0=B4=D0=BD=D1=8B=D1=85 =D0=B8 = =D0=BF=D1=80=D0=B0=D0=B7=D0=B4=D0=BD=D0=B8=D1=87=D0=BD=D1=8B=D1=85 = =D0=B4=D0=BD=D0=B5=D0=B9. = =D0=9A=D0=BE=D0=BC=D0=BF=D0=B5=D0=BD=D1=81=D0=B0=D1=86=D0=B8=D1=8F = =D0=BD=D0=B5=D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B8=D1=85 = =D0=BF=D1=80=D0=B0=D0=B7=D0=B4=D0=BD=D0=B8=D1=87=D0=BD=D1=8B=D1=85=20 =D0=B4=D0=BD=D0=B5=D0=B9.
    - = =D0=9D=D0=B5=D1=81=D1=82=D0=B0=D0=BD=D0=B4=D0=B0=D1=80=D1=82=D0=BD=D1=8B=D0= =B5 =D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D1=8B = =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B3=D0=BE = =D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8.
    - = =D0=92=D1=8B=D1=85=D0=BE=D0=B4=D0=BD=D1=8B=D0=B5 =D0=B4=D0=BD=D0=B8.=20 = =D0=9F=D1=80=D0=BE=D0=B4=D0=BE=D0=BB=D0=B6=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0= =BD=D0=BE=D1=81=D1=82=D1=8C = =D0=BD=D0=B5=D0=BF=D1=80=D0=B5=D1=80=D1=8B=D0=B2=D0=BD=D0=BE=D0=B3=D0=BE = =D0=B5=D0=B6=D0=B5=D0=BD=D0=B5=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D0=B3=D0= =BE =D0=BE=D1=82=D0=B4=D1=8B=D1=85=D0=B0 =D1=83=20 =D0=B2=D0=BE=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D0=B5=D0=B9, 
       =20 = =C2=AB=D0=B2=D1=80=D0=B5=D0=B4=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2=C2=BB, = =C2=AB=D0=B4=D0=B8=D1=81=D1=82=D0=B0=D0=BD=D1=86=D0=B8=D0=BE=D0=BD=D1=89=D0= =B8=D0=BA=D0=BE=D0=B2=C2=BB. = =D0=95=D0=B6=D0=B5=D0=B4=D0=BD=D0=B5=D0=B2=D0=BD=D1=8B=D0=B5 = =D0=BF=D0=B5=D1=80=D0=B5=D1=80=D1=8B=D0=B2=D1=8B =D0=BD=D0=B0 = =D0=BE=D1=82=D0=B4=D1=8B=D1=85 =D0=B8=20 =D0=BF=D0=B8=D1=82=D0=B0=D0=BD=D0=B8=D0=B5 
        = (=D0=B2=20 =D1=82.=D1=87. = =C2=AB=D0=BF=D0=BB=D0=B0=D0=B2=D0=B0=D1=8E=D1=89=D0=B8=D0=B5=C2=BB). = =D0=9F=D1=80=D0=B0=D0=B7=D0=B4=D0=BD=D0=B8=D1=87=D0=BD=D1=8B=D0=B5 = =D0=B8 = =D0=BF=D1=80=D0=B5=D0=B4=D0=BF=D1=80=D0=B0=D0=B7=D0=B4=D0=BD=D0=B8=D1=87=D0= =BD=D1=8B=D0=B5 = =D0=B4=D0=BD=D0=B8.
    =D0=A1=D0=BB=D0=BE=D0=B6=D0=BD=D1=8B=D0=B5=20 =D0=B2=D0=BE=D0=BF=D1=80=D0=BE=D1=81=D1=8B = =D0=BF=D1=80=D0=B5=D0=B4=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0= =B8=D1=8F =D0=B8 = =D0=BE=D1=84=D0=BE=D1=80=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F = =D0=BE=D1=82=D0=BF=D1=83=D1=81=D0=BA=D0=B0 = =D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=BC=20 = =D0=BA=D0=B0=D1=82=D0=B5=D0=B3=D0=BE=D1=80=D0=B8=D1=8F=D0=BC 
    =D1=80=D0=B0=D0=B1=D0=BE=D1= =82=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2.

    -=20 = =D0=9E=D1=81=D0=BE=D0=B1=D0=B5=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=BF=D1=80=D0=B5=D0=B4=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0= =B8=D1=8F =D0=BE=D1=82=D0=BF=D1=83=D1=81=D0=BA=D0=B0: = =D1=81=D0=BE=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=B8=D1=82=D0=B5=D0=BB=D1=8F=D0= =BC; =D0=B1=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B=D0=BC=20 =D0=B6=D0=B5=D0=BD=D1=89=D0=B8=D0=BD=D0=B0=D0=BC; = =D0=B6=D0=B5=D0=BD=D1=89=D0=B8=D0=BD=D0=B0=D0=BC, 
       =20 = =D0=BD=D0=B0=D1=85=D0=BE=D0=B4=D1=8F=D1=89=D0=B8=D0=BC=D1=81=D1=8F = =D0=B2 =D0=BE=D1=82=D0=BF=D1=83=D1=81=D0=BA=D0=B5 =D0=BF=D0=BE = =D1=83=D1=85=D0=BE=D0=B4=D1=83 =D0=B7=D0=B0 = =D1=80=D0=B5=D0=B1=D0=B5=D0=BD=D0=BA=D0=BE=D0=BC =D0=B8 = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D1=8E=D1=89=D0=B8=D0=BC = =D0=BD=D0=B5=D0=BF=D0=BE=D0=BB=D0=BD=D1=8B=D0=B9=20 =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B8=D0=B9 = =D0=B4=D0=B5=D0=BD=D1=8C; = =D0=BD=D0=B5=D0=B4=D0=B0=D0=B2=D0=BD=D0=BE 
       =20 =D0=BF=D1=80=D0=B8=D0=BD=D1=8F=D1=82=D1=8B=D0=BC = =D0=BD=D0=B0 =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=83 =D0=B8 = =D0=BF=D1=80. 
    - = =D0=9E=D1=82=D0=BF=D1=83=D1=81=D0=BA=D0=B0 = =D0=BB=D1=8C=D0=B3=D0=BE=D1=82=D0=BD=D1=8B=D0=BC=20 =D0=BA=D0=B0=D1=82=D0=B5=D0=B3=D0=BE=D1=80=D0=B8=D1=8F=D0=BC = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2 = (=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D1=8E=D1=89=D0=B8=D0=BC =D0=B2 = =D1=83=D1=81=D0=BB=D0=BE=D0=B2=D0=B8=D1=8F=D1=85 = =D0=9A=D1=80=D0=B0=D0=B9=D0=BD=D0=B5=D0=B3=D0=BE = =D0=A1=D0=B5=D0=B2=D0=B5=D1=80=D0=B0, 
       =20 = =C2=AB=D0=B2=D1=80=D0=B5=D0=B4=D0=BD=D0=B8=D0=BA=D0=B0=D0=BC=C2=BB = =D0=B8 =D0=BF=D1=80.). 
    - = =D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81 = =D0=BE=D1=82=D0=BF=D1=83=D1=81=D0=BA=D0=B0 =D0=BF=D0=BE=20 =D0=B8=D0=BD=D0=B8=D1=86=D0=B8=D0=B0=D1=82=D0=B8=D0=B2=D0=B5 = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BD=D0=B8=D0=BA=D0=B0 = =D0=B8=D0=BB=D0=B8 = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BE=D0=B4=D0=B0=D1=82=D0=B5=D0=BB=D1=8F.=  
    - = =D0=9E=D1=82=D0=B7=D1=8B=D0=B2 =D0=B8=D0=B7=20 =D0=BE=D1=82=D0=BF=D1=83=D1=81=D0=BA=D0=B0. 
    - = =D0=91=D0=BE=D0=BB=D0=B5=D0=B7=D0=BD=D1=8C=20 =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BD=D0=B8=D0=BA=D0=B0 = =D0=B2=D0=BE =D0=B2=D1=80=D0=B5=D0=BC=D1=8F = =D0=BE=D1=82=D0=BF=D1=83=D1=81=D0=BA=D0=B0: = =D0=BF=D0=BE=D1=80=D1=8F=D0=B4=D0=BE=D0=BA = =D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D0=B8=D1=8F/=D0=BF= =D1=80=D0=BE=D0=B4=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20 =D0=BE=D1=82=D0=BF=D1=83=D1=81=D0=BA=D0=B0. 
    - = =D0=A0=D0=B0=D1=81=D1=87=D0=B5=D1=82=20 = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B5=D0=BD=D1=81=D0=B0=D1=86=D0=B8=D0=B8 = =D0=B7=D0=B0 = =D0=BD=D0=B5=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0= =BD=D0=BD=D1=8B=D0=B9 =D0=BE=D1=82=D0=BF=D1=83=D1=81=D0=BA = =D0=BF=D1=80=D0=B8=20 = =D1=83=D0=B2=D0=BE=D0=BB=D1=8C=D0=BD=D0=B5=D0=BD=D0=B8=D0=B8.
    .
    = =D0=A0=D0=B5=D0=BA=D0=BE=D0=BC=D0=B5=D0=BD=D0=B4=D0=B0=D1=86=D0=B8=D0=B8 = =D0=A0=D0=BE=D1=81=D1=82=D1=80=D1=83=D0=B4=D0=B0, = =D0=BE=D1=81=D0=BE=D0=B1=D0=B5=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=B8=D1=85=20 = =D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F. = =D0=9A=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D0=B9 = =D1=81=D1=83=D0=B4=D0=B5=D0=B1=D0=BD=D0=BE=D0=B9 = =D0=BF=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D0=BA=D0=B8.
         

    * * * * * * * * * * * = *

     

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

    <= /TD>        
    ------=_NextPart_000_0069_01D1A131.8EC1CCB0-- From mstsxfx@gmail.com Thu Apr 28 03:18:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 41D367D19 for ; Thu, 28 Apr 2016 03:18:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E7F6630404E for ; Thu, 28 Apr 2016 01:18:04 -0700 (PDT) X-ASG-Debug-ID: 1461831481-04bdf0358f2deda0001-NocioJ Received: from mail-wm0-f68.google.com (mail-wm0-f68.google.com [74.125.82.68]) by cuda.sgi.com with ESMTP id iqktnj5uhJdjjQuU (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 28 Apr 2016 01:18:02 -0700 (PDT) X-Barracuda-Envelope-From: mstsxfx@gmail.com X-Barracuda-Effective-Source-IP: mail-wm0-f68.google.com[74.125.82.68] X-Barracuda-Apparent-Source-IP: 74.125.82.68 Received: by mail-wm0-f68.google.com with SMTP id e201so20528680wme.2 for ; Thu, 28 Apr 2016 01:18:02 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=sgcWZ9N8CvqDSt9qEiuNIvUPz4mRTPDNhq2GxEwsWY8=; b=aBKAQ4RVBZ+e5DnmuFqtDgVe16kJOH93QaJFYSziXYMbWE16q9wupwpIH3RxXal4J9 YXsl8CyzWF+y0ZGqUTSoFrE3UiP0uAkCx/h0KWoSGLPCz2iHKPIRf0+mgPtw0XNSXWwm bkbCO2BEmGsVlEAHqdTirf+pDmNd8SQ6+fq04X7DwIlA1x+aTNWkzrd15uhTdlZTRAFQ WoQ/UpZgYYvMheepicjkrc6lqjhqeHqByMtqAxaTzx/U4cOvJN7jNuJdOdQk+S3djA1m DxjKfoo1xfq3BgEWuSNQMvvLZ30L/Gf9Dw4QYvZkacH0LZ/hxHjTxAeHMegLS2APCBbL Qzqg== X-Gm-Message-State: AOPr4FXhwEfoJNVf0wsAKKNDa4cG5FRN5dSqkrtyPuKv4toZanm/4Nb5TYk8RdqEfki+KQ== X-Received: by 10.28.141.18 with SMTP id p18mr14131460wmd.57.1461831481165; Thu, 28 Apr 2016 01:18:01 -0700 (PDT) Received: from localhost (nat1.scz.suse.com. [213.151.88.250]) by smtp.gmail.com with ESMTPSA id l124sm12648623wmf.11.2016.04.28.01.18.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 28 Apr 2016 01:18:00 -0700 (PDT) Date: Thu, 28 Apr 2016 10:17:59 +0200 From: Michal Hocko To: Dave Chinner Cc: linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, Andrew Morton , Jan Kara , xfs@oss.sgi.com, LKML Subject: Re: [PATCH 2/2] mm, debug: report when GFP_NO{FS,IO} is used explicitly from memalloc_no{fs,io}_{save,restore} context Message-ID: <20160428081759.GA31489@dhcp22.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 2/2] mm, debug: report when GFP_NO{FS,IO} is used explicitly from memalloc_no{fs,io}_{save,restore} context References: <1461671772-1269-1-git-send-email-mhocko@kernel.org> <1461671772-1269-3-git-send-email-mhocko@kernel.org> <20160426225845.GF26977@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160426225845.GF26977@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: mail-wm0-f68.google.com[74.125.82.68] X-Barracuda-Start-Time: 1461831482 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1182 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29125 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header [Trim the CC list] On Wed 27-04-16 08:58:45, Dave Chinner wrote: [...] > Often these are to silence lockdep warnings (e.g. commit b17cb36 > ("xfs: fix missing KM_NOFS tags to keep lockdep happy")) because > lockdep gets very unhappy about the same functions being called with > different reclaim contexts. e.g. directory block mapping might > occur from readdir (no transaction context) or within transactions > (create/unlink). hence paths like this are tagged with GFP_NOFS to > stop lockdep emitting false positive warnings.... As already said in other email, I have tried to revert the above commit and tried to run it with some fs workloads but didn't manage to hit any lockdep splats (after I fixed my bug in the patch 1.2). I have tried to find reports which led to this commit but didn't succeed much. Everything is from much earlier or later. Do you happen to remember which loads triggered them, what they looked like or have an idea what to try to reproduce them? So far I was trying heavy parallel fs_mark, kernbench inside a tiny virtual machine so any of those have triggered direct reclaim all the time. Thanks! -- Michal Hocko SUSE Labs From jtulak@redhat.com Thu Apr 28 03:29:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AC5297D21 for ; Thu, 28 Apr 2016 03:29:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 543418F8037 for ; Thu, 28 Apr 2016 01:29:14 -0700 (PDT) X-ASG-Debug-ID: 1461832151-04bdf0358e2e02c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Qf7P8nMt1ZFSGaO0 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 28 Apr 2016 01:29:12 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B29647F368; Thu, 28 Apr 2016 08:29:11 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3S8TA2k010416; Thu, 28 Apr 2016 04:29:11 -0400 From: Jan Tulak To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com Subject: [RFC PATCH] xfstests: Add mkfs input validation tests Date: Thu, 28 Apr 2016 10:29:09 +0200 X-ASG-Orig-Subj: [RFC PATCH] xfstests: Add mkfs input validation tests Message-Id: <1461832149-18276-1-git-send-email-jtulak@redhat.com> In-Reply-To: <1461231593-31294-1-git-send-email-jtulak@redhat.com> References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461832152 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9676 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Test inputs for my mkfs-cleaning patchset. This test will fail with the old sphageti code mkfs, among others because the old code accepts incorrect values. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak --- Hi guys, I'm sending this patch although the mentioned patchset is not yet merged. It might help you a bit with checking if there are any issues with the patchset, as here it is clear, what options works and what not. But because this test fails with how mkfs currently validates values (and some other things), maybe the merging of this patch should wait for the patchset. Cheers, Jan tests/xfs/400-input-validation | 226 +++++++++++++++++++++++++++++++++++++ tests/xfs/400-input-validation.out | 2 + tests/xfs/group | 1 + 3 files changed, 229 insertions(+) create mode 100755 tests/xfs/400-input-validation create mode 100644 tests/xfs/400-input-validation.out diff --git a/tests/xfs/400-input-validation b/tests/xfs/400-input-validation new file mode 100755 index 0000000..4ded2ef --- /dev/null +++ b/tests/xfs/400-input-validation @@ -0,0 +1,226 @@ +#! /bin/bash +# FS QA Test No. xfs/401 +# +# mkfs.xfs input validation test. Designed to break mkfs.xfs if it doesn't +# filter garbage input or invalid option combinations correctly. +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Red Hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here + +# Modify as appropriate. +_supported_fs xfs +_supported_os Linux +_require_scratch + +echo silence is golden + +# clear out any options to mkfs first. We want to test realtime and external log +# devices if we can, but we also want to control them ourselves. +logdev=$SCRATCH_LOGDEV +rtdev=$SCRATCH_RTDEV + +MKFS_OPTIONS= +SCRATCH_LOGDEV= +SCRATCH_RTDEV= + +# limit the image size of the filesystem being created to something small +fssize=$((4 * 1024 * 1024 * 1024)) +fsimg=$TEST_DIR/$seq.img + +do_mkfs_pass() +{ + echo >> $seqres.full + echo "pass expected $*" >> $seqres.full + $MKFS_XFS_PROG -f -N $* >> $seqres.full 2>&1 + [ $? -ne 0 ] && echo "fail $*" +} + +do_mkfs_fail() +{ + echo >> $seqres.full + echo "fail expected $*" >> $seqres.full + $MKFS_XFS_PROG -f -N $* >> $seqres.full 2>&1 + [ $? -eq 0 ] && echo "pass $*" +} + +do_mkfs_pass $SCRATCH_DEV + +# basic "should fail" options +# logarithm based options are no longer valid +# NOTE: umm, when it got invalid? It seems to be still supported... +#do_mkfs_fail -s log=10 $SCRATCH_DEV +#do_mkfs_fail -b log=10 $SCRATCH_DEV +#do_mkfs_fail -n log=10 $SCRATCH_DEV +#do_mkfs_fail -i log=10 $SCRATCH_DEV +#do_mkfs_fail -d sectlog=10 $SCRATCH_DEV +#do_mkfs_fail -l sectlog=10 $SCRATCH_DEV + +# specifying sector sizes in sectors or blocks or garbage +do_mkfs_fail -s size=2s $SCRATCH_DEV +do_mkfs_fail -d sectsize=2s $SCRATCH_DEV +do_mkfs_fail -l sectsize=2s $SCRATCH_DEV +do_mkfs_fail -s size=2b $SCRATCH_DEV +do_mkfs_fail -d sectsize=2b $SCRATCH_DEV +do_mkfs_fail -l sectsize=2b $SCRATCH_DEV + +do_mkfs_fail -s size=grot $SCRATCH_DEV +do_mkfs_fail -s size=2yerk $SCRATCH_DEV +do_mkfs_fail -d sectsize=blah $SCRATCH_DEV +do_mkfs_fail -d sectsize=2foo $SCRATCH_DEV +do_mkfs_fail -l sectsize=nggh $SCRATCH_DEV +do_mkfs_fail -l sectsize=2nggh $SCRATCH_DEV + +# conflicting sector/block sizes +do_mkfs_fail -s size=512 -d sectsize=1024 $SCRATCH_DEV +do_mkfs_fail -s size=512 -l sectsize=1024 $SCRATCH_DEV +do_mkfs_fail -d sectsize=2048 -l sectsize=1024 $SCRATCH_DEV + +do_mkfs_fail -b size=512 -s size=1024 $SCRATCH_DEV +do_mkfs_fail -b size=512 -d sectsize=1024 $SCRATCH_DEV +do_mkfs_fail -b size=512 -l sectsize=1024 $SCRATCH_DEV + +# specifying block sizes in sectors without specifying sector size +# or in blocks or garbage +do_mkfs_fail -b size=2s $SCRATCH_DEV +do_mkfs_fail -b size=2b $SCRATCH_DEV +do_mkfs_fail -b size=nfi $SCRATCH_DEV +do_mkfs_fail -b size=4096nfi $SCRATCH_DEV +do_mkfs_fail -n size=2s $SCRATCH_DEV +do_mkfs_fail -n size=2b $SCRATCH_DEV +do_mkfs_fail -n size=nfi $SCRATCH_DEV +do_mkfs_fail -n size=4096nfi $SCRATCH_DEV + +# bad label length +do_mkfs_fail -L thisiswaytoolong $SCRATCH_DEV + +# basic "should pass" data section tests +do_mkfs_pass $SCRATCH_DEV +do_mkfs_pass -d name=$SCRATCH_DEV +do_mkfs_pass -d size=$fssize $SCRATCH_DEV +do_mkfs_pass -d agcount=32 $SCRATCH_DEV +do_mkfs_pass -d agsize=32m $SCRATCH_DEV +do_mkfs_pass -d agsize=32M $SCRATCH_DEV +do_mkfs_pass -d agsize=1g $SCRATCH_DEV +do_mkfs_pass -d agsize=$((32 * 1024 * 1024)) $SCRATCH_DEV +do_mkfs_pass -b size=4096 -d agsize=8192b $SCRATCH_DEV +do_mkfs_pass -d sectsize=512,agsize=65536s $SCRATCH_DEV +do_mkfs_pass -s size=512 -d agsize=65536s $SCRATCH_DEV +do_mkfs_pass -d noalign $SCRATCH_DEV +do_mkfs_pass -d sunit=0,swidth=0 $SCRATCH_DEV +do_mkfs_pass -d sunit=8,swidth=8 $SCRATCH_DEV +do_mkfs_pass -d sunit=8,swidth=64 $SCRATCH_DEV +do_mkfs_pass -d su=0,sw=0 $SCRATCH_DEV +do_mkfs_pass -d su=4096,sw=1 $SCRATCH_DEV +do_mkfs_pass -d su=4k,sw=1 $SCRATCH_DEV +do_mkfs_pass -d su=4K,sw=8 $SCRATCH_DEV +do_mkfs_pass -b size=4096 -d su=1b,sw=8 $SCRATCH_DEV +do_mkfs_pass -d sectsize=512,su=8s,sw=8 $SCRATCH_DEV +do_mkfs_pass -s size=512 -d su=8s,sw=8 $SCRATCH_DEV + +# invalid data section tests +do_mkfs_fail -d size=${fssize}b $SCRATCH_DEV +do_mkfs_fail -d size=${fssize}s $SCRATCH_DEV +do_mkfs_fail -d size=${fssize}yerk $SCRATCH_DEV +do_mkfs_fail -d agsize=8192b $SCRATCH_DEV +do_mkfs_fail -d agsize=65536s $SCRATCH_DEV +do_mkfs_fail -d agsize=32Mbsdfsdo $SCRATCH_DEV +do_mkfs_fail -d agsize=1GB $SCRATCH_DEV +do_mkfs_fail -d agcount=1k $SCRATCH_DEV +do_mkfs_fail -d agcount=6b $SCRATCH_DEV +do_mkfs_fail -d agcount=32,agsize=32m $SCRATCH_DEV +do_mkfs_fail -d sunit=0,swidth=64 $SCRATCH_DEV +do_mkfs_fail -d sunit=64,swidth=0 $SCRATCH_DEV +do_mkfs_fail -d sunit=64,swidth=64,noalign $SCRATCH_DEV +do_mkfs_fail -d sunit=64k,swidth=64 $SCRATCH_DEV +do_mkfs_fail -d sunit=64,swidth=64m $SCRATCH_DEV +do_mkfs_fail -d su=0,sw=64 $SCRATCH_DEV +do_mkfs_fail -d su=4096,sw=0 $SCRATCH_DEV +do_mkfs_fail -d su=4096,sw=64,noalign $SCRATCH_DEV +do_mkfs_fail -d su=4096,sw=64s $SCRATCH_DEV +do_mkfs_fail -d su=4096s,sw=64 $SCRATCH_DEV +do_mkfs_fail -d su=4096b,sw=64 $SCRATCH_DEV +do_mkfs_fail -d su=4096garabge,sw=64 $SCRATCH_DEV +do_mkfs_fail -d su=4096,sw=64,sunit=64,swidth=64 $SCRATCH_DEV + +# file section, should pass +rm -f $fsimg +$XFS_IO_PROG -f -c "truncate $fssize" $fsimg +do_mkfs_pass -d size=$fssize,file,name=$fsimg +do_mkfs_pass -d size=$fssize,file $fsimg +do_mkfs_pass $fsimg +do_mkfs_pass -d size=$((fssize)) $fsimg +do_mkfs_pass -d size=$((fssize)),name=$fsimg +do_mkfs_pass -d size=$((fssize/2)) $fsimg +# again this one, to check that we didn't truncated the file +do_mkfs_pass -d size=$((fssize)) $fsimg + +# invalid file section tests +rm -f $fsimg +$XFS_IO_PROG -f -c "truncate $fssize" $fsimg +do_mkfs_fail -d file $fsimg +do_mkfs_fail -d file,name=$fsimg + +# naming section tests +do_mkfs_pass -n size=65536 $SCRATCH_DEV + +# boolean options +$XFS_IO_PROG -f -c "truncate $fssize" $fsimg +do_mkfs_pass -d file=1,size=$fssize $fsimg +do_mkfs_pass -d file=0 $SCRATCH_DEV +do_mkfs_fail -d file=1 $SCRATCH_DEV + +# Specific flag combinations where some bug appeared during development, +# to catch the same issue if it re-appears. If there are multiple similar +# checks, move them to a standalone block. + + +do_mkfs_pass -m crc=1,finobt=1 $SCRATCH_DEV + +do_mkfs_pass -m crc=1 -n ftype=1 $SCRATCH_DEV +do_mkfs_pass -m crc=0 -n ftype=1 $SCRATCH_DEV +do_mkfs_fail -m crc=1 -n ftype=0 $SCRATCH_DEV +do_mkfs_pass -m crc=0 -n ftype=0 $SCRATCH_DEV +do_mkfs_pass -n ftype=1 -m crc=0 $SCRATCH_DEV + + +# if user states crc=0,finobt=1, fail instead of warning +do_mkfs_fail -m crc=0,finobt=1 $SCRATCH_DEV + +status=0 +exit diff --git a/tests/xfs/400-input-validation.out b/tests/xfs/400-input-validation.out new file mode 100644 index 0000000..7080553 --- /dev/null +++ b/tests/xfs/400-input-validation.out @@ -0,0 +1,2 @@ +QA output created by 400-input-validation +silence is golden diff --git a/tests/xfs/group b/tests/xfs/group index f4c6816..b51ef2e 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -285,3 +285,4 @@ 303 auto quick quota 304 auto quick quota 305 auto quota +400-input-validation auto quick mkfs -- 2.5.0 From nikki.fenn@lox-onlinesolutions.com Thu Apr 28 15:51:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.8 required=5.0 tests=FILL_THIS_FORM, FILL_THIS_FORM_LONG,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6E5EB7CE5 for ; Thu, 28 Apr 2016 15:51:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1778130404E for ; Thu, 28 Apr 2016 13:51:16 -0700 (PDT) X-ASG-Debug-ID: 1461876672-04bdf0359633cb90001-NocioJ Received: from na01-by2-obe.outbound.protection.outlook.com (mail-by2on0070.outbound.protection.outlook.com [207.46.100.70]) by cuda.sgi.com with ESMTP id 0kjmRVLEtZGhIoCG (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NO) for ; Thu, 28 Apr 2016 13:51:12 -0700 (PDT) X-Barracuda-Envelope-From: nikki.fenn@lox-onlinesolutions.com X-Barracuda-Effective-Source-IP: mail-by2on0070.outbound.protection.outlook.com[207.46.100.70] X-Barracuda-Apparent-Source-IP: 207.46.100.70 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NETORGFT1355101.onmicrosoft.com; s=selector1-loxonlinesolutions-com0i; h=From:To:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=8OCgYaHUlOVaYrvjdyngfXN+eedbrtlIsaIMtQ0P3U0=; b=eOBSOqs5k3fDXO/qosq6PDbiHR58py/6w676qjKXxRIyEKnCxpkEqHd5QnilqZbzmSCay1PHInQsCHVjQW2OXayqC01QcK/kaeMUrl2Ai11Sq7tTCa2wUMs7OGipOLPUTtzAl7SEiUYMbljyNsJjugswaO76r2WeuWF2cySbj70= Authentication-Results: oss.sgi.com; dkim=none (message not signed) header.d=none;oss.sgi.com; dmarc=none action=none header.from=lox-onlinesolutions.com; Received: from KaleemPC (43.247.156.6) by CO2PR15MB0105.namprd15.prod.outlook.com (10.161.86.18) with Microsoft SMTP Server (TLS) id 15.1.477.8; Thu, 28 Apr 2016 20:51:09 +0000 Return-Receipt-To: nikki.fenn From: nikki.fenn To: Subject: Hadoop Users DB Date: Thu, 28 Apr 2016 16:49:23 -0400 X-ASG-Orig-Subj: Hadoop Users DB Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_2506_01D1A16E.29D71110" X-Mailer: Microsoft Outlook 15.0 Thread-Index: AdGhj2sIsUGrgQeHTwOxj60g+pMdoA== Content-Language: en-us X-Originating-IP: [43.247.156.6] X-ClientProxiedBy: MA1PR01CA0019.INDPRD01.PROD.OUTLOOK.COM (10.164.117.26) To CO2PR15MB0105.namprd15.prod.outlook.com (10.161.86.18) X-MS-Office365-Filtering-Correlation-Id: 94292ee0-fc77-41b1-58fa-08d36fa6d443 X-Microsoft-Exchange-Diagnostics: 1;CO2PR15MB0105;2:0kFf/8l7DlH2MzwyKH7yO/is7rSnT9DY4x7iSDG5aLGq8FeqpKr5ZiifG8oJxJzk86s+2CC9lTsgrT90uV1VpHfJAN+ZX8BxIZ1LxmL8r0KzjhVbq13ox+LtdONLDAMOnHc//pyfjRS38a4DokWbRixBm8yXbt29d+BGWWLNRbG6dWjZFThgmwnbwqmSkapG;3:YcJC96RQiAzz3suLbLw8Hbt1NF5kEddznMQMeLM8eoySrDPZbEzGZHCzbv2aPQtuD3ip5VwakiBCsIEqNXIxxm3kRs7Zbc7zHDHMtAMcMIC0BLFpOzMMGI4z+smz7MaA X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CO2PR15MB0105; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CO2PR15MB0105;25:IdRVxDts4AfvbS/1KnDj51dkkwrFkHbXDLs/xFtB/?= =?us-ascii?Q?W5DMtNtZX1obqVbGi9362jou01G7G9yd5/5xh4RDSNigfQR6FBtTACcjU6Qv?= =?us-ascii?Q?1bEJVA/7XaSnhPp15CT2Zq1WLHqZPoUw638EewACbt/KKPOU3oHj1Yefr/C1?= =?us-ascii?Q?GZfv4eXp3ZWZVyHQqGcosaS4hMsNXRzL+rDzIykymhZWh263BjNj0HEdxgDW?= =?us-ascii?Q?V43YKimDtkhrCcJG5B32caSgz2QNWZqJVkx7hg0+EeVjcQ3ZccQtfKWaeEMb?= =?us-ascii?Q?JlCG5bD+M8OTHBOJdrqiQin4PRrQAJkDmzLPMx/p7XIp4MT2YXQSGjHi08j8?= =?us-ascii?Q?XpK8FREhY7Q5jeAbWd/u5/cpaFbF/PmuPFFJhCVpxmLLNRpd9AsfEhK2xrGN?= =?us-ascii?Q?0G9v0i08iK/reRWLxbNQav+7ZJimlCnjm8dYl0qsyCvIKC/kDwRdwcHbFWaV?= =?us-ascii?Q?3cJxpAzTquoSKXCbxo9v+2GsC8QxaiT01d5bfXmPhPvYWJCbuajlzXcnm+eU?= =?us-ascii?Q?zSyaUP+/5GpKBjQ3MDe+Ia7XI46zCp5GW4RliLVkV3NDVWDwTXyE3CPur/r4?= =?us-ascii?Q?Yk+kkfywP9uCZBCX0K5kjI2jCcDMzM0nU5ehXKSCGwbyWtxrOb8Vq40mXXlB?= =?us-ascii?Q?v09kzM01WSIo2U9MWMQtNquMry61B4kNGFezxmTVCXAiEnIHGMnQk4pPurtP?= =?us-ascii?Q?rwMUFZ/ums/8R7sMiX6hjskgYLBpWroXw/FnEu+PD8TaHmusHSUk4jZ8wSmX?= =?us-ascii?Q?snRhlW4PTBHwe1eh/jZXd7h5RG6+0xcgja+X/Dw6T++Hf0AffpMKhLrMUSMI?= =?us-ascii?Q?7AssGGUh48sqQak+4vI+1E9Fc+3yAnK33YKqnxxoM7kxrZTK1rqoxcJZL64j?= =?us-ascii?Q?CnqAOHt+AIKeQxGW0iO8JJ3H6QxLPM50yrAbO5StGZ6IxrRrEHMSl3/52b9Z?= =?us-ascii?Q?3wiS+YuSTwxWvn2ZUltFfDaHVUYTWK4ouVzkpuqt9US1wyZE+eQMTdWi7LmS?= =?us-ascii?Q?Ng=3D?= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(9101521072)(6040130)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(6041072)(6043046);SRVR:CO2PR15MB0105;BCL:0;PCL:0;RULEID:;SRVR:CO2PR15MB0105; X-Microsoft-Exchange-Diagnostics: 1;CO2PR15MB0105;4:zgeHyd5W9NA7Iy4Jan+np/kcAkYVcW4xXrVbzsAAu5rLMFlCrAzNxNUGaRiH7cO+pCS+PAD7D1in16cVQZ1jlEh9T8VHsindxNHIpv6oRZ1Dgj9qoQZbhn+9q3WvjW7l6bu5291SWwBUzIQu20g+GrVn87du9786PeE1OjAstpDlxQeZ8Lud5cJhb8h4xzdjW4suMSNV4JfXO4z8EW1AcO0l6aeZ/gX21YEK6yOQAqABoORlgqto0k7BM4GJEmctzbAC07wiWSiDbF3Mh/+CaHNVhb0SuRvZnhYPslHP7khXm6wjgGGxKknP8hrVsYFoZ8yiHFMbQosepjIhlQD3ryGd8frSMDp/ZHVCl/ZKMiTH9VIGC7v97xgDoYL1xTy32XkfOO5fFl5WKnklcR9Nfd+ZYvHdtLJmWWGGtuwvmBLcVSSpab3cKxWG08SXOoWIMt8i8ng9KoQRhrDTTO9k2A== X-Forefront-PRVS: 0926B0E013 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(36756003)(512954002)(66066001)(92566002)(107886002)(189998001)(1096002)(3846002)(5005140100001)(5008740100001)(50986999)(110136002)(42186005)(71636004)(16236675004)(450100001)(61296003)(19625215002)(77096005)(88246002)(15975445007)(72586001)(19300405004)(19580395003)(84326002)(5004730100002)(586003)(86362001)(9326002)(9476002)(102836003)(81166005)(270700001)(260700001)(50226002)(2351001)(3480700004)(19617315012)(229853001)(6116002)(790700001)(2906002);DIR:OUT;SFP:1101;SCL:1;SRVR:CO2PR15MB0105;H:KaleemPC;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CO2PR15MB0105;23:hiR3fA+NaGLAKzIjzJIWPTgwgpl1V3DNsYmEip5XE?= =?us-ascii?Q?Z27ODyiLx2Cn8fBBCoOlm9OpJw/AYWjLbnp82BvYaQYGYX3wj5OD4OlQ1M0a?= =?us-ascii?Q?v0wc1HYqYKdQG35ydriUu9vYL5FXR+JEmSPj9UV21ST4wFQG1tAsyLp5y6Kd?= =?us-ascii?Q?9CHhpQBJHH4NWUVzy6y9ESh0RwSzMwx5Czc7XEKWjT1w0YokEHKvA1ARF6et?= =?us-ascii?Q?cjSTakrsbjWOIzFW6N+7qVZ+EWm3F7DxBB999WtAb7Uo6SFOjcWjrkBZjAc6?= =?us-ascii?Q?9lQxLb+nmNV2RRJ7mo/vGadzHtOAN/pqsJo8qUU8X9KrXG8btp4fI1kNYkTj?= =?us-ascii?Q?kincvbqgciAGS2MkkskH5TM6x4ESZOBhTA4C3RW650olkbkPw5q13Oi831KO?= =?us-ascii?Q?CTii174Wa6uaap8eeQ0u2zRZ3MfPw9nbfjAcoztNYJjQgvmWbVk3fpbLRSjH?= =?us-ascii?Q?Ql1NdLlX0Qq7pOwXS4uGxUgZ/Wwua/7DZzfskq5zMU8h45xMARwsUuO/enN3?= =?us-ascii?Q?7LiThuYDd2yFN0FsGTZgn02wHLiSeaq8nOchC1wsTw/sZ7mHGpLPFzfrsrya?= =?us-ascii?Q?OrVekNMUwMdR64CYyLZeW7dA5EaM3MCgwKbQjZbepnLUkXkHvxfKmgcycX5M?= =?us-ascii?Q?4yCkGvjXL1WwWb43f7t6sKBHibqaBGYxQRQYuyD3QVg5eUlb2IC4tjdrYe9a?= =?us-ascii?Q?G6pF9FyJ1p+BAztjiHTh9fEIAbvZa5yHBaOgphgzE/Ws3jkQB6kT8uHj7hRd?= =?us-ascii?Q?aJ8lAOs/YY1yar4i7SQf/j0C81KebC3HRlXlMooduVHP8/WkOUsazIAN0ktS?= =?us-ascii?Q?YgrcBaJNNluL2i/TGMma/RmUVKk7eZM9ImJgTUTQjLqcnWMji9zAP8gShAHz?= =?us-ascii?Q?iKHIrNF6AlFyKdF36PY/I9dBTAaC9J3qnkulCyeYrDgyXwCocvzgS35hzfR/?= =?us-ascii?Q?8b8aaM4OVyLASQI5Z7G4bV+uA4FXAhWGNv3rSL87V56LNmPHDzCN8D9Uy+lk?= =?us-ascii?Q?jAZ5Ih19dvovF+TxEOfY3CowQkIRkz2LrQmfLiK1fkU5KHkSuifHFJoizzLm?= =?us-ascii?Q?Xb+/WKqbCle8oOlnWDMSVCIIfAembLSXq3k7pPsWL1F/n243wrfGNNwouX3A?= =?us-ascii?Q?OkhT3kOH8d0QWjibpDgs+l6nYTKOQCLrFmPLfj54DdbbpEJWifW0Q=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;CO2PR15MB0105;5:uxaA0hq7a4XRQQYw2zhAFoFCf7DEk7h+u3vP24OJ8XHAOHsyAyqWOftgoXzuaPy5SKAH6pr8GKSAgyjnS8SfW16QLnFxn3yU4iXy7EsLfq/W4aUbG23Ja722USG4Eqv8I5caIVOo8kZb+N8FGj2+KQ==;24:MKJ+R8+03sX0pdB4e5v541pjtRijzswu7/K+ygtFJ2C/a0HZ2oVquFegj39eQUULg9hHMY5wxNcIJE6GNln/kZAENvkj7sIoVG634Kg5+Hc=;7:tS1LHPx4tu4SfkY/0qeZO+BBajI1nRKAq2D0qipXV/o3HxR5H4ufOPJFLSSVzVk0OO9dkAO3gzZDgfGqztjLBbDsJGQBryvuEjABK0gbMvrvxhGMc9WPMoQ7DQscu7wYPjYs1a5IrLPhPvzTE6NzKu0IMY9rRZBuTIUaOlPyFvSOLEBjOq2SLVjwg5aNR/QZ SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: lox-onlinesolutions.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Apr 2016 20:51:09.9247 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO2PR15MB0105 X-Barracuda-Connect: mail-by2on0070.outbound.protection.outlook.com[207.46.100.70] X-Barracuda-Start-Time: 1461876672 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 13482 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29138 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message ------=_NextPart_000_2506_01D1A16E.29D71110 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hi, Are you looking to reach Companies that Use Bigdata & Hadoop Systems? GoodData Users List Pentaho users list Cloudera users list Hortonworks users list SQLstream users list Datawatch users list CrowdFlower users list EdgeMagic users list Datameer users list IBM SPSS users list Encompass users list All lists with emails, phone, mailing address List Contains: - Name, Title, Email, Phone, Company Name, Physical Address, City, State, Zip Code, Country, Web Address, Employee Size, Revenue Size and Industry. Geography we cover: - USA, Europe, Asia, Australia, Middle East, Africa with 100% database and data usage for multi-channel marketing purpose. We also provide specific title contacts like:- * CEOs, IT Decision Makers, Sales and Marketing Decision Makers, HR Decision Makers, Finance Decision Makers. Note: If Bigdata or Hadoop Users is not relevant to you please reply back with your Target Market, we have all types of target market available. Look forward to do business with you Regards, Nikki Fenn Database coordinator To opt out please response REMOVE ------=_NextPart_000_2506_01D1A16E.29D71110 Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

    Hi,

     

    Are you looking to = reach Companies that Use Bigdata & Hadoop = Systems?

     

    GoodData Users List

    Pentaho users = list

    Cloudera users = list

    Hortonworks users = list

    SQLstream users = list

    Datawatch users list

    CrowdFlower users list

    EdgeMagic users = list

    Datameer users = list

    IBM SPSS users list

    Encompass users list

    All lists with emails, phone, mailing = address

     

    List Contains: = - Name, Title, Email, Phone, = Company Name, Physical Address, City, State, Zip Code, Country, Web = Address, Employee Size, Revenue Size and = Industry.

     

    Geography we = cover: - USA, Europe, Asia, = Australia, Middle East, Africa with 100% database and data usage for = multi-channel marketing purpose.

     

    We also provide = specific title contacts like:-

    Ø  CEOs, IT Decision Makers, Sales and Marketing Decision = Makers, HR Decision = Makers, Finance Decision = Makers.

     

    Note: = If Bigdata or Hadoop Users is not relevant to you please reply = back with your Target Market, we have all types of target market = available.

     

    Look forward to do = business with you

     

    Regards,

     

    Nikki = Fenn

    Database coordinator

     

    To opt out please = response REMOVE

     

     

     

    ------=_NextPart_000_2506_01D1A16E.29D71110-- From bounces+2504343-36b9-xfs=oss.sgi.com@sg.stampready.net Thu Apr 28 16:14:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY, SPOOFED_URL_HOST,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 3027C7CEA for ; Thu, 28 Apr 2016 16:14:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id AB029AC002 for ; Thu, 28 Apr 2016 14:14:17 -0700 (PDT) X-ASG-Debug-ID: 1461878045-04bdf0359633f270001-NocioJ Received: from o3.server2.stampready.net (o3.server2.stampready.net [167.89.25.94]) by cuda.sgi.com with ESMTP id bbW5YqAjAaf8dENX (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 28 Apr 2016 14:14:06 -0700 (PDT) X-Barracuda-Envelope-From: bounces+2504343-36b9-xfs=oss.sgi.com@sg.stampready.net X-Barracuda-Effective-Source-IP: o3.server2.stampready.net[167.89.25.94] X-Barracuda-Apparent-Source-IP: 167.89.25.94 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=stampready.net; h=content-transfer-encoding:content-type:from:mime-version:subject:to; s=s1; bh=M8u+tMM0LU5PDXM5cEkYg2jVtpM=; b=v6qB0uvINDOt4ZUZyiGJOx5 rEHvuR9J+/jIh8eLEPiV4bsnqeu6hHmNLYCNnBxkfd7ODlr3XfnUAMA5qDb1fPrQ rUeD1XsPTLseEKvJvCXO4wZZ7q5umkudT9W+ct/393WbZGU95POmD4rMh5Hy1+PS Tcx/BMnsLZpiZ0rmcpNw= Received: by filter0563p1mdw1.sendgrid.net with SMTP id filter0563p1mdw1.32474.57227BD24F 2016-04-28 21:08:34.604693474 +0000 UTC Received: from MjUwNDM0Mw (srv1.n-i-c-e.nl [128.140.221.60]) by ismtpd0004p1lon1.sendgrid.net (SG) with HTTP id c3mn7WfAQaeEsLMN1uHE_g for ; Thu, 28 Apr 2016 21:08:34.609 +0000 (UTC) Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=UTF-8 Date: Thu, 28 Apr 2016 21:08:34 +0000 From: "KOA CCTV" Mime-Version: 1.0 Subject: A New Approach to Home Security To: xfs@oss.sgi.com X-ASG-Orig-Subj: A New Approach to Home Security Message-ID: X-SG-EID: GPcH5AR4FNxUx3/k94obBuFzds479X57W1U837jaM3f4txgcJ3tpKoU6WSen+PxVQ3tDZ+OsXZFcZQ /thPzrewbxSzcmP0N+bNK+BbjP96hI6AU2ecQ2ZqNAxDehyFjhXVwxO7oeKHigKW1pqTq68oewjy+/ 7jeFvsCiZBMPWOM5snRqGEmRiQ2iDJMTkC+LfwgQVMPPOqMkTGRElK/Dmw== X-SG-ID: R3ufbdLo2r/cRGFtfGlyBm6viTuYogAP4/CU4N7C6Sy02hhezqA2AbNfiV7f8Dd/XHc6cZ5xIPC8x4 jHLBWBHKFMaBtOZWzjs1NVfddLHWLCgKQW+OZcdeadr2aEcq0NMyIE+9MetNLowpgkf2ldCe/BFHh/ JjAhmKTyslE9FISbMJcOpuTr0jHUoqtbKbk+X5Kp94AfowoVq9dUHBplWA== X-Barracuda-Connect: o3.server2.stampready.net[167.89.25.94] X-Barracuda-Start-Time: 1461878046 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 67080 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29138 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message ProductMai= l - Responsive E-mail TemplateNever miss a visitor =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=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"Logo"
    = ABOUT US | CONTACT US | EVENTS
    Customer Service 818-255-6666
    Toll Free 866-606-5229
    =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09
    KOACCTV specializes in the wholesale distribution of CCTV C= ameras, Audio, Video and Home Innovation. We support many top leading manuf= acturers and continue to bring you the latest in technology. We carry all r= espected lines including Hikvision, HEOS, Boston Acoustics, Denon, Lutron, = Louroe, Key Digital, Zigen Samsung, Monitor Audio, Ubiquiti Networks, = Fibaro, Klein Tools...
     All installers are welcome.
    Visit Our Website<= /span>
     
    What's New
    =20=20
    =20= =20 3D"space"
    With Ring, you=E2=80=99re always home.
    3D"header-image"
    =09=09=09 =09=09 =09 =09=09=09 =09=09 =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"space"
    3D"image10_280x224"
             Ring Video D= oorbell Pro
     
    3D"image11_280x224"
              Ring Video Doorbel= l

     

    3D"image12_280x224"
               Ring Stick U= p Cam
     
    3D"image13_280x224"
                  &nbs= p;   Ring Chime
    =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =09 =09=09=09 =09=09 =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"space"
    3D"icon-facebook" 3D"icon-twitter" 3D"icon-twitter" 3D"icon-twitter" 3D"icon-twitter" 3D"icon-twitter" 3D"icon-googleplus" 3D"icon-rss" 3D"icon-vimeo"
    =09=09=09 =09=09 =09 =09=09=09 =09=09
    3D"space"
    3D"icon-facebook" 3D"icon-facebook" 3D"icon-twitter" 3D"icon-twitter" 3D"icon-twitter" 3D"icon-twitter" 3D"icon-twitter" 3D"icon-googleplus" 3D"icon-rss"
    =20=20
    =20= =20 3D"space"
    3D"ic= 3D"icon-tw=
    =09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=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"" From vishal.l.verma@intel.com Thu Apr 28 16:17:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5E1FA7CE7 for ; Thu, 28 Apr 2016 16:17:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B87EEAC002 for ; Thu, 28 Apr 2016 14:17:21 -0700 (PDT) X-ASG-Debug-ID: 1461878240-04cb6c09a1352b80001-NocioJ Received: from mga14.intel.com ([192.55.52.115]) by cuda.sgi.com with ESMTP id 5lnVjDFH9TCBzX6T for ; Thu, 28 Apr 2016 14:17:20 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Effective-Source-IP: UNKNOWN[192.55.52.115] X-Barracuda-Apparent-Source-IP: 192.55.52.115 X-ASG-Whitelist: Client Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga103.fm.intel.com with ESMTP; 28 Apr 2016 14:17:19 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,548,1455004800"; d="scan'208";a="942415512" Received: from omniknight.lm.intel.com ([10.232.112.171]) by orsmga001.jf.intel.com with ESMTP; 28 Apr 2016 14:17:18 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Vishal Verma , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dan Williams , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig , Jeff Moyer Subject: [PATCH v4 0/7] dax: handling media errors Date: Thu, 28 Apr 2016 15:16:51 -0600 X-ASG-Orig-Subj: [PATCH v4 0/7] dax: handling media errors Message-Id: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 X-Barracuda-Connect: UNKNOWN[192.55.52.115] X-Barracuda-Start-Time: 1461878240 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3168 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Until now, dax has been disabled if media errors were found on any device. This series attempts to address that. The first three patches from Dan re-enable dax even when media errors are present. The fourth patch from Matthew removes the zeroout path from dax entirely, making zeroout operations always go through the driver (The motivation is that if a backing device has media errors, and we create a sparse file on it, we don't want the initial zeroing to happen via dax, we want to give the block driver a chance to clear the errors). The fifth patch changes how DAX IO is re-routed as direct IO. We add a new iocb flag for DAX to distinguish it from actual direct IO, and if we're in O_DIRECT, use the regular direct_IO path instead of DAX. This gives us an opportunity to do recovery by doing O_DIRECT writes that will go through the driver to clear errors from bad sectors. Patch 6 reduces our calls to clear_pmem from dax in the truncate/hole-punch cases. We check if the range being truncated is sector aligned/sized, and if so, send blkdev_issue_zeroout instead of clear_pmem so that errors can be handled better by the driver. Patch 7 fixes a redundant comment in DAX and is mostly unrelated to the rest of this series. This series also depends on/is based on Jan Kara's DAX Locking fixes series [1]. [1]: http://www.spinics.net/lists/linux-mm/msg105819.html v4: - Remove the dax->direct_IO fallbacks entirely. Instead, go through the usual direct_IO path when we're in O_DIRECT, and use dax_IO for other, non O_DIRECT IO. (Dan, Christoph) v3: - Wrapper-ize the direct_IO fallback again and make an exception for -EIOCBQUEUED (Jeff, Dan) - Reduce clear_pmem usage in DAX to the minimum Dan Williams (3): block, dax: pass blk_dax_ctl through to drivers dax: fallback from pmd to pte on error dax: enable dax in the presence of known media errors (badblocks) Matthew Wilcox (1): dax: use sb_issue_zerout instead of calling dax_clear_sectors Vishal Verma (3): fs: prioritize and separate direct_io from dax_io dax: for truncate/hole-punch, do zeroing through the driver if possible dax: fix a comment in dax_zero_page_range and dax_truncate_page arch/powerpc/sysdev/axonram.c | 10 +++--- block/ioctl.c | 9 ----- drivers/block/brd.c | 9 ++--- drivers/block/loop.c | 2 +- drivers/nvdimm/pmem.c | 17 +++++++--- drivers/s390/block/dcssblk.c | 12 +++---- fs/block_dev.c | 19 ++++++++--- fs/dax.c | 78 +++++++++++++++---------------------------- fs/ext2/inode.c | 23 ++++++++----- fs/ext4/file.c | 2 +- fs/ext4/inode.c | 19 +++++++---- fs/xfs/xfs_aops.c | 20 +++++++---- fs/xfs/xfs_bmap_util.c | 15 +++------ fs/xfs/xfs_file.c | 4 +-- include/linux/blkdev.h | 3 +- include/linux/dax.h | 1 - include/linux/fs.h | 15 +++++++-- mm/filemap.c | 4 +-- 18 files changed, 134 insertions(+), 128 deletions(-) -- 2.5.5 From vishal.l.verma@intel.com Thu Apr 28 16:17:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6CAFC7CE8 for ; Thu, 28 Apr 2016 16:17:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D93A3AC002 for ; Thu, 28 Apr 2016 14:17:22 -0700 (PDT) X-ASG-Debug-ID: 1461878240-04cb6c09a1352b80002-NocioJ Received: from mga14.intel.com ([192.55.52.115]) by cuda.sgi.com with ESMTP id OF1PrSiA2CeKUxE6 for ; Thu, 28 Apr 2016 14:17:21 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Effective-Source-IP: UNKNOWN[192.55.52.115] X-Barracuda-Apparent-Source-IP: 192.55.52.115 X-ASG-Whitelist: Client Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga103.fm.intel.com with ESMTP; 28 Apr 2016 14:17:20 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,548,1455004800"; d="scan'208";a="942415523" Received: from omniknight.lm.intel.com ([10.232.112.171]) by orsmga001.jf.intel.com with ESMTP; 28 Apr 2016 14:17:19 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Dan Williams , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig , Jeff Moyer Subject: [PATCH v4 1/7] block, dax: pass blk_dax_ctl through to drivers Date: Thu, 28 Apr 2016 15:16:52 -0600 X-ASG-Orig-Subj: [PATCH v4 1/7] block, dax: pass blk_dax_ctl through to drivers Message-Id: <1461878218-3844-2-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> References: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> X-Barracuda-Connect: UNKNOWN[192.55.52.115] X-Barracuda-Start-Time: 1461878240 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6648 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dan Williams This is in preparation for doing badblocks checking against the requested sector range in the driver. Currently we opportunistically return as much data that can be "dax'd" starting at the given sector. When errors are present we want to limit that range to the first encountered error, or fail the dax request if the range encompasses an error. Signed-off-by: Dan Williams --- arch/powerpc/sysdev/axonram.c | 10 +++++----- drivers/block/brd.c | 9 +++++---- drivers/nvdimm/pmem.c | 9 +++++---- drivers/s390/block/dcssblk.c | 12 ++++++------ fs/block_dev.c | 2 +- include/linux/blkdev.h | 3 +-- 6 files changed, 23 insertions(+), 22 deletions(-) diff --git a/arch/powerpc/sysdev/axonram.c b/arch/powerpc/sysdev/axonram.c index 0d112b9..d85673f 100644 --- a/arch/powerpc/sysdev/axonram.c +++ b/arch/powerpc/sysdev/axonram.c @@ -139,17 +139,17 @@ axon_ram_make_request(struct request_queue *queue, struct bio *bio) /** * axon_ram_direct_access - direct_access() method for block device - * @device, @sector, @data: see block_device_operations method + * @dax: see block_device_operations method */ static long -axon_ram_direct_access(struct block_device *device, sector_t sector, - void __pmem **kaddr, pfn_t *pfn) +axon_ram_direct_access(struct block_device *device, struct blk_dax_ctl *dax) { + sector_t sector = get_start_sect(device) + dax->sector; struct axon_ram_bank *bank = device->bd_disk->private_data; loff_t offset = (loff_t)sector << AXON_RAM_SECTOR_SHIFT; - *kaddr = (void __pmem __force *) bank->io_addr + offset; - *pfn = phys_to_pfn_t(bank->ph_addr + offset, PFN_DEV); + dax->addr = (void __pmem __force *) bank->io_addr + offset; + dax->pfn = phys_to_pfn_t(bank->ph_addr + offset, PFN_DEV); return bank->size - offset; } diff --git a/drivers/block/brd.c b/drivers/block/brd.c index 51a071e..71521c1 100644 --- a/drivers/block/brd.c +++ b/drivers/block/brd.c @@ -380,9 +380,10 @@ static int brd_rw_page(struct block_device *bdev, sector_t sector, } #ifdef CONFIG_BLK_DEV_RAM_DAX -static long brd_direct_access(struct block_device *bdev, sector_t sector, - void __pmem **kaddr, pfn_t *pfn) +static long brd_direct_access(struct block_device *bdev, + struct blk_dax_ctl *dax) { + sector_t sector = get_start_sect(bdev) + dax->sector; struct brd_device *brd = bdev->bd_disk->private_data; struct page *page; @@ -391,8 +392,8 @@ static long brd_direct_access(struct block_device *bdev, sector_t sector, page = brd_insert_page(brd, sector); if (!page) return -ENOSPC; - *kaddr = (void __pmem *)page_address(page); - *pfn = page_to_pfn_t(page); + dax->addr = (void __pmem *)page_address(page); + dax->pfn = page_to_pfn_t(page); return PAGE_SIZE; } diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c index f798899..f72733c 100644 --- a/drivers/nvdimm/pmem.c +++ b/drivers/nvdimm/pmem.c @@ -181,14 +181,15 @@ static int pmem_rw_page(struct block_device *bdev, sector_t sector, return rc; } -static long pmem_direct_access(struct block_device *bdev, sector_t sector, - void __pmem **kaddr, pfn_t *pfn) +static long pmem_direct_access(struct block_device *bdev, + struct blk_dax_ctl *dax) { + sector_t sector = get_start_sect(bdev) + dax->sector; struct pmem_device *pmem = bdev->bd_disk->private_data; resource_size_t offset = sector * 512 + pmem->data_offset; - *kaddr = pmem->virt_addr + offset; - *pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags); + dax->addr = pmem->virt_addr + offset; + dax->pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags); return pmem->size - pmem->pfn_pad - offset; } diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c index b839086..613f587 100644 --- a/drivers/s390/block/dcssblk.c +++ b/drivers/s390/block/dcssblk.c @@ -30,8 +30,8 @@ static int dcssblk_open(struct block_device *bdev, fmode_t mode); static void dcssblk_release(struct gendisk *disk, fmode_t mode); static blk_qc_t dcssblk_make_request(struct request_queue *q, struct bio *bio); -static long dcssblk_direct_access(struct block_device *bdev, sector_t secnum, - void __pmem **kaddr, pfn_t *pfn); +static long dcssblk_direct_access(struct block_device *bdev, + struct blk_dax_ctl *dax) static char dcssblk_segments[DCSSBLK_PARM_LEN] = "\0"; @@ -883,9 +883,9 @@ fail: } static long -dcssblk_direct_access (struct block_device *bdev, sector_t secnum, - void __pmem **kaddr, pfn_t *pfn) +dcssblk_direct_access(struct block_device *bdev, struct blk_dax_ctl *dax) { + sector_t secnum = get_start_sect(bdev) + dax->sector; struct dcssblk_dev_info *dev_info; unsigned long offset, dev_sz; @@ -894,8 +894,8 @@ dcssblk_direct_access (struct block_device *bdev, sector_t secnum, return -ENODEV; dev_sz = dev_info->end - dev_info->start; offset = secnum * 512; - *kaddr = (void __pmem *) (dev_info->start + offset); - *pfn = __pfn_to_pfn_t(PFN_DOWN(dev_info->start + offset), PFN_DEV); + dax->addr = (void __pmem *) (dev_info->start + offset); + dax->pfn = __pfn_to_pfn_t(PFN_DOWN(dev_info->start + offset), PFN_DEV); return dev_sz - offset; } diff --git a/fs/block_dev.c b/fs/block_dev.c index b25bb23..79defba 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -488,7 +488,7 @@ long bdev_direct_access(struct block_device *bdev, struct blk_dax_ctl *dax) sector += get_start_sect(bdev); if (sector % (PAGE_SIZE / 512)) return -EINVAL; - avail = ops->direct_access(bdev, sector, &dax->addr, &dax->pfn); + avail = ops->direct_access(bdev, dax); if (!avail) return -ERANGE; if (avail > 0 && avail & ~PAGE_MASK) diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 669e419..9d8c6d5 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1656,8 +1656,7 @@ struct block_device_operations { int (*rw_page)(struct block_device *, sector_t, struct page *, int rw); int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); - long (*direct_access)(struct block_device *, sector_t, void __pmem **, - pfn_t *); + long (*direct_access)(struct block_device *, struct blk_dax_ctl *dax); unsigned int (*check_events) (struct gendisk *disk, unsigned int clearing); /* ->media_changed() is DEPRECATED, use ->check_events() instead */ -- 2.5.5 From vishal.l.verma@intel.com Thu Apr 28 16:17:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B058A7CE7 for ; Thu, 28 Apr 2016 16:17:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 31C05AC002 for ; Thu, 28 Apr 2016 14:17:24 -0700 (PDT) X-ASG-Debug-ID: 1461878242-04cb6c09a2352ba0001-NocioJ Received: from mga14.intel.com ([192.55.52.115]) by cuda.sgi.com with ESMTP id iqqwqQmV9y8tPb8E for ; Thu, 28 Apr 2016 14:17:23 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Effective-Source-IP: UNKNOWN[192.55.52.115] X-Barracuda-Apparent-Source-IP: 192.55.52.115 X-ASG-Whitelist: Client Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga103.fm.intel.com with ESMTP; 28 Apr 2016 14:17:22 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,548,1455004800"; d="scan'208";a="942415535" Received: from omniknight.lm.intel.com ([10.232.112.171]) by orsmga001.jf.intel.com with ESMTP; 28 Apr 2016 14:17:21 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Dan Williams , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig , Jeff Moyer Subject: [PATCH v4 3/7] dax: enable dax in the presence of known media errors (badblocks) Date: Thu, 28 Apr 2016 15:16:54 -0600 X-ASG-Orig-Subj: [PATCH v4 3/7] dax: enable dax in the presence of known media errors (badblocks) Message-Id: <1461878218-3844-4-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> References: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> X-Barracuda-Connect: UNKNOWN[192.55.52.115] X-Barracuda-Start-Time: 1461878242 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1750 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dan Williams 1/ If a mapping overlaps a bad sector fail the request. 2/ Do not opportunistically report more dax-capable capacity than is requested when errors present. [vishal: fix a conflict with system RAM collision patches] Signed-off-by: Dan Williams --- block/ioctl.c | 9 --------- drivers/nvdimm/pmem.c | 8 ++++++++ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/block/ioctl.c b/block/ioctl.c index 4ff1f92..bf80bfd 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -423,15 +423,6 @@ bool blkdev_dax_capable(struct block_device *bdev) || (bdev->bd_part->nr_sects % (PAGE_SIZE / 512))) return false; - /* - * If the device has known bad blocks, force all I/O through the - * driver / page cache. - * - * TODO: support finer grained dax error handling - */ - if (disk->bb && disk->bb->count) - return false; - return true; } #endif diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c index f72733c..4567d9a 100644 --- a/drivers/nvdimm/pmem.c +++ b/drivers/nvdimm/pmem.c @@ -188,9 +188,17 @@ static long pmem_direct_access(struct block_device *bdev, struct pmem_device *pmem = bdev->bd_disk->private_data; resource_size_t offset = sector * 512 + pmem->data_offset; + if (unlikely(is_bad_pmem(&pmem->bb, sector, dax->size))) + return -EIO; dax->addr = pmem->virt_addr + offset; dax->pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags); + /* + * If badblocks are present, limit known good range to the + * requested range. + */ + if (unlikely(pmem->bb.count)) + return dax->size; return pmem->size - pmem->pfn_pad - offset; } -- 2.5.5 From vishal.l.verma@intel.com Thu Apr 28 16:17:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BBAD87D01 for ; Thu, 28 Apr 2016 16:17:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 85847304051 for ; Thu, 28 Apr 2016 14:17:22 -0700 (PDT) X-ASG-Debug-ID: 1461878241-04cb6c09a0352b90001-NocioJ Received: from mga14.intel.com ([192.55.52.115]) by cuda.sgi.com with ESMTP id YarfC5eXAba9nh0f for ; Thu, 28 Apr 2016 14:17:21 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Effective-Source-IP: UNKNOWN[192.55.52.115] X-Barracuda-Apparent-Source-IP: 192.55.52.115 X-ASG-Whitelist: Client Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga103.fm.intel.com with ESMTP; 28 Apr 2016 14:17:21 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,548,1455004800"; d="scan'208";a="942415529" Received: from omniknight.lm.intel.com ([10.232.112.171]) by orsmga001.jf.intel.com with ESMTP; 28 Apr 2016 14:17:20 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Dan Williams , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig , Jeff Moyer Subject: [PATCH v4 2/7] dax: fallback from pmd to pte on error Date: Thu, 28 Apr 2016 15:16:53 -0600 X-ASG-Orig-Subj: [PATCH v4 2/7] dax: fallback from pmd to pte on error Message-Id: <1461878218-3844-3-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> References: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> X-Barracuda-Connect: UNKNOWN[192.55.52.115] X-Barracuda-Start-Time: 1461878241 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 927 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dan Williams In preparation for consulting a badblocks list in pmem_direct_access(), teach dax_pmd_fault() to fallback rather than fail immediately upon encountering an error. The thought being that reducing the span of the dax request may avoid the error region. Signed-off-by: Dan Williams --- fs/dax.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/dax.c b/fs/dax.c index 5a34f08..52f0044 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -1111,8 +1111,8 @@ int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address, long length = dax_map_atomic(bdev, &dax); if (length < 0) { - result = VM_FAULT_SIGBUS; - goto out; + dax_pmd_dbg(&bh, address, "dax-error fallback"); + goto fallback; } if (length < PMD_SIZE) { dax_pmd_dbg(&bh, address, "dax-length too small"); -- 2.5.5 From vishal.l.verma@intel.com Thu Apr 28 16:17:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B90C57CFE for ; Thu, 28 Apr 2016 16:17:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2EBF6AC002 for ; Thu, 28 Apr 2016 14:17:25 -0700 (PDT) X-ASG-Debug-ID: 1461878242-04cb6c09a2352ba0002-NocioJ Received: from mga14.intel.com ([192.55.52.115]) by cuda.sgi.com with ESMTP id NkvrMFZTUrmuPkYW for ; Thu, 28 Apr 2016 14:17:23 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Effective-Source-IP: UNKNOWN[192.55.52.115] X-Barracuda-Apparent-Source-IP: 192.55.52.115 X-ASG-Whitelist: Client Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga103.fm.intel.com with ESMTP; 28 Apr 2016 14:17:23 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,548,1455004800"; d="scan'208";a="942415539" Received: from omniknight.lm.intel.com ([10.232.112.171]) by orsmga001.jf.intel.com with ESMTP; 28 Apr 2016 14:17:22 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Matthew Wilcox , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dan Williams , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig , Jeff Moyer , Vishal Verma Subject: [PATCH v4 4/7] dax: use sb_issue_zerout instead of calling dax_clear_sectors Date: Thu, 28 Apr 2016 15:16:55 -0600 X-ASG-Orig-Subj: [PATCH v4 4/7] dax: use sb_issue_zerout instead of calling dax_clear_sectors Message-Id: <1461878218-3844-5-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> References: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> X-Barracuda-Connect: UNKNOWN[192.55.52.115] X-Barracuda-Start-Time: 1461878243 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4023 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Matthew Wilcox dax_clear_sectors() cannot handle poisoned blocks. These must be zeroed using the BIO interface instead. Convert ext2 and XFS to use only sb_issue_zerout(). Signed-off-by: Matthew Wilcox [vishal: Also remove the dax_clear_sectors function entirely] Signed-off-by: Vishal Verma --- fs/dax.c | 32 -------------------------------- fs/ext2/inode.c | 7 +++---- fs/xfs/xfs_bmap_util.c | 15 ++++----------- include/linux/dax.h | 1 - 4 files changed, 7 insertions(+), 48 deletions(-) diff --git a/fs/dax.c b/fs/dax.c index 52f0044..5948d9b 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -116,38 +116,6 @@ struct page *read_dax_sector(struct block_device *bdev, sector_t n) return page; } -/* - * dax_clear_sectors() is called from within transaction context from XFS, - * and hence this means the stack from this point must follow GFP_NOFS - * semantics for all operations. - */ -int dax_clear_sectors(struct block_device *bdev, sector_t _sector, long _size) -{ - struct blk_dax_ctl dax = { - .sector = _sector, - .size = _size, - }; - - might_sleep(); - do { - long count, sz; - - count = dax_map_atomic(bdev, &dax); - if (count < 0) - return count; - sz = min_t(long, count, SZ_128K); - clear_pmem(dax.addr, sz); - dax.size -= sz; - dax.sector += sz / 512; - dax_unmap_atomic(bdev, &dax); - cond_resched(); - } while (dax.size); - - wmb_pmem(); - return 0; -} -EXPORT_SYMBOL_GPL(dax_clear_sectors); - static bool buffer_written(struct buffer_head *bh) { return buffer_mapped(bh) && !buffer_unwritten(bh); diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index 1f07b75..35f2b0bf 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -737,10 +738,8 @@ static int ext2_get_blocks(struct inode *inode, * so that it's not found by another thread before it's * initialised */ - err = dax_clear_sectors(inode->i_sb->s_bdev, - le32_to_cpu(chain[depth-1].key) << - (inode->i_blkbits - 9), - 1 << inode->i_blkbits); + err = sb_issue_zeroout(inode->i_sb, + le32_to_cpu(chain[depth-1].key), 1, GFP_NOFS); if (err) { mutex_unlock(&ei->truncate_mutex); goto cleanup; diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 3b63098..930ac6a 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -72,18 +72,11 @@ xfs_zero_extent( struct xfs_mount *mp = ip->i_mount; xfs_daddr_t sector = xfs_fsb_to_db(ip, start_fsb); sector_t block = XFS_BB_TO_FSBT(mp, sector); - ssize_t size = XFS_FSB_TO_B(mp, count_fsb); - - if (IS_DAX(VFS_I(ip))) - return dax_clear_sectors(xfs_find_bdev_for_inode(VFS_I(ip)), - sector, size); - - /* - * let the block layer decide on the fastest method of - * implementing the zeroing. - */ - return sb_issue_zeroout(mp->m_super, block, count_fsb, GFP_NOFS); + return blkdev_issue_zeroout(xfs_find_bdev_for_inode(VFS_I(ip)), + block << (mp->m_super->s_blocksize_bits - 9), + count_fsb << (mp->m_super->s_blocksize_bits - 9), + GFP_NOFS, true); } /* diff --git a/include/linux/dax.h b/include/linux/dax.h index ef94fa7..426841a 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h @@ -11,7 +11,6 @@ ssize_t dax_do_io(struct kiocb *, struct inode *, struct iov_iter *, loff_t, get_block_t, dio_iodone_t, int flags); -int dax_clear_sectors(struct block_device *bdev, sector_t _sector, long _size); int dax_zero_page_range(struct inode *, loff_t from, unsigned len, get_block_t); int dax_truncate_page(struct inode *, loff_t from, get_block_t); int dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t); -- 2.5.5 From vishal.l.verma@intel.com Thu Apr 28 16:17:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 156937D07 for ; Thu, 28 Apr 2016 16:17:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D40E28F8035 for ; Thu, 28 Apr 2016 14:17:26 -0700 (PDT) X-ASG-Debug-ID: 1461878246-04cb6c09a0352bb0001-NocioJ Received: from mga14.intel.com ([192.55.52.115]) by cuda.sgi.com with ESMTP id eWF2Paq9aFqqEGCq for ; Thu, 28 Apr 2016 14:17:26 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Effective-Source-IP: UNKNOWN[192.55.52.115] X-Barracuda-Apparent-Source-IP: 192.55.52.115 X-ASG-Whitelist: Client Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga103.fm.intel.com with ESMTP; 28 Apr 2016 14:17:25 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,548,1455004800"; d="scan'208";a="942415564" Received: from omniknight.lm.intel.com ([10.232.112.171]) by orsmga001.jf.intel.com with ESMTP; 28 Apr 2016 14:17:24 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Vishal Verma , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dan Williams , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig , Jeff Moyer Subject: [PATCH v4 6/7] dax: for truncate/hole-punch, do zeroing through the driver if possible Date: Thu, 28 Apr 2016 15:16:57 -0600 X-ASG-Orig-Subj: [PATCH v4 6/7] dax: for truncate/hole-punch, do zeroing through the driver if possible Message-Id: <1461878218-3844-7-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> References: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> X-Barracuda-Connect: UNKNOWN[192.55.52.115] X-Barracuda-Start-Time: 1461878246 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2119 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 In the truncate or hole-punch path in dax, we clear out sub-page ranges. If these sub-page ranges are sector aligned and sized, we can do the zeroing through the driver instead so that error-clearing is handled automatically. For sub-sector ranges, we still have to rely on clear_pmem and have the possibility of tripping over errors. Cc: Matthew Wilcox Cc: Dan Williams Cc: Ross Zwisler Cc: Jeff Moyer Cc: Christoph Hellwig Cc: Dave Chinner Cc: Jan Kara Signed-off-by: Vishal Verma --- fs/dax.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/fs/dax.c b/fs/dax.c index 5948d9b..d8c974e 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -1196,6 +1196,20 @@ out: } EXPORT_SYMBOL_GPL(dax_pfn_mkwrite); +static bool dax_range_is_aligned(struct block_device *bdev, + struct blk_dax_ctl *dax, unsigned int offset, + unsigned int length) +{ + unsigned short sector_size = bdev_logical_block_size(bdev); + + if (((u64)dax->addr + offset) % sector_size) + return false; + if (length % sector_size) + return false; + + return true; +} + /** * dax_zero_page_range - zero a range within a page of a DAX file * @inode: The file being truncated @@ -1240,11 +1254,17 @@ int dax_zero_page_range(struct inode *inode, loff_t from, unsigned length, .size = PAGE_SIZE, }; - if (dax_map_atomic(bdev, &dax) < 0) - return PTR_ERR(dax.addr); - clear_pmem(dax.addr + offset, length); - wmb_pmem(); - dax_unmap_atomic(bdev, &dax); + if (dax_range_is_aligned(bdev, &dax, offset, length)) + return blkdev_issue_zeroout(bdev, dax.sector, + length / bdev_logical_block_size(bdev), + GFP_NOFS, true); + else { + if (dax_map_atomic(bdev, &dax) < 0) + return PTR_ERR(dax.addr); + clear_pmem(dax.addr + offset, length); + wmb_pmem(); + dax_unmap_atomic(bdev, &dax); + } } return 0; -- 2.5.5 From vishal.l.verma@intel.com Thu Apr 28 16:17:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 941BE7D0C for ; Thu, 28 Apr 2016 16:17:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id EFEC2AC004 for ; Thu, 28 Apr 2016 14:17:26 -0700 (PDT) X-ASG-Debug-ID: 1461878242-04cb6c09a2352ba0003-NocioJ Received: from mga14.intel.com ([192.55.52.115]) by cuda.sgi.com with ESMTP id 29JfdnkKetBj1Nlt for ; Thu, 28 Apr 2016 14:17:24 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Effective-Source-IP: UNKNOWN[192.55.52.115] X-Barracuda-Apparent-Source-IP: 192.55.52.115 X-ASG-Whitelist: Client Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga103.fm.intel.com with ESMTP; 28 Apr 2016 14:17:24 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,548,1455004800"; d="scan'208";a="942415549" Received: from omniknight.lm.intel.com ([10.232.112.171]) by orsmga001.jf.intel.com with ESMTP; 28 Apr 2016 14:17:23 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Vishal Verma , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dan Williams , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig , Jeff Moyer Subject: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io Date: Thu, 28 Apr 2016 15:16:56 -0600 X-ASG-Orig-Subj: [PATCH v4 5/7] fs: prioritize and separate direct_io from dax_io Message-Id: <1461878218-3844-6-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> References: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> X-Barracuda-Connect: UNKNOWN[192.55.52.115] X-Barracuda-Start-Time: 1461878244 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9856 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 All IO in a dax filesystem used to go through dax_do_io, which cannot handle media errors, and thus cannot provide a recovery path that can send a write through the driver to clear errors. Add a new iocb flag for DAX, and set it only for DAX mounts. In the IO path for DAX filesystems, use the same direct_IO path for both DAX and direct_io iocbs, but use the flags to identify when we are in O_DIRECT mode vs non O_DIRECT with DAX, and for O_DIRECT, use the conventional direct_IO path instead of DAX. This allows us a recovery path in the form of opening the file with O_DIRECT and writing to it with the usual O_DIRECT semantics (sector alignment restrictions). Cc: Matthew Wilcox Cc: Dan Williams Cc: Ross Zwisler Cc: Jeff Moyer Cc: Christoph Hellwig Cc: Dave Chinner Cc: Jan Kara Cc: Jens Axboe Cc: Al Viro Signed-off-by: Vishal Verma --- drivers/block/loop.c | 2 +- fs/block_dev.c | 17 +++++++++++++---- fs/ext2/inode.c | 16 ++++++++++++---- fs/ext4/file.c | 2 +- fs/ext4/inode.c | 19 +++++++++++++------ fs/xfs/xfs_aops.c | 20 +++++++++++++------- fs/xfs/xfs_file.c | 4 ++-- include/linux/fs.h | 15 ++++++++++++--- mm/filemap.c | 4 ++-- 9 files changed, 69 insertions(+), 30 deletions(-) diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 80cf8ad..c0a24c3 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -568,7 +568,7 @@ struct switch_request { static inline void loop_update_dio(struct loop_device *lo) { - __loop_update_dio(lo, io_is_direct(lo->lo_backing_file) | + __loop_update_dio(lo, (lo->lo_backing_file->f_flags & O_DIRECT) | lo->use_dio); } diff --git a/fs/block_dev.c b/fs/block_dev.c index 79defba..97a1f5f 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -167,12 +167,21 @@ blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) struct file *file = iocb->ki_filp; struct inode *inode = bdev_file_inode(file); - if (IS_DAX(inode)) + if (iocb_is_direct(iocb)) + return __blockdev_direct_IO(iocb, inode, I_BDEV(inode), iter, + offset, blkdev_get_block, NULL, + NULL, DIO_SKIP_DIO_COUNT); + else if (iocb_is_dax(iocb)) return dax_do_io(iocb, inode, iter, offset, blkdev_get_block, NULL, DIO_SKIP_DIO_COUNT); - return __blockdev_direct_IO(iocb, inode, I_BDEV(inode), iter, offset, - blkdev_get_block, NULL, NULL, - DIO_SKIP_DIO_COUNT); + else { + /* + * If we're in the direct_IO path, either the IOCB_DIRECT or + * IOCB_DAX flags must be set. + */ + WARN_ONCE(1, "Kernel Bug with iocb flags\n"); + return -ENXIO; + } } int __sync_blockdev(struct block_device *bdev, int wait) diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index 35f2b0bf..45f2b51 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c @@ -861,12 +861,20 @@ ext2_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) size_t count = iov_iter_count(iter); ssize_t ret; - if (IS_DAX(inode)) - ret = dax_do_io(iocb, inode, iter, offset, ext2_get_block, NULL, - DIO_LOCKING); - else + if (iocb_is_direct(iocb)) ret = blockdev_direct_IO(iocb, inode, iter, offset, ext2_get_block); + else if (iocb_is_dax(iocb)) + ret = dax_do_io(iocb, inode, iter, offset, ext2_get_block, NULL, + DIO_LOCKING); + else { + /* + * If we're in the direct_IO path, either the IOCB_DIRECT or + * IOCB_DAX flags must be set. + */ + WARN_ONCE(1, "Kernel Bug with iocb flags\n"); + return -ENXIO; + } if (ret < 0 && iov_iter_rw(iter) == WRITE) ext2_write_failed(mapping, offset + count); return ret; diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 2e9aa49..165a0b8 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c @@ -94,7 +94,7 @@ ext4_file_write_iter(struct kiocb *iocb, struct iov_iter *from) struct file *file = iocb->ki_filp; struct inode *inode = file_inode(iocb->ki_filp); struct blk_plug plug; - int o_direct = iocb->ki_flags & IOCB_DIRECT; + int o_direct = iocb->ki_flags & (IOCB_DIRECT | IOCB_DAX); int unaligned_aio = 0; int overwrite = 0; ssize_t ret; diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 6d5d5c1..0b6d77a 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -3410,15 +3410,22 @@ static ssize_t ext4_direct_IO_write(struct kiocb *iocb, struct iov_iter *iter, #ifdef CONFIG_EXT4_FS_ENCRYPTION BUG_ON(ext4_encrypted_inode(inode) && S_ISREG(inode->i_mode)); #endif - if (IS_DAX(inode)) { - ret = dax_do_io(iocb, inode, iter, offset, get_block_func, - ext4_end_io_dio, dio_flags); - } else + if (iocb_is_direct(iocb)) ret = __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev, iter, offset, get_block_func, ext4_end_io_dio, NULL, dio_flags); - + else if (iocb_is_dax(iocb)) + ret = dax_do_io(iocb, inode, iter, offset, get_block_func, + ext4_end_io_dio, dio_flags); + else { + /* + * If we're in the direct_IO path, either the IOCB_DIRECT or + * IOCB_DAX flags must be set. + */ + WARN_ONCE(1, "Kernel Bug with iocb flags\n"); + return -ENXIO; + } if (ret > 0 && !overwrite && ext4_test_inode_state(inode, EXT4_STATE_DIO_UNWRITTEN)) { int err; @@ -3503,7 +3510,7 @@ static ssize_t ext4_direct_IO_read(struct kiocb *iocb, struct iov_iter *iter, else unlocked = 1; } - if (IS_DAX(inode)) { + if (iocb_is_dax(iocb)) { ret = dax_do_io(iocb, inode, iter, offset, ext4_dio_get_block, NULL, unlocked ? 0 : DIO_LOCKING); } else { diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index e49b240..8134e99 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1412,21 +1412,27 @@ xfs_vm_direct_IO( struct inode *inode = iocb->ki_filp->f_mapping->host; dio_iodone_t *endio = NULL; int flags = 0; - struct block_device *bdev; + struct block_device *bdev = xfs_find_bdev_for_inode(inode); if (iov_iter_rw(iter) == WRITE) { endio = xfs_end_io_direct_write; flags = DIO_ASYNC_EXTEND; } - if (IS_DAX(inode)) { + if (iocb_is_direct(iocb)) + return __blockdev_direct_IO(iocb, inode, bdev, iter, offset, + xfs_get_blocks_direct, endio, NULL, flags); + else if (iocb_is_dax(iocb)) return dax_do_io(iocb, inode, iter, offset, - xfs_get_blocks_direct, endio, 0); + xfs_get_blocks_direct, endio, 0); + else { + /* + * If we're in the direct_IO path, either the IOCB_DIRECT or + * IOCB_DAX flags must be set. + */ + WARN_ONCE(1, "Kernel Bug with iocb flags\n"); + return -ENXIO; } - - bdev = xfs_find_bdev_for_inode(inode); - return __blockdev_direct_IO(iocb, inode, bdev, iter, offset, - xfs_get_blocks_direct, endio, NULL, flags); } /* diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index c2946f4..3d5d3c2 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -300,7 +300,7 @@ xfs_file_read_iter( XFS_STATS_INC(mp, xs_read_calls); - if (unlikely(iocb->ki_flags & IOCB_DIRECT)) + if (unlikely(iocb->ki_flags & (IOCB_DIRECT | IOCB_DAX))) ioflags |= XFS_IO_ISDIRECT; if (file->f_mode & FMODE_NOCMTIME) ioflags |= XFS_IO_INVIS; @@ -898,7 +898,7 @@ xfs_file_write_iter( if (XFS_FORCED_SHUTDOWN(ip->i_mount)) return -EIO; - if ((iocb->ki_flags & IOCB_DIRECT) || IS_DAX(inode)) + if ((iocb->ki_flags & (IOCB_DIRECT | IOCB_DAX))) ret = xfs_file_dio_aio_write(iocb, from); else ret = xfs_file_buffered_aio_write(iocb, from); diff --git a/include/linux/fs.h b/include/linux/fs.h index 9f28130..adca1d8 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -322,6 +322,7 @@ struct writeback_control; #define IOCB_APPEND (1 << 1) #define IOCB_DIRECT (1 << 2) #define IOCB_HIPRI (1 << 3) +#define IOCB_DAX (1 << 4) struct kiocb { struct file *ki_filp; @@ -2930,9 +2931,15 @@ extern int generic_show_options(struct seq_file *m, struct dentry *root); extern void save_mount_options(struct super_block *sb, char *options); extern void replace_mount_options(struct super_block *sb, char *options); -static inline bool io_is_direct(struct file *filp) +static inline bool iocb_is_dax(struct kiocb *iocb) { - return (filp->f_flags & O_DIRECT) || IS_DAX(filp->f_mapping->host); + return IS_DAX(file_inode(iocb->ki_filp)) && + (iocb->ki_flags & IOCB_DAX); +} + +static inline bool iocb_is_direct(struct kiocb *iocb) +{ + return iocb->ki_flags & IOCB_DIRECT; } static inline int iocb_flags(struct file *file) @@ -2940,8 +2947,10 @@ static inline int iocb_flags(struct file *file) int res = 0; if (file->f_flags & O_APPEND) res |= IOCB_APPEND; - if (io_is_direct(file)) + if (file->f_flags & O_DIRECT) res |= IOCB_DIRECT; + if (IS_DAX(file_inode(file))) + res |= IOCB_DAX; return res; } diff --git a/mm/filemap.c b/mm/filemap.c index 3effd5c..b959acf 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1849,7 +1849,7 @@ generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter) if (!count) goto out; /* skip atime */ - if (iocb->ki_flags & IOCB_DIRECT) { + if (iocb->ki_flags & (IOCB_DIRECT | IOCB_DAX)) { struct address_space *mapping = file->f_mapping; struct inode *inode = mapping->host; loff_t size; @@ -2719,7 +2719,7 @@ ssize_t __generic_file_write_iter(struct kiocb *iocb, struct iov_iter *from) if (err) goto out; - if (iocb->ki_flags & IOCB_DIRECT) { + if (iocb->ki_flags & (IOCB_DIRECT | IOCB_DAX)) { loff_t pos, endbyte; written = generic_file_direct_write(iocb, from, iocb->ki_pos); -- 2.5.5 From vishal.l.verma@intel.com Thu Apr 28 16:17:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 50B2A7D0C for ; Thu, 28 Apr 2016 16:17:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id AB488AC002 for ; Thu, 28 Apr 2016 14:17:28 -0700 (PDT) X-ASG-Debug-ID: 1461878247-04cbb00fea323530001-NocioJ Received: from mga14.intel.com ([192.55.52.115]) by cuda.sgi.com with ESMTP id PxgvqxggtyYdAuyG for ; Thu, 28 Apr 2016 14:17:27 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Effective-Source-IP: UNKNOWN[192.55.52.115] X-Barracuda-Apparent-Source-IP: 192.55.52.115 X-ASG-Whitelist: Client Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga103.fm.intel.com with ESMTP; 28 Apr 2016 14:17:27 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,548,1455004800"; d="scan'208";a="942415597" Received: from omniknight.lm.intel.com ([10.232.112.171]) by orsmga001.jf.intel.com with ESMTP; 28 Apr 2016 14:17:25 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Vishal Verma , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dan Williams , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig , Jeff Moyer , "Kirill A. Shutemov" Subject: [PATCH v4 7/7] dax: fix a comment in dax_zero_page_range and dax_truncate_page Date: Thu, 28 Apr 2016 15:16:58 -0600 X-ASG-Orig-Subj: [PATCH v4 7/7] dax: fix a comment in dax_zero_page_range and dax_truncate_page Message-Id: <1461878218-3844-8-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> References: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> X-Barracuda-Connect: UNKNOWN[192.55.52.115] X-Barracuda-Start-Time: 1461878247 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1983 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The distinction between PAGE_SIZE and PAGE_CACHE_SIZE was removed in 09cbfea mm, fs: get rid of PAGE_CACHE_* and page_cache_{get,release} macros The comments for the above functions described a distinction between those, that is now redundant, so remove those paragraphs Cc: Matthew Wilcox Cc: Kirill A. Shutemov Signed-off-by: Vishal Verma --- fs/dax.c | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/fs/dax.c b/fs/dax.c index d8c974e..b8fa85a 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -1221,12 +1221,6 @@ static bool dax_range_is_aligned(struct block_device *bdev, * page in a DAX file. This is intended for hole-punch operations. If * you are truncating a file, the helper function dax_truncate_page() may be * more convenient. - * - * We work in terms of PAGE_SIZE here for commonality with - * block_truncate_page(), but we could go down to PAGE_SIZE if the filesystem - * took care of disposing of the unnecessary blocks. Even if the filesystem - * block size is smaller than PAGE_SIZE, we have to zero the rest of the page - * since the file might be mmapped. */ int dax_zero_page_range(struct inode *inode, loff_t from, unsigned length, get_block_t get_block) @@ -1279,12 +1273,6 @@ EXPORT_SYMBOL_GPL(dax_zero_page_range); * * Similar to block_truncate_page(), this function can be called by a * filesystem when it is truncating a DAX file to handle the partial page. - * - * We work in terms of PAGE_SIZE here for commonality with - * block_truncate_page(), but we could go down to PAGE_SIZE if the filesystem - * took care of disposing of the unnecessary blocks. Even if the filesystem - * block size is smaller than PAGE_SIZE, we have to zero the rest of the page - * since the file might be mmapped. */ int dax_truncate_page(struct inode *inode, loff_t from, get_block_t get_block) { -- 2.5.5 From david@fromorbit.com Thu Apr 28 16:51:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 631327CD4 for ; Thu, 28 Apr 2016 16:51:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C93C4AC002 for ; Thu, 28 Apr 2016 14:51:49 -0700 (PDT) X-ASG-Debug-ID: 1461880306-04bdf0358e342f60001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id Z2sSBeDJAmJgfmBW for ; Thu, 28 Apr 2016 14:51:47 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AkCQAehSJXMcPVLHlegziBUIJzg3meWwEBAQEBAQaMFYVqhBOFA4EGBAICgSVNAQEBAQEBBwEBAQEBQUCEQgEBBDocIxAIAw4KCRoLDwUlAwcaE4gpw3IBAQEHAh4ZhUCFE4Eggm8RAYVyBZgQjg2PG0WOa4JnGxaBRyowhjOBNQEBAQ Received: from ppp121-44-213-195.lns20.syd7.internode.on.net (HELO dastard) ([121.44.213.195]) by ipmail06.adl2.internode.on.net with ESMTP; 29 Apr 2016 07:21:45 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1avtqb-0007ZA-EJ; Fri, 29 Apr 2016 07:51:45 +1000 Date: Fri, 29 Apr 2016 07:51:45 +1000 From: Dave Chinner To: Michal Hocko Cc: linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, Andrew Morton , Jan Kara , xfs@oss.sgi.com, LKML Subject: Re: [PATCH 2/2] mm, debug: report when GFP_NO{FS,IO} is used explicitly from memalloc_no{fs,io}_{save,restore} context Message-ID: <20160428215145.GM26977@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] mm, debug: report when GFP_NO{FS,IO} is used explicitly from memalloc_no{fs,io}_{save,restore} context References: <1461671772-1269-1-git-send-email-mhocko@kernel.org> <1461671772-1269-3-git-send-email-mhocko@kernel.org> <20160426225845.GF26977@dastard> <20160428081759.GA31489@dhcp22.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160428081759.GA31489@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: 1461880307 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1975 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29139 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Apr 28, 2016 at 10:17:59AM +0200, Michal Hocko wrote: > [Trim the CC list] > On Wed 27-04-16 08:58:45, Dave Chinner wrote: > [...] > > Often these are to silence lockdep warnings (e.g. commit b17cb36 > > ("xfs: fix missing KM_NOFS tags to keep lockdep happy")) because > > lockdep gets very unhappy about the same functions being called with > > different reclaim contexts. e.g. directory block mapping might > > occur from readdir (no transaction context) or within transactions > > (create/unlink). hence paths like this are tagged with GFP_NOFS to > > stop lockdep emitting false positive warnings.... > > As already said in other email, I have tried to revert the above > commit and tried to run it with some fs workloads but didn't manage > to hit any lockdep splats (after I fixed my bug in the patch 1.2). I > have tried to find reports which led to this commit but didn't succeed > much. Everything is from much earlier or later. Do you happen to > remember which loads triggered them, what they looked like or have an > idea what to try to reproduce them? So far I was trying heavy parallel > fs_mark, kernbench inside a tiny virtual machine so any of those have > triggered direct reclaim all the time. Most of those issues were reported by users and not reproducable by any obvious means. They may have been fixed since, but I'm sceptical of that because, generally speaking, developer testing only catches the obvious lockdep issues. i.e. it's users that report all the really twisty issues, and they are generally not reproducable except under their production workloads... IOWs, the absence of reports in your testing does not mean there isn't a problem, and that is one of the biggest problems with lockdep annotations - we have no way of ever knowing if they are still necessary or not without exposing users to regressions and potential deadlocks..... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Apr 28 20:59:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 080727CF3 for ; Thu, 28 Apr 2016 20:59:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 60CEBAC003 for ; Thu, 28 Apr 2016 18:59:33 -0700 (PDT) X-ASG-Debug-ID: 1461895169-04cb6c09a336d830001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 2fIpEZ2BsR2JEQa1 for ; Thu, 28 Apr 2016 18:59:29 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2C5CQDIviJXMcPVLHlegziBUIJzg3meaAaMFYVshBOGCQICAQECgSdNAQEBAQEBBwEBAQEBQUCEQQEBAQQ6HCMQCAMOBwMJJQ8FJQMHGhOIKcM/AQEIAgEdGYVAhROKEwWNVIo9iHOFGoFxhE2IXY8whF8qMIYsJYEXAQEB Received: from ppp121-44-213-195.lns20.syd7.internode.on.net (HELO dastard) ([121.44.213.195]) by ipmail06.adl2.internode.on.net with ESMTP; 29 Apr 2016 11:29:28 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1avxiJ-0007wx-E0; Fri, 29 Apr 2016 11:59:27 +1000 Date: Fri, 29 Apr 2016 11:59:27 +1000 From: Dave Chinner To: Jan Tulak Cc: fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC PATCH] xfstests: Add mkfs input validation tests Message-ID: <20160429015927.GN18496@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH] xfstests: Add mkfs input validation tests References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> <1461832149-18276-1-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1461832149-18276-1-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1461895169 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4491 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29143 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Apr 28, 2016 at 10:29:09AM +0200, Jan Tulak wrote: > Test inputs for my mkfs-cleaning patchset. This test will fail with the old sphageti code mkfs, among others because the old code accepts incorrect values. > > > > Signed-off-by: Dave Chinner > Signed-off-by: Jan Tulak Please don't strip the commit messages from patches you've picked up from other people - it loses valuable information, as well as the original author of the code. i.e. The original commit message was: From: Dave Chinner mkfs.xfs does not do a very good job of input validation. This test is designed to exercise the input validation and test good/bad combinations of options being set. It will not pass on a current mkfs.xfs binary - it is designed to be the test case for a input validation cleanup. Signed-off-by: Dave Chinner > --- > > Hi guys, > > I'm sending this patch although the mentioned patchset is not yet merged. > It might help you a bit with checking if there are any issues with > the patchset, as here it is clear, what options works and what not. in which case, a "_require_xfs_mkfs_validation" rule should be written to determine the version of mkfs being. e.g. by testing one of the failure cases that the unfixed binary says is ok. .... > +# basic "should fail" options > +# logarithm based options are no longer valid > +# NOTE: umm, when it got invalid? It seems to be still supported... > +#do_mkfs_fail -s log=10 $SCRATCH_DEV > +#do_mkfs_fail -b log=10 $SCRATCH_DEV > +#do_mkfs_fail -n log=10 $SCRATCH_DEV > +#do_mkfs_fail -i log=10 $SCRATCH_DEV > +#do_mkfs_fail -d sectlog=10 $SCRATCH_DEV > +#do_mkfs_fail -l sectlog=10 $SCRATCH_DEV They were expected to fail because I was going to remove the log options from mkfs as part of the cleanup series because they are redundant and nobody uses them. i.e this test was written with what I wanted as the end result of the mkfs input validation cleanup, not an iteration of the current behaviour. After all the data section tests, the new tests you've added all seem to be pretty ad-hoc. What I was fleshing out in this test was a relatively complete set exercising each the different options mkfs supports. I'd only iterated data section options so far in this test. I'd just started on the naming section tests, and had not added any but a basic test. That needs to be iterated, as do the inode, log (both internal and external), metadata and realtime options.... > +# invalid file section tests > +rm -f $fsimg > +$XFS_IO_PROG -f -c "truncate $fssize" $fsimg > +do_mkfs_fail -d file $fsimg > +do_mkfs_fail -d file,name=$fsimg Why should these fail - size should not be required if the image file already exists and is of sufficient size.... > + > +# naming section tests > +do_mkfs_pass -n size=65536 $SCRATCH_DEV > + > +# boolean options > +$XFS_IO_PROG -f -c "truncate $fssize" $fsimg > +do_mkfs_pass -d file=1,size=$fssize $fsimg > +do_mkfs_pass -d file=0 $SCRATCH_DEV > +do_mkfs_fail -d file=1 $SCRATCH_DEV More image file tests, belong in the data section with the other image file tests. > +# Specific flag combinations where some bug appeared during development, > +# to catch the same issue if it re-appears. If there are multiple similar > +# checks, move them to a standalone block. > + > + > +do_mkfs_pass -m crc=1,finobt=1 $SCRATCH_DEV What about all the other invalid cases? > +do_mkfs_pass -m crc=1 -n ftype=1 $SCRATCH_DEV > +do_mkfs_pass -m crc=0 -n ftype=1 $SCRATCH_DEV > +do_mkfs_fail -m crc=1 -n ftype=0 $SCRATCH_DEV > +do_mkfs_pass -m crc=0 -n ftype=0 $SCRATCH_DEV > +do_mkfs_pass -n ftype=1 -m crc=0 $SCRATCH_DEV One of the cleanup requirements was that option parsing would not be order sensitive, so I don't think you need to iterate parameters in different orders. That would just blow out the test matrix unnecessarily. Also, if you really need to repeat the same test but with different orders, please place those tests sequentially in the file so it's clear that they are duplicate/order swapped tests.... > +# if user states crc=0,finobt=1, fail instead of warning > +do_mkfs_fail -m crc=0,finobt=1 $SCRATCH_DEV Why is this separate to the other crc,finobt test? Please try to keep the parameter checks in logical groupings.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From mr@neil.brown.name Fri Apr 29 00:36:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1CAE07CA1 for ; Fri, 29 Apr 2016 00:36:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C7DBA8F8035 for ; Thu, 28 Apr 2016 22:36:15 -0700 (PDT) X-ASG-Debug-ID: 1461908170-04bdf03590378e60001-NocioJ Received: from neil.brown.name (neil.brown.name [103.29.64.221]) by cuda.sgi.com with ESMTP id teWCxJ4T1sjtxIA7 (version=TLSv1.2 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Thu, 28 Apr 2016 22:36:12 -0700 (PDT) X-Barracuda-Envelope-From: mr@neil.brown.name X-Barracuda-Effective-Source-IP: neil.brown.name[103.29.64.221] X-Barracuda-Apparent-Source-IP: 103.29.64.221 Received: from [220.233.11.133] (helo=neil.brown.name) by neil.brown.name with esmtp (Exim 4.80) (envelope-from ) id 1aw106-0008Sz-3k; Fri, 29 Apr 2016 05:30:02 +0000 From: NeilBrown To: Michal Hocko , linux-mm@kvack.org, linux-fsdevel@vger.kernel.org Date: Fri, 29 Apr 2016 15:35:42 +1000 Cc: Andrew Morton , Dave Chinner , Theodore Ts'o , Chris Mason , Jan Kara , ceph-devel@vger.kernel.org, cluster-devel@redhat.com, linux-nfs@vger.kernel.org, logfs@logfs.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-mtd@lists.infradead.org, reiserfs-devel@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-f2fs-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, LKML Subject: Re: [PATCH 0/2] scop GFP_NOFS api In-Reply-To: <1461671772-1269-1-git-send-email-mhocko@kernel.org> X-ASG-Orig-Subj: Re: [PATCH 0/2] scop GFP_NOFS api References: <1461671772-1269-1-git-send-email-mhocko@kernel.org> User-Agent: Notmuch/0.20.2 (http://notmuchmail.org) Emacs/24.5.1 (x86_64-suse-linux-gnu) Message-ID: <8737q5ugcx.fsf@notabene.neil.brown.name> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" X-Barracuda-Connect: neil.brown.name[103.29.64.221] X-Barracuda-Start-Time: 1461908172 X-Barracuda-Encrypted: DHE-RSA-AES128-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4248 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29146 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header --=-=-= Content-Type: text/plain On Tue, Apr 26 2016, Michal Hocko wrote: > Hi, > we have discussed this topic at LSF/MM this year. There was a general > interest in the scope GFP_NOFS allocation context among some FS > developers. For those who are not aware of the discussion or the issue > I am trying to sort out (or at least start in that direction) please > have a look at patch 1 which adds memalloc_nofs_{save,restore} api > which basically copies what we have for the scope GFP_NOIO allocation > context. I haven't converted any of the FS myself because that is way > beyond my area of expertise but I would be happy to help with further > changes on the MM front as well as in some more generic code paths. > > Dave had an idea on how to further improve the reclaim context to be > less all-or-nothing wrt. GFP_NOFS. In short he was suggesting an opaque > and FS specific cookie set in the FS allocation context and consumed > by the FS reclaim context to allow doing some provably save actions > that would be skipped due to GFP_NOFS normally. I like this idea and > I believe we can go that direction regardless of the approach taken here. > Many filesystems simply need to cleanup their NOFS usage first before > diving into a more complex changes.> This strikes me as over-engineering to work around an unnecessarily burdensome interface.... but without details it is hard to be certain. Exactly what things happen in "FS reclaim context" which may, or may not, be safe depending on the specific FS allocation context? Do they need to happen at all? My research suggests that for most filesystems the only thing that happens in reclaim context that is at all troublesome is the final 'evict()' on an inode. This needs to flush out dirty pages and sync the inode to storage. Some time ago we moved most dirty-page writeout out of the reclaim context and into kswapd. I think this was an excellent advance in simplicity. If we could similarly move evict() into kswapd (and I believe we can) then most file systems would do nothing in reclaim context that interferes with allocation context. The exceptions include: - nfs and any filesystem using fscache can block for up to 1 second in ->releasepage(). They used to block waiting for some IO, but that caused deadlocks and wasn't really needed. I left the timeout because it seemed likely that some throttling would help. I suspect that a careful analysis will show that there is sufficient throttling elsewhere. - xfs_qm_shrink_scan is nearly unique among shrinkers in that it waits for IO so it can free some quotainfo things. If it could be changed to just schedule the IO without waiting for it then I think this would be safe to be called in any FS allocation context. It already uses a 'trylock' in xfs_dqlock_nowait() to avoid deadlocking if the lock is held. I think you/we would end up with a much simpler system if instead of focussing on the places where GFP_NOFS is used, we focus on places where __GFP_FS is tested, and try to remove them. If we get rid of enough of them the remainder could just use __GFP_IO. > The patch 2 is a debugging aid which warns about explicit allocation > requests from the scope context. This is should help to reduce the > direct usage of the NOFS flags to bare minimum in favor of the scope > API. It is not aimed to be merged upstream. I would hope Andrew took it > into mmotm tree to give it linux-next exposure and allow developers to > do further cleanups. There is a new kernel command line parameter which > has to be used for the debugging to be enabled. > > I think the GFP_NOIO should be seeing the same clean up. I think you are suggesting that use of GFP_NOIO should (largely) be deprecated in favour of memalloc_noio_save(). I think I agree. Could we go a step further and deprecate GFP_ATOMIC in favour of some in_atomic() test? Maybe that is going too far. Thanks, NeilBrown > > Any feedback is highly appreciated. > > -- > To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAEBCAAGBQJXIvKuAAoJEDnsnt1WYoG5yYcQALVBjDFPD7k40UTzmu/EpZtF q5uzTpP8A/Uhy4k8kJnHF9JhXwHlKXxKiFSTavyZqxE8LjmJwZOyB3hdg5boVQ1C 43ZKUpSd2i8BwIBZ1Ld37W9UEtT1owibqaY9KyOxetBk8wsZQoXks7XLQ+i8SMp1 lGQJwbykXBPfLzlBTV02QstA++bpwdFqFyxL9DTtYF8e9BbhC3iwFS2t/dwj17Uo 3WNu8OaXzYvf71uYTs2khlrKx3PQvKuUBLG30XGy1Lk/SF+lYlGtnrT0+wyWpSlR gzU7KXJjF1Mw7snb/JncOARDJJvHC3IUaaJy9GG8cLBY6j9sPAnoAGeKEtEXeSUC B2CUXkPS3n1Ejr0r5WhrLl8jO5oMIV6vZ/kDRFhEQt/gj0H5Zv0heQtp/DkgtFox mvBUH7cf2sqb9gabXGcm+5M9/yyqU1NzNR+8f+QCm2PrX9kzYKNExYc7Yx23KpWc BzT6Nzf62/nkhDHOzD50MMFFf5jWS0jWDS4uHx4KiG1JvKjRL6MW5GG1qNxQ+D8a kuzPKy/mMh7uppGOV4gxCdOQ04zyWfabzzcU5jM9WJeaXeZoDb6mOTJ6NSueUTBf nd3LnYoXc9LVTr4q9C4IerVNsjU2ZNTE/Nw2Sb+RLqEEBh5QpOITGYITS0aPK9fT AHBilQxky11eQicGLpS3 =gouN -----END PGP SIGNATURE----- --=-=-=-- From swhiteho@redhat.com Fri Apr 29 05:20:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 08F177CFB for ; Fri, 29 Apr 2016 05:20:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CF698304064 for ; Fri, 29 Apr 2016 03:20:42 -0700 (PDT) X-ASG-Debug-ID: 1461925241-04cbb00fea361270001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Cw0AnR5sLwly2Jcu (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 29 Apr 2016 03:20:41 -0700 (PDT) X-Barracuda-Envelope-From: swhiteho@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3D205C049D60; Fri, 29 Apr 2016 10:20:40 +0000 (UTC) Received: from 117.195.187.81.in-addr.arpa (vpn1-5-159.ams2.redhat.com [10.36.5.159]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3TAKXYW020017; Fri, 29 Apr 2016 06:20:34 -0400 Subject: Re: [Cluster-devel] [PATCH 0/2] scop GFP_NOFS api To: NeilBrown , Michal Hocko , linux-mm@kvack.org, linux-fsdevel@vger.kernel.org X-ASG-Orig-Subj: Re: [Cluster-devel] [PATCH 0/2] scop GFP_NOFS api References: <1461671772-1269-1-git-send-email-mhocko@kernel.org> <8737q5ugcx.fsf@notabene.neil.brown.name> Cc: linux-nfs@vger.kernel.org, linux-ext4@vger.kernel.org, "Theodore Ts'o" , linux-ntfs-dev@lists.sourceforge.net, LKML , Dave Chinner , reiserfs-devel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, logfs@logfs.org, cluster-devel@redhat.com, Chris Mason , linux-mtd@lists.infradead.org, Jan Kara , Andrew Morton , xfs@oss.sgi.com, ceph-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-afs@lists.infradead.org, cluster-devel From: Steven Whitehouse Message-ID: <57233571.50509@redhat.com> Date: Fri, 29 Apr 2016 11:20:33 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.1.0 MIME-Version: 1.0 In-Reply-To: <8737q5ugcx.fsf@notabene.neil.brown.name> Content-Type: text/plain; charset=windows-1252; format=flowed 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: 1461925241 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3599 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi, On 29/04/16 06:35, NeilBrown wrote: > On Tue, Apr 26 2016, Michal Hocko wrote: > >> Hi, >> we have discussed this topic at LSF/MM this year. There was a general >> interest in the scope GFP_NOFS allocation context among some FS >> developers. For those who are not aware of the discussion or the issue >> I am trying to sort out (or at least start in that direction) please >> have a look at patch 1 which adds memalloc_nofs_{save,restore} api >> which basically copies what we have for the scope GFP_NOIO allocation >> context. I haven't converted any of the FS myself because that is way >> beyond my area of expertise but I would be happy to help with further >> changes on the MM front as well as in some more generic code paths. >> >> Dave had an idea on how to further improve the reclaim context to be >> less all-or-nothing wrt. GFP_NOFS. In short he was suggesting an opaque >> and FS specific cookie set in the FS allocation context and consumed >> by the FS reclaim context to allow doing some provably save actions >> that would be skipped due to GFP_NOFS normally. I like this idea and >> I believe we can go that direction regardless of the approach taken here. >> Many filesystems simply need to cleanup their NOFS usage first before >> diving into a more complex changes.> > This strikes me as over-engineering to work around an unnecessarily > burdensome interface.... but without details it is hard to be certain. > > Exactly what things happen in "FS reclaim context" which may, or may > not, be safe depending on the specific FS allocation context? Do they > need to happen at all? > > My research suggests that for most filesystems the only thing that > happens in reclaim context that is at all troublesome is the final > 'evict()' on an inode. This needs to flush out dirty pages and sync the > inode to storage. Some time ago we moved most dirty-page writeout out > of the reclaim context and into kswapd. I think this was an excellent > advance in simplicity. > If we could similarly move evict() into kswapd (and I believe we can) > then most file systems would do nothing in reclaim context that > interferes with allocation context. evict() is an issue, but moving it into kswapd would be a potential problem for GFS2. We already have a memory allocation issue when recovery is taking place and memory is short. The code path is as follows: 1. Inode is scheduled for eviction (which requires deallocation) 2. The glock is required in order to perform the deallocation, which implies getting a DLM lock 3. Another node in the cluster fails, so needs recovery 4. When the DLM lock is requested, it gets blocked until recovery is complete (for the failed node) 5. Recovery is performed using a userland fencing utility 6. Fencing requires memory and then blocks on the eviction 7. Deadlock (Fencing waiting on memory alloc, memory alloc waiting on DLM lock, DLM lock waiting on fencing) It doesn't happen often, but we've been looking at the best place to break that cycle, and one of the things we've been wondering is whether we could avoid deallocation evictions from memory related contexts, or at least make it async somehow. The issue is that it is not possible to know in advance whether an eviction will result in mearly writing things back to disk (because the inode is being dropped from cache, but still resides on disk) which is easy to do, or whether it requires a full deallocation (n_link==0) which may require significant resources and time, Steve. From mstsxfx@gmail.com Fri Apr 29 07:04:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 E28A57CE4 for ; Fri, 29 Apr 2016 07:04:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B5CF4304032 for ; Fri, 29 Apr 2016 05:04:23 -0700 (PDT) X-ASG-Debug-ID: 1461931460-04cb6c09a039e920001-NocioJ Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com [74.125.82.65]) by cuda.sgi.com with ESMTP id 84QnUYYStTWPSUbc (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 29 Apr 2016 05:04:21 -0700 (PDT) X-Barracuda-Envelope-From: mstsxfx@gmail.com X-Barracuda-Effective-Source-IP: mail-wm0-f65.google.com[74.125.82.65] X-Barracuda-Apparent-Source-IP: 74.125.82.65 Received: by mail-wm0-f65.google.com with SMTP id e201so4482233wme.2 for ; Fri, 29 Apr 2016 05:04:21 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=Prng2oh9jAP5SPHHGK9JGifS5agRGeWZRXt5ermvego=; b=fT3iujw7/6KA8nNmlSMANy6sDbsWpN563C2n+X6lyt74KZQIa49YiRUbdu4WIlzAHD GXkgkuN1mhKKYYbKeWDd543+uCSE8SLYqDGHsbdPsbYXGNH+d/fOvQ9IhSmky6LjCXq1 E9HWCbbAkUqg5+6XkZXXnd2Y+IS4VMjGUNwQKTUg4ubI3e9dqh4w515QN/onAOfRDipC A0j7U/oBfJbad0aVU/caQFThv9QDmCIcTVJrJZkl3u8csTi/LMS/qEWbCqCszsIxmXpn IAFBERIh5nnFcLXY2Mx6XEf674xrF0fj64i4P/JIx2Uh21e2JpkIzrpvePF/FfLf69Zs pGsg== X-Gm-Message-State: AOPr4FUAO6UpcPzcNzRFkp9wCk7SbindlgPHZAtT4R+xDfpftMBrwY2p5NaFQnnq18ECQw== X-Received: by 10.28.51.5 with SMTP id z5mr3742913wmz.101.1461931459864; Fri, 29 Apr 2016 05:04:19 -0700 (PDT) Received: from localhost (nat1.scz.suse.com. [213.151.88.250]) by smtp.gmail.com with ESMTPSA id g197sm3001634wme.15.2016.04.29.05.04.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 29 Apr 2016 05:04:19 -0700 (PDT) Date: Fri, 29 Apr 2016 14:04:18 +0200 From: Michal Hocko To: NeilBrown Cc: linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, Andrew Morton , Dave Chinner , Theodore Ts'o , Chris Mason , Jan Kara , ceph-devel@vger.kernel.org, cluster-devel@redhat.com, linux-nfs@vger.kernel.org, logfs@logfs.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-mtd@lists.infradead.org, reiserfs-devel@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-f2fs-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, LKML Subject: Re: [PATCH 0/2] scop GFP_NOFS api Message-ID: <20160429120418.GK21977@dhcp22.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 0/2] scop GFP_NOFS api References: <1461671772-1269-1-git-send-email-mhocko@kernel.org> <8737q5ugcx.fsf@notabene.neil.brown.name> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <8737q5ugcx.fsf@notabene.neil.brown.name> User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: mail-wm0-f65.google.com[74.125.82.65] X-Barracuda-Start-Time: 1461931460 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7041 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29153 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri 29-04-16 15:35:42, NeilBrown wrote: > On Tue, Apr 26 2016, Michal Hocko wrote: > > > Hi, > > we have discussed this topic at LSF/MM this year. There was a general > > interest in the scope GFP_NOFS allocation context among some FS > > developers. For those who are not aware of the discussion or the issue > > I am trying to sort out (or at least start in that direction) please > > have a look at patch 1 which adds memalloc_nofs_{save,restore} api > > which basically copies what we have for the scope GFP_NOIO allocation > > context. I haven't converted any of the FS myself because that is way > > beyond my area of expertise but I would be happy to help with further > > changes on the MM front as well as in some more generic code paths. > > > > Dave had an idea on how to further improve the reclaim context to be > > less all-or-nothing wrt. GFP_NOFS. In short he was suggesting an opaque > > and FS specific cookie set in the FS allocation context and consumed > > by the FS reclaim context to allow doing some provably save actions > > that would be skipped due to GFP_NOFS normally. I like this idea and > > I believe we can go that direction regardless of the approach taken here. > > Many filesystems simply need to cleanup their NOFS usage first before > > diving into a more complex changes.> > > This strikes me as over-engineering to work around an unnecessarily > burdensome interface.... but without details it is hard to be certain. > > Exactly what things happen in "FS reclaim context" which may, or may > not, be safe depending on the specific FS allocation context? Do they > need to happen at all? Let me quote Dave Chinner from one of the emails discussed at LSFMM mailing list: : IMO, making GFP_NOFS "better" cannot be done with context-less flags : being passed through reclaim. If we want to prevent the recursive : self-deadlock case in an optimal manner, then we need to be able to : pass state down to reclaim so that page writeback and the shrinkers : can determine if they are likely to deadlock. : : IOWs, I think we should stop thinking of GFP_NOFS as a *global* : directive to avoid recursion under any circumstance and instead : start thinking about it as a mechanism to avoid recursion in : specific reclaim contexts. : : Something as simple as adding an opaque cookie (e.g. can hold a : superblock or inode pointer) to check against in writeback and : subsystem shrinkers would result in the vast majority of GFP_NOFS : contexts being able to reclaim from everything but the one context : that we *might* deadlock against. : : e.g, if we then also check the PF_FSTRANS flag in XFS, we'll : still be able to reclaim clean inodes, buffers and write back : dirty pages that don't require transactions to complete under "don't : recurse" situations because we know it's transactions that we could : deadlock on in the direct reclaim context. : : Note that this information could be added to the writeback_control : for page writeback, and it could be passed directly to shrinkers : in the shrink_control structures. The allocation paths might be a : little harder, but I suspect using the task struct for passing this : information into direct reclaim might be the easiest approach... > My research suggests that for most filesystems the only thing that > happens in reclaim context that is at all troublesome is the final > 'evict()' on an inode. This needs to flush out dirty pages and sync the > inode to storage. Some time ago we moved most dirty-page writeout out > of the reclaim context and into kswapd. I think this was an excellent > advance in simplicity. > If we could similarly move evict() into kswapd (and I believe we can) > then most file systems would do nothing in reclaim context that > interferes with allocation context. > > The exceptions include: > - nfs and any filesystem using fscache can block for up to 1 second > in ->releasepage(). They used to block waiting for some IO, but that > caused deadlocks and wasn't really needed. I left the timeout because > it seemed likely that some throttling would help. I suspect that a > careful analysis will show that there is sufficient throttling > elsewhere. > > - xfs_qm_shrink_scan is nearly unique among shrinkers in that it waits > for IO so it can free some quotainfo things. If it could be changed > to just schedule the IO without waiting for it then I think this > would be safe to be called in any FS allocation context. It already > uses a 'trylock' in xfs_dqlock_nowait() to avoid deadlocking > if the lock is held. > > I think you/we would end up with a much simpler system if instead of > focussing on the places where GFP_NOFS is used, we focus on places where > __GFP_FS is tested, and try to remove them. One think I have learned is that shrinkers can be really complex and getting rid of GFP_NOFS will be really hard so I would really like to start the easiest way possible and remove the direct usage and replace it by scope one which would at least _explain_ why it is needed. I think this is a reasonable _first_ step and a large step ahead because we have a good chance to get rid of a large number of those which were used "just because I wasn't sure and this should be safe, right?". I wouldn't be surprised if we end up with a very small number of both scope and direct usage in the end. I would also like to revisit generic inode/dentry shrinker and see whether it could be more __GFP_FS friendly. As you say many FS might even not depend on some FS internal locks so pushing GFP_FS check down the layers might make a lot of sense and allow to clean some [id]cache even for __GFP_FS context. > If we get rid of enough of them the remainder could just use __GFP_IO. > > > The patch 2 is a debugging aid which warns about explicit allocation > > requests from the scope context. This is should help to reduce the > > direct usage of the NOFS flags to bare minimum in favor of the scope > > API. It is not aimed to be merged upstream. I would hope Andrew took it > > into mmotm tree to give it linux-next exposure and allow developers to > > do further cleanups. There is a new kernel command line parameter which > > has to be used for the debugging to be enabled. > > > > I think the GFP_NOIO should be seeing the same clean up. > > I think you are suggesting that use of GFP_NOIO should (largely) be > deprecated in favour of memalloc_noio_save(). I think I agree. Yes that was the idea. > Could we go a step further and deprecate GFP_ATOMIC in favour of some > in_atomic() test? Maybe that is going too far. I am not really sure we need that and some GFP_NOWAIT usage is deliberate to perform an optimistic allocation with another fallback (e.g. higher order for performance reasons with single page fallback). So I think that nowait is a slightly different thing. Thanks! -- Michal Hocko SUSE Labs From mstsxfx@gmail.com Fri Apr 29 07:12:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E75E87D06 for ; Fri, 29 Apr 2016 07:12:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 679C9AC003 for ; Fri, 29 Apr 2016 05:12:25 -0700 (PDT) X-ASG-Debug-ID: 1461931942-04bdf0358f395e30001-NocioJ Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com [74.125.82.65]) by cuda.sgi.com with ESMTP id r0BHRPKECU4yDBeX (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 29 Apr 2016 05:12:23 -0700 (PDT) X-Barracuda-Envelope-From: mstsxfx@gmail.com X-Barracuda-Effective-Source-IP: mail-wm0-f65.google.com[74.125.82.65] X-Barracuda-Apparent-Source-IP: 74.125.82.65 Received: by mail-wm0-f65.google.com with SMTP id n129so4585868wmn.1 for ; Fri, 29 Apr 2016 05:12:23 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=GeDAf6OuiDdKynJ91BwmjsGgd8yqrHQ9Y5roTQXaBMU=; b=H+jvExKpsQU/LPxd1AlpdW+Xw+jJA/mUyR+EhonJWbTv2yi/kuZ8XVtaI2S5aM99BP SU9Av03CH1vY4zfRRrRr9DgN1SSZHEfGzBa/Ir9nvtNsGmrBXB904up+Z+UkaieSkdc5 VVxYZVFCTyFifr7xV7UdANDgJDLlfcuyX1gL4o36CHIhxWJ/Fr2+qocTV8LEP6G9Fns5 oT5q3bMeVRWBqpvDIA0iLhb5nr7/HtesqI0gReOf018owjaBNtnjroMWPJK9/iQDervQ wWRWAn7Mw9AAbUblAVlM4FzyrkKQnka7vUdrGMt1bJqn1WnChbv6tt04Tzsx+RtmcP5i WrPw== X-Gm-Message-State: AOPr4FUB9ELiKfZQz+ddpOyEj0QgX88JBjVswi0xUxK4briodJEffhNOWxFn+NqbhM8emw== X-Received: by 10.28.11.143 with SMTP id 137mr3485628wml.92.1461931941663; Fri, 29 Apr 2016 05:12:21 -0700 (PDT) Received: from localhost (nat1.scz.suse.com. [213.151.88.250]) by smtp.gmail.com with ESMTPSA id ug8sm14490564wjc.42.2016.04.29.05.12.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 29 Apr 2016 05:12:21 -0700 (PDT) Date: Fri, 29 Apr 2016 14:12:20 +0200 From: Michal Hocko To: Dave Chinner Cc: linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, Andrew Morton , Jan Kara , xfs@oss.sgi.com, LKML Subject: Re: [PATCH 2/2] mm, debug: report when GFP_NO{FS,IO} is used explicitly from memalloc_no{fs,io}_{save,restore} context Message-ID: <20160429121219.GL21977@dhcp22.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 2/2] mm, debug: report when GFP_NO{FS,IO} is used explicitly from memalloc_no{fs,io}_{save,restore} context References: <1461671772-1269-1-git-send-email-mhocko@kernel.org> <1461671772-1269-3-git-send-email-mhocko@kernel.org> <20160426225845.GF26977@dastard> <20160428081759.GA31489@dhcp22.suse.cz> <20160428215145.GM26977@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160428215145.GM26977@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: mail-wm0-f65.google.com[74.125.82.65] X-Barracuda-Start-Time: 1461931942 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2670 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29153 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri 29-04-16 07:51:45, Dave Chinner wrote: > On Thu, Apr 28, 2016 at 10:17:59AM +0200, Michal Hocko wrote: > > [Trim the CC list] > > On Wed 27-04-16 08:58:45, Dave Chinner wrote: > > [...] > > > Often these are to silence lockdep warnings (e.g. commit b17cb36 > > > ("xfs: fix missing KM_NOFS tags to keep lockdep happy")) because > > > lockdep gets very unhappy about the same functions being called with > > > different reclaim contexts. e.g. directory block mapping might > > > occur from readdir (no transaction context) or within transactions > > > (create/unlink). hence paths like this are tagged with GFP_NOFS to > > > stop lockdep emitting false positive warnings.... > > > > As already said in other email, I have tried to revert the above > > commit and tried to run it with some fs workloads but didn't manage > > to hit any lockdep splats (after I fixed my bug in the patch 1.2). I > > have tried to find reports which led to this commit but didn't succeed > > much. Everything is from much earlier or later. Do you happen to > > remember which loads triggered them, what they looked like or have an > > idea what to try to reproduce them? So far I was trying heavy parallel > > fs_mark, kernbench inside a tiny virtual machine so any of those have > > triggered direct reclaim all the time. > > Most of those issues were reported by users and not reproducable by > any obvious means. I would really appreciate a reference to some of those (my google-fu has failed me) or at least a pattern of those splats - was it "inconsistent {RECLAIM_FS-ON-[RW]} -> {IN-RECLAIM_FS-[WR]} usage" or a different class reports? > They may have been fixed since, but I'm sceptical > of that because, generally speaking, developer testing only catches > the obvious lockdep issues. i.e. it's users that report all the > really twisty issues, and they are generally not reproducable except > under their production workloads... > > IOWs, the absence of reports in your testing does not mean there > isn't a problem, and that is one of the biggest problems with > lockdep annotations - we have no way of ever knowing if they are > still necessary or not without exposing users to regressions and > potential deadlocks..... I understand your points here but if we are sure that those lockdep reports are just false positives then we should rather provide an api to silence lockdep for those paths than abusing GFP_NOFS which a) hurts the overal reclaim healthiness and b) works around a non-existing problem with lockdep disabled which is the vast majority of configurations. Thanks! -- Michal Hocko SUSE Labs From jtulak@redhat.com Fri Apr 29 09:43:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 5F2647CF6 for ; Fri, 29 Apr 2016 09:43:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B185CAC003 for ; Fri, 29 Apr 2016 07:43:12 -0700 (PDT) X-ASG-Debug-ID: 1461940986-04cbb00fe93853b0001-NocioJ Received: from mail-io0-f179.google.com (mail-io0-f179.google.com [209.85.223.179]) by cuda.sgi.com with ESMTP id DFRLuQAiceS3hlgP (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 29 Apr 2016 07:43:06 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.179 Received: by mail-io0-f179.google.com with SMTP id 190so104001115iow.1 for ; Fri, 29 Apr 2016 07:43:06 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=dBm9FyMfXoETbo/lfLg1jVB5VTlYt+e1smSH6eShVt0=; b=BR4Hyo9J/+EVuzZg8kIcf6AcX0jcVnKjt7XuP7ht7q/rDBK2NwcDzvnt4Bymxc7p+x +W5/A1+IgDndQI/0VzIRLa/Ts4o7PSX3ehxc/PdxpRmJAR8S6UQCtkMH3SMpAZFUbfv/ GSCJYE2zGHIoeCB9mnq2pl2LMRHwTnBiIxALXBU2c31BEadlt9QU4xcFblc2rAQunH+1 S5akMiakwWJwORsBVIghDLZYyr8D8BDr0J+NO9HFkMqvIs0LNGfr/J6q/nSZINAz6KrZ Od7+B5AreV55iGs6Jo7gixZW/DrU0SwG70YpkrI5PX1Lo34J2sdYSDbH/ZJlS5R7+gX5 8Sfw== X-Gm-Message-State: AOPr4FVXIylUEFyqFp2UnX7oWnHp4x+q8HgAGH/M8RepGH/iklFLcxB2ipB9pRlrRTUq669UKdYg75Iw9V9qt6AL X-Received: by 10.107.152.85 with SMTP id a82mr23756920ioe.46.1461940986332; Fri, 29 Apr 2016 07:43:06 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.58.79 with HTTP; Fri, 29 Apr 2016 07:42:46 -0700 (PDT) In-Reply-To: <20160429015927.GN18496@dastard> References: <1461231593-31294-1-git-send-email-jtulak@redhat.com> <1461832149-18276-1-git-send-email-jtulak@redhat.com> <20160429015927.GN18496@dastard> From: Jan Tulak Date: Fri, 29 Apr 2016 16:42:46 +0200 Message-ID: Subject: Re: [RFC PATCH] xfstests: Add mkfs input validation tests To: Dave Chinner X-ASG-Orig-Subj: Re: [RFC PATCH] xfstests: Add mkfs input validation tests Cc: fstests@vger.kernel.org, xfs-oss Content-Type: multipart/alternative; boundary=001a114079ae2c88430531a0a9ff X-Barracuda-Connect: mail-io0-f179.google.com[209.85.223.179] X-Barracuda-Start-Time: 1461940986 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 15290 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29155 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 --001a114079ae2c88430531a0a9ff Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Fri, Apr 29, 2016 at 3:59 AM, Dave Chinner wrote: > On Thu, Apr 28, 2016 at 10:29:09AM +0200, Jan Tulak wrote: > > Test inputs for my mkfs-cleaning patchset. This test will fail with the > old sphageti code mkfs, among others because the old code accepts incorre= ct > values. > > > > > > > > Signed-off-by: Dave Chinner > > Signed-off-by: Jan Tulak > > Please don't strip the commit messages from patches you've picked up > from other people - it loses valuable information, as well as the > original author of the code. i.e. The original commit message was: > > =E2=80=8BSorry about that. I removed it mistakenly long time ago, and now= , I didn't realised I should copy yours instead of making my own. > > From: Dave Chinner > > mkfs.xfs does not do a very good job of input validation. This test > is designed to exercise the input validation and test good/bad > combinations of options being set. It will not pass on a current > mkfs.xfs binary - it is designed to be the test case for a input > validation cleanup. > > Signed-off-by: Dave Chinner > > > --- > > > > Hi guys, > > > > I'm sending this patch although the mentioned patchset is not yet merge= d. > > It might help you a bit with checking if there are any issues with > > the patchset, as here it is clear, what options works and what not. > > in which case, a "_require_xfs_mkfs_validation" rule should be > written to determine the version of mkfs being. e.g. by testing one > of the failure cases that the unfixed binary says is ok. > .... > > +# basic "should fail" options > > +# logarithm based options are no longer valid > > +# NOTE: umm, when it got invalid? It seems to be still supported... > > +#do_mkfs_fail -s log=3D10 $SCRATCH_DEV > > +#do_mkfs_fail -b log=3D10 $SCRATCH_DEV > > +#do_mkfs_fail -n log=3D10 $SCRATCH_DEV > > +#do_mkfs_fail -i log=3D10 $SCRATCH_DEV > > +#do_mkfs_fail -d sectlog=3D10 $SCRATCH_DEV > > +#do_mkfs_fail -l sectlog=3D10 $SCRATCH_DEV > > They were expected to fail because I was going to remove the log > options from mkfs as part of the cleanup series because they are > redundant and nobody uses them. i.e this test was written with what > I wanted as the end result of the mkfs input validation cleanup, not > an iteration of the current behaviour. > > After all the data section tests, the new tests you've added all > seem to be pretty ad-hoc. What I was fleshing out in this test was > a relatively complete set exercising each the different options mkfs > supports. > > I'd only iterated data section options so far in this test. I'd just > started on the naming section tests, and had not added any but a > basic test. That needs to be iterated, as do the inode, log (both > internal and external), metadata and realtime options.... > > =E2=80=8BI added many of the new lines when I found some issue, to preven= t regressions. But yeah, I will put it into an orderly fashion and iterate through other things > > > +# invalid file section tests > > +rm -f $fsimg > > +$XFS_IO_PROG -f -c "truncate $fssize" $fsimg > > +do_mkfs_fail -d file $fsimg > > +do_mkfs_fail -d file,name=3D$fsimg > > Why should these fail - size should not be required if the image > file already exists and is of sufficient size.... > =E2=80=8BWell, they should pass. I'm sending an updated patch to the set as= well. > > + > > +# naming section tests > > +do_mkfs_pass -n size=3D65536 $SCRATCH_DEV > > + > > +# boolean options > > +$XFS_IO_PROG -f -c "truncate $fssize" $fsimg > > +do_mkfs_pass -d file=3D1,size=3D$fssize $fsimg > > +do_mkfs_pass -d file=3D0 $SCRATCH_DEV > > +do_mkfs_fail -d file=3D1 $SCRATCH_DEV > > More image file tests, belong in the data section with the other > image file tests. > =E2=80=8B=E2=80=8B > > > +# Specific flag combinations where some bug appeared during developmen= t, > > +# to catch the same issue if it re-appears. If there are multiple > similar > > +# checks, move them to a standalone block. > > + > > + > > +do_mkfs_pass -m crc=3D1,finobt=3D1 $SCRATCH_DEV > > What about all the other invalid cases? > > > +do_mkfs_pass -m crc=3D1 -n ftype=3D1 $SCRATCH_DEV > > +do_mkfs_pass -m crc=3D0 -n ftype=3D1 $SCRATCH_DEV > > +do_mkfs_fail -m crc=3D1 -n ftype=3D0 $SCRATCH_DEV > > +do_mkfs_pass -m crc=3D0 -n ftype=3D0 $SCRATCH_DEV > > +do_mkfs_pass -n ftype=3D1 -m crc=3D0 $SCRATCH_DEV > > One of the cleanup requirements was that option parsing would not > be order sensitive, so I don't think you need to iterate parameters > in different orders. That would just blow out the test matrix > unnecessarily. Also, if you really need to repeat the same test but > with different orders, please place those tests sequentially in the > file so it's clear that they are duplicate/order swapped tests.... > =E2=80=8B > =E2=80=8BI added it as a test that the order independency really works. Thi= s is one case, where the original code was order-dependent... But maybe such test is not necessary, as it should be so by design and there is no way to screw it up for all options at once. =E2=80=8B =E2=80=8BSo to sum all the email, I will make an updated version with more = test data. However, it will take me some time, because in few days, exams on my university are starting, so I need to focus there and start learning.=E2=80= =8B :-) Thanks and cheers, Jan =E2=80=8B > > > > +# if user states crc=3D0,finobt=3D1, fail instead of warning > > +do_mkfs_fail -m crc=3D0,finobt=3D1 $SCRATCH_DEV > > Why is this separate to the other crc,finobt test? Please try to > keep the parameter checks in logical groupings.... > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > =E2=80=8B --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --001a114079ae2c88430531a0a9ff Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
    On Fri, Ap= r 29, 2016 at 3:59 AM, Dave Chinner <david@fromorbit.com> wrote:
    On Thu, Apr 28, 2016 at 10:29:09A= M +0200, Jan Tulak wrote:
    > Test inputs for my mkfs-cleaning patchset. This test will fail with th= e old sphageti code mkfs, among others because the old code accepts incorre= ct values.
    >
    >
    >
    > Signed-off-by: Dave Chinner <dchinner@redhat.com>
    > Signed-off-by: Jan Tulak <jtulak@redhat.com>

    Please don't strip the commit messages from patches you've p= icked up
    from other people - it loses valuable information, as well as the
    original author of the code. i.e. The original commit message was:

    =E2=80=8BSorry about that. I removed it mistakenly= long time ago, and now, I didn't realised I should copy yours instead = of making my own.

    =C2=A0

    From: Dave Chinner <dchinner@redhat.com>

    mkfs.xfs does not do a very good job of input validation. This test
    is designed to exercise the input validation and test good/bad
    combinations of options being set. It will not pass on a current
    mkfs.xfs binary - it is designed to be the test case for a input
    validation cleanup.

    Signed-off-by: Dave Chinner <dchinner@redhat.com>

    > ---
    >
    > Hi guys,
    >
    > I'm sending this patch although the mentioned patchset is not yet = merged.
    > It might help you a bit with checking if there are any issues with
    > the patchset, as here it is clear, what options works and what not.
    in which case, a "_require_xfs_mkfs_validation" rule shoul= d be
    written to determine the version of mkfs being. e.g. by testing one
    of the failure cases that the unfixed binary says is ok.
    ....
    > +# basic "should fail" options
    > +# logarithm based options are no longer valid
    > +# NOTE: umm, when it got invalid? It seems to be still supported... > +#do_mkfs_fail -s log=3D10 $SCRATCH_DEV
    > +#do_mkfs_fail -b log=3D10 $SCRATCH_DEV
    > +#do_mkfs_fail -n log=3D10 $SCRATCH_DEV
    > +#do_mkfs_fail -i log=3D10 $SCRATCH_DEV
    > +#do_mkfs_fail -d sectlog=3D10 $SCRATCH_DEV
    > +#do_mkfs_fail -l sectlog=3D10 $SCRATCH_DEV

    They were expected to fail because I was going to remove the log
    options from mkfs as part of the cleanup series because they are
    redundant and nobody uses them. i.e this test was written with what
    I wanted as the end result of the mkfs input validation cleanup, not
    an iteration of the current behaviour.

    After all the data section tests, the new tests you've added all
    seem to be pretty ad-hoc.=C2=A0 What I was fleshing out in this test was a relatively complete set exercising each the different options mkfs
    supports.

    I'd only iterated data section options so far in this test. I'd jus= t
    started on the naming section tests, and had not added any but a
    basic test. That needs to be iterated, as do the inode, log (both
    internal and external), metadata and realtime options....

    =E2=80=8BI added many of the new lines whe= n I found some issue, to prevent regressions. But yeah, I will put it into = an orderly fashion and iterate through other things
    =C2=A0
    <= blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-l= eft-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;pa= dding-left:1ex">
    > +# invalid file section tests
    > +rm -f $fsimg
    > +$XFS_IO_PROG -f -c "truncate $fssize" $fsimg
    > +do_mkfs_fail -d file $fsimg
    > +do_mkfs_fail -d file,name=3D$fsimg

    Why should these fail - size should not be required if the image
    file already exists and is of sufficient size....

    =
    =E2=80=8BWell, they should pass. I'm sending an updated p= atch to the set as well.
    =C2=A0
    > +
    > +# naming section tests
    > +do_mkfs_pass -n size=3D65536 $SCRATCH_DEV
    > +
    > +# boolean options
    > +$XFS_IO_PROG -f -c "truncate $fssize" $fsimg
    > +do_mkfs_pass -d file=3D1,size=3D$fssize $fsimg
    > +do_mkfs_pass -d file=3D0 $SCRATCH_DEV
    > +do_mkfs_fail -d file=3D1 $SCRATCH_DEV

    More image file tests, belong in the data section with the other
    image file tests.
    =E2=80=8B=E2=80=8B

    > +# Specific flag combinations where some bug appeared during developme= nt,
    > +# to catch the same issue if it re-appears. If there are multiple sim= ilar
    > +# checks, move them to a standalone block.
    > +
    > +
    > +do_mkfs_pass -m crc=3D1,finobt=3D1 $SCRATCH_DEV

    What about all the other invalid cases?

    > +do_mkfs_pass -m crc=3D1 -n ftype=3D1 $SCRATCH_DEV
    > +do_mkfs_pass -m crc=3D0 -n ftype=3D1 $SCRATCH_DEV
    > +do_mkfs_fail -m crc=3D1 -n ftype=3D0 $SCRATCH_DEV
    > +do_mkfs_pass -m crc=3D0 -n ftype=3D0 $SCRATCH_DEV
    > +do_mkfs_pass -n ftype=3D1 -m crc=3D0 $SCRATCH_DEV

    One of the cleanup requirements was that option parsing would not be order sensitive, so I don't think you need to iterate parameters
    in different orders. That would just blow out the test matrix
    unnecessarily. Also, if you really need to repeat the same test but
    with different orders, please place those tests sequentially in the
    file so it's clear that they are duplicate/order swapped tests....
    =E2=80=8B

    =E2=80=8BI = added it as a test that the order independency really works. This is one ca= se, where the original code was order-dependent... But maybe such test is n= ot necessary, as it should be so by design and there is no way to screw it = up for all options at once. =E2=80=8B


    =E2=80=8BSo to sum all the email, I will make an updated version= with more test data. However, it will take me some time, because in few da= ys, exams on my university are starting, so I need to focus there and start= learning.=E2=80=8B :-)

    Thanks and cheers,
    Jan=


    =E2= =80=8B


    > +# if user states crc=3D0,finobt=3D1, fail instead of warning
    > +do_mkfs_fail -m crc=3D0,finobt=3D1 $SCRATCH_DEV

    Why is this separate to the other crc,finobt test? Please try to
    keep the parameter checks in logical groupings....

    Cheers,

    Dave.
    --
    Dave Chinner
    david@fromorbit.co= m
    =E2=80=8B

    --
    <= /div>
    --001a114079ae2c88430531a0a9ff-- From jtulak@redhat.com Fri Apr 29 09:47:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 99FD27D02 for ; Fri, 29 Apr 2016 09:47:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4E7CB8F804C for ; Fri, 29 Apr 2016 07:47:55 -0700 (PDT) X-ASG-Debug-ID: 1461941269-04bdf0358f3a88e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id FvzbNQcQuk9ntlgI (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 29 Apr 2016 07:47:50 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A614D68E1E for ; Fri, 29 Apr 2016 14:47:49 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3TElmpv030844 for ; Fri, 29 Apr 2016 10:47:48 -0400 From: Jan Tulak To: xfs@oss.sgi.com Subject: [PATCH 15/19 v3] mkfs: don't treat files as though they are block devices Date: Fri, 29 Apr 2016 16:47:47 +0200 X-ASG-Orig-Subj: [PATCH 15/19 v3] mkfs: don't treat files as though they are block devices Message-Id: <1461941267-31556-1-git-send-email-jtulak@redhat.com> In-Reply-To: <1461311383-30897-1-git-send-email-jtulak@redhat.com> References: <1461311383-30897-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1461941270 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 13151 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Dave Chinner If the device is actually a file, and "-d file" is not specified, mkfs will try to treat it as a block device and get stuff wrong. Image files don't necessarily have the same sector sizes as the block device or filesystem underlying the image file, nor should we be issuing discard ioctls on image files. To fix this sanely, only require "-d file" if the device name is invalid to trigger creation of the file. Otherwise, use stat() to determine if the device is a file or block device and deal with that appropriately by setting the "isfile" variables and turning off direct IO. Then ensure that we check the "isfile" options before doing things that are specific to block devices. Other file/blockdev issues fixed: - use getstr to detect specifying the data device name twice. - check file/size/name parameters before anything else. - overwrite checks need to be done before the image file is opened and potentially truncated. - blkid_get_topology() should not be called for image files, so warn when it is called that way. - zero_old_xfs_structures() emits a spurious error: "existing superblock read failed: Success" when it is run on a truncated image file. Don't warn if we see this problem on an image file. - Don't issue discards on image files. - Use fsync() for image files, not BLKFLSBUF in platform_flush_device() for Linux. Signed-off-by: Dave Chinner Signed-off-by: Jan Tulak --- CHANGES: * read image file size in advance of O_TRUNC in case of dfile&&dcreat Signed-off-by: Jan Tulak --- libxfs/init.c | 21 ++++++- libxfs/linux.c | 11 +++- mkfs/xfs_mkfs.c | 182 ++++++++++++++++++++++++++++++++++++++------------------ 3 files changed, 154 insertions(+), 60 deletions(-) diff --git a/libxfs/init.c b/libxfs/init.c index 8d747e8..c7ae00d 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -253,8 +253,15 @@ libxfs_init(libxfs_init_t *a) rtname = a->rtname; a->dfd = a->logfd = a->rtfd = -1; a->ddev = a->logdev = a->rtdev = 0; - a->dbsize = a->lbsize = a->rtbsize = 0; - a->dsize = a->logBBsize = a->logBBstart = a->rtsize = 0; + a->lbsize = a->rtbsize = 0; + a->logBBsize = a->logBBstart = a->rtsize = 0; + + // We can reset dbsize only when it is not a file, or we won't + // truncate it. Otherwise, we loose the size of the file forever. + if (!a->disfile || !a->dcreat) { + a->dsize = 0; + a->dbsize = 0; + } (void)getcwd(curdir,MAXPATHLEN); needcd = 0; @@ -278,6 +285,12 @@ libxfs_init(libxfs_init_t *a) a->ddev= libxfs_device_open(dname, a->dcreat, flags, a->setblksize); a->dfd = libxfs_device_to_fd(a->ddev); + // with dcreat, it would overwrite dsize with zero + // and lost the size + if (!a->dcreat) { + platform_findsizes(dname, a->dfd, &a->dsize, + &a->dbsize); + } } else { if (!check_open(dname, flags, &rawfile, &blockfile)) goto done; @@ -297,6 +310,8 @@ libxfs_init(libxfs_init_t *a) a->logdev = libxfs_device_open(logname, a->lcreat, flags, a->setblksize); a->logfd = libxfs_device_to_fd(a->logdev); + platform_findsizes(dname, a->logfd, &a->logBBsize, + &a->lbsize); } else { if (!check_open(logname, flags, &rawfile, &blockfile)) goto done; @@ -316,6 +331,8 @@ libxfs_init(libxfs_init_t *a) a->rtdev = libxfs_device_open(rtname, a->rcreat, flags, a->setblksize); a->rtfd = libxfs_device_to_fd(a->rtdev); + platform_findsizes(dname, a->rtfd, &a->rtsize, + &a->rtbsize); } else { if (!check_open(rtname, flags, &rawfile, &blockfile)) goto done; diff --git a/libxfs/linux.c b/libxfs/linux.c index f6ea1b2..c9f2baf 100644 --- a/libxfs/linux.c +++ b/libxfs/linux.c @@ -125,7 +125,16 @@ platform_set_blocksize(int fd, char *path, dev_t device, int blocksize, int fata void platform_flush_device(int fd, dev_t device) { - if (major(device) != RAMDISK_MAJOR) + struct stat64 st; + if (major(device) == RAMDISK_MAJOR) + return; + + if (fstat64(fd, &st) < 0) + return; + + if (S_ISREG(st.st_mode)) + fsync(fd); + else ioctl(fd, BLKFLSBUF, 0); } diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index b1043fb..f75b89c 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -787,7 +787,7 @@ calc_stripe_factors( #ifdef ENABLE_BLKID static int check_overwrite( - char *device) + const char *device) { const char *type; blkid_probe pr = NULL; @@ -804,7 +804,7 @@ check_overwrite( fd = open(device, O_RDONLY); if (fd < 0) goto out; - platform_findsizes(device, fd, &size, &bsz); + platform_findsizes((char *)device, fd, &size, &bsz); close(fd); /* nothing to overwrite on a 0-length device */ @@ -851,7 +851,6 @@ check_overwrite( "according to blkid\n"), progname, device); } ret = 1; - out: if (pr) blkid_free_probe(pr); @@ -877,8 +876,12 @@ static void blkid_get_topology( struct stat statbuf; /* can't get topology info from a file */ - if (!stat(device, &statbuf) && S_ISREG(statbuf.st_mode)) + if (!stat(device, &statbuf) && S_ISREG(statbuf.st_mode)) { + fprintf(stderr, + _("%s: Warning: trying to probe topology of a file %s!\n"), + progname, device); return; + } pr = blkid_new_probe_from_filename(device); if (!pr) @@ -988,7 +991,6 @@ static void get_topology( (!stat(dfile, &statbuf) && S_ISREG(statbuf.st_mode))) { int fd; int flags = O_RDONLY; - long long dummy; /* with xi->disfile we may not have the file yet! */ if (xi->disfile) @@ -996,9 +998,10 @@ static void get_topology( fd = open(dfile, flags, 0666); if (fd >= 0) { - platform_findsizes(dfile, fd, &dummy, &ft->lsectorsize); + platform_findsizes(dfile, fd, &xi->dsize, &ft->lsectorsize); close(fd); ft->psectorsize = ft->lsectorsize; + xi->dbsize = ft->lsectorsize; } else ft->psectorsize = ft->lsectorsize = BBSIZE; } else { @@ -1016,6 +1019,79 @@ static void get_topology( } static void +check_device_type( + const char *name, + int *isfile, + bool no_size, + bool no_name, + int *create, + bool force_overwrite, + const char *optname) +{ + struct stat64 statbuf; + /* + if (*isfile && (no_size || no_name)) { + fprintf(stderr, + _("if -%s file then -%s name and -%s size are required\n"), + optname, optname, optname); + usage(); + }*/ + + if (name == NULL) { + usage(); + } + + if (stat64(name, &statbuf)) { + if (errno == ENOENT && *isfile) { + if (create) + *create = 1; + return; + } + + fprintf(stderr, + _("Error accessing specified device %s: %s\n"), + name, strerror(errno)); + usage(); + return; + } + + if (!force_overwrite && check_overwrite(name)) { + fprintf(stderr, + _("%s: Use the -f option to force overwrite.\n"), + progname); + exit(1); + } + + /* + * We only want to completely truncate and recreate an existing file if + * we were specifically told it was a file. Set the create flag only in + * this case to trigger that behaviour. + */ + if (S_ISREG(statbuf.st_mode)) { + if (!*isfile) + *isfile = 1; + else if (create) + *create = 1; + return; + } + + if (S_ISBLK(statbuf.st_mode)) { + if (*isfile) { + fprintf(stderr, + _("specified \"-%s file\" on a block device %s\n"), + optname, name); + usage(); + } + return; + } + + fprintf(stderr, + _("specified device %s not a file or block device\n"), + name); + usage(); +} + +static void fixup_log_stripe_unit( int lsflag, int sunit, @@ -1280,7 +1356,6 @@ zero_old_xfs_structures( __uint32_t bsize; int i; xfs_off_t off; - int tmp; /* * We open regular files with O_TRUNC|O_CREAT. Nothing to do here... @@ -1300,15 +1375,18 @@ zero_old_xfs_structures( } memset(buf, 0, new_sb->sb_sectsize); - tmp = pread(xi->dfd, buf, new_sb->sb_sectsize, 0); - if (tmp < 0) { - fprintf(stderr, _("existing superblock read failed: %s\n"), - strerror(errno)); - goto done; - } - if (tmp != new_sb->sb_sectsize) { - fprintf(stderr, - _("warning: could not read existing superblock, skip zeroing\n")); + /* + * If we are creating an image file, it might be of zero length at this + * point in time. Hence reading the existing superblock is going to + * return zero bytes. It's not a failure we need to warn about in this + * case. + */ + off = pread(xi->dfd, buf, new_sb->sb_sectsize, 0); + if (off != new_sb->sb_sectsize) { + if (!xi->disfile) + fprintf(stderr, + _("error reading existing superblock: %s\n"), + strerror(errno)); goto done; } libxfs_sb_from_disk(&sb, buf); @@ -1786,8 +1864,6 @@ main( case D_FILE: xi.disfile = getnum(value, &dopts, D_FILE); - if (xi.disfile && !Nflag) - xi.dcreat = 1; break; case D_NAME: xi.dname = getstr(value, &dopts, D_NAME); @@ -1913,11 +1989,6 @@ main( case L_FILE: xi.lisfile = getnum(value, &lopts, L_FILE); - if (xi.lisfile && loginternal) - conflict('l', subopts, L_INTERNAL, - L_FILE); - if (xi.lisfile) - xi.lcreat = 1; break; case L_INTERNAL: loginternal = getnum(value, &lopts, @@ -2075,8 +2146,6 @@ main( case R_FILE: xi.risfile = getnum(value, &ropts, R_FILE); - if (xi.risfile) - xi.rcreat = 1; break; case R_NAME: case R_DEV: @@ -2181,6 +2250,26 @@ _("Minimum block size for CRC enabled filesystems is %d bytes.\n"), lsectorsize = sectorsize; } + /* + * Before anything else, verify that we are correctly operating on + * files or block devices and set the control parameters correctly. + * Explicitly disable direct IO for image files so we don't error out on + * sector size mismatches between the new filesystem and the underlying + * host filesystem. + */ + check_device_type(dfile, &xi.disfile, !dsize, !dfile, + Nflag ? NULL : &xi.dcreat, force_overwrite, "d"); + if (!loginternal) + check_device_type(xi.logname, &xi.lisfile, !logsize, !xi.logname, + Nflag ? NULL : &xi.lcreat, + force_overwrite, "l"); + if (xi.rtname) + check_device_type(xi.rtname, &xi.risfile, !rtsize, !xi.rtname, + Nflag ? NULL : &xi.rcreat, + force_overwrite, "r"); + if (xi.disfile || xi.lisfile || xi.risfile) + xi.isdirect = 0; + memset(&ft, 0, sizeof(ft)); get_topology(&xi, &ft, force_overwrite); @@ -2331,11 +2420,6 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); } - if (xi.disfile && (!dsize || !xi.dname)) { - fprintf(stderr, - _("if -d file then -d name and -d size are required\n")); - usage(); - } if (dsize) { __uint64_t dbytes; @@ -2368,11 +2452,6 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); usage(); } - if (xi.lisfile && (!logsize || !xi.logname)) { - fprintf(stderr, - _("if -l file then -l name and -l size are required\n")); - usage(); - } if (logsize) { __uint64_t logbytes; @@ -2390,11 +2469,6 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); (long long)logbytes, blocksize, (long long)(logblocks << blocklog)); } - if (xi.risfile && (!rtsize || !xi.rtname)) { - fprintf(stderr, - _("if -r file then -r name and -r size are required\n")); - usage(); - } if (rtsize) { __uint64_t rtbytes; @@ -2516,22 +2590,14 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n")); xi.rtsize &= sector_mask; xi.logBBsize &= (__uint64_t)-1 << (MAX(lsectorlog, 10) - BBSHIFT); - if (!force_overwrite) { - if (check_overwrite(dfile) || - check_overwrite(logfile) || - check_overwrite(xi.rtname)) { - fprintf(stderr, - _("%s: Use the -f option to force overwrite.\n"), - progname); - exit(1); - } - } + /* don't do discards on print-only runs or on files */ if (discard && !Nflag) { - discard_blocks(xi.ddev, xi.dsize); - if (xi.rtdev) + if (!xi.disfile) + discard_blocks(xi.ddev, xi.dsize); + if (xi.rtdev && !xi.risfile) discard_blocks(xi.rtdev, xi.rtsize); - if (xi.logdev && xi.logdev != xi.ddev) + if (xi.logdev && xi.logdev != xi.ddev && !xi.lisfile) discard_blocks(xi.logdev, xi.logBBsize); } @@ -3063,10 +3129,12 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), * so that the reads for the end of the device in the mount code * will succeed. */ - if (xi.disfile && ftruncate64(xi.dfd, dblocks * blocksize) < 0) { - fprintf(stderr, _("%s: Growing the data section failed\n"), - progname); - exit(1); + if (xi.disfile && xi.dsize*xi.dbsize <= dblocks * blocksize) { + if (ftruncate64(xi.dfd, dblocks * blocksize) < 0) { + fprintf(stderr, _("%s: Growing the data section failed\n"), + progname); + exit(1); + } } /* -- 2.5.0 From sandeen@sandeen.net Fri Apr 29 14:11:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3FE987D06 for ; Fri, 29 Apr 2016 14:11:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0E46E8F8037 for ; Fri, 29 Apr 2016 12:11:42 -0700 (PDT) X-ASG-Debug-ID: 1461957098-04cbb00fea3950b0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id rLDlM2xQ9vVG4VcY for ; Fri, 29 Apr 2016 12:11:38 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 72CE12A83 for ; Fri, 29 Apr 2016 14:11:38 -0500 (CDT) Subject: Re: [PATCH 15/19 v3] mkfs: don't treat files as though they are block devices To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 15/19 v3] mkfs: don't treat files as though they are block devices References: <1461311383-30897-1-git-send-email-jtulak@redhat.com> <1461941267-31556-1-git-send-email-jtulak@redhat.com> From: Eric Sandeen Message-ID: Date: Fri, 29 Apr 2016 14:11:38 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.0 MIME-Version: 1.0 In-Reply-To: <1461941267-31556-1-git-send-email-jtulak@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1461957098 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3500 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29161 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/29/16 9:47 AM, Jan Tulak wrote: > From: Dave Chinner > > If the device is actually a file, and "-d file" is not specified, > mkfs will try to treat it as a block device and get stuff wrong. > Image files don't necessarily have the same sector sizes as the > block device or filesystem underlying the image file, nor should we > be issuing discard ioctls on image files. > > To fix this sanely, only require "-d file" if the device name is > invalid to trigger creation of the file. Otherwise, use stat() to > determine if the device is a file or block device and deal with that > appropriately by setting the "isfile" variables and turning off > direct IO. Then ensure that we check the "isfile" options before > doing things that are specific to block devices. > > Other file/blockdev issues fixed: > - use getstr to detect specifying the data device name > twice. > - check file/size/name parameters before anything else. > - overwrite checks need to be done before the image file is > opened and potentially truncated. > - blkid_get_topology() should not be called for image files, > so warn when it is called that way. > - zero_old_xfs_structures() emits a spurious error: > "existing superblock read failed: Success" > when it is run on a truncated image file. Don't warn if we > see this problem on an image file. > - Don't issue discards on image files. > - Use fsync() for image files, not BLKFLSBUF in > platform_flush_device() for Linux. > > Signed-off-by: Dave Chinner > Signed-off-by: Jan Tulak > > --- > CHANGES: > * read image file size in advance of O_TRUNC in case of dfile&&dcreat > Signed-off-by: Jan Tulak > --- > libxfs/init.c | 21 ++++++- > libxfs/linux.c | 11 +++- > mkfs/xfs_mkfs.c | 182 ++++++++++++++++++++++++++++++++++++++------------------ > 3 files changed, 154 insertions(+), 60 deletions(-) > > diff --git a/libxfs/init.c b/libxfs/init.c > index 8d747e8..c7ae00d 100644 > --- a/libxfs/init.c > +++ b/libxfs/init.c > @@ -253,8 +253,15 @@ libxfs_init(libxfs_init_t *a) > rtname = a->rtname; > a->dfd = a->logfd = a->rtfd = -1; > a->ddev = a->logdev = a->rtdev = 0; > - a->dbsize = a->lbsize = a->rtbsize = 0; > - a->dsize = a->logBBsize = a->logBBstart = a->rtsize = 0; > + a->lbsize = a->rtbsize = 0; > + a->logBBsize = a->logBBstart = a->rtsize = 0; > + > + // We can reset dbsize only when it is not a file, or we won't > + // truncate it. Otherwise, we loose the size of the file forever. please don't use c++ comments in xfsprogs, we use /* comments */ ... > static void > +check_device_type( > + const char *name, > + int *isfile, > + bool no_size, > + bool no_name, > + int *create, > + bool force_overwrite, > + const char *optname) > +{ > + struct stat64 statbuf; > + /* > + if (*isfile && (no_size || no_name)) { > + fprintf(stderr, > + _("if -%s file then -%s name and -%s size are required\n"), > + optname, optname, optname); > + usage(); > + }*/ What is this? Jan, I'm just going to go back to the original patches posted in your V2 series, and either give them Reviewed-by's, or send followup fix-up patches with a Eric Sandeen : fixed up foo, bar, baz tag and a Reviewed-by to go with it, I think that might be the fastest path to finally getting this stuff merged. Thanks, -Eric From vishal.l.verma@intel.com Fri Apr 29 16:56:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6BB767CFA for ; Fri, 29 Apr 2016 16:56:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 31E7330405F for ; Fri, 29 Apr 2016 14:56:10 -0700 (PDT) X-ASG-Debug-ID: 1461966966-04cbb00fea39cac0001-NocioJ Received: from mga14.intel.com ([192.55.52.115]) by cuda.sgi.com with ESMTP id FflSH1CqG1AUFCsR for ; Fri, 29 Apr 2016 14:56:06 -0700 (PDT) X-Barracuda-Envelope-From: vishal.l.verma@intel.com X-Barracuda-Effective-Source-IP: UNKNOWN[192.55.52.115] X-Barracuda-Apparent-Source-IP: 192.55.52.115 X-ASG-Whitelist: Client Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga103.fm.intel.com with ESMTP; 29 Apr 2016 14:56:05 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,553,1455004800"; d="scan'208";a="94526062" Received: from omniknight.lm.intel.com ([10.232.112.171]) by fmsmga004.fm.intel.com with ESMTP; 29 Apr 2016 14:56:05 -0700 From: Vishal Verma To: linux-nvdimm@lists.01.org Cc: Vishal Verma , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-mm@kvack.org, Matthew Wilcox , Ross Zwisler , Dan Williams , Dave Chinner , Jan Kara , Jens Axboe , Al Viro , Andrew Morton , linux-kernel@vger.kernel.org, Christoph Hellwig , Jeff Moyer Subject: [PATCH v4 8/7] Documentation: add error handling information to dax.txt Date: Fri, 29 Apr 2016 15:55:42 -0600 X-ASG-Orig-Subj: [PATCH v4 8/7] Documentation: add error handling information to dax.txt Message-Id: <1461966942-21205-1-git-send-email-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> References: <1461878218-3844-1-git-send-email-vishal.l.verma@intel.com> X-Barracuda-Connect: UNKNOWN[192.55.52.115] X-Barracuda-Start-Time: 1461966966 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2828 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This just provides information of the basic paths that can be used to deal with (i.e. clear) media errors from the file system point-of-view. Cc: Dave Chinner Signed-off-by: Vishal Verma --- While this isn't a design document for new mechanisms for adding error recovery/redundancy at the block/fs layers, this attempts to explain the bare essentials required for anything operating above the pmem block driver in the stack. Documentation/filesystems/dax.txt | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/Documentation/filesystems/dax.txt b/Documentation/filesystems/dax.txt index 7bde640..71cd8fa 100644 --- a/Documentation/filesystems/dax.txt +++ b/Documentation/filesystems/dax.txt @@ -79,6 +79,40 @@ These filesystems may be used for inspiration: - ext4: the fourth extended filesystem, see Documentation/filesystems/ext4.txt +Handling Media Errors +--------------------- + +The libnvdimm subsystem stores a record of known media error locations for +each pmem block device (in gendisk->badblocks). If we fault at such location, +or one with a latent error not yet discovered, the application can expect +to receive a SIGBUS. Libnvdimm also allows clearing of these errors by simply +writing the affected sectors (through the pmem driver, and if the underlying +NVDIMM supports the clear_poison DSM defined by ACPI). + +Since DAX IO normally doesn't go through the driver/bio path, applications or +sysadmins have an option to restore the lost data from a prior backup/inbuilt +redundancy in the following two ways: + +1. Delete the affected file, and restore from a backup (sysadmin route): + This will free the file system blocks that were being used by the file, + and the next time they're allocated, they will be zeroed first, which + happens through the driver, and will clear bad sectors. + +2. Open the file with O_DIRECT, and restore a sector's worth of data at the + bad location (application route): + We allow O_DIRECT writes to go through the normal O_DIRECT path that sends + bios down through the driver. If an application is able to restore its own + data, it can use this path to clear errors. + +These are the two basic paths that allow DAX filesystems to continue operating +in the presence of media errors. More robust error recovery mechanisms can be +built on top of this in the future, for example, involving redundancy/mirroring +provided at the block layer through DM, or additionally, at the filesystem +level. These would have to rely on the above two tenets, that error clearing +can happen either by sending an IO through the driver, or zeroing (also through +the driver). + + Shortcomings ------------ -- 2.5.5 From david@fromorbit.com Fri Apr 29 18:40:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8DD057D06 for ; Fri, 29 Apr 2016 18:40:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 01A23AC005 for ; Fri, 29 Apr 2016 16:40:18 -0700 (PDT) X-ASG-Debug-ID: 1461973211-04cb6c09a13cf0c0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id VjuvM39pyjnccLIF for ; Fri, 29 Apr 2016 16:40:11 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CNDQDw7yNXMcPVLHlegzhTfYJzomcGjBWFbIQTIoRigQYEAgKBKU0BAQEBAQEHAQEBAQFAAUBBEgGDbQEBAQMBJxMcGAsFCwgDDgoJGgsPBSUDBxoTiCIHD8NmAQEBAQEFAgEZBBmFQIUUgSCCbxEBhXIFh3OHFYkLjg2BcYRNiF1FjmuCZxsWgUcqMAEBhiKBKIE1AQEB Received: from ppp121-44-213-195.lns20.syd7.internode.on.net (HELO dastard) ([121.44.213.195]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Apr 2016 09:10:09 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1awI12-0001xw-82; Sat, 30 Apr 2016 09:40:08 +1000 Date: Sat, 30 Apr 2016 09:40:08 +1000 From: Dave Chinner To: Michal Hocko Cc: linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, Andrew Morton , Jan Kara , xfs@oss.sgi.com, LKML Subject: Re: [PATCH 2/2] mm, debug: report when GFP_NO{FS,IO} is used explicitly from memalloc_no{fs,io}_{save,restore} context Message-ID: <20160429234008.GN26977@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] mm, debug: report when GFP_NO{FS,IO} is used explicitly from memalloc_no{fs,io}_{save,restore} context References: <1461671772-1269-1-git-send-email-mhocko@kernel.org> <1461671772-1269-3-git-send-email-mhocko@kernel.org> <20160426225845.GF26977@dastard> <20160428081759.GA31489@dhcp22.suse.cz> <20160428215145.GM26977@dastard> <20160429121219.GL21977@dhcp22.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160429121219.GL21977@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: 1461973211 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4838 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29165 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Apr 29, 2016 at 02:12:20PM +0200, Michal Hocko wrote: > On Fri 29-04-16 07:51:45, Dave Chinner wrote: > > On Thu, Apr 28, 2016 at 10:17:59AM +0200, Michal Hocko wrote: > > > [Trim the CC list] > > > On Wed 27-04-16 08:58:45, Dave Chinner wrote: > > > [...] > > > > Often these are to silence lockdep warnings (e.g. commit b17cb36 > > > > ("xfs: fix missing KM_NOFS tags to keep lockdep happy")) because > > > > lockdep gets very unhappy about the same functions being called with > > > > different reclaim contexts. e.g. directory block mapping might > > > > occur from readdir (no transaction context) or within transactions > > > > (create/unlink). hence paths like this are tagged with GFP_NOFS to > > > > stop lockdep emitting false positive warnings.... > > > > > > As already said in other email, I have tried to revert the above > > > commit and tried to run it with some fs workloads but didn't manage > > > to hit any lockdep splats (after I fixed my bug in the patch 1.2). I > > > have tried to find reports which led to this commit but didn't succeed > > > much. Everything is from much earlier or later. Do you happen to > > > remember which loads triggered them, what they looked like or have an > > > idea what to try to reproduce them? So far I was trying heavy parallel > > > fs_mark, kernbench inside a tiny virtual machine so any of those have > > > triggered direct reclaim all the time. > > > > Most of those issues were reported by users and not reproducable by > > any obvious means. > > I would really appreciate a reference to some of those (my google-fu has > failed me) or at least a pattern of those splats If you can't find them with google, then I won't. Google is mostly useless as a patch/mailing list search tool these days. You can try looking through this list: https://www.google.com.au/search?q=XFS+lockdep+site:oss.sgi.com+-splice but I'm not seeing anything particularly relevant in that list - there isn't a single reclaim related lockdep report in that... > - was it > "inconsistent {RECLAIM_FS-ON-[RW]} -> {IN-RECLAIM_FS-[WR]} usage" > or a different class reports? Typically that was involved, but it quite often there'd be a number of locks and sometimes even interrupt stacks in an interaction between 5 or 6 different processes. Lockdep covers all sorts of stuff now (like fs freeze annotations as well as locks and memory reclaim) so sometimes the only thing we can do is remove the reclaim context from the stack and see if that makes it go away... > > > They may have been fixed since, but I'm sceptical > > of that because, generally speaking, developer testing only catches > > the obvious lockdep issues. i.e. it's users that report all the > > really twisty issues, and they are generally not reproducable except > > under their production workloads... > > > > IOWs, the absence of reports in your testing does not mean there > > isn't a problem, and that is one of the biggest problems with > > lockdep annotations - we have no way of ever knowing if they are > > still necessary or not without exposing users to regressions and > > potential deadlocks..... > > I understand your points here but if we are sure that those lockdep > reports are just false positives then we should rather provide an api to > silence lockdep for those paths I agree with this - please provide such infrastructure before we need it... > than abusing GFP_NOFS which a) hurts > the overal reclaim healthiness Which doesn't actually seem to be a problem for the vast majority of users. > and b) works around a non-existing > problem with lockdep disabled which is the vast majority of > configurations. But the moment we have a lockdep problem, we get bug reports from all over the place and people complaining about it, so we are *required* to silence them one way or another. And, like I said, when the choice is simply adding GFP_NOFS or spending a week or two completely reworking complex code that has functioned correctly for 15 years, the risk/reward *always* falls on the side of "just add GFP_NOFS". Please keep in mind that there is as much code in fs/xfs as there is in the mm/ subsystem, and XFS has twice that in userspace as well. I say this, because we have only have 3-4 full time developers to do all the work required on this code base, unlike the mm/ subsystem which had 30-40 full time MM developers attending LSFMM. This is why I push back on suggestions that require significant redesign of subsystem code to handle memory allocation/reclaim quirks - most subsystems simply don't have the resources available to do such work, and so will always look for the quick 2 minute fix when it is available.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Apr 29 19:11:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 428A97D1E for ; Fri, 29 Apr 2016 19:11:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8BDDBAC003 for ; Fri, 29 Apr 2016 17:11:46 -0700 (PDT) X-ASG-Debug-ID: 1461975101-04cbb00fe83a70d0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id tXdcXWoMHlGjetJR for ; Fri, 29 Apr 2016 17:11:42 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2B2EQA39yNXMcPVLHlegziBAU+Cc4N5nm4GjBWFbIQThgoEAgKBKU0BAQEBAQEHAQEBAQFAAUCEQQEBAQMBDhkTHA8GDgULCAMYCSUPBSUDBxoTiCIHxAEBCx4ZhUCFFIQZAQ+FagWYE44NgXGETYhdRY5rgmcbgV0qMIdDAR+BHgEBAQ Received: from ppp121-44-213-195.lns20.syd7.internode.on.net (HELO dastard) ([121.44.213.195]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Apr 2016 09:41:39 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1awIVW-00020V-T0; Sat, 30 Apr 2016 10:11:38 +1000 Date: Sat, 30 Apr 2016 10:11:38 +1000 From: Dave Chinner To: NeilBrown Cc: Michal Hocko , linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, Andrew Morton , Theodore Ts'o , Chris Mason , Jan Kara , ceph-devel@vger.kernel.org, cluster-devel@redhat.com, linux-nfs@vger.kernel.org, logfs@logfs.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-mtd@lists.infradead.org, reiserfs-devel@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-f2fs-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, LKML Subject: Re: [PATCH 0/2] scop GFP_NOFS api Message-ID: <20160430001138.GO26977@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/2] scop GFP_NOFS api References: <1461671772-1269-1-git-send-email-mhocko@kernel.org> <8737q5ugcx.fsf@notabene.neil.brown.name> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <8737q5ugcx.fsf@notabene.neil.brown.name> 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: 1461975101 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6731 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29166 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 BSF_SC5_SA210e Custom Rule SA210e On Fri, Apr 29, 2016 at 03:35:42PM +1000, NeilBrown wrote: > On Tue, Apr 26 2016, Michal Hocko wrote: > > > Hi, > > we have discussed this topic at LSF/MM this year. There was a general > > interest in the scope GFP_NOFS allocation context among some FS > > developers. For those who are not aware of the discussion or the issue > > I am trying to sort out (or at least start in that direction) please > > have a look at patch 1 which adds memalloc_nofs_{save,restore} api > > which basically copies what we have for the scope GFP_NOIO allocation > > context. I haven't converted any of the FS myself because that is way > > beyond my area of expertise but I would be happy to help with further > > changes on the MM front as well as in some more generic code paths. > > > > Dave had an idea on how to further improve the reclaim context to be > > less all-or-nothing wrt. GFP_NOFS. In short he was suggesting an opaque > > and FS specific cookie set in the FS allocation context and consumed > > by the FS reclaim context to allow doing some provably save actions > > that would be skipped due to GFP_NOFS normally. I like this idea and > > I believe we can go that direction regardless of the approach taken here. > > Many filesystems simply need to cleanup their NOFS usage first before > > diving into a more complex changes.> > > This strikes me as over-engineering to work around an unnecessarily > burdensome interface.... but without details it is hard to be certain. > > Exactly what things happen in "FS reclaim context" which may, or may > not, be safe depending on the specific FS allocation context? Do they > need to happen at all? > > My research suggests that for most filesystems the only thing that > happens in reclaim context that is at all troublesome is the final > 'evict()' on an inode. This needs to flush out dirty pages and sync the > inode to storage. Some time ago we moved most dirty-page writeout out > of the reclaim context and into kswapd. I think this was an excellent > advance in simplicity. No, we didn't move dirty page writeout to kswapd - we moved it back to the background writeback threads where it can be done efficiently. kswapd should almost never do single page writeback because of how inefficient it is from an IO perspective, even though it can. i.e. if we are doing any significant amount of dirty page writeback from memory reclaim (direct, kswapd or otherwise) then we've screwed something up. > If we could similarly move evict() into kswapd (and I believe we can) > then most file systems would do nothing in reclaim context that > interferes with allocation context. When lots of GFP_NOFS allocation is being done, this already happens. The shrinkers that can't run due to context accumulate the work on the shrinker structure, and when the shrinker can next run (e.g. run from kswapd) it runs all the deferred work from GFP_NOFS reclaim contexts. IOWs, we already move shrinker work from direct reclaim to kswapd when appropriate. > The exceptions include: > - nfs and any filesystem using fscache can block for up to 1 second > in ->releasepage(). They used to block waiting for some IO, but that > caused deadlocks and wasn't really needed. I left the timeout because > it seemed likely that some throttling would help. I suspect that a > careful analysis will show that there is sufficient throttling > elsewhere. > > - xfs_qm_shrink_scan is nearly unique among shrinkers in that it waits > for IO so it can free some quotainfo things. No it's not. evict() can block on IO - waiting for data or inode writeback to complete, or even for filesystems to run transactions on the inode. Hence the superblock shrinker can and does block in inode cache reclaim. Indeed, blocking the superblock shrinker in reclaim is a key part of balancing inode cache pressure in XFS. If the shrinker starts hitting dirty inodes, it blocks on cleaning them, thereby slowing the rate of allocation to that which inodes can be cleaned and reclaimed. There are also background threads that walk ahead freeing clean inodes, but we have to throttle direct reclaim in this manner otherwise the allocation pressure vastly outweighs the ability to reclaim inodes. if we don't balance this, inode allocation triggers the OOM killer because reclaim keeps reporting "no progress being made" because dirty inodes are skipped. BY blocking on such inodes, the shrinker makes progress (slowly) and reclaim sees that memory is being freed and so continues without invoking the OOM killer... > If it could be changed > to just schedule the IO without waiting for it then I think this > would be safe to be called in any FS allocation context. It already > uses a 'trylock' in xfs_dqlock_nowait() to avoid deadlocking > if the lock is held. We could, but then we have the same problem as the inode cache - there's no indication of progress going back to the memory reclaim subsystem, nor is reclaim able to throttle memory allocation back to the rate at which reclaim is making progress. There's feedback loops all throughout the XFS reclaim code - it's designed specifically that way - I made changes to the shrinker infrastructure years ago to enable this. It's no different to the dirty page throttling that was done at roughly the same time - that's also one big feedback loop controlled by the rate at which pages can be cleaned. Indeed, it was designed was based on the same premise as all the XFS shrinker code: in steady state conditions we can't allocate a resource faster than we can reclaim it, so we need to make reclaim as efficient at possible... > I think you/we would end up with a much simpler system if instead of > focussing on the places where GFP_NOFS is used, we focus on places where > __GFP_FS is tested, and try to remove them. If we get rid of enough of > them the remainder could just use __GFP_IO. The problem with this is that a single kswapd thread can't keep up with all of the allocation pressure that occurs. e.g. a 20-core intel CPU with local memory will be seen as a single node and so will have a single kswapd thread to do reclaim. There's a massive imbalance between maximum reclaim rate and maximum allocation rate in situations like this. If we want memory reclaim to run faster, we to be able to do more work *now*, not defer it to a context with limited execution resources. i.e. IMO deferring more work to a single reclaim thread per node is going to limit memory reclaim scalability and performance, not improve it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Apr 29 19:24:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C9D5C7D24 for ; Fri, 29 Apr 2016 19:24:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8473F8F8033 for ; Fri, 29 Apr 2016 17:24:29 -0700 (PDT) X-ASG-Debug-ID: 1461975866-04cbb00fe73a7880001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id XCHDInGD6ekoBrzl for ; Fri, 29 Apr 2016 17:24:27 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AFCgCv+iNXMcPVLHlegziBUIJzg3mebgaMFYVshBOGCgQCAoEpTQEBAQEBAQcBAQEBAUABQIRCAQEEOhwjEAgDDgoJJQ8FJQMHGhOIKcN2AQseGYVAhRSKEwWYE44NjxtFjmuEXyowiQEBAQE Received: from ppp121-44-213-195.lns20.syd7.internode.on.net (HELO dastard) ([121.44.213.195]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Apr 2016 09:54:19 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1awIhm-00021h-C6; Sat, 30 Apr 2016 10:24:18 +1000 Date: Sat, 30 Apr 2016 10:24:18 +1000 From: Dave Chinner To: Michal Hocko Cc: NeilBrown , linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, Andrew Morton , Theodore Ts'o , Chris Mason , Jan Kara , ceph-devel@vger.kernel.org, cluster-devel@redhat.com, linux-nfs@vger.kernel.org, logfs@logfs.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-mtd@lists.infradead.org, reiserfs-devel@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-f2fs-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, LKML Subject: Re: [PATCH 0/2] scop GFP_NOFS api Message-ID: <20160430002418.GP26977@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/2] scop GFP_NOFS api References: <1461671772-1269-1-git-send-email-mhocko@kernel.org> <8737q5ugcx.fsf@notabene.neil.brown.name> <20160429120418.GK21977@dhcp22.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160429120418.GK21977@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: 1461975866 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1712 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29166 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Apr 29, 2016 at 02:04:18PM +0200, Michal Hocko wrote: > I would also like to revisit generic inode/dentry shrinker and see > whether it could be more __GFP_FS friendly. As you say many FS might > even not depend on some FS internal locks so pushing GFP_FS check down > the layers might make a lot of sense and allow to clean some [id]cache > even for __GFP_FS context. That's precisely my point about passing a context to the shrinker. It's recursion within a single superblock context that makes up the majority of cases GFP_NOFS is used for, so passing the superblock immediately allows for reclaim to run the superblock shrinker on every other superblock. We can refine it further from there, but I strongly suspect that further refinement is going to require filesystems to specifically configure the superblock shrinker. e.g. in XFS, we can't allow evict() even on clean VFS inodes in a PF_FSTRANS context, because we may run a transaction on a clean VFS inode to prepare it for reclaim. We can, however, allow the fs-specific shrinker callouts to run (i.e. call into .free_cached_objects) so that it can reclaim clean XFS inodes because that doesn't require transactions.... i.e. the infrastructure I suggested we use is aimed directly at providing the mechanism required for finer-grained inode/dentry cache reclaim in contexts that it is currently disallowed completely. I was also implying that once the infrastructure to pass contexts is in place, I'd then make the changes to the generic superblock shrinker code to enable finer grained reclaim and optimise the XFS shrinkers to make use of it... Cheers, Dave. -- Dave Chinner david@fromorbit.com From info72@bluebirds.com Fri Apr 29 23:14:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=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 7A0847D32 for ; Fri, 29 Apr 2016 23:14:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 303FA8F8035 for ; Fri, 29 Apr 2016 21:14:07 -0700 (PDT) X-ASG-Debug-ID: 1461989643-04bdf035963d3230001-NocioJ Received: from bluebirds.com ([14.154.154.48]) by cuda.sgi.com with SMTP id gDCKZsIAq8Cld114 for ; Fri, 29 Apr 2016 21:14:03 -0700 (PDT) X-Barracuda-Envelope-From: info72@bluebirds.com X-Barracuda-Effective-Source-IP: UNKNOWN[14.154.154.48] X-Barracuda-Apparent-Source-IP: 14.154.154.48 Received: from WIN-NRSLQON20B9[127.0.0.1] by WIN-NRSLQON20B9[127.0.0.1] (SMTPD32); Sat, 30 Apr 2016 12:13:06 +0800 From: "info72@bluebirds.com" Subject: Universal Car DAB+ Radio Receiver 2016-04-30 12:13:06 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Universal Car DAB+ Radio Receiver 2016-04-30 12:13:06 MIME-Version: 1.0 Sender: info72@bluebirds.com Date: Sat, 30 Apr 2016 12:13:06 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[14.154.154.48] X-Barracuda-Start-Time: 1461989643 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9430 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29171 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160430041406.C241FA420A0@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVU Ri04IiBodHRwLWVxdWl2PWNvbnRlbnQtdHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCAxMS4wMC45NjAwLjE4MDk4Ij48L0hFQUQ+DQo8Qk9EWT4NCjxESVYgDQpzdHls ZT0iV0hJVEUtU1BBQ0U6IG5vcm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IFRFWFQtVFJBTlNGT1JN OiBub25lOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVDogMTRweC8yM3B4ICYjMzk7bHVjaWRhIEdy YW5kZSYjMzk7LCBWZXJkYW5hLCAmIzM5O01pY3Jvc29mdCBZYUhlaSYjMzk7OyBXSURPV1M6IDE7 IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1 NSk7IFRFWFQtSU5ERU5UOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PEZP TlQgDQpjb2xvcj0jODA4MDgwPjxGT05UIHN0eWxlPSJMSU5FLUhFSUdIVDogMjdweCIgc2l6ZT0z PjxTUEFOIA0KY2xhc3M9QXBwbGUtY29udmVydGVkLXNwYWNlPg0KPERJVj5IZWxsbyBGcmllbmQs PC9ESVY+DQo8RElWPiZuYnNwOzwvRElWPg0KPERJVj4mbmJzcDtOZXcgYXJyaXZhbCBvZiA8Rk9O VCBjb2xvcj0jMDAwMDAwIHNpemU9ND48U1RST05HPlVuaXZlcnNhbCBVU0IgDQpBbmRyb2lkIERB QisgUmVjZWl2ZXI8L1NUUk9ORz48L0ZPTlQ+IGFzIGJlbG93IGZvciB5b3VyIHJlZmVyZW5jZTo8 L0RJVj4NCjxESVY+Jm5ic3A7PC9ESVY+DQo8RElWPjxTUEFOPiZuYnNwO0hpZ2ggc2Vuc2liaWxp dHkgPEZPTlQgc2l6ZT00PjxTVFJPTkc+REFCKyBhbmQgREFCIA0KcmFkaW88L1NUUk9ORz48L0ZP TlQ+IFJlY2VpdmVyIDxCUj5TdXBwb3J0IGNhciBBbmRyb2lkIHN5c3RlbSA0LjQuMiBhYm92ZSAN CjxCUj5CdWlsdCBpbiBhbnRlbm5hPEJSPkNvbXBhY3QgZGVzaWduIDxCUj5VU0IgUGx1ZyBhbmQg UGxheTwvU1BBTj48L0RJVj4NCjxESVY+PFNQQU4+Jm5ic3A7PC9ESVY+DQo8RElWPiZuYnNwOzxB IA0KaHJlZj0iaHR0cDovL3d3dy5pY2FydGl6YW4uY29tL3VuaXZlcnNhbC1jYXItZGFiLXJlY2Vp dmVyLWZvci1jYXItb24tYW5kcm9pZC1zeXN0ZW0tdGhyb3VnaC11c2ItY29ubmVjdC1kYWItMDFf cDE1OS5odG1sIj48SU1HIA0Kc3R5bGU9IldJRFRIOiA1MDNweCIgDQpzcmM9Imh0dHA6Ly93d3cu aWNhcnRpemFuLmNvbS91cGxvYWRmaWxlLzIwMTYwNC8yNy9mMzUzNzU1ZjBkMGRhM2Q1YzdlYjM1 YzhmNzQyYjkwNF9tZWRpdW0uanBnIiANCndpZHRoPTU1MD48L0E+Jm5ic3A7IDwvRElWPg0KPERJ Vj48QlIgY2xhc3M9QXBwbGUtaW50ZXJjaGFuZ2UtbmV3bGluZT48U1BBTiBpZD1fRm94RlJPTU5B TUU+PFNQQU4gbGFuZz1FTi1HQiANCnN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZ OiBBcmlhbCwgc2Fucy1zZXJpZjsgQ09MT1I6IGdyYXkiPkFueXRoaW5nIA0KaW50ZXJlc3QgeW91 LCBwbGVhc2UgZmVlbCBmcmVlIHRvIGxldCB1cyANCmtub3cuPC9TUEFOPjwvU1BBTj48L0RJVj48 L1NQQU4+PC9TUEFOPjwvRk9OVD48L0ZPTlQ+PFNQQU4gDQpzdHlsZT0iV0hJVEUtU1BBQ0U6IG5v cm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBDT0xPUjogcmdi KDAsMCwwKTsgRk9OVDogMTRweC8yM3B4ICYjMzk7bHVjaWRhIEdyYW5kZSYjMzk7LCBWZXJkYW5h LCAmIzM5O01pY3Jvc29mdCBZYUhlaSYjMzk7OyBXSURPV1M6IDE7IExFVFRFUi1TUEFDSU5HOiBu b3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQtSU5ERU5UOiAw cHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PC9ESVY+DQo8RElWPjxGT05UIGNv bG9yPSM4MDgwODAgc2l6ZT0yPlNvcnJ5LCBwbGVhc2UgZW1haWwgdXMgaWYgeW91IHdvdWxkIG5v dCBsaWtlIHRvIA0KcmVjZWl2ZSBvdXIgZnV0dXJlIHByb2R1Y3RzIGluZm9ybWF0aW9uLjwvRk9O VD48U1BBTiBpZD1fRm94RlJPTU5BTUU+PFNQQU4gDQpsYW5nPUVOLUdCIA0Kc3R5bGU9IkZPTlQt U0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsLCBzYW5zLXNlcmlmOyBDT0xPUjogZ3JheSI+ PFNQQU4+PFNQQU4gDQpsYW5nPUVOLUdCIA0Kc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1G QU1JTFk6IEFyaWFsLCBzYW5zLXNlcmlmOyBDT0xPUjogZ3JheSI+PEZPTlQgDQpzdHlsZT0iTElO RS1IRUlHSFQ6IDI3cHgiIHNpemU9Mz48U1BBTiANCnN0eWxlPSJXSElURS1TUEFDRTogbm9ybWFs OyBXT1JELVNQQUNJTkc6IDBweDsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEZMT0FUOiBub25lOyBD T0xPUjogcmdiKDUxLDUxLDUxKTsgVEVYVC1BTElHTjogbGVmdDsgRk9OVDogMTJweC8xOHB4IHB1 bmN0dWF0aW9uLCDlvq7ova/pm4Xpu5EsIFRvaG9tYTsgRElTUExBWTogaW5saW5lICFpbXBvcnRh bnQ7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUsMjU1 LDI1NSk7IFRFWFQtSU5ERU5UOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweDsg Zm9udC1zdHJldGNoOiBub3JtYWwiPjxGT05UIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAyN3B4IiBz aXplPTM+PFNQQU4gDQpzdHlsZT0iV0hJVEUtU1BBQ0U6IG5vcm1hbDsgV09SRC1TUEFDSU5HOiAw cHg7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBGTE9BVDogbm9uZTsgQ09MT1I6IHJnYig1MSw1MSw1 MSk7IFRFWFQtQUxJR046IGxlZnQ7IEZPTlQ6IDEycHgvMThweCBwdW5jdHVhdGlvbiwg5b6u6L2v 6ZuF6buRLCBUb2hvbWE7IERJU1BMQVk6IGlubGluZSAhaW1wb3J0YW50OyBMRVRURVItU1BBQ0lO Rzogbm9ybWFsOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBURVhULUlOREVO VDogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHg7IGZvbnQtc3RyZXRjaDogbm9y bWFsIj48U1BBTj48U1BBTiANCmxhbmc9RU4tR0IgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBG T05ULUZBTUlMWTogQXJpYWwsIHNhbnMtc2VyaWY7IENPTE9SOiBncmF5Ij48L0RJVj4NCjxESVY+ PC9TUEFOPjwvU1BBTj48L1NQQU4+PC9GT05UPjwvU1BBTj48L0ZPTlQ+PC9TUEFOPjwvU1BBTj4N CjxESVY+PFNQQU4+PFNQQU4gbGFuZz1FTi1HQiANCnN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZP TlQtRkFNSUxZOiBBcmlhbCwgc2Fucy1zZXJpZjsgQ09MT1I6IGdyYXkiPlRoYW5rcyBhIA0KbG90 IGFuZCBiZXN0IHJlZ2FyZHMsPEJSPlNvcGhpYSBDaGFuZzwvU1BBTj48U1BBTiBsYW5nPVpILUNO IA0Kc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6ICYjMzk7TVMgR290aGljJiMz OTs7IENPTE9SOiBncmF5Ij7lvLXpm6rnkLQ8L1NQQU4+PFNQQU4gDQpsYW5nPUVOLUdCIA0Kc3R5 bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsLCBzYW5zLXNlcmlmOyBDT0xP UjogZ3JheSI+PEJSPlNhbGVzIA0KRGVwYXJ0bWVudDwvU1BBTj48P3htbDpuYW1lc3BhY2UgcHJl Zml4ID0gIm8iIC8+PG86cD48L286cD48Rk9OVCANCnNpemU9MT4mbmJzcDsmbmJzcDsgPC9GT05U PjwvU1BBTj48L0RJVj4NCjxESVY+PFNQQU4+PEZPTlQgc2l6ZT0xPjwvRk9OVD48L1NQQU4+Jm5i c3A7PC9ESVY+DQo8RElWPjxTUEFOPjxTUEFOIHN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWwsIHNh bnMtc2VyaWY7IENPTE9SOiBncmF5Ij4mbmJzcDsgDQo8L1NQQU4+PFNQQU4gbGFuZz1FTi1VUyAN CnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWwsIHNhbnMtc2VyaWY7IENPTE9SOiBncmF5Ij48Rk9O VCBmYWNlPUNhbGlicmk+PEZPTlQgDQpzaXplPTM+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSJG T05ULUZBTUlMWTogQXJpYWwsIHNhbnMtc2VyaWY7IENPTE9SOiBncmF5Ij5DYXJ0aXphbiZuYnNw O1RlY2hub2xvZ3k8L1NQQU4+PFNQQU4gDQpsYW5nPUVOLUdCIHN0eWxlPSJGT05ULUZBTUlMWTog QXJpYWwsIHNhbnMtc2VyaWY7IENPTE9SOiBncmF5Ij4mbmJzcDtDb21wYW55IA0KTGltaXRlZDwv U1BBTj48L0ZPTlQ+PC9GT05UPjwvU1BBTj48L0RJVj4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0 eWxlPSJXSElURS1TUEFDRTogbm9ybWFsOyBXT1JELVNQQUNJTkc6IDBweDsgUE9TSVRJT046IHN0 YXRpYyAhaW1wb3J0YW50OyBURVhULVRSQU5TRk9STTogbm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7 IEZPTlQ6IDExcHQgQ2FsaWJyaSwgc2Fucy1zZXJpZjsgTUFSR0lOOiAwcHggMGNtIDBweCA3LjVw dDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI1NSwyNTUs MjU1KTsgVEVYVC1JTkRFTlQ6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4IiAN CmFsaWduPWxlZnQ+PEZPTlQgZmFjZT1DYWxpYnJpPjxGT05UIHNpemU9Mz48U1BBTiBsYW5nPUVO LVVTIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCwgc2Fucy1zZXJpZjsgQ09MT1I6IGdyYXki PkJsdWVCaXJkIA0KVGVjaG5vbG9neTwvU1BBTj48U1BBTiBsYW5nPUVOLUdCIA0Kc3R5bGU9IkZP TlQtRkFNSUxZOiBBcmlhbCwgc2Fucy1zZXJpZjsgQ09MT1I6IGdyYXkiPiZuYnNwO0NvbXBhbnkg DQpMaW1pdGVkPC9TUEFOPjwvRk9OVD48L0ZPTlQ+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0K c3R5bGU9IldISVRFLVNQQUNFOiBub3JtYWw7IFdPUkQtU1BBQ0lORzogMHB4OyBQT1NJVElPTjog c3RhdGljICFpbXBvcnRhbnQ7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBDT0xPUjogcmdiKDAsMCww KTsgRk9OVDogMTFwdCBDYWxpYnJpLCBzYW5zLXNlcmlmOyBNQVJHSU46IDBweCAwY20gMHB4IDcu NXB0OyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1 NSwyNTUpOyBURVhULUlOREVOVDogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgi IA0KYWxpZ249bGVmdD48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtU0laRTogMTBwdDsg Rk9OVC1GQU1JTFk6IEFyaWFsLCBzYW5zLXNlcmlmOyBDT0xPUjogZ3JheSI+VGVsJm5ic3A7OiZu YnNwOys4Ni03NTUtMjc4ODg1OTI8L1NQQU4+PG86cD48L286cD48L1A+DQo8UCBjbGFzcz1Nc29O b3JtYWwgDQpzdHlsZT0iV0hJVEUtU1BBQ0U6IG5vcm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IFBP U0lUSU9OOiBzdGF0aWMgIWltcG9ydGFudDsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IENPTE9SOiBy Z2IoMCwwLDApOyBGT05UOiAxMXB0IENhbGlicmksIHNhbnMtc2VyaWY7IE1BUkdJTjogMHB4IDBj bSAwcHggNy41cHQ7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6IHJn YigyNTUsMjU1LDI1NSk7IFRFWFQtSU5ERU5UOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lk dGg6IDBweCIgDQphbGlnbj1sZWZ0PjxTUEFOIGxhbmc9RU4tR0IgDQpzdHlsZT0iRk9OVC1GQU1J TFk6IEFyaWFsLCBzYW5zLXNlcmlmOyBDT0xPUjogZ3JheSI+PC9TUEFOPjwvUD4NCjxQIGNsYXNz PU1zb05vcm1hbCANCnN0eWxlPSJXSElURS1TUEFDRTogbm9ybWFsOyBXT1JELVNQQUNJTkc6IDBw eDsgUE9TSVRJT046IHN0YXRpYyAhaW1wb3J0YW50OyBURVhULVRSQU5TRk9STTogbm9uZTsgQ09M T1I6IHJnYigwLDAsMCk7IEZPTlQ6IDExcHQgQ2FsaWJyaSwgc2Fucy1zZXJpZjsgTUFSR0lOOiAw cHggMGNtIDBweCA3LjVwdDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQkFDS0dST1VORC1DT0xP UjogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1JTkRFTlQ6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9r ZS13aWR0aDogMHB4IiANCmFsaWduPWxlZnQ+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSJGT05U LVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCwgc2Fucy1zZXJpZjsgQ09MT1I6IGdyYXki PkZheDogDQorODYtNzU1LTI5MzYxMjM1PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCAN CnN0eWxlPSJXSElURS1TUEFDRTogbm9ybWFsOyBXT1JELVNQQUNJTkc6IDBweDsgUE9TSVRJT046 IHN0YXRpYyAhaW1wb3J0YW50OyBURVhULVRSQU5TRk9STTogbm9uZTsgQ09MT1I6IHJnYigwLDAs MCk7IEZPTlQ6IDExcHQgQ2FsaWJyaSwgc2Fucy1zZXJpZjsgTUFSR0lOOiAwcHggMGNtIDBweCA3 LjVwdDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI1NSwy NTUsMjU1KTsgVEVYVC1JTkRFTlQ6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4 IiANCmFsaWduPWxlZnQ+PFNQQU4gbGFuZz1FTi1HQiANCnN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7 IEZPTlQtRkFNSUxZOiBBcmlhbCwgc2Fucy1zZXJpZiI+PD94bWw6bmFtZXNwYWNlIHByZWZpeCA9 IA0KIm5zMCIgLz48bnMwOmNpdHk+PG5zMDpwbGFjZT48U1BBTiBzdHlsZT0iQ09MT1I6IGdyYXki PldoYXQmIzM5O3MgQXBwIGFuZCANCk1vYmlsZTwvU1BBTj48L25zMDpwbGFjZT48L25zMDpjaXR5 PjxTUEFOIHN0eWxlPSJDT0xPUjogZ3JheSI+OiANCjE1ODEzNzEzMDcyPEJSPlNreXBlOiBoYXBw eXNvcGhpYTg2ODYsJm5ic3A7IFFROiANCjE3Njc3MTI0NTc8L1NQQU4+PC9TUEFOPjxvOnA+PC9v OnA+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9IldISVRFLVNQQUNFOiBub3JtYWw7 IFdPUkQtU1BBQ0lORzogMHB4OyBQT1NJVElPTjogc3RhdGljICFpbXBvcnRhbnQ7IFRFWFQtVFJB TlNGT1JNOiBub25lOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVDogMTFwdCBDYWxpYnJpLCBzYW5z LXNlcmlmOyBNQVJHSU46IDBweCAwY20gMHB4IDcuNXB0OyBMRVRURVItU1BBQ0lORzogbm9ybWFs OyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBURVhULUlOREVOVDogMHB4OyAt d2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiIA0KYWxpZ249bGVmdD48U1BBTiBsYW5nPUVO LVVTIA0Kc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsLCBzYW5zLXNl cmlmOyBDT0xPUjogZ3JheSI+T2ZmaWNlIEFkZDogDQpGbG9vciA2dGgsJm5ic3A7Qm9zaGVuIFRl Y2gmbmJzcDtCdWlsZGluZywgTm9ydGggQ2hhbmdYaW5nIA0KUm9hZCw8L1NQQU4+PG86cD48L286 cD48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iV0hJVEUtU1BBQ0U6IG5vcm1hbDsg V09SRC1TUEFDSU5HOiAwcHg7IFBPU0lUSU9OOiBzdGF0aWMgIWltcG9ydGFudDsgVEVYVC1UUkFO U0ZPUk06IG5vbmU7IENPTE9SOiByZ2IoMCwwLDApOyBGT05UOiAxMXB0IENhbGlicmksIHNhbnMt c2VyaWY7IE1BUkdJTjogMHB4IDBjbSAwcHggNy41cHQ7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7 IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQtSU5ERU5UOiAwcHg7IC13 ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCIgDQphbGlnbj1sZWZ0PjxTUEFOIGxhbmc9RU4t VVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTogQXJpYWwsIHNhbnMtc2Vy aWY7IENPTE9SOiBncmF5Ij5Mb25nZ2FuIA0KWm9uZSwgU2hlbnpoZW4sIDUxODE3MiwgQ2hpbmE8 L1NQQU4+PG86cD48L286cD48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iV0hJVEUt U1BBQ0U6IG5vcm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IFBPU0lUSU9OOiBzdGF0aWMgIWltcG9y dGFudDsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IENPTE9SOiByZ2IoMCwwLDApOyBGT05UOiAxMXB0 IENhbGlicmksIHNhbnMtc2VyaWY7IE1BUkdJTjogMHB4IDBjbSAwcHggNy41cHQ7IExFVFRFUi1T UEFDSU5HOiBub3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQt SU5ERU5UOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCIgDQphbGlnbj1sZWZ0 PjxTUEFOIGxhbmc9WkgtQ04gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTog JiMzOTtNUyBHb3RoaWMmIzM5OzsgQ09MT1I6IGdyYXkiPua3seWcs+W4gjwvU1BBTj48U1BBTiAN Cmxhbmc9WkgtQ04gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTogTWluZ0xp VTsgQ09MT1I6IGdyYXkiPum+meWyl+WMuumVv+WFtOWMl+i3rzwvU1BBTj48U1BBTiANCnN0eWxl PSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCwgc2Fucy1zZXJpZjsgQ09MT1I6 IGdyYXkiPjY8L1NQQU4+PFNQQU4gDQpsYW5nPVpILUNOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTBw dDsgRk9OVC1GQU1JTFk6ICYjMzk7TVMgR290aGljJiMzOTs7IENPTE9SOiBncmF5Ij7lj7fljZrm t7Hnp5HmioDlpKfljqY8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05U LUZBTUlMWTogQXJpYWwsIHNhbnMtc2VyaWY7IENPTE9SOiBncmF5Ij425qW8PC9TUEFOPjwvUD4N CjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJXSElURS1TUEFDRTogbm9ybWFsOyBXT1JELVNQ QUNJTkc6IDBweDsgUE9TSVRJT046IHN0YXRpYyAhaW1wb3J0YW50OyBURVhULVRSQU5TRk9STTog bm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQ6IDExcHQgQ2FsaWJyaSwgc2Fucy1zZXJpZjsg TUFSR0lOOiAwcHggMGNtIDBweCA3LjVwdDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQkFDS0dS T1VORC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1JTkRFTlQ6IDBweDsgLXdlYmtpdC10 ZXh0LXN0cm9rZS13aWR0aDogMHB4IiANCmFsaWduPWxlZnQ+PFNQQU4gDQpzdHlsZT0iRk9OVC1T SVpFOiAxMHB0OyBGT05ULUZBTUlMWTogQXJpYWwsIHNhbnMtc2VyaWY7IENPTE9SOiBncmF5Ij5G YTwvU1BBTj48U1BBTiANCmxhbmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05U LUZBTUlMWTogQXJpYWwsIHNhbnMtc2VyaWY7IENPTE9SOiBncmF5Ij5jdG9yeSBBZGQ6IA0KUGVu Z3NpIHpvbmUsIFBlbmdkaSBjaXR5LCZuYnNwOzwvU1BBTj48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5 bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsLCBzYW5zLXNlcmlmIj48bnMw OnBsYWNlPjxuczA6Y2l0eT48U1BBTiANCnN0eWxlPSJDT0xPUjogZ3JheSI+U2hlbnpoZW48L1NQ QU4+PC9uczA6Y2l0eT48L25zMDpwbGFjZT48U1BBTiANCnN0eWxlPSJDT0xPUjogZ3JheSI+LCZu YnNwOzwvU1BBTj48bnMwOmNvdW50cnktcmVnaW9uPjxTUEFOIA0Kc3R5bGU9IkNPTE9SOiBncmF5 Ij5DaGluYTwvU1BBTj48L25zMDpjb3VudHJ5LXJlZ2lvbj48U1BBTiANCnN0eWxlPSJDT0xPUjog Z3JheSI+Jm5ic3A7PC9TUEFOPjwvU1BBTj48L1A+PC9TUEFOPjwvU1BBTj48L1NQQU4+PC9ESVY+ PC9TUEFOPjwvQk9EWT48L0hUTUw+DQoNCg== From Sales.36@assemble.com Sat Apr 30 00:04:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=DATE_IN_PAST_12_24, HTML_FONT_FACE_BAD,HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F07CB7D3B for ; Sat, 30 Apr 2016 00:04:46 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 180CBAC002 for ; Fri, 29 Apr 2016 22:04:42 -0700 (PDT) X-ASG-Debug-ID: 1461992651-04cb6c09a23dc6b0001-NocioJ Received: from assemble.com (hn.kd.ny.adsl [115.58.156.40]) by cuda.sgi.com with SMTP id cHSzA4tc48IqOxw8 for ; Fri, 29 Apr 2016 22:04:12 -0700 (PDT) X-Barracuda-Envelope-From: Sales.36@assemble.com X-Barracuda-Effective-Source-IP: hn.kd.ny.adsl[115.58.156.40] X-Barracuda-Apparent-Source-IP: 115.58.156.40 Received: from AFODC-605221150[127.0.0.1] by AFODC-605221150[127.0.0.1] (SMTPD32); Fri, 29 Apr 2016 18:24:34 +0800 From: "rocky@ulikepcb.com" Subject: printed circuit board To: xfs@oss.sgi.com X-ASG-Orig-Subj: printed circuit board Content-Type: multipart/mixed; charset=UTF-8; boundary="qA59x2aEt=_bkNlV3zLgaJo8TisaOuTTMF" MIME-Version: 1.0 Sender: Sales.36@assemble.com Reply-To: rocky@ulikepcb.com Date: Fri, 29 Apr 2016 18:24:34 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] X-Barracuda-Connect: hn.kd.ny.adsl[115.58.156.40] X-Barracuda-Start-Time: 1461992651 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 17593 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.76 X-Barracuda-Spam-Status: No, SCORE=1.76 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, HTML_FONT_FACE_BAD, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, SARE_SXLIFE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29172 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.20 SARE_SXLIFE BODY: Talks about your sex life 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 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.61 HTML_FONT_FACE_BAD BODY: HTML font face is not a word 0.80 DATE_IN_PAST_12_24_2 DATE_IN_PAST_12_24_2 Message-Id: <20160430050442.6E01A1296084@cuda.sgi.com> This is a multi-part message in MIME format --qA59x2aEt=_bkNlV3zLgaJo8TisaOuTTMF Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgMTEuMDAuMTA1ODYuMTYyIj48L0hFQUQ+DQo8Qk9EWT4NCjxESVY+PEZPTlQgc2l6ZT0y IGZhY2U9VmVyZGFuYT48Rk9OVCBjb2xvcj0jMDAwMDAwIHNpemU9MyBmYWNlPeWui+S9kz48Rk9O VCANCmNvbG9yPSMwMDQwODAgc2l6ZT0yIGZhY2U9QXJpYWw+PFNQQU4gDQpzdHlsZT0iQ09MT1I6 ICMwMDAwODAiPkhpLDwvU1BBTj48L0ZPTlQ+PC9GT05UPjwvRk9OVD48L0RJVj4NCjxESVYgc3R5 bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYg c3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxE SVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4N CjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJ Vj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0K PERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEi Pg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRh bmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZl cmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6 IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1J TFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1G QU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9O VC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsg Rk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBw dDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTog MTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0la RTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQt U0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZP TlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9 IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5 bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYg c3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxE SVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4N CjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJ Vj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0K PERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEi Pg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRh bmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZl cmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6 IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1J TFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1G QU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9O VC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsg Rk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBw dDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTog MTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0la RTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQt U0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZP TlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9 IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5 bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYg c3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxE SVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4N CjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJ Vj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0K PERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEi Pg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRh bmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZl cmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6 IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1J TFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1G QU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9O VC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsg Rk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBw dDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTog MTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0la RTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQt U0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZP TlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9 IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5 bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYg c3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxE SVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4N CjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJ Vj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0K PERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEi Pg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRh bmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZl cmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6 IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1J TFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1G QU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9O VC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsg Rk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTogMTBw dDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0laRTog MTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQtU0la RTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZPTlQt U0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9IkZP TlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5bGU9 IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVYgc3R5 bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRhbmEiPg0KPERJVj4NCjxESVY+ PEZPTlQgc2l6ZT0yIGZhY2U9VmVyZGFuYT48Rk9OVCBjb2xvcj0jMDAwMDAwIHNpemU9MyBmYWNl PeWui+S9kz48Rk9OVCANCmNvbG9yPSMwMDQwODAgc2l6ZT0yIGZhY2U9QXJpYWw+PC9GT05UPjwv Rk9OVD48L0ZPTlQ+Jm5ic3A7PC9ESVY+PEZPTlQgc2l6ZT0yIA0KZmFjZT1WZXJkYW5hPjxGT05U IGNvbG9yPSMwMDAwMDAgc2l6ZT0zIGZhY2U95a6L5L2TPjwvRk9OVD48L0ZPTlQ+DQo8RElWPjxG T05UIHNpemU9MiBmYWNlPVZlcmRhbmE+PEZPTlQgY29sb3I9IzAwMDAwMCBzaXplPTMgZmFjZT3l rovkvZM+PC9GT05UPg0KPERJVj48Rk9OVCBjb2xvcj0jMDAwMDAwIHNpemU9MyBmYWNlPeWui+S9 kz4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46 IDBjbSAwY20gMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWxlZnQ+ PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiAm IzM5O0FyaWFsJiMzOTssJiMzOTtzYW5zLXNlcmlmJiMzOTs7IENPTE9SOiBibGFjazsgbXNvLWZh cmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0Ij48Rk9OVCAN CmNvbG9yPSMwMDAwYTA+VGhpcyBpcyBSb2NreSBmcm9tIFVsaWtlIENpcmN1aXQubG9jYXRlZCBp biBDaGluYSxwcm92aWRlJm5ic3A7TEVEIA0KUENCLCZuYnNwO0FsdW1pbnVtIFBDQihQcmludGVk IENpcmN1aXQgQm9hcmQpIG1hbnVmYWN0dXJpbmcmbmJzcDtzZXJ2aWNlIGZvciANCndvcmxkd2lk ZSBjdXN0b21lcnMuPC9GT05UPjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHls ZT0iVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgbXNvLXBhZ2luYXRpb246 IHdpZG93LW9ycGhhbiIgDQphbGlnbj1sZWZ0PjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0iRk9O VC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTogJiMzOTtBcmlhbCYjMzk7LCYjMzk7c2Fucy1zZXJp ZiYjMzk7OyBDT0xPUjogYmxhY2s7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1z by1mb250LWtlcm5pbmc6IDBwdCI+PEZPTlQgDQpjb2xvcj0jMDAwMGEwPjwvRk9OVD48L1NQQU4+ Jm5ic3A7PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7 IE1BUkdJTjogMGNtIDBjbSAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KYWxp Z249bGVmdD48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1G QU1JTFk6ICYjMzk7QXJpYWwmIzM5OywmIzM5O3NhbnMtc2VyaWYmIzM5OzsgQ09MT1I6IGJsYWNr OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQi PjxJTUcgDQpib3JkZXI9MCBoc3BhY2U9MCBhbHQ9IiIgc3JjPSJjaWQ6aW1nMC5qcGciIGFsaWdu PWJhc2VsaW5lPjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iVEVYVC1B TElHTjogbGVmdDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9y cGhhbiIgDQphbGlnbj1sZWZ0PjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAx MHB0OyBGT05ULUZBTUlMWTogJiMzOTtBcmlhbCYjMzk7LCYjMzk7c2Fucy1zZXJpZiYjMzk7OyBD T0xPUjogYmxhY2s7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtl cm5pbmc6IDBwdCI+PEZPTlQgDQpjb2xvcj0jMDAwMGEwPjwvRk9OVD48L1NQQU4+PC9QPg0KPFAg Y2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IE1BUkdJTjogMGNtIDBj bSAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KYWxpZ249bGVmdD48U1BBTiBs YW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6ICYjMzk7QXJp YWwmIzM5OywmIzM5O3NhbnMtc2VyaWYmIzM5OzsgQ09MT1I6IGJsYWNrOyBtc28tZmFyZWFzdC1m b250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQiPjxGT05UIA0KY29sb3I9 IzAwMDBhMD48L0ZPTlQ+PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJU RVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBjbSAwY20gMHB0OyBtc28tcGFnaW5hdGlvbjogd2lk b3ctb3JwaGFuIiANCmFsaWduPWxlZnQ+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSJGT05ULVNJ WkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiAmIzM5O0FyaWFsJiMzOTssJiMzOTtzYW5zLXNlcmlmJiMz OTs7IENPTE9SOiBibGFjazsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZv bnQta2VybmluZzogMHB0Ij48Rk9OVCANCmNvbG9yPSMwMDAwYTA+SW4gdGhlIHBhc3QgOCB5ZWFy cyx3ZSBoYXZlIHNlcnZlZCBhIGxvdCBvZiBjdXN0b21lcnMgaW4gdmFyaW91cyANCmluZHVzdHJp ZXMsc3VjaCBhcyBjb25zdW1lciBlbGVjdHJvbmljcyxjb21tdW5pY2F0aW9uLG1lZGljYWwgZXRj LnNvbWUgb2Ygb3VyIA0KY3VzdG9tZXJzIGFyZSBpbmR1c3RyaWFsIGRlc2lnbiBmaXJtcyxhbmQg c29tZSBhcmUgRU1TKGVsZWN0cm9uaWMgbWFudWZhY3R1cmluZyANCnNlcnZpY2UpLHNvbWUgYXJl IGVsZWN0cm9uaWMgZW5kIHVwIHByb2R1Y3RzIG1hbnVmYWN0dXJlcixzb21lIGFyZSBQQ0IgYXNz ZW1ibHkgDQpzZXJ2aWNlIGNvbXBhbnkgZXRjLjwvRk9OVD48L1NQQU4+PC9QPg0KPFAgY2xhc3M9 TXNvTm9ybWFsIA0Kc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IE1BUkdJTjogMGNtIDBjbSAwcHQ7 IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KYWxpZ249bGVmdD48U1BBTiBsYW5nPUVO LVVTIA0Kc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6ICYjMzk7QXJpYWwmIzM5 OywmIzM5O3NhbnMtc2VyaWYmIzM5OzsgQ09MT1I6IGJsYWNrOyBtc28tZmFyZWFzdC1mb250LWZh bWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQiPjxGT05UIA0KY29sb3I9IzAwMDBh MD48L0ZPTlQ+PC9TUEFOPiZuYnNwOzwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJU RVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBjbSAwY20gMHB0OyBtc28tcGFnaW5hdGlvbjogd2lk b3ctb3JwaGFuIiANCmFsaWduPWxlZnQ+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSJGT05ULVNJ WkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiAmIzM5O0FyaWFsJiMzOTssJiMzOTtzYW5zLXNlcmlmJiMz OTs7IENPTE9SOiBibGFjazsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZv bnQta2VybmluZzogMHB0Ij48U1BBTiANCmxhbmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAx MHB0OyBGT05ULUZBTUlMWTogJiMzOTtBcmlhbCYjMzk7LCYjMzk7c2Fucy1zZXJpZiYjMzk7OyBD T0xPUjogYmxhY2s7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtl cm5pbmc6IDBwdCI+PEZPTlQgDQpjb2xvcj0jMDAwMGEwPlNvbWUgb2Ygb3VyIGN1c3RvbWVycyBh cmUgdGhvc2UgZmFtb3VzIGJyYW5kLHN1Y2ggYXMgDQo8U1RST05HPkZveGNvbm4sRmxleHRyb25p Y3MsRlNMPC9TVFJPTkc+IGV0Yy4gDQo8bzpwPjwvbzpwPjwvRk9OVD48L1NQQU4+PC9TUEFOPjwv UD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46 IDBjbSAwY20gMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWxlZnQ+ PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiAm IzM5O0FyaWFsJiMzOTssJiMzOTtzYW5zLXNlcmlmJiMzOTs7IENPTE9SOiBibGFjazsgbXNvLWZh cmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0Ij48Rk9OVCAN CmNvbG9yPSMwMDAwYTA+PC9GT05UPjwvU1BBTj4mbmJzcDs8L1A+DQo8UCBjbGFzcz1Nc29Ob3Jt YWwgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgbXNvLXBh Z2luYXRpb246IHdpZG93LW9ycGhhbiIgDQphbGlnbj1sZWZ0PjxTUEFOIGxhbmc9RU4tVVMgDQpz dHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTogJiMzOTtBcmlhbCYjMzk7LCYjMzk7 c2Fucy1zZXJpZiYjMzk7OyBDT0xPUjogYmxhY2s7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDl rovkvZM7IG1zby1mb250LWtlcm5pbmc6IDBwdCI+PElNRyANCmJvcmRlcj0wIGhzcGFjZT0wIGFs dD0iIiBzcmM9ImNpZDppbWcxLmpwZyIgYWxpZ249YmFzZWxpbmU+PC9TUEFOPjwvUD4NCjxQIGNs YXNzPU1zb05vcm1hbCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBjbSAwY20g MHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWxlZnQ+PFNQQU4gbGFu Zz1FTi1VUyANCnN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiAmIzM5O0FyaWFs JiMzOTssJiMzOTtzYW5zLXNlcmlmJiMzOTs7IENPTE9SOiBibGFjazsgbXNvLWZhcmVhc3QtZm9u dC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0Ij48Rk9OVCANCmNvbG9yPSMw MDAwYTA+PC9GT05UPjwvU1BBTj4mbmJzcDs8L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHls ZT0iVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgbXNvLXBhZ2luYXRpb246 IHdpZG93LW9ycGhhbiIgDQphbGlnbj1sZWZ0PjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0iRk9O VC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTogJiMzOTtBcmlhbCYjMzk7LCYjMzk7c2Fucy1zZXJp ZiYjMzk7OyBDT0xPUjogYmxhY2s7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1z by1mb250LWtlcm5pbmc6IDBwdCI+PEZPTlQgDQpjb2xvcj0jMDAwMGEwPkdlbmVyYWxseSxjdXN0 b21lciBwcm92aWRlJm5ic3A7R2VyYmVyIGZpbGVzJmFtcDtCT00mbmJzcDtvciANCnNhbXBsZXMg Zm9yIHRoZSBwcm9qZWN0IGV2YWx1YXRpb24uPC9GT05UPjwvU1BBTj48L1A+DQo8UCBjbGFzcz1N c29Ob3JtYWwgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwY20gMGNtIDBwdDsg bXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQphbGlnbj1sZWZ0PjxTUEFOIGxhbmc9RU4t VVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTogJiMzOTtBcmlhbCYjMzk7 LCYjMzk7c2Fucy1zZXJpZiYjMzk7OyBDT0xPUjogYmxhY2s7IG1zby1mYXJlYXN0LWZvbnQtZmFt aWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDBwdCI+PC9TUEFOPiZuYnNwOzwvUD4NCjxQ IGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBjbSAw Y20gMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWxlZnQ+PFNQQU4g bGFuZz1FTi1VUyANCnN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiAmIzM5O0Fy aWFsJiMzOTssJiMzOTtzYW5zLXNlcmlmJiMzOTs7IENPTE9SOiBibGFjazsgbXNvLWZhcmVhc3Qt Zm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0Ij48Rk9OVCANCmNvbG9y PSMwMDAwYTA+PC9GT05UPjwvU1BBTj48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtU0la RTogMTBwdDsgRk9OVC1GQU1JTFk6ICYjMzk7QXJpYWwmIzM5OywmIzM5O3NhbnMtc2VyaWYmIzM5 OzsgQ09MT1I6IGJsYWNrOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9u dC1rZXJuaW5nOiAwcHQiPjxGT05UIA0KY29sb3I9IzAwMDBhMD48L0ZPTlQ+PC9TUEFOPiZuYnNw OzwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBNQVJH SU46IDBjbSAwY20gMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWxl ZnQ+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZ OiAmIzM5O0FyaWFsJiMzOTssJiMzOTtzYW5zLXNlcmlmJiMzOTs7IENPTE9SOiBibGFjazsgbXNv LWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0Ij48Rk9O VCANCmNvbG9yPSMwMDAwYTA+VGVsbCBtZSB5b3VyIG5lZWRzIG9yIHBsYW5uaW5nICx3ZSB3aWxs IG9mZmVyIHN1cHBvcnQgDQpzZXJ2aWNlJm5ic3A7Zm9yIFBDQiByZWxhdGVkIGFzIHlvdXIgcGFy dG5lciBpbiB5b3VyIA0KcHJvamVjdHMuJm5ic3A7PC9GT05UPjwvU1BBTj48L1A+DQo8UCBjbGFz cz1Nc29Ob3JtYWwgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwY20gMGNtIDBw dDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQphbGlnbj1sZWZ0PjxTUEFOIGxhbmc9 RU4tVVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTogJiMzOTtBcmlhbCYj Mzk7LCYjMzk7c2Fucy1zZXJpZiYjMzk7OyBDT0xPUjogYmxhY2s7IG1zby1mYXJlYXN0LWZvbnQt ZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDBwdCI+PEZPTlQgDQpjb2xvcj0jMDAw MGEwPjwvRk9OVD48L1NQQU4+Jm5ic3A7PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9 IlRFWFQtQUxJR046IGxlZnQ7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3 aWRvdy1vcnBoYW4iIA0KYWxpZ249bGVmdD48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQt U0laRTogMTBwdDsgRk9OVC1GQU1JTFk6ICYjMzk7QXJpYWwmIzM5OywmIzM5O3NhbnMtc2VyaWYm IzM5OzsgQ09MT1I6IGJsYWNrOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28t Zm9udC1rZXJuaW5nOiAwcHQiPjxGT05UIA0KY29sb3I9IzAwMDBhMD48L0ZPTlQ+PC9TUEFOPiZu YnNwOzwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBN QVJHSU46IDBjbSAwY20gMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWdu PWxlZnQ+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFN SUxZOiAmIzM5O0FyaWFsJiMzOTssJiMzOTtzYW5zLXNlcmlmJiMzOTs7IENPTE9SOiBibGFjazsg bXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0Ij48 Rk9OVCANCmNvbG9yPSMwMDAwYTA+PC9GT05UPjwvU1BBTj4mbmJzcDs8L1A+DQo8UCBjbGFzcz1N c29Ob3JtYWwgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwY20gMGNtIDBwdDsg bXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQphbGlnbj1sZWZ0PjxTUEFOIGxhbmc9RU4t VVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTogJiMzOTtBcmlhbCYjMzk7 LCYjMzk7c2Fucy1zZXJpZiYjMzk7OyBDT0xPUjogYmxhY2s7IG1zby1mYXJlYXN0LWZvbnQtZmFt aWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDBwdCI+PC9TUEFOPjwvUD4NCjxQIGNsYXNz PU1zb05vcm1hbCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBjbSAwY20gMHB0 OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWxlZnQ+PFNQQU4gbGFuZz1F Ti1VUyANCnN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiAmIzM5O0FyaWFsJiMz OTssJiMzOTtzYW5zLXNlcmlmJiMzOTs7IENPTE9SOiBibGFjazsgbXNvLWZhcmVhc3QtZm9udC1m YW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0Ij48U1RBVElPTkVSWT48L1NQQU4+ PC9QPg0KPERJVj4NCjxTVFlMRSB0eXBlPXRleHQvY3NzPg0KYm9keSB7DQoJZm9udC1zaXplOjEy LjFwdDsgZm9udC1mYW1pbHk6c2ltc3VuLHNlcmlmOw0KfQ0KPC9TVFlMRT4NCg0KPE1FVEEgbmFt ZT1HRU5FUkFUT1IgY29udGVudD0iTVNIVE1MIDExLjAwLjk2MDAuMTcyODAiPjxTVEFUSU9ORVJZ Pg0KPERJVj4NCjxTVFlMRSB0eXBlPXRleHQvY3NzPg0KYm9keSB7DQoJZm9udC1zaXplOjEyLjFw dDsgZm9udC1mYW1pbHk6c2ltc3VuLHNlcmlmOw0KfQ0KPC9TVFlMRT4NCg0KPE1FVEEgbmFtZT1H RU5FUkFUT1IgY29udGVudD0iTVNIVE1MIDExLjAwLjk2MDAuMTcxMjYiPjxTVEFUSU9ORVJZPg0K PERJVj4NCjxTVFlMRSB0eXBlPXRleHQvY3NzPg0KYm9keSB7DQoJZm9udC1zaXplOjEyLjFwdDsg Zm9udC1mYW1pbHk6c2ltc3VuLHNlcmlmOw0KfQ0KPC9TVFlMRT4NCg0KPE1FVEEgbmFtZT1HRU5F UkFUT1IgY29udGVudD0iTVNIVE1MIDExLjAwLjk2MDAuMTY0NzYiPjxTVEFUSU9ORVJZPg0KPERJ Vj4NCjxTVFlMRSB0eXBlPXRleHQvY3NzPg0KYm9keSB7DQoJZm9udC1zaXplOjEyLjFwdDsgZm9u dC1mYW1pbHk6c2ltc3VuLHNlcmlmOw0KfQ0KPC9TVFlMRT4NCg0KPE1FVEEgbmFtZT1HRU5FUkFU T1IgY29udGVudD0iTVNIVE1MIDguMDAuNzYwMS4xODIyOCI+PFNUQVRJT05FUlk+DQo8RElWPg0K PFNUWUxFIHR5cGU9dGV4dC9jc3M+DQpib2R5IHsNCglmb250LXNpemU6MTIuMXB0OyBmb250LWZh bWlseTpzaW1zdW4sc2VyaWY7DQp9DQo8L1NUWUxFPg0KDQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBj b250ZW50PSJNU0hUTUwgOS4wMC44MTEyLjE2NDgzIj48U1RBVElPTkVSWT4NCjxESVY+DQo8U1RZ TEUgdHlwZT10ZXh0L2Nzcz4NCmJvZHkgew0KCWZvbnQtc2l6ZToxMi4xcHQ7IGZvbnQtZmFtaWx5 OnNpbXN1bixzZXJpZjsNCn0NCjwvU1RZTEU+DQoNCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCA5LjAwLjgxMTIuMTY0NjQiPjxTVEFUSU9ORVJZPg0KPERJVj4NCjxTVFlMRSB0 eXBlPXRleHQvY3NzPg0KYm9keSB7DQoJZm9udC1zaXplOjEyLjFwdDsgZm9udC1mYW1pbHk6c2lt c3VuLHNlcmlmOw0KfQ0KPC9TVFlMRT4NCg0KPE1FVEEgbmFtZT1HRU5FUkFUT1IgY29udGVudD0i TVNIVE1MIDkuMDAuODExMi4xNjQ2NCI+PFNUQVRJT05FUlk+DQo8RElWPg0KPFNUWUxFIHR5cGU9 dGV4dC9jc3M+DQpib2R5IHsNCglmb250LXNpemU6MTIuMXB0OyBmb250LWZhbWlseTpzaW1zdW4s c2VyaWY7DQp9DQo8L1NUWUxFPg0KDQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJNU0hU TUwgOS4wMC44MTEyLjE2NDUwIj48U1RBVElPTkVSWT4NCjxESVY+DQo8U1RZTEUgdHlwZT10ZXh0 L2Nzcz4NCmJvZHkgew0KCWZvbnQtc2l6ZToxMi4xcHQ7IGZvbnQtZmFtaWx5OnNpbXN1bixzZXJp ZjsNCn0NCjwvU1RZTEU+DQoNCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRlbnQ9Ik1TSFRNTCA5 LjAwLjgxMTIuMTY0NTAiPjxTVEFUSU9ORVJZPg0KPERJVj4NCjxESVY+DQo8RElWPg0KPERJVj48 Rk9OVCBjb2xvcj0jMzMzMzAwIHNpemU9NCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPjxTUEFOIA0K c3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj5CZXN0IHJlZ2FyZHMh PC9TUEFOPjwvRk9OVD48L0RJVj4NCjxESVY+DQo8RElWPjxGT05UIGNvbG9yPSMzMzMzMDAgc2l6 ZT00IGZhY2U9IlRpbWVzIE5ldyBSb21hbiI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMHB0 OyBGT05ULUZBTUlMWTogQXJpYWwiPlJvY2t5PC9TUEFOPjwvRk9OVD48L0RJVj4NCjxESVY+PEZP TlQgY29sb3I9IzAwODAwMCBzaXplPTUgZmFjZT0iVGltZXMgTmV3IFJvbWFuIj48U1BBTiANCnN0 eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+VWxpa2UmbmJzcDtDaXJj dWl0IA0KQ28uLEx0ZCZuYnNwOzwvU1BBTj48L0ZPTlQ+PC9ESVY+DQo8RElWIHN0eWxlPSJGT05U LVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+Jm5ic3A7PC9ESVY+DQo8RElWPjxTUEFO IA0Kc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBDT0xPUjogIzMz MzMwMCI+PC9TUEFOPjwvRElWPg0KPERJVj48Rk9OVCBjb2xvcj0jMzMzMzAwIGZhY2U9IlRpbWVz IE5ldyBSb21hbiI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTog QXJpYWwiPjwvU1BBTj48L0ZPTlQ+PC9ESVY+DQo8RElWPjxGT05UIGNvbG9yPSMwMDMzMDA+PEZP TlQgc2l6ZT00IGZhY2U9IlRpbWVzIE5ldyBSb21hbiI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpF OiAxMHB0OyBGT05ULUZBTUlMWTogQXJpYWwiPjxGT05UIGNvbG9yPSMwMDAwMDA+QWRkcmVzczo1 Zmxvb3IgDQojNSAsSmluZm8gaW5kdXN0cnkgcGFyayxIZXpob3UgLFhpeGlhbmcgVG93biwgQmFv JiMzOTthbiBEaXN0cmljdCwsIFNoZW56aGVuLENoaW5hIA0KLjUxODEwMTwvRk9OVD4mbmJzcDs8 L1NQQU4+PC9GT05UPjxGT05UIHNpemU9NCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPjxTUEFOIA0K c3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj4mbmJzcDs8L1NQQU4+ PC9GT05UPjwvRk9OVD48L0RJVj4NCjxESVY+PEZPTlQgY29sb3I9IzAwMzMwMCBzaXplPTQgZmFj ZT0iVGltZXMgTmV3IFJvbWFuIj48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQt RkFNSUxZOiBBcmlhbCI+Q2VsbCZuYnNwOyANCjorODYmbmJzcDsxODExODcxNjAwOTwvU1BBTj48 L0ZPTlQ+PC9ESVY+DQo8RElWPjxGT05UIGNvbG9yPSMzMzMzMDA+PEZPTlQgc2l6ZT00IGZhY2U9 IlRpbWVzIE5ldyBSb21hbiI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZB TUlMWTogQXJpYWwiPjxGT05UIGNvbG9yPSMwMDMzMDA+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpF OiAxMHB0OyBGT05ULUZBTUlMWTogQXJpYWwiPlNreXBlOiZuYnNwO3JvY2t5d2FuZzY2NjwvU1BB Tj48L0ZPTlQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7IA0KPEJSPkUtbWFpbDogPEEgaHJlZj0ibWFpbHRvOnJvY2t5QHVs aWtlcGNiLmNvbSI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTog QXJpYWwiPnJvY2t5QHVsaWtlcGNiLmNvbTwvU1BBTj48L0E+PC9TUEFOPjwvRk9OVD48L0ZPTlQ+ PC9ESVY+DQo8RElWPjxGT05UIGNvbG9yPSMzMzMzMDAgc2l6ZT00IGZhY2U9IlRpbWVzIE5ldyBS b21hbiI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTogQXJpYWwi PldlYjo8QSANCmhyZWY9Imh0dHA6Ly93d3cudWxpa2VwY2IuY29tLyI+PFNQQU4gDQpzdHlsZT0i Rk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTogQXJpYWwiPnd3dy51bGlrZXBjYi5jb208L1NQ QU4+PC9BPjwvU1BBTj48L0ZPTlQ+PC9ESVY+PC9ESVY+PC9ESVY+PC9ESVY+PC9ESVY+PC9ESVY+ PC9ESVY+PC9ESVY+PC9ESVY+PC9ESVY+PC9ESVY+PC9ESVY+PC9ESVY+PC9ESVY+PC9GT05UPjwv RElWPjwvRk9OVD48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJ Vj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48 L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJ Vj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48 L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJ Vj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48 L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJ Vj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48 L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJ Vj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48 L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJ Vj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48 L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJ Vj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48 L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJ Vj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48 L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0JPRFk+PC9IVE1MPg0KDQo= --qA59x2aEt=_bkNlV3zLgaJo8TisaOuTTMF Content-Type: image/jpeg; name="049.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="049.jpg" Content-ID: Content-Description: Photo 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 AABgAQAA2wAAAFIAAAAAAAAAAAAAAAMAAAADAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AI8PAADKDgAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEABAAhAAAADQAAABNBnCNgAAQACQAJAIAC4AFk AGQAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIA7v8AABIA7v8AABIA7v8AABIA 7v/u/+7/AAAAAAAAEgASABIACAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAgAAEAAAACAAIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAIoAAQAAAAQACAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAKABAAAAABAACAABAAEAgALgAQAAAAAAAAAAAAAIAIABAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAKAAEA//8AAAAAYbX5ycHfMU2ySE62WOyaRgAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADECQDxAAAAAFMHALUAAABADgAAQA4A AAQAAQACAAQAAABSOTgAAgAHAAQAAAAwMTAwARADAAEAAACAAgAAAhADAAEAAADgAQAAAAAAAP/b AEMABgQFBgUEBgYFBgcHBggKEAoKCQkKFA4PDBAXFBgYFxQWFhodJR8aGyMcFhYgLCAjJicpKikZ Hy0wLSgwJSgpKP/bAEMBBwcHCggKEwoKEygaFhooKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo KCgoKCgoKCgoKCgoKCgoKCgoKCgoKP/AABEIAcICWAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAA AAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEU MoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2Rl ZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK 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 z3x/SiiipGj/2Q== --qA59x2aEt=_bkNlV3zLgaJo8TisaOuTTMF Content-Type: image/jpeg; name="048.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="048.jpg" Content-ID: Content-Description: Photo /9j/4AAQSkZJRgABAQEBLAEsAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcU FhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgo KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj//gA8Q1JFQVRPUjog Z2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2NjIpLCBxdWFsaXR5ID0gODAKAP/AABEIAYYC WAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQD BQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygp KjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJma oqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/ xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQID EQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RF RkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqy s7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/ AOOjRxyQvPTNSiLPUjPtXG2fimcBReQpKvqvymun0/Ure9jL275x1U8EfhXJKLjudampbFooVPy0 8oQO2KbvBH3WDUgbnvn3NZuRpyjCpHbj64pGijkUAknPapckqQWXj0NN3bU6jn0FK4WZXNlBGzHy 0bPXcuaQLGHGLeBiOASnQVPuxyxpGYH7pH1q/aNaC9nF7kqXU0YxCIo8f3VAqKW5upCfMmZhjpni msSFyWU4qEyq/Tik5ye7BQjHZDCCTk4/OoyCcgVMCuOopBgHOQKi5ZXKlQeT+NVZYmYkjnNX3Bbv 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 AH//2Q== --qA59x2aEt=_bkNlV3zLgaJo8TisaOuTTMF-- From mr@neil.brown.name Sat Apr 30 16:18:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 839AA7CFA for ; Sat, 30 Apr 2016 16:18:35 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 48ECE304032 for ; Sat, 30 Apr 2016 14:18:32 -0700 (PDT) X-ASG-Debug-ID: 1462051106-04cbb00fe83ccff0001-NocioJ Received: from neil.brown.name (neil.brown.name [103.29.64.221]) by cuda.sgi.com with ESMTP id XlQKUeT2UPKDcBjU (version=TLSv1.2 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Sat, 30 Apr 2016 14:18:29 -0700 (PDT) X-Barracuda-Envelope-From: mr@neil.brown.name X-Barracuda-Effective-Source-IP: neil.brown.name[103.29.64.221] X-Barracuda-Apparent-Source-IP: 103.29.64.221 Received: from [220.233.11.133] (helo=neil.brown.name) by neil.brown.name with esmtp (Exim 4.80) (envelope-from ) id 1awcBJ-00076U-QM; Sat, 30 Apr 2016 21:12:05 +0000 From: NeilBrown To: Steven Whitehouse , Michal Hocko , linux-mm@kvack.org, linux-fsdevel@vger.kernel.org Date: Sun, 01 May 2016 07:17:56 +1000 Cc: linux-nfs@vger.kernel.org, linux-ext4@vger.kernel.org, Theodore Ts'o , linux-ntfs-dev@lists.sourceforge.net, LKML , Dave Chinner , reiserfs-devel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, logfs@logfs.org, cluster-devel@redhat.com, Chris Mason , linux-mtd@lists.infradead.org, Jan Kara , Andrew Morton , xfs@oss.sgi.com, ceph-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-afs@lists.infradead.org, cluster-devel Subject: Re: [Cluster-devel] [PATCH 0/2] scop GFP_NOFS api In-Reply-To: <57233571.50509@redhat.com> X-ASG-Orig-Subj: Re: [Cluster-devel] [PATCH 0/2] scop GFP_NOFS api References: <1461671772-1269-1-git-send-email-mhocko@kernel.org> <8737q5ugcx.fsf@notabene.neil.brown.name> <57233571.50509@redhat.com> User-Agent: Notmuch/0.20.2 (http://notmuchmail.org) Emacs/24.5.1 (x86_64-suse-linux-gnu) Message-ID: <87wpneu77f.fsf@notabene.neil.brown.name> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" X-Barracuda-Connect: neil.brown.name[103.29.64.221] X-Barracuda-Start-Time: 1462051108 X-Barracuda-Encrypted: DHE-RSA-AES128-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2973 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29188 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header --=-=-= Content-Type: text/plain Content-Transfer-Encoding: quoted-printable On Fri, Apr 29 2016, Steven Whitehouse wrote: > Hi, > > On 29/04/16 06:35, NeilBrown wrote: >> If we could similarly move evict() into kswapd (and I believe we can) >> then most file systems would do nothing in reclaim context that >> interferes with allocation context. > evict() is an issue, but moving it into kswapd would be a potential=20 > problem for GFS2. We already have a memory allocation issue when=20 > recovery is taking place and memory is short. The code path is as follows: > > 1. Inode is scheduled for eviction (which requires deallocation) > 2. The glock is required in order to perform the deallocation, which=20 > implies getting a DLM lock > 3. Another node in the cluster fails, so needs recovery > 4. When the DLM lock is requested, it gets blocked until recovery is=20 > complete (for the failed node) > 5. Recovery is performed using a userland fencing utility > 6. Fencing requires memory and then blocks on the eviction > 7. Deadlock (Fencing waiting on memory alloc, memory alloc waiting on=20 > DLM lock, DLM lock waiting on fencing) You even have user-space in the loop there - impressive! You can't really pass GFP_NOFS to a user-space thread, can you :-? > > It doesn't happen often, but we've been looking at the best place to=20 > break that cycle, and one of the things we've been wondering is whether=20 > we could avoid deallocation evictions from memory related contexts, or=20 > at least make it async somehow. I think "async" is definitely the answer and I think evict()/evict_inode() is the best place to focus attention. I can see now (thanks) that just moving the evict() call to kswapd isn't really a solution as it will just serve to block kswapd and so lots of other freeing of memory won't happen. I'm now imagining giving ->evict_inode() a "don't sleep" flag and allowing it to return -EAGAIN. In that case evict would queue the inode to kswapd (or maybe another thread) for periodic retry. The flag would only get set when prune_icache_sb() calls dispose_list() to call evict(). Other uses (e.g. unmount, iput) would still be synchronous. How difficult would it be to change gfs's evict_inode() to optionally never block? For this to work we would need to add a way for deactivate_locked_super() to wait for all the async evictions to complete. Currently prune_icache_sb() is called under s_umount. If we moved part of the eviction out of that lock some other synchronization would be needed. Possibly a per-superblock list of "inodes being evicted" would suffice. Thanks, NeilBrown > > The issue is that it is not possible to know in advance whether an=20 > eviction will result in mearly writing things back to disk (because the=20 > inode is being dropped from cache, but still resides on disk) which is=20 > easy to do, or whether it requires a full deallocation (n_link=3D=3D0) wh= ich=20 > may require significant resources and time, > > Steve. --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAEBCAAGBQJXJSEEAAoJEDnsnt1WYoG5r68P/2XBKjAdTUcRbcSSLoUKYpEo nFQiiu9BM8FRmffmYHNQrRVQQsEA8H5WKekt0heSAUyqbs75dPybzH8Bm447azdm rb6ZUSSKV0LiDFWxe/mXjDFi9qgplAVAKIMQVoTUADgi6YXfpqYwjkTfXiBPcJF2 NXecVP/OBA0aGT7sUBJOYq1hKCA8e4oIAvEUdjv5c/405U4FoiTmTICwCkhCPTHR y5tACMN3RtAbzmxsQ0LHIkz8XMKiwtvUkG/Ku054lSQknknjfgESQSsBtEqiTXb+ I9vdZUbg0kjz6KAOJ/QogDjI47ORtoHptnB07NMl2OX9LWq93SPg0F81HfE5eIBc Y4NvPLg/EyBjW6KpcmYiAlfkRDEvt3/FeyaKCtEKzuu4cpCbGXqxRXqAl/tXzJLx VlFJqcvn9YNzyqvs4K+ZbHc6KKq+ppHRpWaXemIiwE69hkGiXH12Rb6cMN3XzOuU Tm7ORKC3HuPdoHLR0Ls/N+C16C2cQhkFlG3MGFyECtG2qKzotOJP/dvN0HNI+LSc fRW3/BQlCEmtwNJ2cpt6v6zUHmcEoPtxECUhIJllOzlnUqZ941i/tzTPNyY60WDA OBRNlLoo9qG9IDUVGjGoDA1WS+eLDmptOGi7T7gPHkvwKLJg6CH8Ivdped54sqMP K3N9YqjgZ+d4FzruChG6 =tfvX -----END PGP SIGNATURE----- --=-=-=-- From mr@neil.brown.name Sat Apr 30 16:56:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3D36D7D06 for ; Sat, 30 Apr 2016 16:56:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C3225AC002 for ; Sat, 30 Apr 2016 14:55:59 -0700 (PDT) X-ASG-Debug-ID: 1462053356-04bdf0358e3ec6c0001-NocioJ Received: from neil.brown.name (neil.brown.name [103.29.64.221]) by cuda.sgi.com with ESMTP id EYyGYG3jpDQhtBPu (version=TLSv1.2 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Sat, 30 Apr 2016 14:55:57 -0700 (PDT) X-Barracuda-Envelope-From: mr@neil.brown.name X-Barracuda-Effective-Source-IP: neil.brown.name[103.29.64.221] X-Barracuda-Apparent-Source-IP: 103.29.64.221 Received: from [220.233.11.133] (helo=neil.brown.name) by neil.brown.name with esmtp (Exim 4.80) (envelope-from ) id 1awclh-00079H-0B; Sat, 30 Apr 2016 21:49:41 +0000 From: NeilBrown To: Michal Hocko Date: Sun, 01 May 2016 07:55:31 +1000 Cc: linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, Andrew Morton , Dave Chinner , Theodore Ts'o , Chris Mason , Jan Kara , ceph-devel@vger.kernel.org, cluster-devel@redhat.com, linux-nfs@vger.kernel.org, logfs@logfs.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-mtd@lists.infradead.org, reiserfs-devel@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-f2fs-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, LKML Subject: Re: [PATCH 0/2] scop GFP_NOFS api In-Reply-To: <20160429120418.GK21977@dhcp22.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 0/2] scop GFP_NOFS api References: <1461671772-1269-1-git-send-email-mhocko@kernel.org> <8737q5ugcx.fsf@notabene.neil.brown.name> <20160429120418.GK21977@dhcp22.suse.cz> User-Agent: Notmuch/0.20.2 (http://notmuchmail.org) Emacs/24.5.1 (x86_64-suse-linux-gnu) Message-ID: <87twiiu5gs.fsf@notabene.neil.brown.name> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" X-Barracuda-Connect: neil.brown.name[103.29.64.221] X-Barracuda-Start-Time: 1462053357 X-Barracuda-Encrypted: DHE-RSA-AES128-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3321 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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.29189 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header --=-=-= Content-Type: text/plain On Fri, Apr 29 2016, Michal Hocko wrote: > > One think I have learned is that shrinkers can be really complex and > getting rid of GFP_NOFS will be really hard so I would really like to > start the easiest way possible and remove the direct usage and replace > it by scope one which would at least _explain_ why it is needed. I think > this is a reasonable _first_ step and a large step ahead because we have > a good chance to get rid of a large number of those which were used > "just because I wasn't sure and this should be safe, right?". I wouldn't > be surprised if we end up with a very small number of both scope and > direct usage in the end. Yes, shrinkers can be complex. About two of them are. We could fix lots and lots of call sites, or fix two shrinkers. OK, that's a bit unfair as fixing one of the shrinkers involves changing many ->evict_inode() functions. But that would be a very focused change. I think your proposal is little more than re-arranging deck chairs on the titanic. Yes, it might give everybody a better view of the iceberg but the iceberg is still there and in reality we can already see it. The main iceberg is evict_inode. It appears in both examples given so far: xfs and gfs. There are other little icebergs but they won't last long after evict_inode is dealt with. One particular problem with your process-context idea is that it isn't inherited across threads. Steve Whitehouse's example in gfs shows how allocation dependencies can even cross into user space. A more localized one that I have seen is that NFSv4 sometimes needs to start up a state-management thread (particularly if the server restarted). It uses kthread_run(), which doesn't actually create the thread but asks kthreadd to do it. If NFS writeout is waiting for state management it would need to make sure that kthreadd runs in allocation context to avoid deadlock. I feel that I've forgotten some important detail here and this might have been fixed somehow, but the point still stands that the allocation context can cross from thread to thread and can effectively become anything and everything. It is OK to wait for memory to be freed. It is not OK to wait for any particular piece of memory to be freed because you don't always know who is waiting for you, or who you really are waiting on to free that memory. Whenever trying to free memory I think you need to do best-effort without blocking. > > I would also like to revisit generic inode/dentry shrinker and see > whether it could be more __GFP_FS friendly. As you say many FS might > even not depend on some FS internal locks so pushing GFP_FS check down > the layers might make a lot of sense and allow to clean some [id]cache > even for __GFP_FS context. I think the only part of prune_dcache_sb() that might need care is iput() which boils down to evict(). The final unlink for NFS silly-rename might happen in there too (in d_iput). shrinking the dcache seems rather late to be performing that unlink though, so I've probably missed some key detail. If we find a way for evict(), when called from the shrinker, to be non-blocking, and generally require all shrinkers to be non-blocking, then many of these allocation problems evaporate. Thanks, NeilBrown --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAEBCAAGBQJXJSnTAAoJEDnsnt1WYoG5VzYP/0sRKiPS4flNsF5KJO+8W9kv wAXMCErisoi1qhXUF24r7eKveCvsedAF4ocRL4VVEn8bcS3PQqM4dNw8Hr5yjss0 VxnuMMN67dDSmDmPfFPEZrJTwe5/vQr8DyCStlsuoB2ZaHjXODurzOaRpRKdDxae 1dOwbgPTlitwuDexsjC8xpcVHJx6v/f0+U5/K4DZunr1chcwsIsZONBCZTzsm8Sk pcZhNAtZSZR/XnsvaM80RYrGwjOCfoY58rpXhYTSRv0NGT+y0m7AeYBVLwueOtke ye1jJwenlswn5KMdCZRtHz1qoCGVCvVUjahOnzegk7doEYx4f2EN2AQJIvw+Ngci DRS+XCooDI4jLWTkTZADjPZjm6nH++xa+PfUWgo9+OaDGbyS5sy4H0q2Sqh0Nevp F+XtkgchYnI/d/Y4/11tvvh4CScdbLR+Cc3qT8r85pz+lCE0D51nsPQo0zMhmrdY GLmDYkLA4MgymC1PG5Jc76ctIYDY96EO9F10pq/U1SPNaPhrA7y0RE8SLHPJE2OS Bns+184wgWCgtx6wC1GiFM/H+Hq2B2byRBgX1U90fvJvisZrcKuG2selCfquYHRr NMFO2YCCag8V7BDXvfmwbQKh5zpDlTCH9Zk9dPpSFzLmaYUp+TyeBPDx3CbqwVtu yzQMkIxl5FRwqpg2qQNb =jsDQ -----END PGP SIGNATURE----- --=-=-=-- From mr@neil.brown.name Sat Apr 30 17:20:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id ADBEC7CA3 for ; Sat, 30 Apr 2016 17:20:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8136D304032 for ; Sat, 30 Apr 2016 15:20:19 -0700 (PDT) X-ASG-Debug-ID: 1462054808-04cb6c09a13f8760001-NocioJ Received: from neil.brown.name (neil.brown.name [103.29.64.221]) by cuda.sgi.com with ESMTP id h2S4HfXVCqP4tood (version=TLSv1.2 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Sat, 30 Apr 2016 15:20:09 -0700 (PDT) X-Barracuda-Envelope-From: mr@neil.brown.name X-Barracuda-Effective-Source-IP: neil.brown.name[103.29.64.221] X-Barracuda-Apparent-Source-IP: 103.29.64.221 Received: from [220.233.11.133] (helo=neil.brown.name) by neil.brown.name with esmtp (Exim 4.80) (envelope-from ) id 1awd97-0007T4-Ou; Sat, 30 Apr 2016 22:13:53 +0000 From: NeilBrown To: Dave Chinner Date: Sun, 01 May 2016 08:19:44 +1000 Cc: Michal Hocko , linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, Andrew Morton , Theodore Ts'o , Chris Mason , Jan Kara , ceph-devel@vger.kernel.org, cluster-devel@redhat.com, linux-nfs@vger.kernel.org, logfs@logfs.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-mtd@lists.infradead.org, reiserfs-devel@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-f2fs-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, LKML Subject: Re: [PATCH 0/2] scop GFP_NOFS api In-Reply-To: <20160430001138.GO26977@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/2] scop GFP_NOFS api References: <1461671772-1269-1-git-send-email-mhocko@kernel.org> <8737q5ugcx.fsf@notabene.neil.brown.name> <20160430001138.GO26977@dastard> User-Agent: Notmuch/0.20.2 (http://notmuchmail.org) Emacs/24.5.1 (x86_64-suse-linux-gnu) Message-ID: <87r3dmu4cf.fsf@notabene.neil.brown.name> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" X-Barracuda-Connect: neil.brown.name[103.29.64.221] X-Barracuda-Start-Time: 1462054809 X-Barracuda-Encrypted: DHE-RSA-AES128-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8598 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.29189 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 BSF_SC5_SA210e Custom Rule SA210e --=-=-= Content-Type: text/plain Content-Transfer-Encoding: quoted-printable On Sat, Apr 30 2016, Dave Chinner wrote: > On Fri, Apr 29, 2016 at 03:35:42PM +1000, NeilBrown wrote: >> On Tue, Apr 26 2016, Michal Hocko wrote: >>=20 >> > Hi, >> > we have discussed this topic at LSF/MM this year. There was a general >> > interest in the scope GFP_NOFS allocation context among some FS >> > developers. For those who are not aware of the discussion or the issue >> > I am trying to sort out (or at least start in that direction) please >> > have a look at patch 1 which adds memalloc_nofs_{save,restore} api >> > which basically copies what we have for the scope GFP_NOIO allocation >> > context. I haven't converted any of the FS myself because that is way >> > beyond my area of expertise but I would be happy to help with further >> > changes on the MM front as well as in some more generic code paths. >> > >> > Dave had an idea on how to further improve the reclaim context to be >> > less all-or-nothing wrt. GFP_NOFS. In short he was suggesting an opaque >> > and FS specific cookie set in the FS allocation context and consumed >> > by the FS reclaim context to allow doing some provably save actions >> > that would be skipped due to GFP_NOFS normally. I like this idea and >> > I believe we can go that direction regardless of the approach taken he= re. >> > Many filesystems simply need to cleanup their NOFS usage first before >> > diving into a more complex changes.> >>=20 >> This strikes me as over-engineering to work around an unnecessarily >> burdensome interface.... but without details it is hard to be certain. >>=20 >> Exactly what things happen in "FS reclaim context" which may, or may >> not, be safe depending on the specific FS allocation context? Do they >> need to happen at all? >>=20 >> My research suggests that for most filesystems the only thing that >> happens in reclaim context that is at all troublesome is the final >> 'evict()' on an inode. This needs to flush out dirty pages and sync the >> inode to storage. Some time ago we moved most dirty-page writeout out >> of the reclaim context and into kswapd. I think this was an excellent >> advance in simplicity. > > No, we didn't move dirty page writeout to kswapd - we moved it back > to the background writeback threads where it can be done > efficiently. kswapd should almost never do single page writeback > because of how inefficient it is from an IO perspective, even though > it can. i.e. if we are doing any significant amount of dirty page > writeback from memory reclaim (direct, kswapd or otherwise) then > we've screwed something up. > >> If we could similarly move evict() into kswapd (and I believe we can) >> then most file systems would do nothing in reclaim context that >> interferes with allocation context. > > When lots of GFP_NOFS allocation is being done, this already > happens. The shrinkers that can't run due to context accumulate the > work on the shrinker structure, and when the shrinker can next run > (e.g. run from kswapd) it runs all the deferred work from GFP_NOFS > reclaim contexts. > > IOWs, we already move shrinker work from direct reclaim to kswapd > when appropriate. > >> The exceptions include: >> - nfs and any filesystem using fscache can block for up to 1 second >> in ->releasepage(). They used to block waiting for some IO, but that >> caused deadlocks and wasn't really needed. I left the timeout because >> it seemed likely that some throttling would help. I suspect that a >> careful analysis will show that there is sufficient throttling >> elsewhere. >>=20 >> - xfs_qm_shrink_scan is nearly unique among shrinkers in that it waits >> for IO so it can free some quotainfo things.=20 > > No it's not. evict() can block on IO - waiting for data or inode > writeback to complete, or even for filesystems to run transactions > on the inode. Hence the superblock shrinker can and does block in > inode cache reclaim. That is why I said "nearly" :-) > > Indeed, blocking the superblock shrinker in reclaim is a key part of > balancing inode cache pressure in XFS. If the shrinker starts > hitting dirty inodes, it blocks on cleaning them, thereby slowing > the rate of allocation to that which inodes can be cleaned and > reclaimed. There are also background threads that walk ahead freeing > clean inodes, but we have to throttle direct reclaim in this manner > otherwise the allocation pressure vastly outweighs the ability to > reclaim inodes. if we don't balance this, inode allocation triggers > the OOM killer because reclaim keeps reporting "no progress being > made" because dirty inodes are skipped. BY blocking on such inodes, > the shrinker makes progress (slowly) and reclaim sees that memory is > being freed and so continues without invoking the OOM killer... I'm very aware of the need to throttle allocation based on IO. I remember when NFS didn't quite get this right and filled up memory :-) balance_dirty_pages() used to force threads to wait on the write-out of one page for every page that they dirtied (or wait on 128 pages for every 1= 28 dirtied or whatever). This was exactly to provide the sort of throttling you are talking about. We don't do that any more. It was problematic. I don't recall all the reasons but I think that different backing devices having different clearance rates was part of the problem. So now we monitor clearance rates and wait for some number of blocks to be written, rather than waiting for some specific blocks to be written. We should be able to do the same thing to balance dirty inodes as we do to balance dirty pages. > >> If it could be changed >> to just schedule the IO without waiting for it then I think this >> would be safe to be called in any FS allocation context. It already >> uses a 'trylock' in xfs_dqlock_nowait() to avoid deadlocking >> if the lock is held. > > We could, but then we have the same problem as the inode cache - > there's no indication of progress going back to the memory reclaim > subsystem, nor is reclaim able to throttle memory allocation back to > the rate at which reclaim is making progress. > > There's feedback loops all throughout the XFS reclaim code - it's > designed specifically that way - I made changes to the shrinker > infrastructure years ago to enable this. It's no different to the > dirty page throttling that was done at roughly the same time - > that's also one big feedback loop controlled by the rate at which > pages can be cleaned. Indeed, it was designed was based on the same > premise as all the XFS shrinker code: in steady state conditions > we can't allocate a resource faster than we can reclaim it, so we > need to make reclaim as efficient at possible... You seem to be referring here to the same change that I was referred to above, but seem to be seeing it from a different perspective. Waiting for inodes to be freed in important. Waiting for any one specific inode to be freed is dangerous. > >> I think you/we would end up with a much simpler system if instead of >> focussing on the places where GFP_NOFS is used, we focus on places where >> __GFP_FS is tested, and try to remove them. If we get rid of enough of >> them the remainder could just use __GFP_IO. > > The problem with this is that a single kswapd thread can't keep up > with all of the allocation pressure that occurs. e.g. a 20-core > intel CPU with local memory will be seen as a single node and so > will have a single kswapd thread to do reclaim. There's a massive > imbalance between maximum reclaim rate and maximum allocation rate > in situations like this. If we want memory reclaim to run faster, > we to be able to do more work *now*, not defer it to a context with > limited execution resources. I agree it makes sense to do *work* locally on the core that sees the need. What I want to avoid is *sleeping* locally. How would it be to make evict_inode non-blocking? It would do as much work as it can, which in many cases would presumably complete the whole task. But if it cannot progress for some reason, it returns -EAGAIN and then the rest gets queued for later. Might that work, or is there often still lots of CPU work to be done after things have been waited for? Thanks, NeilBrown > > i.e. IMO deferring more work to a single reclaim thread per node is > going to limit memory reclaim scalability and performance, not > improve it. > > Cheers, > > Dave. > --=20 > Dave Chinner > david@fromorbit.com --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAEBCAAGBQJXJS+AAAoJEDnsnt1WYoG5I88P/1gZUoyYvh8e/ZH1R4eDYgWO 0x3C4JM8Z1bYsF8l8YIl8Mb1rOPIZ5tPuWt6MdNamOb3TNLTSbgNSEyqShVs3v7E 9eHAFMGLyVE9Sb708olIfHpJoX0cvDXzhs2nS5miWmh1qTmNhAkotLyo9sVMTWr8 6lQhlcWTCeRA/RLFp4fx07AFpPr/J7NXTXXNXvMxExoGvz+EevoFL5TQ9oF8VaTN Q30Ojl2wRdRVZlclmYgOS+EuPHPLND/jOwJILqOTRwEP8HA31rcRZaoelSCtx4rQ NP3uTXWos3p8m5J+8sWXhFSL2hOYbptkohedNdt8wfxBbPnt15P3pqdzcOwyqAUM qsQWYNJBwaP1aK9KdMqafvJ2k5Z00p7QmSiWCzDMsH9j5ScRA7dIktZ4pD8+IkvB u+OE6S9Auhf2yL67OGesRqu3dTYxi9JJMTWN4MwlLUta6IruZZbLdgEeJCFaZGwd JXBTg/I1wisudqWvbM2wGv/Shomwo7bmtmPW2BNYC+n9I6BK41D8NEpGQZ/6CXPM TkWoT9R0fQf0WMyDKtf+jS4yYUKD/cKoYkyoUbBMqtYrv5q+fO8SE6gbhcwtfDA3 hqgvZf/eVbXQZNUrXjOXJduL/SDVNX0+Nu5eub0K+JI9/gaIidqzYN+NmCFjIsFZ WgUoj2nE/Eil/6xWp+hJ =HwAg -----END PGP SIGNATURE----- --=-=-=--
    KOA= CCTV
    7306 COLDWATER CA= NYON AVE
    Unit 1
    North Hollywood, CA 91605
    http://www.koacctv.com
    Unsubscribe